Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 4923550

Browse files
Tab completion for MERGE
Author: Pavan Deolasee
1 parent aa3faa3 commit 4923550

File tree

1 file changed

+81
-6
lines changed

1 file changed

+81
-6
lines changed

src/bin/psql/tab-complete.c

+81-6
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,28 @@ static const SchemaQuery Query_for_list_of_updatables = {
659659
NULL
660660
};
661661

662+
/* Relations supporting MERGE */
663+
static const SchemaQuery Query_for_list_of_mergetargets = {
664+
/* min_server_version */
665+
110000,
666+
/* catname */
667+
"pg_catalog.pg_class c",
668+
/* selcondition */
669+
"c.relkind IN (" CppAsString2(RELKIND_RELATION) ", "
670+
CppAsString2(RELKIND_PARTITIONED_TABLE) ") AND "
671+
"c.relhasrules = false AND "
672+
"(c.relhassubclass = false OR "
673+
" c.relkind = " CppAsString2(RELKIND_PARTITIONED_TABLE) ")",
674+
/* viscondition */
675+
"pg_catalog.pg_table_is_visible(c.oid)",
676+
/* namespace */
677+
"c.relnamespace",
678+
/* result */
679+
"pg_catalog.quote_ident(c.relname)",
680+
/* qualresult */
681+
NULL
682+
};
683+
662684
static const SchemaQuery Query_for_list_of_relations = {
663685
/* min_server_version */
664686
0,
@@ -1605,7 +1627,7 @@ psql_completion(const char *text, int start, int end)
16051627
"COMMENT", "COMMIT", "COPY", "CREATE", "DEALLOCATE", "DECLARE",
16061628
"DELETE FROM", "DISCARD", "DO", "DROP", "END", "EXECUTE", "EXPLAIN",
16071629
"FETCH", "GRANT", "IMPORT", "INSERT", "LISTEN", "LOAD", "LOCK",
1608-
"MOVE", "NOTIFY", "PREPARE",
1630+
"MERGE", "MOVE", "NOTIFY", "PREPARE",
16091631
"REASSIGN", "REFRESH MATERIALIZED VIEW", "REINDEX", "RELEASE",
16101632
"RESET", "REVOKE", "ROLLBACK",
16111633
"SAVEPOINT", "SECURITY LABEL", "SELECT", "SET", "SHOW", "START",
@@ -2999,14 +3021,15 @@ psql_completion(const char *text, int start, int end)
29993021
* Complete EXPLAIN [ANALYZE] [VERBOSE] with list of EXPLAIN-able commands
30003022
*/
30013023
else if (Matches1("EXPLAIN"))
3002-
COMPLETE_WITH_LIST7("SELECT", "INSERT", "DELETE", "UPDATE", "DECLARE",
3003-
"ANALYZE", "VERBOSE");
3024+
COMPLETE_WITH_LIST8("SELECT", "INSERT", "DELETE", "UPDATE", "MERGE",
3025+
"DECLARE", "ANALYZE", "VERBOSE");
30043026
else if (Matches2("EXPLAIN", "ANALYZE"))
3005-
COMPLETE_WITH_LIST6("SELECT", "INSERT", "DELETE", "UPDATE", "DECLARE",
3006-
"VERBOSE");
3027+
COMPLETE_WITH_LIST7("SELECT", "INSERT", "DELETE", "UPDATE", "MERGE",
3028+
"DECLARE", "VERBOSE");
30073029
else if (Matches2("EXPLAIN", "VERBOSE") ||
30083030
Matches3("EXPLAIN", "ANALYZE", "VERBOSE"))
3009-
COMPLETE_WITH_LIST5("SELECT", "INSERT", "DELETE", "UPDATE", "DECLARE");
3031+
COMPLETE_WITH_LIST6("SELECT", "INSERT", "DELETE", "UPDATE", "MERGE",
3032+
"DECLARE");
30103033

30113034
/* FETCH && MOVE */
30123035
/* Complete FETCH with one of FORWARD, BACKWARD, RELATIVE */
@@ -3229,6 +3252,9 @@ psql_completion(const char *text, int start, int end)
32293252
COMPLETE_WITH_CONST("SCHEMA");
32303253

32313254
/* INSERT --- can be inside EXPLAIN, RULE, etc */
3255+
/* Complete NOT MATCHED THEN INSERT */
3256+
else if (TailMatches4("NOT", "MATCHED", "THEN", "INSERT"))
3257+
COMPLETE_WITH_LIST2("VALUES", "(");
32323258
/* Complete INSERT with "INTO" */
32333259
else if (TailMatches1("INSERT"))
32343260
COMPLETE_WITH_CONST("INTO");
@@ -3300,6 +3326,55 @@ psql_completion(const char *text, int start, int end)
33003326
Matches5("LOCK", "TABLE", MatchAny, "IN", "SHARE"))
33013327
COMPLETE_WITH_LIST3("MODE", "ROW EXCLUSIVE MODE",
33023328
"UPDATE EXCLUSIVE MODE");
3329+
/* MERGE --- can be inside EXPLAIN */
3330+
else if (TailMatches1("MERGE"))
3331+
COMPLETE_WITH_CONST("INTO");
3332+
else if (TailMatches2("MERGE", "INTO"))
3333+
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_mergetargets, NULL);
3334+
else if (TailMatches3("MERGE", "INTO", MatchAny))
3335+
COMPLETE_WITH_LIST2("USING", "AS");
3336+
else if (TailMatches4("MERGE", "INTO", MatchAny, "USING"))
3337+
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
3338+
/* with [AS] alias */
3339+
else if (TailMatches5("MERGE", "INTO", MatchAny, "AS", MatchAny))
3340+
COMPLETE_WITH_CONST("USING");
3341+
else if (TailMatches4("MERGE", "INTO", MatchAny, MatchAny))
3342+
COMPLETE_WITH_CONST("USING");
3343+
else if (TailMatches6("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING"))
3344+
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
3345+
else if (TailMatches5("MERGE", "INTO", MatchAny, MatchAny, "USING"))
3346+
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
3347+
/* ON */
3348+
else if (TailMatches5("MERGE", "INTO", MatchAny, "USING", MatchAny))
3349+
COMPLETE_WITH_CONST("ON");
3350+
else if (TailMatches8("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny))
3351+
COMPLETE_WITH_CONST("ON");
3352+
else if (TailMatches6("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny))
3353+
COMPLETE_WITH_CONST("ON");
3354+
/* ON condition */
3355+
else if (TailMatches5("INTO", MatchAny, "USING", MatchAny, "ON"))
3356+
COMPLETE_WITH_ATTR(prev4_wd, "");
3357+
else if (TailMatches9("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny, "ON"))
3358+
COMPLETE_WITH_ATTR(prev8_wd, "");
3359+
else if (TailMatches7("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny, "ON"))
3360+
COMPLETE_WITH_ATTR(prev6_wd, "");
3361+
/* WHEN [NOT] MATCHED */
3362+
else if (TailMatches4("USING", MatchAny, "ON", MatchAny))
3363+
COMPLETE_WITH_LIST2("WHEN MATCHED", "WHEN NOT MATCHED");
3364+
else if (TailMatches6("USING", MatchAny, "AS", MatchAny, "ON", MatchAny))
3365+
COMPLETE_WITH_LIST2("WHEN MATCHED", "WHEN NOT MATCHED");
3366+
else if (TailMatches5("USING", MatchAny, MatchAny, "ON", MatchAny))
3367+
COMPLETE_WITH_LIST2("WHEN MATCHED", "WHEN NOT MATCHED");
3368+
else if (TailMatches2("WHEN", "MATCHED"))
3369+
COMPLETE_WITH_LIST2("THEN", "AND");
3370+
else if (TailMatches3("WHEN", "NOT", "MATCHED"))
3371+
COMPLETE_WITH_LIST2("THEN", "AND");
3372+
else if (TailMatches3("WHEN", "MATCHED", "THEN"))
3373+
COMPLETE_WITH_LIST2("UPDATE", "DELETE");
3374+
else if (TailMatches4("WHEN", "NOT", "MATCHED", "THEN"))
3375+
COMPLETE_WITH_LIST2("INSERT", "DO");
3376+
else if (TailMatches5("WHEN", "NOT", "MATCHED", "THEN", "DO"))
3377+
COMPLETE_WITH_CONST("NOTHING");
33033378

33043379
/* NOTIFY --- can be inside EXPLAIN, RULE, etc */
33053380
else if (TailMatches1("NOTIFY"))

0 commit comments

Comments
 (0)