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

Commit 9a69152

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 661ee7b commit 9a69152

File tree

1 file changed

+67
-35
lines changed

1 file changed

+67
-35
lines changed

src/bin/psql/tab-complete.c

+67-35
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",
@@ -3641,7 +3641,7 @@ psql_completion(const char *text, int start, int end)
36413641
*/
36423642
else if (Matches("EXPLAIN"))
36433643
COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
3644-
"MERGE", "EXECUTE", "ANALYZE", "VERBOSE");
3644+
"MERGE INTO", "EXECUTE", "ANALYZE", "VERBOSE");
36453645
else if (HeadMatches("EXPLAIN", "(*") &&
36463646
!HeadMatches("EXPLAIN", "(*)"))
36473647
{
@@ -3660,12 +3660,12 @@ psql_completion(const char *text, int start, int end)
36603660
}
36613661
else if (Matches("EXPLAIN", "ANALYZE"))
36623662
COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
3663-
"MERGE", "EXECUTE", "VERBOSE");
3663+
"MERGE INTO", "EXECUTE", "VERBOSE");
36643664
else if (Matches("EXPLAIN", "(*)") ||
36653665
Matches("EXPLAIN", "VERBOSE") ||
36663666
Matches("EXPLAIN", "ANALYZE", "VERBOSE"))
36673667
COMPLETE_WITH("SELECT", "INSERT INTO", "DELETE FROM", "UPDATE", "DECLARE",
3668-
"MERGE", "EXECUTE");
3668+
"MERGE INTO", "EXECUTE");
36693669

36703670
/* FETCH && MOVE */
36713671

