@@ -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