46 #include "catalog/pg_am_d.h"
47 #include "catalog/pg_class_d.h"
61 #ifndef HAVE_RL_FILENAME_COMPLETION_FUNCTION
62 #define rl_filename_completion_function filename_completion_function
65 #ifndef HAVE_RL_COMPLETION_MATCHES
66 #define rl_completion_matches completion_matches
74 #ifdef HAVE_RL_FILENAME_QUOTING_FUNCTION
75 #define USE_FILENAME_QUOTING_FUNCTIONS 1
79 #define WORD_BREAKS "\t\n@><=;|&() "
100 typedef struct VersionedQuery
102 int min_server_version;
122 typedef struct SchemaQuery
129 int min_server_version;
145 const char *selcondition;
152 const char *viscondition;
160 const char *
namespace;
178 const char *
const *keywords;
196 const char *refviscondition;
203 const char *refnamespace;
210 static int completion_max_records;
217 static char completion_last_char;
218 static const char *completion_charp;
219 static const char *
const *completion_charpp;
220 static const VersionedQuery *completion_vquery;
221 static const SchemaQuery *completion_squery;
222 static char *completion_ref_object;
223 static char *completion_ref_schema;
224 static bool completion_case_sensitive;
225 static bool completion_verbatim;
226 static bool completion_force_quote;
249 #define COMPLETE_WITH_QUERY(query) \
250 COMPLETE_WITH_QUERY_LIST(query, NULL)
252 #define COMPLETE_WITH_QUERY_LIST(query, list) \
254 completion_charp = query; \
255 completion_charpp = list; \
256 completion_verbatim = false; \
257 matches = rl_completion_matches(text, complete_from_query); \
260 #define COMPLETE_WITH_QUERY_PLUS(query, ...) \
262 static const char *const list[] = { __VA_ARGS__, NULL }; \
263 COMPLETE_WITH_QUERY_LIST(query, list); \
266 #define COMPLETE_WITH_QUERY_VERBATIM(query) \
267 COMPLETE_WITH_QUERY_VERBATIM_LIST(query, NULL)
269 #define COMPLETE_WITH_QUERY_VERBATIM_LIST(query, list) \
271 completion_charp = query; \
272 completion_charpp = list; \
273 completion_verbatim = true; \
274 matches = rl_completion_matches(text, complete_from_query); \
277 #define COMPLETE_WITH_QUERY_VERBATIM_PLUS(query, ...) \
279 static const char *const list[] = { __VA_ARGS__, NULL }; \
280 COMPLETE_WITH_QUERY_VERBATIM_LIST(query, list); \
283 #define COMPLETE_WITH_VERSIONED_QUERY(query) \
284 COMPLETE_WITH_VERSIONED_QUERY_LIST(query, NULL)
286 #define COMPLETE_WITH_VERSIONED_QUERY_LIST(query, list) \
288 completion_vquery = query; \
289 completion_charpp = list; \
290 completion_verbatim = false; \
291 matches = rl_completion_matches(text, complete_from_versioned_query); \
294 #define COMPLETE_WITH_VERSIONED_QUERY_PLUS(query, ...) \
296 static const char *const list[] = { __VA_ARGS__, NULL }; \
297 COMPLETE_WITH_VERSIONED_QUERY_LIST(query, list); \
300 #define COMPLETE_WITH_SCHEMA_QUERY(query) \
301 COMPLETE_WITH_SCHEMA_QUERY_LIST(query, NULL)
303 #define COMPLETE_WITH_SCHEMA_QUERY_LIST(query, list) \
305 completion_squery = &(query); \
306 completion_charpp = list; \
307 completion_verbatim = false; \
308 matches = rl_completion_matches(text, complete_from_schema_query); \
311 #define COMPLETE_WITH_SCHEMA_QUERY_PLUS(query, ...) \
313 static const char *const list[] = { __VA_ARGS__, NULL }; \
314 COMPLETE_WITH_SCHEMA_QUERY_LIST(query, list); \
317 #define COMPLETE_WITH_SCHEMA_QUERY_VERBATIM(query) \
319 completion_squery = &(query); \
320 completion_charpp = NULL; \
321 completion_verbatim = true; \
322 matches = rl_completion_matches(text, complete_from_schema_query); \
325 #define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(query) \
326 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, NULL)
328 #define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, list) \
330 completion_squery = query; \
331 completion_charpp = list; \
332 completion_verbatim = false; \
333 matches = rl_completion_matches(text, complete_from_versioned_schema_query); \
336 #define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_PLUS(query, ...) \
338 static const char *const list[] = { __VA_ARGS__, NULL }; \
339 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, list); \
346 #define COMPLETE_WITH_CONST(cs, con) \
348 completion_case_sensitive = (cs); \
349 completion_charp = (con); \
350 matches = rl_completion_matches(text, complete_from_const); \
353 #define COMPLETE_WITH_LIST_INT(cs, list) \
355 completion_case_sensitive = (cs); \
356 completion_charpp = (list); \
357 matches = rl_completion_matches(text, complete_from_list); \
360 #define COMPLETE_WITH_LIST(list) COMPLETE_WITH_LIST_INT(false, list)
361 #define COMPLETE_WITH_LIST_CS(list) COMPLETE_WITH_LIST_INT(true, list)
363 #define COMPLETE_WITH(...) \
365 static const char *const list[] = { __VA_ARGS__, NULL }; \
366 COMPLETE_WITH_LIST(list); \
369 #define COMPLETE_WITH_CS(...) \
371 static const char *const list[] = { __VA_ARGS__, NULL }; \
372 COMPLETE_WITH_LIST_CS(list); \
375 #define COMPLETE_WITH_ATTR(relation) \
376 COMPLETE_WITH_ATTR_LIST(relation, NULL)
378 #define COMPLETE_WITH_ATTR_LIST(relation, list) \
380 set_completion_reference(relation); \
381 completion_squery = &(Query_for_list_of_attributes); \
382 completion_charpp = list; \
383 completion_verbatim = false; \
384 matches = rl_completion_matches(text, complete_from_schema_query); \
387 #define COMPLETE_WITH_ATTR_PLUS(relation, ...) \
389 static const char *const list[] = { __VA_ARGS__, NULL }; \
390 COMPLETE_WITH_ATTR_LIST(relation, list); \
399 #define COMPLETE_WITH_ENUM_VALUE(type) \
401 set_completion_reference(type); \
402 if (text[0] == '\'' || \
403 start == 0 || rl_line_buffer[start - 1] != '\'') \
404 completion_squery = &(Query_for_list_of_enum_values_quoted); \
406 completion_squery = &(Query_for_list_of_enum_values_unquoted); \
407 completion_charpp = NULL; \
408 completion_verbatim = true; \
409 matches = rl_completion_matches(text, complete_from_schema_query); \
416 #define COMPLETE_WITH_TIMEZONE_NAME() \
418 static const char *const list[] = { "DEFAULT", NULL }; \
419 if (text[0] == '\'') \
420 completion_charp = Query_for_list_of_timezone_names_quoted_in; \
421 else if (start == 0 || rl_line_buffer[start - 1] != '\'') \
422 completion_charp = Query_for_list_of_timezone_names_quoted_out; \
424 completion_charp = Query_for_list_of_timezone_names_unquoted; \
425 completion_charpp = list; \
426 completion_verbatim = true; \
427 matches = rl_completion_matches(text, complete_from_query); \
430 #define COMPLETE_WITH_FUNCTION_ARG(function) \
432 set_completion_reference(function); \
433 completion_squery = &(Query_for_list_of_arguments); \
434 completion_charpp = NULL; \
435 completion_verbatim = true; \
436 matches = rl_completion_matches(text, complete_from_schema_query); \
446 static const SchemaQuery Query_for_constraint_of_table = {
447 .catname =
"pg_catalog.pg_constraint con, pg_catalog.pg_class c1",
448 .selcondition =
"con.conrelid=c1.oid",
449 .result =
"con.conname",
450 .refname =
"c1.relname",
451 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
452 .refnamespace =
"c1.relnamespace",
455 static const SchemaQuery Query_for_constraint_of_table_not_validated = {
456 .catname =
"pg_catalog.pg_constraint con, pg_catalog.pg_class c1",
457 .selcondition =
"con.conrelid=c1.oid and not con.convalidated",
458 .result =
"con.conname",
459 .refname =
"c1.relname",
460 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
461 .refnamespace =
"c1.relnamespace",
464 static const SchemaQuery Query_for_constraint_of_type = {
465 .catname =
"pg_catalog.pg_constraint con, pg_catalog.pg_type t",
466 .selcondition =
"con.contypid=t.oid",
467 .result =
"con.conname",
468 .refname =
"t.typname",
469 .refviscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
470 .refnamespace =
"t.typnamespace",
473 static const SchemaQuery Query_for_index_of_table = {
474 .catname =
"pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i",
475 .selcondition =
"c1.oid=i.indrelid and i.indexrelid=c2.oid",
476 .result =
"c2.relname",
477 .refname =
"c1.relname",
478 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
479 .refnamespace =
"c1.relnamespace",
482 static const SchemaQuery Query_for_unique_index_of_table = {
483 .catname =
"pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i",
484 .selcondition =
"c1.oid=i.indrelid and i.indexrelid=c2.oid and i.indisunique",
485 .result =
"c2.relname",
486 .refname =
"c1.relname",
487 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
488 .refnamespace =
"c1.relnamespace",
491 static const SchemaQuery Query_for_list_of_aggregates[] = {
493 .min_server_version = 110000,
494 .catname =
"pg_catalog.pg_proc p",
495 .selcondition =
"p.prokind = 'a'",
496 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
497 .namespace =
"p.pronamespace",
498 .result =
"p.proname",
501 .catname =
"pg_catalog.pg_proc p",
502 .selcondition =
"p.proisagg",
503 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
504 .namespace =
"p.pronamespace",
505 .result =
"p.proname",
509 static const SchemaQuery Query_for_list_of_arguments = {
510 .catname =
"pg_catalog.pg_proc p",
511 .result =
"pg_catalog.oidvectortypes(p.proargtypes)||')'",
512 .refname =
"p.proname",
513 .refviscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
514 .refnamespace =
"p.pronamespace",
517 static const SchemaQuery Query_for_list_of_attributes = {
518 .catname =
"pg_catalog.pg_attribute a, pg_catalog.pg_class c",
519 .selcondition =
"c.oid = a.attrelid and a.attnum > 0 and not a.attisdropped",
520 .result =
"a.attname",
521 .refname =
"c.relname",
522 .refviscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
523 .refnamespace =
"c.relnamespace",
526 static const SchemaQuery Query_for_list_of_attribute_numbers = {
527 .catname =
"pg_catalog.pg_attribute a, pg_catalog.pg_class c",
528 .selcondition =
"c.oid = a.attrelid and a.attnum > 0 and not a.attisdropped",
529 .result =
"a.attnum::pg_catalog.text",
530 .refname =
"c.relname",
531 .refviscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
532 .refnamespace =
"c.relnamespace",
535 static const char *
const Keywords_for_list_of_datatypes[] = {
555 "time with time zone",
556 "time without time zone",
557 "timestamp with time zone",
558 "timestamp without time zone",
563 static const SchemaQuery Query_for_list_of_datatypes = {
564 .catname =
"pg_catalog.pg_type t",
566 .selcondition =
"(t.typrelid = 0 "
567 " OR (SELECT c.relkind = " CppAsString2(RELKIND_COMPOSITE_TYPE)
568 " FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) "
569 "AND t.typname !~ '^_'",
570 .viscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
571 .namespace =
"t.typnamespace",
572 .result =
"t.typname",
573 .keywords = Keywords_for_list_of_datatypes,
576 static const SchemaQuery Query_for_list_of_composite_datatypes = {
577 .catname =
"pg_catalog.pg_type t",
579 .selcondition =
"(SELECT c.relkind = " CppAsString2(RELKIND_COMPOSITE_TYPE)
580 " FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid) "
581 "AND t.typname !~ '^_'",
582 .viscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
583 .namespace =
"t.typnamespace",
584 .result =
"t.typname",
587 static const SchemaQuery Query_for_list_of_domains = {
588 .catname =
"pg_catalog.pg_type t",
589 .selcondition =
"t.typtype = 'd'",
590 .viscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
591 .namespace =
"t.typnamespace",
592 .result =
"t.typname",
595 static const SchemaQuery Query_for_list_of_enum_values_quoted = {
596 .catname =
"pg_catalog.pg_enum e, pg_catalog.pg_type t",
597 .selcondition =
"t.oid = e.enumtypid",
598 .result =
"pg_catalog.quote_literal(enumlabel)",
599 .refname =
"t.typname",
600 .refviscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
601 .refnamespace =
"t.typnamespace",
604 static const SchemaQuery Query_for_list_of_enum_values_unquoted = {
605 .catname =
"pg_catalog.pg_enum e, pg_catalog.pg_type t",
606 .selcondition =
"t.oid = e.enumtypid",
607 .result =
"e.enumlabel",
608 .refname =
"t.typname",
609 .refviscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
610 .refnamespace =
"t.typnamespace",
614 static const SchemaQuery Query_for_list_of_functions[] = {
616 .min_server_version = 110000,
617 .catname =
"pg_catalog.pg_proc p",
618 .selcondition =
"p.prokind != 'p'",
619 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
620 .namespace =
"p.pronamespace",
621 .result =
"p.proname",
624 .catname =
"pg_catalog.pg_proc p",
625 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
626 .namespace =
"p.pronamespace",
627 .result =
"p.proname",
631 static const SchemaQuery Query_for_list_of_procedures[] = {
633 .min_server_version = 110000,
634 .catname =
"pg_catalog.pg_proc p",
635 .selcondition =
"p.prokind = 'p'",
636 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
637 .namespace =
"p.pronamespace",
638 .result =
"p.proname",
646 static const SchemaQuery Query_for_list_of_routines = {
647 .catname =
"pg_catalog.pg_proc p",
648 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
649 .namespace =
"p.pronamespace",
650 .result =
"p.proname",
653 static const SchemaQuery Query_for_list_of_sequences = {
654 .catname =
"pg_catalog.pg_class c",
655 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_SEQUENCE)
")",
656 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
657 .namespace =
"c.relnamespace",
658 .result =
"c.relname",
661 static const SchemaQuery Query_for_list_of_foreign_tables = {
662 .catname =
"pg_catalog.pg_class c",
663 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_FOREIGN_TABLE)
")",
664 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
665 .namespace =
"c.relnamespace",
666 .result =
"c.relname",
669 static const SchemaQuery Query_for_list_of_tables = {
670 .catname =
"pg_catalog.pg_class c",
674 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
675 .namespace =
"c.relnamespace",
676 .result =
"c.relname",
679 static const SchemaQuery Query_for_list_of_partitioned_tables = {
680 .catname =
"pg_catalog.pg_class c",
681 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_PARTITIONED_TABLE)
")",
682 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
683 .namespace =
"c.relnamespace",
684 .result =
"c.relname",
687 static const SchemaQuery Query_for_list_of_tables_for_constraint = {
688 .catname =
"pg_catalog.pg_class c, pg_catalog.pg_constraint con",
689 .selcondition =
"c.oid=con.conrelid and c.relkind IN ("
692 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
693 .namespace =
"c.relnamespace",
694 .result =
"c.relname",
695 .use_distinct =
true,
696 .refname =
"con.conname",
699 static const SchemaQuery Query_for_list_of_tables_for_policy = {
700 .catname =
"pg_catalog.pg_class c, pg_catalog.pg_policy p",
701 .selcondition =
"c.oid=p.polrelid",
702 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
703 .namespace =
"c.relnamespace",
704 .result =
"c.relname",
705 .use_distinct =
true,
706 .refname =
"p.polname",
709 static const SchemaQuery Query_for_list_of_tables_for_rule = {
710 .catname =
"pg_catalog.pg_class c, pg_catalog.pg_rewrite r",
711 .selcondition =
"c.oid=r.ev_class",
712 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
713 .namespace =
"c.relnamespace",
714 .result =
"c.relname",
715 .use_distinct =
true,
716 .refname =
"r.rulename",
719 static const SchemaQuery Query_for_list_of_tables_for_trigger = {
720 .catname =
"pg_catalog.pg_class c, pg_catalog.pg_trigger t",
721 .selcondition =
"c.oid=t.tgrelid",
722 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
723 .namespace =
"c.relnamespace",
724 .result =
"c.relname",
725 .use_distinct =
true,
726 .refname =
"t.tgname",
729 static const SchemaQuery Query_for_list_of_ts_configurations = {
730 .catname =
"pg_catalog.pg_ts_config c",
731 .viscondition =
"pg_catalog.pg_ts_config_is_visible(c.oid)",
732 .namespace =
"c.cfgnamespace",
733 .result =
"c.cfgname",
736 static const SchemaQuery Query_for_list_of_ts_dictionaries = {
737 .catname =
"pg_catalog.pg_ts_dict d",
738 .viscondition =
"pg_catalog.pg_ts_dict_is_visible(d.oid)",
739 .namespace =
"d.dictnamespace",
740 .result =
"d.dictname",
743 static const SchemaQuery Query_for_list_of_ts_parsers = {
744 .catname =
"pg_catalog.pg_ts_parser p",
745 .viscondition =
"pg_catalog.pg_ts_parser_is_visible(p.oid)",
746 .namespace =
"p.prsnamespace",
747 .result =
"p.prsname",
750 static const SchemaQuery Query_for_list_of_ts_templates = {
751 .catname =
"pg_catalog.pg_ts_template t",
752 .viscondition =
"pg_catalog.pg_ts_template_is_visible(t.oid)",
753 .namespace =
"t.tmplnamespace",
754 .result =
"t.tmplname",
757 static const SchemaQuery Query_for_list_of_views = {
758 .catname =
"pg_catalog.pg_class c",
759 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_VIEW)
")",
760 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
761 .namespace =
"c.relnamespace",
762 .result =
"c.relname",
765 static const SchemaQuery Query_for_list_of_matviews = {
766 .catname =
"pg_catalog.pg_class c",
767 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_MATVIEW)
")",
768 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
769 .namespace =
"c.relnamespace",
770 .result =
"c.relname",
773 static const SchemaQuery Query_for_list_of_indexes = {
774 .catname =
"pg_catalog.pg_class c",
778 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
779 .namespace =
"c.relnamespace",
780 .result =
"c.relname",
783 static const SchemaQuery Query_for_list_of_partitioned_indexes = {
784 .catname =
"pg_catalog.pg_class c",
785 .selcondition =
"c.relkind = " CppAsString2(RELKIND_PARTITIONED_INDEX),
786 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
787 .namespace =
"c.relnamespace",
788 .result =
"c.relname",
793 static const SchemaQuery Query_for_list_of_relations = {
794 .catname =
"pg_catalog.pg_class c",
795 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
796 .namespace =
"c.relnamespace",
797 .result =
"c.relname",
801 static const SchemaQuery Query_for_list_of_partitioned_relations = {
802 .catname =
"pg_catalog.pg_class c",
803 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_PARTITIONED_TABLE)
805 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
806 .namespace =
"c.relnamespace",
807 .result =
"c.relname",
810 static const SchemaQuery Query_for_list_of_operator_families = {
811 .catname =
"pg_catalog.pg_opfamily c",
812 .viscondition =
"pg_catalog.pg_opfamily_is_visible(c.oid)",
813 .namespace =
"c.opfnamespace",
814 .result =
"c.opfname",
818 static const SchemaQuery Query_for_list_of_updatables = {
819 .catname =
"pg_catalog.pg_class c",
825 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
826 .namespace =
"c.relnamespace",
827 .result =
"c.relname",
831 static const SchemaQuery Query_for_list_of_mergetargets = {
832 .catname =
"pg_catalog.pg_class c",
837 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
838 .namespace =
"c.relnamespace",
839 .result =
"c.relname",
843 static const SchemaQuery Query_for_list_of_selectables = {
844 .catname =
"pg_catalog.pg_class c",
852 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
853 .namespace =
"c.relnamespace",
854 .result =
"c.relname",
858 static const SchemaQuery Query_for_list_of_truncatables = {
859 .catname =
"pg_catalog.pg_class c",
864 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
865 .namespace =
"c.relnamespace",
866 .result =
"c.relname",
870 #define Query_for_list_of_grantables Query_for_list_of_selectables
873 static const SchemaQuery Query_for_list_of_analyzables = {
874 .catname =
"pg_catalog.pg_class c",
880 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
881 .namespace =
"c.relnamespace",
882 .result =
"c.relname",
886 static const SchemaQuery Query_for_list_of_indexables = {
887 .catname =
"pg_catalog.pg_class c",
892 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
893 .namespace =
"c.relnamespace",
894 .result =
"c.relname",
901 #define Query_for_list_of_vacuumables Query_for_list_of_indexables
904 static const SchemaQuery Query_for_list_of_clusterables = {
905 .catname =
"pg_catalog.pg_class c",
910 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
911 .namespace =
"c.relnamespace",
912 .result =
"c.relname",
915 static const SchemaQuery Query_for_list_of_constraints_with_schema = {
916 .catname =
"pg_catalog.pg_constraint c",
917 .selcondition =
"c.conrelid <> 0",
918 .namespace =
"c.connamespace",
919 .result =
"c.conname",
922 static const SchemaQuery Query_for_list_of_statistics = {
923 .catname =
"pg_catalog.pg_statistic_ext s",
924 .viscondition =
"pg_catalog.pg_statistics_obj_is_visible(s.oid)",
925 .namespace =
"s.stxnamespace",
926 .result =
"s.stxname",
929 static const SchemaQuery Query_for_list_of_collations = {
930 .catname =
"pg_catalog.pg_collation c",
931 .selcondition =
"c.collencoding IN (-1, pg_catalog.pg_char_to_encoding(pg_catalog.getdatabaseencoding()))",
932 .viscondition =
"pg_catalog.pg_collation_is_visible(c.oid)",
933 .namespace =
"c.collnamespace",
934 .result =
"c.collname",
937 static const SchemaQuery Query_for_partition_of_table = {
938 .catname =
"pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_inherits i",
939 .selcondition =
"c1.oid=i.inhparent and i.inhrelid=c2.oid and c2.relispartition",
940 .viscondition =
"pg_catalog.pg_table_is_visible(c2.oid)",
941 .namespace =
"c2.relnamespace",
942 .result =
"c2.relname",
943 .refname =
"c1.relname",
944 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
945 .refnamespace =
"c1.relnamespace",
948 static const SchemaQuery Query_for_rule_of_table = {
949 .catname =
"pg_catalog.pg_rewrite r, pg_catalog.pg_class c1",
950 .selcondition =
"r.ev_class=c1.oid",
951 .result =
"r.rulename",
952 .refname =
"c1.relname",
953 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
954 .refnamespace =
"c1.relnamespace",
957 static const SchemaQuery Query_for_trigger_of_table = {
958 .catname =
"pg_catalog.pg_trigger t, pg_catalog.pg_class c1",
959 .selcondition =
"t.tgrelid=c1.oid and not t.tgisinternal",
960 .result =
"t.tgname",
961 .refname =
"c1.relname",
962 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
963 .refnamespace =
"c1.relnamespace",
986 #define Query_for_list_of_template_databases \
988 " FROM pg_catalog.pg_database d "\
989 " WHERE d.datname LIKE '%s' "\
990 " AND (d.datistemplate OR pg_catalog.pg_has_role(d.datdba, 'USAGE'))"
992 #define Query_for_list_of_databases \
993 "SELECT datname FROM pg_catalog.pg_database "\
994 " WHERE datname LIKE '%s'"
996 #define Query_for_list_of_tablespaces \
997 "SELECT spcname FROM pg_catalog.pg_tablespace "\
998 " WHERE spcname LIKE '%s'"
1000 #define Query_for_list_of_encodings \
1001 " SELECT DISTINCT pg_catalog.pg_encoding_to_char(conforencoding) "\
1002 " FROM pg_catalog.pg_conversion "\
1003 " WHERE pg_catalog.pg_encoding_to_char(conforencoding) LIKE pg_catalog.upper('%s')"
1005 #define Query_for_list_of_languages \
1007 " FROM pg_catalog.pg_language "\
1008 " WHERE lanname != 'internal' "\
1009 " AND lanname LIKE '%s'"
1011 #define Query_for_list_of_schemas \
1012 "SELECT nspname FROM pg_catalog.pg_namespace "\
1013 " WHERE nspname LIKE '%s'"
1016 #define Query_for_list_of_alter_system_set_vars \
1017 "SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
1018 " WHERE context != 'internal' "\
1019 " AND pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
1021 #define Query_for_list_of_set_vars \
1022 "SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
1023 " WHERE context IN ('user', 'superuser') "\
1024 " AND pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
1026 #define Query_for_list_of_show_vars \
1027 "SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
1028 " WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
1030 #define Query_for_list_of_roles \
1032 " FROM pg_catalog.pg_roles "\
1033 " WHERE rolname LIKE '%s'"
1036 #define Keywords_for_list_of_owner_roles \
1037 "CURRENT_ROLE", "CURRENT_USER", "SESSION_USER"
1040 #define Keywords_for_list_of_grant_roles \
1041 Keywords_for_list_of_owner_roles, "PUBLIC"
1043 #define Query_for_all_table_constraints \
1045 " FROM pg_catalog.pg_constraint c "\
1046 " WHERE c.conrelid <> 0 "\
1047 " and conname LIKE '%s'"
1049 #define Query_for_list_of_fdws \
1051 " FROM pg_catalog.pg_foreign_data_wrapper "\
1052 " WHERE fdwname LIKE '%s'"
1054 #define Query_for_list_of_servers \
1056 " FROM pg_catalog.pg_foreign_server "\
1057 " WHERE srvname LIKE '%s'"
1059 #define Query_for_list_of_user_mappings \
1061 " FROM pg_catalog.pg_user_mappings "\
1062 " WHERE usename LIKE '%s'"
1064 #define Query_for_list_of_access_methods \
1066 " FROM pg_catalog.pg_am "\
1067 " WHERE amname LIKE '%s'"
1069 #define Query_for_list_of_index_access_methods \
1071 " FROM pg_catalog.pg_am "\
1072 " WHERE amname LIKE '%s' AND "\
1073 " amtype=" CppAsString2(AMTYPE_INDEX)
1075 #define Query_for_list_of_table_access_methods \
1077 " FROM pg_catalog.pg_am "\
1078 " WHERE amname LIKE '%s' AND "\
1079 " amtype=" CppAsString2(AMTYPE_TABLE)
1081 #define Query_for_list_of_extensions \
1083 " FROM pg_catalog.pg_extension "\
1084 " WHERE extname LIKE '%s'"
1086 #define Query_for_list_of_available_extensions \
1088 " FROM pg_catalog.pg_available_extensions "\
1089 " WHERE name LIKE '%s' AND installed_version IS NULL"
1091 #define Query_for_list_of_available_extension_versions \
1093 " FROM pg_catalog.pg_available_extension_versions "\
1094 " WHERE version LIKE '%s' AND name='%s'"
1096 #define Query_for_list_of_prepared_statements \
1098 " FROM pg_catalog.pg_prepared_statements "\
1099 " WHERE name LIKE '%s'"
1101 #define Query_for_list_of_event_triggers \
1103 " FROM pg_catalog.pg_event_trigger "\
1104 " WHERE evtname LIKE '%s'"
1106 #define Query_for_list_of_tablesample_methods \
1108 " FROM pg_catalog.pg_proc "\
1109 " WHERE prorettype = 'pg_catalog.tsm_handler'::pg_catalog.regtype AND "\
1110 " proargtypes[0] = 'pg_catalog.internal'::pg_catalog.regtype AND "\
1111 " proname LIKE '%s'"
1113 #define Query_for_list_of_policies \
1115 " FROM pg_catalog.pg_policy "\
1116 " WHERE polname LIKE '%s'"
1118 #define Query_for_values_of_enum_GUC \
1119 " SELECT val FROM ( "\
1120 " SELECT name, pg_catalog.unnest(enumvals) AS val "\
1121 " FROM pg_catalog.pg_settings "\
1123 " WHERE val LIKE '%s'"\
1124 " and pg_catalog.lower(name)=pg_catalog.lower('%s')"
1126 #define Query_for_list_of_channels \
1128 " FROM pg_catalog.pg_listening_channels() AS channel "\
1129 " WHERE channel LIKE '%s'"
1131 #define Query_for_list_of_cursors \
1133 " FROM pg_catalog.pg_cursors "\
1134 " WHERE name LIKE '%s'"
1136 #define Query_for_list_of_timezone_names_unquoted \
1138 " FROM pg_catalog.pg_timezone_names() "\
1139 " WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
1141 #define Query_for_list_of_timezone_names_quoted_out \
1142 "SELECT pg_catalog.quote_literal(name) AS name "\
1143 " FROM pg_catalog.pg_timezone_names() "\
1144 " WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
1146 #define Query_for_list_of_timezone_names_quoted_in \
1147 "SELECT pg_catalog.quote_literal(name) AS name "\
1148 " FROM pg_catalog.pg_timezone_names() "\
1149 " WHERE pg_catalog.quote_literal(pg_catalog.lower(name)) LIKE pg_catalog.lower('%s')"
1152 #define Privilege_options_of_grant_and_revoke \
1153 "SELECT", "INSERT", "UPDATE", "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", \
1154 "CREATE", "CONNECT", "TEMPORARY", "EXECUTE", "USAGE", "SET", "ALTER SYSTEM", \
1158 #define Alter_procedure_options \
1159 "DEPENDS ON EXTENSION", "EXTERNAL SECURITY", "NO DEPENDS ON EXTENSION", \
1160 "OWNER TO", "RENAME TO", "RESET", "SECURITY", "SET"
1163 #define Alter_routine_options \
1164 Alter_procedure_options, "COST", "IMMUTABLE", "LEAKPROOF", "NOT LEAKPROOF", \
1165 "PARALLEL", "ROWS", "STABLE", "VOLATILE"
1168 #define Alter_function_options \
1169 Alter_routine_options, "CALLED ON NULL INPUT", "RETURNS NULL ON NULL INPUT", \
1178 static const VersionedQuery Query_for_list_of_publications[] = {
1181 " FROM pg_catalog.pg_publication "
1182 " WHERE pubname LIKE '%s'"
1187 static const VersionedQuery Query_for_list_of_subscriptions[] = {
1189 " SELECT s.subname "
1190 " FROM pg_catalog.pg_subscription s, pg_catalog.pg_database d "
1191 " WHERE s.subname LIKE '%s' "
1192 " AND d.datname = pg_catalog.current_database() "
1193 " AND s.subdbid = d.oid"
1208 const VersionedQuery *vquery;
1209 const SchemaQuery *squery;
1210 const char *
const *keywords;
1214 #define THING_NO_CREATE (1 << 0)
1215 #define THING_NO_DROP (1 << 1)
1216 #define THING_NO_ALTER (1 << 2)
1217 #define THING_NO_SHOW (THING_NO_CREATE | THING_NO_DROP | THING_NO_ALTER)
1220 static const char *
const Keywords_for_user_thing[] = {
1225 static const pgsql_thing_t words_after_create[] = {
1226 {
"ACCESS METHOD", NULL, NULL, NULL, NULL, THING_NO_ALTER},
1227 {
"AGGREGATE", NULL, NULL, Query_for_list_of_aggregates},
1228 {
"CAST", NULL, NULL, NULL},
1230 {
"COLLATION", NULL, NULL, &Query_for_list_of_collations},
1236 {
"CONFIGURATION", NULL, NULL, &Query_for_list_of_ts_configurations, NULL, THING_NO_SHOW},
1237 {
"CONVERSION",
"SELECT conname FROM pg_catalog.pg_conversion WHERE conname LIKE '%s'"},
1238 {
"DATABASE", Query_for_list_of_databases},
1239 {
"DEFAULT PRIVILEGES", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
1240 {
"DICTIONARY", NULL, NULL, &Query_for_list_of_ts_dictionaries, NULL, THING_NO_SHOW},
1241 {
"DOMAIN", NULL, NULL, &Query_for_list_of_domains},
1242 {
"EVENT TRIGGER", NULL, NULL, NULL},
1243 {
"EXTENSION", Query_for_list_of_extensions},
1244 {
"FOREIGN DATA WRAPPER", NULL, NULL, NULL},
1245 {
"FOREIGN TABLE", NULL, NULL, NULL},
1246 {
"FUNCTION", NULL, NULL, Query_for_list_of_functions},
1247 {
"GROUP", Query_for_list_of_roles},
1248 {
"INDEX", NULL, NULL, &Query_for_list_of_indexes},
1249 {
"LANGUAGE", Query_for_list_of_languages},
1250 {
"LARGE OBJECT", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
1251 {
"MATERIALIZED VIEW", NULL, NULL, &Query_for_list_of_matviews},
1252 {
"OPERATOR", NULL, NULL, NULL},
1254 {
"OR REPLACE", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
1255 {
"OWNED", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_ALTER},
1256 {
"PARSER", NULL, NULL, &Query_for_list_of_ts_parsers, NULL, THING_NO_SHOW},
1257 {
"POLICY", NULL, NULL, NULL},
1258 {
"PROCEDURE", NULL, NULL, Query_for_list_of_procedures},
1259 {
"PUBLICATION", NULL, Query_for_list_of_publications},
1260 {
"ROLE", Query_for_list_of_roles},
1261 {
"ROUTINE", NULL, NULL, &Query_for_list_of_routines, NULL, THING_NO_CREATE},
1262 {
"RULE",
"SELECT rulename FROM pg_catalog.pg_rules WHERE rulename LIKE '%s'"},
1263 {
"SCHEMA", Query_for_list_of_schemas},
1264 {
"SEQUENCE", NULL, NULL, &Query_for_list_of_sequences},
1265 {
"SERVER", Query_for_list_of_servers},
1266 {
"STATISTICS", NULL, NULL, &Query_for_list_of_statistics},
1267 {
"SUBSCRIPTION", NULL, Query_for_list_of_subscriptions},
1268 {
"SYSTEM", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
1269 {
"TABLE", NULL, NULL, &Query_for_list_of_tables},
1270 {
"TABLESPACE", Query_for_list_of_tablespaces},
1271 {
"TEMP", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
1273 {
"TEMPLATE", NULL, NULL, &Query_for_list_of_ts_templates, NULL, THING_NO_SHOW},
1274 {
"TEMPORARY", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
1276 {
"TEXT SEARCH", NULL, NULL, NULL},
1277 {
"TRANSFORM", NULL, NULL, NULL, NULL, THING_NO_ALTER},
1278 {
"TRIGGER",
"SELECT tgname FROM pg_catalog.pg_trigger WHERE tgname LIKE '%s' AND NOT tgisinternal"},
1279 {
"TYPE", NULL, NULL, &Query_for_list_of_datatypes},
1280 {
"UNIQUE", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
1282 {
"UNLOGGED", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
1284 {
"USER", Query_for_list_of_roles, NULL, NULL, Keywords_for_user_thing},
1285 {
"USER MAPPING FOR", NULL, NULL, NULL},
1286 {
"VIEW", NULL, NULL, &Query_for_list_of_views},
1291 static const char *
const table_storage_parameters[] = {
1292 "autovacuum_analyze_scale_factor",
1293 "autovacuum_analyze_threshold",
1294 "autovacuum_enabled",
1295 "autovacuum_freeze_max_age",
1296 "autovacuum_freeze_min_age",
1297 "autovacuum_freeze_table_age",
1298 "autovacuum_multixact_freeze_max_age",
1299 "autovacuum_multixact_freeze_min_age",
1300 "autovacuum_multixact_freeze_table_age",
1301 "autovacuum_vacuum_cost_delay",
1302 "autovacuum_vacuum_cost_limit",
1303 "autovacuum_vacuum_insert_scale_factor",
1304 "autovacuum_vacuum_insert_threshold",
1305 "autovacuum_vacuum_scale_factor",
1306 "autovacuum_vacuum_threshold",
1308 "log_autovacuum_min_duration",
1310 "toast.autovacuum_enabled",
1311 "toast.autovacuum_freeze_max_age",
1312 "toast.autovacuum_freeze_min_age",
1313 "toast.autovacuum_freeze_table_age",
1314 "toast.autovacuum_multixact_freeze_max_age",
1315 "toast.autovacuum_multixact_freeze_min_age",
1316 "toast.autovacuum_multixact_freeze_table_age",
1317 "toast.autovacuum_vacuum_cost_delay",
1318 "toast.autovacuum_vacuum_cost_limit",
1319 "toast.autovacuum_vacuum_insert_scale_factor",
1320 "toast.autovacuum_vacuum_insert_threshold",
1321 "toast.autovacuum_vacuum_scale_factor",
1322 "toast.autovacuum_vacuum_threshold",
1323 "toast.log_autovacuum_min_duration",
1324 "toast.vacuum_index_cleanup",
1325 "toast.vacuum_truncate",
1326 "toast_tuple_target",
1327 "user_catalog_table",
1328 "vacuum_index_cleanup",
1334 static const char *
const view_optional_parameters[] = {
1342 static char **psql_completion(
const char *
text,
int start,
int end);
1343 static char *create_command_generator(
const char *
text,
int state);
1344 static char *drop_command_generator(
const char *
text,
int state);
1345 static char *alter_command_generator(
const char *
text,
int state);
1346 static char *complete_from_query(
const char *
text,
int state);
1347 static char *complete_from_versioned_query(
const char *
text,
int state);
1348 static char *complete_from_schema_query(
const char *
text,
int state);
1349 static char *complete_from_versioned_schema_query(
const char *
text,
int state);
1350 static char *_complete_from_query(
const char *simple_query,
1351 const SchemaQuery *schema_query,
1352 const char *
const *keywords,
1355 static void set_completion_reference(
const char *
word);
1356 static void set_completion_reference_verbatim(
const char *
word);
1357 static char *complete_from_list(
const char *
text,
int state);
1358 static char *complete_from_const(
const char *
text,
int state);
1359 static void append_variable_names(
char ***varnames,
int *nvars,
1360 int *maxvars,
const char *varname,
1361 const char *prefix,
const char *suffix);
1362 static char **complete_from_variables(
const char *
text,
1363 const char *prefix,
const char *suffix,
bool need_value);
1364 static char *complete_from_files(
const char *
text,
int state);
1366 static char *pg_strdup_keyword_case(
const char *s,
const char *ref);
1367 static char *escape_string(
const char *
text);
1368 static char *make_like_pattern(
const char *
word);
1369 static void parse_identifier(
const char *
ident,
1370 char **schemaname,
char **objectname,
1371 bool *schemaquoted,
bool *objectquoted);
1372 static char *requote_identifier(
const char *schemaname,
const char *objectname,
1373 bool quote_schema,
bool quote_object);
1374 static bool identifier_needs_quotes(
const char *
ident);
1375 static PGresult *exec_query(
const char *query);
1377 static char **get_previous_words(
int point,
char **buffer,
int *nwords);
1379 static char *get_guctype(
const char *varname);
1381 #ifdef USE_FILENAME_QUOTING_FUNCTIONS
1382 static char *quote_file_name(
char *fname,
int match_type,
char *quote_pointer);
1383 static char *dequote_file_name(
char *fname,
int quote_char);
1394 rl_attempted_completion_function = psql_completion;
1396 #ifdef USE_FILENAME_QUOTING_FUNCTIONS
1397 rl_filename_quoting_function = quote_file_name;
1398 rl_filename_dequoting_function = dequote_file_name;
1401 rl_basic_word_break_characters = WORD_BREAKS;
1410 rl_completer_quote_characters =
"'";
1418 #ifdef HAVE_RL_FILENAME_QUOTE_CHARACTERS
1420 unsigned char *fqc = (
unsigned char *)
pg_malloc(256);
1422 for (
int i = 0;
i < 255;
i++)
1423 fqc[
i] = (
unsigned char) (
i + 1);
1425 rl_filename_quote_characters = (
const char *) fqc;
1429 completion_max_records = 1000;
1451 #define MatchAny NULL
1452 #define MatchAnyExcept(pattern) ("!" pattern)
1455 word_matches(
const char *pattern,
1457 bool case_sensitive)
1461 #define cimatch(s1, s2, n) \
1462 (case_sensitive ? strncmp(s1, s2, n) == 0 : pg_strncasecmp(s1, s2, n) == 0)
1465 if (pattern == NULL)
1469 if (*pattern ==
'!')
1470 return !word_matches(pattern + 1,
word, case_sensitive);
1473 wordlen = strlen(
word);
1476 const char *star = NULL;
1481 while (*
c !=
'\0' && *
c !=
'|')
1491 size_t beforelen = star - pattern,
1492 afterlen =
c - star - 1;
1494 if (wordlen >= (beforelen + afterlen) &&
1495 cimatch(
word, pattern, beforelen) &&
1496 cimatch(
word + wordlen - afterlen, star + 1, afterlen))
1502 if (wordlen == (
c - pattern) &&
1503 cimatch(
word, pattern, wordlen))
1524 TailMatchesImpl(
bool case_sensitive,
1525 int previous_words_count,
char **previous_words,
1530 if (previous_words_count < narg)
1535 for (
int argno = 0; argno < narg; argno++)
1537 const char *
arg = va_arg(
args,
const char *);
1539 if (!word_matches(
arg, previous_words[narg - argno - 1],
1557 MatchesImpl(
bool case_sensitive,
1558 int previous_words_count,
char **previous_words,
1563 if (previous_words_count != narg)
1568 for (
int argno = 0; argno < narg; argno++)
1570 const char *
arg = va_arg(
args,
const char *);
1572 if (!word_matches(
arg, previous_words[narg - argno - 1],
1590 HeadMatchesImpl(
bool case_sensitive,
1591 int previous_words_count,
char **previous_words,
1596 if (previous_words_count < narg)
1601 for (
int argno = 0; argno < narg; argno++)
1603 const char *
arg = va_arg(
args,
const char *);
1605 if (!word_matches(
arg, previous_words[previous_words_count - argno - 1],
1622 ends_with(
const char *s,
char c)
1624 size_t length = strlen(s);
1626 return (length > 0 && s[length - 1] ==
c);
1638 psql_completion(
const char *
text,
int start,
int end)
1641 char **matches = NULL;
1647 char **previous_words;
1650 int previous_words_count;
1659 #define prev_wd (previous_words[0])
1660 #define prev2_wd (previous_words[1])
1661 #define prev3_wd (previous_words[2])
1662 #define prev4_wd (previous_words[3])
1663 #define prev5_wd (previous_words[4])
1664 #define prev6_wd (previous_words[5])
1665 #define prev7_wd (previous_words[6])
1666 #define prev8_wd (previous_words[7])
1667 #define prev9_wd (previous_words[8])
1670 #define TailMatches(...) \
1671 TailMatchesImpl(false, previous_words_count, previous_words, \
1672 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1675 #define TailMatchesCS(...) \
1676 TailMatchesImpl(true, previous_words_count, previous_words, \
1677 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1680 #define Matches(...) \
1681 MatchesImpl(false, previous_words_count, previous_words, \
1682 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1685 #define MatchesCS(...) \
1686 MatchesImpl(true, previous_words_count, previous_words, \
1687 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1690 #define HeadMatches(...) \
1691 HeadMatchesImpl(false, previous_words_count, previous_words, \
1692 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1695 #define HeadMatchesCS(...) \
1696 HeadMatchesImpl(true, previous_words_count, previous_words, \
1697 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1700 static const char *
const sql_commands[] = {
1701 "ABORT",
"ALTER",
"ANALYZE",
"BEGIN",
"CALL",
"CHECKPOINT",
"CLOSE",
"CLUSTER",
1702 "COMMENT",
"COMMIT",
"COPY",
"CREATE",
"DEALLOCATE",
"DECLARE",
1703 "DELETE FROM",
"DISCARD",
"DO",
"DROP",
"END",
"EXECUTE",
"EXPLAIN",
1704 "FETCH",
"GRANT",
"IMPORT FOREIGN SCHEMA",
"INSERT INTO",
"LISTEN",
"LOAD",
"LOCK",
1705 "MERGE INTO",
"MOVE",
"NOTIFY",
"PREPARE",
1706 "REASSIGN",
"REFRESH MATERIALIZED VIEW",
"REINDEX",
"RELEASE",
1707 "RESET",
"REVOKE",
"ROLLBACK",
1708 "SAVEPOINT",
"SECURITY LABEL",
"SELECT",
"SET",
"SHOW",
"START",
1709 "TABLE",
"TRUNCATE",
"UNLISTEN",
"UPDATE",
"VACUUM",
"VALUES",
"WITH",
1714 static const char *
const backslash_commands[] = {
1717 "\\connect",
"\\conninfo",
"\\C",
"\\cd",
"\\copy",
1718 "\\copyright",
"\\crosstabview",
1719 "\\d",
"\\da",
"\\dA",
"\\dAc",
"\\dAf",
"\\dAo",
"\\dAp",
1720 "\\db",
"\\dc",
"\\dconfig",
"\\dC",
"\\dd",
"\\ddp",
"\\dD",
1721 "\\des",
"\\det",
"\\deu",
"\\dew",
"\\dE",
"\\df",
1722 "\\dF",
"\\dFd",
"\\dFp",
"\\dFt",
"\\dg",
"\\di",
"\\dl",
"\\dL",
1723 "\\dm",
"\\dn",
"\\do",
"\\dO",
"\\dp",
"\\dP",
"\\dPi",
"\\dPt",
1724 "\\drds",
"\\drg",
"\\dRs",
"\\dRp",
"\\ds",
1725 "\\dt",
"\\dT",
"\\dv",
"\\du",
"\\dx",
"\\dX",
"\\dy",
1726 "\\echo",
"\\edit",
"\\ef",
"\\elif",
"\\else",
"\\encoding",
1727 "\\endif",
"\\errverbose",
"\\ev",
1729 "\\g",
"\\gdesc",
"\\getenv",
"\\gexec",
"\\gset",
"\\gx",
1731 "\\if",
"\\include",
"\\include_relative",
"\\ir",
1732 "\\list",
"\\lo_import",
"\\lo_export",
"\\lo_list",
"\\lo_unlink",
1734 "\\password",
"\\print",
"\\prompt",
"\\pset",
1735 "\\qecho",
"\\quit",
1737 "\\s",
"\\set",
"\\setenv",
"\\sf",
"\\sv",
1738 "\\t",
"\\T",
"\\timing",
1741 "\\warn",
"\\watch",
"\\write",
1752 char *text_copy =
pnstrdup(rl_line_buffer + start, end - start);
1756 completion_last_char = (end > start) ?
text[end - start - 1] :
'\0';
1759 rl_completion_append_character =
' ';
1762 completion_charp = NULL;
1763 completion_charpp = NULL;
1764 completion_vquery = NULL;
1765 completion_squery = NULL;
1766 completion_ref_object = NULL;
1767 completion_ref_schema = NULL;
1774 previous_words = get_previous_words(start,
1776 &previous_words_count);
1779 if (
text[0] ==
'\\')
1780 COMPLETE_WITH_LIST_CS(backslash_commands);
1783 else if (
text[0] ==
':' &&
text[1] !=
':')
1785 if (
text[1] ==
'\'')
1786 matches = complete_from_variables(
text,
":'",
"'",
true);
1787 else if (
text[1] ==
'"')
1788 matches = complete_from_variables(
text,
":\"",
"\"",
true);
1789 else if (
text[1] ==
'{' &&
text[2] ==
'?')
1790 matches = complete_from_variables(
text,
":{?",
"}",
true);
1792 matches = complete_from_variables(
text,
":",
"",
true);
1796 else if (previous_words_count == 0)
1797 COMPLETE_WITH_LIST(sql_commands);
1801 else if (TailMatches(
"CREATE"))
1804 if (HeadMatches(
"CREATE",
"SCHEMA"))
1805 COMPLETE_WITH(
"TABLE",
"VIEW",
"INDEX",
"SEQUENCE",
"TRIGGER",
1807 "UNIQUE",
"UNLOGGED");
1809 matches = rl_completion_matches(
text, create_command_generator);
1812 else if (TailMatches(
"CREATE",
"OR",
"REPLACE"))
1813 COMPLETE_WITH(
"FUNCTION",
"PROCEDURE",
"LANGUAGE",
"RULE",
"VIEW",
1814 "AGGREGATE",
"TRANSFORM",
"TRIGGER");
1818 else if (Matches(
"DROP"))
1819 matches = rl_completion_matches(
text, drop_command_generator);
1824 else if (Matches(
"ALTER",
"TABLE"))
1825 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
1826 "ALL IN TABLESPACE");
1829 else if (Matches(
"ALTER"))
1830 matches = rl_completion_matches(
text, alter_command_generator);
1832 else if (TailMatches(
"ALL",
"IN",
"TABLESPACE", MatchAny))
1833 COMPLETE_WITH(
"SET TABLESPACE",
"OWNED BY");
1835 else if (TailMatches(
"ALL",
"IN",
"TABLESPACE", MatchAny,
"OWNED",
"BY"))
1836 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
1838 else if (TailMatches(
"ALL",
"IN",
"TABLESPACE", MatchAny,
"OWNED",
"BY", MatchAny))
1839 COMPLETE_WITH(
"SET TABLESPACE");
1841 else if (Matches(
"ALTER",
"AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny))
1844 else if (Matches(
"ALTER",
"AGGREGATE", MatchAny, MatchAny))
1846 if (ends_with(prev_wd,
')'))
1847 COMPLETE_WITH(
"OWNER TO",
"RENAME TO",
"SET SCHEMA");
1849 COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
1852 else if (Matches(
"ALTER",
"FUNCTION", MatchAny, MatchAny))
1854 if (ends_with(prev_wd,
')'))
1855 COMPLETE_WITH(Alter_function_options);
1857 COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
1860 else if (Matches(
"ALTER",
"PROCEDURE", MatchAny, MatchAny))
1862 if (ends_with(prev_wd,
')'))
1863 COMPLETE_WITH(Alter_procedure_options);
1865 COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
1868 else if (Matches(
"ALTER",
"ROUTINE", MatchAny, MatchAny))
1870 if (ends_with(prev_wd,
')'))
1871 COMPLETE_WITH(Alter_routine_options);
1873 COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
1876 else if (Matches(
"ALTER",
"FUNCTION|ROUTINE", MatchAny, MatchAny,
"PARALLEL"))
1877 COMPLETE_WITH(
"RESTRICTED",
"SAFE",
"UNSAFE");
1879 else if (Matches(
"ALTER",
"FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny,
"SECURITY") ||
1880 Matches(
"ALTER",
"FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny,
"EXTERNAL",
"SECURITY"))
1881 COMPLETE_WITH(
"DEFINER",
"INVOKER");
1883 else if (Matches(
"ALTER",
"FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny,
"RESET"))
1884 COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars,
1887 else if (Matches(
"ALTER",
"FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny,
"SET"))
1888 COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars,
1892 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny))
1893 COMPLETE_WITH(
"ADD",
"DROP",
"OWNER TO",
"RENAME TO",
"SET");
1895 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD"))
1896 COMPLETE_WITH(
"TABLES IN SCHEMA",
"TABLE");
1897 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD|SET",
"TABLE") ||
1898 (HeadMatches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD|SET",
"TABLE") &&
1899 ends_with(prev_wd,
',')))
1900 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
1909 else if (HeadMatches(
"ALTER",
"PUBLICATION", MatchAny) && TailMatches(
"WHERE"))
1911 else if (HeadMatches(
"ALTER",
"PUBLICATION", MatchAny) && TailMatches(
"WHERE",
"("))
1912 COMPLETE_WITH_ATTR(prev3_wd);
1913 else if (HeadMatches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD|SET",
"TABLE") &&
1914 !TailMatches(
"WHERE",
"(*)"))
1915 COMPLETE_WITH(
",",
"WHERE (");
1916 else if (HeadMatches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD|SET",
"TABLE"))
1919 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny,
"DROP"))
1920 COMPLETE_WITH(
"TABLES IN SCHEMA",
"TABLE");
1922 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny,
"SET"))
1923 COMPLETE_WITH(
"(",
"TABLES IN SCHEMA",
"TABLE");
1924 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD|DROP|SET",
"TABLES",
"IN",
"SCHEMA"))
1925 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
1926 " AND nspname NOT LIKE E'pg\\\\_%%'",
1929 else if (HeadMatches(
"ALTER",
"PUBLICATION", MatchAny) && TailMatches(
"SET",
"("))
1930 COMPLETE_WITH(
"publish",
"publish_via_partition_root");
1932 else if (Matches(
"ALTER",
"SUBSCRIPTION", MatchAny))
1933 COMPLETE_WITH(
"CONNECTION",
"ENABLE",
"DISABLE",
"OWNER TO",
1934 "RENAME TO",
"REFRESH PUBLICATION",
"SET",
"SKIP (",
1935 "ADD PUBLICATION",
"DROP PUBLICATION");
1937 else if (HeadMatches(
"ALTER",
"SUBSCRIPTION", MatchAny) &&
1938 TailMatches(
"REFRESH",
"PUBLICATION"))
1939 COMPLETE_WITH(
"WITH (");
1941 else if (HeadMatches(
"ALTER",
"SUBSCRIPTION", MatchAny) &&
1942 TailMatches(
"REFRESH",
"PUBLICATION",
"WITH",
"("))
1943 COMPLETE_WITH(
"copy_data");
1945 else if (Matches(
"ALTER",
"SUBSCRIPTION", MatchAny,
"SET"))
1946 COMPLETE_WITH(
"(",
"PUBLICATION");
1948 else if (HeadMatches(
"ALTER",
"SUBSCRIPTION", MatchAny) && TailMatches(
"SET",
"("))
1949 COMPLETE_WITH(
"binary",
"disable_on_error",
"failover",
"origin",
1950 "password_required",
"run_as_owner",
"slot_name",
1951 "streaming",
"synchronous_commit");
1953 else if (HeadMatches(
"ALTER",
"SUBSCRIPTION", MatchAny) && TailMatches(
"SKIP",
"("))
1954 COMPLETE_WITH(
"lsn");
1956 else if (HeadMatches(
"ALTER",
"SUBSCRIPTION", MatchAny) && TailMatches(
"SET",
"PUBLICATION"))
1961 else if (HeadMatches(
"ALTER",
"SUBSCRIPTION", MatchAny) &&
1962 TailMatches(
"ADD|DROP|SET",
"PUBLICATION", MatchAny))
1963 COMPLETE_WITH(
"WITH (");
1965 else if (HeadMatches(
"ALTER",
"SUBSCRIPTION", MatchAny) &&
1966 TailMatches(
"ADD|DROP|SET",
"PUBLICATION", MatchAny,
"WITH",
"("))
1967 COMPLETE_WITH(
"copy_data",
"refresh");
1970 else if (Matches(
"ALTER",
"SCHEMA", MatchAny))
1971 COMPLETE_WITH(
"OWNER TO",
"RENAME TO");
1974 else if (Matches(
"ALTER",
"COLLATION", MatchAny))
1975 COMPLETE_WITH(
"OWNER TO",
"REFRESH VERSION",
"RENAME TO",
"SET SCHEMA");
1978 else if (Matches(
"ALTER",
"CONVERSION", MatchAny))
1979 COMPLETE_WITH(
"OWNER TO",
"RENAME TO",
"SET SCHEMA");
1982 else if (Matches(
"ALTER",
"DATABASE", MatchAny))
1983 COMPLETE_WITH(
"RESET",
"SET",
"OWNER TO",
"REFRESH COLLATION VERSION",
"RENAME TO",
1984 "IS_TEMPLATE",
"ALLOW_CONNECTIONS",
1985 "CONNECTION LIMIT");
1988 else if (Matches(
"ALTER",
"DATABASE", MatchAny,
"SET",
"TABLESPACE"))
1989 COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
1992 else if (Matches(
"ALTER",
"EVENT",
"TRIGGER"))
1993 COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
1996 else if (Matches(
"ALTER",
"EVENT",
"TRIGGER", MatchAny))
1997 COMPLETE_WITH(
"DISABLE",
"ENABLE",
"OWNER TO",
"RENAME TO");
2000 else if (Matches(
"ALTER",
"EVENT",
"TRIGGER", MatchAny,
"ENABLE"))
2001 COMPLETE_WITH(
"REPLICA",
"ALWAYS");
2004 else if (Matches(
"ALTER",
"EXTENSION", MatchAny))
2005 COMPLETE_WITH(
"ADD",
"DROP",
"UPDATE",
"SET SCHEMA");
2008 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"ADD|DROP"))
2009 COMPLETE_WITH(
"ACCESS METHOD",
"AGGREGATE",
"CAST",
"COLLATION",
2010 "CONVERSION",
"DOMAIN",
"EVENT TRIGGER",
"FOREIGN",
2011 "FUNCTION",
"MATERIALIZED VIEW",
"OPERATOR",
2012 "LANGUAGE",
"PROCEDURE",
"ROUTINE",
"SCHEMA",
2013 "SEQUENCE",
"SERVER",
"TABLE",
"TEXT SEARCH",
2014 "TRANSFORM FOR",
"TYPE",
"VIEW");
2017 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"ADD|DROP",
"FOREIGN"))
2018 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
2021 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"ADD|DROP",
"OPERATOR"))
2022 COMPLETE_WITH(
"CLASS",
"FAMILY");
2025 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"ADD|DROP",
"TEXT",
"SEARCH"))
2026 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
2029 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"UPDATE"))
2030 COMPLETE_WITH(
"TO");
2033 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"UPDATE",
"TO"))
2035 set_completion_reference(prev3_wd);
2036 COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions);
2040 else if (Matches(
"ALTER",
"FOREIGN"))
2041 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
2044 else if (Matches(
"ALTER",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny))
2045 COMPLETE_WITH(
"HANDLER",
"VALIDATOR",
"NO",
2046 "OPTIONS",
"OWNER TO",
"RENAME TO");
2047 else if (Matches(
"ALTER",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny,
"NO"))
2048 COMPLETE_WITH(
"HANDLER",
"VALIDATOR");
2051 else if (Matches(
"ALTER",
"FOREIGN",
"TABLE", MatchAny))
2052 COMPLETE_WITH(
"ADD",
"ALTER",
"DISABLE TRIGGER",
"DROP",
"ENABLE",
2053 "INHERIT",
"NO INHERIT",
"OPTIONS",
"OWNER TO",
2054 "RENAME",
"SET",
"VALIDATE CONSTRAINT");
2057 else if (Matches(
"ALTER",
"INDEX"))
2058 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
2059 "ALL IN TABLESPACE");
2061 else if (Matches(
"ALTER",
"INDEX", MatchAny))
2062 COMPLETE_WITH(
"ALTER COLUMN",
"OWNER TO",
"RENAME TO",
"SET",
2063 "RESET",
"ATTACH PARTITION",
2064 "DEPENDS ON EXTENSION",
"NO DEPENDS ON EXTENSION");
2065 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ATTACH"))
2066 COMPLETE_WITH(
"PARTITION");
2067 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ATTACH",
"PARTITION"))
2068 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
2070 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ALTER"))
2071 COMPLETE_WITH(
"COLUMN");
2073 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ALTER",
"COLUMN"))
2075 set_completion_reference(prev3_wd);
2076 COMPLETE_WITH_SCHEMA_QUERY_VERBATIM(Query_for_list_of_attribute_numbers);
2079 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ALTER",
"COLUMN", MatchAny))
2080 COMPLETE_WITH(
"SET STATISTICS");
2082 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET"))
2083 COMPLETE_WITH(
"STATISTICS");
2085 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"STATISTICS"))
2090 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"SET"))
2091 COMPLETE_WITH(
"(",
"TABLESPACE");
2093 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"RESET"))
2096 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"RESET",
"("))
2097 COMPLETE_WITH(
"fillfactor",
2098 "deduplicate_items",
2099 "fastupdate",
"gin_pending_list_limit",
2101 "pages_per_range",
"autosummarize"
2103 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"SET",
"("))
2104 COMPLETE_WITH(
"fillfactor =",
2105 "deduplicate_items =",
2106 "fastupdate =",
"gin_pending_list_limit =",
2108 "pages_per_range =",
"autosummarize ="
2110 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"NO",
"DEPENDS"))
2111 COMPLETE_WITH(
"ON EXTENSION");
2112 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"DEPENDS"))
2113 COMPLETE_WITH(
"ON EXTENSION");
2116 else if (Matches(
"ALTER",
"LANGUAGE", MatchAny))
2117 COMPLETE_WITH(
"OWNER TO",
"RENAME TO");
2120 else if (Matches(
"ALTER",
"LARGE",
"OBJECT", MatchAny))
2121 COMPLETE_WITH(
"OWNER TO");
2124 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW"))
2125 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_matviews,
2126 "ALL IN TABLESPACE");
2129 else if (Matches(
"ALTER",
"USER|ROLE", MatchAny) &&
2130 !TailMatches(
"USER",
"MAPPING"))
2131 COMPLETE_WITH(
"BYPASSRLS",
"CONNECTION LIMIT",
"CREATEDB",
"CREATEROLE",
2132 "ENCRYPTED PASSWORD",
"INHERIT",
"LOGIN",
"NOBYPASSRLS",
2133 "NOCREATEDB",
"NOCREATEROLE",
"NOINHERIT",
2134 "NOLOGIN",
"NOREPLICATION",
"NOSUPERUSER",
"PASSWORD",
2135 "RENAME TO",
"REPLICATION",
"RESET",
"SET",
"SUPERUSER",
2136 "VALID UNTIL",
"WITH");
2139 else if (Matches(
"ALTER",
"USER|ROLE", MatchAny,
"WITH"))
2141 COMPLETE_WITH(
"BYPASSRLS",
"CONNECTION LIMIT",
"CREATEDB",
"CREATEROLE",
2142 "ENCRYPTED PASSWORD",
"INHERIT",
"LOGIN",
"NOBYPASSRLS",
2143 "NOCREATEDB",
"NOCREATEROLE",
"NOINHERIT",
2144 "NOLOGIN",
"NOREPLICATION",
"NOSUPERUSER",
"PASSWORD",
2145 "RENAME TO",
"REPLICATION",
"RESET",
"SET",
"SUPERUSER",
2149 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES"))
2150 COMPLETE_WITH(
"FOR ROLE",
"IN SCHEMA");
2152 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"FOR"))
2153 COMPLETE_WITH(
"ROLE");
2155 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"IN"))
2156 COMPLETE_WITH(
"SCHEMA");
2158 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"FOR",
"ROLE|USER",
2160 COMPLETE_WITH(
"GRANT",
"REVOKE",
"IN SCHEMA");
2162 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"IN",
"SCHEMA",
2164 COMPLETE_WITH(
"GRANT",
"REVOKE",
"FOR ROLE");
2166 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"IN",
"SCHEMA",
2168 COMPLETE_WITH(
"ROLE");
2171 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"FOR",
"ROLE|USER",
2172 MatchAny,
"IN",
"SCHEMA", MatchAny) ||
2173 Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"IN",
"SCHEMA",
2174 MatchAny,
"FOR",
"ROLE|USER", MatchAny))
2175 COMPLETE_WITH(
"GRANT",
"REVOKE");
2177 else if (Matches(
"ALTER",
"DOMAIN", MatchAny))
2178 COMPLETE_WITH(
"ADD",
"DROP",
"OWNER TO",
"RENAME",
"SET",
2179 "VALIDATE CONSTRAINT");
2181 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"DROP"))
2182 COMPLETE_WITH(
"CONSTRAINT",
"DEFAULT",
"NOT NULL");
2184 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"DROP|RENAME|VALIDATE",
"CONSTRAINT"))
2186 set_completion_reference(prev3_wd);
2187 COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_type);
2190 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"RENAME"))
2191 COMPLETE_WITH(
"CONSTRAINT",
"TO");
2193 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"RENAME",
"CONSTRAINT", MatchAny))
2194 COMPLETE_WITH(
"TO");
2197 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"SET"))
2198 COMPLETE_WITH(
"DEFAULT",
"NOT NULL",
"SCHEMA");
2200 else if (Matches(
"ALTER",
"SEQUENCE", MatchAny))
2201 COMPLETE_WITH(
"AS",
"INCREMENT",
"MINVALUE",
"MAXVALUE",
"RESTART",
2202 "START",
"NO",
"CACHE",
"CYCLE",
"SET",
"OWNED BY",
2203 "OWNER TO",
"RENAME TO");
2205 else if (TailMatches(
"ALTER",
"SEQUENCE", MatchAny,
"AS"))
2206 COMPLETE_WITH_CS(
"smallint",
"integer",
"bigint");
2208 else if (Matches(
"ALTER",
"SEQUENCE", MatchAny,
"NO"))
2209 COMPLETE_WITH(
"MINVALUE",
"MAXVALUE",
"CYCLE");
2211 else if (Matches(
"ALTER",
"SEQUENCE", MatchAny,
"SET"))
2212 COMPLETE_WITH(
"SCHEMA",
"LOGGED",
"UNLOGGED");
2214 else if (Matches(
"ALTER",
"SERVER", MatchAny))
2215 COMPLETE_WITH(
"VERSION",
"OPTIONS",
"OWNER TO",
"RENAME TO");
2217 else if (Matches(
"ALTER",
"SERVER", MatchAny,
"VERSION", MatchAny))
2218 COMPLETE_WITH(
"OPTIONS");
2220 else if (Matches(
"ALTER",
"SYSTEM"))
2221 COMPLETE_WITH(
"SET",
"RESET");
2222 else if (Matches(
"ALTER",
"SYSTEM",
"SET|RESET"))
2223 COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_alter_system_set_vars,
2225 else if (Matches(
"ALTER",
"SYSTEM",
"SET", MatchAny))
2226 COMPLETE_WITH(
"TO");
2228 else if (Matches(
"ALTER",
"VIEW", MatchAny))
2229 COMPLETE_WITH(
"ALTER COLUMN",
"OWNER TO",
"RENAME",
"RESET",
"SET");
2231 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"RENAME"))
2232 COMPLETE_WITH_ATTR_PLUS(prev2_wd,
"COLUMN",
"TO");
2233 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"ALTER|RENAME",
"COLUMN"))
2234 COMPLETE_WITH_ATTR(prev3_wd);
2236 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"ALTER", MatchAny) ||
2237 Matches(
"ALTER",
"VIEW", MatchAny,
"ALTER",
"COLUMN", MatchAny))
2238 COMPLETE_WITH(
"SET DEFAULT",
"DROP DEFAULT");
2240 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"RENAME", MatchAnyExcept(
"TO")))
2241 COMPLETE_WITH(
"TO");
2243 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"RENAME",
"COLUMN", MatchAnyExcept(
"TO")))
2244 COMPLETE_WITH(
"TO");
2246 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"RESET"))
2249 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"SET"))
2250 COMPLETE_WITH(
"(",
"SCHEMA");
2252 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"SET|RESET",
"("))
2253 COMPLETE_WITH_LIST(view_optional_parameters);
2254 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"SET",
"(", MatchAny))
2256 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"SET",
"(",
"check_option",
"="))
2257 COMPLETE_WITH(
"local",
"cascaded");
2258 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"SET",
"(",
"security_barrier|security_invoker",
"="))
2259 COMPLETE_WITH(
"true",
"false");
2262 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny))
2263 COMPLETE_WITH(
"ALTER COLUMN",
"CLUSTER ON",
"DEPENDS ON EXTENSION",
2264 "NO DEPENDS ON EXTENSION",
"OWNER TO",
"RENAME",
2267 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"RENAME"))
2268 COMPLETE_WITH_ATTR_PLUS(prev2_wd,
"COLUMN",
"TO");
2269 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"ALTER|RENAME",
"COLUMN"))
2270 COMPLETE_WITH_ATTR(prev3_wd);
2272 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"RENAME", MatchAnyExcept(
"TO")))
2273 COMPLETE_WITH(
"TO");
2275 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"RENAME",
"COLUMN", MatchAnyExcept(
"TO")))
2276 COMPLETE_WITH(
"TO");
2278 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"SET"))
2279 COMPLETE_WITH(
"(",
"ACCESS METHOD",
"SCHEMA",
"TABLESPACE",
"WITHOUT CLUSTER");
2281 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"SET",
"ACCESS",
"METHOD"))
2282 COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
2285 else if (Matches(
"ALTER",
"POLICY"))
2286 COMPLETE_WITH_QUERY(Query_for_list_of_policies);
2288 else if (Matches(
"ALTER",
"POLICY", MatchAny))
2289 COMPLETE_WITH(
"ON");
2291 else if (Matches(
"ALTER",
"POLICY", MatchAny,
"ON"))
2293 set_completion_reference(prev2_wd);
2294 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
2297 else if (Matches(
"ALTER",
"POLICY", MatchAny,
"ON", MatchAny))
2298 COMPLETE_WITH(
"RENAME TO",
"TO",
"USING (",
"WITH CHECK (");
2300 else if (Matches(
"ALTER",
"POLICY", MatchAny,
"ON", MatchAny,
"TO"))
2301 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
2302 Keywords_for_list_of_grant_roles);
2304 else if (Matches(
"ALTER",
"POLICY", MatchAny,
"ON", MatchAny,
"USING"))
2307 else if (Matches(
"ALTER",
"POLICY", MatchAny,
"ON", MatchAny,
"WITH",
"CHECK"))
2311 else if (Matches(
"ALTER",
"RULE", MatchAny))
2312 COMPLETE_WITH(
"ON");
2315 else if (Matches(
"ALTER",
"RULE", MatchAny,
"ON"))
2317 set_completion_reference(prev2_wd);
2318 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
2322 else if (Matches(
"ALTER",
"RULE", MatchAny,
"ON", MatchAny))
2323 COMPLETE_WITH(
"RENAME TO");
2326 else if (Matches(
"ALTER",
"STATISTICS", MatchAny))
2327 COMPLETE_WITH(
"OWNER TO",
"RENAME TO",
"SET SCHEMA",
"SET STATISTICS");
2329 else if (Matches(
"ALTER",
"STATISTICS", MatchAny,
"SET"))
2330 COMPLETE_WITH(
"SCHEMA",
"STATISTICS");
2333 else if (Matches(
"ALTER",
"TRIGGER", MatchAny))
2334 COMPLETE_WITH(
"ON");
2336 else if (Matches(
"ALTER",
"TRIGGER", MatchAny,
"ON"))
2338 set_completion_reference(prev2_wd);
2339 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
2343 else if (Matches(
"ALTER",
"TRIGGER", MatchAny,
"ON", MatchAny))
2344 COMPLETE_WITH(
"RENAME TO",
"DEPENDS ON EXTENSION",
2345 "NO DEPENDS ON EXTENSION");
2350 else if (Matches(
"ALTER",
"TABLE", MatchAny))
2351 COMPLETE_WITH(
"ADD",
"ALTER",
"CLUSTER ON",
"DISABLE",
"DROP",
2352 "ENABLE",
"INHERIT",
"NO",
"RENAME",
"RESET",
2353 "OWNER TO",
"SET",
"VALIDATE CONSTRAINT",
2354 "REPLICA IDENTITY",
"ATTACH PARTITION",
2355 "DETACH PARTITION",
"FORCE ROW LEVEL SECURITY",
2358 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD"))
2361 COMPLETE_WITH(
"COLUMN",
"CONSTRAINT",
"CHECK",
"UNIQUE",
"PRIMARY KEY",
2362 "EXCLUDE",
"FOREIGN KEY");
2365 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"COLUMN", MatchAny) ||
2366 (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD", MatchAny) &&
2367 !Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"COLUMN|CONSTRAINT|CHECK|UNIQUE|PRIMARY|EXCLUDE|FOREIGN")))
2368 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
2370 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"CONSTRAINT", MatchAny))
2371 COMPLETE_WITH(
"CHECK",
"UNIQUE",
"PRIMARY KEY",
"EXCLUDE",
"FOREIGN KEY");
2373 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"PRIMARY",
"KEY") ||
2374 Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"UNIQUE") ||
2375 Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"CONSTRAINT", MatchAny,
"PRIMARY",
"KEY") ||
2376 Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"CONSTRAINT", MatchAny,
"UNIQUE"))
2377 COMPLETE_WITH(
"(",
"USING INDEX");
2379 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"PRIMARY",
"KEY",
"USING",
"INDEX"))
2381 set_completion_reference(prev6_wd);
2382 COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
2385 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"UNIQUE",
"USING",
"INDEX"))
2387 set_completion_reference(prev5_wd);
2388 COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
2391 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"CONSTRAINT", MatchAny,
2392 "PRIMARY",
"KEY",
"USING",
"INDEX"))
2394 set_completion_reference(prev8_wd);
2395 COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
2398 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"CONSTRAINT", MatchAny,
2399 "UNIQUE",
"USING",
"INDEX"))
2401 set_completion_reference(prev7_wd);
2402 COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
2405 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE"))
2406 COMPLETE_WITH(
"ALWAYS",
"REPLICA",
"ROW LEVEL SECURITY",
"RULE",
2408 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE",
"REPLICA|ALWAYS"))
2409 COMPLETE_WITH(
"RULE",
"TRIGGER");
2410 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE",
"RULE"))
2412 set_completion_reference(prev3_wd);
2413 COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
2415 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE", MatchAny,
"RULE"))
2417 set_completion_reference(prev4_wd);
2418 COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
2420 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE",
"TRIGGER"))
2422 set_completion_reference(prev3_wd);
2423 COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
2425 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE", MatchAny,
"TRIGGER"))
2427 set_completion_reference(prev4_wd);
2428 COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
2431 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"INHERIT"))
2432 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
2434 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"NO"))
2435 COMPLETE_WITH(
"FORCE ROW LEVEL SECURITY",
"INHERIT");
2437 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"NO",
"INHERIT"))
2438 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
2440 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DISABLE"))
2441 COMPLETE_WITH(
"ROW LEVEL SECURITY",
"RULE",
"TRIGGER");
2442 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DISABLE",
"RULE"))
2444 set_completion_reference(prev3_wd);
2445 COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
2447 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DISABLE",
"TRIGGER"))
2449 set_completion_reference(prev3_wd);
2450 COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
2454 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER"))
2455 COMPLETE_WITH_ATTR_PLUS(prev2_wd,
"COLUMN",
"CONSTRAINT");
2458 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"RENAME"))
2459 COMPLETE_WITH_ATTR_PLUS(prev2_wd,
"COLUMN",
"CONSTRAINT",
"TO");
2460 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER|RENAME",
"COLUMN"))
2461 COMPLETE_WITH_ATTR(prev3_wd);
2464 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"RENAME", MatchAnyExcept(
"CONSTRAINT|TO")))
2465 COMPLETE_WITH(
"TO");
2468 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"RENAME",
"COLUMN|CONSTRAINT", MatchAnyExcept(
"TO")))
2469 COMPLETE_WITH(
"TO");
2472 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DROP"))
2473 COMPLETE_WITH(
"COLUMN",
"CONSTRAINT");
2475 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DROP",
"COLUMN"))
2476 COMPLETE_WITH_ATTR(prev3_wd);
2478 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER|DROP|RENAME",
"CONSTRAINT"))
2480 set_completion_reference(prev3_wd);
2481 COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_table);
2484 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"VALIDATE",
"CONSTRAINT"))
2486 set_completion_reference(prev3_wd);
2487 COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_table_not_validated);
2490 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny) ||
2491 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny))
2492 COMPLETE_WITH(
"TYPE",
"SET",
"RESET",
"RESTART",
"ADD",
"DROP");
2494 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"ADD") ||
2495 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"ADD"))
2496 COMPLETE_WITH(
"GENERATED");
2498 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"ADD",
"GENERATED") ||
2499 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"ADD",
"GENERATED"))
2500 COMPLETE_WITH(
"ALWAYS",
"BY DEFAULT");
2502 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"ADD",
"GENERATED",
"ALWAYS") ||
2503 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"ADD",
"GENERATED",
"ALWAYS") ||
2504 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"ADD",
"GENERATED",
"BY",
"DEFAULT") ||
2505 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"ADD",
"GENERATED",
"BY",
"DEFAULT"))
2506 COMPLETE_WITH(
"AS IDENTITY");
2508 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET") ||
2509 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET"))
2510 COMPLETE_WITH(
"(",
"COMPRESSION",
"DATA TYPE",
"DEFAULT",
"EXPRESSION",
"GENERATED",
"NOT NULL",
2511 "STATISTICS",
"STORAGE",
2513 "INCREMENT",
"MINVALUE",
"MAXVALUE",
"START",
"NO",
"CACHE",
"CYCLE");
2515 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"(") ||
2516 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"("))
2517 COMPLETE_WITH(
"n_distinct",
"n_distinct_inherited");
2519 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"COMPRESSION") ||
2520 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"COMPRESSION"))
2521 COMPLETE_WITH(
"DEFAULT",
"PGLZ",
"LZ4");
2523 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"EXPRESSION") ||
2524 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"EXPRESSION"))
2525 COMPLETE_WITH(
"AS");
2527 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"EXPRESSION",
"AS") ||
2528 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"EXPRESSION",
"AS"))
2531 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"GENERATED") ||
2532 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"GENERATED"))
2533 COMPLETE_WITH(
"ALWAYS",
"BY DEFAULT");
2535 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"NO") ||
2536 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"NO"))
2537 COMPLETE_WITH(
"MINVALUE",
"MAXVALUE",
"CYCLE");
2539 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"STORAGE") ||
2540 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"STORAGE"))
2541 COMPLETE_WITH(
"DEFAULT",
"PLAIN",
"EXTERNAL",
"EXTENDED",
"MAIN");
2543 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"STATISTICS") ||
2544 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"STATISTICS"))
2549 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"DROP") ||
2550 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"DROP"))
2551 COMPLETE_WITH(
"DEFAULT",
"EXPRESSION",
"IDENTITY",
"NOT NULL");
2552 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"CLUSTER"))
2553 COMPLETE_WITH(
"ON");
2554 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"CLUSTER",
"ON"))
2556 set_completion_reference(prev3_wd);
2557 COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
2560 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"SET"))
2561 COMPLETE_WITH(
"(",
"ACCESS METHOD",
"LOGGED",
"SCHEMA",
2562 "TABLESPACE",
"UNLOGGED",
"WITH",
"WITHOUT");
2568 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"SET",
"ACCESS",
"METHOD"))
2569 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_table_access_methods,
2576 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"SET",
"TABLESPACE"))
2577 COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
2579 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"SET",
"WITHOUT"))
2580 COMPLETE_WITH(
"CLUSTER",
"OIDS");
2582 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"RESET"))
2585 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"SET|RESET",
"("))
2586 COMPLETE_WITH_LIST(table_storage_parameters);
2587 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"REPLICA",
"IDENTITY",
"USING",
"INDEX"))
2589 set_completion_reference(prev5_wd);
2590 COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
2592 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"REPLICA",
"IDENTITY",
"USING"))
2593 COMPLETE_WITH(
"INDEX");
2594 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"REPLICA",
"IDENTITY"))
2595 COMPLETE_WITH(
"FULL",
"NOTHING",
"DEFAULT",
"USING");
2596 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"REPLICA"))
2597 COMPLETE_WITH(
"IDENTITY");
2603 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ATTACH",
"PARTITION"))
2604 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
2606 else if (TailMatches(
"ATTACH",
"PARTITION", MatchAny))
2607 COMPLETE_WITH(
"FOR VALUES",
"DEFAULT");
2608 else if (TailMatches(
"FOR",
"VALUES"))
2609 COMPLETE_WITH(
"FROM (",
"IN (",
"WITH (");
2615 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DETACH",
"PARTITION"))
2617 set_completion_reference(prev3_wd);
2618 COMPLETE_WITH_SCHEMA_QUERY(Query_for_partition_of_table);
2620 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DETACH",
"PARTITION", MatchAny))
2621 COMPLETE_WITH(
"CONCURRENTLY",
"FINALIZE");
2624 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"OF"))
2625 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes);
2628 else if (Matches(
"ALTER",
"TABLESPACE", MatchAny))
2629 COMPLETE_WITH(
"RENAME TO",
"OWNER TO",
"SET",
"RESET");
2631 else if (Matches(
"ALTER",
"TABLESPACE", MatchAny,
"SET|RESET"))
2634 else if (Matches(
"ALTER",
"TABLESPACE", MatchAny,
"SET|RESET",
"("))
2635 COMPLETE_WITH(
"seq_page_cost",
"random_page_cost",
2636 "effective_io_concurrency",
"maintenance_io_concurrency");
2639 else if (Matches(
"ALTER",
"TEXT",
"SEARCH"))
2640 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
2641 else if (Matches(
"ALTER",
"TEXT",
"SEARCH",
"TEMPLATE|PARSER", MatchAny))
2642 COMPLETE_WITH(
"RENAME TO",
"SET SCHEMA");
2643 else if (Matches(
"ALTER",
"TEXT",
"SEARCH",
"DICTIONARY", MatchAny))
2644 COMPLETE_WITH(
"(",
"OWNER TO",
"RENAME TO",
"SET SCHEMA");
2645 else if (Matches(
"ALTER",
"TEXT",
"SEARCH",
"CONFIGURATION", MatchAny))
2646 COMPLETE_WITH(
"ADD MAPPING FOR",
"ALTER MAPPING",
2648 "OWNER TO",
"RENAME TO",
"SET SCHEMA");
2651 else if (Matches(
"ALTER",
"TYPE", MatchAny))
2652 COMPLETE_WITH(
"ADD ATTRIBUTE",
"ADD VALUE",
"ALTER ATTRIBUTE",
2654 "OWNER TO",
"RENAME",
"SET SCHEMA",
"SET (");
2656 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"ADD"))
2657 COMPLETE_WITH(
"ATTRIBUTE",
"VALUE");
2659 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"RENAME"))
2660 COMPLETE_WITH(
"ATTRIBUTE",
"TO",
"VALUE");
2662 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"RENAME",
"ATTRIBUTE|VALUE", MatchAny))
2663 COMPLETE_WITH(
"TO");
2669 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"ALTER|DROP|RENAME",
"ATTRIBUTE"))
2670 COMPLETE_WITH_ATTR(prev3_wd);
2672 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"ALTER",
"ATTRIBUTE", MatchAny))
2673 COMPLETE_WITH(
"TYPE");
2675 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"RENAME",
"VALUE"))
2676 COMPLETE_WITH_ENUM_VALUE(prev3_wd);
2678 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"SET"))
2679 COMPLETE_WITH(
"(",
"SCHEMA");
2681 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"SET",
"("))
2682 COMPLETE_WITH(
"ANALYZE",
"RECEIVE",
"SEND",
"STORAGE",
"SUBSCRIPT",
2683 "TYPMOD_IN",
"TYPMOD_OUT");
2686 else if (Matches(
"ALTER",
"GROUP", MatchAny))
2687 COMPLETE_WITH(
"ADD USER",
"DROP USER",
"RENAME TO");
2689 else if (Matches(
"ALTER",
"GROUP", MatchAny,
"ADD|DROP"))
2690 COMPLETE_WITH(
"USER");
2692 else if (Matches(
"ALTER",
"GROUP", MatchAny,
"ADD|DROP",
"USER"))
2693 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
2699 else if (Matches(
"ANALYZE"))
2700 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_analyzables,
2702 else if (HeadMatches(
"ANALYZE",
"(*") &&
2703 !HeadMatches(
"ANALYZE",
"(*)"))
2710 if (ends_with(prev_wd,
'(') || ends_with(prev_wd,
','))
2711 COMPLETE_WITH(
"VERBOSE",
"SKIP_LOCKED",
"BUFFER_USAGE_LIMIT");
2712 else if (TailMatches(
"VERBOSE|SKIP_LOCKED"))
2713 COMPLETE_WITH(
"ON",
"OFF");
2715 else if (HeadMatches(
"ANALYZE") && TailMatches(
"("))
2717 COMPLETE_WITH_ATTR(prev2_wd);
2718 else if (HeadMatches(
"ANALYZE"))
2719 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_analyzables);
2722 else if (Matches(
"BEGIN"))
2723 COMPLETE_WITH(
"WORK",
"TRANSACTION",
"ISOLATION LEVEL",
"READ",
"DEFERRABLE",
"NOT DEFERRABLE");
2725 else if (Matches(
"END|ABORT"))
2726 COMPLETE_WITH(
"AND",
"WORK",
"TRANSACTION");
2728 else if (Matches(
"COMMIT"))
2729 COMPLETE_WITH(
"AND",
"WORK",
"TRANSACTION",
"PREPARED");
2731 else if (Matches(
"RELEASE"))
2732 COMPLETE_WITH(
"SAVEPOINT");
2734 else if (Matches(
"ROLLBACK"))
2735 COMPLETE_WITH(
"AND",
"WORK",
"TRANSACTION",
"TO SAVEPOINT",
"PREPARED");
2736 else if (Matches(
"ABORT|END|COMMIT|ROLLBACK",
"AND"))
2737 COMPLETE_WITH(
"CHAIN");
2739 else if (Matches(
"CALL"))
2740 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures);
2741 else if (Matches(
"CALL", MatchAny))
2744 else if (Matches(
"CLOSE"))
2745 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
2748 else if (Matches(
"CLUSTER"))
2749 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_clusterables,
2751 else if (Matches(
"CLUSTER",
"VERBOSE") ||
2752 Matches(
"CLUSTER",
"(*)"))
2753 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_clusterables);
2755 else if (Matches(
"CLUSTER", MatchAnyExcept(
"VERBOSE|ON|(|(*)")))
2756 COMPLETE_WITH(
"USING");
2758 else if (Matches(
"CLUSTER",
"VERBOSE|(*)", MatchAny))
2759 COMPLETE_WITH(
"USING");
2761 else if (Matches(
"CLUSTER", MatchAny,
"USING") ||
2762 Matches(
"CLUSTER",
"VERBOSE|(*)", MatchAny,
"USING"))
2764 set_completion_reference(prev2_wd);
2765 COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
2767 else if (HeadMatches(
"CLUSTER",
"(*") &&
2768 !HeadMatches(
"CLUSTER",
"(*)"))
2775 if (ends_with(prev_wd,
'(') || ends_with(prev_wd,
','))
2776 COMPLETE_WITH(
"VERBOSE");
2780 else if (Matches(
"COMMENT"))
2781 COMPLETE_WITH(
"ON");
2782 else if (Matches(
"COMMENT",
"ON"))
2783 COMPLETE_WITH(
"ACCESS METHOD",
"AGGREGATE",
"CAST",
"COLLATION",
2784 "COLUMN",
"CONSTRAINT",
"CONVERSION",
"DATABASE",
2785 "DOMAIN",
"EXTENSION",
"EVENT TRIGGER",
2786 "FOREIGN DATA WRAPPER",
"FOREIGN TABLE",
2787 "FUNCTION",
"INDEX",
"LANGUAGE",
"LARGE OBJECT",
2788 "MATERIALIZED VIEW",
"OPERATOR",
"POLICY",
2789 "PROCEDURE",
"PROCEDURAL LANGUAGE",
"PUBLICATION",
"ROLE",
2790 "ROUTINE",
"RULE",
"SCHEMA",
"SEQUENCE",
"SERVER",
2791 "STATISTICS",
"SUBSCRIPTION",
"TABLE",
2792 "TABLESPACE",
"TEXT SEARCH",
"TRANSFORM FOR",
2793 "TRIGGER",
"TYPE",
"VIEW");
2794 else if (Matches(
"COMMENT",
"ON",
"ACCESS",
"METHOD"))
2795 COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
2796 else if (Matches(
"COMMENT",
"ON",
"CONSTRAINT"))
2797 COMPLETE_WITH_QUERY(Query_for_all_table_constraints);
2798 else if (Matches(
"COMMENT",
"ON",
"CONSTRAINT", MatchAny))
2799 COMPLETE_WITH(
"ON");
2800 else if (Matches(
"COMMENT",
"ON",
"CONSTRAINT", MatchAny,
"ON"))
2802 set_completion_reference(prev2_wd);
2803 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables_for_constraint,
2806 else if (Matches(
"COMMENT",
"ON",
"CONSTRAINT", MatchAny,
"ON",
"DOMAIN"))
2807 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
2808 else if (Matches(
"COMMENT",
"ON",
"EVENT",
"TRIGGER"))
2809 COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
2810 else if (Matches(
"COMMENT",
"ON",
"FOREIGN"))
2811 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
2812 else if (Matches(
"COMMENT",
"ON",
"FOREIGN",
"TABLE"))
2813 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
2814 else if (Matches(
"COMMENT",
"ON",
"MATERIALIZED",
"VIEW"))
2815 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
2816 else if (Matches(
"COMMENT",
"ON",
"POLICY"))
2817 COMPLETE_WITH_QUERY(Query_for_list_of_policies);
2818 else if (Matches(
"COMMENT",
"ON",
"POLICY", MatchAny))
2819 COMPLETE_WITH(
"ON");
2820 else if (Matches(
"COMMENT",
"ON",
"POLICY", MatchAny,
"ON"))
2822 set_completion_reference(prev2_wd);
2823 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
2825 else if (Matches(
"COMMENT",
"ON",
"PROCEDURAL",
"LANGUAGE"))
2826 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
2827 else if (Matches(
"COMMENT",
"ON",
"RULE", MatchAny))
2828 COMPLETE_WITH(
"ON");
2829 else if (Matches(
"COMMENT",
"ON",
"RULE", MatchAny,
"ON"))
2831 set_completion_reference(prev2_wd);
2832 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
2834 else if (Matches(
"COMMENT",
"ON",
"TEXT",
"SEARCH"))
2835 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
2836 else if (Matches(
"COMMENT",
"ON",
"TEXT",
"SEARCH",
"CONFIGURATION"))
2837 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_configurations);
2838 else if (Matches(
"COMMENT",
"ON",
"TEXT",
"SEARCH",
"DICTIONARY"))
2839 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_dictionaries);
2840 else if (Matches(
"COMMENT",
"ON",
"TEXT",
"SEARCH",
"PARSER"))
2841 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_parsers);
2842 else if (Matches(
"COMMENT",
"ON",
"TEXT",
"SEARCH",
"TEMPLATE"))
2843 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_templates);
2844 else if (Matches(
"COMMENT",
"ON",
"TRANSFORM",
"FOR"))
2845 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
2846 else if (Matches(
"COMMENT",
"ON",
"TRANSFORM",
"FOR", MatchAny))
2847 COMPLETE_WITH(
"LANGUAGE");
2848 else if (Matches(
"COMMENT",
"ON",
"TRANSFORM",
"FOR", MatchAny,
"LANGUAGE"))
2850 set_completion_reference(prev2_wd);
2851 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
2853 else if (Matches(
"COMMENT",
"ON",
"TRIGGER", MatchAny))
2854 COMPLETE_WITH(
"ON");
2855 else if (Matches(
"COMMENT",
"ON",
"TRIGGER", MatchAny,
"ON"))
2857 set_completion_reference(prev2_wd);
2858 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
2860 else if (Matches(
"COMMENT",
"ON", MatchAny, MatchAnyExcept(
"IS")) ||
2861 Matches(
"COMMENT",
"ON", MatchAny, MatchAny, MatchAnyExcept(
"IS")) ||
2862 Matches(
"COMMENT",
"ON", MatchAny, MatchAny, MatchAny, MatchAnyExcept(
"IS")) ||
2863 Matches(
"COMMENT",
"ON", MatchAny, MatchAny, MatchAny, MatchAny, MatchAnyExcept(
"IS")))
2864 COMPLETE_WITH(
"IS");
2872 else if (Matches(
"COPY|\\copy"))
2873 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
"(");
2875 else if (Matches(
"COPY|\\copy",
"("))
2876 COMPLETE_WITH(
"SELECT",
"TABLE",
"VALUES",
"INSERT INTO",
"UPDATE",
"DELETE FROM",
"WITH");
2878 else if (Matches(
"COPY|\\copy", MatchAny))
2879 COMPLETE_WITH(
"FROM",
"TO");
2881 else if (Matches(
"COPY", MatchAny,
"FROM|TO"))
2883 completion_charp =
"";
2884 completion_force_quote =
true;
2885 matches = rl_completion_matches(
text, complete_from_files);
2887 else if (Matches(
"\\copy", MatchAny,
"FROM|TO"))
2889 completion_charp =
"";
2890 completion_force_quote =
false;
2891 matches = rl_completion_matches(
text, complete_from_files);
2895 else if (Matches(
"COPY|\\copy", MatchAny,
"TO", MatchAny))
2896 COMPLETE_WITH(
"WITH (");
2899 else if (Matches(
"COPY|\\copy", MatchAny,
"FROM", MatchAny))
2900 COMPLETE_WITH(
"WITH (",
"WHERE");
2903 else if (Matches(
"COPY|\\copy", MatchAny,
"FROM|TO", MatchAny,
"WITH",
"("))
2904 COMPLETE_WITH(
"FORMAT",
"FREEZE",
"DELIMITER",
"NULL",
2905 "HEADER",
"QUOTE",
"ESCAPE",
"FORCE_QUOTE",
2906 "FORCE_NOT_NULL",
"FORCE_NULL",
"ENCODING",
"DEFAULT",
2910 else if (Matches(
"COPY|\\copy", MatchAny,
"FROM|TO", MatchAny,
"WITH",
"(",
"FORMAT"))
2911 COMPLETE_WITH(
"binary",
"csv",
"text");
2914 else if (Matches(
"COPY|\\copy", MatchAny,
"FROM|TO", MatchAny,
"WITH",
"(",
"ON_ERROR"))
2915 COMPLETE_WITH(
"stop",
"ignore");
2918 else if (Matches(
"COPY|\\copy", MatchAny,
"FROM", MatchAny,
"WITH", MatchAny))
2919 COMPLETE_WITH(
"WHERE");
2923 else if (Matches(
"CREATE",
"ACCESS",
"METHOD", MatchAny))
2924 COMPLETE_WITH(
"TYPE");
2926 else if (Matches(
"CREATE",
"ACCESS",
"METHOD", MatchAny,
"TYPE"))
2927 COMPLETE_WITH(
"INDEX",
"TABLE");
2929 else if (Matches(
"CREATE",
"ACCESS",
"METHOD", MatchAny,
"TYPE", MatchAny))
2930 COMPLETE_WITH(
"HANDLER");
2933 else if (Matches(
"CREATE",
"COLLATION", MatchAny))
2934 COMPLETE_WITH(
"(",
"FROM");
2935 else if (Matches(
"CREATE",
"COLLATION", MatchAny,
"FROM"))
2936 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations);
2937 else if (HeadMatches(
"CREATE",
"COLLATION", MatchAny,
"(*"))
2939 if (TailMatches(
"(|*,"))
2940 COMPLETE_WITH(
"LOCALE =",
"LC_COLLATE =",
"LC_CTYPE =",
2941 "PROVIDER =",
"DETERMINISTIC =");
2942 else if (TailMatches(
"PROVIDER",
"="))
2943 COMPLETE_WITH(
"libc",
"icu");
2944 else if (TailMatches(
"DETERMINISTIC",
"="))
2945 COMPLETE_WITH(
"true",
"false");
2949 else if (Matches(
"CREATE",
"DATABASE", MatchAny))
2950 COMPLETE_WITH(
"OWNER",
"TEMPLATE",
"ENCODING",
"TABLESPACE",
2951 "IS_TEMPLATE",
"STRATEGY",
2952 "ALLOW_CONNECTIONS",
"CONNECTION LIMIT",
2953 "LC_COLLATE",
"LC_CTYPE",
"LOCALE",
"OID",
2954 "LOCALE_PROVIDER",
"ICU_LOCALE");
2956 else if (Matches(
"CREATE",
"DATABASE", MatchAny,
"TEMPLATE"))
2957 COMPLETE_WITH_QUERY(Query_for_list_of_template_databases);
2958 else if (Matches(
"CREATE",
"DATABASE", MatchAny,
"STRATEGY"))
2959 COMPLETE_WITH(
"WAL_LOG",
"FILE_COPY");
2962 else if (Matches(
"CREATE",
"DOMAIN", MatchAny))
2963 COMPLETE_WITH(
"AS");
2964 else if (Matches(
"CREATE",
"DOMAIN", MatchAny,
"AS"))
2965 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
2966 else if (Matches(
"CREATE",
"DOMAIN", MatchAny,
"AS", MatchAny))
2967 COMPLETE_WITH(
"COLLATE",
"DEFAULT",
"CONSTRAINT",
2968 "NOT NULL",
"NULL",
"CHECK (");
2969 else if (Matches(
"CREATE",
"DOMAIN", MatchAny,
"COLLATE"))
2970 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations);
2974 else if (Matches(
"CREATE",
"EXTENSION"))
2975 COMPLETE_WITH_QUERY(Query_for_list_of_available_extensions);
2977 else if (Matches(
"CREATE",
"EXTENSION", MatchAny))
2978 COMPLETE_WITH(
"WITH SCHEMA",
"CASCADE",
"VERSION");
2980 else if (Matches(
"CREATE",
"EXTENSION", MatchAny,
"VERSION"))
2982 set_completion_reference(prev2_wd);
2983 COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions);
2987 else if (Matches(
"CREATE",
"FOREIGN"))
2988 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
2991 else if (Matches(
"CREATE",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny))
2992 COMPLETE_WITH(
"HANDLER",
"VALIDATOR",
"OPTIONS");
2995 else if (Matches(
"CREATE",
"FOREIGN",
"TABLE", MatchAny))
2996 COMPLETE_WITH(
"(",
"PARTITION OF");
3000 else if (TailMatches(
"CREATE",
"UNIQUE"))
3001 COMPLETE_WITH(
"INDEX");
3007 else if (TailMatches(
"CREATE|UNIQUE",
"INDEX"))
3008 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
3009 "ON",
"CONCURRENTLY");
3015 else if (TailMatches(
"INDEX|CONCURRENTLY", MatchAny,
"ON") ||
3016 TailMatches(
"INDEX|CONCURRENTLY",
"ON"))
3017 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables);
3023 else if (TailMatches(
"CREATE|UNIQUE",
"INDEX",
"CONCURRENTLY"))
3024 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
3027 else if (TailMatches(
"CREATE|UNIQUE",
"INDEX", MatchAny) ||
3028 TailMatches(
"CREATE|UNIQUE",
"INDEX",
"CONCURRENTLY", MatchAny))
3029 COMPLETE_WITH(
"ON");
3035 else if (TailMatches(
"INDEX", MatchAny,
"ON", MatchAny) ||
3036 TailMatches(
"INDEX|CONCURRENTLY",
"ON", MatchAny))
3037 COMPLETE_WITH(
"(",
"USING");
3038 else if (TailMatches(
"INDEX", MatchAny,
"ON", MatchAny,
"(") ||
3039 TailMatches(
"INDEX|CONCURRENTLY",
"ON", MatchAny,
"("))
3040 COMPLETE_WITH_ATTR(prev2_wd);
3042 else if (TailMatches(
"ON", MatchAny,
"USING", MatchAny,
"("))
3043 COMPLETE_WITH_ATTR(prev4_wd);
3045 else if (TailMatches(
"INDEX", MatchAny, MatchAny,
"ON", MatchAny,
"USING") ||
3046 TailMatches(
"INDEX", MatchAny,
"ON", MatchAny,
"USING") ||
3047 TailMatches(
"INDEX",
"ON", MatchAny,
"USING"))
3048 COMPLETE_WITH_QUERY(Query_for_list_of_index_access_methods);
3049 else if (TailMatches(
"ON", MatchAny,
"USING", MatchAny) &&
3050 !TailMatches(
"POLICY", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny) &&
3051 !TailMatches(
"FOR", MatchAny, MatchAny, MatchAny))
3055 else if (Matches(
"CREATE",
"OR"))
3056 COMPLETE_WITH(
"REPLACE");
3060 else if (Matches(
"CREATE",
"POLICY", MatchAny))
3061 COMPLETE_WITH(
"ON");
3063 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON"))
3064 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
3066 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny))
3067 COMPLETE_WITH(
"AS",
"FOR",
"TO",
"USING (",
"WITH CHECK (");
3069 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS"))
3070 COMPLETE_WITH(
"PERMISSIVE",
"RESTRICTIVE");
3076 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny))
3077 COMPLETE_WITH(
"FOR",
"TO",
"USING",
"WITH CHECK");
3079 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"FOR"))
3080 COMPLETE_WITH(
"ALL",
"SELECT",
"INSERT",
"UPDATE",
"DELETE");
3082 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"FOR",
"INSERT"))
3083 COMPLETE_WITH(
"TO",
"WITH CHECK (");
3085 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"FOR",
"SELECT|DELETE"))
3086 COMPLETE_WITH(
"TO",
"USING (");
3088 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"FOR",
"ALL|UPDATE"))
3089 COMPLETE_WITH(
"TO",
"USING (",
"WITH CHECK (");
3091 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"TO"))
3092 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
3093 Keywords_for_list_of_grant_roles);
3095 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"USING"))
3102 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"FOR"))
3103 COMPLETE_WITH(
"ALL",
"SELECT",
"INSERT",
"UPDATE",
"DELETE");
3109 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"FOR",
"INSERT"))
3110 COMPLETE_WITH(
"TO",
"WITH CHECK (");
3116 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"FOR",
"SELECT|DELETE"))
3117 COMPLETE_WITH(
"TO",
"USING (");
3123 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"FOR",
"ALL|UPDATE"))
3124 COMPLETE_WITH(
"TO",
"USING (",
"WITH CHECK (");
3130 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"TO"))
3131 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
3132 Keywords_for_list_of_grant_roles);
3138 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"USING"))
3143 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny))
3144 COMPLETE_WITH(
"FOR TABLE",
"FOR ALL TABLES",
"FOR TABLES IN SCHEMA",
"WITH (");
3145 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR"))
3146 COMPLETE_WITH(
"TABLE",
"ALL TABLES",
"TABLES IN SCHEMA");
3147 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"ALL"))
3148 COMPLETE_WITH(
"TABLES");
3149 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"ALL",
"TABLES"))
3150 COMPLETE_WITH(
"WITH (");
3151 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"TABLES"))
3152 COMPLETE_WITH(
"IN SCHEMA");
3153 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"TABLE", MatchAny) && !ends_with(prev_wd,
','))
3154 COMPLETE_WITH(
"WHERE (",
"WITH (");
3156 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"TABLE"))
3157 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
3163 else if (HeadMatches(
"CREATE",
"PUBLICATION", MatchAny) && TailMatches(
"WHERE"))
3165 else if (HeadMatches(
"CREATE",
"PUBLICATION", MatchAny) && TailMatches(
"WHERE",
"("))
3166 COMPLETE_WITH_ATTR(prev3_wd);
3167 else if (HeadMatches(
"CREATE",
"PUBLICATION", MatchAny) && TailMatches(
"WHERE",
"(*)"))
3168 COMPLETE_WITH(
" WITH (");
3173 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"TABLES",
"IN",
"SCHEMA"))
3174 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
3175 " AND nspname NOT LIKE E'pg\\\\_%%'",
3177 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"TABLES",
"IN",
"SCHEMA", MatchAny) && (!ends_with(prev_wd,
',')))
3178 COMPLETE_WITH(
"WITH (");
3180 else if (HeadMatches(
"CREATE",
"PUBLICATION") && TailMatches(
"WITH",
"("))
3181 COMPLETE_WITH(
"publish",
"publish_via_partition_root");
3185 else if (Matches(
"CREATE",
"RULE", MatchAny) ||
3186 Matches(
"CREATE",
"OR",
"REPLACE",
"RULE", MatchAny))
3187 COMPLETE_WITH(
"AS ON");
3189 else if (Matches(
"CREATE",
"RULE", MatchAny,
"AS") ||
3190 Matches(
"CREATE",
"OR",
"REPLACE",
"RULE", MatchAny,
"AS"))
3191 COMPLETE_WITH(
"ON");
3197 else if (Matches(
"CREATE",
"RULE", MatchAny,
"AS",
"ON") ||
3198 Matches(
"CREATE",
"OR",
"REPLACE",
"RULE", MatchAny,
"AS",
"ON"))
3199 COMPLETE_WITH(
"SELECT",
"UPDATE",
"INSERT",
"DELETE");
3201 else if (TailMatches(
"AS",
"ON",
"SELECT|UPDATE|INSERT|DELETE"))
3202 COMPLETE_WITH(
"TO");
3204 else if (TailMatches(
"AS",
"ON",
"SELECT|UPDATE|INSERT|DELETE",
"TO"))
3205 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
3208 else if (Matches(
"CREATE",
"SCHEMA"))
3209 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas,
3211 else if (Matches(
"CREATE",
"SCHEMA",
"AUTHORIZATION") ||
3212 Matches(
"CREATE",
"SCHEMA", MatchAny,
"AUTHORIZATION"))
3213 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
3214 Keywords_for_list_of_owner_roles);
3215 else if (Matches(
"CREATE",
"SCHEMA",
"AUTHORIZATION", MatchAny) ||
3216 Matches(
"CREATE",
"SCHEMA", MatchAny,
"AUTHORIZATION", MatchAny))
3217 COMPLETE_WITH(
"CREATE",
"GRANT");
3218 else if (Matches(
"CREATE",
"SCHEMA", MatchAny))
3219 COMPLETE_WITH(
"AUTHORIZATION",
"CREATE",
"GRANT");
3222 else if (TailMatches(
"CREATE",
"SEQUENCE", MatchAny) ||
3223 TailMatches(
"CREATE",
"TEMP|TEMPORARY",
"SEQUENCE", MatchAny))
3224 COMPLETE_WITH(
"AS",
"INCREMENT BY",
"MINVALUE",
"MAXVALUE",
"NO",
3225 "CACHE",
"CYCLE",
"OWNED BY",
"START WITH");
3226 else if (TailMatches(
"CREATE",
"SEQUENCE", MatchAny,
"AS") ||
3227 TailMatches(
"CREATE",
"TEMP|TEMPORARY",
"SEQUENCE", MatchAny,
"AS"))
3228 COMPLETE_WITH_CS(
"smallint",
"integer",
"bigint");
3229 else if (TailMatches(
"CREATE",
"SEQUENCE", MatchAny,
"NO") ||
3230 TailMatches(
"CREATE",
"TEMP|TEMPORARY",
"SEQUENCE", MatchAny,
"NO"))
3231 COMPLETE_WITH(
"MINVALUE",
"MAXVALUE",
"CYCLE");
3234 else if (Matches(
"CREATE",
"SERVER", MatchAny))
3235 COMPLETE_WITH(
"TYPE",
"VERSION",
"FOREIGN DATA WRAPPER");
3238 else if (Matches(
"CREATE",
"STATISTICS", MatchAny))
3239 COMPLETE_WITH(
"(",
"ON");
3240 else if (Matches(
"CREATE",
"STATISTICS", MatchAny,
"("))
3241 COMPLETE_WITH(
"ndistinct",
"dependencies",
"mcv");
3242 else if (Matches(
"CREATE",
"STATISTICS", MatchAny,
"(*)"))
3243 COMPLETE_WITH(
"ON");
3244 else if (HeadMatches(
"CREATE",
"STATISTICS", MatchAny) &&
3245 TailMatches(
"FROM"))
3246 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
3250 else if (TailMatches(
"CREATE",
"TEMP|TEMPORARY"))
3251 COMPLETE_WITH(
"SEQUENCE",
"TABLE",
"VIEW");
3253 else if (TailMatches(
"CREATE",
"UNLOGGED"))
3256 if (HeadMatches(
"CREATE",
"SCHEMA"))
3257 COMPLETE_WITH(
"TABLE",
"SEQUENCE");
3259 COMPLETE_WITH(
"TABLE",
"SEQUENCE",
"MATERIALIZED VIEW");
3262 else if (TailMatches(
"PARTITION",
"BY"))
3263 COMPLETE_WITH(
"RANGE (",
"LIST (",
"HASH (");
3265 else if (TailMatches(
"PARTITION",
"OF"))
3266 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables);
3268 else if (TailMatches(
"PARTITION",
"OF", MatchAny))
3269 COMPLETE_WITH(
"FOR VALUES",
"DEFAULT");
3271 else if (TailMatches(
"CREATE",
"TABLE", MatchAny) ||
3272 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny))
3273 COMPLETE_WITH(
"(",
"AS",
"OF",
"PARTITION OF");
3275 else if (TailMatches(
"CREATE",
"TABLE", MatchAny,
"OF") ||
3276 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny,
"OF"))
3277 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes);
3279 else if (TailMatches(
"CREATE",
"TABLE", MatchAny,
"AS") ||
3280 TailMatches(
"CREATE",
"TABLE", MatchAny,
"(*)",
"AS") ||
3281 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny,
"AS") ||
3282 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny,
"(*)",
"AS"))
3283 COMPLETE_WITH(
"EXECUTE",
"SELECT",
"TABLE",
"VALUES",
"WITH");
3285 else if (TailMatches(
"CREATE",
"TABLE", MatchAny,
"(*)") ||
3286 TailMatches(
"CREATE",
"UNLOGGED",
"TABLE", MatchAny,
"(*)"))
3287 COMPLETE_WITH(
"AS",
"INHERITS (",
"PARTITION BY",
"USING",
"TABLESPACE",
"WITH (");
3288 else if (TailMatches(
"CREATE",
"TEMP|TEMPORARY",
"TABLE", MatchAny,
"(*)"))
3289 COMPLETE_WITH(
"AS",
"INHERITS (",
"ON COMMIT",
"PARTITION BY",
3290 "TABLESPACE",
"WITH (");
3292 else if (TailMatches(
"CREATE",
"TABLE", MatchAny,
"(*)",
"USING") ||
3293 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny,
"(*)",
"USING"))
3294 COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
3296 else if (TailMatches(
"CREATE",
"TABLE", MatchAny,
"(*)",
"WITH",
"(") ||
3297 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny,
"(*)",
"WITH",
"("))
3298 COMPLETE_WITH_LIST(table_storage_parameters);
3300 else if (TailMatches(
"CREATE",
"TEMP|TEMPORARY",
"TABLE", MatchAny,
"(*)",
"ON",
"COMMIT"))
3301 COMPLETE_WITH(
"DELETE ROWS",
"DROP",
"PRESERVE ROWS");
3304 else if (Matches(
"CREATE",
"TABLESPACE", MatchAny))
3305 COMPLETE_WITH(
"OWNER",
"LOCATION");
3307 else if (Matches(
"CREATE",
"TABLESPACE", MatchAny,
"OWNER", MatchAny))
3308 COMPLETE_WITH(
"LOCATION");
3311 else if (Matches(
"CREATE",
"TEXT",
"SEARCH"))
3312 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
3313 else if (Matches(
"CREATE",
"TEXT",
"SEARCH",
"CONFIGURATION|DICTIONARY|PARSER|TEMPLATE", MatchAny))
3317 else if (Matches(
"CREATE",
"TRANSFORM") ||
3318 Matches(
"CREATE",
"OR",
"REPLACE",
"TRANSFORM"))
3319 COMPLETE_WITH(
"FOR");
3320 else if (Matches(
"CREATE",
"TRANSFORM",
"FOR") ||
3321 Matches(
"CREATE",
"OR",
"REPLACE",
"TRANSFORM",
"FOR"))
3322 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
3323 else if (Matches(
"CREATE",
"TRANSFORM",
"FOR", MatchAny) ||
3324 Matches(
"CREATE",
"OR",
"REPLACE",
"TRANSFORM",
"FOR", MatchAny))
3325 COMPLETE_WITH(
"LANGUAGE");
3326 else if (Matches(
"CREATE",
"TRANSFORM",
"FOR", MatchAny,
"LANGUAGE") ||
3327 Matches(
"CREATE",
"OR",
"REPLACE",
"TRANSFORM",
"FOR", MatchAny,
"LANGUAGE"))
3329 set_completion_reference(prev2_wd);
3330 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
3334 else if (Matches(
"CREATE",
"SUBSCRIPTION", MatchAny))
3335 COMPLETE_WITH(
"CONNECTION");
3336 else if (Matches(
"CREATE",
"SUBSCRIPTION", MatchAny,
"CONNECTION", MatchAny))
3337 COMPLETE_WITH(
"PUBLICATION");
3338 else if (Matches(
"CREATE",
"SUBSCRIPTION", MatchAny,
"CONNECTION",
3339 MatchAny,
"PUBLICATION"))
3343 else if (HeadMatches(
"CREATE",
"SUBSCRIPTION") && TailMatches(
"PUBLICATION", MatchAny))
3344 COMPLETE_WITH(
"WITH (");
3346 else if (HeadMatches(
"CREATE",
"SUBSCRIPTION") && TailMatches(
"WITH",
"("))
3347 COMPLETE_WITH(
"binary",
"connect",
"copy_data",
"create_slot",
3348 "disable_on_error",
"enabled",
"failover",
"origin",
3349 "password_required",
"run_as_owner",
"slot_name",
3350 "streaming",
"synchronous_commit",
"two_phase");
3358 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny) ||
3359 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny))
3360 COMPLETE_WITH(
"BEFORE",
"AFTER",
"INSTEAD OF");
3366 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"BEFORE|AFTER") ||
3367 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"BEFORE|AFTER"))
3368 COMPLETE_WITH(
"INSERT",
"DELETE",
"UPDATE",
"TRUNCATE");
3370 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF") ||
3371 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF"))
3372 COMPLETE_WITH(
"INSERT",
"DELETE",
"UPDATE");
3378 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"BEFORE|AFTER", MatchAny) ||
3379 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"BEFORE|AFTER", MatchAny) ||
3380 TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF", MatchAny) ||
3381 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF", MatchAny))
3382 COMPLETE_WITH(
"ON",
"OR");
3389 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"BEFORE|AFTER", MatchAny,
"ON") ||
3390 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"BEFORE|AFTER", MatchAny,
"ON"))
3391 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
3397 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF", MatchAny,
"ON") ||
3398 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF", MatchAny,
"ON"))
3399 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
3400 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3401 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3402 TailMatches(
"ON", MatchAny))
3405 COMPLETE_WITH(
"NOT DEFERRABLE",
"DEFERRABLE",
"INITIALLY",
3406 "REFERENCING",
"FOR",
"WHEN (",
"EXECUTE FUNCTION");
3408 COMPLETE_WITH(
"NOT DEFERRABLE",
"DEFERRABLE",
"INITIALLY",
3409 "REFERENCING",
"FOR",
"WHEN (",
"EXECUTE PROCEDURE");
3411 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3412 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3413 (TailMatches(
"DEFERRABLE") || TailMatches(
"INITIALLY",
"IMMEDIATE|DEFERRED")))
3416 COMPLETE_WITH(
"REFERENCING",
"FOR",
"WHEN (",
"EXECUTE FUNCTION");
3418 COMPLETE_WITH(
"REFERENCING",
"FOR",
"WHEN (",
"EXECUTE PROCEDURE");
3420 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3421 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3422 TailMatches(
"REFERENCING"))
3423 COMPLETE_WITH(
"OLD TABLE",
"NEW TABLE");
3424 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3425 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3426 TailMatches(
"OLD|NEW",
"TABLE"))
3427 COMPLETE_WITH(
"AS");
3428 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3429 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3430 (TailMatches(
"REFERENCING",
"OLD",
"TABLE",
"AS", MatchAny) ||
3431 TailMatches(
"REFERENCING",
"OLD",
"TABLE", MatchAny)))
3434 COMPLETE_WITH(
"NEW TABLE",
"FOR",
"WHEN (",
"EXECUTE FUNCTION");
3436 COMPLETE_WITH(
"NEW TABLE",
"FOR",
"WHEN (",
"EXECUTE PROCEDURE");
3438 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3439 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3440 (TailMatches(
"REFERENCING",
"NEW",
"TABLE",
"AS", MatchAny) ||
3441 TailMatches(
"REFERENCING",
"NEW",
"TABLE", MatchAny)))
3444 COMPLETE_WITH(
"OLD TABLE",
"FOR",
"WHEN (",
"EXECUTE FUNCTION");
3446 COMPLETE_WITH(
"OLD TABLE",
"FOR",
"WHEN (",
"EXECUTE PROCEDURE");
3448 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3449 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3450 (TailMatches(
"REFERENCING",
"OLD|NEW",
"TABLE",
"AS", MatchAny,
"OLD|NEW",
"TABLE",
"AS", MatchAny) ||
3451 TailMatches(
"REFERENCING",
"OLD|NEW",
"TABLE", MatchAny,
"OLD|NEW",
"TABLE",
"AS", MatchAny) ||
3452 TailMatches(
"REFERENCING",
"OLD|NEW",
"TABLE",
"AS", MatchAny,
"OLD|NEW",
"TABLE", MatchAny) ||
3453 TailMatches(
"REFERENCING",
"OLD|NEW",
"TABLE", MatchAny,
"OLD|NEW",
"TABLE", MatchAny)))
3456 COMPLETE_WITH(
"FOR",
"WHEN (",
"EXECUTE FUNCTION");
3458 COMPLETE_WITH(
"FOR",
"WHEN (",
"EXECUTE PROCEDURE");
3460 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3461 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3463 COMPLETE_WITH(
"EACH",
"ROW",
"STATEMENT");
3464 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3465 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3466 TailMatches(
"FOR",
"EACH"))
3467 COMPLETE_WITH(
"ROW",
"STATEMENT");
3468 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3469 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3470 (TailMatches(
"FOR",
"EACH",
"ROW|STATEMENT") ||
3471 TailMatches(
"FOR",
"ROW|STATEMENT")))
3474 COMPLETE_WITH(
"WHEN (",
"EXECUTE FUNCTION");
3476 COMPLETE_WITH(
"WHEN (",
"EXECUTE PROCEDURE");
3478 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3479 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3480 TailMatches(
"WHEN",
"(*)"))
3483 COMPLETE_WITH(
"EXECUTE FUNCTION");
3485 COMPLETE_WITH(
"EXECUTE PROCEDURE");
3492 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3493 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3494 TailMatches(
"EXECUTE"))
3497 COMPLETE_WITH(
"FUNCTION");
3499 COMPLETE_WITH(
"PROCEDURE");
3501 else if ((HeadMatches(
"CREATE",
"TRIGGER") ||
3502 HeadMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER")) &&
3503 TailMatches(
"EXECUTE",
"FUNCTION|PROCEDURE"))
3504 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
3507 else if (Matches(
"CREATE",
"ROLE|GROUP|USER", MatchAny) &&
3508 !TailMatches(
"USER",
"MAPPING"))
3509 COMPLETE_WITH(
"ADMIN",
"BYPASSRLS",
"CONNECTION LIMIT",
"CREATEDB",
3510 "CREATEROLE",
"ENCRYPTED PASSWORD",
"IN",
"INHERIT",
3511 "LOGIN",
"NOBYPASSRLS",
3512 "NOCREATEDB",
"NOCREATEROLE",
"NOINHERIT",
3513 "NOLOGIN",
"NOREPLICATION",
"NOSUPERUSER",
"PASSWORD",
3514 "REPLICATION",
"ROLE",
"SUPERUSER",
"SYSID",
3515 "VALID UNTIL",
"WITH");
3518 else if (Matches(
"CREATE",
"ROLE|GROUP|USER", MatchAny,
"WITH"))
3520 COMPLETE_WITH(
"ADMIN",
"BYPASSRLS",
"CONNECTION LIMIT",
"CREATEDB",
3521 "CREATEROLE",
"ENCRYPTED PASSWORD",
"IN",
"INHERIT",
3522 "LOGIN",
"NOBYPASSRLS",
3523 "NOCREATEDB",
"NOCREATEROLE",
"NOINHERIT",
3524 "NOLOGIN",
"NOREPLICATION",
"NOSUPERUSER",
"PASSWORD",
3525 "REPLICATION",
"ROLE",
"SUPERUSER",
"SYSID",
3529 else if (Matches(
"CREATE",
"ROLE|USER|GROUP", MatchAny,
"IN"))
3530 COMPLETE_WITH(
"GROUP",
"ROLE");
3533 else if (Matches(
"CREATE",
"TYPE", MatchAny))
3534 COMPLETE_WITH(
"(",
"AS");
3535 else if (Matches(
"CREATE",
"TYPE", MatchAny,
"AS"))
3536 COMPLETE_WITH(
"ENUM",
"RANGE",
"(");
3537 else if (HeadMatches(
"CREATE",
"TYPE", MatchAny,
"AS",
"("))
3539 if (TailMatches(
"(|*,", MatchAny))
3540 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
3541 else if (TailMatches(
"(|*,", MatchAny, MatchAnyExcept(
"*)")))
3542 COMPLETE_WITH(
"COLLATE",
",",
")");
3544 else if (Matches(
"CREATE",
"TYPE", MatchAny,
"AS",
"ENUM|RANGE"))
3546 else if (HeadMatches(
"CREATE",
"TYPE", MatchAny,
"("))
3548 if (TailMatches(
"(|*,"))
3549 COMPLETE_WITH(
"INPUT",
"OUTPUT",
"RECEIVE",
"SEND",
3550 "TYPMOD_IN",
"TYPMOD_OUT",
"ANALYZE",
"SUBSCRIPT",
3551 "INTERNALLENGTH",
"PASSEDBYVALUE",
"ALIGNMENT",
3552 "STORAGE",
"LIKE",
"CATEGORY",
"PREFERRED",
3553 "DEFAULT",
"ELEMENT",
"DELIMITER",
3555 else if (TailMatches(
"(*|*,", MatchAnyExcept(
"*=")))
3557 else if (TailMatches(
"=", MatchAnyExcept(
"*)")))
3558 COMPLETE_WITH(
",",
")");
3560 else if (HeadMatches(
"CREATE",
"TYPE", MatchAny,
"AS",
"RANGE",
"("))
3562 if (TailMatches(
"(|*,"))
3563 COMPLETE_WITH(
"SUBTYPE",
"SUBTYPE_OPCLASS",
"COLLATION",
3564 "CANONICAL",
"SUBTYPE_DIFF",
3565 "MULTIRANGE_TYPE_NAME");
3566 else if (TailMatches(
"(*|*,", MatchAnyExcept(
"*=")))
3568 else if (TailMatches(
"=", MatchAnyExcept(
"*)")))
3569 COMPLETE_WITH(
",",
")");
3574 else if (TailMatches(
"CREATE",
"VIEW", MatchAny) ||
3575 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny))
3576 COMPLETE_WITH(
"AS",
"WITH");
3578 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"AS") ||
3579 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"AS"))
3580 COMPLETE_WITH(
"SELECT");
3582 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH") ||
3583 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH"))
3585 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH",
"(") ||
3586 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH",
"("))
3587 COMPLETE_WITH_LIST(view_optional_parameters);
3588 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH",
"(",
"check_option") ||
3589 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH",
"(",
"check_option"))
3591 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH",
"(",
"check_option",
"=") ||
3592 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH",
"(",
"check_option",
"="))
3593 COMPLETE_WITH(
"local",
"cascaded");
3595 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH",
"(*)") ||
3596 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH",
"(*)"))
3597 COMPLETE_WITH(
"AS");
3599 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH",
"(*)",
"AS") ||
3600 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH",
"(*)",
"AS"))
3601 COMPLETE_WITH(
"SELECT");
3604 else if (Matches(
"CREATE",
"MATERIALIZED"))
3605 COMPLETE_WITH(
"VIEW");
3607 else if (Matches(
"CREATE",
"MATERIALIZED",
"VIEW", MatchAny))
3608 COMPLETE_WITH(
"AS");
3610 else if (Matches(
"CREATE",
"MATERIALIZED",
"VIEW", MatchAny,
"AS"))
3611 COMPLETE_WITH(
"SELECT");
3614 else if (Matches(
"CREATE",
"EVENT"))
3615 COMPLETE_WITH(
"TRIGGER");
3617 else if (Matches(
"CREATE",
"EVENT",
"TRIGGER", MatchAny))
3618 COMPLETE_WITH(
"ON");
3620 else if (Matches(
"CREATE",
"EVENT",
"TRIGGER", MatchAny,
"ON"))
3621 COMPLETE_WITH(
"ddl_command_start",
"ddl_command_end",
"login",
3622 "sql_drop",
"table_rewrite");
3629 else if (Matches(
"CREATE",
"EVENT",
"TRIGGER", MatchAny,
"ON", MatchAny))
3632 COMPLETE_WITH(
"WHEN TAG IN (",
"EXECUTE FUNCTION");
3634 COMPLETE_WITH(
"WHEN TAG IN (",
"EXECUTE PROCEDURE");
3636 else if (HeadMatches(
"CREATE",
"EVENT",
"TRIGGER") &&
3637 TailMatches(
"WHEN|AND", MatchAny,
"IN",
"(*)"))
3640 COMPLETE_WITH(
"EXECUTE FUNCTION");
3642 COMPLETE_WITH(
"EXECUTE PROCEDURE");
3644 else if (HeadMatches(
"CREATE",
"EVENT",
"TRIGGER") &&
3645 TailMatches(
"EXECUTE",
"FUNCTION|PROCEDURE"))
3646 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
3649 else if (Matches(
"DEALLOCATE"))
3650 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_prepared_statements,
3659 else if (Matches(
"DECLARE", MatchAny))
3660 COMPLETE_WITH(
"BINARY",
"ASENSITIVE",
"INSENSITIVE",
"SCROLL",
"NO SCROLL",
3670 else if (HeadMatches(
"DECLARE") && TailMatches(
"BINARY"))
3671 COMPLETE_WITH(
"ASENSITIVE",
"INSENSITIVE",
"SCROLL",
"NO SCROLL",
"CURSOR");
3672 else if (HeadMatches(
"DECLARE") && TailMatches(
"ASENSITIVE|INSENSITIVE"))
3673 COMPLETE_WITH(
"SCROLL",
"NO SCROLL",
"CURSOR");
3674 else if (HeadMatches(
"DECLARE") && TailMatches(
"SCROLL"))
3675 COMPLETE_WITH(
"CURSOR");
3677 else if (HeadMatches(
"DECLARE") && TailMatches(
"NO"))
3678 COMPLETE_WITH(
"SCROLL");
3684 else if (HeadMatches(
"DECLARE") && TailMatches(
"CURSOR"))
3685 COMPLETE_WITH(
"WITH HOLD",
"WITHOUT HOLD",
"FOR");
3687 else if (HeadMatches(
"DECLARE") && TailMatches(
"CURSOR",
"WITH|WITHOUT"))
3688 COMPLETE_WITH(
"HOLD");
3690 else if (HeadMatches(
"DECLARE") && TailMatches(
"CURSOR",
"WITH|WITHOUT",
"HOLD"))
3691 COMPLETE_WITH(
"FOR");
3695 else if (Matches(
"DELETE"))
3696 COMPLETE_WITH(
"FROM");
3698 else if (TailMatches(
"DELETE",
"FROM"))
3699 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
3701 else if (TailMatches(
"DELETE",
"FROM", MatchAny))
3702 COMPLETE_WITH(
"USING",
"WHERE");
3706 else if (Matches(
"DISCARD"))
3707 COMPLETE_WITH(
"ALL",
"PLANS",
"SEQUENCES",
"TEMP");
3710 else if (Matches(
"DO"))
3711 COMPLETE_WITH(
"LANGUAGE");
3715 else if (Matches(
"DROP",
3716 "COLLATION|CONVERSION|DOMAIN|EXTENSION|LANGUAGE|PUBLICATION|SCHEMA|SEQUENCE|SERVER|SUBSCRIPTION|STATISTICS|TABLE|TYPE|VIEW",
3718 Matches(
"DROP",
"ACCESS",
"METHOD", MatchAny) ||
3719 (Matches(
"DROP",
"AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny) &&
3720 ends_with(prev_wd,
')')) ||
3721 Matches(
"DROP",
"EVENT",
"TRIGGER", MatchAny) ||
3722 Matches(
"DROP",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny) ||
3723 Matches(
"DROP",
"FOREIGN",
"TABLE", MatchAny) ||
3724 Matches(
"DROP",
"TEXT",
"SEARCH",
"CONFIGURATION|DICTIONARY|PARSER|TEMPLATE", MatchAny))
3725 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3728 else if (Matches(
"DROP",
"AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny))
3730 else if (Matches(
"DROP",
"AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny,
"("))
3731 COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
3732 else if (Matches(
"DROP",
"FOREIGN"))
3733 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
3734 else if (Matches(
"DROP",
"DATABASE", MatchAny))
3735 COMPLETE_WITH(
"WITH (");
3736 else if (HeadMatches(
"DROP",
"DATABASE") && (ends_with(prev_wd,
'(')))
3737 COMPLETE_WITH(
"FORCE");
3740 else if (Matches(
"DROP",
"INDEX"))
3741 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
3743 else if (Matches(
"DROP",
"INDEX",
"CONCURRENTLY"))
3744 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
3745 else if (Matches(
"DROP",
"INDEX", MatchAny))
3746 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3747 else if (Matches(
"DROP",
"INDEX",
"CONCURRENTLY", MatchAny))
3748 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3751 else if (Matches(
"DROP",
"MATERIALIZED"))
3752 COMPLETE_WITH(
"VIEW");
3753 else if (Matches(
"DROP",
"MATERIALIZED",
"VIEW"))
3754 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
3755 else if (Matches(
"DROP",
"MATERIALIZED",
"VIEW", MatchAny))
3756 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3759 else if (Matches(
"DROP",
"OWNED"))
3760 COMPLETE_WITH(
"BY");
3761 else if (Matches(
"DROP",
"OWNED",
"BY"))
3762 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
3763 else if (Matches(
"DROP",
"OWNED",
"BY", MatchAny))
3764 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3767 else if (Matches(
"DROP",
"TEXT",
"SEARCH"))
3768 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
3771 else if (Matches(
"DROP",
"TRIGGER", MatchAny))
3772 COMPLETE_WITH(
"ON");
3773 else if (Matches(
"DROP",
"TRIGGER", MatchAny,
"ON"))
3775 set_completion_reference(prev2_wd);
3776 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
3778 else if (Matches(
"DROP",
"TRIGGER", MatchAny,
"ON", MatchAny))
3779 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3782 else if (Matches(
"DROP",
"ACCESS"))
3783 COMPLETE_WITH(
"METHOD");
3784 else if (Matches(
"DROP",
"ACCESS",
"METHOD"))
3785 COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
3788 else if (Matches(
"DROP",
"EVENT"))
3789 COMPLETE_WITH(
"TRIGGER");
3790 else if (Matches(
"DROP",
"EVENT",
"TRIGGER"))
3791 COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
3794 else if (Matches(
"DROP",
"POLICY"))
3795 COMPLETE_WITH_QUERY(Query_for_list_of_policies);
3797 else if (Matches(
"DROP",
"POLICY", MatchAny))
3798 COMPLETE_WITH(
"ON");
3800 else if (Matches(
"DROP",
"POLICY", MatchAny,
"ON"))
3802 set_completion_reference(prev2_wd);
3803 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
3805 else if (Matches(
"DROP",
"POLICY", MatchAny,
"ON", MatchAny))
3806 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3809 else if (Matches(
"DROP",
"RULE", MatchAny))
3810 COMPLETE_WITH(
"ON");
3811 else if (Matches(
"DROP",
"RULE", MatchAny,
"ON"))
3813 set_completion_reference(prev2_wd);
3814 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
3816 else if (Matches(
"DROP",
"RULE", MatchAny,
"ON", MatchAny))
3817 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3820 else if (Matches(
"DROP",
"TRANSFORM"))
3821 COMPLETE_WITH(
"FOR");
3822 else if (Matches(
"DROP",
"TRANSFORM",
"FOR"))
3823 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
3824 else if (Matches(
"DROP",
"TRANSFORM",
"FOR", MatchAny))
3825 COMPLETE_WITH(
"LANGUAGE");
3826 else if (Matches(
"DROP",
"TRANSFORM",
"FOR", MatchAny,
"LANGUAGE"))
3828 set_completion_reference(prev2_wd);
3829 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
3831 else if (Matches(
"DROP",
"TRANSFORM",
"FOR", MatchAny,
"LANGUAGE", MatchAny))
3832 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3835 else if (Matches(
"EXECUTE"))
3836 COMPLETE_WITH_QUERY(Query_for_list_of_prepared_statements);
3842 else if (Matches(
"EXPLAIN"))
3843 COMPLETE_WITH(
"SELECT",
"INSERT INTO",
"DELETE FROM",
"UPDATE",
"DECLARE",
3844 "MERGE INTO",
"EXECUTE",
"ANALYZE",
"VERBOSE");
3845 else if (HeadMatches(
"EXPLAIN",
"(*") &&
3846 !HeadMatches(
"EXPLAIN",
"(*)"))
3853 if (ends_with(prev_wd,
'(') || ends_with(prev_wd,
','))
3854 COMPLETE_WITH(
"ANALYZE",
"VERBOSE",
"COSTS",
"SETTINGS",
"GENERIC_PLAN",
3855 "BUFFERS",
"WAL",
"TIMING",
"SUMMARY",
"FORMAT");
3856 else if (TailMatches(
"ANALYZE|VERBOSE|COSTS|SETTINGS|GENERIC_PLAN|BUFFERS|WAL|TIMING|SUMMARY"))
3857 COMPLETE_WITH(
"ON",
"OFF");
3858 else if (TailMatches(
"FORMAT"))
3859 COMPLETE_WITH(
"TEXT",
"XML",
"JSON",
"YAML");
3861 else if (Matches(
"EXPLAIN",
"ANALYZE"))
3862 COMPLETE_WITH(
"SELECT",
"INSERT INTO",
"DELETE FROM",
"UPDATE",
"DECLARE",
3863 "MERGE INTO",
"EXECUTE",
"VERBOSE");
3864 else if (Matches(
"EXPLAIN",
"(*)") ||
3865 Matches(
"EXPLAIN",
"VERBOSE") ||
3866 Matches(
"EXPLAIN",
"ANALYZE",
"VERBOSE"))
3867 COMPLETE_WITH(
"SELECT",
"INSERT INTO",
"DELETE FROM",
"UPDATE",
"DECLARE",
3868 "MERGE INTO",
"EXECUTE");
3876 else if (Matches(
"FETCH|MOVE"))
3877 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
3894 else if (Matches(
"FETCH|MOVE",
"BACKWARD|FORWARD"))
3895 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
3905 else if (Matches(
"FETCH|MOVE",
"ABSOLUTE|BACKWARD|FORWARD|RELATIVE",
3906 MatchAnyExcept(
"FROM|IN")) ||
3907 Matches(
"FETCH|MOVE",
"ALL|NEXT|PRIOR|FIRST|LAST"))
3908 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
3912 else if (HeadMatches(
"FETCH|MOVE") &&
3913 TailMatches(
"FROM|IN"))
3914 COMPLETE_WITH_QUERY(Query_for_list_of_cursors);
3918 else if (TailMatches(
"FOREIGN",
"DATA",
"WRAPPER") &&
3919 !TailMatches(
"CREATE", MatchAny, MatchAny, MatchAny))
3920 COMPLETE_WITH_QUERY(Query_for_list_of_fdws);
3922 else if (TailMatches(
"FOREIGN",
"DATA",
"WRAPPER", MatchAny) &&
3923 HeadMatches(
"CREATE",
"SERVER"))
3924 COMPLETE_WITH(
"OPTIONS");
3927 else if (TailMatches(
"FOREIGN",
"TABLE") &&
3928 !TailMatches(
"CREATE", MatchAny, MatchAny))
3929 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
3932 else if (TailMatches(
"FOREIGN",
"SERVER"))
3933 COMPLETE_WITH_QUERY(Query_for_list_of_servers);
3940 else if (TailMatches(
"GRANT|REVOKE") ||
3941 TailMatches(
"REVOKE",
"ADMIN|GRANT|INHERIT|SET",
"OPTION",
"FOR"))
3947 if (HeadMatches(
"ALTER",
"DEFAULT",
"PRIVILEGES"))
3948 COMPLETE_WITH(
"SELECT",
"INSERT",
"UPDATE",
3949 "DELETE",
"TRUNCATE",
"REFERENCES",
"TRIGGER",
3950 "CREATE",
"EXECUTE",
"USAGE",
"MAINTAIN",
"ALL");
3951 else if (TailMatches(
"GRANT"))
3952 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
3953 Privilege_options_of_grant_and_revoke);
3954 else if (TailMatches(
"REVOKE"))
3955 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
3956 Privilege_options_of_grant_and_revoke,
3959 "INHERIT OPTION FOR",
3961 else if (TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR"))
3962 COMPLETE_WITH(Privilege_options_of_grant_and_revoke);
3963 else if (TailMatches(
"REVOKE",
"ADMIN|INHERIT|SET",
"OPTION",
"FOR"))
3964 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
3967 else if (TailMatches(
"GRANT|REVOKE",
"ALTER") ||
3968 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR",
"ALTER"))
3969 COMPLETE_WITH(
"SYSTEM");
3971 else if (TailMatches(
"REVOKE",
"SET"))
3972 COMPLETE_WITH(
"ON PARAMETER",
"OPTION FOR");
3973 else if (TailMatches(
"GRANT",
"SET") ||
3974 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR",
"SET") ||
3975 TailMatches(
"GRANT|REVOKE",
"ALTER",
"SYSTEM") ||
3976 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR",
"ALTER",
"SYSTEM"))
3977 COMPLETE_WITH(
"ON PARAMETER");
3979 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"PARAMETER") ||
3980 TailMatches(
"GRANT|REVOKE", MatchAny, MatchAny,
"ON",
"PARAMETER") ||
3981 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"PARAMETER") ||
3982 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny, MatchAny,
"ON",
"PARAMETER"))
3983 COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_alter_system_set_vars);
3985 else if (TailMatches(
"GRANT", MatchAny,
"ON",
"PARAMETER", MatchAny) ||
3986 TailMatches(
"GRANT", MatchAny, MatchAny,
"ON",
"PARAMETER", MatchAny))
3987 COMPLETE_WITH(
"TO");
3989 else if (TailMatches(
"REVOKE", MatchAny,
"ON",
"PARAMETER", MatchAny) ||
3990 TailMatches(
"REVOKE", MatchAny, MatchAny,
"ON",
"PARAMETER", MatchAny) ||
3991 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"PARAMETER", MatchAny) ||
3992 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny, MatchAny,
"ON",
"PARAMETER", MatchAny))
3993 COMPLETE_WITH(
"FROM");
3999 else if (TailMatches(
"GRANT|REVOKE", MatchAny) ||
4000 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny))
4002 if (TailMatches(
"SELECT|INSERT|UPDATE|DELETE|TRUNCATE|REFERENCES|TRIGGER|CREATE|CONNECT|TEMPORARY|TEMP|EXECUTE|USAGE|MAINTAIN|ALL"))
4003 COMPLETE_WITH(
"ON");
4004 else if (TailMatches(
"GRANT", MatchAny))
4005 COMPLETE_WITH(
"TO");
4007 COMPLETE_WITH(
"FROM");
4017 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON") ||
4018 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON"))
4024 if (HeadMatches(
"ALTER",
"DEFAULT",
"PRIVILEGES"))
4025 COMPLETE_WITH(
"TABLES",
"SEQUENCES",
"FUNCTIONS",
"PROCEDURES",
"ROUTINES",
"TYPES",
"SCHEMAS");
4027 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_grantables,
4028 "ALL FUNCTIONS IN SCHEMA",
4029 "ALL PROCEDURES IN SCHEMA",
4030 "ALL ROUTINES IN SCHEMA",
4031 "ALL SEQUENCES IN SCHEMA",
4032 "ALL TABLES IN SCHEMA",
4035 "FOREIGN DATA WRAPPER",
4049 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"ALL") ||
4050 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"ALL"))
4051 COMPLETE_WITH(
"FUNCTIONS IN SCHEMA",
4052 "PROCEDURES IN SCHEMA",
4053 "ROUTINES IN SCHEMA",
4054 "SEQUENCES IN SCHEMA",
4055 "TABLES IN SCHEMA");
4056 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"FOREIGN") ||
4057 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"FOREIGN"))
4058 COMPLETE_WITH(
"DATA WRAPPER",
"SERVER");
4066 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON", MatchAny) ||
4067 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON", MatchAny))
4069 if (TailMatches(
"DATABASE"))
4070 COMPLETE_WITH_QUERY(Query_for_list_of_databases);
4071 else if (TailMatches(
"DOMAIN"))
4072 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
4073 else if (TailMatches(
"FUNCTION"))
4074 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
4075 else if (TailMatches(
"LANGUAGE"))
4076 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
4077 else if (TailMatches(
"PROCEDURE"))
4078 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures);
4079 else if (TailMatches(
"ROUTINE"))
4080 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
4081 else if (TailMatches(
"SCHEMA"))
4082 COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
4083 else if (TailMatches(
"SEQUENCE"))
4084 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences);
4085 else if (TailMatches(
"TABLE"))
4086 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables);
4087 else if (TailMatches(
"TABLESPACE"))
4088 COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
4089 else if (TailMatches(
"TYPE"))
4090 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
4091 else if (TailMatches(
"GRANT", MatchAny, MatchAny, MatchAny))
4092 COMPLETE_WITH(
"TO");
4094 COMPLETE_WITH(
"FROM");
4101 else if ((HeadMatches(
"GRANT") && TailMatches(
"TO")) ||
4102 (HeadMatches(
"REVOKE") && TailMatches(
"FROM")))
4103 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4104 Keywords_for_list_of_grant_roles);
4109 else if (HeadMatches(
"GRANT") && TailMatches(
"TO", MatchAny))
4110 COMPLETE_WITH(
"WITH ADMIN",
4113 "WITH GRANT OPTION",
4115 else if (HeadMatches(
"GRANT") && TailMatches(
"TO", MatchAny,
"WITH"))
4116 COMPLETE_WITH(
"ADMIN",
4120 else if (HeadMatches(
"GRANT") &&
4121 (TailMatches(
"TO", MatchAny,
"WITH",
"ADMIN|INHERIT|SET")))
4122 COMPLETE_WITH(
"OPTION",
"TRUE",
"FALSE");
4123 else if (HeadMatches(
"GRANT") && TailMatches(
"TO", MatchAny,
"WITH", MatchAny,
"OPTION"))
4124 COMPLETE_WITH(
"GRANTED BY");
4125 else if (HeadMatches(
"GRANT") && TailMatches(
"TO", MatchAny,
"WITH", MatchAny,
"OPTION",
"GRANTED",
"BY"))
4126 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4127 Keywords_for_list_of_grant_roles);
4129 else if (HeadMatches(
"ALTER",
"DEFAULT",
"PRIVILEGES") && TailMatches(
"TO|FROM"))
4130 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4131 Keywords_for_list_of_grant_roles);
4133 else if (HeadMatches(
"GRANT") && TailMatches(
"ON", MatchAny, MatchAny))
4134 COMPLETE_WITH(
"TO");
4135 else if (HeadMatches(
"REVOKE") && TailMatches(
"ON", MatchAny, MatchAny))
4136 COMPLETE_WITH(
"FROM");
4139 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"ALL", MatchAny,
"IN",
"SCHEMA", MatchAny) ||
4140 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"ALL", MatchAny,
"IN",
"SCHEMA", MatchAny))
4142 if (TailMatches(
"GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
4143 COMPLETE_WITH(
"TO");
4145 COMPLETE_WITH(
"FROM");
4149 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny) ||
4150 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny))
4152 if (TailMatches(
"GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
4153 COMPLETE_WITH(
"TO");
4155 COMPLETE_WITH(
"FROM");
4159 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"FOREIGN",
"SERVER", MatchAny) ||
4160 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"FOREIGN",
"SERVER", MatchAny))
4162 if (TailMatches(
"GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
4163 COMPLETE_WITH(
"TO");
4165 COMPLETE_WITH(
"FROM");
4169 else if (TailMatches(
"FROM", MatchAny,
"GROUP"))
4170 COMPLETE_WITH(
"BY");
4173 else if (Matches(
"IMPORT"))
4174 COMPLETE_WITH(
"FOREIGN SCHEMA");
4175 else if (Matches(
"IMPORT",
"FOREIGN"))
4176 COMPLETE_WITH(
"SCHEMA");
4177 else if (Matches(
"IMPORT",
"FOREIGN",
"SCHEMA", MatchAny))
4178 COMPLETE_WITH(
"EXCEPT (",
"FROM SERVER",
"LIMIT TO (");
4179 else if (TailMatches(
"LIMIT",
"TO",
"(*)") ||
4180 TailMatches(
"EXCEPT",
"(*)"))
4181 COMPLETE_WITH(
"FROM SERVER");
4182 else if (TailMatches(
"FROM",
"SERVER", MatchAny))
4183 COMPLETE_WITH(
"INTO");
4184 else if (TailMatches(
"FROM",
"SERVER", MatchAny,
"INTO"))
4185 COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
4186 else if (TailMatches(
"FROM",
"SERVER", MatchAny,
"INTO", MatchAny))
4187 COMPLETE_WITH(
"OPTIONS (");
4191 else if (TailMatches(
"NOT",
"MATCHED",
"THEN",
"INSERT"))
4192 COMPLETE_WITH(
"VALUES",
"(");
4194 else if (TailMatches(
"INSERT"))
4195 COMPLETE_WITH(
"INTO");
4197 else if (TailMatches(
"INSERT",
"INTO"))
4198 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
4200 else if (TailMatches(
"INSERT",
"INTO", MatchAny,
"("))
4201 COMPLETE_WITH_ATTR(prev2_wd);
4207 else if (TailMatches(
"INSERT",
"INTO", MatchAny))
4208 COMPLETE_WITH(
"(",
"DEFAULT VALUES",
"SELECT",
"TABLE",
"VALUES",
"OVERRIDING");
4214 else if (TailMatches(
"INSERT",
"INTO", MatchAny, MatchAny) &&
4215 ends_with(prev_wd,
')'))
4216 COMPLETE_WITH(
"SELECT",
"TABLE",
"VALUES",
"OVERRIDING");
4219 else if (TailMatches(
"OVERRIDING"))
4220 COMPLETE_WITH(
"SYSTEM VALUE",
"USER VALUE");
4223 else if (TailMatches(
"OVERRIDING", MatchAny,
"VALUE"))
4224 COMPLETE_WITH(
"SELECT",
"TABLE",
"VALUES");
4227 else if (TailMatches(
"VALUES") && !TailMatches(
"DEFAULT",
"VALUES"))
4232 else if (Matches(
"LOCK"))
4233 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
4235 else if (Matches(
"LOCK",
"TABLE"))
4236 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
4238 else if (Matches(
"LOCK",
"TABLE",
"ONLY") || Matches(
"LOCK",
"ONLY"))
4239 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
4243 else if (Matches(
"LOCK", MatchAnyExcept(
"TABLE|ONLY")) ||
4244 Matches(
"LOCK",
"TABLE", MatchAnyExcept(
"ONLY")) ||
4245 Matches(
"LOCK",
"ONLY", MatchAny) ||
4246 Matches(
"LOCK",
"TABLE",
"ONLY", MatchAny))
4247 COMPLETE_WITH(
"IN",
"NOWAIT");
4250 else if (HeadMatches(
"LOCK") && TailMatches(
"IN"))
4251 COMPLETE_WITH(
"ACCESS SHARE MODE",
4252 "ROW SHARE MODE",
"ROW EXCLUSIVE MODE",
4253 "SHARE UPDATE EXCLUSIVE MODE",
"SHARE MODE",
4254 "SHARE ROW EXCLUSIVE MODE",
4255 "EXCLUSIVE MODE",
"ACCESS EXCLUSIVE MODE");
4261 else if (HeadMatches(
"LOCK") && TailMatches(
"IN",
"ACCESS|ROW"))
4262 COMPLETE_WITH(
"EXCLUSIVE MODE",
"SHARE MODE");
4265 else if (HeadMatches(
"LOCK") && TailMatches(
"IN",
"SHARE"))
4266 COMPLETE_WITH(
"MODE",
"ROW EXCLUSIVE MODE",
4267 "UPDATE EXCLUSIVE MODE");
4270 else if (HeadMatches(
"LOCK") && TailMatches(
"MODE"))
4271 COMPLETE_WITH(
"NOWAIT");
4274 else if (TailMatches(
"MERGE"))
4275 COMPLETE_WITH(
"INTO");
4276 else if (TailMatches(
"MERGE",
"INTO"))
4277 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_mergetargets);
4280 else if (TailMatches(
"MERGE",
"INTO", MatchAny))
4281 COMPLETE_WITH(
"USING",
"AS");
4282 else if (TailMatches(
"MERGE",
"INTO", MatchAny,
"AS", MatchAny) ||
4283 TailMatches(
"MERGE",
"INTO", MatchAny, MatchAnyExcept(
"USING|AS")))
4284 COMPLETE_WITH(
"USING");
4290 else if (TailMatches(
"MERGE",
"INTO", MatchAny,
"USING") ||
4291 TailMatches(
"MERGE",
"INTO", MatchAny,
"AS", MatchAny,
"USING") ||
4292 TailMatches(
"MERGE",
"INTO", MatchAny, MatchAny,
"USING"))
4293 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
4299 else if (TailMatches(
"MERGE",
"INTO", MatchAny,
"USING", MatchAny) ||
4300 TailMatches(
"MERGE",
"INTO", MatchAny,
"AS", MatchAny,
"USING", MatchAny) ||
4301 TailMatches(
"MERGE",
"INTO", MatchAny, MatchAny,
"USING", MatchAny))
4302 COMPLETE_WITH(
"AS",
"ON");
4303 else if (TailMatches(
"MERGE",
"INTO", MatchAny,
"USING", MatchAny,
"AS", MatchAny) ||
4304 TailMatches(
"MERGE",
"INTO", MatchAny,
"AS", MatchAny,
"USING", MatchAny,
"AS", MatchAny) ||
4305 TailMatches(
"MERGE",
"INTO", MatchAny, MatchAny,
"USING", MatchAny,
"AS", MatchAny) ||
4306 TailMatches(
"MERGE",
"INTO", MatchAny,
"USING", MatchAny, MatchAnyExcept(
"ON|AS")) ||
4307 TailMatches(
"MERGE",
"INTO", MatchAny,
"AS", MatchAny,
"USING", MatchAny, MatchAnyExcept(
"ON|AS")) ||
4308 TailMatches(
"MERGE",
"INTO", MatchAny, MatchAny,
"USING", MatchAny, MatchAnyExcept(
"ON|AS")))
4309 COMPLETE_WITH(
"ON");
4312 else if (TailMatches(
"INTO", MatchAny,
"USING", MatchAny,
"ON"))
4313 COMPLETE_WITH_ATTR(prev4_wd);
4314 else if (TailMatches(
"INTO", MatchAny,
"AS", MatchAny,
"USING", MatchAny,
"AS", MatchAny,
"ON"))
4315 COMPLETE_WITH_ATTR(prev8_wd);
4316 else if (TailMatches(
"INTO", MatchAny, MatchAny,
"USING", MatchAny, MatchAny,
"ON"))
4317 COMPLETE_WITH_ATTR(prev6_wd);
4324 else if (TailMatches(
"USING", MatchAny,
"ON", MatchAny) ||
4325 TailMatches(
"USING", MatchAny,
"AS", MatchAny,
"ON", MatchAny) ||
4326 TailMatches(
"USING", MatchAny, MatchAny,
"ON", MatchAny) ||
4327 TailMatches(
"USING", MatchAny,
"ON", MatchAny, MatchAnyExcept(
"WHEN"), MatchAnyExcept(
"WHEN")) ||
4328 TailMatches(
"USING", MatchAny,
"AS", MatchAny,
"ON", MatchAny, MatchAnyExcept(
"WHEN"), MatchAnyExcept(
"WHEN")) ||
4329 TailMatches(
"USING", MatchAny, MatchAny,
"ON", MatchAny, MatchAnyExcept(
"WHEN"), MatchAnyExcept(
"WHEN")))
4330 COMPLETE_WITH(
"WHEN MATCHED",
"WHEN NOT MATCHED");
4331 else if (TailMatches(
"USING", MatchAny,
"ON", MatchAny,
"WHEN") ||
4332 TailMatches(
"USING", MatchAny,
"AS", MatchAny,
"ON", MatchAny,
"WHEN") ||
4333 TailMatches(
"USING", MatchAny, MatchAny,
"ON", MatchAny,
"WHEN") ||
4334 TailMatches(
"USING", MatchAny,
"ON", MatchAny, MatchAny, MatchAny,
"WHEN") ||
4335 TailMatches(
"USING", MatchAny,
"AS", MatchAny,
"ON", MatchAny, MatchAny, MatchAny,
"WHEN") ||
4336 TailMatches(
"USING", MatchAny, MatchAny,
"ON", MatchAny, MatchAny, MatchAny,
"WHEN"))
4337 COMPLETE_WITH(
"MATCHED",
"NOT MATCHED");
4340 else if (TailMatches(
"WHEN",
"MATCHED") ||
4341 TailMatches(
"WHEN",
"NOT",
"MATCHED"))
4342 COMPLETE_WITH(
"THEN",
"AND");
4345 else if (TailMatches(
"WHEN",
"MATCHED",
"THEN"))
4346 COMPLETE_WITH(
"UPDATE SET",
"DELETE",
"DO NOTHING");
4349 else if (TailMatches(
"WHEN",
"NOT",
"MATCHED",
"THEN"))
4350 COMPLETE_WITH(
"INSERT",
"DO NOTHING");
4353 else if (TailMatches(
"NOTIFY"))
4354 COMPLETE_WITH_QUERY(Query_for_list_of_channels);
4357 else if (TailMatches(
"OPTIONS"))
4361 else if (TailMatches(
"OWNER",
"TO"))
4362 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4363 Keywords_for_list_of_owner_roles);
4366 else if (TailMatches(
"FROM", MatchAny,
"ORDER"))
4367 COMPLETE_WITH(
"BY");
4368 else if (TailMatches(
"FROM", MatchAny,
"ORDER",
"BY"))
4369 COMPLETE_WITH_ATTR(prev3_wd);
4372 else if (Matches(
"PREPARE", MatchAny,
"AS"))
4373 COMPLETE_WITH(
"SELECT",
"UPDATE",
"INSERT INTO",
"DELETE FROM");
4381 else if (Matches(
"REASSIGN"))
4382 COMPLETE_WITH(
"OWNED BY");
4383 else if (Matches(
"REASSIGN",
"OWNED"))
4384 COMPLETE_WITH(
"BY");
4385 else if (Matches(
"REASSIGN",
"OWNED",
"BY"))
4386 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
4387 else if (Matches(
"REASSIGN",
"OWNED",
"BY", MatchAny))
4388 COMPLETE_WITH(
"TO");
4389 else if (Matches(
"REASSIGN",
"OWNED",
"BY", MatchAny,
"TO"))
4390 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
4393 else if (Matches(
"REFRESH"))
4394 COMPLETE_WITH(
"MATERIALIZED VIEW");
4395 else if (Matches(
"REFRESH",
"MATERIALIZED"))
4396 COMPLETE_WITH(
"VIEW");
4397 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW"))
4398 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_matviews,
4400 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW",
"CONCURRENTLY"))
4401 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
4402 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW", MatchAny))
4403 COMPLETE_WITH(
"WITH");
4404 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW",
"CONCURRENTLY", MatchAny))
4405 COMPLETE_WITH(
"WITH");
4406 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW", MatchAny,
"WITH"))
4407 COMPLETE_WITH(
"NO DATA",
"DATA");
4408 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW",
"CONCURRENTLY", MatchAny,
"WITH"))
4409 COMPLETE_WITH(
"NO DATA",
"DATA");
4410 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW", MatchAny,
"WITH",
"NO"))
4411 COMPLETE_WITH(
"DATA");
4412 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW",
"CONCURRENTLY", MatchAny,
"WITH",
"NO"))
4413 COMPLETE_WITH(
"DATA");
4416 else if (Matches(
"REINDEX") ||
4417 Matches(
"REINDEX",
"(*)"))
4418 COMPLETE_WITH(
"TABLE",
"INDEX",
"SYSTEM",
"SCHEMA",
"DATABASE");
4419 else if (Matches(
"REINDEX",
"TABLE") ||
4420 Matches(
"REINDEX",
"(*)",
"TABLE"))
4421 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexables,
4423 else if (Matches(
"REINDEX",
"INDEX") ||
4424 Matches(
"REINDEX",
"(*)",
"INDEX"))
4425 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
4427 else if (Matches(
"REINDEX",
"SCHEMA") ||
4428 Matches(
"REINDEX",
"(*)",
"SCHEMA"))
4429 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas,
4431 else if (Matches(
"REINDEX",
"SYSTEM|DATABASE") ||
4432 Matches(
"REINDEX",
"(*)",
"SYSTEM|DATABASE"))
4433 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_databases,
4435 else if (Matches(
"REINDEX",
"TABLE",
"CONCURRENTLY") ||
4436 Matches(
"REINDEX",
"(*)",
"TABLE",
"CONCURRENTLY"))
4437 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables);
4438 else if (Matches(
"REINDEX",
"INDEX",
"CONCURRENTLY") ||
4439 Matches(
"REINDEX",
"(*)",
"INDEX",
"CONCURRENTLY"))
4440 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
4441 else if (Matches(
"REINDEX",
"SCHEMA",
"CONCURRENTLY") ||
4442 Matches(
"REINDEX",
"(*)",
"SCHEMA",
"CONCURRENTLY"))
4443 COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
4444 else if (Matches(
"REINDEX",
"SYSTEM|DATABASE",
"CONCURRENTLY") ||
4445 Matches(
"REINDEX",
"(*)",
"SYSTEM|DATABASE",
"CONCURRENTLY"))
4446 COMPLETE_WITH_QUERY(Query_for_list_of_databases);
4447 else if (HeadMatches(
"REINDEX",
"(*") &&
4448 !HeadMatches(
"REINDEX",
"(*)"))
4455 if (ends_with(prev_wd,
'(') || ends_with(prev_wd,
','))
4456 COMPLETE_WITH(
"CONCURRENTLY",
"TABLESPACE",
"VERBOSE");
4457 else if (TailMatches(
"TABLESPACE"))
4458 COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
4462 else if (Matches(
"SECURITY"))
4463 COMPLETE_WITH(
"LABEL");
4464 else if (Matches(
"SECURITY",
"LABEL"))
4465 COMPLETE_WITH(
"ON",
"FOR");
4466 else if (Matches(
"SECURITY",
"LABEL",
"FOR", MatchAny))
4467 COMPLETE_WITH(
"ON");
4468 else if (Matches(
"SECURITY",
"LABEL",
"ON") ||
4469 Matches(
"SECURITY",
"LABEL",
"FOR", MatchAny,
"ON"))
4470 COMPLETE_WITH(
"TABLE",
"COLUMN",
"AGGREGATE",
"DATABASE",
"DOMAIN",
4471 "EVENT TRIGGER",
"FOREIGN TABLE",
"FUNCTION",
4472 "LARGE OBJECT",
"MATERIALIZED VIEW",
"LANGUAGE",
4473 "PUBLICATION",
"PROCEDURE",
"ROLE",
"ROUTINE",
"SCHEMA",
4474 "SEQUENCE",
"SUBSCRIPTION",
"TABLESPACE",
"TYPE",
"VIEW");
4475 else if (Matches(
"SECURITY",
"LABEL",
"ON", MatchAny, MatchAny))
4476 COMPLETE_WITH(
"IS");
4483 else if (TailMatches(
"SET|RESET") && !TailMatches(
"UPDATE", MatchAny,
"SET"))
4484 COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars,
4491 else if (Matches(
"SHOW"))
4492 COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_show_vars,
4493 "SESSION AUTHORIZATION",
4495 else if (Matches(
"SHOW",
"SESSION"))
4496 COMPLETE_WITH(
"AUTHORIZATION");
4498 else if (Matches(
"SET",
"TRANSACTION"))
4499 COMPLETE_WITH(
"SNAPSHOT",
"ISOLATION LEVEL",
"READ",
"DEFERRABLE",
"NOT DEFERRABLE");
4500 else if (Matches(
"BEGIN|START",
"TRANSACTION") ||
4501 Matches(
"BEGIN",
"WORK") ||
4503 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION"))
4504 COMPLETE_WITH(
"ISOLATION LEVEL",
"READ",
"DEFERRABLE",
"NOT DEFERRABLE");
4505 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"NOT") ||
4506 Matches(
"BEGIN",
"NOT") ||
4507 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"NOT"))
4508 COMPLETE_WITH(
"DEFERRABLE");
4509 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"ISOLATION") ||
4510 Matches(
"BEGIN",
"ISOLATION") ||
4511 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"ISOLATION"))
4512 COMPLETE_WITH(
"LEVEL");
4513 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"ISOLATION",
"LEVEL") ||
4514 Matches(
"BEGIN",
"ISOLATION",
"LEVEL") ||
4515 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"ISOLATION",
"LEVEL"))
4516 COMPLETE_WITH(
"READ",
"REPEATABLE READ",
"SERIALIZABLE");
4517 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"ISOLATION",
"LEVEL",
"READ") ||
4518 Matches(
"BEGIN",
"ISOLATION",
"LEVEL",
"READ") ||
4519 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"ISOLATION",
"LEVEL",
"READ"))
4520 COMPLETE_WITH(
"UNCOMMITTED",
"COMMITTED");
4521 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"ISOLATION",
"LEVEL",
"REPEATABLE") ||
4522 Matches(
"BEGIN",
"ISOLATION",
"LEVEL",
"REPEATABLE") ||
4523 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"ISOLATION",
"LEVEL",
"REPEATABLE"))
4524 COMPLETE_WITH(
"READ");
4525 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"READ") ||
4526 Matches(
"BEGIN",
"READ") ||
4527 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"READ"))
4528 COMPLETE_WITH(
"ONLY",
"WRITE");
4530 else if (Matches(
"SET",
"CONSTRAINTS"))
4531 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_constraints_with_schema,
4534 else if (Matches(
"SET",
"CONSTRAINTS", MatchAny))
4535 COMPLETE_WITH(
"DEFERRED",
"IMMEDIATE");
4537 else if (Matches(
"SET",
"ROLE"))
4538 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
4540 else if (Matches(
"SET",
"SESSION"))
4541 COMPLETE_WITH(
"AUTHORIZATION",
"CHARACTERISTICS AS TRANSACTION");
4543 else if (Matches(
"SET",
"SESSION",
"AUTHORIZATION"))
4544 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4547 else if (Matches(
"RESET",
"SESSION"))
4548 COMPLETE_WITH(
"AUTHORIZATION");
4550 else if (Matches(
"SET", MatchAny))
4551 COMPLETE_WITH(
"TO");
4557 else if (HeadMatches(
"ALTER",
"DATABASE|FUNCTION|PROCEDURE|ROLE|ROUTINE|USER") &&
4558 TailMatches(
"SET", MatchAny) &&
4559 !TailMatches(
"SCHEMA"))
4560 COMPLETE_WITH(
"FROM CURRENT",
"TO");
4566 else if (TailMatches(
"SET", MatchAny,
"TO|=") &&
4567 !TailMatches(
"UPDATE", MatchAny,
"SET", MatchAny,
"TO|="))
4570 if (TailMatches(
"DateStyle",
"TO|="))
4571 COMPLETE_WITH(
"ISO",
"SQL",
"Postgres",
"German",
4572 "YMD",
"DMY",
"MDY",
4573 "US",
"European",
"NonEuropean",
4575 else if (TailMatches(
"search_path",
"TO|="))
4578 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
4579 " AND nspname NOT LIKE E'pg\\\\_toast%%'"
4580 " AND nspname NOT LIKE E'pg\\\\_temp%%'",
4583 else if (TailMatches(
"TimeZone",
"TO|="))
4584 COMPLETE_WITH_TIMEZONE_NAME();
4588 char *guctype = get_guctype(prev2_wd);
4597 if (strcmp(guctype,
"enum") == 0)
4599 set_completion_reference_verbatim(prev2_wd);
4600 COMPLETE_WITH_QUERY_PLUS(Query_for_values_of_enum_GUC,
4603 else if (strcmp(guctype,
"bool") == 0)
4604 COMPLETE_WITH(
"on",
"off",
"true",
"false",
"yes",
"no",
4605 "1",
"0",
"DEFAULT");
4607 COMPLETE_WITH(
"DEFAULT");
4615 else if (Matches(
"START"))
4616 COMPLETE_WITH(
"TRANSACTION");
4619 else if (Matches(
"TABLE"))
4620 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
4623 else if (TailMatches(
"TABLESAMPLE"))
4624 COMPLETE_WITH_QUERY(Query_for_list_of_tablesample_methods);
4625 else if (TailMatches(
"TABLESAMPLE", MatchAny))
4629 else if (Matches(
"TRUNCATE"))
4630 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_truncatables,
4632 else if (Matches(
"TRUNCATE",
"TABLE"))
4633 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_truncatables,
4635 else if (HeadMatches(
"TRUNCATE") && TailMatches(
"ONLY"))
4636 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_truncatables);
4637 else if (Matches(
"TRUNCATE", MatchAny) ||
4638 Matches(
"TRUNCATE",
"TABLE|ONLY", MatchAny) ||
4639 Matches(
"TRUNCATE",
"TABLE",
"ONLY", MatchAny))
4640 COMPLETE_WITH(
"RESTART IDENTITY",
"CONTINUE IDENTITY",
"CASCADE",
"RESTRICT");
4641 else if (HeadMatches(
"TRUNCATE") && TailMatches(
"IDENTITY"))
4642 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
4645 else if (Matches(
"UNLISTEN"))
4646 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_channels,
"*");
4650 else if (TailMatches(
"UPDATE"))
4651 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
4653 else if (TailMatches(
"UPDATE", MatchAny))
4654 COMPLETE_WITH(
"SET");
4656 else if (TailMatches(
"UPDATE", MatchAny,
"SET"))
4657 COMPLETE_WITH_ATTR(prev2_wd);
4659 else if (TailMatches(
"UPDATE", MatchAny,
"SET", MatchAnyExcept(
"*=")))
4663 else if (Matches(
"ALTER|CREATE|DROP",
"USER",
"MAPPING"))
4664 COMPLETE_WITH(
"FOR");
4665 else if (Matches(
"CREATE",
"USER",
"MAPPING",
"FOR"))
4666 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4671 else if (Matches(
"ALTER|DROP",
"USER",
"MAPPING",
"FOR"))
4672 COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings);
4673 else if (Matches(
"CREATE|ALTER|DROP",
"USER",
"MAPPING",
"FOR", MatchAny))
4674 COMPLETE_WITH(
"SERVER");
4675 else if (Matches(
"CREATE|ALTER",
"USER",
"MAPPING",
"FOR", MatchAny,
"SERVER", MatchAny))
4676 COMPLETE_WITH(
"OPTIONS");
4682 else if (Matches(
"VACUUM"))
4683 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
4688 else if (Matches(
"VACUUM",
"FULL"))
4689 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
4693 else if (Matches(
"VACUUM",
"FREEZE") ||
4694 Matches(
"VACUUM",
"FULL",
"FREEZE"))
4695 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
4698 else if (Matches(
"VACUUM",
"VERBOSE") ||
4699 Matches(
"VACUUM",
"FULL|FREEZE",
"VERBOSE") ||
4700 Matches(
"VACUUM",
"FULL",
"FREEZE",
"VERBOSE"))
4701 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
4703 else if (HeadMatches(
"VACUUM",
"(*") &&
4704 !HeadMatches(
"VACUUM",
"(*)"))
4711 if (ends_with(prev_wd,
'(') || ends_with(prev_wd,
','))
4712 COMPLETE_WITH(
"FULL",
"FREEZE",
"ANALYZE",
"VERBOSE",
4713 "DISABLE_PAGE_SKIPPING",
"SKIP_LOCKED",
4714 "INDEX_CLEANUP",
"PROCESS_MAIN",
"PROCESS_TOAST",
4715 "TRUNCATE",
"PARALLEL",
"SKIP_DATABASE_STATS",
4716 "ONLY_DATABASE_STATS",
"BUFFER_USAGE_LIMIT");
4717 else if (TailMatches(
"FULL|FREEZE|ANALYZE|VERBOSE|DISABLE_PAGE_SKIPPING|SKIP_LOCKED|PROCESS_MAIN|PROCESS_TOAST|TRUNCATE|SKIP_DATABASE_STATS|ONLY_DATABASE_STATS"))
4718 COMPLETE_WITH(
"ON",
"OFF");
4719 else if (TailMatches(
"INDEX_CLEANUP"))
4720 COMPLETE_WITH(
"AUTO",
"ON",
"OFF");
4722 else if (HeadMatches(
"VACUUM") && TailMatches(
"("))
4724 COMPLETE_WITH_ATTR(prev2_wd);
4725 else if (HeadMatches(
"VACUUM"))
4726 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_vacuumables);
4734 else if (Matches(
"WITH"))
4735 COMPLETE_WITH(
"RECURSIVE");
4739 else if (TailMatches(MatchAny,
"WHERE"))
4740 COMPLETE_WITH_ATTR(prev2_wd);
4744 else if (TailMatches(
"FROM") && !Matches(
"COPY|\\copy", MatchAny,
"FROM"))
4745 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
4748 else if (TailMatches(
"JOIN"))
4749 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
4752 else if (TailMatches(
"AT"))
4753 COMPLETE_WITH(
"LOCAL",
"TIME ZONE");
4754 else if (TailMatches(
"AT",
"TIME",
"ZONE"))
4755 COMPLETE_WITH_TIMEZONE_NAME();
4759 else if (TailMatchesCS(
"\\?"))
4760 COMPLETE_WITH_CS(
"commands",
"options",
"variables");
4761 else if (TailMatchesCS(
"\\connect|\\c"))
4764 COMPLETE_WITH_QUERY(Query_for_list_of_databases);
4766 else if (TailMatchesCS(
"\\connect|\\c", MatchAny))
4769 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
4771 else if (TailMatchesCS(
"\\da*"))
4772 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_aggregates);
4773 else if (TailMatchesCS(
"\\dAc*", MatchAny) ||
4774 TailMatchesCS(
"\\dAf*", MatchAny))
4775 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
4776 else if (TailMatchesCS(
"\\dAo*", MatchAny) ||
4777 TailMatchesCS(
"\\dAp*", MatchAny))
4778 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_operator_families);
4779 else if (TailMatchesCS(
"\\dA*"))
4780 COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
4781 else if (TailMatchesCS(
"\\db*"))
4782 COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
4783 else if (TailMatchesCS(
"\\dconfig*"))
4784 COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_show_vars);
4785 else if (TailMatchesCS(
"\\dD*"))
4786 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
4787 else if (TailMatchesCS(
"\\des*"))
4788 COMPLETE_WITH_QUERY(Query_for_list_of_servers);
4789 else if (TailMatchesCS(
"\\deu*"))
4790 COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings);
4791 else if (TailMatchesCS(
"\\dew*"))
4792 COMPLETE_WITH_QUERY(Query_for_list_of_fdws);
4793 else if (TailMatchesCS(
"\\df*"))
4794 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
4795 else if (HeadMatchesCS(
"\\df*"))
4796 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
4798 else if (TailMatchesCS(
"\\dFd*"))
4799 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_dictionaries);
4800 else if (TailMatchesCS(
"\\dFp*"))
4801 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_parsers);
4802 else if (TailMatchesCS(
"\\dFt*"))
4803 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_templates);
4805 else if (TailMatchesCS(
"\\dF*"))
4806 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_configurations);
4808 else if (TailMatchesCS(
"\\di*"))
4809 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
4810 else if (TailMatchesCS(
"\\dL*"))
4811 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
4812 else if (TailMatchesCS(
"\\dn*"))
4813 COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
4815 else if (HeadMatchesCS(
"\\do*", MatchAny))
4816 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
4817 else if (TailMatchesCS(
"\\dp") || TailMatchesCS(
"\\z"))
4818 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables);
4819 else if (TailMatchesCS(
"\\dPi*"))
4820 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_indexes);
4821 else if (TailMatchesCS(
"\\dPt*"))
4822 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables);
4823 else if (TailMatchesCS(
"\\dP*"))
4824 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_relations);
4825 else if (TailMatchesCS(
"\\dRp*"))
4826 COMPLETE_WITH_VERSIONED_QUERY(Query_for_list_of_publications);
4827 else if (TailMatchesCS(
"\\dRs*"))
4828 COMPLETE_WITH_VERSIONED_QUERY(Query_for_list_of_subscriptions);
4829 else if (TailMatchesCS(
"\\ds*"))
4830 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences);
4831 else if (TailMatchesCS(
"\\dt*"))
4832 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
4833 else if (TailMatchesCS(
"\\dT*"))
4834 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
4835 else if (TailMatchesCS(
"\\du*") ||
4836 TailMatchesCS(
"\\dg*") ||
4837 TailMatchesCS(
"\\drg*"))
4838 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
4839 else if (TailMatchesCS(
"\\dv*"))
4840 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
4841 else if (TailMatchesCS(
"\\dx*"))
4842 COMPLETE_WITH_QUERY(Query_for_list_of_extensions);
4843 else if (TailMatchesCS(
"\\dX*"))
4844 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_statistics);
4845 else if (TailMatchesCS(
"\\dm*"))
4846 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
4847 else if (TailMatchesCS(
"\\dE*"))
4848 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
4849 else if (TailMatchesCS(
"\\dy*"))
4850 COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
4853 else if (TailMatchesCS(
"\\d*"))
4854 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_relations);
4856 else if (TailMatchesCS(
"\\ef"))
4857 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
4858 else if (TailMatchesCS(
"\\ev"))
4859 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
4861 else if (TailMatchesCS(
"\\encoding"))
4862 COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_encodings);
4863 else if (TailMatchesCS(
"\\h|\\help"))
4864 COMPLETE_WITH_LIST(sql_commands);
4865 else if (TailMatchesCS(
"\\h|\\help", MatchAny))
4867 if (TailMatches(
"DROP"))
4868 matches = rl_completion_matches(
text, drop_command_generator);
4869 else if (TailMatches(
"ALTER"))
4870 matches = rl_completion_matches(
text, alter_command_generator);
4877 else if (TailMatchesCS(
"\\h|\\help", MatchAny, MatchAny))
4879 if (TailMatches(
"CREATE|DROP",
"ACCESS"))
4880 COMPLETE_WITH(
"METHOD");
4881 else if (TailMatches(
"ALTER",
"DEFAULT"))
4882 COMPLETE_WITH(
"PRIVILEGES");
4883 else if (TailMatches(
"CREATE|ALTER|DROP",
"EVENT"))
4884 COMPLETE_WITH(
"TRIGGER");
4885 else if (TailMatches(
"CREATE|ALTER|DROP",
"FOREIGN"))
4886 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
4887 else if (TailMatches(
"ALTER",
"LARGE"))
4888 COMPLETE_WITH(
"OBJECT");
4889 else if (TailMatches(
"CREATE|ALTER|DROP",
"MATERIALIZED"))
4890 COMPLETE_WITH(
"VIEW");
4891 else if (TailMatches(
"CREATE|ALTER|DROP",
"TEXT"))
4892 COMPLETE_WITH(
"SEARCH");
4893 else if (TailMatches(
"CREATE|ALTER|DROP",
"USER"))
4894 COMPLETE_WITH(
"MAPPING FOR");
4896 else if (TailMatchesCS(
"\\h|\\help", MatchAny, MatchAny, MatchAny))
4898 if (TailMatches(
"CREATE|ALTER|DROP",
"FOREIGN",
"DATA"))
4899 COMPLETE_WITH(
"WRAPPER");
4900 else if (TailMatches(
"CREATE|ALTER|DROP",
"TEXT",
"SEARCH"))
4901 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
4902 else if (TailMatches(
"CREATE|ALTER|DROP",
"USER",
"MAPPING"))
4903 COMPLETE_WITH(
"FOR");
4905 else if (TailMatchesCS(
"\\l*") && !TailMatchesCS(
"\\lo*"))
4906 COMPLETE_WITH_QUERY(Query_for_list_of_databases);
4907 else if (TailMatchesCS(
"\\password"))
4908 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
4909 else if (TailMatchesCS(
"\\pset"))
4910 COMPLETE_WITH_CS(
"border",
"columns",
"csv_fieldsep",
"expanded",
4911 "fieldsep",
"fieldsep_zero",
"footer",
"format",
4912 "linestyle",
"null",
"numericlocale",
4913 "pager",
"pager_min_lines",
4914 "recordsep",
"recordsep_zero",
4915 "tableattr",
"title",
"tuples_only",
4916 "unicode_border_linestyle",
4917 "unicode_column_linestyle",
4918 "unicode_header_linestyle",
4920 else if (TailMatchesCS(
"\\pset", MatchAny))
4922 if (TailMatchesCS(
"format"))
4923 COMPLETE_WITH_CS(
"aligned",
"asciidoc",
"csv",
"html",
"latex",
4924 "latex-longtable",
"troff-ms",
"unaligned",
4926 else if (TailMatchesCS(
"xheader_width"))
4927 COMPLETE_WITH_CS(
"full",
"column",
"page");
4928 else if (TailMatchesCS(
"linestyle"))
4929 COMPLETE_WITH_CS(
"ascii",
"old-ascii",
"unicode");
4930 else if (TailMatchesCS(
"pager"))
4931 COMPLETE_WITH_CS(
"on",
"off",
"always");
4932 else if (TailMatchesCS(
"unicode_border_linestyle|"
4933 "unicode_column_linestyle|"
4934 "unicode_header_linestyle"))
4935 COMPLETE_WITH_CS(
"single",
"double");
4937 else if (TailMatchesCS(
"\\unset"))
4938 matches = complete_from_variables(
text,
"",
"",
true);
4939 else if (TailMatchesCS(
"\\set"))
4940 matches = complete_from_variables(
text,
"",
"",
false);
4941 else if (TailMatchesCS(
"\\set", MatchAny))
4943 if (TailMatchesCS(
"AUTOCOMMIT|ON_ERROR_STOP|QUIET|SHOW_ALL_RESULTS|"
4944 "SINGLELINE|SINGLESTEP"))
4945 COMPLETE_WITH_CS(
"on",
"off");
4946 else if (TailMatchesCS(
"COMP_KEYWORD_CASE"))
4947 COMPLETE_WITH_CS(
"lower",
"upper",
4948 "preserve-lower",
"preserve-upper");
4949 else if (TailMatchesCS(
"ECHO"))
4950 COMPLETE_WITH_CS(
"errors",
"queries",
"all",
"none");
4951 else if (TailMatchesCS(
"ECHO_HIDDEN"))
4952 COMPLETE_WITH_CS(
"noexec",
"off",
"on");
4953 else if (TailMatchesCS(
"HISTCONTROL"))
4954 COMPLETE_WITH_CS(
"ignorespace",
"ignoredups",
4955 "ignoreboth",
"none");
4956 else if (TailMatchesCS(
"ON_ERROR_ROLLBACK"))
4957 COMPLETE_WITH_CS(
"on",
"off",
"interactive");
4958 else if (TailMatchesCS(
"SHOW_CONTEXT"))
4959 COMPLETE_WITH_CS(
"never",
"errors",
"always");
4960 else if (TailMatchesCS(
"VERBOSITY"))
4961 COMPLETE_WITH_CS(
"default",
"verbose",
"terse",
"sqlstate");
4963 else if (TailMatchesCS(
"\\sf*"))
4964 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
4965 else if (TailMatchesCS(
"\\sv*"))
4966 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
4967 else if (TailMatchesCS(
"\\cd|\\e|\\edit|\\g|\\gx|\\i|\\include|"
4968 "\\ir|\\include_relative|\\o|\\out|"
4969 "\\s|\\w|\\write|\\lo_import"))
4971 completion_charp =
"\\";
4972 completion_force_quote =
false;
4973 matches = rl_completion_matches(
text, complete_from_files);
4983 const pgsql_thing_t *wac;
4985 for (wac = words_after_create; wac->name != NULL; wac++)
4990 COMPLETE_WITH_QUERY_LIST(wac->query,
4992 else if (wac->vquery)
4993 COMPLETE_WITH_VERSIONED_QUERY_LIST(wac->vquery,
4995 else if (wac->squery)
4996 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(wac->squery,
5008 if (matches == NULL)
5010 COMPLETE_WITH_CONST(
true,
"");
5012 rl_completion_append_character =
'\0';
5013 #ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
5014 rl_completion_suppress_quote = 1;
5019 free(previous_words);
5022 free(completion_ref_object);
5023 completion_ref_object = NULL;
5024 free(completion_ref_schema);
5025 completion_ref_schema = NULL;
5051 create_or_drop_command_generator(
const char *
text,
int state,
bits32 excluded)
5053 static int list_index,
5061 string_length = strlen(
text);
5065 while ((
name = words_after_create[list_index++].
name))
5068 !(words_after_create[list_index - 1].flags & excluded))
5069 return pg_strdup_keyword_case(
name,
text);
5080 create_command_generator(
const char *
text,
int state)
5082 return create_or_drop_command_generator(
text,
state, THING_NO_CREATE);
5089 drop_command_generator(
const char *
text,
int state)
5091 return create_or_drop_command_generator(
text,
state, THING_NO_DROP);
5098 alter_command_generator(
const char *
text,
int state)
5100 return create_or_drop_command_generator(
text,
state, THING_NO_ALTER);
5109 complete_from_query(
const char *
text,
int state)
5112 return _complete_from_query(completion_charp, NULL, completion_charpp,
5117 complete_from_versioned_query(
const char *
text,
int state)
5119 const VersionedQuery *vquery = completion_vquery;
5125 if (vquery->query == NULL)
5128 return _complete_from_query(vquery->query, NULL, completion_charpp,
5133 complete_from_schema_query(
const char *
text,
int state)
5136 return _complete_from_query(NULL, completion_squery, completion_charpp,
5141 complete_from_versioned_schema_query(
const char *
text,
int state)
5143 const SchemaQuery *squery = completion_squery;
5149 if (squery->catname == NULL)
5152 return _complete_from_query(NULL, squery, completion_charpp,
5199 _complete_from_query(
const char *simple_query,
5200 const SchemaQuery *schema_query,
5201 const char *
const *keywords,
5205 static int list_index,
5210 static bool non_empty_object;
5211 static bool schemaquoted;
5212 static bool objectquoted;
5223 char *e_object_like;
5230 num_schema_only = 0;
5231 num_query_other = 0;
5244 parse_identifier(
text,
5245 &schemaname, &objectname,
5246 &schemaquoted, &objectquoted);
5250 non_empty_object = (*objectname !=
'\0');
5256 e_object_like = make_like_pattern(objectname);
5259 e_schemaname = escape_string(schemaname);
5261 e_schemaname = NULL;
5263 if (completion_ref_object)
5264 e_ref_object = escape_string(completion_ref_object);
5266 e_ref_object = NULL;
5268 if (completion_ref_schema)
5269 e_ref_schema = escape_string(completion_ref_schema);
5271 e_ref_schema = NULL;
5277 Assert(simple_query == NULL);
5284 if (schemaname == NULL || schema_query->namespace == NULL)
5288 if (schema_query->use_distinct)
5291 "%s, NULL::pg_catalog.text FROM %s",
5292 schema_query->result,
5293 schema_query->catname);
5294 if (schema_query->refnamespace && completion_ref_schema)
5296 ", pg_catalog.pg_namespace nr");
5298 if (schema_query->selcondition)
5300 schema_query->selcondition);
5302 schema_query->result,
5304 if (schema_query->viscondition)
5306 schema_query->viscondition);
5307 if (schema_query->refname)
5309 Assert(completion_ref_object);
5311 schema_query->refname, e_ref_object);
5312 if (schema_query->refnamespace && completion_ref_schema)
5314 " AND %s = nr.oid AND nr.nspname = '%s'",
5315 schema_query->refnamespace,
5317 else if (schema_query->refviscondition)
5320 schema_query->refviscondition);
5330 if (strcmp(schema_query->catname,
5331 "pg_catalog.pg_class c") == 0 &&
5332 strncmp(objectname,
"pg_", 3) != 0)
5335 " AND c.relnamespace <> (SELECT oid FROM"
5336 " pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')");
5343 if (schema_query->namespace)
5346 "SELECT NULL::pg_catalog.text, n.nspname "
5347 "FROM pg_catalog.pg_namespace n "
5348 "WHERE n.nspname LIKE '%s'",
5355 if (strncmp(objectname,
"pg_", 3) != 0)
5357 " AND n.nspname NOT LIKE E'pg\\\\_%'");
5364 schemaquoted = objectquoted;
5371 if (schema_query->use_distinct)
5374 "FROM %s, pg_catalog.pg_namespace n",
5375 schema_query->result,
5376 schema_query->catname);
5377 if (schema_query->refnamespace && completion_ref_schema)
5379 ", pg_catalog.pg_namespace nr");
5381 schema_query->namespace);
5382 if (schema_query->selcondition)
5384 schema_query->selcondition);
5386 schema_query->result,
5390 if (schema_query->refname)
5392 Assert(completion_ref_object);
5394 schema_query->refname, e_ref_object);
5395 if (schema_query->refnamespace && completion_ref_schema)
5397 " AND %s = nr.oid AND nr.nspname = '%s'",
5398 schema_query->refnamespace,
5400 else if (schema_query->refviscondition)
5403 schema_query->refviscondition);
5413 e_ref_object, e_ref_schema);
5418 completion_max_records);
5421 result = exec_query(query_buffer.
data);
5427 free(e_object_like);
5440 const char *item = NULL;
5441 const char *nsp = NULL;
5464 if (non_empty_object)
5466 if (item && !objectquoted && identifier_needs_quotes(item))
5468 if (nsp && !schemaquoted && identifier_needs_quotes(nsp))
5473 if (item == NULL && nsp != NULL)
5478 return requote_identifier(nsp, item, schemaquoted, objectquoted);
5487 if (schema_query && schema_query->keywords)
5489 const char *
const *itemp = schema_query->keywords;
5493 const char *item = *itemp++;
5501 return pg_strdup_keyword_case(item,
text);
5507 const char *
const *itemp = keywords;
5511 const char *item = *itemp++;
5519 return pg_strdup_keyword_case(item,
text);
5530 if (num_schema_only > 0 && num_query_other == 0 && num_keywords == 0)
5531 rl_completion_append_character =
'\0';
5546 set_completion_reference(
const char *
word)
5551 parse_identifier(
word,
5552 &completion_ref_schema, &completion_ref_object,
5553 &schemaquoted, &objectquoted);
5561 set_completion_reference_verbatim(
const char *
word)
5563 completion_ref_schema = NULL;
5574 complete_from_list(
const char *
text,
int state)
5576 static int string_length,
5579 static bool casesensitive;
5583 Assert(completion_charpp != NULL);
5589 string_length = strlen(
text);
5590 casesensitive = completion_case_sensitive;
5594 while ((item = completion_charpp[list_index++]))
5597 if (casesensitive && strncmp(
text, item, string_length) == 0)
5606 if (completion_case_sensitive)
5614 return pg_strdup_keyword_case(item,
text);
5622 if (casesensitive && matches == 0)
5624 casesensitive =
false;
5654 complete_from_const(
const char *
text,
int state)
5656 Assert(completion_charp != NULL);
5659 if (completion_case_sensitive)
5667 return pg_strdup_keyword_case(completion_charp,
text);
5679 append_variable_names(
char ***varnames,
int *nvars,
5680 int *maxvars,
const char *varname,
5681 const char *prefix,
const char *suffix)
5683 if (*nvars >= *maxvars)
5687 ((*maxvars) + 1) *
sizeof(
char *));
5690 (*varnames)[(*nvars)++] =
psprintf(
"%s%s%s", prefix, varname, suffix);
5702 complete_from_variables(
const char *
text,
const char *prefix,
const char *suffix,
5712 varnames = (
char **)
pg_malloc((maxvars + 1) *
sizeof(
char *));
5716 if (need_value && !(ptr->
value))
5718 append_variable_names(&varnames, &nvars, &maxvars, ptr->
name,
5722 varnames[nvars] = NULL;
5723 COMPLETE_WITH_LIST_CS((
const char *
const *) varnames);
5725 for (
i = 0;
i < nvars;
i++)
5747 complete_from_files(
const char *
text,
int state)
5749 #ifdef USE_FILENAME_QUOTING_FUNCTIONS
5766 #ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
5767 rl_completion_suppress_quote = 1;
5772 completion_force_quote =
true;
5774 return rl_filename_completion_function(
text,
state);
5780 static const char *unquoted_text;
5781 char *unquoted_match;
5786 completion_force_quote =
true;
5791 unquoted_text =
strtokx(
text,
"", NULL,
"'", *completion_charp,
5797 unquoted_text =
text;
5801 unquoted_match = rl_filename_completion_function(unquoted_text,
state);
5804 struct stat statbuf;
5805 bool is_dir = (
stat(unquoted_match, &statbuf) == 0 &&
5806 S_ISDIR(statbuf.st_mode) != 0);
5810 '\'', *completion_charp,
5811 completion_force_quote,
5814 free(unquoted_match);
5816 ret = unquoted_match;
5823 if (*ret ==
'\'' && is_dir)
5825 char *retend = ret + strlen(ret) - 1;
5830 rl_completion_append_character =
'\0';
5847 pg_strdup_keyword_case(
const char *s,
const char *ref)
5851 unsigned char first = ref[0];
5860 for (p = ret; *p; p++)
5865 for (p = ret; *p; p++)
5879 escape_string(
const char *
text)
5902 make_like_pattern(
const char *
word)
5906 char *bptr = buffer;
5929 result = escape_string(buffer);
5948 parse_identifier(
const char *
ident,
5949 char **schemaname,
char **objectname,
5950 bool *schemaquoted,
bool *objectquoted)
5952 size_t buflen = strlen(
ident) + 1;
5962 *schemaquoted = *objectquoted =
false;
5968 unsigned char ch = (
unsigned char) *
ident++;
5972 if (inquotes && *
ident ==
'"')
5980 inquotes = !inquotes;
5981 *objectquoted =
true;
5984 else if (ch ==
'.' && !inquotes)
5992 *schemaquoted = *objectquoted;
5993 *objectquoted =
false;
6005 *optr++ = (char) ch;
6020 if (ch >=
'A' && ch <=
'Z')
6022 else if (enc_is_single_byte &&
IS_HIGHBIT_SET(ch) && isupper(ch))
6025 *optr++ = (char) ch;
6030 *schemaname = sname;
6031 *objectname = oname;
6047 requote_identifier(
const char *schemaname,
const char *objectname,
6048 bool quote_schema,
bool quote_object)
6060 buflen += strlen(schemaname) + 1;
6062 quote_schema = identifier_needs_quotes(schemaname);
6066 for (
const char *p = schemaname; *p; p++)
6075 buflen += strlen(objectname);
6077 quote_object = identifier_needs_quotes(objectname);
6081 for (
const char *p = objectname; *p; p++)
6094 for (
const char *p = schemaname; *p; p++)
6108 for (
const char *p = objectname; *p; p++)
6129 identifier_needs_quotes(
const char *
ident)
6136 if (strspn(
ident,
"abcdefghijklmnopqrstuvwxyz0123456789_$") != strlen(
ident))
6162 exec_query(
const char *query)
6179 pg_log_error(
"tab completion query failed: %s\nQuery was:\n%s",
6202 get_previous_words(
int point,
char **buffer,
int *nwords)
6204 char **previous_words;
6207 int words_found = 0;
6221 memcpy(
buf +
i, rl_line_buffer, point);
6228 buf = rl_line_buffer;
6237 previous_words = (
char **)
pg_malloc(point *
sizeof(
char *));
6238 *buffer = outptr = (
char *)
pg_malloc(point * 2);
6245 for (
i = point - 1;
i >= 0;
i--)
6247 if (strchr(WORD_BREAKS,
buf[
i]))
6261 bool inquotes =
false;
6262 int parentheses = 0;
6266 for (
i = point;
i >= 0;
i--)
6268 if (!isspace((
unsigned char)
buf[
i]))
6284 for (start = end; start > 0; start--)
6286 if (
buf[start] ==
'"')
6287 inquotes = !inquotes;
6290 if (
buf[start] ==
')')
6292 else if (
buf[start] ==
'(')
6294 if (--parentheses <= 0)
6297 else if (parentheses == 0 &&
6298 strchr(WORD_BREAKS,
buf[start - 1]))
6304 previous_words[words_found++] = outptr;
6305 i = end - start + 1;
6306 memcpy(outptr, &
buf[start],
i);
6315 if (
buf != rl_line_buffer)
6318 *nwords = words_found;
6319 return previous_words;
6329 get_guctype(
const char *varname)
6334 char *guctype = NULL;
6336 e_varname = escape_string(varname);
6340 "SELECT vartype FROM pg_catalog.pg_settings "
6341 "WHERE pg_catalog.lower(name) = pg_catalog.lower('%s')",
6344 result = exec_query(query_buffer.
data);
6356 #ifdef USE_FILENAME_QUOTING_FUNCTIONS
6365 quote_file_name(
char *fname,
int match_type,
char *quote_pointer)
6368 struct stat statbuf;
6372 '\'', *completion_charp,
6373 completion_force_quote,
6388 completion_last_char !=
'\'' &&
6389 (match_type != SINGLE_MATCH ||
6390 (quote_pointer && *quote_pointer ==
'\'') ||
6391 stat(fname, &statbuf) != 0 ||
6394 char *
send = s + strlen(s) - 1;
6405 #ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
6406 rl_completion_suppress_quote = 0;
6414 if (quote_pointer && *quote_pointer !=
'\'')
6415 *quote_pointer =
'\0';
6426 dequote_file_name(
char *fname,
int quote_char)
6428 char *unquoted_fname;
6435 if (quote_char ==
'\'')
6437 char *workspace = (
char *)
pg_malloc(strlen(fname) + 2);
6439 workspace[0] = quote_char;
6440 strcpy(workspace + 1, fname);
6441 unquoted_fname =
strtokx(workspace,
"", NULL,
"'", *completion_charp,
6446 unquoted_fname =
strtokx(fname,
"", NULL,
"'", *completion_charp,
6450 if (!unquoted_fname)
6453 unquoted_fname = fname;
bool recognized_connection_string(const char *connstr)
#define IS_HIGHBIT_SET(ch)
const uint8 ScanKeywordCategories[SCANKEYWORDS_NUM_KEYWORDS]
char * PQerrorMessage(const PGconn *conn)
ConnStatusType PQstatus(const PGconn *conn)
size_t PQescapeStringConn(PGconn *conn, char *to, const char *from, size_t length, int *error)
ExecStatusType PQresultStatus(const PGresult *res)
int PQntuples(const PGresult *res)
PGresult * PQexec(PGconn *conn, const char *query)
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
int PQgetisnull(const PGresult *res, int tup_num, int field_num)
int PQnfields(const PGresult *res)
int PQmblenBounded(const char *s, int encoding)
void * pg_realloc(void *ptr, size_t size)
char * pg_strdup(const char *in)
void * pg_malloc(size_t size)
PGDLLIMPORT const ScanKeywordList ScanKeywords
#define UNRESERVED_KEYWORD
int ScanKeywordLookup(const char *str, const ScanKeywordList *keywords)
Assert(fmt[strlen(fmt) - 1] !='\n')
#define pg_log_error(...)
char * pnstrdup(const char *in, Size len)
int pg_strcasecmp(const char *s1, const char *s2)
unsigned char pg_toupper(unsigned char ch)
unsigned char pg_tolower(unsigned char ch)
int pg_strncasecmp(const char *s1, const char *s2, size_t n)
void initPQExpBuffer(PQExpBuffer str)
void appendPQExpBuffer(PQExpBuffer str, const char *fmt,...)
void appendPQExpBufferStr(PQExpBuffer str, const char *data)
void termPQExpBuffer(PQExpBuffer str)
char * psprintf(const char *fmt,...)
static void word(struct vars *v, int dir, struct state *lp, struct state *rp)
@ PSQL_COMP_CASE_PRESERVE_LOWER
@ PSQL_COMP_CASE_PRESERVE_UPPER
char * quote_if_needed(const char *source, const char *entails_quote, char quote, char escape, bool force_quote, int encoding)
char * strtokx(const char *s, const char *whitespace, const char *delim, const char *quote, char escape, bool e_strings, bool del_quotes, int encoding)
void initialize_readline(void)
PQExpBuffer tab_completion_query_buf
static int32 text_length(Datum str)
int pg_encoding_max_length(int encoding)
#define send(s, buf, len, flags)