@@ -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 );
0 commit comments