@@ -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 */
36423642else if (Matches ("EXPLAIN" ))
36433643COMPLETE_WITH ("SELECT" ,"INSERT INTO" ,"DELETE FROM" ,"UPDATE" ,"DECLARE" ,
3644- "MERGE" ,"EXECUTE" ,"ANALYZE" ,"VERBOSE" );
3644+ "MERGE INTO " ,"EXECUTE" ,"ANALYZE" ,"VERBOSE" );
36453645else if (HeadMatches ("EXPLAIN" ,"(*" )&&
36463646 !HeadMatches ("EXPLAIN" ,"(*)" ))
36473647{
@@ -3660,12 +3660,12 @@ psql_completion(const char *text, int start, int end)
36603660}
36613661else if (Matches ("EXPLAIN" ,"ANALYZE" ))
36623662COMPLETE_WITH ("SELECT" ,"INSERT INTO" ,"DELETE FROM" ,"UPDATE" ,"DECLARE" ,
3663- "MERGE" ,"EXECUTE" ,"VERBOSE" );
3663+ "MERGE INTO " ,"EXECUTE" ,"VERBOSE" );
36643664else if (Matches ("EXPLAIN" ,"(*)" )||
36653665Matches ("EXPLAIN" ,"VERBOSE" )||
36663666Matches ("EXPLAIN" ,"ANALYZE" ,"VERBOSE" ))
36673667COMPLETE_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)
40654065else if (HeadMatches ("LOCK" )&& TailMatches ("IN" ,"SHARE" ))
40664066COMPLETE_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 */
40694074else if (TailMatches ("MERGE" ))
40704075COMPLETE_WITH ("INTO" );
40714076else if (TailMatches ("MERGE" ,"INTO" ))
40724077COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_mergetargets );
4078+
4079+ /* Complete MERGE INTO <table> [[AS] <alias>] with USING */
40734080else if (TailMatches ("MERGE" ,"INTO" ,MatchAny ))
40744081COMPLETE_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" )))
40814084COMPLETE_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" )))
40924109COMPLETE_WITH ("ON" );
4093- /* ON condition */
4110+
4111+ /* Complete MERGE INTO ... ON with target table attributes */
40944112else if (TailMatches ("INTO" ,MatchAny ,"USING" ,MatchAny ,"ON" ))
40954113COMPLETE_WITH_ATTR (prev4_wd );
40964114else if (TailMatches ("INTO" ,MatchAny ,"AS" ,MatchAny ,"USING" ,MatchAny ,"AS" ,MatchAny ,"ON" ))
40974115COMPLETE_WITH_ATTR (prev8_wd );
40984116else if (TailMatches ("INTO" ,MatchAny ,MatchAny ,"USING" ,MatchAny ,MatchAny ,"ON" ))
40994117COMPLETE_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" )))
41064130COMPLETE_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" ))
41104142COMPLETE_WITH ("THEN" ,"AND" );
4143+
4144+ /* Complete ... WHEN MATCHED THEN with UPDATE SET/DELETE/DO NOTHING */
41114145else 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 */
41134149else if (TailMatches ("WHEN" ,"NOT" ,"MATCHED" ,"THEN" ))
41144150COMPLETE_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 */
41214153else if (TailMatches ("NOTIFY" ))
41224154COMPLETE_WITH_QUERY (Query_for_list_of_channels );