53#include "catalog/pg_am_d.h"
54#include "catalog/pg_class_d.h"
68#ifndef HAVE_RL_FILENAME_COMPLETION_FUNCTION
69#define rl_filename_completion_function filename_completion_function
72#ifndef HAVE_RL_COMPLETION_MATCHES
73#define rl_completion_matches completion_matches
81#ifdef HAVE_RL_FILENAME_QUOTING_FUNCTION
82#define USE_FILENAME_QUOTING_FUNCTIONS 1
86#define WORD_BREAKS "\t\n@><=;|&() "
107typedef struct VersionedQuery
109 int min_server_version;
129typedef struct SchemaQuery
136 int min_server_version;
152 const char *selcondition;
159 const char *viscondition;
167 const char *
namespace;
203 const char *refviscondition;
210 const char *refnamespace;
217static int completion_max_records;
224static char completion_last_char;
225static const char *completion_charp;
226static const char *
const *completion_charpp;
227static const VersionedQuery *completion_vquery;
228static const SchemaQuery *completion_squery;
229static char *completion_ref_object;
230static char *completion_ref_schema;
231static bool completion_case_sensitive;
232static bool completion_verbatim;
233static bool completion_force_quote;
256#define COMPLETE_WITH_QUERY(query) \
257 COMPLETE_WITH_QUERY_LIST(query, NULL)
259#define COMPLETE_WITH_QUERY_LIST(query, list) \
261 completion_charp = query; \
262 completion_charpp = list; \
263 completion_verbatim = false; \
264 matches = rl_completion_matches(text, complete_from_query); \
267#define COMPLETE_WITH_QUERY_PLUS(query, ...) \
269 static const char *const list[] = { __VA_ARGS__, NULL }; \
270 COMPLETE_WITH_QUERY_LIST(query, list); \
273#define COMPLETE_WITH_QUERY_VERBATIM(query) \
274 COMPLETE_WITH_QUERY_VERBATIM_LIST(query, NULL)
276#define COMPLETE_WITH_QUERY_VERBATIM_LIST(query, list) \
278 completion_charp = query; \
279 completion_charpp = list; \
280 completion_verbatim = true; \
281 matches = rl_completion_matches(text, complete_from_query); \
284#define COMPLETE_WITH_QUERY_VERBATIM_PLUS(query, ...) \
286 static const char *const list[] = { __VA_ARGS__, NULL }; \
287 COMPLETE_WITH_QUERY_VERBATIM_LIST(query, list); \
290#define COMPLETE_WITH_VERSIONED_QUERY(query) \
291 COMPLETE_WITH_VERSIONED_QUERY_LIST(query, NULL)
293#define COMPLETE_WITH_VERSIONED_QUERY_LIST(query, list) \
295 completion_vquery = query; \
296 completion_charpp = list; \
297 completion_verbatim = false; \
298 matches = rl_completion_matches(text, complete_from_versioned_query); \
301#define COMPLETE_WITH_VERSIONED_QUERY_PLUS(query, ...) \
303 static const char *const list[] = { __VA_ARGS__, NULL }; \
304 COMPLETE_WITH_VERSIONED_QUERY_LIST(query, list); \
307#define COMPLETE_WITH_SCHEMA_QUERY(query) \
308 COMPLETE_WITH_SCHEMA_QUERY_LIST(query, NULL)
310#define COMPLETE_WITH_SCHEMA_QUERY_LIST(query, list) \
312 completion_squery = &(query); \
313 completion_charpp = list; \
314 completion_verbatim = false; \
315 matches = rl_completion_matches(text, complete_from_schema_query); \
318#define COMPLETE_WITH_SCHEMA_QUERY_PLUS(query, ...) \
320 static const char *const list[] = { __VA_ARGS__, NULL }; \
321 COMPLETE_WITH_SCHEMA_QUERY_LIST(query, list); \
324#define COMPLETE_WITH_SCHEMA_QUERY_VERBATIM(query) \
326 completion_squery = &(query); \
327 completion_charpp = NULL; \
328 completion_verbatim = true; \
329 matches = rl_completion_matches(text, complete_from_schema_query); \
332#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(query) \
333 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, NULL)
335#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, list) \
337 completion_squery = query; \
338 completion_charpp = list; \
339 completion_verbatim = false; \
340 matches = rl_completion_matches(text, complete_from_versioned_schema_query); \
343#define COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_PLUS(query, ...) \
345 static const char *const list[] = { __VA_ARGS__, NULL }; \
346 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(query, list); \
353#define COMPLETE_WITH_CONST(cs, con) \
355 completion_case_sensitive = (cs); \
356 completion_charp = (con); \
357 matches = rl_completion_matches(text, complete_from_const); \
360#define COMPLETE_WITH_LIST_INT(cs, list) \
362 completion_case_sensitive = (cs); \
363 completion_charpp = (list); \
364 matches = rl_completion_matches(text, complete_from_list); \
367#define COMPLETE_WITH_LIST(list) COMPLETE_WITH_LIST_INT(false, list)
368#define COMPLETE_WITH_LIST_CS(list) COMPLETE_WITH_LIST_INT(true, list)
370#define COMPLETE_WITH(...) \
372 static const char *const list[] = { __VA_ARGS__, NULL }; \
373 COMPLETE_WITH_LIST(list); \
376#define COMPLETE_WITH_CS(...) \
378 static const char *const list[] = { __VA_ARGS__, NULL }; \
379 COMPLETE_WITH_LIST_CS(list); \
382#define COMPLETE_WITH_ATTR(relation) \
383 COMPLETE_WITH_ATTR_LIST(relation, NULL)
385#define COMPLETE_WITH_ATTR_LIST(relation, list) \
387 set_completion_reference(relation); \
388 completion_squery = &(Query_for_list_of_attributes); \
389 completion_charpp = list; \
390 completion_verbatim = false; \
391 matches = rl_completion_matches(text, complete_from_schema_query); \
394#define COMPLETE_WITH_ATTR_PLUS(relation, ...) \
396 static const char *const list[] = { __VA_ARGS__, NULL }; \
397 COMPLETE_WITH_ATTR_LIST(relation, list); \
406#define COMPLETE_WITH_ENUM_VALUE(type) \
408 set_completion_reference(type); \
409 if (text[0] == '\'' || \
410 start == 0 || rl_line_buffer[start - 1] != '\'') \
411 completion_squery = &(Query_for_list_of_enum_values_quoted); \
413 completion_squery = &(Query_for_list_of_enum_values_unquoted); \
414 completion_charpp = NULL; \
415 completion_verbatim = true; \
416 matches = rl_completion_matches(text, complete_from_schema_query); \
423#define COMPLETE_WITH_TIMEZONE_NAME() \
425 static const char *const list[] = { "DEFAULT", NULL }; \
426 if (text[0] == '\'') \
427 completion_charp = Query_for_list_of_timezone_names_quoted_in; \
428 else if (start == 0 || rl_line_buffer[start - 1] != '\'') \
429 completion_charp = Query_for_list_of_timezone_names_quoted_out; \
431 completion_charp = Query_for_list_of_timezone_names_unquoted; \
432 completion_charpp = list; \
433 completion_verbatim = true; \
434 matches = rl_completion_matches(text, complete_from_query); \
437#define COMPLETE_WITH_FUNCTION_ARG(function) \
439 set_completion_reference(function); \
440 completion_squery = &(Query_for_list_of_arguments); \
441 completion_charpp = NULL; \
442 completion_verbatim = true; \
443 matches = rl_completion_matches(text, complete_from_schema_query); \
453static const SchemaQuery Query_for_constraint_of_table = {
454 .catname =
"pg_catalog.pg_constraint con, pg_catalog.pg_class c1",
455 .selcondition =
"con.conrelid=c1.oid",
456 .result =
"con.conname",
457 .refname =
"c1.relname",
458 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
459 .refnamespace =
"c1.relnamespace",
462static const SchemaQuery Query_for_constraint_of_table_not_validated = {
463 .catname =
"pg_catalog.pg_constraint con, pg_catalog.pg_class c1",
464 .selcondition =
"con.conrelid=c1.oid and not con.convalidated",
465 .result =
"con.conname",
466 .refname =
"c1.relname",
467 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
468 .refnamespace =
"c1.relnamespace",
471static const SchemaQuery Query_for_constraint_of_type = {
472 .catname =
"pg_catalog.pg_constraint con, pg_catalog.pg_type t",
473 .selcondition =
"con.contypid=t.oid",
474 .result =
"con.conname",
475 .refname =
"t.typname",
476 .refviscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
477 .refnamespace =
"t.typnamespace",
480static const SchemaQuery Query_for_index_of_table = {
481 .catname =
"pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i",
482 .selcondition =
"c1.oid=i.indrelid and i.indexrelid=c2.oid",
483 .result =
"c2.relname",
484 .refname =
"c1.relname",
485 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
486 .refnamespace =
"c1.relnamespace",
489static const SchemaQuery Query_for_unique_index_of_table = {
490 .catname =
"pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_index i",
491 .selcondition =
"c1.oid=i.indrelid and i.indexrelid=c2.oid and i.indisunique",
492 .result =
"c2.relname",
493 .refname =
"c1.relname",
494 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
495 .refnamespace =
"c1.relnamespace",
498static const SchemaQuery Query_for_list_of_aggregates[] = {
500 .min_server_version = 110000,
501 .catname =
"pg_catalog.pg_proc p",
502 .selcondition =
"p.prokind = 'a'",
503 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
504 .namespace =
"p.pronamespace",
505 .result =
"p.proname",
508 .catname =
"pg_catalog.pg_proc p",
509 .selcondition =
"p.proisagg",
510 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
511 .namespace =
"p.pronamespace",
512 .result =
"p.proname",
516static const SchemaQuery Query_for_list_of_arguments = {
517 .catname =
"pg_catalog.pg_proc p",
518 .result =
"pg_catalog.oidvectortypes(p.proargtypes)||')'",
519 .refname =
"p.proname",
520 .refviscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
521 .refnamespace =
"p.pronamespace",
524static const SchemaQuery Query_for_list_of_attributes = {
525 .catname =
"pg_catalog.pg_attribute a, pg_catalog.pg_class c",
526 .selcondition =
"c.oid = a.attrelid and a.attnum > 0 and not a.attisdropped",
527 .result =
"a.attname",
528 .refname =
"c.relname",
529 .refviscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
530 .refnamespace =
"c.relnamespace",
533static const SchemaQuery Query_for_list_of_attribute_numbers = {
534 .catname =
"pg_catalog.pg_attribute a, pg_catalog.pg_class c",
535 .selcondition =
"c.oid = a.attrelid and a.attnum > 0 and not a.attisdropped",
536 .result =
"a.attnum::pg_catalog.text",
537 .refname =
"c.relname",
538 .refviscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
539 .refnamespace =
"c.relnamespace",
542static const char *
const Keywords_for_list_of_datatypes[] = {
562 "time with time zone",
563 "time without time zone",
564 "timestamp with time zone",
565 "timestamp without time zone",
570static const SchemaQuery Query_for_list_of_datatypes = {
571 .catname =
"pg_catalog.pg_type t",
573 .selcondition =
"(t.typrelid = 0 "
574 " OR (SELECT c.relkind = " CppAsString2(RELKIND_COMPOSITE_TYPE)
575 " FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid)) "
576 "AND t.typname !~ '^_'",
577 .viscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
578 .namespace =
"t.typnamespace",
579 .result =
"t.typname",
580 .keywords = Keywords_for_list_of_datatypes,
583static const SchemaQuery Query_for_list_of_composite_datatypes = {
584 .catname =
"pg_catalog.pg_type t",
586 .selcondition =
"(SELECT c.relkind = " CppAsString2(RELKIND_COMPOSITE_TYPE)
587 " FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid) "
588 "AND t.typname !~ '^_'",
589 .viscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
590 .namespace =
"t.typnamespace",
591 .result =
"t.typname",
594static const SchemaQuery Query_for_list_of_domains = {
595 .catname =
"pg_catalog.pg_type t",
596 .selcondition =
"t.typtype = 'd'",
597 .viscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
598 .namespace =
"t.typnamespace",
599 .result =
"t.typname",
602static const SchemaQuery Query_for_list_of_enum_values_quoted = {
603 .catname =
"pg_catalog.pg_enum e, pg_catalog.pg_type t",
604 .selcondition =
"t.oid = e.enumtypid",
605 .result =
"pg_catalog.quote_literal(enumlabel)",
606 .refname =
"t.typname",
607 .refviscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
608 .refnamespace =
"t.typnamespace",
611static const SchemaQuery Query_for_list_of_enum_values_unquoted = {
612 .catname =
"pg_catalog.pg_enum e, pg_catalog.pg_type t",
613 .selcondition =
"t.oid = e.enumtypid",
614 .result =
"e.enumlabel",
615 .refname =
"t.typname",
616 .refviscondition =
"pg_catalog.pg_type_is_visible(t.oid)",
617 .refnamespace =
"t.typnamespace",
621static const SchemaQuery Query_for_list_of_functions[] = {
623 .min_server_version = 110000,
624 .catname =
"pg_catalog.pg_proc p",
625 .selcondition =
"p.prokind != 'p'",
626 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
627 .namespace =
"p.pronamespace",
628 .result =
"p.proname",
631 .catname =
"pg_catalog.pg_proc p",
632 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
633 .namespace =
"p.pronamespace",
634 .result =
"p.proname",
638static const SchemaQuery Query_for_list_of_procedures[] = {
640 .min_server_version = 110000,
641 .catname =
"pg_catalog.pg_proc p",
642 .selcondition =
"p.prokind = 'p'",
643 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
644 .namespace =
"p.pronamespace",
645 .result =
"p.proname",
653static const SchemaQuery Query_for_list_of_routines = {
654 .catname =
"pg_catalog.pg_proc p",
655 .viscondition =
"pg_catalog.pg_function_is_visible(p.oid)",
656 .namespace =
"p.pronamespace",
657 .result =
"p.proname",
660static const SchemaQuery Query_for_list_of_sequences = {
661 .catname =
"pg_catalog.pg_class c",
662 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_SEQUENCE)
")",
663 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
664 .namespace =
"c.relnamespace",
665 .result =
"c.relname",
668static const SchemaQuery Query_for_list_of_foreign_tables = {
669 .catname =
"pg_catalog.pg_class c",
670 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_FOREIGN_TABLE)
")",
671 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
672 .namespace =
"c.relnamespace",
673 .result =
"c.relname",
676static const SchemaQuery Query_for_list_of_tables = {
677 .catname =
"pg_catalog.pg_class c",
681 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
682 .namespace =
"c.relnamespace",
683 .result =
"c.relname",
686static const SchemaQuery Query_for_list_of_partitioned_tables = {
687 .catname =
"pg_catalog.pg_class c",
688 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_PARTITIONED_TABLE)
")",
689 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
690 .namespace =
"c.relnamespace",
691 .result =
"c.relname",
694static const SchemaQuery Query_for_list_of_tables_for_constraint = {
695 .catname =
"pg_catalog.pg_class c, pg_catalog.pg_constraint con",
696 .selcondition =
"c.oid=con.conrelid and c.relkind IN ("
699 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
700 .namespace =
"c.relnamespace",
701 .result =
"c.relname",
702 .use_distinct =
true,
703 .refname =
"con.conname",
706static const SchemaQuery Query_for_list_of_tables_for_policy = {
707 .catname =
"pg_catalog.pg_class c, pg_catalog.pg_policy p",
708 .selcondition =
"c.oid=p.polrelid",
709 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
710 .namespace =
"c.relnamespace",
711 .result =
"c.relname",
712 .use_distinct =
true,
713 .refname =
"p.polname",
716static const SchemaQuery Query_for_list_of_tables_for_rule = {
717 .catname =
"pg_catalog.pg_class c, pg_catalog.pg_rewrite r",
718 .selcondition =
"c.oid=r.ev_class",
719 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
720 .namespace =
"c.relnamespace",
721 .result =
"c.relname",
722 .use_distinct =
true,
723 .refname =
"r.rulename",
726static const SchemaQuery Query_for_list_of_tables_for_trigger = {
727 .catname =
"pg_catalog.pg_class c, pg_catalog.pg_trigger t",
728 .selcondition =
"c.oid=t.tgrelid",
729 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
730 .namespace =
"c.relnamespace",
731 .result =
"c.relname",
732 .use_distinct =
true,
733 .refname =
"t.tgname",
736static const SchemaQuery Query_for_list_of_ts_configurations = {
737 .catname =
"pg_catalog.pg_ts_config c",
738 .viscondition =
"pg_catalog.pg_ts_config_is_visible(c.oid)",
739 .namespace =
"c.cfgnamespace",
740 .result =
"c.cfgname",
743static const SchemaQuery Query_for_list_of_ts_dictionaries = {
744 .catname =
"pg_catalog.pg_ts_dict d",
745 .viscondition =
"pg_catalog.pg_ts_dict_is_visible(d.oid)",
746 .namespace =
"d.dictnamespace",
747 .result =
"d.dictname",
750static const SchemaQuery Query_for_list_of_ts_parsers = {
751 .catname =
"pg_catalog.pg_ts_parser p",
752 .viscondition =
"pg_catalog.pg_ts_parser_is_visible(p.oid)",
753 .namespace =
"p.prsnamespace",
754 .result =
"p.prsname",
757static const SchemaQuery Query_for_list_of_ts_templates = {
758 .catname =
"pg_catalog.pg_ts_template t",
759 .viscondition =
"pg_catalog.pg_ts_template_is_visible(t.oid)",
760 .namespace =
"t.tmplnamespace",
761 .result =
"t.tmplname",
764static const SchemaQuery Query_for_list_of_views = {
765 .catname =
"pg_catalog.pg_class c",
766 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_VIEW)
")",
767 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
768 .namespace =
"c.relnamespace",
769 .result =
"c.relname",
772static const SchemaQuery Query_for_list_of_matviews = {
773 .catname =
"pg_catalog.pg_class c",
774 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_MATVIEW)
")",
775 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
776 .namespace =
"c.relnamespace",
777 .result =
"c.relname",
780static const SchemaQuery Query_for_list_of_indexes = {
781 .catname =
"pg_catalog.pg_class c",
785 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
786 .namespace =
"c.relnamespace",
787 .result =
"c.relname",
790static const SchemaQuery Query_for_list_of_partitioned_indexes = {
791 .catname =
"pg_catalog.pg_class c",
792 .selcondition =
"c.relkind = " CppAsString2(RELKIND_PARTITIONED_INDEX),
793 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
794 .namespace =
"c.relnamespace",
795 .result =
"c.relname",
800static const SchemaQuery Query_for_list_of_relations = {
801 .catname =
"pg_catalog.pg_class c",
802 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
803 .namespace =
"c.relnamespace",
804 .result =
"c.relname",
808static const SchemaQuery Query_for_list_of_partitioned_relations = {
809 .catname =
"pg_catalog.pg_class c",
810 .selcondition =
"c.relkind IN (" CppAsString2(RELKIND_PARTITIONED_TABLE)
812 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
813 .namespace =
"c.relnamespace",
814 .result =
"c.relname",
817static const SchemaQuery Query_for_list_of_operator_families = {
818 .catname =
"pg_catalog.pg_opfamily c",
819 .viscondition =
"pg_catalog.pg_opfamily_is_visible(c.oid)",
820 .namespace =
"c.opfnamespace",
821 .result =
"c.opfname",
825static const SchemaQuery Query_for_list_of_updatables = {
826 .catname =
"pg_catalog.pg_class c",
832 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
833 .namespace =
"c.relnamespace",
834 .result =
"c.relname",
838static const SchemaQuery Query_for_list_of_mergetargets = {
839 .catname =
"pg_catalog.pg_class c",
844 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
845 .namespace =
"c.relnamespace",
846 .result =
"c.relname",
850static const SchemaQuery Query_for_list_of_selectables = {
851 .catname =
"pg_catalog.pg_class c",
859 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
860 .namespace =
"c.relnamespace",
861 .result =
"c.relname",
865static const SchemaQuery Query_for_list_of_truncatables = {
866 .catname =
"pg_catalog.pg_class c",
871 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
872 .namespace =
"c.relnamespace",
873 .result =
"c.relname",
877#define Query_for_list_of_grantables Query_for_list_of_selectables
880static const SchemaQuery Query_for_list_of_analyzables = {
881 .catname =
"pg_catalog.pg_class c",
887 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
888 .namespace =
"c.relnamespace",
889 .result =
"c.relname",
893static const SchemaQuery Query_for_list_of_indexables = {
894 .catname =
"pg_catalog.pg_class c",
899 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
900 .namespace =
"c.relnamespace",
901 .result =
"c.relname",
908#define Query_for_list_of_vacuumables Query_for_list_of_indexables
911static const SchemaQuery Query_for_list_of_clusterables = {
912 .catname =
"pg_catalog.pg_class c",
917 .viscondition =
"pg_catalog.pg_table_is_visible(c.oid)",
918 .namespace =
"c.relnamespace",
919 .result =
"c.relname",
922static const SchemaQuery Query_for_list_of_constraints_with_schema = {
923 .catname =
"pg_catalog.pg_constraint c",
924 .selcondition =
"c.conrelid <> 0",
925 .namespace =
"c.connamespace",
926 .result =
"c.conname",
929static const SchemaQuery Query_for_list_of_statistics = {
930 .catname =
"pg_catalog.pg_statistic_ext s",
931 .viscondition =
"pg_catalog.pg_statistics_obj_is_visible(s.oid)",
932 .namespace =
"s.stxnamespace",
933 .result =
"s.stxname",
936static const SchemaQuery Query_for_list_of_collations = {
937 .catname =
"pg_catalog.pg_collation c",
938 .selcondition =
"c.collencoding IN (-1, pg_catalog.pg_char_to_encoding(pg_catalog.getdatabaseencoding()))",
939 .viscondition =
"pg_catalog.pg_collation_is_visible(c.oid)",
940 .namespace =
"c.collnamespace",
941 .result =
"c.collname",
944static const SchemaQuery Query_for_partition_of_table = {
945 .catname =
"pg_catalog.pg_class c1, pg_catalog.pg_class c2, pg_catalog.pg_inherits i",
946 .selcondition =
"c1.oid=i.inhparent and i.inhrelid=c2.oid and c2.relispartition",
947 .viscondition =
"pg_catalog.pg_table_is_visible(c2.oid)",
948 .namespace =
"c2.relnamespace",
949 .result =
"c2.relname",
950 .refname =
"c1.relname",
951 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
952 .refnamespace =
"c1.relnamespace",
955static const SchemaQuery Query_for_rule_of_table = {
956 .catname =
"pg_catalog.pg_rewrite r, pg_catalog.pg_class c1",
957 .selcondition =
"r.ev_class=c1.oid",
958 .result =
"r.rulename",
959 .refname =
"c1.relname",
960 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
961 .refnamespace =
"c1.relnamespace",
964static const SchemaQuery Query_for_trigger_of_table = {
965 .catname =
"pg_catalog.pg_trigger t, pg_catalog.pg_class c1",
966 .selcondition =
"t.tgrelid=c1.oid and not t.tgisinternal",
967 .result =
"t.tgname",
968 .refname =
"c1.relname",
969 .refviscondition =
"pg_catalog.pg_table_is_visible(c1.oid)",
970 .refnamespace =
"c1.relnamespace",
993#define Query_for_list_of_template_databases \
995" FROM pg_catalog.pg_database d "\
996" WHERE d.datname LIKE '%s' "\
997" AND (d.datistemplate OR pg_catalog.pg_has_role(d.datdba, 'USAGE'))"
999#define Query_for_list_of_databases \
1000"SELECT datname FROM pg_catalog.pg_database "\
1001" WHERE datname LIKE '%s'"
1003#define Query_for_list_of_database_vars \
1004"SELECT conf FROM ("\
1005" SELECT setdatabase, pg_catalog.split_part(unnest(setconfig),'=',1) conf"\
1006" FROM pg_db_role_setting "\
1007" ) s, pg_database d "\
1008" WHERE s.setdatabase = d.oid "\
1009" AND conf LIKE '%s'"\
1010" AND d.datname LIKE '%s'"
1012#define Query_for_list_of_tablespaces \
1013"SELECT spcname FROM pg_catalog.pg_tablespace "\
1014" WHERE spcname LIKE '%s'"
1016#define Query_for_list_of_encodings \
1017" SELECT DISTINCT pg_catalog.pg_encoding_to_char(conforencoding) "\
1018" FROM pg_catalog.pg_conversion "\
1019" WHERE pg_catalog.pg_encoding_to_char(conforencoding) LIKE pg_catalog.upper('%s')"
1021#define Query_for_list_of_languages \
1023" FROM pg_catalog.pg_language "\
1024" WHERE lanname != 'internal' "\
1025" AND lanname LIKE '%s'"
1027#define Query_for_list_of_schemas \
1028"SELECT nspname FROM pg_catalog.pg_namespace "\
1029" WHERE nspname LIKE '%s'"
1032#define Query_for_list_of_alter_system_set_vars \
1033"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
1034" WHERE context != 'internal' "\
1035" AND pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
1037#define Query_for_list_of_set_vars \
1038"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
1039" WHERE context IN ('user', 'superuser') "\
1040" AND pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
1042#define Query_for_list_of_show_vars \
1043"SELECT pg_catalog.lower(name) FROM pg_catalog.pg_settings "\
1044" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
1046#define Query_for_list_of_roles \
1048" FROM pg_catalog.pg_roles "\
1049" WHERE rolname LIKE '%s'"
1052#define Keywords_for_list_of_owner_roles \
1053"CURRENT_ROLE", "CURRENT_USER", "SESSION_USER"
1056#define Keywords_for_list_of_grant_roles \
1057Keywords_for_list_of_owner_roles, "PUBLIC"
1059#define Query_for_all_table_constraints \
1061" FROM pg_catalog.pg_constraint c "\
1062" WHERE c.conrelid <> 0 "\
1063" and conname LIKE '%s'"
1065#define Query_for_list_of_fdws \
1067" FROM pg_catalog.pg_foreign_data_wrapper "\
1068" WHERE fdwname LIKE '%s'"
1070#define Query_for_list_of_servers \
1072" FROM pg_catalog.pg_foreign_server "\
1073" WHERE srvname LIKE '%s'"
1075#define Query_for_list_of_user_mappings \
1077" FROM pg_catalog.pg_user_mappings "\
1078" WHERE usename LIKE '%s'"
1080#define Query_for_list_of_user_vars \
1081" SELECT pg_catalog.split_part(pg_catalog.unnest(rolconfig),'=',1) "\
1082" FROM pg_catalog.pg_roles "\
1083" WHERE rolname LIKE '%s'"
1085#define Query_for_list_of_access_methods \
1087" FROM pg_catalog.pg_am "\
1088" WHERE amname LIKE '%s'"
1090#define Query_for_list_of_index_access_methods \
1092" FROM pg_catalog.pg_am "\
1093" WHERE amname LIKE '%s' AND "\
1094" amtype=" CppAsString2(AMTYPE_INDEX)
1096#define Query_for_list_of_table_access_methods \
1098" FROM pg_catalog.pg_am "\
1099" WHERE amname LIKE '%s' AND "\
1100" amtype=" CppAsString2(AMTYPE_TABLE)
1102#define Query_for_list_of_extensions \
1104" FROM pg_catalog.pg_extension "\
1105" WHERE extname LIKE '%s'"
1107#define Query_for_list_of_available_extensions \
1109" FROM pg_catalog.pg_available_extensions "\
1110" WHERE name LIKE '%s' AND installed_version IS NULL"
1112#define Query_for_list_of_available_extension_versions \
1114" FROM pg_catalog.pg_available_extension_versions "\
1115" WHERE version LIKE '%s' AND name='%s'"
1117#define Query_for_list_of_prepared_statements \
1119" FROM pg_catalog.pg_prepared_statements "\
1120" WHERE name LIKE '%s'"
1122#define Query_for_list_of_event_triggers \
1124" FROM pg_catalog.pg_event_trigger "\
1125" WHERE evtname LIKE '%s'"
1127#define Query_for_list_of_tablesample_methods \
1129" FROM pg_catalog.pg_proc "\
1130" WHERE prorettype = 'pg_catalog.tsm_handler'::pg_catalog.regtype AND "\
1131" proargtypes[0] = 'pg_catalog.internal'::pg_catalog.regtype AND "\
1134#define Query_for_list_of_policies \
1136" FROM pg_catalog.pg_policy "\
1137" WHERE polname LIKE '%s'"
1139#define Query_for_values_of_enum_GUC \
1140" SELECT val FROM ( "\
1141" SELECT name, pg_catalog.unnest(enumvals) AS val "\
1142" FROM pg_catalog.pg_settings "\
1144" WHERE val LIKE '%s'"\
1145" and pg_catalog.lower(name)=pg_catalog.lower('%s')"
1147#define Query_for_list_of_channels \
1149" FROM pg_catalog.pg_listening_channels() AS channel "\
1150" WHERE channel LIKE '%s'"
1152#define Query_for_list_of_cursors \
1154" FROM pg_catalog.pg_cursors "\
1155" WHERE name LIKE '%s'"
1157#define Query_for_list_of_timezone_names_unquoted \
1159" FROM pg_catalog.pg_timezone_names() "\
1160" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
1162#define Query_for_list_of_timezone_names_quoted_out \
1163"SELECT pg_catalog.quote_literal(name) AS name "\
1164" FROM pg_catalog.pg_timezone_names() "\
1165" WHERE pg_catalog.lower(name) LIKE pg_catalog.lower('%s')"
1167#define Query_for_list_of_timezone_names_quoted_in \
1168"SELECT pg_catalog.quote_literal(name) AS name "\
1169" FROM pg_catalog.pg_timezone_names() "\
1170" WHERE pg_catalog.quote_literal(pg_catalog.lower(name)) LIKE pg_catalog.lower('%s')"
1173#define Privilege_options_of_grant_and_revoke \
1174"SELECT", "INSERT", "UPDATE", "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", \
1175"CREATE", "CONNECT", "TEMPORARY", "EXECUTE", "USAGE", "SET", "ALTER SYSTEM", \
1179#define Alter_procedure_options \
1180"DEPENDS ON EXTENSION", "EXTERNAL SECURITY", "NO DEPENDS ON EXTENSION", \
1181"OWNER TO", "RENAME TO", "RESET", "SECURITY", "SET"
1184#define Alter_routine_options \
1185Alter_procedure_options, "COST", "IMMUTABLE", "LEAKPROOF", "NOT LEAKPROOF", \
1186"PARALLEL", "ROWS", "STABLE", "VOLATILE"
1189#define Alter_function_options \
1190Alter_routine_options, "CALLED ON NULL INPUT", "RETURNS NULL ON NULL INPUT", \
1199static const VersionedQuery Query_for_list_of_publications[] = {
1202 " FROM pg_catalog.pg_publication "
1203 " WHERE pubname LIKE '%s'"
1208static const VersionedQuery Query_for_list_of_subscriptions[] = {
1210 " SELECT s.subname "
1211 " FROM pg_catalog.pg_subscription s, pg_catalog.pg_database d "
1212 " WHERE s.subname LIKE '%s' "
1213 " AND d.datname = pg_catalog.current_database() "
1214 " AND s.subdbid = d.oid"
1220static const char *
const sql_commands[] = {
1221 "ABORT",
"ALTER",
"ANALYZE",
"BEGIN",
"CALL",
"CHECKPOINT",
"CLOSE",
"CLUSTER",
1222 "COMMENT",
"COMMIT",
"COPY",
"CREATE",
"DEALLOCATE",
"DECLARE",
1223 "DELETE FROM",
"DISCARD",
"DO",
"DROP",
"END",
"EXECUTE",
"EXPLAIN",
1224 "FETCH",
"GRANT",
"IMPORT FOREIGN SCHEMA",
"INSERT INTO",
"LISTEN",
"LOAD",
"LOCK",
1225 "MERGE INTO",
"MOVE",
"NOTIFY",
"PREPARE",
1226 "REASSIGN",
"REFRESH MATERIALIZED VIEW",
"REINDEX",
"RELEASE",
1227 "RESET",
"REVOKE",
"ROLLBACK",
1228 "SAVEPOINT",
"SECURITY LABEL",
"SELECT",
"SET",
"SHOW",
"START",
1229 "TABLE",
"TRUNCATE",
"UNLISTEN",
"UPDATE",
"VACUUM",
"VALUES",
"WITH",
1243 const VersionedQuery *vquery;
1244 const SchemaQuery *squery;
1249#define THING_NO_CREATE (1 << 0)
1250#define THING_NO_DROP (1 << 1)
1251#define THING_NO_ALTER (1 << 2)
1252#define THING_NO_SHOW (THING_NO_CREATE | THING_NO_DROP | THING_NO_ALTER)
1255static const char *
const Keywords_for_user_thing[] = {
1260static const pgsql_thing_t words_after_create[] = {
1261 {
"ACCESS METHOD", NULL, NULL, NULL, NULL, THING_NO_ALTER},
1262 {
"AGGREGATE", NULL, NULL, Query_for_list_of_aggregates},
1263 {
"CAST", NULL, NULL, NULL},
1265 {
"COLLATION", NULL, NULL, &Query_for_list_of_collations},
1271 {
"CONFIGURATION", NULL, NULL, &Query_for_list_of_ts_configurations, NULL, THING_NO_SHOW},
1272 {
"CONVERSION",
"SELECT conname FROM pg_catalog.pg_conversion WHERE conname LIKE '%s'"},
1273 {
"DATABASE", Query_for_list_of_databases},
1274 {
"DEFAULT PRIVILEGES", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
1275 {
"DICTIONARY", NULL, NULL, &Query_for_list_of_ts_dictionaries, NULL, THING_NO_SHOW},
1276 {
"DOMAIN", NULL, NULL, &Query_for_list_of_domains},
1277 {
"EVENT TRIGGER", NULL, NULL, NULL},
1278 {
"EXTENSION", Query_for_list_of_extensions},
1279 {
"FOREIGN DATA WRAPPER", NULL, NULL, NULL},
1280 {
"FOREIGN TABLE", NULL, NULL, NULL},
1281 {
"FUNCTION", NULL, NULL, Query_for_list_of_functions},
1282 {
"GROUP", Query_for_list_of_roles},
1283 {
"INDEX", NULL, NULL, &Query_for_list_of_indexes},
1284 {
"LANGUAGE", Query_for_list_of_languages},
1285 {
"LARGE OBJECT", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
1286 {
"MATERIALIZED VIEW", NULL, NULL, &Query_for_list_of_matviews},
1287 {
"OPERATOR", NULL, NULL, NULL},
1289 {
"OR REPLACE", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
1290 {
"OWNED", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_ALTER},
1291 {
"PARSER", NULL, NULL, &Query_for_list_of_ts_parsers, NULL, THING_NO_SHOW},
1292 {
"POLICY", NULL, NULL, NULL},
1293 {
"PROCEDURE", NULL, NULL, Query_for_list_of_procedures},
1294 {
"PUBLICATION", NULL, Query_for_list_of_publications},
1295 {
"ROLE", Query_for_list_of_roles},
1296 {
"ROUTINE", NULL, NULL, &Query_for_list_of_routines, NULL, THING_NO_CREATE},
1297 {
"RULE",
"SELECT rulename FROM pg_catalog.pg_rules WHERE rulename LIKE '%s'"},
1298 {
"SCHEMA", Query_for_list_of_schemas},
1299 {
"SEQUENCE", NULL, NULL, &Query_for_list_of_sequences},
1300 {
"SERVER", Query_for_list_of_servers},
1301 {
"STATISTICS", NULL, NULL, &Query_for_list_of_statistics},
1302 {
"SUBSCRIPTION", NULL, Query_for_list_of_subscriptions},
1303 {
"SYSTEM", NULL, NULL, NULL, NULL, THING_NO_CREATE | THING_NO_DROP},
1304 {
"TABLE", NULL, NULL, &Query_for_list_of_tables},
1305 {
"TABLESPACE", Query_for_list_of_tablespaces},
1306 {
"TEMP", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
1308 {
"TEMPLATE", NULL, NULL, &Query_for_list_of_ts_templates, NULL, THING_NO_SHOW},
1309 {
"TEMPORARY", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
1311 {
"TEXT SEARCH", NULL, NULL, NULL},
1312 {
"TRANSFORM", NULL, NULL, NULL, NULL, THING_NO_ALTER},
1313 {
"TRIGGER",
"SELECT tgname FROM pg_catalog.pg_trigger WHERE tgname LIKE '%s' AND NOT tgisinternal"},
1314 {
"TYPE", NULL, NULL, &Query_for_list_of_datatypes},
1315 {
"UNIQUE", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
1317 {
"UNLOGGED", NULL, NULL, NULL, NULL, THING_NO_DROP | THING_NO_ALTER},
1319 {
"USER", Query_for_list_of_roles, NULL, NULL, Keywords_for_user_thing},
1320 {
"USER MAPPING FOR", NULL, NULL, NULL},
1321 {
"VIEW", NULL, NULL, &Query_for_list_of_views},
1343#define MatchAny NULL
1344#define MatchAnyExcept(pattern) ("!" pattern)
1351 enum TCPatternKind kind;
1353 const char *
const *words;
1357#define TCPAT(id, kind, ...) \
1358 { (id), (kind), VA_ARGS_NARGS(__VA_ARGS__), \
1359 (const char * const []) { __VA_ARGS__ } }
1361#ifdef SWITCH_CONVERSION_APPLIED
1363static const TCPattern tcpatterns[] =
1371static const char *
const table_storage_parameters[] = {
1372 "autovacuum_analyze_scale_factor",
1373 "autovacuum_analyze_threshold",
1374 "autovacuum_enabled",
1375 "autovacuum_freeze_max_age",
1376 "autovacuum_freeze_min_age",
1377 "autovacuum_freeze_table_age",
1378 "autovacuum_multixact_freeze_max_age",
1379 "autovacuum_multixact_freeze_min_age",
1380 "autovacuum_multixact_freeze_table_age",
1381 "autovacuum_vacuum_cost_delay",
1382 "autovacuum_vacuum_cost_limit",
1383 "autovacuum_vacuum_insert_scale_factor",
1384 "autovacuum_vacuum_insert_threshold",
1385 "autovacuum_vacuum_max_threshold",
1386 "autovacuum_vacuum_scale_factor",
1387 "autovacuum_vacuum_threshold",
1389 "log_autovacuum_min_duration",
1391 "toast.autovacuum_enabled",
1392 "toast.autovacuum_freeze_max_age",
1393 "toast.autovacuum_freeze_min_age",
1394 "toast.autovacuum_freeze_table_age",
1395 "toast.autovacuum_multixact_freeze_max_age",
1396 "toast.autovacuum_multixact_freeze_min_age",
1397 "toast.autovacuum_multixact_freeze_table_age",
1398 "toast.autovacuum_vacuum_cost_delay",
1399 "toast.autovacuum_vacuum_cost_limit",
1400 "toast.autovacuum_vacuum_insert_scale_factor",
1401 "toast.autovacuum_vacuum_insert_threshold",
1402 "toast.autovacuum_vacuum_max_threshold",
1403 "toast.autovacuum_vacuum_scale_factor",
1404 "toast.autovacuum_vacuum_threshold",
1405 "toast.log_autovacuum_min_duration",
1406 "toast.vacuum_index_cleanup",
1407 "toast.vacuum_max_eager_freeze_failure_rate",
1408 "toast.vacuum_truncate",
1409 "toast_tuple_target",
1410 "user_catalog_table",
1411 "vacuum_index_cleanup",
1412 "vacuum_max_eager_freeze_failure_rate",
1418static const char *
const view_optional_parameters[] = {
1426static char **psql_completion(
const char *
text,
int start,
int end);
1427static char **match_previous_words(
int pattern_id,
1429 char **previous_words,
1430 int previous_words_count);
1431static char *create_command_generator(
const char *
text,
int state);
1432static char *drop_command_generator(
const char *
text,
int state);
1433static char *alter_command_generator(
const char *
text,
int state);
1434static char *complete_from_query(
const char *
text,
int state);
1435static char *complete_from_versioned_query(
const char *
text,
int state);
1436static char *complete_from_schema_query(
const char *
text,
int state);
1437static char *complete_from_versioned_schema_query(
const char *
text,
int state);
1438static char *_complete_from_query(
const char *simple_query,
1439 const SchemaQuery *schema_query,
1443static void set_completion_reference(
const char *
word);
1444static void set_completion_reference_verbatim(
const char *
word);
1445static char *complete_from_list(
const char *
text,
int state);
1446static char *complete_from_const(
const char *
text,
int state);
1447static void append_variable_names(
char ***varnames,
int *nvars,
1448 int *maxvars,
const char *varname,
1449 const char *prefix,
const char *suffix);
1450static char **complete_from_variables(
const char *
text,
1451 const char *prefix,
const char *suffix,
bool need_value);
1452static char *complete_from_files(
const char *
text,
int state);
1454static char *pg_strdup_keyword_case(
const char *s,
const char *ref);
1456static char *make_like_pattern(
const char *
word);
1457static void parse_identifier(
const char *
ident,
1458 char **schemaname,
char **objectname,
1459 bool *schemaquoted,
bool *objectquoted);
1460static char *requote_identifier(
const char *schemaname,
const char *objectname,
1461 bool quote_schema,
bool quote_object);
1462static bool identifier_needs_quotes(
const char *
ident);
1463static PGresult *exec_query(
const char *query);
1465static char **get_previous_words(
int point,
char **buffer,
int *nwords);
1467static char *get_guctype(
const char *varname);
1469#ifdef USE_FILENAME_QUOTING_FUNCTIONS
1470static char *quote_file_name(
char *fname,
int match_type,
char *quote_pointer);
1471static char *dequote_file_name(
char *fname,
int quote_char);
1482 rl_attempted_completion_function = psql_completion;
1484#ifdef USE_FILENAME_QUOTING_FUNCTIONS
1485 rl_filename_quoting_function = quote_file_name;
1486 rl_filename_dequoting_function = dequote_file_name;
1489 rl_basic_word_break_characters = WORD_BREAKS;
1498 rl_completer_quote_characters =
"'";
1506#ifdef HAVE_RL_FILENAME_QUOTE_CHARACTERS
1508 unsigned char *fqc = (
unsigned char *)
pg_malloc(256);
1510 for (
int i = 0;
i < 255;
i++)
1511 fqc[
i] = (
unsigned char) (
i + 1);
1513 rl_filename_quote_characters = (
const char *) fqc;
1517 completion_max_records = 1000;
1541word_matches(
const char *pattern,
1543 bool case_sensitive)
1547#define cimatch(s1, s2, n) \
1548 (case_sensitive ? strncmp(s1, s2, n) == 0 : pg_strncasecmp(s1, s2, n) == 0)
1551 if (pattern == NULL)
1555 if (*pattern ==
'!')
1556 return !word_matches(pattern + 1,
word, case_sensitive);
1559 wordlen = strlen(
word);
1562 const char *star = NULL;
1567 while (*
c !=
'\0' && *
c !=
'|')
1577 size_t beforelen = star - pattern,
1578 afterlen =
c - star - 1;
1580 if (wordlen >= (beforelen + afterlen) &&
1581 cimatch(
word, pattern, beforelen) &&
1582 cimatch(
word + wordlen - afterlen, star + 1, afterlen))
1588 if (wordlen == (
c - pattern) &&
1589 cimatch(
word, pattern, wordlen))
1610TailMatchesArray(
bool case_sensitive,
1611 int previous_words_count,
char **previous_words,
1612 int narg,
const char *
const *
args)
1614 if (previous_words_count < narg)
1617 for (
int argno = 0; argno < narg; argno++)
1619 const char *
arg =
args[argno];
1621 if (!word_matches(
arg, previous_words[narg - argno - 1],
1633TailMatchesImpl(
bool case_sensitive,
1634 int previous_words_count,
char **previous_words,
1637 const char *argarray[64];
1642 if (previous_words_count < narg)
1645 va_start(
args, narg);
1646 for (
int argno = 0; argno < narg; argno++)
1647 argarray[argno] = va_arg(
args,
const char *);
1650 return TailMatchesArray(case_sensitive,
1651 previous_words_count, previous_words,
1660HeadMatchesArray(
bool case_sensitive,
1661 int previous_words_count,
char **previous_words,
1662 int narg,
const char *
const *
args)
1664 if (previous_words_count < narg)
1667 for (
int argno = 0; argno < narg; argno++)
1669 const char *
arg =
args[argno];
1671 if (!word_matches(
arg, previous_words[previous_words_count - argno - 1],
1683HeadMatchesImpl(
bool case_sensitive,
1684 int previous_words_count,
char **previous_words,
1687 const char *argarray[64];
1692 if (previous_words_count < narg)
1695 va_start(
args, narg);
1696 for (
int argno = 0; argno < narg; argno++)
1697 argarray[argno] = va_arg(
args,
const char *);
1700 return HeadMatchesArray(case_sensitive,
1701 previous_words_count, previous_words,
1713MatchesArray(
bool case_sensitive,
1714 int previous_words_count,
char **previous_words,
1715 int narg,
const char *
const *
args)
1717 int match_any_pos = -1;
1720 if (previous_words_count < narg - 1)
1724 for (
int argno = 0; argno < narg; argno++)
1726 const char *
arg =
args[argno];
1728 if (
arg != NULL &&
arg[0] ==
'\0')
1730 match_any_pos = argno;
1735 if (match_any_pos < 0)
1738 if (previous_words_count != narg)
1742 if (!HeadMatchesArray(case_sensitive,
1743 previous_words_count, previous_words,
1750 if (!HeadMatchesArray(case_sensitive,
1751 previous_words_count, previous_words,
1752 match_any_pos,
args))
1756 if (!TailMatchesArray(case_sensitive,
1757 previous_words_count, previous_words,
1758 narg - match_any_pos - 1,
1759 args + match_any_pos + 1))
1770MatchesImpl(
bool case_sensitive,
1771 int previous_words_count,
char **previous_words,
1774 const char *argarray[64];
1780 if (previous_words_count < narg - 1)
1783 va_start(
args, narg);
1784 for (
int argno = 0; argno < narg; argno++)
1785 argarray[argno] = va_arg(
args,
const char *);
1788 return MatchesArray(case_sensitive,
1789 previous_words_count, previous_words,
1797ends_with(
const char *s,
char c)
1799 size_t length = strlen(s);
1801 return (length > 0 && s[length - 1] ==
c);
1813psql_completion(
const char *
text,
int start,
int end)
1816 char **matches = NULL;
1822 char **previous_words;
1825 int previous_words_count;
1834#define prev_wd (previous_words[0])
1835#define prev2_wd (previous_words[1])
1836#define prev3_wd (previous_words[2])
1837#define prev4_wd (previous_words[3])
1838#define prev5_wd (previous_words[4])
1839#define prev6_wd (previous_words[5])
1840#define prev7_wd (previous_words[6])
1841#define prev8_wd (previous_words[7])
1842#define prev9_wd (previous_words[8])
1845#define TailMatches(...) \
1846 TailMatchesImpl(false, previous_words_count, previous_words, \
1847 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1850#define TailMatchesCS(...) \
1851 TailMatchesImpl(true, previous_words_count, previous_words, \
1852 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1855#define Matches(...) \
1856 MatchesImpl(false, previous_words_count, previous_words, \
1857 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1860#define MatchesCS(...) \
1861 MatchesImpl(true, previous_words_count, previous_words, \
1862 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1865#define HeadMatches(...) \
1866 HeadMatchesImpl(false, previous_words_count, previous_words, \
1867 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1870#define HeadMatchesCS(...) \
1871 HeadMatchesImpl(true, previous_words_count, previous_words, \
1872 VA_ARGS_NARGS(__VA_ARGS__), __VA_ARGS__)
1875 static const char *
const backslash_commands[] = {
1877 "\\bind",
"\\bind_named",
1878 "\\connect",
"\\conninfo",
"\\C",
"\\cd",
"\\close",
"\\copy",
1879 "\\copyright",
"\\crosstabview",
1880 "\\d",
"\\da",
"\\dA",
"\\dAc",
"\\dAf",
"\\dAo",
"\\dAp",
1881 "\\db",
"\\dc",
"\\dconfig",
"\\dC",
"\\dd",
"\\ddp",
"\\dD",
1882 "\\des",
"\\det",
"\\deu",
"\\dew",
"\\dE",
"\\df",
1883 "\\dF",
"\\dFd",
"\\dFp",
"\\dFt",
"\\dg",
"\\di",
"\\dl",
"\\dL",
1884 "\\dm",
"\\dn",
"\\do",
"\\dO",
"\\dp",
"\\dP",
"\\dPi",
"\\dPt",
1885 "\\drds",
"\\drg",
"\\dRs",
"\\dRp",
"\\ds",
1886 "\\dt",
"\\dT",
"\\dv",
"\\du",
"\\dx",
"\\dX",
"\\dy",
1887 "\\echo",
"\\edit",
"\\ef",
"\\elif",
"\\else",
"\\encoding",
1888 "\\endif",
"\\endpipeline",
"\\errverbose",
"\\ev",
1889 "\\f",
"\\flush",
"\\flushrequest",
1890 "\\g",
"\\gdesc",
"\\getenv",
"\\getresults",
"\\gexec",
"\\gset",
"\\gx",
1892 "\\if",
"\\include",
"\\include_relative",
"\\ir",
1893 "\\list",
"\\lo_import",
"\\lo_export",
"\\lo_list",
"\\lo_unlink",
1895 "\\parse",
"\\password",
"\\print",
"\\prompt",
"\\pset",
1896 "\\qecho",
"\\quit",
1898 "\\s",
"\\sendpipeline",
"\\set",
"\\setenv",
"\\sf",
1899 "\\startpipeline",
"\\sv",
"\\syncpipeline",
1900 "\\t",
"\\T",
"\\timing",
1903 "\\warn",
"\\watch",
"\\write",
1918 completion_last_char = (end >
start) ?
text[end -
start - 1] :
'\0';
1921 rl_completion_append_character =
' ';
1924 completion_charp = NULL;
1925 completion_charpp = NULL;
1926 completion_vquery = NULL;
1927 completion_squery = NULL;
1928 completion_ref_object = NULL;
1929 completion_ref_schema = NULL;
1936 previous_words = get_previous_words(
start,
1938 &previous_words_count);
1941 if (
text[0] ==
'\\')
1942 COMPLETE_WITH_LIST_CS(backslash_commands);
1945 else if (
text[0] ==
':' &&
text[1] !=
':')
1947 if (
text[1] ==
'\'')
1948 matches = complete_from_variables(
text,
":'",
"'",
true);
1949 else if (
text[1] ==
'"')
1950 matches = complete_from_variables(
text,
":\"",
"\"",
true);
1951 else if (
text[1] ==
'{' &&
text[2] ==
'?')
1952 matches = complete_from_variables(
text,
":{?",
"}",
true);
1954 matches = complete_from_variables(
text,
":",
"",
true);
1958 else if (previous_words_count == 0)
1959 COMPLETE_WITH_LIST(sql_commands);
1964#ifdef SWITCH_CONVERSION_APPLIED
1977 for (
int tindx = 0; tindx <
lengthof(tcpatterns); tindx++)
1979 const TCPattern *tcpat = tcpatterns + tindx;
1982 switch (tcpat->kind)
1985 match = MatchesArray(
false,
1986 previous_words_count,
1988 tcpat->nwords, tcpat->words);
1991 match = MatchesArray(
true,
1992 previous_words_count,
1994 tcpat->nwords, tcpat->words);
1997 match = HeadMatchesArray(
false,
1998 previous_words_count,
2000 tcpat->nwords, tcpat->words);
2003 match = HeadMatchesArray(
true,
2004 previous_words_count,
2006 tcpat->nwords, tcpat->words);
2009 match = TailMatchesArray(
false,
2010 previous_words_count,
2012 tcpat->nwords, tcpat->words);
2015 match = TailMatchesArray(
true,
2016 previous_words_count,
2018 tcpat->nwords, tcpat->words);
2023 matches = match_previous_words(tcpat->id,
text,
start, end,
2025 previous_words_count);
2026 if (matches != NULL)
2035 matches = match_previous_words(0,
text,
start, end,
2037 previous_words_count);
2046 if (matches == NULL && previous_words_count > 0)
2048 const pgsql_thing_t *wac;
2050 for (wac = words_after_create; wac->name != NULL; wac++)
2055 COMPLETE_WITH_QUERY_LIST(wac->query,
2057 else if (wac->vquery)
2058 COMPLETE_WITH_VERSIONED_QUERY_LIST(wac->vquery,
2060 else if (wac->squery)
2061 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY_LIST(wac->squery,
2073 if (matches == NULL)
2075 COMPLETE_WITH_CONST(
true,
"");
2077 rl_completion_append_character =
'\0';
2078#ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
2079 rl_completion_suppress_quote = 1;
2084 free(previous_words);
2087 free(completion_ref_object);
2088 completion_ref_object = NULL;
2089 free(completion_ref_schema);
2090 completion_ref_schema = NULL;
2135match_previous_words(
int pattern_id,
2137 char **previous_words,
int previous_words_count)
2140 char **matches = NULL;
2153 else if (TailMatches(
"CREATE"))
2156 if (HeadMatches(
"CREATE",
"SCHEMA"))
2157 COMPLETE_WITH(
"TABLE",
"VIEW",
"INDEX",
"SEQUENCE",
"TRIGGER",
2159 "UNIQUE",
"UNLOGGED");
2161 matches = rl_completion_matches(
text, create_command_generator);
2164 else if (TailMatches(
"CREATE",
"OR",
"REPLACE"))
2165 COMPLETE_WITH(
"FUNCTION",
"PROCEDURE",
"LANGUAGE",
"RULE",
"VIEW",
2166 "AGGREGATE",
"TRANSFORM",
"TRIGGER");
2170 else if (Matches(
"DROP"))
2171 matches = rl_completion_matches(
text, drop_command_generator);
2176 else if (Matches(
"ALTER",
"TABLE"))
2177 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
2178 "ALL IN TABLESPACE");
2181 else if (Matches(
"ALTER"))
2182 matches = rl_completion_matches(
text, alter_command_generator);
2184 else if (TailMatches(
"ALL",
"IN",
"TABLESPACE", MatchAny))
2185 COMPLETE_WITH(
"SET TABLESPACE",
"OWNED BY");
2187 else if (TailMatches(
"ALL",
"IN",
"TABLESPACE", MatchAny,
"OWNED",
"BY"))
2188 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
2190 else if (TailMatches(
"ALL",
"IN",
"TABLESPACE", MatchAny,
"OWNED",
"BY", MatchAny))
2191 COMPLETE_WITH(
"SET TABLESPACE");
2193 else if (Matches(
"ALTER",
"AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny))
2196 else if (Matches(
"ALTER",
"AGGREGATE", MatchAny, MatchAny))
2198 if (ends_with(prev_wd,
')'))
2199 COMPLETE_WITH(
"OWNER TO",
"RENAME TO",
"SET SCHEMA");
2201 COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
2204 else if (Matches(
"ALTER",
"FUNCTION", MatchAny, MatchAny))
2206 if (ends_with(prev_wd,
')'))
2207 COMPLETE_WITH(Alter_function_options);
2209 COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
2212 else if (Matches(
"ALTER",
"PROCEDURE", MatchAny, MatchAny))
2214 if (ends_with(prev_wd,
')'))
2215 COMPLETE_WITH(Alter_procedure_options);
2217 COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
2220 else if (Matches(
"ALTER",
"ROUTINE", MatchAny, MatchAny))
2222 if (ends_with(prev_wd,
')'))
2223 COMPLETE_WITH(Alter_routine_options);
2225 COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
2228 else if (Matches(
"ALTER",
"FUNCTION|ROUTINE", MatchAny, MatchAny,
"PARALLEL"))
2229 COMPLETE_WITH(
"RESTRICTED",
"SAFE",
"UNSAFE");
2231 else if (Matches(
"ALTER",
"FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny,
"SECURITY") ||
2232 Matches(
"ALTER",
"FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny,
"EXTERNAL",
"SECURITY"))
2233 COMPLETE_WITH(
"DEFINER",
"INVOKER");
2235 else if (Matches(
"ALTER",
"FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny,
"RESET"))
2236 COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars,
2239 else if (Matches(
"ALTER",
"FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny,
"SET"))
2240 COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars,
2244 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny))
2245 COMPLETE_WITH(
"ADD",
"DROP",
"OWNER TO",
"RENAME TO",
"SET");
2247 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD"))
2248 COMPLETE_WITH(
"TABLES IN SCHEMA",
"TABLE");
2249 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD|SET",
"TABLE"))
2250 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
2251 else if (HeadMatches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD|SET",
"TABLE") &&
2252 ends_with(prev_wd,
','))
2253 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
2262 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny, MatchAnyN,
"WHERE"))
2264 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny, MatchAnyN,
"WHERE",
"("))
2265 COMPLETE_WITH_ATTR(prev3_wd);
2266 else if (HeadMatches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD|SET",
"TABLE") &&
2267 !TailMatches(
"WHERE",
"(*)"))
2268 COMPLETE_WITH(
",",
"WHERE (");
2269 else if (HeadMatches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD|SET",
"TABLE"))
2272 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny,
"DROP"))
2273 COMPLETE_WITH(
"TABLES IN SCHEMA",
"TABLE");
2275 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny,
"SET"))
2276 COMPLETE_WITH(
"(",
"TABLES IN SCHEMA",
"TABLE");
2277 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny,
"ADD|DROP|SET",
"TABLES",
"IN",
"SCHEMA"))
2278 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
2279 " AND nspname NOT LIKE E'pg\\\\_%%'",
2282 else if (Matches(
"ALTER",
"PUBLICATION", MatchAny, MatchAnyN,
"SET",
"("))
2283 COMPLETE_WITH(
"publish",
"publish_generated_columns",
"publish_via_partition_root");
2285 else if (Matches(
"ALTER",
"SUBSCRIPTION", MatchAny))
2286 COMPLETE_WITH(
"CONNECTION",
"ENABLE",
"DISABLE",
"OWNER TO",
2287 "RENAME TO",
"REFRESH PUBLICATION",
"SET",
"SKIP (",
2288 "ADD PUBLICATION",
"DROP PUBLICATION");
2290 else if (Matches(
"ALTER",
"SUBSCRIPTION", MatchAny, MatchAnyN,
"REFRESH",
"PUBLICATION"))
2291 COMPLETE_WITH(
"WITH (");
2293 else if (Matches(
"ALTER",
"SUBSCRIPTION", MatchAny, MatchAnyN,
"REFRESH",
"PUBLICATION",
"WITH",
"("))
2294 COMPLETE_WITH(
"copy_data");
2296 else if (Matches(
"ALTER",
"SUBSCRIPTION", MatchAny,
"SET"))
2297 COMPLETE_WITH(
"(",
"PUBLICATION");
2299 else if (Matches(
"ALTER",
"SUBSCRIPTION", MatchAny, MatchAnyN,
"SET",
"("))
2300 COMPLETE_WITH(
"binary",
"disable_on_error",
"failover",
"origin",
2301 "password_required",
"run_as_owner",
"slot_name",
2302 "streaming",
"synchronous_commit",
"two_phase");
2304 else if (Matches(
"ALTER",
"SUBSCRIPTION", MatchAny, MatchAnyN,
"SKIP",
"("))
2305 COMPLETE_WITH(
"lsn");
2307 else if (Matches(
"ALTER",
"SUBSCRIPTION", MatchAny, MatchAnyN,
"SET",
"PUBLICATION"))
2312 else if (Matches(
"ALTER",
"SUBSCRIPTION", MatchAny, MatchAnyN,
2313 "ADD|DROP|SET",
"PUBLICATION", MatchAny))
2314 COMPLETE_WITH(
"WITH (");
2316 else if (Matches(
"ALTER",
"SUBSCRIPTION", MatchAny, MatchAnyN,
2317 "ADD|DROP|SET",
"PUBLICATION", MatchAny,
"WITH",
"("))
2318 COMPLETE_WITH(
"copy_data",
"refresh");
2321 else if (Matches(
"ALTER",
"SCHEMA", MatchAny))
2322 COMPLETE_WITH(
"OWNER TO",
"RENAME TO");
2325 else if (Matches(
"ALTER",
"COLLATION", MatchAny))
2326 COMPLETE_WITH(
"OWNER TO",
"REFRESH VERSION",
"RENAME TO",
"SET SCHEMA");
2329 else if (Matches(
"ALTER",
"CONVERSION", MatchAny))
2330 COMPLETE_WITH(
"OWNER TO",
"RENAME TO",
"SET SCHEMA");
2333 else if (Matches(
"ALTER",
"DATABASE", MatchAny))
2334 COMPLETE_WITH(
"RESET",
"SET",
"OWNER TO",
"REFRESH COLLATION VERSION",
"RENAME TO",
2335 "IS_TEMPLATE",
"ALLOW_CONNECTIONS",
2336 "CONNECTION LIMIT");
2339 else if (Matches(
"ALTER",
"DATABASE", MatchAny,
"RESET"))
2341 set_completion_reference(prev2_wd);
2342 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_database_vars,
"ALL");
2346 else if (Matches(
"ALTER",
"DATABASE", MatchAny,
"SET",
"TABLESPACE"))
2347 COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
2350 else if (Matches(
"ALTER",
"EVENT",
"TRIGGER"))
2351 COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
2354 else if (Matches(
"ALTER",
"EVENT",
"TRIGGER", MatchAny))
2355 COMPLETE_WITH(
"DISABLE",
"ENABLE",
"OWNER TO",
"RENAME TO");
2358 else if (Matches(
"ALTER",
"EVENT",
"TRIGGER", MatchAny,
"ENABLE"))
2359 COMPLETE_WITH(
"REPLICA",
"ALWAYS");
2362 else if (Matches(
"ALTER",
"EXTENSION", MatchAny))
2363 COMPLETE_WITH(
"ADD",
"DROP",
"UPDATE",
"SET SCHEMA");
2366 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"ADD|DROP"))
2367 COMPLETE_WITH(
"ACCESS METHOD",
"AGGREGATE",
"CAST",
"COLLATION",
2368 "CONVERSION",
"DOMAIN",
"EVENT TRIGGER",
"FOREIGN",
2369 "FUNCTION",
"MATERIALIZED VIEW",
"OPERATOR",
2370 "LANGUAGE",
"PROCEDURE",
"ROUTINE",
"SCHEMA",
2371 "SEQUENCE",
"SERVER",
"TABLE",
"TEXT SEARCH",
2372 "TRANSFORM FOR",
"TYPE",
"VIEW");
2375 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"ADD|DROP",
"FOREIGN"))
2376 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
2379 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"ADD|DROP",
"OPERATOR"))
2380 COMPLETE_WITH(
"CLASS",
"FAMILY");
2383 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"ADD|DROP",
"TEXT",
"SEARCH"))
2384 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
2387 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"UPDATE"))
2388 COMPLETE_WITH(
"TO");
2391 else if (Matches(
"ALTER",
"EXTENSION", MatchAny,
"UPDATE",
"TO"))
2393 set_completion_reference(prev3_wd);
2394 COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions);
2398 else if (Matches(
"ALTER",
"FOREIGN"))
2399 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
2402 else if (Matches(
"ALTER",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny))
2403 COMPLETE_WITH(
"HANDLER",
"VALIDATOR",
"NO",
2404 "OPTIONS",
"OWNER TO",
"RENAME TO");
2405 else if (Matches(
"ALTER",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny,
"NO"))
2406 COMPLETE_WITH(
"HANDLER",
"VALIDATOR");
2409 else if (Matches(
"ALTER",
"FOREIGN",
"TABLE", MatchAny))
2410 COMPLETE_WITH(
"ADD",
"ALTER",
"DISABLE TRIGGER",
"DROP",
"ENABLE",
2411 "INHERIT",
"NO INHERIT",
"OPTIONS",
"OWNER TO",
2412 "RENAME",
"SET",
"VALIDATE CONSTRAINT");
2415 else if (Matches(
"ALTER",
"INDEX"))
2416 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
2417 "ALL IN TABLESPACE");
2419 else if (Matches(
"ALTER",
"INDEX", MatchAny))
2420 COMPLETE_WITH(
"ALTER COLUMN",
"OWNER TO",
"RENAME TO",
"SET",
2421 "RESET",
"ATTACH PARTITION",
2422 "DEPENDS ON EXTENSION",
"NO DEPENDS ON EXTENSION");
2423 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ATTACH"))
2424 COMPLETE_WITH(
"PARTITION");
2425 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ATTACH",
"PARTITION"))
2426 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
2428 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ALTER"))
2429 COMPLETE_WITH(
"COLUMN");
2431 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ALTER",
"COLUMN"))
2433 set_completion_reference(prev3_wd);
2434 COMPLETE_WITH_SCHEMA_QUERY_VERBATIM(Query_for_list_of_attribute_numbers);
2437 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ALTER",
"COLUMN", MatchAny))
2438 COMPLETE_WITH(
"SET STATISTICS");
2440 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET"))
2441 COMPLETE_WITH(
"STATISTICS");
2443 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"STATISTICS"))
2448 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"SET"))
2449 COMPLETE_WITH(
"(",
"TABLESPACE");
2451 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"RESET"))
2454 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"RESET",
"("))
2455 COMPLETE_WITH(
"fillfactor",
2456 "deduplicate_items",
2457 "fastupdate",
"gin_pending_list_limit",
2459 "pages_per_range",
"autosummarize"
2461 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"SET",
"("))
2462 COMPLETE_WITH(
"fillfactor =",
2463 "deduplicate_items =",
2464 "fastupdate =",
"gin_pending_list_limit =",
2466 "pages_per_range =",
"autosummarize ="
2468 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"NO",
"DEPENDS"))
2469 COMPLETE_WITH(
"ON EXTENSION");
2470 else if (Matches(
"ALTER",
"INDEX", MatchAny,
"DEPENDS"))
2471 COMPLETE_WITH(
"ON EXTENSION");
2474 else if (Matches(
"ALTER",
"LANGUAGE", MatchAny))
2475 COMPLETE_WITH(
"OWNER TO",
"RENAME TO");
2478 else if (Matches(
"ALTER",
"LARGE",
"OBJECT", MatchAny))
2479 COMPLETE_WITH(
"OWNER TO");
2482 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW"))
2483 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_matviews,
2484 "ALL IN TABLESPACE");
2487 else if (Matches(
"ALTER",
"USER|ROLE", MatchAny) &&
2488 !TailMatches(
"USER",
"MAPPING"))
2489 COMPLETE_WITH(
"BYPASSRLS",
"CONNECTION LIMIT",
"CREATEDB",
"CREATEROLE",
2490 "ENCRYPTED PASSWORD",
"INHERIT",
"LOGIN",
"NOBYPASSRLS",
2491 "NOCREATEDB",
"NOCREATEROLE",
"NOINHERIT",
2492 "NOLOGIN",
"NOREPLICATION",
"NOSUPERUSER",
"PASSWORD",
2493 "RENAME TO",
"REPLICATION",
"RESET",
"SET",
"SUPERUSER",
2494 "VALID UNTIL",
"WITH");
2497 else if (Matches(
"ALTER",
"USER|ROLE", MatchAny,
"RESET"))
2498 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_user_vars,
"ALL");
2501 else if (Matches(
"ALTER",
"USER|ROLE", MatchAny,
"WITH"))
2503 COMPLETE_WITH(
"BYPASSRLS",
"CONNECTION LIMIT",
"CREATEDB",
"CREATEROLE",
2504 "ENCRYPTED PASSWORD",
"INHERIT",
"LOGIN",
"NOBYPASSRLS",
2505 "NOCREATEDB",
"NOCREATEROLE",
"NOINHERIT",
2506 "NOLOGIN",
"NOREPLICATION",
"NOSUPERUSER",
"PASSWORD",
2507 "RENAME TO",
"REPLICATION",
"RESET",
"SET",
"SUPERUSER",
2511 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES"))
2512 COMPLETE_WITH(
"FOR",
"GRANT",
"IN SCHEMA",
"REVOKE");
2514 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"FOR"))
2515 COMPLETE_WITH(
"ROLE");
2517 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"IN"))
2518 COMPLETE_WITH(
"SCHEMA");
2520 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"FOR",
"ROLE|USER",
2522 COMPLETE_WITH(
"GRANT",
"REVOKE",
"IN SCHEMA");
2524 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"IN",
"SCHEMA",
2526 COMPLETE_WITH(
"GRANT",
"REVOKE",
"FOR ROLE");
2528 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"IN",
"SCHEMA",
2530 COMPLETE_WITH(
"ROLE");
2533 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"FOR",
"ROLE|USER",
2534 MatchAny,
"IN",
"SCHEMA", MatchAny) ||
2535 Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES",
"IN",
"SCHEMA",
2536 MatchAny,
"FOR",
"ROLE|USER", MatchAny))
2537 COMPLETE_WITH(
"GRANT",
"REVOKE");
2539 else if (Matches(
"ALTER",
"DOMAIN", MatchAny))
2540 COMPLETE_WITH(
"ADD",
"DROP",
"OWNER TO",
"RENAME",
"SET",
2541 "VALIDATE CONSTRAINT");
2543 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"ADD"))
2544 COMPLETE_WITH(
"CONSTRAINT",
"NOT NULL",
"CHECK (");
2546 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"ADD",
"CONSTRAINT", MatchAny))
2547 COMPLETE_WITH(
"NOT NULL",
"CHECK (");
2549 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"DROP"))
2550 COMPLETE_WITH(
"CONSTRAINT",
"DEFAULT",
"NOT NULL");
2552 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"DROP|RENAME|VALIDATE",
"CONSTRAINT"))
2554 set_completion_reference(prev3_wd);
2555 COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_type);
2558 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"RENAME"))
2559 COMPLETE_WITH(
"CONSTRAINT",
"TO");
2561 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"RENAME",
"CONSTRAINT", MatchAny))
2562 COMPLETE_WITH(
"TO");
2565 else if (Matches(
"ALTER",
"DOMAIN", MatchAny,
"SET"))
2566 COMPLETE_WITH(
"DEFAULT",
"NOT NULL",
"SCHEMA");
2568 else if (Matches(
"ALTER",
"SEQUENCE", MatchAny))
2569 COMPLETE_WITH(
"AS",
"INCREMENT",
"MINVALUE",
"MAXVALUE",
"RESTART",
2570 "START",
"NO",
"CACHE",
"CYCLE",
"SET",
"OWNED BY",
2571 "OWNER TO",
"RENAME TO");
2573 else if (TailMatches(
"ALTER",
"SEQUENCE", MatchAny,
"AS"))
2574 COMPLETE_WITH_CS(
"smallint",
"integer",
"bigint");
2576 else if (Matches(
"ALTER",
"SEQUENCE", MatchAny,
"NO"))
2577 COMPLETE_WITH(
"MINVALUE",
"MAXVALUE",
"CYCLE");
2579 else if (Matches(
"ALTER",
"SEQUENCE", MatchAny,
"SET"))
2580 COMPLETE_WITH(
"SCHEMA",
"LOGGED",
"UNLOGGED");
2582 else if (Matches(
"ALTER",
"SERVER", MatchAny))
2583 COMPLETE_WITH(
"VERSION",
"OPTIONS",
"OWNER TO",
"RENAME TO");
2585 else if (Matches(
"ALTER",
"SERVER", MatchAny,
"VERSION", MatchAny))
2586 COMPLETE_WITH(
"OPTIONS");
2588 else if (Matches(
"ALTER",
"SYSTEM"))
2589 COMPLETE_WITH(
"SET",
"RESET");
2590 else if (Matches(
"ALTER",
"SYSTEM",
"SET|RESET"))
2591 COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_alter_system_set_vars,
2593 else if (Matches(
"ALTER",
"SYSTEM",
"SET", MatchAny))
2594 COMPLETE_WITH(
"TO");
2596 else if (Matches(
"ALTER",
"VIEW", MatchAny))
2597 COMPLETE_WITH(
"ALTER COLUMN",
"OWNER TO",
"RENAME",
"RESET",
"SET");
2599 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"RENAME"))
2600 COMPLETE_WITH_ATTR_PLUS(prev2_wd,
"COLUMN",
"TO");
2601 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"ALTER|RENAME",
"COLUMN"))
2602 COMPLETE_WITH_ATTR(prev3_wd);
2604 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"ALTER", MatchAny) ||
2605 Matches(
"ALTER",
"VIEW", MatchAny,
"ALTER",
"COLUMN", MatchAny))
2606 COMPLETE_WITH(
"SET DEFAULT",
"DROP DEFAULT");
2608 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"RENAME", MatchAnyExcept(
"TO")))
2609 COMPLETE_WITH(
"TO");
2611 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"RENAME",
"COLUMN", MatchAnyExcept(
"TO")))
2612 COMPLETE_WITH(
"TO");
2614 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"RESET"))
2617 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"SET"))
2618 COMPLETE_WITH(
"(",
"SCHEMA");
2620 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"SET|RESET",
"("))
2621 COMPLETE_WITH_LIST(view_optional_parameters);
2622 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"SET",
"(", MatchAny))
2624 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"SET",
"(",
"check_option",
"="))
2625 COMPLETE_WITH(
"local",
"cascaded");
2626 else if (Matches(
"ALTER",
"VIEW", MatchAny,
"SET",
"(",
"security_barrier|security_invoker",
"="))
2627 COMPLETE_WITH(
"true",
"false");
2630 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny))
2631 COMPLETE_WITH(
"ALTER COLUMN",
"CLUSTER ON",
"DEPENDS ON EXTENSION",
2632 "NO DEPENDS ON EXTENSION",
"OWNER TO",
"RENAME",
2635 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"RENAME"))
2636 COMPLETE_WITH_ATTR_PLUS(prev2_wd,
"COLUMN",
"TO");
2637 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"ALTER|RENAME",
"COLUMN"))
2638 COMPLETE_WITH_ATTR(prev3_wd);
2640 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"RENAME", MatchAnyExcept(
"TO")))
2641 COMPLETE_WITH(
"TO");
2643 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"RENAME",
"COLUMN", MatchAnyExcept(
"TO")))
2644 COMPLETE_WITH(
"TO");
2646 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"SET"))
2647 COMPLETE_WITH(
"(",
"ACCESS METHOD",
"SCHEMA",
"TABLESPACE",
"WITHOUT CLUSTER");
2649 else if (Matches(
"ALTER",
"MATERIALIZED",
"VIEW", MatchAny,
"SET",
"ACCESS",
"METHOD"))
2650 COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
2653 else if (Matches(
"ALTER",
"POLICY"))
2654 COMPLETE_WITH_QUERY(Query_for_list_of_policies);
2656 else if (Matches(
"ALTER",
"POLICY", MatchAny))
2657 COMPLETE_WITH(
"ON");
2659 else if (Matches(
"ALTER",
"POLICY", MatchAny,
"ON"))
2661 set_completion_reference(prev2_wd);
2662 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
2665 else if (Matches(
"ALTER",
"POLICY", MatchAny,
"ON", MatchAny))
2666 COMPLETE_WITH(
"RENAME TO",
"TO",
"USING (",
"WITH CHECK (");
2668 else if (Matches(
"ALTER",
"POLICY", MatchAny,
"ON", MatchAny,
"TO"))
2669 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
2670 Keywords_for_list_of_grant_roles);
2672 else if (Matches(
"ALTER",
"POLICY", MatchAny,
"ON", MatchAny,
"USING"))
2675 else if (Matches(
"ALTER",
"POLICY", MatchAny,
"ON", MatchAny,
"WITH",
"CHECK"))
2679 else if (Matches(
"ALTER",
"RULE", MatchAny))
2680 COMPLETE_WITH(
"ON");
2683 else if (Matches(
"ALTER",
"RULE", MatchAny,
"ON"))
2685 set_completion_reference(prev2_wd);
2686 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
2690 else if (Matches(
"ALTER",
"RULE", MatchAny,
"ON", MatchAny))
2691 COMPLETE_WITH(
"RENAME TO");
2694 else if (Matches(
"ALTER",
"STATISTICS", MatchAny))
2695 COMPLETE_WITH(
"OWNER TO",
"RENAME TO",
"SET SCHEMA",
"SET STATISTICS");
2697 else if (Matches(
"ALTER",
"STATISTICS", MatchAny,
"SET"))
2698 COMPLETE_WITH(
"SCHEMA",
"STATISTICS");
2701 else if (Matches(
"ALTER",
"TRIGGER", MatchAny))
2702 COMPLETE_WITH(
"ON");
2704 else if (Matches(
"ALTER",
"TRIGGER", MatchAny,
"ON"))
2706 set_completion_reference(prev2_wd);
2707 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
2711 else if (Matches(
"ALTER",
"TRIGGER", MatchAny,
"ON", MatchAny))
2712 COMPLETE_WITH(
"RENAME TO",
"DEPENDS ON EXTENSION",
2713 "NO DEPENDS ON EXTENSION");
2718 else if (Matches(
"ALTER",
"TABLE", MatchAny))
2719 COMPLETE_WITH(
"ADD",
"ALTER",
"CLUSTER ON",
"DISABLE",
"DROP",
2720 "ENABLE",
"INHERIT",
"NO",
"RENAME",
"RESET",
2721 "OWNER TO",
"SET",
"VALIDATE CONSTRAINT",
2722 "REPLICA IDENTITY",
"ATTACH PARTITION",
2723 "DETACH PARTITION",
"FORCE ROW LEVEL SECURITY",
2726 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD"))
2729 COMPLETE_WITH(
"COLUMN",
"CONSTRAINT",
"CHECK",
"UNIQUE",
"PRIMARY KEY",
2730 "EXCLUDE",
"FOREIGN KEY");
2733 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"COLUMN", MatchAny) ||
2734 Matches(
"ALTER",
"TABLE", MatchAny,
"ADD", MatchAnyExcept(
"COLUMN|CONSTRAINT|CHECK|UNIQUE|PRIMARY|EXCLUDE|FOREIGN")))
2735 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
2737 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"CONSTRAINT", MatchAny))
2738 COMPLETE_WITH(
"CHECK",
"UNIQUE",
"PRIMARY KEY",
"EXCLUDE",
"FOREIGN KEY");
2740 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"PRIMARY",
"KEY") ||
2741 Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"UNIQUE") ||
2742 Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"CONSTRAINT", MatchAny,
"PRIMARY",
"KEY") ||
2743 Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"CONSTRAINT", MatchAny,
"UNIQUE"))
2744 COMPLETE_WITH(
"(",
"USING INDEX");
2746 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"PRIMARY",
"KEY",
"USING",
"INDEX"))
2748 set_completion_reference(prev6_wd);
2749 COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
2752 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"UNIQUE",
"USING",
"INDEX"))
2754 set_completion_reference(prev5_wd);
2755 COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
2758 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"CONSTRAINT", MatchAny,
2759 "PRIMARY",
"KEY",
"USING",
"INDEX"))
2761 set_completion_reference(prev8_wd);
2762 COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
2765 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ADD",
"CONSTRAINT", MatchAny,
2766 "UNIQUE",
"USING",
"INDEX"))
2768 set_completion_reference(prev7_wd);
2769 COMPLETE_WITH_SCHEMA_QUERY(Query_for_unique_index_of_table);
2772 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE"))
2773 COMPLETE_WITH(
"ALWAYS",
"REPLICA",
"ROW LEVEL SECURITY",
"RULE",
2775 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE",
"REPLICA|ALWAYS"))
2776 COMPLETE_WITH(
"RULE",
"TRIGGER");
2777 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE",
"RULE"))
2779 set_completion_reference(prev3_wd);
2780 COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
2782 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE", MatchAny,
"RULE"))
2784 set_completion_reference(prev4_wd);
2785 COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
2787 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE",
"TRIGGER"))
2789 set_completion_reference(prev3_wd);
2790 COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
2792 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ENABLE", MatchAny,
"TRIGGER"))
2794 set_completion_reference(prev4_wd);
2795 COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
2798 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"INHERIT"))
2799 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
2801 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"NO"))
2802 COMPLETE_WITH(
"FORCE ROW LEVEL SECURITY",
"INHERIT");
2804 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"NO",
"INHERIT"))
2805 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
2807 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DISABLE"))
2808 COMPLETE_WITH(
"ROW LEVEL SECURITY",
"RULE",
"TRIGGER");
2809 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DISABLE",
"RULE"))
2811 set_completion_reference(prev3_wd);
2812 COMPLETE_WITH_SCHEMA_QUERY(Query_for_rule_of_table);
2814 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DISABLE",
"TRIGGER"))
2816 set_completion_reference(prev3_wd);
2817 COMPLETE_WITH_SCHEMA_QUERY(Query_for_trigger_of_table);
2821 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER"))
2822 COMPLETE_WITH_ATTR_PLUS(prev2_wd,
"COLUMN",
"CONSTRAINT");
2825 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"RENAME"))
2826 COMPLETE_WITH_ATTR_PLUS(prev2_wd,
"COLUMN",
"CONSTRAINT",
"TO");
2827 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER|RENAME",
"COLUMN"))
2828 COMPLETE_WITH_ATTR(prev3_wd);
2831 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"RENAME", MatchAnyExcept(
"CONSTRAINT|TO")))
2832 COMPLETE_WITH(
"TO");
2835 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"RENAME",
"COLUMN|CONSTRAINT", MatchAnyExcept(
"TO")))
2836 COMPLETE_WITH(
"TO");
2839 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DROP"))
2840 COMPLETE_WITH(
"COLUMN",
"CONSTRAINT");
2842 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DROP",
"COLUMN"))
2843 COMPLETE_WITH_ATTR(prev3_wd);
2845 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER|DROP|RENAME",
"CONSTRAINT"))
2847 set_completion_reference(prev3_wd);
2848 COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_table);
2851 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"VALIDATE",
"CONSTRAINT"))
2853 set_completion_reference(prev3_wd);
2854 COMPLETE_WITH_SCHEMA_QUERY(Query_for_constraint_of_table_not_validated);
2857 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny) ||
2858 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny))
2859 COMPLETE_WITH(
"TYPE",
"SET",
"RESET",
"RESTART",
"ADD",
"DROP");
2861 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"ADD") ||
2862 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"ADD"))
2863 COMPLETE_WITH(
"GENERATED");
2865 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"ADD",
"GENERATED") ||
2866 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"ADD",
"GENERATED"))
2867 COMPLETE_WITH(
"ALWAYS",
"BY DEFAULT");
2869 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"ADD",
"GENERATED",
"ALWAYS") ||
2870 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"ADD",
"GENERATED",
"ALWAYS") ||
2871 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"ADD",
"GENERATED",
"BY",
"DEFAULT") ||
2872 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"ADD",
"GENERATED",
"BY",
"DEFAULT"))
2873 COMPLETE_WITH(
"AS IDENTITY");
2875 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET") ||
2876 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET"))
2877 COMPLETE_WITH(
"(",
"COMPRESSION",
"DATA TYPE",
"DEFAULT",
"EXPRESSION",
"GENERATED",
"NOT NULL",
2878 "STATISTICS",
"STORAGE",
2880 "INCREMENT",
"MINVALUE",
"MAXVALUE",
"START",
"NO",
"CACHE",
"CYCLE");
2882 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"(") ||
2883 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"("))
2884 COMPLETE_WITH(
"n_distinct",
"n_distinct_inherited");
2886 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"COMPRESSION") ||
2887 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"COMPRESSION"))
2888 COMPLETE_WITH(
"DEFAULT",
"PGLZ",
"LZ4");
2890 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"EXPRESSION") ||
2891 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"EXPRESSION"))
2892 COMPLETE_WITH(
"AS");
2894 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"EXPRESSION",
"AS") ||
2895 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"EXPRESSION",
"AS"))
2898 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"GENERATED") ||
2899 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"GENERATED"))
2900 COMPLETE_WITH(
"ALWAYS",
"BY DEFAULT");
2902 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"NO") ||
2903 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"NO"))
2904 COMPLETE_WITH(
"MINVALUE",
"MAXVALUE",
"CYCLE");
2906 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"STORAGE") ||
2907 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"STORAGE"))
2908 COMPLETE_WITH(
"DEFAULT",
"PLAIN",
"EXTERNAL",
"EXTENDED",
"MAIN");
2910 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"SET",
"STATISTICS") ||
2911 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"SET",
"STATISTICS"))
2916 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER",
"COLUMN", MatchAny,
"DROP") ||
2917 Matches(
"ALTER",
"TABLE", MatchAny,
"ALTER", MatchAny,
"DROP"))
2918 COMPLETE_WITH(
"DEFAULT",
"EXPRESSION",
"IDENTITY",
"NOT NULL");
2919 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"CLUSTER"))
2920 COMPLETE_WITH(
"ON");
2921 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"CLUSTER",
"ON"))
2923 set_completion_reference(prev3_wd);
2924 COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
2927 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"SET"))
2928 COMPLETE_WITH(
"(",
"ACCESS METHOD",
"LOGGED",
"SCHEMA",
2929 "TABLESPACE",
"UNLOGGED",
"WITH",
"WITHOUT");
2935 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"SET",
"ACCESS",
"METHOD"))
2936 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_table_access_methods,
2943 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"SET",
"TABLESPACE"))
2944 COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
2946 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"SET",
"WITHOUT"))
2947 COMPLETE_WITH(
"CLUSTER",
"OIDS");
2949 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"RESET"))
2952 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"SET|RESET",
"("))
2953 COMPLETE_WITH_LIST(table_storage_parameters);
2954 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"REPLICA",
"IDENTITY",
"USING",
"INDEX"))
2956 set_completion_reference(prev5_wd);
2957 COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
2959 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"REPLICA",
"IDENTITY",
"USING"))
2960 COMPLETE_WITH(
"INDEX");
2961 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"REPLICA",
"IDENTITY"))
2962 COMPLETE_WITH(
"FULL",
"NOTHING",
"DEFAULT",
"USING");
2963 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"REPLICA"))
2964 COMPLETE_WITH(
"IDENTITY");
2970 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"ATTACH",
"PARTITION"))
2971 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
2973 else if (TailMatches(
"ATTACH",
"PARTITION", MatchAny))
2974 COMPLETE_WITH(
"FOR VALUES",
"DEFAULT");
2975 else if (TailMatches(
"FOR",
"VALUES"))
2976 COMPLETE_WITH(
"FROM (",
"IN (",
"WITH (");
2982 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DETACH",
"PARTITION"))
2984 set_completion_reference(prev3_wd);
2985 COMPLETE_WITH_SCHEMA_QUERY(Query_for_partition_of_table);
2987 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"DETACH",
"PARTITION", MatchAny))
2988 COMPLETE_WITH(
"CONCURRENTLY",
"FINALIZE");
2991 else if (Matches(
"ALTER",
"TABLE", MatchAny,
"OF"))
2992 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes);
2995 else if (Matches(
"ALTER",
"TABLESPACE", MatchAny))
2996 COMPLETE_WITH(
"RENAME TO",
"OWNER TO",
"SET",
"RESET");
2998 else if (Matches(
"ALTER",
"TABLESPACE", MatchAny,
"SET|RESET"))
3001 else if (Matches(
"ALTER",
"TABLESPACE", MatchAny,
"SET|RESET",
"("))
3002 COMPLETE_WITH(
"seq_page_cost",
"random_page_cost",
3003 "effective_io_concurrency",
"maintenance_io_concurrency");
3006 else if (Matches(
"ALTER",
"TEXT",
"SEARCH"))
3007 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
3008 else if (Matches(
"ALTER",
"TEXT",
"SEARCH",
"TEMPLATE|PARSER", MatchAny))
3009 COMPLETE_WITH(
"RENAME TO",
"SET SCHEMA");
3010 else if (Matches(
"ALTER",
"TEXT",
"SEARCH",
"DICTIONARY", MatchAny))
3011 COMPLETE_WITH(
"(",
"OWNER TO",
"RENAME TO",
"SET SCHEMA");
3012 else if (Matches(
"ALTER",
"TEXT",
"SEARCH",
"CONFIGURATION", MatchAny))
3013 COMPLETE_WITH(
"ADD MAPPING FOR",
"ALTER MAPPING",
3015 "OWNER TO",
"RENAME TO",
"SET SCHEMA");
3018 else if (Matches(
"ALTER",
"TYPE", MatchAny))
3019 COMPLETE_WITH(
"ADD ATTRIBUTE",
"ADD VALUE",
"ALTER ATTRIBUTE",
3021 "OWNER TO",
"RENAME",
"SET SCHEMA",
"SET (");
3023 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"ADD"))
3024 COMPLETE_WITH(
"ATTRIBUTE",
"VALUE");
3026 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"RENAME"))
3027 COMPLETE_WITH(
"ATTRIBUTE",
"TO",
"VALUE");
3029 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"RENAME",
"ATTRIBUTE|VALUE", MatchAny))
3030 COMPLETE_WITH(
"TO");
3032 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"RENAME",
"ATTRIBUTE", MatchAny,
"TO", MatchAny))
3033 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3039 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"ALTER|DROP|RENAME",
"ATTRIBUTE"))
3040 COMPLETE_WITH_ATTR(prev3_wd);
3042 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"ADD",
"ATTRIBUTE", MatchAny))
3043 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
3045 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"ADD",
"ATTRIBUTE", MatchAny, MatchAny))
3046 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3048 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"DROP",
"ATTRIBUTE", MatchAny))
3049 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3051 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"ALTER",
"ATTRIBUTE", MatchAny))
3052 COMPLETE_WITH(
"TYPE");
3054 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"ALTER",
"ATTRIBUTE", MatchAny,
"TYPE", MatchAny))
3055 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
3057 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"RENAME",
"VALUE"))
3058 COMPLETE_WITH_ENUM_VALUE(prev3_wd);
3060 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"SET"))
3061 COMPLETE_WITH(
"(",
"SCHEMA");
3063 else if (Matches(
"ALTER",
"TYPE", MatchAny,
"SET",
"("))
3064 COMPLETE_WITH(
"ANALYZE",
"RECEIVE",
"SEND",
"STORAGE",
"SUBSCRIPT",
3065 "TYPMOD_IN",
"TYPMOD_OUT");
3068 else if (Matches(
"ALTER",
"GROUP", MatchAny))
3069 COMPLETE_WITH(
"ADD USER",
"DROP USER",
"RENAME TO");
3071 else if (Matches(
"ALTER",
"GROUP", MatchAny,
"ADD|DROP"))
3072 COMPLETE_WITH(
"USER");
3074 else if (Matches(
"ALTER",
"GROUP", MatchAny,
"ADD|DROP",
"USER"))
3075 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
3081 else if (Matches(
"ANALYZE"))
3082 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_analyzables,
3083 "(",
"VERBOSE",
"ONLY");
3084 else if (Matches(
"ANALYZE",
"VERBOSE"))
3085 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_analyzables,
3087 else if (HeadMatches(
"ANALYZE",
"(*") &&
3088 !HeadMatches(
"ANALYZE",
"(*)"))
3095 if (ends_with(prev_wd,
'(') || ends_with(prev_wd,
','))
3096 COMPLETE_WITH(
"VERBOSE",
"SKIP_LOCKED",
"BUFFER_USAGE_LIMIT");
3097 else if (TailMatches(
"VERBOSE|SKIP_LOCKED"))
3098 COMPLETE_WITH(
"ON",
"OFF");
3100 else if (Matches(
"ANALYZE", MatchAnyN,
"("))
3102 COMPLETE_WITH_ATTR(prev2_wd);
3103 else if (HeadMatches(
"ANALYZE"))
3104 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_analyzables);
3107 else if (Matches(
"BEGIN"))
3108 COMPLETE_WITH(
"WORK",
"TRANSACTION",
"ISOLATION LEVEL",
"READ",
"DEFERRABLE",
"NOT DEFERRABLE");
3110 else if (Matches(
"END|ABORT"))
3111 COMPLETE_WITH(
"AND",
"WORK",
"TRANSACTION");
3113 else if (Matches(
"COMMIT"))
3114 COMPLETE_WITH(
"AND",
"WORK",
"TRANSACTION",
"PREPARED");
3116 else if (Matches(
"RELEASE"))
3117 COMPLETE_WITH(
"SAVEPOINT");
3119 else if (Matches(
"ROLLBACK"))
3120 COMPLETE_WITH(
"AND",
"WORK",
"TRANSACTION",
"TO SAVEPOINT",
"PREPARED");
3121 else if (Matches(
"ABORT|END|COMMIT|ROLLBACK",
"AND"))
3122 COMPLETE_WITH(
"CHAIN");
3124 else if (Matches(
"CALL"))
3125 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures);
3126 else if (Matches(
"CALL", MatchAny))
3129 else if (Matches(
"CLOSE"))
3130 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
3133 else if (Matches(
"CLUSTER"))
3134 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_clusterables,
3136 else if (Matches(
"CLUSTER",
"VERBOSE") ||
3137 Matches(
"CLUSTER",
"(*)"))
3138 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_clusterables);
3140 else if (Matches(
"CLUSTER", MatchAnyExcept(
"VERBOSE|ON|(|(*)")))
3141 COMPLETE_WITH(
"USING");
3143 else if (Matches(
"CLUSTER",
"VERBOSE|(*)", MatchAny))
3144 COMPLETE_WITH(
"USING");
3146 else if (Matches(
"CLUSTER", MatchAny,
"USING") ||
3147 Matches(
"CLUSTER",
"VERBOSE|(*)", MatchAny,
"USING"))
3149 set_completion_reference(prev2_wd);
3150 COMPLETE_WITH_SCHEMA_QUERY(Query_for_index_of_table);
3152 else if (HeadMatches(
"CLUSTER",
"(*") &&
3153 !HeadMatches(
"CLUSTER",
"(*)"))
3160 if (ends_with(prev_wd,
'(') || ends_with(prev_wd,
','))
3161 COMPLETE_WITH(
"VERBOSE");
3165 else if (Matches(
"COMMENT"))
3166 COMPLETE_WITH(
"ON");
3167 else if (Matches(
"COMMENT",
"ON"))
3168 COMPLETE_WITH(
"ACCESS METHOD",
"AGGREGATE",
"CAST",
"COLLATION",
3169 "COLUMN",
"CONSTRAINT",
"CONVERSION",
"DATABASE",
3170 "DOMAIN",
"EXTENSION",
"EVENT TRIGGER",
3171 "FOREIGN DATA WRAPPER",
"FOREIGN TABLE",
3172 "FUNCTION",
"INDEX",
"LANGUAGE",
"LARGE OBJECT",
3173 "MATERIALIZED VIEW",
"OPERATOR",
"POLICY",
3174 "PROCEDURE",
"PROCEDURAL LANGUAGE",
"PUBLICATION",
"ROLE",
3175 "ROUTINE",
"RULE",
"SCHEMA",
"SEQUENCE",
"SERVER",
3176 "STATISTICS",
"SUBSCRIPTION",
"TABLE",
3177 "TABLESPACE",
"TEXT SEARCH",
"TRANSFORM FOR",
3178 "TRIGGER",
"TYPE",
"VIEW");
3179 else if (Matches(
"COMMENT",
"ON",
"ACCESS",
"METHOD"))
3180 COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
3181 else if (Matches(
"COMMENT",
"ON",
"CONSTRAINT"))
3182 COMPLETE_WITH_QUERY(Query_for_all_table_constraints);
3183 else if (Matches(
"COMMENT",
"ON",
"CONSTRAINT", MatchAny))
3184 COMPLETE_WITH(
"ON");
3185 else if (Matches(
"COMMENT",
"ON",
"CONSTRAINT", MatchAny,
"ON"))
3187 set_completion_reference(prev2_wd);
3188 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables_for_constraint,
3191 else if (Matches(
"COMMENT",
"ON",
"CONSTRAINT", MatchAny,
"ON",
"DOMAIN"))
3192 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
3193 else if (Matches(
"COMMENT",
"ON",
"EVENT",
"TRIGGER"))
3194 COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
3195 else if (Matches(
"COMMENT",
"ON",
"FOREIGN"))
3196 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
3197 else if (Matches(
"COMMENT",
"ON",
"FOREIGN",
"TABLE"))
3198 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
3199 else if (Matches(
"COMMENT",
"ON",
"MATERIALIZED",
"VIEW"))
3200 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
3201 else if (Matches(
"COMMENT",
"ON",
"POLICY"))
3202 COMPLETE_WITH_QUERY(Query_for_list_of_policies);
3203 else if (Matches(
"COMMENT",
"ON",
"POLICY", MatchAny))
3204 COMPLETE_WITH(
"ON");
3205 else if (Matches(
"COMMENT",
"ON",
"POLICY", MatchAny,
"ON"))
3207 set_completion_reference(prev2_wd);
3208 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
3210 else if (Matches(
"COMMENT",
"ON",
"PROCEDURAL",
"LANGUAGE"))
3211 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
3212 else if (Matches(
"COMMENT",
"ON",
"RULE", MatchAny))
3213 COMPLETE_WITH(
"ON");
3214 else if (Matches(
"COMMENT",
"ON",
"RULE", MatchAny,
"ON"))
3216 set_completion_reference(prev2_wd);
3217 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
3219 else if (Matches(
"COMMENT",
"ON",
"TEXT",
"SEARCH"))
3220 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
3221 else if (Matches(
"COMMENT",
"ON",
"TEXT",
"SEARCH",
"CONFIGURATION"))
3222 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_configurations);
3223 else if (Matches(
"COMMENT",
"ON",
"TEXT",
"SEARCH",
"DICTIONARY"))
3224 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_dictionaries);
3225 else if (Matches(
"COMMENT",
"ON",
"TEXT",
"SEARCH",
"PARSER"))
3226 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_parsers);
3227 else if (Matches(
"COMMENT",
"ON",
"TEXT",
"SEARCH",
"TEMPLATE"))
3228 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_templates);
3229 else if (Matches(
"COMMENT",
"ON",
"TRANSFORM",
"FOR"))
3230 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
3231 else if (Matches(
"COMMENT",
"ON",
"TRANSFORM",
"FOR", MatchAny))
3232 COMPLETE_WITH(
"LANGUAGE");
3233 else if (Matches(
"COMMENT",
"ON",
"TRANSFORM",
"FOR", MatchAny,
"LANGUAGE"))
3235 set_completion_reference(prev2_wd);
3236 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
3238 else if (Matches(
"COMMENT",
"ON",
"TRIGGER", MatchAny))
3239 COMPLETE_WITH(
"ON");
3240 else if (Matches(
"COMMENT",
"ON",
"TRIGGER", MatchAny,
"ON"))
3242 set_completion_reference(prev2_wd);
3243 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
3245 else if (Matches(
"COMMENT",
"ON", MatchAny, MatchAnyExcept(
"IS")) ||
3246 Matches(
"COMMENT",
"ON", MatchAny, MatchAny, MatchAnyExcept(
"IS")) ||
3247 Matches(
"COMMENT",
"ON", MatchAny, MatchAny, MatchAny, MatchAnyExcept(
"IS")) ||
3248 Matches(
"COMMENT",
"ON", MatchAny, MatchAny, MatchAny, MatchAny, MatchAnyExcept(
"IS")))
3249 COMPLETE_WITH(
"IS");
3257 else if (Matches(
"COPY|\\copy"))
3258 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
"(");
3260 else if (Matches(
"COPY|\\copy",
"("))
3261 COMPLETE_WITH(
"SELECT",
"TABLE",
"VALUES",
"INSERT INTO",
"UPDATE",
"DELETE FROM",
"MERGE INTO",
"WITH");
3263 else if (Matches(
"COPY|\\copy", MatchAny))
3264 COMPLETE_WITH(
"FROM",
"TO");
3266 else if (Matches(
"COPY", MatchAny,
"FROM|TO"))
3268 completion_charp =
"";
3269 completion_force_quote =
true;
3270 matches = rl_completion_matches(
text, complete_from_files);
3272 else if (Matches(
"\\copy", MatchAny,
"FROM|TO"))
3274 completion_charp =
"";
3275 completion_force_quote =
false;
3276 matches = rl_completion_matches(
text, complete_from_files);
3280 else if (Matches(
"COPY|\\copy", MatchAny,
"TO", MatchAny))
3281 COMPLETE_WITH(
"WITH (");
3284 else if (Matches(
"COPY|\\copy", MatchAny,
"FROM", MatchAny))
3285 COMPLETE_WITH(
"WITH (",
"WHERE");
3288 else if (Matches(
"COPY|\\copy", MatchAny,
"FROM|TO", MatchAny,
"WITH",
"("))
3289 COMPLETE_WITH(
"FORMAT",
"FREEZE",
"DELIMITER",
"NULL",
3290 "HEADER",
"QUOTE",
"ESCAPE",
"FORCE_QUOTE",
3291 "FORCE_NOT_NULL",
"FORCE_NULL",
"ENCODING",
"DEFAULT",
3292 "ON_ERROR",
"LOG_VERBOSITY");
3295 else if (Matches(
"COPY|\\copy", MatchAny,
"FROM|TO", MatchAny,
"WITH",
"(",
"FORMAT"))
3296 COMPLETE_WITH(
"binary",
"csv",
"text");
3299 else if (Matches(
"COPY|\\copy", MatchAny,
"FROM|TO", MatchAny,
"WITH",
"(",
"ON_ERROR"))
3300 COMPLETE_WITH(
"stop",
"ignore");
3303 else if (Matches(
"COPY|\\copy", MatchAny,
"FROM|TO", MatchAny,
"WITH",
"(",
"LOG_VERBOSITY"))
3304 COMPLETE_WITH(
"silent",
"default",
"verbose");
3307 else if (Matches(
"COPY|\\copy", MatchAny,
"FROM", MatchAny,
"WITH", MatchAny))
3308 COMPLETE_WITH(
"WHERE");
3312 else if (Matches(
"CREATE",
"ACCESS",
"METHOD", MatchAny))
3313 COMPLETE_WITH(
"TYPE");
3315 else if (Matches(
"CREATE",
"ACCESS",
"METHOD", MatchAny,
"TYPE"))
3316 COMPLETE_WITH(
"INDEX",
"TABLE");
3318 else if (Matches(
"CREATE",
"ACCESS",
"METHOD", MatchAny,
"TYPE", MatchAny))
3319 COMPLETE_WITH(
"HANDLER");
3322 else if (Matches(
"CREATE",
"COLLATION", MatchAny))
3323 COMPLETE_WITH(
"(",
"FROM");
3324 else if (Matches(
"CREATE",
"COLLATION", MatchAny,
"FROM"))
3325 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations);
3326 else if (HeadMatches(
"CREATE",
"COLLATION", MatchAny,
"(*"))
3328 if (TailMatches(
"(|*,"))
3329 COMPLETE_WITH(
"LOCALE =",
"LC_COLLATE =",
"LC_CTYPE =",
3330 "PROVIDER =",
"DETERMINISTIC =");
3331 else if (TailMatches(
"PROVIDER",
"="))
3332 COMPLETE_WITH(
"libc",
"icu");
3333 else if (TailMatches(
"DETERMINISTIC",
"="))
3334 COMPLETE_WITH(
"true",
"false");
3338 else if (Matches(
"CREATE",
"DATABASE", MatchAny))
3339 COMPLETE_WITH(
"OWNER",
"TEMPLATE",
"ENCODING",
"TABLESPACE",
3340 "IS_TEMPLATE",
"STRATEGY",
3341 "ALLOW_CONNECTIONS",
"CONNECTION LIMIT",
3342 "LC_COLLATE",
"LC_CTYPE",
"LOCALE",
"OID",
3343 "LOCALE_PROVIDER",
"ICU_LOCALE");
3345 else if (Matches(
"CREATE",
"DATABASE", MatchAny,
"TEMPLATE"))
3346 COMPLETE_WITH_QUERY(Query_for_list_of_template_databases);
3347 else if (Matches(
"CREATE",
"DATABASE", MatchAny,
"STRATEGY"))
3348 COMPLETE_WITH(
"WAL_LOG",
"FILE_COPY");
3351 else if (Matches(
"CREATE",
"DOMAIN", MatchAny))
3352 COMPLETE_WITH(
"AS");
3353 else if (Matches(
"CREATE",
"DOMAIN", MatchAny,
"AS"))
3354 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
3355 else if (Matches(
"CREATE",
"DOMAIN", MatchAny,
"AS", MatchAny))
3356 COMPLETE_WITH(
"COLLATE",
"DEFAULT",
"CONSTRAINT",
3357 "NOT NULL",
"NULL",
"CHECK (");
3358 else if (Matches(
"CREATE",
"DOMAIN", MatchAny,
"COLLATE"))
3359 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations);
3363 else if (Matches(
"CREATE",
"EXTENSION"))
3364 COMPLETE_WITH_QUERY(Query_for_list_of_available_extensions);
3366 else if (Matches(
"CREATE",
"EXTENSION", MatchAny))
3367 COMPLETE_WITH(
"WITH SCHEMA",
"CASCADE",
"VERSION");
3369 else if (Matches(
"CREATE",
"EXTENSION", MatchAny,
"VERSION"))
3371 set_completion_reference(prev2_wd);
3372 COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions);
3376 else if (Matches(
"CREATE",
"FOREIGN"))
3377 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
3380 else if (Matches(
"CREATE",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny))
3381 COMPLETE_WITH(
"HANDLER",
"VALIDATOR",
"OPTIONS");
3384 else if (Matches(
"CREATE",
"FOREIGN",
"TABLE", MatchAny))
3385 COMPLETE_WITH(
"(",
"PARTITION OF");
3389 else if (TailMatches(
"CREATE",
"UNIQUE"))
3390 COMPLETE_WITH(
"INDEX");
3396 else if (TailMatches(
"CREATE|UNIQUE",
"INDEX"))
3397 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
3398 "ON",
"CONCURRENTLY");
3404 else if (TailMatches(
"INDEX|CONCURRENTLY", MatchAny,
"ON") ||
3405 TailMatches(
"INDEX|CONCURRENTLY",
"ON"))
3406 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables);
3412 else if (TailMatches(
"CREATE|UNIQUE",
"INDEX",
"CONCURRENTLY"))
3413 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
3416 else if (TailMatches(
"CREATE|UNIQUE",
"INDEX", MatchAny) ||
3417 TailMatches(
"CREATE|UNIQUE",
"INDEX",
"CONCURRENTLY", MatchAny))
3418 COMPLETE_WITH(
"ON");
3424 else if (TailMatches(
"INDEX", MatchAny,
"ON", MatchAny) ||
3425 TailMatches(
"INDEX|CONCURRENTLY",
"ON", MatchAny))
3426 COMPLETE_WITH(
"(",
"USING");
3427 else if (TailMatches(
"INDEX", MatchAny,
"ON", MatchAny,
"(") ||
3428 TailMatches(
"INDEX|CONCURRENTLY",
"ON", MatchAny,
"("))
3429 COMPLETE_WITH_ATTR(prev2_wd);
3431 else if (TailMatches(
"ON", MatchAny,
"USING", MatchAny,
"("))
3432 COMPLETE_WITH_ATTR(prev4_wd);
3434 else if (TailMatches(
"INDEX", MatchAny, MatchAny,
"ON", MatchAny,
"USING") ||
3435 TailMatches(
"INDEX", MatchAny,
"ON", MatchAny,
"USING") ||
3436 TailMatches(
"INDEX",
"ON", MatchAny,
"USING"))
3437 COMPLETE_WITH_QUERY(Query_for_list_of_index_access_methods);
3438 else if (TailMatches(
"ON", MatchAny,
"USING", MatchAny) &&
3439 !TailMatches(
"POLICY", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny) &&
3440 !TailMatches(
"FOR", MatchAny, MatchAny, MatchAny))
3444 else if (Matches(
"CREATE",
"OR"))
3445 COMPLETE_WITH(
"REPLACE");
3449 else if (Matches(
"CREATE",
"POLICY", MatchAny))
3450 COMPLETE_WITH(
"ON");
3452 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON"))
3453 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
3455 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny))
3456 COMPLETE_WITH(
"AS",
"FOR",
"TO",
"USING (",
"WITH CHECK (");
3458 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS"))
3459 COMPLETE_WITH(
"PERMISSIVE",
"RESTRICTIVE");
3465 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny))
3466 COMPLETE_WITH(
"FOR",
"TO",
"USING",
"WITH CHECK");
3468 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"FOR"))
3469 COMPLETE_WITH(
"ALL",
"SELECT",
"INSERT",
"UPDATE",
"DELETE");
3471 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"FOR",
"INSERT"))
3472 COMPLETE_WITH(
"TO",
"WITH CHECK (");
3474 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"FOR",
"SELECT|DELETE"))
3475 COMPLETE_WITH(
"TO",
"USING (");
3477 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"FOR",
"ALL|UPDATE"))
3478 COMPLETE_WITH(
"TO",
"USING (",
"WITH CHECK (");
3480 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"TO"))
3481 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
3482 Keywords_for_list_of_grant_roles);
3484 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"USING"))
3491 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"FOR"))
3492 COMPLETE_WITH(
"ALL",
"SELECT",
"INSERT",
"UPDATE",
"DELETE");
3498 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"FOR",
"INSERT"))
3499 COMPLETE_WITH(
"TO",
"WITH CHECK (");
3505 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"FOR",
"SELECT|DELETE"))
3506 COMPLETE_WITH(
"TO",
"USING (");
3512 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"FOR",
"ALL|UPDATE"))
3513 COMPLETE_WITH(
"TO",
"USING (",
"WITH CHECK (");
3519 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"TO"))
3520 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
3521 Keywords_for_list_of_grant_roles);
3527 else if (Matches(
"CREATE",
"POLICY", MatchAny,
"ON", MatchAny,
"AS", MatchAny,
"USING"))
3532 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny))
3533 COMPLETE_WITH(
"FOR TABLE",
"FOR ALL TABLES",
"FOR TABLES IN SCHEMA",
"WITH (");
3534 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR"))
3535 COMPLETE_WITH(
"TABLE",
"ALL TABLES",
"TABLES IN SCHEMA");
3536 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"ALL"))
3537 COMPLETE_WITH(
"TABLES");
3538 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"ALL",
"TABLES"))
3539 COMPLETE_WITH(
"WITH (");
3540 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"TABLES"))
3541 COMPLETE_WITH(
"IN SCHEMA");
3542 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"TABLE", MatchAny) && !ends_with(prev_wd,
','))
3543 COMPLETE_WITH(
"WHERE (",
"WITH (");
3545 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"TABLE"))
3546 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
3552 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny, MatchAnyN,
"WHERE"))
3554 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny, MatchAnyN,
"WHERE",
"("))
3555 COMPLETE_WITH_ATTR(prev3_wd);
3556 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny, MatchAnyN,
"WHERE",
"(*)"))
3557 COMPLETE_WITH(
" WITH (");
3562 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"TABLES",
"IN",
"SCHEMA"))
3563 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
3564 " AND nspname NOT LIKE E'pg\\\\_%%'",
3566 else if (Matches(
"CREATE",
"PUBLICATION", MatchAny,
"FOR",
"TABLES",
"IN",
"SCHEMA", MatchAny) && (!ends_with(prev_wd,
',')))
3567 COMPLETE_WITH(
"WITH (");
3569 else if (Matches(
"CREATE",
"PUBLICATION", MatchAnyN,
"WITH",
"("))
3570 COMPLETE_WITH(
"publish",
"publish_generated_columns",
"publish_via_partition_root");
3574 else if (Matches(
"CREATE",
"RULE", MatchAny) ||
3575 Matches(
"CREATE",
"OR",
"REPLACE",
"RULE", MatchAny))
3576 COMPLETE_WITH(
"AS ON");
3578 else if (Matches(
"CREATE",
"RULE", MatchAny,
"AS") ||
3579 Matches(
"CREATE",
"OR",
"REPLACE",
"RULE", MatchAny,
"AS"))
3580 COMPLETE_WITH(
"ON");
3586 else if (Matches(
"CREATE",
"RULE", MatchAny,
"AS",
"ON") ||
3587 Matches(
"CREATE",
"OR",
"REPLACE",
"RULE", MatchAny,
"AS",
"ON"))
3588 COMPLETE_WITH(
"SELECT",
"UPDATE",
"INSERT",
"DELETE");
3590 else if (TailMatches(
"AS",
"ON",
"SELECT|UPDATE|INSERT|DELETE"))
3591 COMPLETE_WITH(
"TO");
3593 else if (TailMatches(
"AS",
"ON",
"SELECT|UPDATE|INSERT|DELETE",
"TO"))
3594 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
3597 else if (Matches(
"CREATE",
"SCHEMA"))
3598 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas,
3600 else if (Matches(
"CREATE",
"SCHEMA",
"AUTHORIZATION") ||
3601 Matches(
"CREATE",
"SCHEMA", MatchAny,
"AUTHORIZATION"))
3602 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
3603 Keywords_for_list_of_owner_roles);
3604 else if (Matches(
"CREATE",
"SCHEMA",
"AUTHORIZATION", MatchAny) ||
3605 Matches(
"CREATE",
"SCHEMA", MatchAny,
"AUTHORIZATION", MatchAny))
3606 COMPLETE_WITH(
"CREATE",
"GRANT");
3607 else if (Matches(
"CREATE",
"SCHEMA", MatchAny))
3608 COMPLETE_WITH(
"AUTHORIZATION",
"CREATE",
"GRANT");
3611 else if (TailMatches(
"CREATE",
"SEQUENCE", MatchAny) ||
3612 TailMatches(
"CREATE",
"TEMP|TEMPORARY",
"SEQUENCE", MatchAny))
3613 COMPLETE_WITH(
"AS",
"INCREMENT BY",
"MINVALUE",
"MAXVALUE",
"NO",
3614 "CACHE",
"CYCLE",
"OWNED BY",
"START WITH");
3615 else if (TailMatches(
"CREATE",
"SEQUENCE", MatchAny,
"AS") ||
3616 TailMatches(
"CREATE",
"TEMP|TEMPORARY",
"SEQUENCE", MatchAny,
"AS"))
3617 COMPLETE_WITH_CS(
"smallint",
"integer",
"bigint");
3618 else if (TailMatches(
"CREATE",
"SEQUENCE", MatchAny,
"NO") ||
3619 TailMatches(
"CREATE",
"TEMP|TEMPORARY",
"SEQUENCE", MatchAny,
"NO"))
3620 COMPLETE_WITH(
"MINVALUE",
"MAXVALUE",
"CYCLE");
3623 else if (Matches(
"CREATE",
"SERVER", MatchAny))
3624 COMPLETE_WITH(
"TYPE",
"VERSION",
"FOREIGN DATA WRAPPER");
3627 else if (Matches(
"CREATE",
"STATISTICS", MatchAny))
3628 COMPLETE_WITH(
"(",
"ON");
3629 else if (Matches(
"CREATE",
"STATISTICS", MatchAny,
"("))
3630 COMPLETE_WITH(
"ndistinct",
"dependencies",
"mcv");
3631 else if (Matches(
"CREATE",
"STATISTICS", MatchAny,
"(*)"))
3632 COMPLETE_WITH(
"ON");
3633 else if (Matches(
"CREATE",
"STATISTICS", MatchAny, MatchAnyN,
"FROM"))
3634 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
3638 else if (TailMatches(
"CREATE",
"TEMP|TEMPORARY"))
3639 COMPLETE_WITH(
"SEQUENCE",
"TABLE",
"VIEW");
3641 else if (TailMatches(
"CREATE",
"UNLOGGED"))
3642 COMPLETE_WITH(
"TABLE",
"SEQUENCE");
3644 else if (TailMatches(
"PARTITION",
"BY"))
3645 COMPLETE_WITH(
"RANGE (",
"LIST (",
"HASH (");
3647 else if (TailMatches(
"PARTITION",
"OF"))
3648 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables);
3650 else if (TailMatches(
"PARTITION",
"OF", MatchAny))
3651 COMPLETE_WITH(
"FOR VALUES",
"DEFAULT");
3653 else if (TailMatches(
"CREATE",
"TABLE", MatchAny) ||
3654 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny))
3655 COMPLETE_WITH(
"(",
"AS",
"OF",
"PARTITION OF");
3657 else if (TailMatches(
"CREATE",
"TABLE", MatchAny,
"OF") ||
3658 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny,
"OF"))
3659 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes);
3661 else if (TailMatches(
"CREATE",
"TABLE", MatchAny,
"AS") ||
3662 TailMatches(
"CREATE",
"TABLE", MatchAny,
"(*)",
"AS") ||
3663 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny,
"AS") ||
3664 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny,
"(*)",
"AS"))
3665 COMPLETE_WITH(
"EXECUTE",
"SELECT",
"TABLE",
"VALUES",
"WITH");
3667 else if (TailMatches(
"CREATE",
"TABLE", MatchAny,
"(*)") ||
3668 TailMatches(
"CREATE",
"UNLOGGED",
"TABLE", MatchAny,
"(*)"))
3669 COMPLETE_WITH(
"AS",
"INHERITS (",
"PARTITION BY",
"USING",
"TABLESPACE",
"WITH (");
3670 else if (TailMatches(
"CREATE",
"TEMP|TEMPORARY",
"TABLE", MatchAny,
"(*)"))
3671 COMPLETE_WITH(
"AS",
"INHERITS (",
"ON COMMIT",
"PARTITION BY",
"USING",
3672 "TABLESPACE",
"WITH (");
3674 else if (TailMatches(
"CREATE",
"TABLE", MatchAny,
"(*)",
"USING") ||
3675 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny,
"(*)",
"USING"))
3676 COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
3678 else if (TailMatches(
"CREATE",
"TABLE", MatchAny,
"(*)",
"WITH",
"(") ||
3679 TailMatches(
"CREATE",
"TEMP|TEMPORARY|UNLOGGED",
"TABLE", MatchAny,
"(*)",
"WITH",
"("))
3680 COMPLETE_WITH_LIST(table_storage_parameters);
3682 else if (TailMatches(
"CREATE",
"TEMP|TEMPORARY",
"TABLE", MatchAny,
"(*)",
"ON",
"COMMIT"))
3683 COMPLETE_WITH(
"DELETE ROWS",
"DROP",
"PRESERVE ROWS");
3686 else if (Matches(
"CREATE",
"TABLESPACE", MatchAny))
3687 COMPLETE_WITH(
"OWNER",
"LOCATION");
3689 else if (Matches(
"CREATE",
"TABLESPACE", MatchAny,
"OWNER", MatchAny))
3690 COMPLETE_WITH(
"LOCATION");
3693 else if (Matches(
"CREATE",
"TEXT",
"SEARCH"))
3694 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
3695 else if (Matches(
"CREATE",
"TEXT",
"SEARCH",
"CONFIGURATION|DICTIONARY|PARSER|TEMPLATE", MatchAny))
3699 else if (Matches(
"CREATE",
"TRANSFORM") ||
3700 Matches(
"CREATE",
"OR",
"REPLACE",
"TRANSFORM"))
3701 COMPLETE_WITH(
"FOR");
3702 else if (Matches(
"CREATE",
"TRANSFORM",
"FOR") ||
3703 Matches(
"CREATE",
"OR",
"REPLACE",
"TRANSFORM",
"FOR"))
3704 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
3705 else if (Matches(
"CREATE",
"TRANSFORM",
"FOR", MatchAny) ||
3706 Matches(
"CREATE",
"OR",
"REPLACE",
"TRANSFORM",
"FOR", MatchAny))
3707 COMPLETE_WITH(
"LANGUAGE");
3708 else if (Matches(
"CREATE",
"TRANSFORM",
"FOR", MatchAny,
"LANGUAGE") ||
3709 Matches(
"CREATE",
"OR",
"REPLACE",
"TRANSFORM",
"FOR", MatchAny,
"LANGUAGE"))
3711 set_completion_reference(prev2_wd);
3712 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
3716 else if (Matches(
"CREATE",
"SUBSCRIPTION", MatchAny))
3717 COMPLETE_WITH(
"CONNECTION");
3718 else if (Matches(
"CREATE",
"SUBSCRIPTION", MatchAny,
"CONNECTION", MatchAny))
3719 COMPLETE_WITH(
"PUBLICATION");
3720 else if (Matches(
"CREATE",
"SUBSCRIPTION", MatchAny,
"CONNECTION",
3721 MatchAny,
"PUBLICATION"))
3725 else if (Matches(
"CREATE",
"SUBSCRIPTION", MatchAnyN,
"PUBLICATION", MatchAny))
3726 COMPLETE_WITH(
"WITH (");
3728 else if (Matches(
"CREATE",
"SUBSCRIPTION", MatchAnyN,
"WITH",
"("))
3729 COMPLETE_WITH(
"binary",
"connect",
"copy_data",
"create_slot",
3730 "disable_on_error",
"enabled",
"failover",
"origin",
3731 "password_required",
"run_as_owner",
"slot_name",
3732 "streaming",
"synchronous_commit",
"two_phase");
3740 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny) ||
3741 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny))
3742 COMPLETE_WITH(
"BEFORE",
"AFTER",
"INSTEAD OF");
3748 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"BEFORE|AFTER") ||
3749 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"BEFORE|AFTER"))
3750 COMPLETE_WITH(
"INSERT",
"DELETE",
"UPDATE",
"TRUNCATE");
3752 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF") ||
3753 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF"))
3754 COMPLETE_WITH(
"INSERT",
"DELETE",
"UPDATE");
3760 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"BEFORE|AFTER", MatchAny) ||
3761 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"BEFORE|AFTER", MatchAny) ||
3762 TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF", MatchAny) ||
3763 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF", MatchAny))
3764 COMPLETE_WITH(
"ON",
"OR");
3771 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"BEFORE|AFTER", MatchAny,
"ON") ||
3772 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"BEFORE|AFTER", MatchAny,
"ON"))
3773 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
3779 else if (TailMatches(
"CREATE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF", MatchAny,
"ON") ||
3780 TailMatches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAny,
"INSTEAD",
"OF", MatchAny,
"ON"))
3781 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
3782 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3784 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3788 COMPLETE_WITH(
"NOT DEFERRABLE",
"DEFERRABLE",
"INITIALLY",
3789 "REFERENCING",
"FOR",
"WHEN (",
"EXECUTE FUNCTION");
3791 COMPLETE_WITH(
"NOT DEFERRABLE",
"DEFERRABLE",
"INITIALLY",
3792 "REFERENCING",
"FOR",
"WHEN (",
"EXECUTE PROCEDURE");
3794 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3796 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3798 Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3799 "INITIALLY",
"IMMEDIATE|DEFERRED") ||
3800 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3801 "INITIALLY",
"IMMEDIATE|DEFERRED"))
3804 COMPLETE_WITH(
"REFERENCING",
"FOR",
"WHEN (",
"EXECUTE FUNCTION");
3806 COMPLETE_WITH(
"REFERENCING",
"FOR",
"WHEN (",
"EXECUTE PROCEDURE");
3808 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3810 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3812 COMPLETE_WITH(
"OLD TABLE",
"NEW TABLE");
3813 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3814 "OLD|NEW",
"TABLE") ||
3815 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3816 "OLD|NEW",
"TABLE"))
3817 COMPLETE_WITH(
"AS");
3818 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3819 "REFERENCING",
"OLD",
"TABLE",
"AS", MatchAny) ||
3820 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3821 "REFERENCING",
"OLD",
"TABLE",
"AS", MatchAny) ||
3822 Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3823 "REFERENCING",
"OLD",
"TABLE", MatchAny) ||
3824 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3825 "REFERENCING",
"OLD",
"TABLE", MatchAny))
3828 COMPLETE_WITH(
"NEW TABLE",
"FOR",
"WHEN (",
"EXECUTE FUNCTION");
3830 COMPLETE_WITH(
"NEW TABLE",
"FOR",
"WHEN (",
"EXECUTE PROCEDURE");
3832 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3833 "REFERENCING",
"NEW",
"TABLE",
"AS", MatchAny) ||
3834 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3835 "REFERENCING",
"NEW",
"TABLE",
"AS", MatchAny) ||
3836 Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3837 "REFERENCING",
"NEW",
"TABLE", MatchAny) ||
3838 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3839 "REFERENCING",
"NEW",
"TABLE", MatchAny))
3842 COMPLETE_WITH(
"OLD TABLE",
"FOR",
"WHEN (",
"EXECUTE FUNCTION");
3844 COMPLETE_WITH(
"OLD TABLE",
"FOR",
"WHEN (",
"EXECUTE PROCEDURE");
3846 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3847 "REFERENCING",
"OLD|NEW",
"TABLE",
"AS", MatchAny,
"OLD|NEW",
"TABLE",
"AS", MatchAny) ||
3848 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3849 "REFERENCING",
"OLD|NEW",
"TABLE",
"AS", MatchAny,
"OLD|NEW",
"TABLE",
"AS", MatchAny) ||
3850 Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3851 "REFERENCING",
"OLD|NEW",
"TABLE", MatchAny,
"OLD|NEW",
"TABLE",
"AS", MatchAny) ||
3852 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3853 "REFERENCING",
"OLD|NEW",
"TABLE", MatchAny,
"OLD|NEW",
"TABLE",
"AS", MatchAny) ||
3854 Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3855 "REFERENCING",
"OLD|NEW",
"TABLE",
"AS", MatchAny,
"OLD|NEW",
"TABLE", MatchAny) ||
3856 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3857 "REFERENCING",
"OLD|NEW",
"TABLE",
"AS", MatchAny,
"OLD|NEW",
"TABLE", MatchAny) ||
3858 Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3859 "REFERENCING",
"OLD|NEW",
"TABLE", MatchAny,
"OLD|NEW",
"TABLE", MatchAny) ||
3860 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3861 "REFERENCING",
"OLD|NEW",
"TABLE", MatchAny,
"OLD|NEW",
"TABLE", MatchAny))
3864 COMPLETE_WITH(
"FOR",
"WHEN (",
"EXECUTE FUNCTION");
3866 COMPLETE_WITH(
"FOR",
"WHEN (",
"EXECUTE PROCEDURE");
3868 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3870 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3872 COMPLETE_WITH(
"EACH",
"ROW",
"STATEMENT");
3873 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3875 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3877 COMPLETE_WITH(
"ROW",
"STATEMENT");
3878 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3879 "FOR",
"EACH",
"ROW|STATEMENT") ||
3880 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3881 "FOR",
"EACH",
"ROW|STATEMENT") ||
3882 Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3883 "FOR",
"ROW|STATEMENT") ||
3884 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3885 "FOR",
"ROW|STATEMENT"))
3888 COMPLETE_WITH(
"WHEN (",
"EXECUTE FUNCTION");
3890 COMPLETE_WITH(
"WHEN (",
"EXECUTE PROCEDURE");
3892 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3894 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3898 COMPLETE_WITH(
"EXECUTE FUNCTION");
3900 COMPLETE_WITH(
"EXECUTE PROCEDURE");
3907 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3909 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3913 COMPLETE_WITH(
"FUNCTION");
3915 COMPLETE_WITH(
"PROCEDURE");
3917 else if (Matches(
"CREATE",
"TRIGGER", MatchAnyN,
3918 "EXECUTE",
"FUNCTION|PROCEDURE") ||
3919 Matches(
"CREATE",
"OR",
"REPLACE",
"TRIGGER", MatchAnyN,
3920 "EXECUTE",
"FUNCTION|PROCEDURE"))
3921 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
3924 else if (Matches(
"CREATE",
"ROLE|GROUP|USER", MatchAny) &&
3925 !TailMatches(
"USER",
"MAPPING"))
3926 COMPLETE_WITH(
"ADMIN",
"BYPASSRLS",
"CONNECTION LIMIT",
"CREATEDB",
3927 "CREATEROLE",
"ENCRYPTED PASSWORD",
"IN",
"INHERIT",
3928 "LOGIN",
"NOBYPASSRLS",
3929 "NOCREATEDB",
"NOCREATEROLE",
"NOINHERIT",
3930 "NOLOGIN",
"NOREPLICATION",
"NOSUPERUSER",
"PASSWORD",
3931 "REPLICATION",
"ROLE",
"SUPERUSER",
"SYSID",
3932 "VALID UNTIL",
"WITH");
3935 else if (Matches(
"CREATE",
"ROLE|GROUP|USER", MatchAny,
"WITH"))
3937 COMPLETE_WITH(
"ADMIN",
"BYPASSRLS",
"CONNECTION LIMIT",
"CREATEDB",
3938 "CREATEROLE",
"ENCRYPTED PASSWORD",
"IN",
"INHERIT",
3939 "LOGIN",
"NOBYPASSRLS",
3940 "NOCREATEDB",
"NOCREATEROLE",
"NOINHERIT",
3941 "NOLOGIN",
"NOREPLICATION",
"NOSUPERUSER",
"PASSWORD",
3942 "REPLICATION",
"ROLE",
"SUPERUSER",
"SYSID",
3946 else if (Matches(
"CREATE",
"ROLE|USER|GROUP", MatchAny,
"IN"))
3947 COMPLETE_WITH(
"GROUP",
"ROLE");
3950 else if (Matches(
"CREATE",
"TYPE", MatchAny))
3951 COMPLETE_WITH(
"(",
"AS");
3952 else if (Matches(
"CREATE",
"TYPE", MatchAny,
"AS"))
3953 COMPLETE_WITH(
"ENUM",
"RANGE",
"(");
3954 else if (HeadMatches(
"CREATE",
"TYPE", MatchAny,
"AS",
"("))
3956 if (TailMatches(
"(|*,", MatchAny))
3957 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
3958 else if (TailMatches(
"(|*,", MatchAny, MatchAnyExcept(
"*)")))
3959 COMPLETE_WITH(
"COLLATE",
",",
")");
3961 else if (Matches(
"CREATE",
"TYPE", MatchAny,
"AS",
"ENUM|RANGE"))
3963 else if (HeadMatches(
"CREATE",
"TYPE", MatchAny,
"("))
3965 if (TailMatches(
"(|*,"))
3966 COMPLETE_WITH(
"INPUT",
"OUTPUT",
"RECEIVE",
"SEND",
3967 "TYPMOD_IN",
"TYPMOD_OUT",
"ANALYZE",
"SUBSCRIPT",
3968 "INTERNALLENGTH",
"PASSEDBYVALUE",
"ALIGNMENT",
3969 "STORAGE",
"LIKE",
"CATEGORY",
"PREFERRED",
3970 "DEFAULT",
"ELEMENT",
"DELIMITER",
3972 else if (TailMatches(
"(*|*,", MatchAnyExcept(
"*=")))
3974 else if (TailMatches(
"=", MatchAnyExcept(
"*)")))
3975 COMPLETE_WITH(
",",
")");
3977 else if (HeadMatches(
"CREATE",
"TYPE", MatchAny,
"AS",
"RANGE",
"("))
3979 if (TailMatches(
"(|*,"))
3980 COMPLETE_WITH(
"SUBTYPE",
"SUBTYPE_OPCLASS",
"COLLATION",
3981 "CANONICAL",
"SUBTYPE_DIFF",
3982 "MULTIRANGE_TYPE_NAME");
3983 else if (TailMatches(
"(*|*,", MatchAnyExcept(
"*=")))
3985 else if (TailMatches(
"=", MatchAnyExcept(
"*)")))
3986 COMPLETE_WITH(
",",
")");
3991 else if (TailMatches(
"CREATE",
"VIEW", MatchAny) ||
3992 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny))
3993 COMPLETE_WITH(
"AS",
"WITH");
3995 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"AS") ||
3996 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"AS"))
3997 COMPLETE_WITH(
"SELECT");
3999 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH") ||
4000 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH"))
4002 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH",
"(") ||
4003 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH",
"("))
4004 COMPLETE_WITH_LIST(view_optional_parameters);
4005 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH",
"(",
"check_option") ||
4006 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH",
"(",
"check_option"))
4008 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH",
"(",
"check_option",
"=") ||
4009 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH",
"(",
"check_option",
"="))
4010 COMPLETE_WITH(
"local",
"cascaded");
4012 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH",
"(*)") ||
4013 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH",
"(*)"))
4014 COMPLETE_WITH(
"AS");
4016 else if (TailMatches(
"CREATE",
"VIEW", MatchAny,
"WITH",
"(*)",
"AS") ||
4017 TailMatches(
"CREATE",
"OR",
"REPLACE",
"VIEW", MatchAny,
"WITH",
"(*)",
"AS"))
4018 COMPLETE_WITH(
"SELECT");
4021 else if (Matches(
"CREATE",
"MATERIALIZED"))
4022 COMPLETE_WITH(
"VIEW");
4024 else if (Matches(
"CREATE",
"MATERIALIZED",
"VIEW", MatchAny))
4025 COMPLETE_WITH(
"AS",
"USING");
4031 else if (Matches(
"CREATE",
"MATERIALIZED",
"VIEW", MatchAny,
"USING"))
4032 COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
4034 else if (Matches(
"CREATE",
"MATERIALIZED",
"VIEW", MatchAny,
"USING", MatchAny))
4035 COMPLETE_WITH(
"AS");
4041 else if (Matches(
"CREATE",
"MATERIALIZED",
"VIEW", MatchAny,
"AS") ||
4042 Matches(
"CREATE",
"MATERIALIZED",
"VIEW", MatchAny,
"USING", MatchAny,
"AS"))
4043 COMPLETE_WITH(
"SELECT");
4046 else if (Matches(
"CREATE",
"EVENT"))
4047 COMPLETE_WITH(
"TRIGGER");
4049 else if (Matches(
"CREATE",
"EVENT",
"TRIGGER", MatchAny))
4050 COMPLETE_WITH(
"ON");
4052 else if (Matches(
"CREATE",
"EVENT",
"TRIGGER", MatchAny,
"ON"))
4053 COMPLETE_WITH(
"ddl_command_start",
"ddl_command_end",
"login",
4054 "sql_drop",
"table_rewrite");
4061 else if (Matches(
"CREATE",
"EVENT",
"TRIGGER", MatchAny,
"ON", MatchAny))
4064 COMPLETE_WITH(
"WHEN TAG IN (",
"EXECUTE FUNCTION");
4066 COMPLETE_WITH(
"WHEN TAG IN (",
"EXECUTE PROCEDURE");
4068 else if (Matches(
"CREATE",
"EVENT",
"TRIGGER", MatchAnyN,
"WHEN|AND", MatchAny,
"IN",
"(*)"))
4071 COMPLETE_WITH(
"EXECUTE FUNCTION");
4073 COMPLETE_WITH(
"EXECUTE PROCEDURE");
4075 else if (Matches(
"CREATE",
"EVENT",
"TRIGGER", MatchAnyN,
"EXECUTE",
"FUNCTION|PROCEDURE"))
4076 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
4079 else if (Matches(
"DEALLOCATE"))
4080 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_prepared_statements,
4089 else if (Matches(
"DECLARE", MatchAny))
4090 COMPLETE_WITH(
"BINARY",
"ASENSITIVE",
"INSENSITIVE",
"SCROLL",
"NO SCROLL",
4100 else if (Matches(
"DECLARE", MatchAnyN,
"BINARY"))
4101 COMPLETE_WITH(
"ASENSITIVE",
"INSENSITIVE",
"SCROLL",
"NO SCROLL",
"CURSOR");
4102 else if (Matches(
"DECLARE", MatchAnyN,
"ASENSITIVE|INSENSITIVE"))
4103 COMPLETE_WITH(
"SCROLL",
"NO SCROLL",
"CURSOR");
4104 else if (Matches(
"DECLARE", MatchAnyN,
"SCROLL"))
4105 COMPLETE_WITH(
"CURSOR");
4107 else if (Matches(
"DECLARE", MatchAnyN,
"NO"))
4108 COMPLETE_WITH(
"SCROLL");
4114 else if (Matches(
"DECLARE", MatchAnyN,
"CURSOR"))
4115 COMPLETE_WITH(
"WITH HOLD",
"WITHOUT HOLD",
"FOR");
4117 else if (Matches(
"DECLARE", MatchAnyN,
"CURSOR",
"WITH|WITHOUT"))
4118 COMPLETE_WITH(
"HOLD");
4120 else if (Matches(
"DECLARE", MatchAnyN,
"CURSOR",
"WITH|WITHOUT",
"HOLD"))
4121 COMPLETE_WITH(
"FOR");
4125 else if (Matches(
"DELETE"))
4126 COMPLETE_WITH(
"FROM");
4128 else if (TailMatches(
"DELETE",
"FROM"))
4129 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
4131 else if (TailMatches(
"DELETE",
"FROM", MatchAny))
4132 COMPLETE_WITH(
"USING",
"WHERE");
4136 else if (Matches(
"DISCARD"))
4137 COMPLETE_WITH(
"ALL",
"PLANS",
"SEQUENCES",
"TEMP");
4140 else if (Matches(
"DO"))
4141 COMPLETE_WITH(
"LANGUAGE");
4145 else if (Matches(
"DROP",
4146 "COLLATION|CONVERSION|DOMAIN|EXTENSION|LANGUAGE|PUBLICATION|SCHEMA|SEQUENCE|SERVER|SUBSCRIPTION|STATISTICS|TABLE|TYPE|VIEW",
4148 Matches(
"DROP",
"ACCESS",
"METHOD", MatchAny) ||
4149 Matches(
"DROP",
"EVENT",
"TRIGGER", MatchAny) ||
4150 Matches(
"DROP",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny) ||
4151 Matches(
"DROP",
"FOREIGN",
"TABLE", MatchAny) ||
4152 Matches(
"DROP",
"TEXT",
"SEARCH",
"CONFIGURATION|DICTIONARY|PARSER|TEMPLATE", MatchAny))
4153 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
4154 else if (Matches(
"DROP",
"AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny) &&
4155 ends_with(prev_wd,
')'))
4156 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
4159 else if (Matches(
"DROP",
"AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny))
4161 else if (Matches(
"DROP",
"AGGREGATE|FUNCTION|PROCEDURE|ROUTINE", MatchAny,
"("))
4162 COMPLETE_WITH_FUNCTION_ARG(prev2_wd);
4163 else if (Matches(
"DROP",
"FOREIGN"))
4164 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
4165 else if (Matches(
"DROP",
"DATABASE", MatchAny))
4166 COMPLETE_WITH(
"WITH (");
4167 else if (HeadMatches(
"DROP",
"DATABASE") && (ends_with(prev_wd,
'(')))
4168 COMPLETE_WITH(
"FORCE");
4171 else if (Matches(
"DROP",
"INDEX"))
4172 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
4174 else if (Matches(
"DROP",
"INDEX",
"CONCURRENTLY"))
4175 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
4176 else if (Matches(
"DROP",
"INDEX", MatchAny))
4177 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
4178 else if (Matches(
"DROP",
"INDEX",
"CONCURRENTLY", MatchAny))
4179 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
4182 else if (Matches(
"DROP",
"MATERIALIZED"))
4183 COMPLETE_WITH(
"VIEW");
4184 else if (Matches(
"DROP",
"MATERIALIZED",
"VIEW"))
4185 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
4186 else if (Matches(
"DROP",
"MATERIALIZED",
"VIEW", MatchAny))
4187 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
4190 else if (Matches(
"DROP",
"OWNED"))
4191 COMPLETE_WITH(
"BY");
4192 else if (Matches(
"DROP",
"OWNED",
"BY"))
4193 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
4194 else if (Matches(
"DROP",
"OWNED",
"BY", MatchAny))
4195 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
4198 else if (Matches(
"DROP",
"TEXT",
"SEARCH"))
4199 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
4202 else if (Matches(
"DROP",
"TRIGGER", MatchAny))
4203 COMPLETE_WITH(
"ON");
4204 else if (Matches(
"DROP",
"TRIGGER", MatchAny,
"ON"))
4206 set_completion_reference(prev2_wd);
4207 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_trigger);
4209 else if (Matches(
"DROP",
"TRIGGER", MatchAny,
"ON", MatchAny))
4210 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
4213 else if (Matches(
"DROP",
"ACCESS"))
4214 COMPLETE_WITH(
"METHOD");
4215 else if (Matches(
"DROP",
"ACCESS",
"METHOD"))
4216 COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
4219 else if (Matches(
"DROP",
"EVENT"))
4220 COMPLETE_WITH(
"TRIGGER");
4221 else if (Matches(
"DROP",
"EVENT",
"TRIGGER"))
4222 COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
4225 else if (Matches(
"DROP",
"POLICY"))
4226 COMPLETE_WITH_QUERY(Query_for_list_of_policies);
4228 else if (Matches(
"DROP",
"POLICY", MatchAny))
4229 COMPLETE_WITH(
"ON");
4231 else if (Matches(
"DROP",
"POLICY", MatchAny,
"ON"))
4233 set_completion_reference(prev2_wd);
4234 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_policy);
4236 else if (Matches(
"DROP",
"POLICY", MatchAny,
"ON", MatchAny))
4237 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
4240 else if (Matches(
"DROP",
"RULE", MatchAny))
4241 COMPLETE_WITH(
"ON");
4242 else if (Matches(
"DROP",
"RULE", MatchAny,
"ON"))
4244 set_completion_reference(prev2_wd);
4245 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables_for_rule);
4247 else if (Matches(
"DROP",
"RULE", MatchAny,
"ON", MatchAny))
4248 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
4251 else if (Matches(
"DROP",
"TRANSFORM"))
4252 COMPLETE_WITH(
"FOR");
4253 else if (Matches(
"DROP",
"TRANSFORM",
"FOR"))
4254 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
4255 else if (Matches(
"DROP",
"TRANSFORM",
"FOR", MatchAny))
4256 COMPLETE_WITH(
"LANGUAGE");
4257 else if (Matches(
"DROP",
"TRANSFORM",
"FOR", MatchAny,
"LANGUAGE"))
4259 set_completion_reference(prev2_wd);
4260 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
4262 else if (Matches(
"DROP",
"TRANSFORM",
"FOR", MatchAny,
"LANGUAGE", MatchAny))
4263 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
4266 else if (Matches(
"EXECUTE"))
4267 COMPLETE_WITH_QUERY(Query_for_list_of_prepared_statements);
4273 else if (Matches(
"EXPLAIN"))
4274 COMPLETE_WITH(
"SELECT",
"INSERT INTO",
"DELETE FROM",
"UPDATE",
"DECLARE",
4275 "MERGE INTO",
"EXECUTE",
"ANALYZE",
"VERBOSE");
4276 else if (HeadMatches(
"EXPLAIN",
"(*") &&
4277 !HeadMatches(
"EXPLAIN",
"(*)"))
4284 if (ends_with(prev_wd,
'(') || ends_with(prev_wd,
','))
4285 COMPLETE_WITH(
"ANALYZE",
"VERBOSE",
"COSTS",
"SETTINGS",
"GENERIC_PLAN",
4286 "BUFFERS",
"SERIALIZE",
"WAL",
"TIMING",
"SUMMARY",
4287 "MEMORY",
"FORMAT");
4288 else if (TailMatches(
"ANALYZE|VERBOSE|COSTS|SETTINGS|GENERIC_PLAN|BUFFERS|WAL|TIMING|SUMMARY|MEMORY"))
4289 COMPLETE_WITH(
"ON",
"OFF");
4290 else if (TailMatches(
"SERIALIZE"))
4291 COMPLETE_WITH(
"TEXT",
"NONE",
"BINARY");
4292 else if (TailMatches(
"FORMAT"))
4293 COMPLETE_WITH(
"TEXT",
"XML",
"JSON",
"YAML");
4295 else if (Matches(
"EXPLAIN",
"ANALYZE"))
4296 COMPLETE_WITH(
"SELECT",
"INSERT INTO",
"DELETE FROM",
"UPDATE",
"DECLARE",
4297 "MERGE INTO",
"EXECUTE",
"VERBOSE");
4298 else if (Matches(
"EXPLAIN",
"(*)") ||
4299 Matches(
"EXPLAIN",
"VERBOSE") ||
4300 Matches(
"EXPLAIN",
"ANALYZE",
"VERBOSE"))
4301 COMPLETE_WITH(
"SELECT",
"INSERT INTO",
"DELETE FROM",
"UPDATE",
"DECLARE",
4302 "MERGE INTO",
"EXECUTE");
4310 else if (Matches(
"FETCH|MOVE"))
4311 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
4328 else if (Matches(
"FETCH|MOVE",
"BACKWARD|FORWARD"))
4329 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
4339 else if (Matches(
"FETCH|MOVE",
"ABSOLUTE|BACKWARD|FORWARD|RELATIVE",
4340 MatchAnyExcept(
"FROM|IN")) ||
4341 Matches(
"FETCH|MOVE",
"ALL|NEXT|PRIOR|FIRST|LAST"))
4342 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_cursors,
4346 else if (Matches(
"FETCH|MOVE", MatchAnyN,
"FROM|IN"))
4347 COMPLETE_WITH_QUERY(Query_for_list_of_cursors);
4351 else if (TailMatches(
"FOREIGN",
"DATA",
"WRAPPER") &&
4352 !TailMatches(
"CREATE", MatchAny, MatchAny, MatchAny))
4353 COMPLETE_WITH_QUERY(Query_for_list_of_fdws);
4355 else if (Matches(
"CREATE",
"SERVER", MatchAnyN,
"FOREIGN",
"DATA",
"WRAPPER", MatchAny))
4356 COMPLETE_WITH(
"OPTIONS");
4359 else if (TailMatches(
"FOREIGN",
"TABLE") &&
4360 !TailMatches(
"CREATE", MatchAny, MatchAny))
4361 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
4364 else if (TailMatches(
"FOREIGN",
"SERVER"))
4365 COMPLETE_WITH_QUERY(Query_for_list_of_servers);
4372 else if (TailMatches(
"GRANT|REVOKE") ||
4373 TailMatches(
"REVOKE",
"ADMIN|GRANT|INHERIT|SET",
"OPTION",
"FOR"))
4379 if (HeadMatches(
"ALTER",
"DEFAULT",
"PRIVILEGES"))
4381 if (TailMatches(
"GRANT") ||
4382 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR"))
4383 COMPLETE_WITH(
"SELECT",
"INSERT",
"UPDATE",
4384 "DELETE",
"TRUNCATE",
"REFERENCES",
"TRIGGER",
4385 "CREATE",
"EXECUTE",
"USAGE",
"MAINTAIN",
"ALL");
4386 else if (TailMatches(
"REVOKE"))
4387 COMPLETE_WITH(
"SELECT",
"INSERT",
"UPDATE",
4388 "DELETE",
"TRUNCATE",
"REFERENCES",
"TRIGGER",
4389 "CREATE",
"EXECUTE",
"USAGE",
"MAINTAIN",
"ALL",
4390 "GRANT OPTION FOR");
4392 else if (TailMatches(
"GRANT"))
4393 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4394 Privilege_options_of_grant_and_revoke);
4395 else if (TailMatches(
"REVOKE"))
4396 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4397 Privilege_options_of_grant_and_revoke,
4400 "INHERIT OPTION FOR",
4402 else if (TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR"))
4403 COMPLETE_WITH(Privilege_options_of_grant_and_revoke);
4404 else if (TailMatches(
"REVOKE",
"ADMIN|INHERIT|SET",
"OPTION",
"FOR"))
4405 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
4408 else if (TailMatches(
"GRANT|REVOKE",
"ALTER") ||
4409 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR",
"ALTER"))
4410 COMPLETE_WITH(
"SYSTEM");
4412 else if (TailMatches(
"REVOKE",
"SET"))
4413 COMPLETE_WITH(
"ON PARAMETER",
"OPTION FOR");
4414 else if (TailMatches(
"GRANT",
"SET") ||
4415 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR",
"SET") ||
4416 TailMatches(
"GRANT|REVOKE",
"ALTER",
"SYSTEM") ||
4417 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR",
"ALTER",
"SYSTEM"))
4418 COMPLETE_WITH(
"ON PARAMETER");
4420 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"PARAMETER") ||
4421 TailMatches(
"GRANT|REVOKE", MatchAny, MatchAny,
"ON",
"PARAMETER") ||
4422 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"PARAMETER") ||
4423 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny, MatchAny,
"ON",
"PARAMETER"))
4424 COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_alter_system_set_vars);
4426 else if (TailMatches(
"GRANT", MatchAny,
"ON",
"PARAMETER", MatchAny) ||
4427 TailMatches(
"GRANT", MatchAny, MatchAny,
"ON",
"PARAMETER", MatchAny))
4428 COMPLETE_WITH(
"TO");
4430 else if (TailMatches(
"REVOKE", MatchAny,
"ON",
"PARAMETER", MatchAny) ||
4431 TailMatches(
"REVOKE", MatchAny, MatchAny,
"ON",
"PARAMETER", MatchAny) ||
4432 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"PARAMETER", MatchAny) ||
4433 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny, MatchAny,
"ON",
"PARAMETER", MatchAny))
4434 COMPLETE_WITH(
"FROM");
4440 else if (TailMatches(
"GRANT|REVOKE", MatchAny) ||
4441 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny))
4443 if (TailMatches(
"SELECT|INSERT|UPDATE|DELETE|TRUNCATE|REFERENCES|TRIGGER|CREATE|CONNECT|TEMPORARY|TEMP|EXECUTE|USAGE|MAINTAIN|ALL"))
4444 COMPLETE_WITH(
"ON");
4445 else if (TailMatches(
"GRANT", MatchAny))
4446 COMPLETE_WITH(
"TO");
4448 COMPLETE_WITH(
"FROM");
4458 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON") ||
4459 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON"))
4465 if (HeadMatches(
"ALTER",
"DEFAULT",
"PRIVILEGES"))
4466 COMPLETE_WITH(
"TABLES",
"SEQUENCES",
"FUNCTIONS",
"PROCEDURES",
"ROUTINES",
"TYPES",
"SCHEMAS",
"LARGE OBJECTS");
4468 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_grantables,
4469 "ALL FUNCTIONS IN SCHEMA",
4470 "ALL PROCEDURES IN SCHEMA",
4471 "ALL ROUTINES IN SCHEMA",
4472 "ALL SEQUENCES IN SCHEMA",
4473 "ALL TABLES IN SCHEMA",
4476 "FOREIGN DATA WRAPPER",
4490 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"ALL") ||
4491 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"ALL"))
4492 COMPLETE_WITH(
"FUNCTIONS IN SCHEMA",
4493 "PROCEDURES IN SCHEMA",
4494 "ROUTINES IN SCHEMA",
4495 "SEQUENCES IN SCHEMA",
4496 "TABLES IN SCHEMA");
4497 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"FOREIGN") ||
4498 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"FOREIGN"))
4499 COMPLETE_WITH(
"DATA WRAPPER",
"SERVER");
4507 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON", MatchAny) ||
4508 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON", MatchAny))
4510 if (TailMatches(
"DATABASE"))
4511 COMPLETE_WITH_QUERY(Query_for_list_of_databases);
4512 else if (TailMatches(
"DOMAIN"))
4513 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
4514 else if (TailMatches(
"FUNCTION"))
4515 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
4516 else if (TailMatches(
"LANGUAGE"))
4517 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
4518 else if (TailMatches(
"PROCEDURE"))
4519 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_procedures);
4520 else if (TailMatches(
"ROUTINE"))
4521 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
4522 else if (TailMatches(
"SCHEMA"))
4523 COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
4524 else if (TailMatches(
"SEQUENCE"))
4525 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences);
4526 else if (TailMatches(
"TABLE"))
4527 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables);
4528 else if (TailMatches(
"TABLESPACE"))
4529 COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
4530 else if (TailMatches(
"TYPE"))
4531 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
4532 else if (TailMatches(
"GRANT", MatchAny, MatchAny, MatchAny))
4533 COMPLETE_WITH(
"TO");
4535 COMPLETE_WITH(
"FROM");
4542 else if (Matches(
"GRANT", MatchAnyN,
"TO") ||
4543 Matches(
"REVOKE", MatchAnyN,
"FROM"))
4544 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4545 Keywords_for_list_of_grant_roles);
4550 else if (Matches(
"GRANT", MatchAnyN,
"TO", MatchAny))
4551 COMPLETE_WITH(
"WITH ADMIN",
4554 "WITH GRANT OPTION",
4556 else if (Matches(
"GRANT", MatchAnyN,
"TO", MatchAny,
"WITH"))
4557 COMPLETE_WITH(
"ADMIN",
4561 else if (Matches(
"GRANT", MatchAnyN,
"TO", MatchAny,
"WITH",
"ADMIN|INHERIT|SET"))
4562 COMPLETE_WITH(
"OPTION",
"TRUE",
"FALSE");
4563 else if (Matches(
"GRANT", MatchAnyN,
"TO", MatchAny,
"WITH", MatchAny,
"OPTION"))
4564 COMPLETE_WITH(
"GRANTED BY");
4565 else if (Matches(
"GRANT", MatchAnyN,
"TO", MatchAny,
"WITH", MatchAny,
"OPTION",
"GRANTED",
"BY"))
4566 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4567 Keywords_for_list_of_grant_roles);
4569 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES", MatchAnyN,
"TO|FROM"))
4570 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4571 Keywords_for_list_of_grant_roles);
4573 else if (Matches(
"ALTER",
"DEFAULT",
"PRIVILEGES", MatchAnyN,
"TO", MatchAny))
4574 COMPLETE_WITH(
"WITH GRANT OPTION");
4576 else if (Matches(
"GRANT", MatchAnyN,
"ON", MatchAny, MatchAny))
4577 COMPLETE_WITH(
"TO");
4578 else if (Matches(
"REVOKE", MatchAnyN,
"ON", MatchAny, MatchAny))
4579 COMPLETE_WITH(
"FROM");
4582 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"ALL", MatchAny,
"IN",
"SCHEMA", MatchAny) ||
4583 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"ALL", MatchAny,
"IN",
"SCHEMA", MatchAny))
4585 if (TailMatches(
"GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
4586 COMPLETE_WITH(
"TO");
4588 COMPLETE_WITH(
"FROM");
4592 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny) ||
4593 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"FOREIGN",
"DATA",
"WRAPPER", MatchAny))
4595 if (TailMatches(
"GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
4596 COMPLETE_WITH(
"TO");
4598 COMPLETE_WITH(
"FROM");
4602 else if (TailMatches(
"GRANT|REVOKE", MatchAny,
"ON",
"FOREIGN",
"SERVER", MatchAny) ||
4603 TailMatches(
"REVOKE",
"GRANT",
"OPTION",
"FOR", MatchAny,
"ON",
"FOREIGN",
"SERVER", MatchAny))
4605 if (TailMatches(
"GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny))
4606 COMPLETE_WITH(
"TO");
4608 COMPLETE_WITH(
"FROM");
4612 else if (TailMatches(
"FROM", MatchAny,
"GROUP"))
4613 COMPLETE_WITH(
"BY");
4616 else if (Matches(
"IMPORT"))
4617 COMPLETE_WITH(
"FOREIGN SCHEMA");
4618 else if (Matches(
"IMPORT",
"FOREIGN"))
4619 COMPLETE_WITH(
"SCHEMA");
4620 else if (Matches(
"IMPORT",
"FOREIGN",
"SCHEMA", MatchAny))
4621 COMPLETE_WITH(
"EXCEPT (",
"FROM SERVER",
"LIMIT TO (");
4622 else if (TailMatches(
"LIMIT",
"TO",
"(*)") ||
4623 TailMatches(
"EXCEPT",
"(*)"))
4624 COMPLETE_WITH(
"FROM SERVER");
4625 else if (TailMatches(
"FROM",
"SERVER", MatchAny))
4626 COMPLETE_WITH(
"INTO");
4627 else if (TailMatches(
"FROM",
"SERVER", MatchAny,
"INTO"))
4628 COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
4629 else if (TailMatches(
"FROM",
"SERVER", MatchAny,
"INTO", MatchAny))
4630 COMPLETE_WITH(
"OPTIONS (");
4634 else if (TailMatches(
"NOT",
"MATCHED",
"THEN",
"INSERT"))
4635 COMPLETE_WITH(
"VALUES",
"(");
4637 else if (TailMatches(
"INSERT"))
4638 COMPLETE_WITH(
"INTO");
4640 else if (TailMatches(
"INSERT",
"INTO"))
4641 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
4643 else if (TailMatches(
"INSERT",
"INTO", MatchAny,
"("))
4644 COMPLETE_WITH_ATTR(prev2_wd);
4650 else if (TailMatches(
"INSERT",
"INTO", MatchAny))
4651 COMPLETE_WITH(
"(",
"DEFAULT VALUES",
"SELECT",
"TABLE",
"VALUES",
"OVERRIDING");
4657 else if (TailMatches(
"INSERT",
"INTO", MatchAny, MatchAny) &&
4658 ends_with(prev_wd,
')'))
4659 COMPLETE_WITH(
"SELECT",
"TABLE",
"VALUES",
"OVERRIDING");
4662 else if (TailMatches(
"OVERRIDING"))
4663 COMPLETE_WITH(
"SYSTEM VALUE",
"USER VALUE");
4666 else if (TailMatches(
"OVERRIDING", MatchAny,
"VALUE"))
4667 COMPLETE_WITH(
"SELECT",
"TABLE",
"VALUES");
4670 else if (TailMatches(
"VALUES") && !TailMatches(
"DEFAULT",
"VALUES"))
4675 else if (Matches(
"LOCK"))
4676 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
4678 else if (Matches(
"LOCK",
"TABLE"))
4679 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables,
4681 else if (Matches(
"LOCK",
"TABLE",
"ONLY") || Matches(
"LOCK",
"ONLY"))
4682 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
4686 else if (Matches(
"LOCK", MatchAnyExcept(
"TABLE|ONLY")) ||
4687 Matches(
"LOCK",
"TABLE", MatchAnyExcept(
"ONLY")) ||
4688 Matches(
"LOCK",
"ONLY", MatchAny) ||
4689 Matches(
"LOCK",
"TABLE",
"ONLY", MatchAny))
4690 COMPLETE_WITH(
"IN",
"NOWAIT");
4693 else if (Matches(
"LOCK", MatchAnyN,
"IN"))
4694 COMPLETE_WITH(
"ACCESS SHARE MODE",
4695 "ROW SHARE MODE",
"ROW EXCLUSIVE MODE",
4696 "SHARE UPDATE EXCLUSIVE MODE",
"SHARE MODE",
4697 "SHARE ROW EXCLUSIVE MODE",
4698 "EXCLUSIVE MODE",
"ACCESS EXCLUSIVE MODE");
4704 else if (Matches(
"LOCK", MatchAnyN,
"IN",
"ACCESS|ROW"))
4705 COMPLETE_WITH(
"EXCLUSIVE MODE",
"SHARE MODE");
4708 else if (Matches(
"LOCK", MatchAnyN,
"IN",
"SHARE"))
4709 COMPLETE_WITH(
"MODE",
"ROW EXCLUSIVE MODE",
4710 "UPDATE EXCLUSIVE MODE");
4713 else if (Matches(
"LOCK", MatchAnyN,
"MODE"))
4714 COMPLETE_WITH(
"NOWAIT");
4717 else if (TailMatches(
"MERGE"))
4718 COMPLETE_WITH(
"INTO");
4719 else if (TailMatches(
"MERGE",
"INTO"))
4720 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_mergetargets);
4723 else if (TailMatches(
"MERGE",
"INTO", MatchAny))
4724 COMPLETE_WITH(
"USING",
"AS");
4725 else if (TailMatches(
"MERGE",
"INTO", MatchAny,
"AS", MatchAny) ||
4726 TailMatches(
"MERGE",
"INTO", MatchAny, MatchAnyExcept(
"USING|AS")))
4727 COMPLETE_WITH(
"USING");
4733 else if (TailMatches(
"MERGE",
"INTO", MatchAny,
"USING") ||
4734 TailMatches(
"MERGE",
"INTO", MatchAny,
"AS", MatchAny,
"USING") ||
4735 TailMatches(
"MERGE",
"INTO", MatchAny, MatchAny,
"USING"))
4736 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
4742 else if (TailMatches(
"MERGE",
"INTO", MatchAny,
"USING", MatchAny) ||
4743 TailMatches(
"MERGE",
"INTO", MatchAny,
"AS", MatchAny,
"USING", MatchAny) ||
4744 TailMatches(
"MERGE",
"INTO", MatchAny, MatchAny,
"USING", MatchAny))
4745 COMPLETE_WITH(
"AS",
"ON");
4746 else if (TailMatches(
"MERGE",
"INTO", MatchAny,
"USING", MatchAny,
"AS", MatchAny) ||
4747 TailMatches(
"MERGE",
"INTO", MatchAny,
"AS", MatchAny,
"USING", MatchAny,
"AS", MatchAny) ||
4748 TailMatches(
"MERGE",
"INTO", MatchAny, MatchAny,
"USING", MatchAny,
"AS", MatchAny) ||
4749 TailMatches(
"MERGE",
"INTO", MatchAny,
"USING", MatchAny, MatchAnyExcept(
"ON|AS")) ||
4750 TailMatches(
"MERGE",
"INTO", MatchAny,
"AS", MatchAny,
"USING", MatchAny, MatchAnyExcept(
"ON|AS")) ||
4751 TailMatches(
"MERGE",
"INTO", MatchAny, MatchAny,
"USING", MatchAny, MatchAnyExcept(
"ON|AS")))
4752 COMPLETE_WITH(
"ON");
4755 else if (TailMatches(
"INTO", MatchAny,
"USING", MatchAny,
"ON"))
4756 COMPLETE_WITH_ATTR(prev4_wd);
4757 else if (TailMatches(
"INTO", MatchAny,
"AS", MatchAny,
"USING", MatchAny,
"AS", MatchAny,
"ON"))
4758 COMPLETE_WITH_ATTR(prev8_wd);
4759 else if (TailMatches(
"INTO", MatchAny, MatchAny,
"USING", MatchAny, MatchAny,
"ON"))
4760 COMPLETE_WITH_ATTR(prev6_wd);
4767 else if (TailMatches(
"USING", MatchAny,
"ON", MatchAny) ||
4768 TailMatches(
"USING", MatchAny,
"AS", MatchAny,
"ON", MatchAny) ||
4769 TailMatches(
"USING", MatchAny, MatchAny,
"ON", MatchAny) ||
4770 TailMatches(
"USING", MatchAny,
"ON", MatchAny, MatchAnyExcept(
"WHEN"), MatchAnyExcept(
"WHEN")) ||
4771 TailMatches(
"USING", MatchAny,
"AS", MatchAny,
"ON", MatchAny, MatchAnyExcept(
"WHEN"), MatchAnyExcept(
"WHEN")) ||
4772 TailMatches(
"USING", MatchAny, MatchAny,
"ON", MatchAny, MatchAnyExcept(
"WHEN"), MatchAnyExcept(
"WHEN")))
4773 COMPLETE_WITH(
"WHEN MATCHED",
"WHEN NOT MATCHED");
4774 else if (TailMatches(
"USING", MatchAny,
"ON", MatchAny,
"WHEN") ||
4775 TailMatches(
"USING", MatchAny,
"AS", MatchAny,
"ON", MatchAny,
"WHEN") ||
4776 TailMatches(
"USING", MatchAny, MatchAny,
"ON", MatchAny,
"WHEN") ||
4777 TailMatches(
"USING", MatchAny,
"ON", MatchAny, MatchAny, MatchAny,
"WHEN") ||
4778 TailMatches(
"USING", MatchAny,
"AS", MatchAny,
"ON", MatchAny, MatchAny, MatchAny,
"WHEN") ||
4779 TailMatches(
"USING", MatchAny, MatchAny,
"ON", MatchAny, MatchAny, MatchAny,
"WHEN"))
4780 COMPLETE_WITH(
"MATCHED",
"NOT MATCHED");
4786 else if (TailMatches(
"WHEN",
"MATCHED") ||
4787 TailMatches(
"WHEN",
"NOT",
"MATCHED",
"BY",
"SOURCE|TARGET"))
4788 COMPLETE_WITH(
"THEN",
"AND");
4791 else if (TailMatches(
"WHEN",
"NOT",
"MATCHED"))
4792 COMPLETE_WITH(
"BY",
"THEN",
"AND");
4795 else if (TailMatches(
"WHEN",
"NOT",
"MATCHED",
"BY"))
4796 COMPLETE_WITH(
"SOURCE",
"TARGET");
4802 else if (TailMatches(
"WHEN",
"MATCHED",
"THEN") ||
4803 TailMatches(
"WHEN",
"NOT",
"MATCHED",
"BY",
"SOURCE",
"THEN"))
4804 COMPLETE_WITH(
"UPDATE SET",
"DELETE",
"DO NOTHING");
4809 else if (TailMatches(
"WHEN",
"NOT",
"MATCHED",
"THEN") ||
4810 TailMatches(
"WHEN",
"NOT",
"MATCHED",
"BY",
"TARGET",
"THEN"))
4811 COMPLETE_WITH(
"INSERT",
"DO NOTHING");
4814 else if (TailMatches(
"NOTIFY"))
4815 COMPLETE_WITH_QUERY(Query_for_list_of_channels);
4818 else if (TailMatches(
"OPTIONS"))
4822 else if (TailMatches(
"OWNER",
"TO"))
4823 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
4824 Keywords_for_list_of_owner_roles);
4827 else if (TailMatches(
"FROM", MatchAny,
"ORDER"))
4828 COMPLETE_WITH(
"BY");
4829 else if (TailMatches(
"FROM", MatchAny,
"ORDER",
"BY"))
4830 COMPLETE_WITH_ATTR(prev3_wd);
4833 else if (Matches(
"PREPARE", MatchAny,
"AS"))
4834 COMPLETE_WITH(
"SELECT",
"UPDATE",
"INSERT INTO",
"DELETE FROM");
4842 else if (Matches(
"REASSIGN"))
4843 COMPLETE_WITH(
"OWNED BY");
4844 else if (Matches(
"REASSIGN",
"OWNED"))
4845 COMPLETE_WITH(
"BY");
4846 else if (Matches(
"REASSIGN",
"OWNED",
"BY"))
4847 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
4848 else if (Matches(
"REASSIGN",
"OWNED",
"BY", MatchAny))
4849 COMPLETE_WITH(
"TO");
4850 else if (Matches(
"REASSIGN",
"OWNED",
"BY", MatchAny,
"TO"))
4851 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
4854 else if (Matches(
"REFRESH"))
4855 COMPLETE_WITH(
"MATERIALIZED VIEW");
4856 else if (Matches(
"REFRESH",
"MATERIALIZED"))
4857 COMPLETE_WITH(
"VIEW");
4858 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW"))
4859 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_matviews,
4861 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW",
"CONCURRENTLY"))
4862 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
4863 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW", MatchAny))
4864 COMPLETE_WITH(
"WITH");
4865 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW",
"CONCURRENTLY", MatchAny))
4866 COMPLETE_WITH(
"WITH");
4867 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW", MatchAny,
"WITH"))
4868 COMPLETE_WITH(
"NO DATA",
"DATA");
4869 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW",
"CONCURRENTLY", MatchAny,
"WITH"))
4870 COMPLETE_WITH(
"NO DATA",
"DATA");
4871 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW", MatchAny,
"WITH",
"NO"))
4872 COMPLETE_WITH(
"DATA");
4873 else if (Matches(
"REFRESH",
"MATERIALIZED",
"VIEW",
"CONCURRENTLY", MatchAny,
"WITH",
"NO"))
4874 COMPLETE_WITH(
"DATA");
4877 else if (Matches(
"REINDEX") ||
4878 Matches(
"REINDEX",
"(*)"))
4879 COMPLETE_WITH(
"TABLE",
"INDEX",
"SYSTEM",
"SCHEMA",
"DATABASE");
4880 else if (Matches(
"REINDEX",
"TABLE") ||
4881 Matches(
"REINDEX",
"(*)",
"TABLE"))
4882 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexables,
4884 else if (Matches(
"REINDEX",
"INDEX") ||
4885 Matches(
"REINDEX",
"(*)",
"INDEX"))
4886 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_indexes,
4888 else if (Matches(
"REINDEX",
"SCHEMA") ||
4889 Matches(
"REINDEX",
"(*)",
"SCHEMA"))
4890 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas,
4892 else if (Matches(
"REINDEX",
"SYSTEM|DATABASE") ||
4893 Matches(
"REINDEX",
"(*)",
"SYSTEM|DATABASE"))
4894 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_databases,
4896 else if (Matches(
"REINDEX",
"TABLE",
"CONCURRENTLY") ||
4897 Matches(
"REINDEX",
"(*)",
"TABLE",
"CONCURRENTLY"))
4898 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexables);
4899 else if (Matches(
"REINDEX",
"INDEX",
"CONCURRENTLY") ||
4900 Matches(
"REINDEX",
"(*)",
"INDEX",
"CONCURRENTLY"))
4901 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
4902 else if (Matches(
"REINDEX",
"SCHEMA",
"CONCURRENTLY") ||
4903 Matches(
"REINDEX",
"(*)",
"SCHEMA",
"CONCURRENTLY"))
4904 COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
4905 else if (Matches(
"REINDEX",
"SYSTEM|DATABASE",
"CONCURRENTLY") ||
4906 Matches(
"REINDEX",
"(*)",
"SYSTEM|DATABASE",
"CONCURRENTLY"))
4907 COMPLETE_WITH_QUERY(Query_for_list_of_databases);
4908 else if (HeadMatches(
"REINDEX",
"(*") &&
4909 !HeadMatches(
"REINDEX",
"(*)"))
4916 if (ends_with(prev_wd,
'(') || ends_with(prev_wd,
','))
4917 COMPLETE_WITH(
"CONCURRENTLY",
"TABLESPACE",
"VERBOSE");
4918 else if (TailMatches(
"TABLESPACE"))
4919 COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
4923 else if (Matches(
"SECURITY"))
4924 COMPLETE_WITH(
"LABEL");
4925 else if (Matches(
"SECURITY",
"LABEL"))
4926 COMPLETE_WITH(
"ON",
"FOR");
4927 else if (Matches(
"SECURITY",
"LABEL",
"FOR", MatchAny))
4928 COMPLETE_WITH(
"ON");
4929 else if (Matches(
"SECURITY",
"LABEL",
"ON") ||
4930 Matches(
"SECURITY",
"LABEL",
"FOR", MatchAny,
"ON"))
4931 COMPLETE_WITH(
"TABLE",
"COLUMN",
"AGGREGATE",
"DATABASE",
"DOMAIN",
4932 "EVENT TRIGGER",
"FOREIGN TABLE",
"FUNCTION",
4933 "LARGE OBJECT",
"MATERIALIZED VIEW",
"LANGUAGE",
4934 "PUBLICATION",
"PROCEDURE",
"ROLE",
"ROUTINE",
"SCHEMA",
4935 "SEQUENCE",
"SUBSCRIPTION",
"TABLESPACE",
"TYPE",
"VIEW");
4936 else if (Matches(
"SECURITY",
"LABEL",
"ON", MatchAny, MatchAny))
4937 COMPLETE_WITH(
"IS");
4944 else if (TailMatches(
"SET|RESET") &&
4945 !TailMatches(
"UPDATE", MatchAny,
"SET") &&
4946 !TailMatches(
"ALTER",
"DATABASE", MatchAny,
"RESET"))
4947 COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars,
4954 else if (Matches(
"SHOW"))
4955 COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_show_vars,
4956 "SESSION AUTHORIZATION",
4958 else if (Matches(
"SHOW",
"SESSION"))
4959 COMPLETE_WITH(
"AUTHORIZATION");
4961 else if (Matches(
"SET",
"TRANSACTION"))
4962 COMPLETE_WITH(
"SNAPSHOT",
"ISOLATION LEVEL",
"READ",
"DEFERRABLE",
"NOT DEFERRABLE");
4963 else if (Matches(
"BEGIN|START",
"TRANSACTION") ||
4964 Matches(
"BEGIN",
"WORK") ||
4966 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION"))
4967 COMPLETE_WITH(
"ISOLATION LEVEL",
"READ",
"DEFERRABLE",
"NOT DEFERRABLE");
4968 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"NOT") ||
4969 Matches(
"BEGIN",
"NOT") ||
4970 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"NOT"))
4971 COMPLETE_WITH(
"DEFERRABLE");
4972 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"ISOLATION") ||
4973 Matches(
"BEGIN",
"ISOLATION") ||
4974 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"ISOLATION"))
4975 COMPLETE_WITH(
"LEVEL");
4976 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"ISOLATION",
"LEVEL") ||
4977 Matches(
"BEGIN",
"ISOLATION",
"LEVEL") ||
4978 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"ISOLATION",
"LEVEL"))
4979 COMPLETE_WITH(
"READ",
"REPEATABLE READ",
"SERIALIZABLE");
4980 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"ISOLATION",
"LEVEL",
"READ") ||
4981 Matches(
"BEGIN",
"ISOLATION",
"LEVEL",
"READ") ||
4982 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"ISOLATION",
"LEVEL",
"READ"))
4983 COMPLETE_WITH(
"UNCOMMITTED",
"COMMITTED");
4984 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"ISOLATION",
"LEVEL",
"REPEATABLE") ||
4985 Matches(
"BEGIN",
"ISOLATION",
"LEVEL",
"REPEATABLE") ||
4986 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"ISOLATION",
"LEVEL",
"REPEATABLE"))
4987 COMPLETE_WITH(
"READ");
4988 else if (Matches(
"SET|BEGIN|START",
"TRANSACTION|WORK",
"READ") ||
4989 Matches(
"BEGIN",
"READ") ||
4990 Matches(
"SET",
"SESSION",
"CHARACTERISTICS",
"AS",
"TRANSACTION",
"READ"))
4991 COMPLETE_WITH(
"ONLY",
"WRITE");
4993 else if (Matches(
"SET",
"CONSTRAINTS"))
4994 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_constraints_with_schema,
4997 else if (Matches(
"SET",
"CONSTRAINTS", MatchAny))
4998 COMPLETE_WITH(
"DEFERRED",
"IMMEDIATE");
5000 else if (Matches(
"SET",
"ROLE"))
5001 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
5003 else if (Matches(
"SET",
"SESSION"))
5004 COMPLETE_WITH(
"AUTHORIZATION",
"CHARACTERISTICS AS TRANSACTION");
5006 else if (Matches(
"SET",
"SESSION",
"AUTHORIZATION"))
5007 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
5010 else if (Matches(
"RESET",
"SESSION"))
5011 COMPLETE_WITH(
"AUTHORIZATION");
5013 else if (Matches(
"SET", MatchAny))
5014 COMPLETE_WITH(
"TO");
5020 else if (Matches(
"ALTER",
"DATABASE|FUNCTION|PROCEDURE|ROLE|ROUTINE|USER", MatchAnyN,
"SET", MatchAnyExcept(
"SCHEMA")))
5021 COMPLETE_WITH(
"FROM CURRENT",
"TO");
5027 else if (TailMatches(
"SET", MatchAny,
"TO|=") &&
5028 !TailMatches(
"UPDATE", MatchAny,
"SET", MatchAny,
"TO|="))
5031 if (TailMatches(
"DateStyle",
"TO|="))
5032 COMPLETE_WITH(
"ISO",
"SQL",
"Postgres",
"German",
5033 "YMD",
"DMY",
"MDY",
5034 "US",
"European",
"NonEuropean",
5036 else if (TailMatches(
"search_path",
"TO|="))
5039 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas
5040 " AND nspname NOT LIKE E'pg\\\\_toast%%'"
5041 " AND nspname NOT LIKE E'pg\\\\_temp%%'",
5044 else if (TailMatches(
"TimeZone",
"TO|="))
5045 COMPLETE_WITH_TIMEZONE_NAME();
5049 char *guctype = get_guctype(prev2_wd);
5058 if (strcmp(guctype,
"enum") == 0)
5060 set_completion_reference_verbatim(prev2_wd);
5061 COMPLETE_WITH_QUERY_PLUS(Query_for_values_of_enum_GUC,
5064 else if (strcmp(guctype,
"bool") == 0)
5065 COMPLETE_WITH(
"on",
"off",
"true",
"false",
"yes",
"no",
5066 "1",
"0",
"DEFAULT");
5068 COMPLETE_WITH(
"DEFAULT");
5076 else if (Matches(
"START"))
5077 COMPLETE_WITH(
"TRANSACTION");
5080 else if (Matches(
"TABLE"))
5081 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
5084 else if (TailMatches(
"TABLESAMPLE"))
5085 COMPLETE_WITH_QUERY(Query_for_list_of_tablesample_methods);
5086 else if (TailMatches(
"TABLESAMPLE", MatchAny))
5090 else if (Matches(
"TRUNCATE"))
5091 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_truncatables,
5093 else if (Matches(
"TRUNCATE",
"TABLE"))
5094 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_truncatables,
5096 else if (Matches(
"TRUNCATE", MatchAnyN,
"ONLY"))
5097 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_truncatables);
5098 else if (Matches(
"TRUNCATE", MatchAny) ||
5099 Matches(
"TRUNCATE",
"TABLE|ONLY", MatchAny) ||
5100 Matches(
"TRUNCATE",
"TABLE",
"ONLY", MatchAny))
5101 COMPLETE_WITH(
"RESTART IDENTITY",
"CONTINUE IDENTITY",
"CASCADE",
"RESTRICT");
5102 else if (Matches(
"TRUNCATE", MatchAnyN,
"IDENTITY"))
5103 COMPLETE_WITH(
"CASCADE",
"RESTRICT");
5106 else if (Matches(
"UNLISTEN"))
5107 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_channels,
"*");
5111 else if (TailMatches(
"UPDATE"))
5112 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables);
5114 else if (TailMatches(
"UPDATE", MatchAny))
5115 COMPLETE_WITH(
"SET");
5117 else if (TailMatches(
"UPDATE", MatchAny,
"SET"))
5118 COMPLETE_WITH_ATTR(prev2_wd);
5120 else if (TailMatches(
"UPDATE", MatchAny,
"SET", MatchAnyExcept(
"*=")))
5124 else if (Matches(
"ALTER|CREATE|DROP",
"USER",
"MAPPING"))
5125 COMPLETE_WITH(
"FOR");
5126 else if (Matches(
"CREATE",
"USER",
"MAPPING",
"FOR"))
5127 COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
5132 else if (Matches(
"ALTER|DROP",
"USER",
"MAPPING",
"FOR"))
5133 COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings);
5134 else if (Matches(
"CREATE|ALTER|DROP",
"USER",
"MAPPING",
"FOR", MatchAny))
5135 COMPLETE_WITH(
"SERVER");
5136 else if (Matches(
"CREATE|ALTER",
"USER",
"MAPPING",
"FOR", MatchAny,
"SERVER", MatchAny))
5137 COMPLETE_WITH(
"OPTIONS");
5143 else if (Matches(
"VACUUM"))
5144 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
5151 else if (Matches(
"VACUUM",
"FULL"))
5152 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
5157 else if (Matches(
"VACUUM", MatchAnyN,
"FREEZE"))
5158 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
5162 else if (Matches(
"VACUUM", MatchAnyN,
"VERBOSE"))
5163 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
5166 else if (Matches(
"VACUUM", MatchAnyN,
"ANALYZE"))
5167 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_vacuumables,
5169 else if (HeadMatches(
"VACUUM",
"(*") &&
5170 !HeadMatches(
"VACUUM",
"(*)"))
5177 if (ends_with(prev_wd,
'(') || ends_with(prev_wd,
','))
5178 COMPLETE_WITH(
"FULL",
"FREEZE",
"ANALYZE",
"VERBOSE",
5179 "DISABLE_PAGE_SKIPPING",
"SKIP_LOCKED",
5180 "INDEX_CLEANUP",
"PROCESS_MAIN",
"PROCESS_TOAST",
5181 "TRUNCATE",
"PARALLEL",
"SKIP_DATABASE_STATS",
5182 "ONLY_DATABASE_STATS",
"BUFFER_USAGE_LIMIT");
5183 else if (TailMatches(
"FULL|FREEZE|ANALYZE|VERBOSE|DISABLE_PAGE_SKIPPING|SKIP_LOCKED|PROCESS_MAIN|PROCESS_TOAST|TRUNCATE|SKIP_DATABASE_STATS|ONLY_DATABASE_STATS"))
5184 COMPLETE_WITH(
"ON",
"OFF");
5185 else if (TailMatches(
"INDEX_CLEANUP"))
5186 COMPLETE_WITH(
"AUTO",
"ON",
"OFF");
5188 else if (Matches(
"VACUUM", MatchAnyN,
"("))
5190 COMPLETE_WITH_ATTR(prev2_wd);
5191 else if (HeadMatches(
"VACUUM"))
5192 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_vacuumables);
5200 else if (Matches(
"WITH"))
5201 COMPLETE_WITH(
"RECURSIVE");
5205 else if (TailMatches(MatchAny,
"WHERE"))
5206 COMPLETE_WITH_ATTR(prev2_wd);
5210 else if (TailMatches(
"FROM") && !Matches(
"COPY|\\copy", MatchAny,
"FROM"))
5211 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
5214 else if (TailMatches(
"JOIN"))
5215 COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_selectables,
"LATERAL");
5216 else if (TailMatches(
"JOIN", MatchAny) && !TailMatches(
"CROSS|NATURAL",
"JOIN", MatchAny))
5217 COMPLETE_WITH(
"ON",
"USING (");
5218 else if (TailMatches(
"JOIN", MatchAny, MatchAny) &&
5219 !TailMatches(
"CROSS|NATURAL",
"JOIN", MatchAny, MatchAny) && !TailMatches(
"ON|USING"))
5220 COMPLETE_WITH(
"ON",
"USING (");
5221 else if (TailMatches(
"JOIN",
"LATERAL", MatchAny, MatchAny) &&
5222 !TailMatches(
"CROSS|NATURAL",
"JOIN",
"LATERAL", MatchAny, MatchAny) && !TailMatches(
"ON|USING"))
5223 COMPLETE_WITH(
"ON",
"USING (");
5224 else if (TailMatches(
"JOIN", MatchAny,
"USING") ||
5225 TailMatches(
"JOIN", MatchAny, MatchAny,
"USING") ||
5226 TailMatches(
"JOIN",
"LATERAL", MatchAny, MatchAny,
"USING"))
5228 else if (TailMatches(
"JOIN", MatchAny,
"USING",
"("))
5229 COMPLETE_WITH_ATTR(prev3_wd);
5230 else if (TailMatches(
"JOIN", MatchAny, MatchAny,
"USING",
"("))
5231 COMPLETE_WITH_ATTR(prev4_wd);
5234 else if (TailMatches(
"AT"))
5235 COMPLETE_WITH(
"LOCAL",
"TIME ZONE");
5236 else if (TailMatches(
"AT",
"TIME",
"ZONE"))
5237 COMPLETE_WITH_TIMEZONE_NAME();
5241 else if (TailMatchesCS(
"\\?"))
5242 COMPLETE_WITH_CS(
"commands",
"options",
"variables");
5243 else if (TailMatchesCS(
"\\connect|\\c"))
5246 COMPLETE_WITH_QUERY(Query_for_list_of_databases);
5248 else if (TailMatchesCS(
"\\connect|\\c", MatchAny))
5251 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
5253 else if (TailMatchesCS(
"\\da*"))
5254 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_aggregates);
5255 else if (TailMatchesCS(
"\\dAc*", MatchAny) ||
5256 TailMatchesCS(
"\\dAf*", MatchAny))
5257 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
5258 else if (TailMatchesCS(
"\\dAo*", MatchAny) ||
5259 TailMatchesCS(
"\\dAp*", MatchAny))
5260 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_operator_families);
5261 else if (TailMatchesCS(
"\\dA*"))
5262 COMPLETE_WITH_QUERY(Query_for_list_of_access_methods);
5263 else if (TailMatchesCS(
"\\db*"))
5264 COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces);
5265 else if (TailMatchesCS(
"\\dconfig*"))
5266 COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_show_vars);
5267 else if (TailMatchesCS(
"\\dD*"))
5268 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains);
5269 else if (TailMatchesCS(
"\\des*"))
5270 COMPLETE_WITH_QUERY(Query_for_list_of_servers);
5271 else if (TailMatchesCS(
"\\deu*"))
5272 COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings);
5273 else if (TailMatchesCS(
"\\dew*"))
5274 COMPLETE_WITH_QUERY(Query_for_list_of_fdws);
5275 else if (TailMatchesCS(
"\\df*"))
5276 COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions);
5277 else if (HeadMatchesCS(
"\\df*"))
5278 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
5280 else if (TailMatchesCS(
"\\dFd*"))
5281 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_dictionaries);
5282 else if (TailMatchesCS(
"\\dFp*"))
5283 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_parsers);
5284 else if (TailMatchesCS(
"\\dFt*"))
5285 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_templates);
5287 else if (TailMatchesCS(
"\\dF*"))
5288 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_ts_configurations);
5290 else if (TailMatchesCS(
"\\di*"))
5291 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes);
5292 else if (TailMatchesCS(
"\\dL*"))
5293 COMPLETE_WITH_QUERY(Query_for_list_of_languages);
5294 else if (TailMatchesCS(
"\\dn*"))
5295 COMPLETE_WITH_QUERY(Query_for_list_of_schemas);
5297 else if (HeadMatchesCS(
"\\do*", MatchAny))
5298 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
5299 else if (TailMatchesCS(
"\\dp") || TailMatchesCS(
"\\z"))
5300 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_grantables);
5301 else if (TailMatchesCS(
"\\dPi*"))
5302 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_indexes);
5303 else if (TailMatchesCS(
"\\dPt*"))
5304 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_tables);
5305 else if (TailMatchesCS(
"\\dP*"))
5306 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_partitioned_relations);
5307 else if (TailMatchesCS(
"\\dRp*"))
5308 COMPLETE_WITH_VERSIONED_QUERY(Query_for_list_of_publications);
5309 else if (TailMatchesCS(
"\\dRs*"))
5310 COMPLETE_WITH_VERSIONED_QUERY(Query_for_list_of_subscriptions);
5311 else if (TailMatchesCS(
"\\ds*"))
5312 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences);
5313 else if (TailMatchesCS(
"\\dt*"))
5314 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
5315 else if (TailMatchesCS(
"\\dT*"))
5316 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes);
5317 else if (TailMatchesCS(
"\\du*") ||
5318 TailMatchesCS(
"\\dg*") ||
5319 TailMatchesCS(
"\\drg*"))
5320 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
5321 else if (TailMatchesCS(
"\\dv*"))
5322 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
5323 else if (TailMatchesCS(
"\\dx*"))
5324 COMPLETE_WITH_QUERY(Query_for_list_of_extensions);
5325 else if (TailMatchesCS(
"\\dX*"))
5326 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_statistics);
5327 else if (TailMatchesCS(
"\\dm*"))
5328 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews);
5329 else if (TailMatchesCS(
"\\dE*"))
5330 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables);
5331 else if (TailMatchesCS(
"\\dy*"))
5332 COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers);
5335 else if (TailMatchesCS(
"\\d*"))
5336 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_relations);
5338 else if (TailMatchesCS(
"\\ef"))
5339 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
5340 else if (TailMatchesCS(
"\\ev"))
5341 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
5343 else if (TailMatchesCS(
"\\encoding"))
5344 COMPLETE_WITH_QUERY_VERBATIM(Query_for_list_of_encodings);
5345 else if (TailMatchesCS(
"\\h|\\help"))
5346 COMPLETE_WITH_LIST(sql_commands);
5347 else if (TailMatchesCS(
"\\h|\\help", MatchAny))
5349 if (TailMatches(
"DROP"))
5350 matches = rl_completion_matches(
text, drop_command_generator);
5351 else if (TailMatches(
"ALTER"))
5352 matches = rl_completion_matches(
text, alter_command_generator);
5359 else if (TailMatchesCS(
"\\h|\\help", MatchAny, MatchAny))
5361 if (TailMatches(
"CREATE|DROP",
"ACCESS"))
5362 COMPLETE_WITH(
"METHOD");
5363 else if (TailMatches(
"ALTER",
"DEFAULT"))
5364 COMPLETE_WITH(
"PRIVILEGES");
5365 else if (TailMatches(
"CREATE|ALTER|DROP",
"EVENT"))
5366 COMPLETE_WITH(
"TRIGGER");
5367 else if (TailMatches(
"CREATE|ALTER|DROP",
"FOREIGN"))
5368 COMPLETE_WITH(
"DATA WRAPPER",
"TABLE");
5369 else if (TailMatches(
"ALTER",
"LARGE"))
5370 COMPLETE_WITH(
"OBJECT");
5371 else if (TailMatches(
"CREATE|ALTER|DROP",
"MATERIALIZED"))
5372 COMPLETE_WITH(
"VIEW");
5373 else if (TailMatches(
"CREATE|ALTER|DROP",
"TEXT"))
5374 COMPLETE_WITH(
"SEARCH");
5375 else if (TailMatches(
"CREATE|ALTER|DROP",
"USER"))
5376 COMPLETE_WITH(
"MAPPING FOR");
5378 else if (TailMatchesCS(
"\\h|\\help", MatchAny, MatchAny, MatchAny))
5380 if (TailMatches(
"CREATE|ALTER|DROP",
"FOREIGN",
"DATA"))
5381 COMPLETE_WITH(
"WRAPPER");
5382 else if (TailMatches(
"CREATE|ALTER|DROP",
"TEXT",
"SEARCH"))
5383 COMPLETE_WITH(
"CONFIGURATION",
"DICTIONARY",
"PARSER",
"TEMPLATE");
5384 else if (TailMatches(
"CREATE|ALTER|DROP",
"USER",
"MAPPING"))
5385 COMPLETE_WITH(
"FOR");
5387 else if (TailMatchesCS(
"\\l*") && !TailMatchesCS(
"\\lo*"))
5388 COMPLETE_WITH_QUERY(Query_for_list_of_databases);
5389 else if (TailMatchesCS(
"\\password"))
5390 COMPLETE_WITH_QUERY(Query_for_list_of_roles);
5391 else if (TailMatchesCS(
"\\pset"))
5392 COMPLETE_WITH_CS(
"border",
"columns",
"csv_fieldsep",
"expanded",
5393 "fieldsep",
"fieldsep_zero",
"footer",
"format",
5394 "linestyle",
"null",
"numericlocale",
5395 "pager",
"pager_min_lines",
5396 "recordsep",
"recordsep_zero",
5397 "tableattr",
"title",
"tuples_only",
5398 "unicode_border_linestyle",
5399 "unicode_column_linestyle",
5400 "unicode_header_linestyle",
5402 else if (TailMatchesCS(
"\\pset", MatchAny))
5404 if (TailMatchesCS(
"format"))
5405 COMPLETE_WITH_CS(
"aligned",
"asciidoc",
"csv",
"html",
"latex",
5406 "latex-longtable",
"troff-ms",
"unaligned",
5408 else if (TailMatchesCS(
"xheader_width"))
5409 COMPLETE_WITH_CS(
"full",
"column",
"page");
5410 else if (TailMatchesCS(
"linestyle"))
5411 COMPLETE_WITH_CS(
"ascii",
"old-ascii",
"unicode");
5412 else if (TailMatchesCS(
"pager"))
5413 COMPLETE_WITH_CS(
"on",
"off",
"always");
5414 else if (TailMatchesCS(
"unicode_border_linestyle|"
5415 "unicode_column_linestyle|"
5416 "unicode_header_linestyle"))
5417 COMPLETE_WITH_CS(
"single",
"double");
5419 else if (TailMatchesCS(
"\\unset"))
5420 matches = complete_from_variables(
text,
"",
"",
true);
5421 else if (TailMatchesCS(
"\\set"))
5422 matches = complete_from_variables(
text,
"",
"",
false);
5423 else if (TailMatchesCS(
"\\set", MatchAny))
5425 if (TailMatchesCS(
"AUTOCOMMIT|ON_ERROR_STOP|QUIET|SHOW_ALL_RESULTS|"
5426 "SINGLELINE|SINGLESTEP"))
5427 COMPLETE_WITH_CS(
"on",
"off");
5428 else if (TailMatchesCS(
"COMP_KEYWORD_CASE"))
5429 COMPLETE_WITH_CS(
"lower",
"upper",
5430 "preserve-lower",
"preserve-upper");
5431 else if (TailMatchesCS(
"ECHO"))
5432 COMPLETE_WITH_CS(
"errors",
"queries",
"all",
"none");
5433 else if (TailMatchesCS(
"ECHO_HIDDEN"))
5434 COMPLETE_WITH_CS(
"noexec",
"off",
"on");
5435 else if (TailMatchesCS(
"HISTCONTROL"))
5436 COMPLETE_WITH_CS(
"ignorespace",
"ignoredups",
5437 "ignoreboth",
"none");
5438 else if (TailMatchesCS(
"ON_ERROR_ROLLBACK"))
5439 COMPLETE_WITH_CS(
"on",
"off",
"interactive");
5440 else if (TailMatchesCS(
"SHOW_CONTEXT"))
5441 COMPLETE_WITH_CS(
"never",
"errors",
"always");
5442 else if (TailMatchesCS(
"VERBOSITY"))
5443 COMPLETE_WITH_CS(
"default",
"verbose",
"terse",
"sqlstate");
5445 else if (TailMatchesCS(
"\\sf*"))
5446 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_routines);
5447 else if (TailMatchesCS(
"\\sv*"))
5448 COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views);
5449 else if (TailMatchesCS(
"\\cd|\\e|\\edit|\\g|\\gx|\\i|\\include|"
5450 "\\ir|\\include_relative|\\o|\\out|"
5451 "\\s|\\w|\\write|\\lo_import"))
5453 completion_charp =
"\\";
5454 completion_force_quote =
false;
5455 matches = rl_completion_matches(
text, complete_from_files);
5484create_or_drop_command_generator(
const char *
text,
int state,
bits32 excluded)
5486 static int list_index,
5494 string_length = strlen(
text);
5498 while ((
name = words_after_create[list_index++].
name))
5501 !(words_after_create[list_index - 1].flags & excluded))
5502 return pg_strdup_keyword_case(
name,
text);
5513create_command_generator(
const char *
text,
int state)
5515 return create_or_drop_command_generator(
text,
state, THING_NO_CREATE);
5522drop_command_generator(
const char *
text,
int state)
5524 return create_or_drop_command_generator(
text,
state, THING_NO_DROP);
5531alter_command_generator(
const char *
text,
int state)
5533 return create_or_drop_command_generator(
text,
state, THING_NO_ALTER);
5542complete_from_query(
const char *
text,
int state)
5545 return _complete_from_query(completion_charp, NULL, completion_charpp,
5550complete_from_versioned_query(
const char *
text,
int state)
5552 const VersionedQuery *vquery = completion_vquery;
5558 if (vquery->query == NULL)
5561 return _complete_from_query(vquery->query, NULL, completion_charpp,
5566complete_from_schema_query(
const char *
text,
int state)
5569 return _complete_from_query(NULL, completion_squery, completion_charpp,
5574complete_from_versioned_schema_query(
const char *
text,
int state)
5576 const SchemaQuery *squery = completion_squery;
5582 if (squery->catname == NULL)
5585 return _complete_from_query(NULL, squery, completion_charpp,
5632_complete_from_query(
const char *simple_query,
5633 const SchemaQuery *schema_query,
5638 static int list_index,
5643 static bool non_empty_object;
5644 static bool schemaquoted;
5645 static bool objectquoted;
5656 char *e_object_like;
5663 num_schema_only = 0;
5664 num_query_other = 0;
5677 parse_identifier(
text,
5678 &schemaname, &objectname,
5679 &schemaquoted, &objectquoted);
5683 non_empty_object = (*objectname !=
'\0');
5689 e_object_like = make_like_pattern(objectname);
5694 e_schemaname = NULL;
5696 if (completion_ref_object)
5699 e_ref_object = NULL;
5701 if (completion_ref_schema)
5704 e_ref_schema = NULL;
5710 Assert(simple_query == NULL);
5717 if (schemaname == NULL || schema_query->namespace == NULL)
5721 if (schema_query->use_distinct)
5724 "%s, NULL::pg_catalog.text FROM %s",
5725 schema_query->result,
5726 schema_query->catname);
5727 if (schema_query->refnamespace && completion_ref_schema)
5729 ", pg_catalog.pg_namespace nr");
5731 if (schema_query->selcondition)
5733 schema_query->selcondition);
5735 schema_query->result,
5737 if (schema_query->viscondition)
5739 schema_query->viscondition);
5740 if (schema_query->refname)
5742 Assert(completion_ref_object);
5744 schema_query->refname, e_ref_object);
5745 if (schema_query->refnamespace && completion_ref_schema)
5747 " AND %s = nr.oid AND nr.nspname = '%s'",
5748 schema_query->refnamespace,
5750 else if (schema_query->refviscondition)
5753 schema_query->refviscondition);
5763 if (strcmp(schema_query->catname,
5764 "pg_catalog.pg_class c") == 0 &&
5765 strncmp(objectname,
"pg_", 3) != 0)
5768 " AND c.relnamespace <> (SELECT oid FROM"
5769 " pg_catalog.pg_namespace WHERE nspname = 'pg_catalog')");
5776 if (schema_query->namespace)
5779 "SELECT NULL::pg_catalog.text, n.nspname "
5780 "FROM pg_catalog.pg_namespace n "
5781 "WHERE n.nspname LIKE '%s'",
5788 if (strncmp(objectname,
"pg_", 3) != 0)
5790 " AND n.nspname NOT LIKE E'pg\\\\_%'");
5797 schemaquoted = objectquoted;
5804 if (schema_query->use_distinct)
5807 "FROM %s, pg_catalog.pg_namespace n",
5808 schema_query->result,
5809 schema_query->catname);
5810 if (schema_query->refnamespace && completion_ref_schema)
5812 ", pg_catalog.pg_namespace nr");
5814 schema_query->namespace);
5815 if (schema_query->selcondition)
5817 schema_query->selcondition);
5819 schema_query->result,
5823 if (schema_query->refname)
5825 Assert(completion_ref_object);
5827 schema_query->refname, e_ref_object);
5828 if (schema_query->refnamespace && completion_ref_schema)
5830 " AND %s = nr.oid AND nr.nspname = '%s'",
5831 schema_query->refnamespace,
5833 else if (schema_query->refviscondition)
5836 schema_query->refviscondition);
5846 e_ref_object, e_ref_schema);
5851 completion_max_records);
5854 result = exec_query(query_buffer.
data);
5860 free(e_object_like);
5873 const char *item = NULL;
5874 const char *nsp = NULL;
5897 if (non_empty_object)
5899 if (item && !objectquoted && identifier_needs_quotes(item))
5901 if (nsp && !schemaquoted && identifier_needs_quotes(nsp))
5906 if (item == NULL && nsp != NULL)
5911 return requote_identifier(nsp, item, schemaquoted, objectquoted);
5920 if (schema_query && schema_query->keywords)
5922 const char *
const *itemp = schema_query->keywords;
5926 const char *item = *itemp++;
5934 return pg_strdup_keyword_case(item,
text);
5940 const char *
const *itemp =
keywords;
5944 const char *item = *itemp++;
5952 return pg_strdup_keyword_case(item,
text);
5963 if (num_schema_only > 0 && num_query_other == 0 && num_keywords == 0)
5964 rl_completion_append_character =
'\0';
5979set_completion_reference(
const char *
word)
5984 parse_identifier(
word,
5985 &completion_ref_schema, &completion_ref_object,
5986 &schemaquoted, &objectquoted);
5994set_completion_reference_verbatim(
const char *
word)
5996 completion_ref_schema = NULL;
6007complete_from_list(
const char *
text,
int state)
6009 static int string_length,
6012 static bool casesensitive;
6016 Assert(completion_charpp != NULL);
6022 string_length = strlen(
text);
6023 casesensitive = completion_case_sensitive;
6027 while ((item = completion_charpp[list_index++]))
6030 if (casesensitive && strncmp(
text, item, string_length) == 0)
6039 if (completion_case_sensitive)
6047 return pg_strdup_keyword_case(item,
text);
6055 if (casesensitive && matches == 0)
6057 casesensitive =
false;
6087complete_from_const(
const char *
text,
int state)
6089 Assert(completion_charp != NULL);
6092 if (completion_case_sensitive)
6100 return pg_strdup_keyword_case(completion_charp,
text);
6112append_variable_names(
char ***varnames,
int *nvars,
6113 int *maxvars,
const char *varname,
6114 const char *prefix,
const char *suffix)
6116 if (*nvars >= *maxvars)
6120 ((*maxvars) + 1) *
sizeof(
char *));
6123 (*varnames)[(*nvars)++] =
psprintf(
"%s%s%s", prefix, varname, suffix);
6135complete_from_variables(
const char *
text,
const char *prefix,
const char *suffix,
6145 varnames = (
char **)
pg_malloc((maxvars + 1) *
sizeof(
char *));
6149 if (need_value && !(ptr->
value))
6151 append_variable_names(&varnames, &nvars, &maxvars, ptr->
name,
6155 varnames[nvars] = NULL;
6156 COMPLETE_WITH_LIST_CS((
const char *
const *) varnames);
6158 for (
i = 0;
i < nvars;
i++)
6180complete_from_files(
const char *
text,
int state)
6182#ifdef USE_FILENAME_QUOTING_FUNCTIONS
6199#ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
6200 rl_completion_suppress_quote = 1;
6205 completion_force_quote =
true;
6207 return rl_filename_completion_function(
text,
state);
6213 static const char *unquoted_text;
6214 char *unquoted_match;
6219 completion_force_quote =
true;
6224 unquoted_text =
strtokx(
text,
"", NULL,
"'", *completion_charp,
6230 unquoted_text =
text;
6234 unquoted_match = rl_filename_completion_function(unquoted_text,
state);
6237 struct stat statbuf;
6238 bool is_dir = (
stat(unquoted_match, &statbuf) == 0 &&
6239 S_ISDIR(statbuf.st_mode) != 0);
6243 '\'', *completion_charp,
6244 completion_force_quote,
6247 free(unquoted_match);
6249 ret = unquoted_match;
6256 if (*ret ==
'\'' && is_dir)
6258 char *retend = ret + strlen(ret) - 1;
6263 rl_completion_append_character =
'\0';
6280pg_strdup_keyword_case(
const char *s,
const char *ref)
6284 unsigned char first = ref[0];
6293 for (p = ret; *p; p++)
6298 for (p = ret; *p; p++)
6335make_like_pattern(
const char *
word)
6339 char *bptr = buffer;
6381parse_identifier(
const char *
ident,
6382 char **schemaname,
char **objectname,
6383 bool *schemaquoted,
bool *objectquoted)
6385 size_t buflen = strlen(
ident) + 1;
6395 *schemaquoted = *objectquoted =
false;
6401 unsigned char ch = (
unsigned char) *
ident++;
6405 if (inquotes && *
ident ==
'"')
6413 inquotes = !inquotes;
6414 *objectquoted =
true;
6417 else if (ch ==
'.' && !inquotes)
6425 *schemaquoted = *objectquoted;
6426 *objectquoted =
false;
6438 *optr++ = (char) ch;
6453 if (ch >=
'A' && ch <=
'Z')
6455 else if (enc_is_single_byte &&
IS_HIGHBIT_SET(ch) && isupper(ch))
6458 *optr++ = (char) ch;
6463 *schemaname = sname;
6464 *objectname = oname;
6480requote_identifier(
const char *schemaname,
const char *objectname,
6481 bool quote_schema,
bool quote_object)
6493 buflen += strlen(schemaname) + 1;
6495 quote_schema = identifier_needs_quotes(schemaname);
6499 for (
const char *p = schemaname; *p; p++)
6508 buflen += strlen(objectname);
6510 quote_object = identifier_needs_quotes(objectname);
6514 for (
const char *p = objectname; *p; p++)
6527 for (
const char *p = schemaname; *p; p++)
6541 for (
const char *p = objectname; *p; p++)
6562identifier_needs_quotes(
const char *
ident)
6569 if (strspn(
ident,
"abcdefghijklmnopqrstuvwxyz0123456789_$") != strlen(
ident))
6595exec_query(
const char *query)
6612 pg_log_error(
"tab completion query failed: %s\nQuery was:\n%s",
6635get_previous_words(
int point,
char **buffer,
int *nwords)
6637 char **previous_words;
6640 int words_found = 0;
6654 memcpy(
buf +
i, rl_line_buffer, point);
6661 buf = rl_line_buffer;
6670 previous_words = (
char **)
pg_malloc(point *
sizeof(
char *));
6671 *buffer = outptr = (
char *)
pg_malloc(point * 2);
6678 for (
i = point - 1;
i >= 0;
i--)
6680 if (strchr(WORD_BREAKS,
buf[
i]))
6694 bool inquotes =
false;
6695 int parentheses = 0;
6699 for (
i = point;
i >= 0;
i--)
6701 if (!isspace((
unsigned char)
buf[
i]))
6720 inquotes = !inquotes;
6727 if (--parentheses <= 0)
6730 else if (parentheses == 0 &&
6731 strchr(WORD_BREAKS,
buf[
start - 1]))
6737 previous_words[words_found++] = outptr;
6748 if (
buf != rl_line_buffer)
6751 *nwords = words_found;
6752 return previous_words;
6762get_guctype(
const char *varname)
6767 char *guctype = NULL;
6773 "SELECT vartype FROM pg_catalog.pg_settings "
6774 "WHERE pg_catalog.lower(name) = pg_catalog.lower('%s')",
6777 result = exec_query(query_buffer.
data);
6789#ifdef USE_FILENAME_QUOTING_FUNCTIONS
6798quote_file_name(
char *fname,
int match_type,
char *quote_pointer)
6801 struct stat statbuf;
6805 '\'', *completion_charp,
6806 completion_force_quote,
6821 completion_last_char !=
'\'' &&
6822 (match_type != SINGLE_MATCH ||
6823 (quote_pointer && *quote_pointer ==
'\'') ||
6824 stat(fname, &statbuf) != 0 ||
6827 char *
send = s + strlen(s) - 1;
6838#ifdef HAVE_RL_COMPLETION_SUPPRESS_QUOTE
6839 rl_completion_suppress_quote = 0;
6847 if (quote_pointer && *quote_pointer !=
'\'')
6848 *quote_pointer =
'\0';
6859dequote_file_name(
char *fname,
int quote_char)
6861 char *unquoted_fname;
6868 if (quote_char ==
'\'')
6870 char *workspace = (
char *)
pg_malloc(strlen(fname) + 2);
6872 workspace[0] = quote_char;
6873 strcpy(workspace + 1, fname);
6874 unquoted_fname =
strtokx(workspace,
"", NULL,
"'", *completion_charp,
6879 unquoted_fname =
strtokx(fname,
"", NULL,
"'", *completion_charp,
6883 if (!unquoted_fname)
6886 unquoted_fname = fname;
bool recognized_connection_string(const char *connstr)
#define IS_HIGHBIT_SET(ch)
const uint8 ScanKeywordCategories[SCANKEYWORDS_NUM_KEYWORDS]
ConnStatusType PQstatus(const PGconn *conn)
char * PQerrorMessage(const PGconn *conn)
size_t PQescapeStringConn(PGconn *conn, char *to, const char *from, size_t length, int *error)
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
ExecStatusType PQresultStatus(const PGresult *res)
void PQclear(PGresult *res)
int PQntuples(const PGresult *res)
int PQgetisnull(const PGresult *res, int tup_num, int field_num)
PGresult * PQexec(PGconn *conn, const char *query)
int PQnfields(const PGresult *res)
int PQmblenBounded(const char *s, int encoding)
void * pg_malloc(size_t size)
char * pg_strdup(const char *in)
void * pg_realloc(void *ptr, size_t size)
Assert(PointerIsAligned(start, uint64))
static const JsonPathKeyword keywords[]
PGDLLIMPORT const ScanKeywordList ScanKeywords
#define UNRESERVED_KEYWORD
int ScanKeywordLookup(const char *str, const ScanKeywordList *keywords)
#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 * strtokx(const char *s, const char *whitespace, const char *delim, const char *quote, char escape, bool e_strings, bool del_quotes, int encoding)
char * quote_if_needed(const char *source, const char *entails_quote, char quote, char escape, bool force_quote, int encoding)
void initialize_readline(void)
PQExpBuffer tab_completion_query_buf
static bool escape_string(PGconn *conn, PQExpBuffer target, const char *unescaped, size_t unescaped_len, PQExpBuffer escape_err)
static int32 text_length(Datum str)
int pg_encoding_max_length(int encoding)
#define send(s, buf, len, flags)