Skip to content

Commit f80919d

Browse files
committed
psql: Improve tab-completion for MERGE.
Commit 7103ebb added the tab-completion for MERGE accidentally in the middle of that for LOCK TABLE. This commit fixes this issue. This also adds some tab-completion for MERGE. Back-patch to v15 where MERGE was introduced. Author: Kotaro Kawamoto, Fujii Masao Reviewed-by: Shinya Kato, Álvaro Herrera Discussion: https://postgr.es/m/9f1ad2a87a58cd5e7d64f3993130958d@oss.nttdata.com
1 parent 0c40044 commit f80919d

File tree

1 file changed

+67
-35
lines changed

1 file changed

+67
-35
lines changed

src/bin/psql/tab-complete.c

Lines changed: 67 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1669,7 +1669,7 @@ psql_completion(const char *text, int start, int end)
16691669
"COMMENT", "COMMIT", "COPY", "CREATE", "DEALLOCATE", "DECLARE",
16701670
"DELETE FROM", "DISCARD", "DO", "DROP", "END", "EXECUTE", "EXPLAIN",
16711671
"FETCH", "GRANT", "IMPORT FOREIGN SCHEMA", "INSERT INTO", "LISTEN", "LOAD", "LOCK",
1672-
"MERGE", "MOVE", "NOTIFY", "PREPARE",
1672+
"MERGE INTO", "MOVE", "NOTIFY", "PREPARE",
16731673
"REASSIGN", "REFRESH MATERIALIZED VIEW", "REINDEX", "RELEASE",
16741674
"RESET", "REVOKE", "ROLLBACK",
16751675
"SAVEPOINT", "SECURITY LABEL", "SELECT", "SET", "SHOW", "START",
@@ -3626,7 +3626,7 @@ psql_completion(const char *text, int start, int end)
36263626
*/
36273627
else if (Matches("EXPLAIN"))
36283628
COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
3629-
"MERGE", "EXECUTE", "ANALYZE", "VERBOSE");
3629+
"MERGE INTO", "EXECUTE", "ANALYZE", "VERBOSE");
36303630
else if (HeadMatches("EXPLAIN", "(*") &&
36313631
!HeadMatches("EXPLAIN", "(*)"))
36323632
{
@@ -3645,12 +3645,12 @@ psql_completion(const char *text, int start, int end)
36453645
}
36463646
else if (Matches("EXPLAIN", "ANALYZE"))
36473647
COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
3648-
"MERGE", "EXECUTE", "VERBOSE");
3648+
"MERGE INTO", "EXECUTE", "VERBOSE");
36493649
else if (Matches("EXPLAIN", "(*)") ||
36503650
Matches("EXPLAIN", "VERBOSE") ||
36513651
Matches("EXPLAIN", "ANALYZE", "VERBOSE"))
36523652
COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
3653-
"MERGE", "EXECUTE");
3653+
"MERGE INTO", "EXECUTE");
36543654

36553655
/* FETCH && MOVE */
36563656

