From f5a77cba0e550a122f355ca158833ae9d8e2690d Mon Sep 17 00:00:00 2001 From: Kyotaro Horiguchi Date: Fri, 1 Apr 2016 17:01:42 +0900 Subject: [PATCH 3/4] Make COMPLETE_WITH_ATTR to accept additional keyword query. So far the previous commit, COMPLETE_WITH_ATTR cannot accept the new style of additional keyword list. This patch does the following things. 1. Change completion_charp from const char * to PQExpBuffer. 2. Chnage COMPLETE_WITH_QUERY and COMPLETE_WITH_ATTR to accept an expression instead of string literal. 3. Replace all additional keyword lists in psql_copmletion with ADDLISTn() expression. This leaves keywords contained in Query_for_list_of_grant_roles and Query_for_enum, but it is the another problem. --- src/bin/psql/tab-complete.c | 486 ++++++++++++++++++++++---------------------- 1 file changed, 246 insertions(+), 240 deletions(-) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index c530fcb..832bcd7 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -125,7 +125,7 @@ static int completion_max_records; * Communication variables set by COMPLETE_WITH_FOO macros and then used by * the completion callback functions. Ugly but there is no better way. */ -static const char *completion_charp; /* to pass a string */ +static PQExpBuffer completion_charp = NULL; /* to pass a string */ static const char *const * completion_charpp; /* to pass a list of strings */ static const char *completion_info_charp; /* to pass a second string */ static const char *completion_info_charp2; /* to pass a third string */ @@ -143,16 +143,26 @@ static bool completion_case_sensitive; /* completion is case sensitive */ * 5) The list of attributes of the given table (possibly schema-qualified). * 6/ The list of arguments to the given function (possibly schema-qualified). */ -#define COMPLETE_WITH_QUERY(query) \ +#define APPEND_COMP_CHARP(charp) \ + appendPQExpBufferStr(completion_charp, charp); + +#define SET_COMP_CHARP(charp) \ + resetPQExpBuffer(completion_charp); \ + APPEND_COMP_CHARP(charp); + +#define COMPLETION_CHARP (completion_charp->data) + +#define COMPLETE_WITH_QUERY(query, addon) \ do { \ - completion_charp = query; \ + SET_COMP_CHARP(query); \ + APPEND_COMP_CHARP(addon); \ matches = completion_matches(text, complete_from_query); \ } while (0) #define COMPLETE_WITH_SCHEMA_QUERY(query, addon) \ do { \ completion_squery = &(query); \ - completion_charp = addon; \ + SET_COMP_CHARP(addon); \ matches = completion_matches(text, complete_from_schema_query); \ } while (0) @@ -172,7 +182,7 @@ do { \ #define COMPLETE_WITH_CONST(string) \ do { \ - completion_charp = string; \ + SET_COMP_CHARP(string); \ completion_case_sensitive = false; \ matches = completion_matches(text, complete_from_const); \ } while (0) @@ -190,12 +200,14 @@ do { \ false, false, pset.encoding); \ if (_completion_table == NULL) \ { \ - completion_charp = Query_for_list_of_attributes addon; \ + SET_COMP_CHARP(Query_for_list_of_attributes); \ + APPEND_COMP_CHARP(addon); \ completion_info_charp = relation; \ } \ else \ { \ - completion_charp = Query_for_list_of_attributes_with_schema addon; \ + SET_COMP_CHARP(Query_for_list_of_attributes_with_schema); \ + APPEND_COMP_CHARP(addon); \ completion_info_charp = _completion_table; \ completion_info_charp2 = _completion_schema; \ } \ @@ -215,12 +227,12 @@ do { \ false, false, pset.encoding); \ if (_completion_function == NULL) \ { \ - completion_charp = Query_for_list_of_arguments; \ + SET_COMP_CHARP(Query_for_list_of_arguments); \ completion_info_charp = function; \ } \ else \ { \ - completion_charp = Query_for_list_of_arguments_with_schema; \ + SET_COMP_CHARP(Query_for_list_of_arguments_with_schema); \ completion_info_charp = _completion_function; \ completion_info_charp2 = _completion_schema; \ } \ @@ -312,16 +324,16 @@ do { \ COMPLETE_WITH_LIST_CS(list); \ } while (0) -#define ADDLIST1(p, s1) additional_kw_query(p, text, 1, s1) -#define ADDLIST2(p, s1, s2) additional_kw_query(p, text, 2, s1, s2) -#define ADDLIST3(p, s1, s2, s3) additional_kw_query(p, text, 3, s1, s2, s3) -#define ADDLIST4(p, s1, s2, s3, s4) \ - additional_kw_query(p, text, 4, s1, s2, s3, s4) -#define ADDLIST13(p, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13) \ - additional_kw_query(p, text, 12, s1, s2, s3, s4, s5, s6, s7, \ +#define ADDLIST1(s1) additional_kw_query(text, 1, s1) +#define ADDLIST2(s1, s2) additional_kw_query(text, 2, s1, s2) +#define ADDLIST3(s1, s2, s3) additional_kw_query(text, 3, s1, s2, s3) +#define ADDLIST4(s1, s2, s3, s4) \ + additional_kw_query(text, 4, s1, s2, s3, s4) +#define ADDLIST13(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13) \ + additional_kw_query(text, 12, s1, s2, s3, s4, s5, s6, s7, \ s8, s9, s10, s11, s12, s13) -#define ADDLIST15(p, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15) \ - additional_kw_query(p, text, 12, s1, s2, s3, s4, s5, s6, s7, \ +#define ADDLIST15(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15) \ + additional_kw_query(text, 12, s1, s2, s3, s4, s5, s6, s7, \ s8, s9, s10, s11, s12, s13, s14, s15) /* @@ -975,7 +987,7 @@ static char *complete_from_files(const char *text, int state); static int find_last_index_of(char *w, char **previous_words, int len); static char *pg_strdup_keyword_case(const char *s, const char *ref); -static char *additional_kw_query(char *prefix, const char *ref, int n, ...); +static char *additional_kw_query( const char *ref, int n, ...); static char *escape_string(const char *text); static PGresult *exec_query(const char *query); @@ -1406,7 +1418,8 @@ psql_completion(const char *text, int start, int end) #endif /* Clear a few things. */ - completion_charp = NULL; + if (completion_charp == NULL) + completion_charp = createPQExpBuffer(); completion_charpp = NULL; completion_info_charp = NULL; completion_info_charp2 = NULL; @@ -1461,13 +1474,13 @@ psql_completion(const char *text, int start, int end) /* ALTER TABLE */ else if (Matches2("ALTER", "TABLE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, - ADDLIST2("", "IF EXISTS", "ALL IN TABLESPACE")); + ADDLIST2("IF EXISTS", "ALL IN TABLESPACE")); /* ALTER TABLE after removing optional words IF EXISTS*/ else if (HeadMatches2("ALTER", "TABLE") && MidMatchAndRemove2(2, "IF", "EXISTS") && Matches2("ALTER", "TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); /* ALTER something */ else if (Matches1("ALTER")) @@ -1487,7 +1500,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_LIST2("SET TABLESPACE", "OWNED BY"); /* ALTER TABLE,INDEX,MATERIALIZED VIEW ALL IN TABLESPACE xxx OWNED BY */ else if (TailMatches6("ALL", "IN", "TABLESPACE", MatchAny, "OWNED", "BY")) - COMPLETE_WITH_QUERY(Query_for_list_of_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, ""); /* ALTER TABLE,INDEX,MATERIALIZED VIEW ALL IN TABLESPACE xxx OWNED BY xxx */ else if (TailMatches7("ALL", "IN", "TABLESPACE", MatchAny, "OWNED", "BY", MatchAny)) COMPLETE_WITH_CONST("SET TABLESPACE"); @@ -1523,7 +1536,7 @@ psql_completion(const char *text, int start, int end) /* ALTER EVENT TRIGGER */ else if (Matches3("ALTER", "EVENT", "TRIGGER")) - COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers); + COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers, ""); /* ALTER EVENT TRIGGER */ else if (Matches4("ALTER", "EVENT", "TRIGGER", MatchAny)) @@ -1541,14 +1554,14 @@ psql_completion(const char *text, int start, int end) else if (Matches4("ALTER", "EXTENSION", MatchAny, "UPDATE")) { completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions_with_TO); + COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions_with_TO,""); } /* ALTER EXTENSION UPDATE TO */ else if (Matches5("ALTER", "EXTENSION", MatchAny, "UPDATE", "TO")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions); + COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions, ""); } /* ALTER FOREIGN */ @@ -1562,13 +1575,13 @@ psql_completion(const char *text, int start, int end) /* ALTER FOREIGN TABLE */ else if (Matches3("ALTER|DROP", "FOREIGN", "TABLE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, - ADDLIST1("", "IF EXISTS")); + ADDLIST1("IF EXISTS")); /* ALTER|DROP FOREIGN TABLE after removing optinal words IF EXISTS */ else if (HeadMatches3("ALTER|DROP", "FOREIGN", "TABLE") && MidMatchAndRemove2(3, "IF", "EXISTS") && Matches3("ALTER|DROP", "FOREIGN", "TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, ""); /* ALTER FOREIGN TABLE */ else if (Matches4("ALTER", "FOREIGN", "TABLE", MatchAny)) @@ -1583,17 +1596,17 @@ psql_completion(const char *text, int start, int end) /* ALTER FOREIGN TABLE xxx RENAME */ else if (Matches5("ALTER", "FOREIGN", "TABLE", MatchAny, "RENAME")) - COMPLETE_WITH_ATTR(prev2_wd, " UNION SELECT 'COLUMN' UNION SELECT 'TO'"); + COMPLETE_WITH_ATTR(prev2_wd, ADDLIST2("COLUMN", "TO")); /* ALTER INDEX */ else if (Matches2("ALTER", "INDEX")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, - ADDLIST2("", "IF EXISTS", "ALL IN TABLESPACE")); + ADDLIST2("IF EXISTS", "ALL IN TABLESPACE")); /* ALTER INDEX after removing optional words IF EXISTS */ else if (HeadMatches2("ALTER", "INDEX") && MidMatchAndRemove2(2, "IF", "EXISTS") && Matches2("ALTER", "INDEX")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, ""); /* ALTER INDEX */ else if (Matches3("ALTER", "INDEX", MatchAny)) @@ -1623,13 +1636,13 @@ psql_completion(const char *text, int start, int end) /* ALTER MATERIALIZED VIEW */ else if (Matches3("ALTER", "MATERIALIZED", "VIEW")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, - ADDLIST2("", "IF EXISTS", "ALL IN TABLESPACE")); + ADDLIST2("IF EXISTS", "ALL IN TABLESPACE")); /* ALTER MATERIALIZED VIEW with name after removing optional words */ else if (HeadMatches3("ALTER", "MATERIALIZED", "VIEW") && MidMatchAndRemove2(3, "IF", "EXISTS") && Matches3("ALTER", "MATERIALIZED", "VIEW")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, ""); /* ALTER USER,ROLE */ else if (Matches3("ALTER", "USER|ROLE", MatchAny) && @@ -1685,14 +1698,14 @@ psql_completion(const char *text, int start, int end) else if (Matches5("ALTER", "DOMAIN", MatchAny, "RENAME|VALIDATE", "CONSTRAINT")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_constraint_of_type); + COMPLETE_WITH_QUERY(Query_for_constraint_of_type, ""); } /* ALTER DOMAIN DROP CONSTRAINT */ else if (Matches5("ALTER", "DOMAIN", MatchAny, "DROP", "CONSTRAINT")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY( - ADDLIST1(Query_for_constraint_of_type, "IF EXISTS")); + COMPLETE_WITH_QUERY(Query_for_constraint_of_type, + ADDLIST1("IF EXISTS")); } /* Try the same match after removing optional words IF EXISTS */ else if (HeadMatches5("ALTER", "DOMAIN", MatchAny, "DROP", "CONSTRAINT") && @@ -1700,7 +1713,7 @@ psql_completion(const char *text, int start, int end) Matches5("ALTER", "DOMAIN", MatchAny, "DROP", "CONSTRAINT")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_constraint_of_type); + COMPLETE_WITH_QUERY(Query_for_constraint_of_type, ""); } /* ALTER DOMAIN RENAME */ else if (Matches4("ALTER", "DOMAIN", MatchAny, "RENAME")) @@ -1714,7 +1727,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_LIST3("DEFAULT", "NOT NULL", "SCHEMA"); else if (Matches2("ALTER", "SEQUENCE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences, - ADDLIST1("", "IF EXISTS")); + ADDLIST1("IF EXISTS")); /* ALTER SEQUENCE with name after removing optional words IF EXISTS */ else if (HeadMatches2("ALTER", "SEQUENCE") && MidMatchAndRemove2(2, "IF", "EXISTS") && @@ -1740,11 +1753,11 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_LIST2("SET", "RESET"); /* ALTER SYSTEM SET|RESET */ else if (Matches3("ALTER", "SYSTEM", "SET|RESET")) - COMPLETE_WITH_QUERY(Query_for_list_of_alter_system_set_vars); + COMPLETE_WITH_QUERY(Query_for_list_of_alter_system_set_vars, ""); /* ALTER VIEW */ else if (Matches2("ALTER", "VIEW")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, - ADDLIST1("", "IF EXISTS")); + ADDLIST1("IF EXISTS")); /* ALTER VIEW with subcommands after removing optional worlds */ else if (HeadMatches2("ALTER", "VIEW") && MidMatchAndRemove2(2, "IF", "EXISTS") && @@ -1758,8 +1771,8 @@ psql_completion(const char *text, int start, int end) /* ALTER POLICY */ else if (Matches2("ALTER", "POLICY")) - COMPLETE_WITH_QUERY( - ADDLIST1(Query_for_list_of_policies, "IF EXISTS")); + COMPLETE_WITH_QUERY(Query_for_list_of_policies, + ADDLIST1("IF EXISTS")); /* ALTER POLICY with ON after removing optional words IF EXISTS */ else if (HeadMatches2("ALTER", "POLICY") && MidMatchAndRemove2(2, "IF", "EXISTS") && @@ -1769,14 +1782,14 @@ psql_completion(const char *text, int start, int end) else if (Matches4("ALTER", "POLICY", MatchAny, "ON")) { completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_policy); + COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_policy, ""); } /* ALTER POLICY ON - show options */ else if (Matches5("ALTER", "POLICY", MatchAny, "ON", MatchAny)) COMPLETE_WITH_LIST4("RENAME TO", "TO", "USING (", "WITH CHECK ("); /* ALTER POLICY ON
TO */ else if (Matches6("ALTER", "POLICY", MatchAny, "ON", MatchAny, "TO")) - COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles, ""); /* ALTER POLICY ON
USING ( */ else if (Matches6("ALTER", "POLICY", MatchAny, "ON", MatchAny, "USING")) COMPLETE_WITH_CONST("("); @@ -1792,7 +1805,7 @@ psql_completion(const char *text, int start, int end) else if (Matches4("ALTER", "RULE", MatchAny, "ON")) { completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_rule); + COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_rule, ""); } /* ALTER RULE ON */ @@ -1806,14 +1819,14 @@ psql_completion(const char *text, int start, int end) else if (Matches4("ALTER", "TRIGGER", MatchAny, MatchAny)) { completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_trigger); + COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_trigger, ""); } /* * If we have ALTER TRIGGER ON, then add the correct tablename */ else if (Matches4("ALTER", "TRIGGER", MatchAny, "ON")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); /* ALTER TRIGGER ON */ else if (Matches5("ALTER", "TRIGGER", MatchAny, "ON", MatchAny)) @@ -1840,22 +1853,22 @@ psql_completion(const char *text, int start, int end) else if (Matches5("ALTER", "TABLE", MatchAny, "ENABLE", "RULE")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_rule_of_table); + COMPLETE_WITH_QUERY(Query_for_rule_of_table, ""); } else if (Matches6("ALTER", "TABLE", MatchAny, "ENABLE", MatchAny, "RULE")) { completion_info_charp = prev4_wd; - COMPLETE_WITH_QUERY(Query_for_rule_of_table); + COMPLETE_WITH_QUERY(Query_for_rule_of_table, ""); } else if (Matches5("ALTER", "TABLE", MatchAny, "ENABLE", "TRIGGER")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_trigger_of_table); + COMPLETE_WITH_QUERY(Query_for_trigger_of_table, ""); } else if (Matches6("ALTER", "TABLE", MatchAny, "ENABLE", MatchAny, "TRIGGER")) { completion_info_charp = prev4_wd; - COMPLETE_WITH_QUERY(Query_for_trigger_of_table); + COMPLETE_WITH_QUERY(Query_for_trigger_of_table, ""); } /* ALTER TABLE xxx INHERIT */ else if (Matches4("ALTER", "TABLE", MatchAny, "INHERIT")) @@ -1869,21 +1882,21 @@ psql_completion(const char *text, int start, int end) else if (Matches5("ALTER", "TABLE", MatchAny, "DISABLE", "RULE")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_rule_of_table); + COMPLETE_WITH_QUERY(Query_for_rule_of_table, ""); } else if (Matches5("ALTER", "TABLE", MatchAny, "DISABLE", "TRIGGER")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_trigger_of_table); + COMPLETE_WITH_QUERY(Query_for_trigger_of_table, ""); } /* ALTER TABLE xxx ALTER */ else if (Matches4("ALTER", "TABLE", MatchAny, "ALTER")) - COMPLETE_WITH_ATTR(prev2_wd, " UNION SELECT 'COLUMN' UNION SELECT 'CONSTRAINT'"); + COMPLETE_WITH_ATTR(prev2_wd, ADDLIST2("COLUMN", "CONSTRAINT")); /* ALTER TABLE xxx RENAME */ else if (Matches4("ALTER", "TABLE", MatchAny, "RENAME")) - COMPLETE_WITH_ATTR(prev2_wd, " UNION SELECT 'COLUMN' UNION SELECT 'CONSTRAINT' UNION SELECT 'TO'"); + COMPLETE_WITH_ATTR(prev2_wd, ADDLIST3("COLUMN", "CONSTRAINT", "TO")); else if (Matches5("ALTER", "TABLE", MatchAny, "ALTER|RENAME", "COLUMN")) COMPLETE_WITH_ATTR(prev3_wd, ""); @@ -1902,7 +1915,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_LIST2("COLUMN", "CONSTRAINT"); /* ALTER TABLE DROP COLUMN may take IF EXISTS */ else if (Matches5("ALTER", "TABLE", MatchAny, "DROP", "COLUMN")) - COMPLETE_WITH_ATTR(prev3_wd, "UNION SELECT 'IF EXISTS'"); + COMPLETE_WITH_ATTR(prev3_wd, ADDLIST1("IF EXISTS")); /* ALTER TABLE with ADD/ALTER/DROP after removing optional words */ else if (HeadMatches4("ALTER", "TABLE", MatchAny, "ADD|ALTER|DROP") && MidMatchAndRemove1(4, "COLUMN") && @@ -1911,7 +1924,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_ATTR(prev2_wd, ""); /* If we have ALTER TABLE DROP COLUMN, provide list of columns */ else if (Matches5("ALTER", "TABLE", MatchAny, "DROP", "COLUMN")) - COMPLETE_WITH_ATTR(prev3_wd, "UNION SELECT 'IF EXISTS'"); + COMPLETE_WITH_ATTR(prev3_wd, ADDLIST1("IF EXISTS")); /* Try the same after removing optional words IF EXISTS */ else if (HeadMatches5("ALTER", "TABLE", MatchAny, "DROP", "COLUMN") && MidMatchAndRemove2(5, "IF", "EXISTS") && @@ -1925,7 +1938,7 @@ psql_completion(const char *text, int start, int end) else if (Matches5("ALTER", "TABLE", MatchAny, "ALTER|RENAME|VALIDATE", "CONSTRAINT")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_constraint_of_table); + COMPLETE_WITH_QUERY(Query_for_constraint_of_table, ""); } /* * If we have ALTER TABLE DROP CONSTRAINT, @@ -1934,8 +1947,8 @@ psql_completion(const char *text, int start, int end) else if (Matches5("ALTER", "TABLE", MatchAny, "DROP", "CONSTRAINT")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY( - ADDLIST1(Query_for_constraint_of_table, "IF EXISTS")); + COMPLETE_WITH_QUERY(Query_for_constraint_of_table, + ADDLIST1("IF EXISTS")); } /* Try the same after removing optional words IF EXISTS */ else if (HeadMatches5("ALTER", "TABLE", MatchAny, "DROP", "CONSTRAINT") && @@ -1943,7 +1956,7 @@ psql_completion(const char *text, int start, int end) Matches5("ALTER", "TABLE", MatchAny, "DROP", "CONSTRAINT")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_constraint_of_table); + COMPLETE_WITH_QUERY(Query_for_constraint_of_table, ""); } /* ALTER TABLE ALTER [COLUMN] */ else if (Matches6("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny) || @@ -1970,7 +1983,7 @@ psql_completion(const char *text, int start, int end) else if (Matches5("ALTER", "TABLE", MatchAny, "CLUSTER", "ON")) { completion_info_charp = prev3_wd; - COMPLETE_WITH_QUERY(Query_for_index_of_table); + COMPLETE_WITH_QUERY(Query_for_index_of_table, ""); } /* If we have ALTER TABLE SET, provide list of attributes and '(' */ else if (Matches4("ALTER", "TABLE", MatchAny, "SET")) @@ -1982,7 +1995,7 @@ psql_completion(const char *text, int start, int end) * tablespaces */ else if (Matches5("ALTER", "TABLE", MatchAny, "SET", "TABLESPACE")) - COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces); + COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces, ""); /* If we have ALTER TABLE SET WITH provide OIDS */ else if (Matches5("ALTER", "TABLE", MatchAny, "SET", "WITH")) COMPLETE_WITH_CONST("OIDS"); @@ -2034,7 +2047,7 @@ psql_completion(const char *text, int start, int end) else if (Matches7("ALTER", "TABLE", MatchAny, "REPLICA", "IDENTITY", "USING", "INDEX")) { completion_info_charp = prev5_wd; - COMPLETE_WITH_QUERY(Query_for_index_of_table); + COMPLETE_WITH_QUERY(Query_for_index_of_table, ""); } else if (Matches6("ALTER", "TABLE", MatchAny, "REPLICA", "IDENTITY", "USING")) COMPLETE_WITH_CONST("INDEX"); @@ -2099,7 +2112,7 @@ psql_completion(const char *text, int start, int end) else if (Matches5("ALTER", "TYPE", MatchAny, "ALTER|RENAME", "ATTRIBUTE")) COMPLETE_WITH_ATTR(prev3_wd, ""); else if (Matches5("ALTER", "TYPE", MatchAny, "DROP", "ATTRIBUTE")) - COMPLETE_WITH_ATTR(prev3_wd, " UNION SELECT 'IF EXISTS'"); + COMPLETE_WITH_ATTR(prev3_wd, ADDLIST1("IF EXISTS")); /* Remove optional words IF EXISTS */ else if (HeadMatches5("ALTER", "TYPE", MatchAny, "DROP", "ATTRIBUTE") && MidMatchAndRemove2(5, "IF", "EXISTS") && @@ -2114,7 +2127,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_CONST("USER"); /* complete ALTER GROUP ADD|DROP USER with a user name */ else if (Matches5("ALTER", "GROUP", MatchAny, "ADD|DROP", "USER")) - COMPLETE_WITH_QUERY(Query_for_list_of_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, ""); /* BEGIN */ else if (Matches1("BEGIN")) @@ -2134,9 +2147,9 @@ psql_completion(const char *text, int start, int end) /* CLUSTER */ else if (Matches1("CLUSTER")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, - ADDLIST1("", "VERBOSE")); + ADDLIST1("VERBOSE")); else if (Matches2("CLUSTER", "VERBOSE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, ""); /* If we have CLUSTER , then add "USING" */ else if (Matches2("CLUSTER", MatchAnyExcept("VERBOSE|ON"))) COMPLETE_WITH_CONST("USING"); @@ -2148,7 +2161,7 @@ psql_completion(const char *text, int start, int end) Matches4("CLUSTER", "VERBOSE", MatchAny, "USING")) { completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_index_of_table); + COMPLETE_WITH_QUERY(Query_for_index_of_table, ""); } /* COMMENT */ @@ -2168,24 +2181,24 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_LIST(list_COMMENT); } else if (Matches4("COMMENT", "ON", "ACCESS", "METHOD")) - COMPLETE_WITH_QUERY(Query_for_list_of_access_methods); + COMPLETE_WITH_QUERY(Query_for_list_of_access_methods, ""); else if (Matches3("COMMENT", "ON", "FOREIGN")) COMPLETE_WITH_LIST2("DATA WRAPPER", "TABLE"); else if (Matches4("COMMENT", "ON", "TEXT", "SEARCH")) COMPLETE_WITH_LIST4("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE"); else if (Matches3("COMMENT", "ON", "CONSTRAINT")) - COMPLETE_WITH_QUERY(Query_for_all_table_constraints); + COMPLETE_WITH_QUERY(Query_for_all_table_constraints, ""); else if (Matches4("COMMENT", "ON", "CONSTRAINT", MatchAny)) COMPLETE_WITH_CONST("ON"); else if (Matches5("COMMENT", "ON", "CONSTRAINT", MatchAny, "ON")) { completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_constraint); + COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_constraint, ""); } else if (Matches4("COMMENT", "ON", "MATERIALIZED", "VIEW")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, ""); else if (Matches4("COMMENT", "ON", "EVENT", "TRIGGER")) - COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers); + COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers, ""); else if (Matches4("COMMENT", "ON", MatchAny, MatchAnyExcept("IS")) || Matches5("COMMENT", "ON", MatchAny, MatchAny, MatchAnyExcept("IS")) || Matches6("COMMENT", "ON", MatchAny, MatchAny, MatchAny, MatchAnyExcept("IS"))) @@ -2199,10 +2212,10 @@ psql_completion(const char *text, int start, int end) */ else if (Matches1("COPY|\\copy")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, - ADDLIST1("", "(")); + ADDLIST1("(")); /* If we have COPY BINARY, complete with list of tables */ else if (Matches2("COPY", "BINARY")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); /* If we have COPY (, complete it with legal commands */ else if (Matches2("COPY|\\copy", "(")) COMPLETE_WITH_LIST7("SELECT", "TABLE", "VALUES", "INSERT", "UPDATE", "DELETE", "WITH"); @@ -2214,7 +2227,7 @@ psql_completion(const char *text, int start, int end) else if (Matches3("COPY|\\copy", MatchAny, "FROM|TO") || Matches4("COPY", "BINARY", MatchAny, "FROM|TO")) { - completion_charp = ""; + SET_COMP_CHARP(""); matches = completion_matches(text, complete_from_files); } @@ -2249,18 +2262,18 @@ psql_completion(const char *text, int start, int end) "LC_COLLATE", "LC_CTYPE"); else if (Matches4("CREATE", "DATABASE", MatchAny, "TEMPLATE")) - COMPLETE_WITH_QUERY(Query_for_list_of_template_databases); + COMPLETE_WITH_QUERY(Query_for_list_of_template_databases, ""); /* CREATE EXTENSION */ /* Complete with available extensions rather than installed ones. */ else if (Matches2("CREATE", "EXTENSION")) - COMPLETE_WITH_QUERY(ADDLIST1(Query_for_list_of_available_extensions, - "IF NOT EXISTS")); + COMPLETE_WITH_QUERY(Query_for_list_of_available_extensions, + ADDLIST1("IF NOT EXISTS")); /* Try the same after removing optional words IF NOT EXISTS */ else if (HeadMatches2("CREATE", "EXTENSION") && MidMatchAndRemove3(2, "IF", "NOT", "EXISTS") && Matches2("CREATE", "EXTENSION")) - COMPLETE_WITH_QUERY(Query_for_list_of_available_extensions); + COMPLETE_WITH_QUERY(Query_for_list_of_available_extensions, ""); /* CREATE EXTENSION */ else if (Matches3("CREATE", "EXTENSION", MatchAny)) COMPLETE_WITH_LIST3("WITH SCHEMA", "CASCADE", "VERSION"); @@ -2268,7 +2281,7 @@ psql_completion(const char *text, int start, int end) else if (Matches4("CREATE", "EXTENSION", MatchAny, "VERSION")) { completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions); + COMPLETE_WITH_QUERY(Query_for_list_of_available_extension_versions, ""); } /* CREATE FOREIGN */ @@ -2278,7 +2291,7 @@ psql_completion(const char *text, int start, int end) /* CREATE FOREIGN TABLE */ else if (Matches3("CREATE", "FOREIGN", "TABLE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, - ADDLIST1("", "IF NOT EXISTS")); + ADDLIST1("IF NOT EXISTS")); /* Remove optional words IF NOT EXISTS */ else if (HeadMatches3("CREATE", "FOREIGN", "TABLE") && MidMatchAndRemove3(3, "IF", "NOT", "EXISTS") && @@ -2300,12 +2313,12 @@ psql_completion(const char *text, int start, int end) and existing indexes */ else if (Matches2("CREATE", "INDEX")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, - ADDLIST3("", "ON", "CONCURRENTLY", "IF NOT EXISTS")); + ADDLIST3("ON", "CONCURRENTLY", "IF NOT EXISTS")); /* Complete CREATE INDEX CONCURRENTLY with "ON" or IF NOT EXISTS and * existing indexes */ else if (Matches3("CREATE", "INDEX", "CONCURRENTLY")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, - ADDLIST2("", "IF NOT EXISTS", "ON")); + ADDLIST2("IF NOT EXISTS", "ON")); /* Remove optional words "CONCURRENTLY", "IF NOT EXISTS" */ else if (HeadMatches2("CREATE", "INDEX") && @@ -2316,7 +2329,7 @@ psql_completion(const char *text, int start, int end) /* Complete CREATE INDEX [] ON with a list of tables */ else if (Matches4("CREATE", "INDEX", MatchAny, "ON") || Matches3("CREATE", "INDEX", "ON")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, ""); /* Complete CREATE INDEX with "ON" */ else if (Matches3("CREATE", "INDEX", MatchAny)) @@ -2338,7 +2351,7 @@ psql_completion(const char *text, int start, int end) /* Complete USING with an index method */ else if (TailMatches5("INDEX", MatchAny, "ON", MatchAny, "USING") || TailMatches4("INDEX", "ON", MatchAny, "USING")) - COMPLETE_WITH_QUERY(Query_for_list_of_access_methods); + COMPLETE_WITH_QUERY(Query_for_list_of_access_methods, ""); else if (TailMatches4("ON", MatchAny, "USING", MatchAny) && !TailMatches6("POLICY", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny) && !TailMatches4("FOR", MatchAny, MatchAny, MatchAny)) @@ -2350,7 +2363,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_CONST("ON"); /* Complete "CREATE POLICY ON
" */ else if (Matches4("CREATE", "POLICY", MatchAny, "ON")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); /* Complete "CREATE POLICY ON
FOR|TO|USING|WITH CHECK" */ else if (Matches5("CREATE", "POLICY", MatchAny, "ON", MatchAny)) COMPLETE_WITH_LIST4("FOR", "TO", "USING (", "WITH CHECK ("); @@ -2368,7 +2381,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_LIST3("TO", "USING (", "WITH CHECK ("); /* Complete "CREATE POLICY ON
TO " */ else if (Matches6("CREATE", "POLICY", MatchAny, "ON", MatchAny, "TO")) - COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles, ""); /* Complete "CREATE POLICY ON
USING (" */ else if (Matches6("CREATE", "POLICY", MatchAny, "ON", MatchAny, "USING")) COMPLETE_WITH_CONST("("); @@ -2388,7 +2401,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_CONST("TO"); /* Complete "AS ON TO" with a table name */ else if (TailMatches4("AS", "ON", "SELECT|UPDATE|INSERT|DELETE", "TO")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); /* Remove optional words TEMPORARY/TEMP */ else if (HeadMatches3("CREATE", MatchAny, "SEQUENCE") && @@ -2397,7 +2410,7 @@ psql_completion(const char *text, int start, int end) /* CREATE SEQUENCE */ else if(Matches2("CREATE", "SEQUENCE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences, - ADDLIST1("", "IF NOT EXISTS")); + ADDLIST1("IF NOT EXISTS")); else if(HeadMatches2("CREATE", "SEQUENCE") && MidMatchAndRemove3(2, "IF", "NOT", "EXISTS") && Matches3("CREATE", "SEQUENCE", MatchAny)) @@ -2412,8 +2425,8 @@ psql_completion(const char *text, int start, int end) /* CREATE SCHEMA */ else if (Matches2("CREATE", "SCHEMA")) - COMPLETE_WITH_QUERY( - ADDLIST1(Query_for_list_of_schemas, "IF NOT EXISTS")); + COMPLETE_WITH_QUERY(Query_for_list_of_schemas, + ADDLIST1("IF NOT EXISTS")); /* Remove optional words IF NOT EXISTS */ else if (HeadMatches2("CREATE", "SCHEMA") && MidMatchAndRemove3(2, "IF", "NOT", "EXISTS") && @@ -2433,7 +2446,7 @@ psql_completion(const char *text, int start, int end) false) {} /* FALL THROUGH*/ else if (Matches2("CREATE", "TABLE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, - ADDLIST1("", "IF NOT EXISTS")); + ADDLIST1("IF NOT EXISTS")); /* Remove optional words here */ else if (HeadMatches2("CREATE", "TABLE") && @@ -2473,10 +2486,10 @@ psql_completion(const char *text, int start, int end) * tables */ else if (TailMatches6("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny, "ON")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); /* complete CREATE TRIGGER ... INSTEAD OF event ON with a list of views */ else if (TailMatches7("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, ""); /* complete CREATE TRIGGER ... EXECUTE with PROCEDURE */ else if (HeadMatches2("CREATE", "TRIGGER") && TailMatches1("EXECUTE")) COMPLETE_WITH_CONST("PROCEDURE"); @@ -2524,7 +2537,7 @@ psql_completion(const char *text, int start, int end) /* CREATE VIEW */ else if (Matches2("CREATE", "VIEW")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, - ADDLIST1("", "IF NOT EXISTS")); + ADDLIST1("IF NOT EXISTS")); /* CREATE VIEW with AS after removing optional words */ else if (HeadMatches2("CREATE", "VIEW") && MidMatchAndRemove3(2, "IF", "NOT", "EXISTS") && @@ -2539,13 +2552,13 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_CONST("VIEW"); else if (Matches3("CREATE", "MATERIALIZED", "VIEW")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, - ADDLIST1("", "IF NOT EXISTS")); + ADDLIST1("IF NOT EXISTS")); /* Try the same after removing optional words IF NOT EXISTS. VIEW will be * completed afterwards */ else if (HeadMatches3("CREATE", "MATERIALIZED", "VIEW") && MidMatchAndRemove3(3, "IF", "NOT", "EXISTS") && Matches3("CREATE", "MATERIALIZED", "VIEW")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, ""); /* Complete CREATE MATERIALIZED VIEW with AS */ else if (Matches4("CREATE", "MATERIALIZED", "VIEW", MatchAny)) COMPLETE_WITH_CONST("AS"); @@ -2576,7 +2589,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_CONST("FROM"); /* Complete DELETE FROM with a list of tables */ else if (TailMatches2("DELETE", "FROM")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables, ""); /* Complete DELETE FROM
*/ else if (TailMatches3("DELETE", "FROM", MatchAny)) COMPLETE_WITH_LIST2("USING", "WHERE"); @@ -2607,10 +2620,10 @@ psql_completion(const char *text, int start, int end) /* help completing some of the variants */ else if (Matches2("DROP", "AGGREGATE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_aggregates, - ADDLIST1("", "IF EXISTS")); + ADDLIST1("IF EXISTS")); else if (Matches2("DROP", "FUNCTION")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, - ADDLIST1("", "IF EXISTS")); + ADDLIST1("IF EXISTS")); /* Try the same after removing optional words IF EXISTS */ else if (HeadMatches2("DROP", "AGGREGATE|FUNCTION") && MidMatchAndRemove2(2, "IF", "EXISTS") && @@ -2621,8 +2634,8 @@ psql_completion(const char *text, int start, int end) else if (Matches2("DROP", "FOREIGN")) COMPLETE_WITH_LIST2("DATA WRAPPER", "TABLE"); else if (Matches4("DROP", "FOREIGN", "DATA", "WRAPPER")) - COMPLETE_WITH_QUERY( - ADDLIST1(Query_for_list_of_fdws, "IF EXISTS")); + COMPLETE_WITH_QUERY(Query_for_list_of_fdws, + ADDLIST1("IF EXISTS")); /* Try the same after removing optional words IF EXISTS */ else if (HeadMatches4("DROP", "FOREIGN", "DATA", "WRAPPER") && MidMatchAndRemove2(4, "IF", "EXISTS") && @@ -2631,10 +2644,10 @@ psql_completion(const char *text, int start, int end) /* DROP INDEX */ else if (Matches2("DROP", "INDEX")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, - ADDLIST2("", "IF EXISTS","CONCURRENTLY")); + ADDLIST2("IF EXISTS","CONCURRENTLY")); else if (Matches3("DROP", "INDEX", "CONCURRENTLY")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, - ADDLIST1("", "IF EXISTS")); + ADDLIST1("IF EXISTS")); /* Try the same after optional words CONCURRENTLY and IF NOT EXISTS */ else if (HeadMatches2("DROP", "INDEX") && MidMatchAndRemove1(2, "CONCURRENTLY") && @@ -2647,33 +2660,33 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_CONST("VIEW"); else if (Matches2("DROP", "VIEW")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, - ADDLIST1("", "IF EXISTS")); + ADDLIST1("IF EXISTS")); /* Remove optional words IF EXISTS */ else if (HeadMatches2("DROP", "VIEW") && MidMatchAndRemove2(2, "IF", "EXISTS") && false) {} /* FALL THROUGH */ else if (Matches3("DROP", "MATERIALIZED", "VIEW")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, - ADDLIST1("", "IF EXISTS")); + ADDLIST1("IF EXISTS")); /* Try the same after removing optional words IF EXISTS */ else if (HeadMatches3("DROP", "MATERIALIZED", "VIEW") && MidMatchAndRemove2(3, "IF", "EXISTS") && Matches3("DROP", "MATERIALIZED", "VIEW")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, ""); /* DROP OWNED BY */ else if (Matches2("DROP", "OWNED")) COMPLETE_WITH_CONST("BY"); else if (Matches3("DROP", "OWNED", "BY")) - COMPLETE_WITH_QUERY(Query_for_list_of_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, ""); else if (Matches3("DROP", "TEXT", "SEARCH")) COMPLETE_WITH_LIST4("CONFIGURATION", "DICTIONARY", "PARSER", "TEMPLATE"); /* DROP TRIGGER */ else if (Matches2("DROP", "TRIGGER")) - COMPLETE_WITH_QUERY( - ADDLIST1(Query_for_list_of_triggers, "IF EXISTS")); + COMPLETE_WITH_QUERY(Query_for_list_of_triggers, + ADDLIST1("IF EXISTS")); /* Try the same after removing optional words IF EXISTS */ else if (HeadMatches2("DROP", "TRIGGER") && MidMatchAndRemove2(2, "IF", "EXISTS") && @@ -2682,7 +2695,7 @@ psql_completion(const char *text, int start, int end) else if (Matches4("DROP", "TRIGGER", MatchAny, "ON")) { completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_trigger); + COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_trigger, ""); } else if (Matches5("DROP", "TRIGGER", MatchAny, "ON", MatchAny)) COMPLETE_WITH_LIST2("CASCADE", "RESTRICT"); @@ -2691,29 +2704,29 @@ psql_completion(const char *text, int start, int end) else if (Matches2("DROP", "ACCESS")) COMPLETE_WITH_CONST("METHOD"); else if (Matches3("DROP", "ACCESS", "METHOD")) - COMPLETE_WITH_QUERY(Query_for_list_of_access_methods); + COMPLETE_WITH_QUERY(Query_for_list_of_access_methods, ""); /* DROP EVENT TRIGGER */ else if (Matches2("DROP", "EVENT")) COMPLETE_WITH_CONST("TRIGGER"); else if (Matches3("DROP", "EVENT", "TRIGGER")) - COMPLETE_WITH_QUERY( - ADDLIST1(Query_for_list_of_event_triggers, "IF EXISTS")); + COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers, + ADDLIST1("IF EXISTS")); /* Trye the same after removing optional words IF EXISTS */ else if (HeadMatches3("DROP", "EVENT", "TRIGGER") && MidMatchAndRemove2(3, "IF", "EXISTS") && Matches3("DROP", "EVENT", "TRIGGER")) - COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers); + COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers, ""); /* DROP POLICY */ else if (Matches2("DROP", "POLICY")) - COMPLETE_WITH_QUERY( - ADDLIST1(Query_for_list_of_policies, "IF EXISTS")); + COMPLETE_WITH_QUERY(Query_for_list_of_policies, + ADDLIST1("IF EXISTS")); /* Try the same after after removing optional words IF EXISTS */ else if (HeadMatches2("DROP", "POLICY") && MidMatchAndRemove2(2, "IF", "EXISTS") && Matches2("DROP", "POLICY")) - COMPLETE_WITH_QUERY(Query_for_list_of_policies); + COMPLETE_WITH_QUERY(Query_for_list_of_policies, ""); /* DROP POLICY */ else if (Matches3("DROP", "POLICY", MatchAny)) COMPLETE_WITH_CONST("ON"); @@ -2721,13 +2734,13 @@ psql_completion(const char *text, int start, int end) else if (Matches4("DROP", "POLICY", MatchAny, "ON")) { completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_policy); + COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_policy, ""); } /* DROP RULE */ else if (Matches2("DROP", "RULE")) - COMPLETE_WITH_QUERY( - ADDLIST1(Query_for_list_of_rules, "IF EXISTS")); + COMPLETE_WITH_QUERY(Query_for_list_of_rules, + ADDLIST1("IF EXISTS")); /* DROP RULE , after removing optional words IF EXISTS */ else if (HeadMatches2("DROP", "RULE") && MidMatchAndRemove2(2, "IF", "EXISTS") && @@ -2736,7 +2749,7 @@ psql_completion(const char *text, int start, int end) else if (Matches4("DROP", "RULE", MatchAny, "ON")) { completion_info_charp = prev2_wd; - COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_rule); + COMPLETE_WITH_QUERY(Query_for_list_of_tables_for_rule, ""); } else if (Matches5("DROP", "RULE", MatchAny, "ON", MatchAny)) COMPLETE_WITH_LIST2("CASCADE", "RESTRICT"); @@ -2751,15 +2764,15 @@ psql_completion(const char *text, int start, int end) { const pgsql_thing_t *ent = find_thing_entry(prev_wd); - char *addition = ADDLIST1("", "IF EXISTS"); + char *addition = ADDLIST1("IF EXISTS"); if (ent) { /* Completing USER needs special treat */ if (pg_strcasecmp(prev_wd, "USER") == 0) { - COMPLETE_WITH_QUERY( - ADDLIST2(Query_for_list_of_roles, "MAPPING", "IF EXISTS")); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, + ADDLIST2("MAPPING", "IF EXISTS")); } else if (ent->query) { @@ -2767,12 +2780,12 @@ psql_completion(const char *text, int start, int end) strlen(addition) + 1); strcpy(buf, ent->query); strcat(buf, addition); - COMPLETE_WITH_QUERY(buf); + COMPLETE_WITH_QUERY(buf, ""); free(buf); } else if (ent->squery) COMPLETE_WITH_SCHEMA_QUERY(*ent->squery, - ADDLIST1("", "IF EXISTS")); + ADDLIST1("IF EXISTS")); } } /* Remove optional IF EXISTS from DROP */ @@ -2789,7 +2802,7 @@ psql_completion(const char *text, int start, int end) /* EXECUTE */ else if (Matches1("EXECUTE")) - COMPLETE_WITH_QUERY(Query_for_list_of_prepared_statements); + COMPLETE_WITH_QUERY(Query_for_list_of_prepared_statements, ""); /* EXPLAIN */ @@ -2826,7 +2839,7 @@ psql_completion(const char *text, int start, int end) /* applies in ALTER/DROP FDW and in CREATE SERVER */ else if (TailMatches3("FOREIGN", "DATA", "WRAPPER") && !TailMatches4("CREATE", MatchAny, MatchAny, MatchAny)) - COMPLETE_WITH_QUERY(Query_for_list_of_fdws); + COMPLETE_WITH_QUERY(Query_for_list_of_fdws, ""); /* applies in CREATE SERVER */ else if (TailMatches4("FOREIGN", "DATA", "WRAPPER", MatchAny) && HeadMatches2("CREATE", "SERVER")) @@ -2834,18 +2847,17 @@ psql_completion(const char *text, int start, int end) /* FOREIGN TABLE */ else if (TailMatches2("FOREIGN", "TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, ""); /* FOREIGN SERVER */ else if (TailMatches2("FOREIGN", "SERVER")) - COMPLETE_WITH_QUERY(Query_for_list_of_servers); + COMPLETE_WITH_QUERY(Query_for_list_of_servers, ""); /* GRANT && REVOKE --- is allowed inside CREATE SCHEMA, so use TailMatches */ /* Complete GRANT/REVOKE with a list of roles and privileges */ else if (TailMatches1("GRANT|REVOKE")) - COMPLETE_WITH_QUERY( - ADDLIST13(Query_for_list_of_roles, - "SELECT", "INSERT", "UPDATE", "DELETE", "TRUNCATE", + COMPLETE_WITH_QUERY(Query_for_list_of_roles, + ADDLIST13("SELECT", "INSERT", "UPDATE", "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", "CREATE", "CONNECT", "TEMPORARY", "EXECUTE", "USAGE", "ALL")); @@ -2876,8 +2888,7 @@ psql_completion(const char *text, int start, int end) */ else if (TailMatches3("GRANT|REVOKE", MatchAny, "ON")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsvmf, - ADDLIST15("", - "ALL FUNCTIONS IN SCHEMA", + ADDLIST15("ALL FUNCTIONS IN SCHEMA", "ALL SEQUENCES IN SCHEMA", "ALL TABLES IN SCHEMA", "DATABASE", @@ -2909,23 +2920,23 @@ psql_completion(const char *text, int start, int end) else if (TailMatches4("GRANT|REVOKE", MatchAny, "ON", MatchAny)) { if (TailMatches1("DATABASE")) - COMPLETE_WITH_QUERY(Query_for_list_of_databases); + COMPLETE_WITH_QUERY(Query_for_list_of_databases, ""); else if (TailMatches1("DOMAIN")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains, ""); else if (TailMatches1("FUNCTION")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, ""); else if (TailMatches1("LANGUAGE")) - COMPLETE_WITH_QUERY(Query_for_list_of_languages); + COMPLETE_WITH_QUERY(Query_for_list_of_languages, ""); else if (TailMatches1("SCHEMA")) - COMPLETE_WITH_QUERY(Query_for_list_of_schemas); + COMPLETE_WITH_QUERY(Query_for_list_of_schemas, ""); else if (TailMatches1("SEQUENCE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences, ""); else if (TailMatches1("TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsvmf, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsvmf, ""); else if (TailMatches1("TABLESPACE")) - COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces); + COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces, ""); else if (TailMatches1("TYPE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, ""); else if (TailMatches4("GRANT", MatchAny, MatchAny, MatchAny)) COMPLETE_WITH_CONST("TO"); else @@ -2938,7 +2949,7 @@ psql_completion(const char *text, int start, int end) */ else if ((HeadMatches1("GRANT") && TailMatches1("TO")) || (HeadMatches1("REVOKE") && TailMatches1("FROM"))) - COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles, ""); /* Complete "GRANT/REVOKE ... ON * *" with TO/FROM */ else if (HeadMatches1("GRANT") && TailMatches3("ON", MatchAny, MatchAny)) @@ -2989,7 +3000,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_CONST("INTO"); /* Complete INSERT INTO with table names */ else if (TailMatches2("INSERT", "INTO")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables, ""); /* Complete "INSERT INTO
(" with attribute names */ else if (TailMatches4("INSERT", "INTO", MatchAny, "(")) COMPLETE_WITH_ATTR(prev2_wd, ""); @@ -3017,7 +3028,7 @@ psql_completion(const char *text, int start, int end) /* Complete LOCK [TABLE] with a list of tables */ else if (Matches1("LOCK")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, - ADDLIST1("", "TABLE")); + ADDLIST1("TABLE")); else if (Matches2("LOCK", "TABLE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); @@ -3039,7 +3050,7 @@ psql_completion(const char *text, int start, int end) /* NOTIFY --- can be inside EXPLAIN, RULE, etc */ else if (TailMatches1("NOTIFY")) - COMPLETE_WITH_QUERY("SELECT pg_catalog.quote_ident(channel) FROM pg_catalog.pg_listening_channels() AS channel WHERE substring(pg_catalog.quote_ident(channel),1,%d)='%s'"); + COMPLETE_WITH_QUERY("SELECT pg_catalog.quote_ident(channel) FROM pg_catalog.pg_listening_channels() AS channel WHERE substring(pg_catalog.quote_ident(channel),1,%d)='%s'", ""); /* OPTIONS */ else if (TailMatches1("OPTIONS")) @@ -3047,7 +3058,7 @@ psql_completion(const char *text, int start, int end) /* OWNER TO - complete with available roles */ else if (TailMatches2("OWNER", "TO")) - COMPLETE_WITH_QUERY(Query_for_list_of_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, ""); /* ORDER BY */ else if (TailMatches3("FROM", MatchAny, "ORDER")) @@ -3070,11 +3081,11 @@ psql_completion(const char *text, int start, int end) else if (Matches2("REASSIGN", "OWNED")) COMPLETE_WITH_CONST("BY"); else if (Matches3("REASSIGN", "OWNED", "BY")) - COMPLETE_WITH_QUERY(Query_for_list_of_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, ""); else if (Matches4("REASSIGN", "OWNED", "BY", MatchAny)) COMPLETE_WITH_CONST("TO"); else if (Matches5("REASSIGN", "OWNED", "BY", MatchAny, "TO")) - COMPLETE_WITH_QUERY(Query_for_list_of_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, ""); /* REFRESH MATERIALIZED VIEW */ else if (Matches1("REFRESH")) @@ -3083,9 +3094,9 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_CONST("VIEW"); else if (Matches3("REFRESH", "MATERIALIZED", "VIEW")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, - ADDLIST1("", "CONCURRENTLY")); + ADDLIST1("CONCURRENTLY")); else if (Matches4("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, ""); else if (Matches4("REFRESH", "MATERIALIZED", "VIEW", MatchAny)) COMPLETE_WITH_CONST("WITH"); else if (Matches5("REFRESH", "MATERIALIZED", "VIEW", "CONCURRENTLY", MatchAny)) @@ -3103,13 +3114,13 @@ psql_completion(const char *text, int start, int end) else if (Matches1("REINDEX")) COMPLETE_WITH_LIST5("TABLE", "INDEX", "SYSTEM", "SCHEMA", "DATABASE"); else if (Matches2("REINDEX", "TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, ""); else if (Matches2("REINDEX", "INDEX")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, ""); else if (Matches2("REINDEX", "SCHEMA")) - COMPLETE_WITH_QUERY(Query_for_list_of_schemas); + COMPLETE_WITH_QUERY(Query_for_list_of_schemas, ""); else if (Matches2("REINDEX", "SYSTEM|DATABASE")) - COMPLETE_WITH_QUERY(Query_for_list_of_databases); + COMPLETE_WITH_QUERY(Query_for_list_of_databases, ""); /* SECURITY LABEL */ else if (Matches1("SECURITY")) @@ -3138,9 +3149,9 @@ psql_completion(const char *text, int start, int end) /* SET, RESET, SHOW */ /* Complete with a variable name */ else if (TailMatches1("SET|RESET") && !TailMatches3("UPDATE", MatchAny, "SET")) - COMPLETE_WITH_QUERY(Query_for_list_of_set_vars); + COMPLETE_WITH_QUERY(Query_for_list_of_set_vars, ""); else if (Matches1("SHOW")) - COMPLETE_WITH_QUERY(Query_for_list_of_show_vars); + COMPLETE_WITH_QUERY(Query_for_list_of_show_vars, ""); /* Complete "SET TRANSACTION" */ else if (Matches2("SET", "TRANSACTION")) COMPLETE_WITH_LIST5("SNAPSHOT", "ISOLATION LEVEL", "READ", "DEFERRABLE", "NOT DEFERRABLE"); @@ -3176,20 +3187,20 @@ psql_completion(const char *text, int start, int end) /* SET CONSTRAINTS */ else if (Matches2("SET", "CONSTRAINTS")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_constraints_with_schema, - ADDLIST1("", "ALL")); + ADDLIST1("ALL")); /* Complete SET CONSTRAINTS with DEFERRED|IMMEDIATE */ else if (Matches3("SET", "CONSTRAINTS", MatchAny)) COMPLETE_WITH_LIST2("DEFERRED", "IMMEDIATE"); /* Complete SET ROLE */ else if (Matches2("SET", "ROLE")) - COMPLETE_WITH_QUERY(Query_for_list_of_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, ""); /* Complete SET SESSION with AUTHORIZATION or CHARACTERISTICS... */ else if (Matches2("SET", "SESSION")) COMPLETE_WITH_LIST2("AUTHORIZATION", "CHARACTERISTICS AS TRANSACTION"); /* Complete SET SESSION AUTHORIZATION with username */ else if (Matches3("SET", "SESSION", "AUTHORIZATION")) - COMPLETE_WITH_QUERY( - ADDLIST1(Query_for_list_of_roles, "DEFAULT")); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, + ADDLIST1("DEFAULT")); /* Complete RESET SESSION with AUTHORIZATION */ else if (Matches2("RESET", "SESSION")) COMPLETE_WITH_CONST("AUTHORIZATION"); @@ -3215,11 +3226,10 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_LIST(my_list); } else if (TailMatches2("search_path", "TO|=")) - COMPLETE_WITH_QUERY( - ADDLIST1(Query_for_list_of_schemas - " AND nspname not like 'pg\\_toast%%' " - " AND nspname not like 'pg\\_temp%%' ", - "DEFAULT")); + COMPLETE_WITH_QUERY(Query_for_list_of_schemas + " AND nspname not like 'pg\\_toast%%' " + " AND nspname not like 'pg\\_temp%%' ", + ADDLIST1("DEFAULT")); else { /* generic, type based, GUC support */ @@ -3230,7 +3240,7 @@ psql_completion(const char *text, int start, int end) char querybuf[1024]; snprintf(querybuf, sizeof(querybuf), Query_for_enum, prev2_wd); - COMPLETE_WITH_QUERY(querybuf); + COMPLETE_WITH_QUERY(querybuf, ""); } else if (guctype && strcmp(guctype, "bool") == 0) COMPLETE_WITH_LIST9("on", "off", "true", "false", "yes", "no", @@ -3249,26 +3259,26 @@ psql_completion(const char *text, int start, int end) /* TABLE, but not TABLE embedded in other commands */ else if (Matches1("TABLE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_relations, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_relations, ""); /* TABLESAMPLE */ else if (TailMatches1("TABLESAMPLE")) - COMPLETE_WITH_QUERY(Query_for_list_of_tablesample_methods); + COMPLETE_WITH_QUERY(Query_for_list_of_tablesample_methods, ""); else if (TailMatches2("TABLESAMPLE", MatchAny)) COMPLETE_WITH_CONST("("); /* TRUNCATE */ else if (Matches1("TRUNCATE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); /* UNLISTEN */ else if (Matches1("UNLISTEN")) - COMPLETE_WITH_QUERY("SELECT pg_catalog.quote_ident(channel) FROM pg_catalog.pg_listening_channels() AS channel WHERE substring(pg_catalog.quote_ident(channel),1,%d)='%s' UNION SELECT '*'"); + COMPLETE_WITH_QUERY("SELECT pg_catalog.quote_ident(channel) FROM pg_catalog.pg_listening_channels() AS channel WHERE substring(pg_catalog.quote_ident(channel),1,%d)='%s' UNION SELECT '*'", ""); /* UPDATE --- can be inside EXPLAIN, RULE, etc */ /* If prev. word is UPDATE suggest a list of tables */ else if (TailMatches1("UPDATE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_updatables, ""); /* Complete UPDATE
with "SET" */ else if (TailMatches2("UPDATE", MatchAny)) COMPLETE_WITH_CONST("SET"); @@ -3288,11 +3298,10 @@ psql_completion(const char *text, int start, int end) MidMatchAndRemove2(3, "IF", "EXISTS") && false) {} /* FALL THROUGH */ else if (Matches4("CREATE", "USER", "MAPPING", "FOR")) - COMPLETE_WITH_QUERY( - ADDLIST3(Query_for_list_of_roles, - "CURRENT_USER", "PUBLIC", "USER")); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, + ADDLIST3("CURRENT_USER", "PUBLIC", "USER")); else if (Matches4("ALTER|DROP", "USER", "MAPPING", "FOR")) - COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings); + COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings, ""); else if (Matches5("CREATE|ALTER|DROP", "USER", "MAPPING", "FOR", MatchAny)) COMPLETE_WITH_CONST("SERVER"); else if (Matches7("CREATE|ALTER", "USER", "MAPPING", "FOR", MatchAny, "SERVER", MatchAny)) @@ -3304,24 +3313,24 @@ psql_completion(const char *text, int start, int end) */ else if (Matches1("VACUUM")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, - ADDLIST4("", "FULL", "FREEZE", "ANALYZE", "VERBOSE")); + ADDLIST4("FULL", "FREEZE", "ANALYZE", "VERBOSE")); else if (Matches2("VACUUM", "FULL|FREEZE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, - ADDLIST2("", "ANALYZE", "VERBOSE")); + ADDLIST2("ANALYZE", "VERBOSE")); else if (Matches3("VACUUM", "FULL|FREEZE", "ANALYZE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, - ADDLIST1("", "VERBOSE")); + ADDLIST1("VERBOSE")); else if (Matches3("VACUUM", "FULL|FREEZE", "VERBOSE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, - ADDLIST1("", "ANALYZE")); + ADDLIST1("ANALYZE")); else if (Matches2("VACUUM", "VERBOSE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, - ADDLIST1("", "ANALYZE")); + ADDLIST1("ANALYZE")); else if (Matches2("VACUUM", "ANALYZE")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, - ADDLIST1("", "VERBOSE")); + ADDLIST1("VERBOSE")); else if (HeadMatches1("VACUUM")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tm, ""); /* WITH [RECURSIVE] */ @@ -3335,7 +3344,7 @@ psql_completion(const char *text, int start, int end) /* ANALYZE */ /* Complete with list of tables */ else if (Matches1("ANALYZE")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tmf, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tmf, ""); /* WHERE */ /* Simple case of the word before the where being the table name */ @@ -3345,11 +3354,11 @@ psql_completion(const char *text, int start, int end) /* ... FROM ... */ /* TODO: also include SRF ? */ else if (TailMatches1("FROM") && !Matches3("COPY|\\copy", MatchAny, "FROM")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsvmf, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsvmf, ""); /* ... JOIN ... */ else if (TailMatches1("JOIN")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsvmf, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsvmf, ""); /* Backslash commands */ /* TODO: \dc \dd \dl */ @@ -3358,84 +3367,84 @@ psql_completion(const char *text, int start, int end) else if (TailMatchesCS1("\\connect|\\c")) { if (!recognized_connection_string(text)) - COMPLETE_WITH_QUERY(Query_for_list_of_databases); + COMPLETE_WITH_QUERY(Query_for_list_of_databases, ""); } else if (TailMatchesCS2("\\connect|\\c", MatchAny)) { if (!recognized_connection_string(prev_wd)) - COMPLETE_WITH_QUERY(Query_for_list_of_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, ""); } else if (TailMatchesCS1("\\da*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_aggregates, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_aggregates, ""); else if (TailMatchesCS1("\\dA*")) - COMPLETE_WITH_QUERY(Query_for_list_of_access_methods); + COMPLETE_WITH_QUERY(Query_for_list_of_access_methods, ""); else if (TailMatchesCS1("\\db*")) - COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces); + COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces, ""); else if (TailMatchesCS1("\\dD*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_domains, ""); else if (TailMatchesCS1("\\des*")) - COMPLETE_WITH_QUERY(Query_for_list_of_servers); + COMPLETE_WITH_QUERY(Query_for_list_of_servers, ""); else if (TailMatchesCS1("\\deu*")) - COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings); + COMPLETE_WITH_QUERY(Query_for_list_of_user_mappings, ""); else if (TailMatchesCS1("\\dew*")) - COMPLETE_WITH_QUERY(Query_for_list_of_fdws); + COMPLETE_WITH_QUERY(Query_for_list_of_fdws, ""); else if (TailMatchesCS1("\\df*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, ""); else if (TailMatchesCS1("\\dFd*")) - COMPLETE_WITH_QUERY(Query_for_list_of_ts_dictionaries); + COMPLETE_WITH_QUERY(Query_for_list_of_ts_dictionaries, ""); else if (TailMatchesCS1("\\dFp*")) - COMPLETE_WITH_QUERY(Query_for_list_of_ts_parsers); + COMPLETE_WITH_QUERY(Query_for_list_of_ts_parsers, ""); else if (TailMatchesCS1("\\dFt*")) - COMPLETE_WITH_QUERY(Query_for_list_of_ts_templates); + COMPLETE_WITH_QUERY(Query_for_list_of_ts_templates, ""); /* must be at end of \dF alternatives: */ else if (TailMatchesCS1("\\dF*")) - COMPLETE_WITH_QUERY(Query_for_list_of_ts_configurations); + COMPLETE_WITH_QUERY(Query_for_list_of_ts_configurations, ""); else if (TailMatchesCS1("\\di*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_indexes, ""); else if (TailMatchesCS1("\\dL*")) - COMPLETE_WITH_QUERY(Query_for_list_of_languages); + COMPLETE_WITH_QUERY(Query_for_list_of_languages, ""); else if (TailMatchesCS1("\\dn*")) - COMPLETE_WITH_QUERY(Query_for_list_of_schemas); + COMPLETE_WITH_QUERY(Query_for_list_of_schemas, ""); else if (TailMatchesCS1("\\dp") || TailMatchesCS1("\\z")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsvmf, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsvmf, ""); else if (TailMatchesCS1("\\ds*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_sequences, ""); else if (TailMatchesCS1("\\dt*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, ""); else if (TailMatchesCS1("\\dT*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, ""); else if (TailMatchesCS1("\\du*") || TailMatchesCS1("\\dg*")) - COMPLETE_WITH_QUERY(Query_for_list_of_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, ""); else if (TailMatchesCS1("\\dv*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, ""); else if (TailMatchesCS1("\\dx*")) - COMPLETE_WITH_QUERY(Query_for_list_of_extensions); + COMPLETE_WITH_QUERY(Query_for_list_of_extensions, ""); else if (TailMatchesCS1("\\dm*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_matviews, ""); else if (TailMatchesCS1("\\dE*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_foreign_tables, ""); else if (TailMatchesCS1("\\dy*")) - COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers); + COMPLETE_WITH_QUERY(Query_for_list_of_event_triggers, ""); /* must be at end of \d alternatives: */ else if (TailMatchesCS1("\\d*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_relations, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_relations, ""); else if (TailMatchesCS1("\\ef")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, ""); else if (TailMatchesCS1("\\ev")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, ""); else if (TailMatchesCS1("\\encoding")) - COMPLETE_WITH_QUERY(Query_for_list_of_encodings); + COMPLETE_WITH_QUERY(Query_for_list_of_encodings, ""); else if (TailMatchesCS1("\\h") || TailMatchesCS1("\\help")) COMPLETE_WITH_LIST(sql_commands); else if (TailMatchesCS1("\\l*") && !TailMatchesCS1("\\lo*")) - COMPLETE_WITH_QUERY(Query_for_list_of_databases); + COMPLETE_WITH_QUERY(Query_for_list_of_databases, ""); else if (TailMatchesCS1("\\password")) - COMPLETE_WITH_QUERY(Query_for_list_of_roles); + COMPLETE_WITH_QUERY(Query_for_list_of_roles, ""); else if (TailMatchesCS1("\\pset")) { static const char *const my_list[] = @@ -3495,14 +3504,14 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_LIST_CS3("default", "verbose", "terse"); } else if (TailMatchesCS1("\\sf*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_functions, ""); else if (TailMatchesCS1("\\sv*")) - COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL); + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, ""); else if (TailMatchesCS1("\\cd|\\e|\\edit|\\g|\\i|\\include|" "\\ir|\\include_relative|\\o|\\out|" "\\s|\\w|\\write|\\lo_import")) { - completion_charp = "\\"; + SET_COMP_CHARP("\\"); matches = completion_matches(text, complete_from_files); } @@ -3518,9 +3527,9 @@ psql_completion(const char *text, int start, int end) if (ent) { if (ent->query) - COMPLETE_WITH_QUERY(ent->query); + COMPLETE_WITH_QUERY(ent->query, ""); else if (ent->squery) - COMPLETE_WITH_SCHEMA_QUERY(*ent->squery, NULL); + COMPLETE_WITH_SCHEMA_QUERY(*ent->squery, ""); } } @@ -3782,13 +3791,13 @@ _complete_from_query(int is_schema_query, const char *text, int state) char_length, e_text); /* If an addon query was provided, use it */ - if (completion_charp) - appendPQExpBuffer(&query_buffer, "\n%s", completion_charp); + if (COMPLETION_CHARP[0]) + appendPQExpBuffer(&query_buffer, "\n%s", COMPLETION_CHARP); } else { /* completion_charp is an sprintf-style format string */ - appendPQExpBuffer(&query_buffer, completion_charp, + appendPQExpBuffer(&query_buffer, COMPLETION_CHARP, char_length, e_text, e_info_charp, e_info_charp, e_info_charp2, e_info_charp2); @@ -3903,18 +3912,17 @@ complete_from_list(const char *text, int state) static char * complete_from_const(const char *text, int state) { - Assert(completion_charp != NULL); if (state == 0) { if (completion_case_sensitive) - return pg_strdup(completion_charp); + return pg_strdup(COMPLETION_CHARP); else /* * If case insensitive matching was requested initially, adjust * the case according to setting. */ - return pg_strdup_keyword_case(completion_charp, text); + return pg_strdup_keyword_case(COMPLETION_CHARP, text); } else return NULL; @@ -4015,7 +4023,7 @@ complete_from_files(const char *text, int state) if (state == 0) { /* Initialization: stash the unquoted input. */ - unquoted_text = strtokx(text, "", NULL, "'", *completion_charp, + unquoted_text = strtokx(text, "", NULL, "'", COMPLETION_CHARP[0], false, true, pset.encoding); /* expect a NULL return for the empty string only */ if (!unquoted_text) @@ -4036,7 +4044,7 @@ complete_from_files(const char *text, int state) * bother providing a macro to simplify this. */ ret = quote_if_needed(unquoted_match, " \t\r\n\"`", - '\'', *completion_charp, pset.encoding); + '\'', COMPLETION_CHARP[0], pset.encoding); if (ret) free(unquoted_match); else @@ -4094,7 +4102,7 @@ pg_strdup_keyword_case(const char *s, const char *ref) /* Construct codelet to append given keywords */ static char * -additional_kw_query(char *prefix, const char *ref, int n, ...) +additional_kw_query(const char *ref, int n, ...) { va_list ap; static PQExpBuffer qbuf = NULL; @@ -4105,8 +4113,6 @@ additional_kw_query(char *prefix, const char *ref, int n, ...) else resetPQExpBuffer(qbuf); - appendPQExpBufferStr(qbuf, prefix); - /* Construct an additional queriy to append keywords */ appendPQExpBufferStr(qbuf, " UNION SELECT * FROM (VALUES "); -- 2.9.2