Tab completion for MERGE

Author: Pavan Deolasee
This commit is contained in:
Simon Riggs 2018-04-03 12:18:25 +01:00
parent aa3faa3c7a
commit 4923550c20
1 changed files with 81 additions and 6 deletions

View File

@ -659,6 +659,28 @@ static const SchemaQuery Query_for_list_of_updatables = {
NULL
};
/* Relations supporting MERGE */
static const SchemaQuery Query_for_list_of_mergetargets = {
/* min_server_version */
110000,
/* catname */
"pg_catalog.pg_class c",
/* selcondition */
"c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
CppAsString2(RELKIND_PARTITIONED_TABLE) ") AND "
"c.relhasrules = false AND "
"(c.relhassubclass = false OR "
" c.relkind = " CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
/* viscondition */
"pg_catalog.pg_table_is_visible(c.oid)",
/* namespace */
"c.relnamespace",
/* result */
"pg_catalog.quote_ident(c.relname)",
/* qualresult */
NULL
};
static const SchemaQuery Query_for_list_of_relations = {
/* min_server_version */
0,
@ -1605,7 +1627,7 @@ psql_completion(const char *text, int start, int end)
"COMMENT", "COMMIT", "COPY", "CREATE", "DEALLOCATE", "DECLARE",
"DELETE FROM", "DISCARD", "DO", "DROP", "END", "EXECUTE", "EXPLAIN",
"FETCH", "GRANT", "IMPORT", "INSERT", "LISTEN", "LOAD", "LOCK",
"MOVE", "NOTIFY", "PREPARE",
"MERGE", "MOVE", "NOTIFY", "PREPARE",
"REASSIGN", "REFRESH MATERIALIZED VIEW", "REINDEX", "RELEASE",
"RESET", "REVOKE", "ROLLBACK",
"SAVEPOINT", "SECURITY LABEL", "SELECT", "SET", "SHOW", "START",
@ -2999,14 +3021,15 @@ psql_completion(const char *text, int start, int end)
* Complete EXPLAIN [ANALYZE] [VERBOSE] with list of EXPLAIN-able commands
*/
else if (Matches1("EXPLAIN"))
COMPLETE_WITH_LIST7("SELECT", "INSERT", "DELETE", "UPDATE", "DECLARE",
"ANALYZE", "VERBOSE");
COMPLETE_WITH_LIST8("SELECT", "INSERT", "DELETE", "UPDATE", "MERGE",
"DECLARE", "ANALYZE", "VERBOSE");
else if (Matches2("EXPLAIN", "ANALYZE"))
COMPLETE_WITH_LIST6("SELECT", "INSERT", "DELETE", "UPDATE", "DECLARE",
"VERBOSE");
COMPLETE_WITH_LIST7("SELECT", "INSERT", "DELETE", "UPDATE", "MERGE",
"DECLARE", "VERBOSE");
else if (Matches2("EXPLAIN", "VERBOSE") ||
Matches3("EXPLAIN", "ANALYZE", "VERBOSE"))
COMPLETE_WITH_LIST5("SELECT", "INSERT", "DELETE", "UPDATE", "DECLARE");
COMPLETE_WITH_LIST6("SELECT", "INSERT", "DELETE", "UPDATE", "MERGE",
"DECLARE");
/* FETCH && MOVE */
/* Complete FETCH with one of FORWARD, BACKWARD, RELATIVE */
@ -3229,6 +3252,9 @@ psql_completion(const char *text, int start, int end)
COMPLETE_WITH_CONST("SCHEMA");
/* INSERT --- can be inside EXPLAIN, RULE, etc */
/* Complete NOT MATCHED THEN INSERT */
else if (TailMatches4("NOT", "MATCHED", "THEN", "INSERT"))
COMPLETE_WITH_LIST2("VALUES", "(");
/* Complete INSERT with "INTO" */
else if (TailMatches1("INSERT"))
COMPLETE_WITH_CONST("INTO");
@ -3300,6 +3326,55 @@ psql_completion(const char *text, int start, int end)
Matches5("LOCK", "TABLE", MatchAny, "IN", "SHARE"))
COMPLETE_WITH_LIST3("MODE", "ROW EXCLUSIVE MODE",
"UPDATE EXCLUSIVE MODE");
/* MERGE --- can be inside EXPLAIN */
else if (TailMatches1("MERGE"))
COMPLETE_WITH_CONST("INTO");
else if (TailMatches2("MERGE", "INTO"))
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_mergetargets, NULL);
else if (TailMatches3("MERGE", "INTO", MatchAny))
COMPLETE_WITH_LIST2("USING", "AS");
else if (TailMatches4("MERGE", "INTO", MatchAny, "USING"))
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
/* with [AS] alias */
else if (TailMatches5("MERGE", "INTO", MatchAny, "AS", MatchAny))
COMPLETE_WITH_CONST("USING");
else if (TailMatches4("MERGE", "INTO", MatchAny, MatchAny))
COMPLETE_WITH_CONST("USING");
else if (TailMatches6("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING"))
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
else if (TailMatches5("MERGE", "INTO", MatchAny, MatchAny, "USING"))
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
/* ON */
else if (TailMatches5("MERGE", "INTO", MatchAny, "USING", MatchAny))
COMPLETE_WITH_CONST("ON");
else if (TailMatches8("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny))
COMPLETE_WITH_CONST("ON");
else if (TailMatches6("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny))
COMPLETE_WITH_CONST("ON");
/* ON condition */
else if (TailMatches5("INTO", MatchAny, "USING", MatchAny, "ON"))
COMPLETE_WITH_ATTR(prev4_wd, "");
else if (TailMatches9("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny, "ON"))
COMPLETE_WITH_ATTR(prev8_wd, "");
else if (TailMatches7("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny, "ON"))
COMPLETE_WITH_ATTR(prev6_wd, "");
/* WHEN [NOT] MATCHED */
else if (TailMatches4("USING", MatchAny, "ON", MatchAny))
COMPLETE_WITH_LIST2("WHEN MATCHED", "WHEN NOT MATCHED");
else if (TailMatches6("USING", MatchAny, "AS", MatchAny, "ON", MatchAny))
COMPLETE_WITH_LIST2("WHEN MATCHED", "WHEN NOT MATCHED");
else if (TailMatches5("USING", MatchAny, MatchAny, "ON", MatchAny))
COMPLETE_WITH_LIST2("WHEN MATCHED", "WHEN NOT MATCHED");
else if (TailMatches2("WHEN", "MATCHED"))
COMPLETE_WITH_LIST2("THEN", "AND");
else if (TailMatches3("WHEN", "NOT", "MATCHED"))
COMPLETE_WITH_LIST2("THEN", "AND");
else if (TailMatches3("WHEN", "MATCHED", "THEN"))
COMPLETE_WITH_LIST2("UPDATE", "DELETE");
else if (TailMatches4("WHEN", "NOT", "MATCHED", "THEN"))
COMPLETE_WITH_LIST2("INSERT", "DO");
else if (TailMatches5("WHEN", "NOT", "MATCHED", "THEN", "DO"))
COMPLETE_WITH_CONST("NOTHING");
/* NOTIFY --- can be inside EXPLAIN, RULE, etc */
else if (TailMatches1("NOTIFY"))