@@ -4050,58 +4050,90 @@ psql_completion(const char *text, int start, int end)
40504050
else if (HeadMatches("LOCK") && TailMatches("IN", "SHARE"))
40514051
COMPLETE_WITH("MODE", "ROW EXCLUSIVE MODE",
40524052
"UPDATE EXCLUSIVE MODE");
4053+
4054+
/* Complete LOCK [TABLE] [ONLY] <table> [IN lockmode MODE] with "NOWAIT" */
4055+
else if (HeadMatches("LOCK") && TailMatches("MODE"))
4056+
COMPLETE_WITH("NOWAIT");
4057+
40534058
/* MERGE --- can be inside EXPLAIN */
40544059
else if (TailMatches("MERGE"))
40554060
COMPLETE_WITH("INTO");
40564061
else if (TailMatches("MERGE", "INTO"))
40574062
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_mergetargets);
4063+
4064+
/* Complete MERGE INTO <table> [[AS] <alias>] with USING */
40584065
else if (TailMatches("MERGE", "INTO", MatchAny))
40594066
COMPLETE_WITH("USING", "AS");
4060-
else if (TailMatches("MERGE", "INTO", MatchAny, "USING"))
4061-
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
4062-
/* with [AS] alias */
4063-
else if (TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny))
4064-
COMPLETE_WITH("USING");
4065-
else if (TailMatches("MERGE", "INTO", MatchAny, MatchAny))
4067+
else if (TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny) ||
4068+
TailMatches("MERGE", "INTO", MatchAny, MatchAnyExcept("USING|AS")))
40664069
COMPLETE_WITH("USING");
4067-
else if (TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING"))
4068-
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
4069-
else if (TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING"))
4070-
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
4071-
/* ON */
4072-
else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny))
4073-
COMPLETE_WITH("ON");
4074-
else if (TailMatches("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny))
4075-
COMPLETE_WITH("ON");
4076-
else if (TailMatches("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny))
4070+
4071+
/*
4072+
* Complete MERGE INTO ... USING with a list of relations supporting
4073+
* SELECT
4074+
*/
4075+
else if (TailMatches("MERGE", "INTO", MatchAny, "USING") ||
4076+
TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING") ||
4077+
TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING"))
4078+
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
4079+
4080+
/*
4081+
* Complete MERGE INTO <table> [[AS] <alias>] USING <relations> [[AS]
4082+
* alias] with ON
4083+
*/
4084+
else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny) ||
4085+
TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny) ||
4086+
TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny))
4087+
COMPLETE_WITH("AS", "ON");
4088+
else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny, "AS", MatchAny) ||
4089+
TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny) ||
4090+
TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny, "AS", MatchAny) ||
4091+
TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")) ||
4092+
TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")) ||
4093+
TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")))
40774094
COMPLETE_WITH("ON");
4078-
/* ON condition */
4095+
4096+
/* Complete MERGE INTO ... ON with target table attributes */
40794097
else if (TailMatches("INTO", MatchAny, "USING", MatchAny, "ON"))
40804098
COMPLETE_WITH_ATTR(prev4_wd);
40814099
else if (TailMatches("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny, "ON"))
40824100
COMPLETE_WITH_ATTR(prev8_wd);
40834101
else if (TailMatches("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny, "ON"))
40844102
COMPLETE_WITH_ATTR(prev6_wd);
4085-
/* WHEN [NOT] MATCHED */
4086-
else if (TailMatches("USING", MatchAny, "ON", MatchAny))
4087-
COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED");
4088-
else if (TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny))
4089-
COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED");
4090-
else if (TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny))
4103+
4104+
/*
4105+
* Complete ... USING <relation> [[AS] alias] ON join condition
4106+
* (consisting of one or three words typically used) with WHEN [NOT]
4107+
* MATCHED
4108+
*/
4109+
else if (TailMatches("USING", MatchAny, "ON", MatchAny) ||
4110+
TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny) ||
4111+
TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny) ||
4112+
TailMatches("USING", MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")) ||
4113+
TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")) ||
4114+
TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")))
40914115
COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED");
4092-
else if (TailMatches("WHEN", "MATCHED"))
4093-
COMPLETE_WITH("THEN", "AND");
4094-
else if (TailMatches("WHEN", "NOT", "MATCHED"))
4116+
else if (TailMatches("USING", MatchAny, "ON", MatchAny, "WHEN") ||
4117+
TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, "WHEN") ||
4118+
TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, "WHEN") ||
4119+
TailMatches("USING", MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN") ||
4120+
TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN") ||
4121+
TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN"))
4122+
COMPLETE_WITH("MATCHED", "NOT MATCHED");
4123+
4124+
/* Complete ... WHEN [NOT] MATCHED with THEN/AND */
4125+
else if (TailMatches("WHEN", "MATCHED") ||
4126+
TailMatches("WHEN", "NOT", "MATCHED"))
40954127
COMPLETE_WITH("THEN", "AND");
4128+
4129+
/* Complete ... WHEN MATCHED THEN with UPDATE SET/DELETE/DO NOTHING */
40964130
else if (TailMatches("WHEN", "MATCHED", "THEN"))
4097-
COMPLETE_WITH("UPDATE", "DELETE");
4131+
COMPLETE_WITH("UPDATE SET", "DELETE", "DO NOTHING");
4132+
4133+
/* Complete ... WHEN NOT MATCHED THEN with INSERT/DO NOTHING */
40984134
else if (TailMatches("WHEN", "NOT", "MATCHED", "THEN"))
40994135
COMPLETE_WITH("INSERT", "DO NOTHING");
41004136

4101-
/* Complete LOCK [TABLE] [ONLY] <table> [IN lockmode MODE] with "NOWAIT" */
4102-
else if (HeadMatches("LOCK") && TailMatches("MODE"))
4103-
COMPLETE_WITH("NOWAIT");
4104-
41054137
/* NOTIFY --- can be inside EXPLAIN, RULE, etc */
41064138
else if (TailMatches("NOTIFY"))
41074139
COMPLETE_WITH_QUERY(Query_for_list_of_channels);

0 commit comments

Comments
 (0)