@@ -1669,7 +1669,7 @@ psql_completion(const char *text, int start, int end)
1669
1669
"COMMENT" ,"COMMIT" ,"COPY" ,"CREATE" ,"DEALLOCATE" ,"DECLARE" ,
1670
1670
"DELETE FROM" ,"DISCARD" ,"DO" ,"DROP" ,"END" ,"EXECUTE" ,"EXPLAIN" ,
1671
1671
"FETCH" ,"GRANT" ,"IMPORT FOREIGN SCHEMA" ,"INSERT INTO" ,"LISTEN" ,"LOAD" ,"LOCK" ,
1672
- "MERGE" ,"MOVE" ,"NOTIFY" ,"PREPARE" ,
1672
+ "MERGE INTO " ,"MOVE" ,"NOTIFY" ,"PREPARE" ,
1673
1673
"REASSIGN" ,"REFRESH MATERIALIZED VIEW" ,"REINDEX" ,"RELEASE" ,
1674
1674
"RESET" ,"REVOKE" ,"ROLLBACK" ,
1675
1675
"SAVEPOINT" ,"SECURITY LABEL" ,"SELECT" ,"SET" ,"SHOW" ,"START" ,
@@ -3641,7 +3641,7 @@ psql_completion(const char *text, int start, int end)
3641
3641
*/
3642
3642
else if (Matches ("EXPLAIN" ))
3643
3643
COMPLETE_WITH ("SELECT" ,"INSERT INTO" ,"DELETE FROM" ,"UPDATE" ,"DECLARE" ,
3644
- "MERGE" ,"EXECUTE" ,"ANALYZE" ,"VERBOSE" );
3644
+ "MERGE INTO " ,"EXECUTE" ,"ANALYZE" ,"VERBOSE" );
3645
3645
else if (HeadMatches ("EXPLAIN" ,"(*" )&&
3646
3646
!HeadMatches ("EXPLAIN" ,"(*)" ))
3647
3647
{
@@ -3660,12 +3660,12 @@ psql_completion(const char *text, int start, int end)
3660
3660
}
3661
3661
else if (Matches ("EXPLAIN" ,"ANALYZE" ))
3662
3662
COMPLETE_WITH ("SELECT" ,"INSERT INTO" ,"DELETE FROM" ,"UPDATE" ,"DECLARE" ,
3663
- "MERGE" ,"EXECUTE" ,"VERBOSE" );
3663
+ "MERGE INTO " ,"EXECUTE" ,"VERBOSE" );
3664
3664
else if (Matches ("EXPLAIN" ,"(*)" )||
3665
3665
Matches ("EXPLAIN" ,"VERBOSE" )||
3666
3666
Matches ("EXPLAIN" ,"ANALYZE" ,"VERBOSE" ))
3667
3667
COMPLETE_WITH ("SELECT" ,"INSERT INTO" ,"DELETE FROM" ,"UPDATE" ,"DECLARE" ,
3668
- "MERGE" ,"EXECUTE" );
3668
+ "MERGE INTO " ,"EXECUTE" );
3669
3669
3670
3670
/* FETCH && MOVE */
3671
3671
@@ -4065,58 +4065,90 @@ psql_completion(const char *text, int start, int end)
4065
4065
else if (HeadMatches ("LOCK" )&& TailMatches ("IN" ,"SHARE" ))
4066
4066
COMPLETE_WITH ("MODE" ,"ROW EXCLUSIVE MODE" ,
4067
4067
"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
+
4068
4073
/* MERGE --- can be inside EXPLAIN */
4069
4074
else if (TailMatches ("MERGE" ))
4070
4075
COMPLETE_WITH ("INTO" );
4071
4076
else if (TailMatches ("MERGE" ,"INTO" ))
4072
4077
COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_mergetargets );
4078
+
4079
+ /* Complete MERGE INTO <table> [[AS] <alias>] with USING */
4073
4080
else if (TailMatches ("MERGE" ,"INTO" ,MatchAny ))
4074
4081
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" )))
4081
4084
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" )))
4092
4109
COMPLETE_WITH ("ON" );
4093
- /* ON condition */
4110
+
4111
+ /* Complete MERGE INTO ... ON with target table attributes */
4094
4112
else if (TailMatches ("INTO" ,MatchAny ,"USING" ,MatchAny ,"ON" ))
4095
4113
COMPLETE_WITH_ATTR (prev4_wd );
4096
4114
else if (TailMatches ("INTO" ,MatchAny ,"AS" ,MatchAny ,"USING" ,MatchAny ,"AS" ,MatchAny ,"ON" ))
4097
4115
COMPLETE_WITH_ATTR (prev8_wd );
4098
4116
else if (TailMatches ("INTO" ,MatchAny ,MatchAny ,"USING" ,MatchAny ,MatchAny ,"ON" ))
4099
4117
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" )))
4106
4130
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" ))
4110
4142
COMPLETE_WITH ("THEN" ,"AND" );
4143
+
4144
+ /* Complete ... WHEN MATCHED THEN with UPDATE SET/DELETE/DO NOTHING */
4111
4145
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 */
4113
4149
else if (TailMatches ("WHEN" ,"NOT" ,"MATCHED" ,"THEN" ))
4114
4150
COMPLETE_WITH ("INSERT" ,"DO NOTHING" );
4115
4151
4116
- /* Complete LOCK [TABLE] [ONLY] <table> [IN lockmode MODE] with "NOWAIT" */
4117
- else if (HeadMatches ("LOCK" )&& TailMatches ("MODE" ))
4118
- COMPLETE_WITH ("NOWAIT" );
4119
-
4120
4152
/* NOTIFY --- can be inside EXPLAIN, RULE, etc */
4121
4153
else if (TailMatches ("NOTIFY" ))
4122
4154
COMPLETE_WITH_QUERY (Query_for_list_of_channels );