@@ -4065,58 +4065,90 @@ psql_completion(const char *text, int start, int end)
40654065
else if (HeadMatches("LOCK") && TailMatches("IN", "SHARE"))
40664066
COMPLETE_WITH("MODE", "ROW EXCLUSIVE MODE",
40674067
"UPDATE EXCLUSIVE MODE");
4068+
4069+
/* Complete LOCK [TABLE] [ONLY] <table> [IN lockmode MODE] with "NOWAIT" */
4070+
else if (HeadMatches("LOCK") && TailMatches("MODE"))
4071+
COMPLETE_WITH("NOWAIT");
4072+
40684073
/* MERGE --- can be inside EXPLAIN */
40694074
else if (TailMatches("MERGE"))
40704075
COMPLETE_WITH("INTO");
40714076
else if (TailMatches("MERGE", "INTO"))
40724077
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_mergetargets);
4078+
4079+
/* Complete MERGE INTO <table> [[AS] <alias>] with USING */
40734080
else if (TailMatches("MERGE", "INTO", MatchAny))
40744081
COMPLETE_WITH("USING", "AS");
4075-
else if (TailMatches("MERGE", "INTO", MatchAny, "USING"))
4076-
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
4077-
/* with [AS] alias */
4078-
else if (TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny))
4079-
COMPLETE_WITH("USING");
4080-
else if (TailMatches("MERGE", "INTO", MatchAny, MatchAny))
4082+
else if (TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny) ||
4083+
TailMatches("MERGE", "INTO", MatchAny, MatchAnyExcept("USING|AS")))
40814084
COMPLETE_WITH("USING");
4082-
else if (TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING"))
4083-
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
4084-
else if (TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING"))
4085-
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables);
4086-
/* ON */
4087-
else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny))
4088-
COMPLETE_WITH("ON");
4089-
else if (TailMatches("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny))
4090-
COMPLETE_WITH("ON");
4091-
else if (TailMatches("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny))
4085+
4086+
/*
4087+
* Complete MERGE INTO ... USING with a list of relations supporting
4088+
* SELECT
4089+
*/
4090+
else if (TailMatches("MERGE", "INTO", MatchAny, "USING") ||
4091+
TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING") ||
4092+
TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING"))
4093+
COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables);
4094+
4095+
/*
4096+
* Complete MERGE INTO <table> [[AS] <alias>] USING <relations> [[AS]
4097+
* alias] with ON
4098+
*/
4099+
else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny) ||
4100+
TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny) ||
4101+
TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny))
4102+
COMPLETE_WITH("AS", "ON");
4103+
else if (TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny, "AS", MatchAny) ||
4104+
TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny) ||
4105+
TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny, "AS", MatchAny) ||
4106+
TailMatches("MERGE", "INTO", MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")) ||
4107+
TailMatches("MERGE", "INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")) ||
4108+
TailMatches("MERGE", "INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAnyExcept("ON|AS")))
40924109
COMPLETE_WITH("ON");
4093-
/* ON condition */
4110+
4111+
/* Complete MERGE INTO ... ON with target table attributes */
40944112
else if (TailMatches("INTO", MatchAny, "USING", MatchAny, "ON"))
40954113
COMPLETE_WITH_ATTR(prev4_wd);
40964114
else if (TailMatches("INTO", MatchAny, "AS", MatchAny, "USING", MatchAny, "AS", MatchAny, "ON"))
40974115
COMPLETE_WITH_ATTR(prev8_wd);
40984116
else if (TailMatches("INTO", MatchAny, MatchAny, "USING", MatchAny, MatchAny, "ON"))
40994117
COMPLETE_WITH_ATTR(prev6_wd);
4100-
/* WHEN [NOT] MATCHED */
4101-
else if (TailMatches("USING", MatchAny, "ON", MatchAny))
4102-
COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED");
4103-
else if (TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny))
4104-
COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED");
4105-
else if (TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny))
4118+
4119+
/*
4120+
* Complete ... USING <relation> [[AS] alias] ON join condition
4121+
* (consisting of one or three words typically used) with WHEN [NOT]
4122+
* MATCHED
4123+
*/
4124+
else if (TailMatches("USING", MatchAny, "ON", MatchAny) ||
4125+
TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny) ||
4126+
TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny) ||
4127+
TailMatches("USING", MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")) ||
4128+
TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")) ||
4129+
TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, MatchAnyExcept("WHEN"), MatchAnyExcept("WHEN")))
41064130
COMPLETE_WITH("WHEN MATCHED", "WHEN NOT MATCHED");
4107-
else if (TailMatches("WHEN", "MATCHED"))
4108-
COMPLETE_WITH("THEN", "AND");
4109-
else if (TailMatches("WHEN", "NOT", "MATCHED"))
4131+
else if (TailMatches("USING", MatchAny, "ON", MatchAny, "WHEN") ||
4132+
TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, "WHEN") ||
4133+
TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, "WHEN") ||
4134+
TailMatches("USING", MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN") ||
4135+
TailMatches("USING", MatchAny, "AS", MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN") ||
4136+
TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN"))
4137+
COMPLETE_WITH("MATCHED", "NOT MATCHED");
4138+
4139+
/* Complete ... WHEN [NOT] MATCHED with THEN/AND */
4140+
else if (TailMatches("WHEN", "MATCHED") ||
4141+
TailMatches("WHEN", "NOT", "MATCHED"))
41104142
COMPLETE_WITH("THEN", "AND");
4143+
4144+
/* Complete ... WHEN MATCHED THEN with UPDATE SET/DELETE/DO NOTHING */
41114145
else if (TailMatches("WHEN", "MATCHED", "THEN"))
4112-
COMPLETE_WITH("UPDATE", "DELETE");
4146+
COMPLETE_WITH("UPDATE SET", "DELETE", "DO NOTHING");
4147+
4148+
/* Complete ... WHEN NOT MATCHED THEN with INSERT/DO NOTHING */
41134149
else if (TailMatches("WHEN", "NOT", "MATCHED", "THEN"))
41144150
COMPLETE_WITH("INSERT", "DO NOTHING");
41154151

4116-
/* Complete LOCK [TABLE] [ONLY] <table> [IN lockmode MODE] with "NOWAIT" */
4117-
else if (HeadMatches("LOCK") && TailMatches("MODE"))
4118-
COMPLETE_WITH("NOWAIT");
4119-
41204152
/* NOTIFY --- can be inside EXPLAIN, RULE, etc */
41214153
else if (TailMatches("NOTIFY"))
41224154
COMPLETE_WITH_QUERY(Query_for_list_of_channels);

0 commit comments

Comments
 (0)