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

Lines changed: 81 additions & 6 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy