@@ -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" ,
@@ -3626,7 +3626,7 @@ psql_completion(const char *text, int start, int end)
3626
3626
*/
3627
3627
else if (Matches ("EXPLAIN" ))
3628
3628
COMPLETE_WITH ("SELECT" , "INSERT INTO" , "DELETE FROM" , "UPDATE" , "DECLARE" ,
3629
- "MERGE" , "EXECUTE" , "ANALYZE" , "VERBOSE" );
3629
+ "MERGE INTO " , "EXECUTE" , "ANALYZE" , "VERBOSE" );
3630
3630
else if (HeadMatches ("EXPLAIN" , "(*" ) &&
3631
3631
!HeadMatches ("EXPLAIN" , "(*)" ))
3632
3632
{
@@ -3645,12 +3645,12 @@ psql_completion(const char *text, int start, int end)
3645
3645
}
3646
3646
else if (Matches ("EXPLAIN" , "ANALYZE" ))
3647
3647
COMPLETE_WITH ("SELECT" , "INSERT INTO" , "DELETE FROM" , "UPDATE" , "DECLARE" ,
3648
- "MERGE" , "EXECUTE" , "VERBOSE" );
3648
+ "MERGE INTO " , "EXECUTE" , "VERBOSE" );
3649
3649
else if (Matches ("EXPLAIN" , "(*)" ) ||
3650
3650
Matches ("EXPLAIN" , "VERBOSE" ) ||
3651
3651
Matches ("EXPLAIN" , "ANALYZE" , "VERBOSE" ))
3652
3652
COMPLETE_WITH ("SELECT" , "INSERT INTO" , "DELETE FROM" , "UPDATE" , "DECLARE" ,
3653
- "MERGE" , "EXECUTE" );
3653
+ "MERGE INTO " , "EXECUTE" );
3654
3654
3655
3655
/* FETCH && MOVE */
3656
3656
@@ -4050,58 +4050,90 @@ psql_completion(const char *text, int start, int end)
4050
4050
else if (HeadMatches ("LOCK" ) && TailMatches ("IN" , "SHARE" ))
4051
4051
COMPLETE_WITH ("MODE" , "ROW EXCLUSIVE MODE" ,
4052
4052
"UPDATE EXCLUSIVE MODE" );
4053
+
4054
+ /* Complete LOCK [TABLE] [ONLY] <table> [IN lockmode MODE] with "NOWAIT" */
4055
+ else if (HeadMatches ("LOCK" ) && TailMatches ("MODE" ))
4056
+ COMPLETE_WITH ("NOWAIT" );
4057
+
4053
4058
/* MERGE --- can be inside EXPLAIN */
4054
4059
else if (TailMatches ("MERGE" ))
4055
4060
COMPLETE_WITH ("INTO" );
4056
4061
else if (TailMatches ("MERGE" , "INTO" ))
4057
4062
COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_mergetargets );
4063
+
4064
+ /* Complete MERGE INTO <table> [[AS] <alias>] with USING */
4058
4065
else if (TailMatches ("MERGE" , "INTO" , MatchAny ))
4059
4066
COMPLETE_WITH ("USING" , "AS" );
4060
- else if (TailMatches ("MERGE" , "INTO" , MatchAny , "USING" ))
4061
- COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_tables );
4062
- /* with [AS] alias */
4063
- else if (TailMatches ("MERGE" , "INTO" , MatchAny , "AS" , MatchAny ))
4064
- COMPLETE_WITH ("USING" );
4065
- else if (TailMatches ("MERGE" , "INTO" , MatchAny , MatchAny ))
4067
+ else if (TailMatches ("MERGE" , "INTO" , MatchAny , "AS" , MatchAny ) ||
4068
+ TailMatches ("MERGE" , "INTO" , MatchAny , MatchAnyExcept ("USING|AS" )))
4066
4069
COMPLETE_WITH ("USING" );
4067
- else if (TailMatches ("MERGE" , "INTO" , MatchAny , "AS" , MatchAny , "USING" ))
4068
- COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_tables );
4069
- else if (TailMatches ("MERGE" , "INTO" , MatchAny , MatchAny , "USING" ))
4070
- COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_tables );
4071
- /* ON */
4072
- else if (TailMatches ("MERGE" , "INTO" , MatchAny , "USING" , MatchAny ))
4073
- COMPLETE_WITH ("ON" );
4074
- else if (TailMatches ("INTO" , MatchAny , "AS" , MatchAny , "USING" , MatchAny , "AS" , MatchAny ))
4075
- COMPLETE_WITH ("ON" );
4076
- else if (TailMatches ("INTO" , MatchAny , MatchAny , "USING" , MatchAny , MatchAny ))
4070
+
4071
+ /*
4072
+ * Complete MERGE INTO ... USING with a list of relations supporting
4073
+ * SELECT
4074
+ */
4075
+ else if (TailMatches ("MERGE" , "INTO" , MatchAny , "USING" ) ||
4076
+ TailMatches ("MERGE" , "INTO" , MatchAny , "AS" , MatchAny , "USING" ) ||
4077
+ TailMatches ("MERGE" , "INTO" , MatchAny , MatchAny , "USING" ))
4078
+ COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_selectables );
4079
+
4080
+ /*
4081
+ * Complete MERGE INTO <table> [[AS] <alias>] USING <relations> [[AS]
4082
+ * alias] with ON
4083
+ */
4084
+ else if (TailMatches ("MERGE" , "INTO" , MatchAny , "USING" , MatchAny ) ||
4085
+ TailMatches ("MERGE" , "INTO" , MatchAny , "AS" , MatchAny , "USING" , MatchAny ) ||
4086
+ TailMatches ("MERGE" , "INTO" , MatchAny , MatchAny , "USING" , MatchAny ))
4087
+ COMPLETE_WITH ("AS" , "ON" );
4088
+ else if (TailMatches ("MERGE" , "INTO" , MatchAny , "USING" , MatchAny , "AS" , MatchAny ) ||
4089
+ TailMatches ("MERGE" , "INTO" , MatchAny , "AS" , MatchAny , "USING" , MatchAny , "AS" , MatchAny ) ||
4090
+ TailMatches ("MERGE" , "INTO" , MatchAny , MatchAny , "USING" , MatchAny , "AS" , MatchAny ) ||
4091
+ TailMatches ("MERGE" , "INTO" , MatchAny , "USING" , MatchAny , MatchAnyExcept ("ON|AS" )) ||
4092
+ TailMatches ("MERGE" , "INTO" , MatchAny , "AS" , MatchAny , "USING" , MatchAny , MatchAnyExcept ("ON|AS" )) ||
4093
+ TailMatches ("MERGE" , "INTO" , MatchAny , MatchAny , "USING" , MatchAny , MatchAnyExcept ("ON|AS" )))
4077
4094
COMPLETE_WITH ("ON" );
4078
- /* ON condition */
4095
+
4096
+ /* Complete MERGE INTO ... ON with target table attributes */
4079
4097
else if (TailMatches ("INTO" , MatchAny , "USING" , MatchAny , "ON" ))
4080
4098
COMPLETE_WITH_ATTR (prev4_wd );
4081
4099
else if (TailMatches ("INTO" , MatchAny , "AS" , MatchAny , "USING" , MatchAny , "AS" , MatchAny , "ON" ))
4082
4100
COMPLETE_WITH_ATTR (prev8_wd );
4083
4101
else if (TailMatches ("INTO" , MatchAny , MatchAny , "USING" , MatchAny , MatchAny , "ON" ))
4084
4102
COMPLETE_WITH_ATTR (prev6_wd );
4085
- /* WHEN [NOT] MATCHED */
4086
- else if (TailMatches ("USING" , MatchAny , "ON" , MatchAny ))
4087
- COMPLETE_WITH ("WHEN MATCHED" , "WHEN NOT MATCHED" );
4088
- else if (TailMatches ("USING" , MatchAny , "AS" , MatchAny , "ON" , MatchAny ))
4089
- COMPLETE_WITH ("WHEN MATCHED" , "WHEN NOT MATCHED" );
4090
- else if (TailMatches ("USING" , MatchAny , MatchAny , "ON" , MatchAny ))
4103
+
4104
+ /*
4105
+ * Complete ... USING <relation> [[AS] alias] ON join condition
4106
+ * (consisting of one or three words typically used) with WHEN [NOT]
4107
+ * MATCHED
4108
+ */
4109
+ else if (TailMatches ("USING" , MatchAny , "ON" , MatchAny ) ||
4110
+ TailMatches ("USING" , MatchAny , "AS" , MatchAny , "ON" , MatchAny ) ||
4111
+ TailMatches ("USING" , MatchAny , MatchAny , "ON" , MatchAny ) ||
4112
+ TailMatches ("USING" , MatchAny , "ON" , MatchAny , MatchAnyExcept ("WHEN" ), MatchAnyExcept ("WHEN" )) ||
4113
+ TailMatches ("USING" , MatchAny , "AS" , MatchAny , "ON" , MatchAny , MatchAnyExcept ("WHEN" ), MatchAnyExcept ("WHEN" )) ||
4114
+ TailMatches ("USING" , MatchAny , MatchAny , "ON" , MatchAny , MatchAnyExcept ("WHEN" ), MatchAnyExcept ("WHEN" )))
4091
4115
COMPLETE_WITH ("WHEN MATCHED" , "WHEN NOT MATCHED" );
4092
- else if (TailMatches ("WHEN" , "MATCHED" ))
4093
- COMPLETE_WITH ("THEN" , "AND" );
4094
- else if (TailMatches ("WHEN" , "NOT" , "MATCHED" ))
4116
+ else if (TailMatches ("USING" , MatchAny , "ON" , MatchAny , "WHEN" ) ||
4117
+ TailMatches ("USING" , MatchAny , "AS" , MatchAny , "ON" , MatchAny , "WHEN" ) ||
4118
+ TailMatches ("USING" , MatchAny , MatchAny , "ON" , MatchAny , "WHEN" ) ||
4119
+ TailMatches ("USING" , MatchAny , "ON" , MatchAny , MatchAny , MatchAny , "WHEN" ) ||
4120
+ TailMatches ("USING" , MatchAny , "AS" , MatchAny , "ON" , MatchAny , MatchAny , MatchAny , "WHEN" ) ||
4121
+ TailMatches ("USING" , MatchAny , MatchAny , "ON" , MatchAny , MatchAny , MatchAny , "WHEN" ))
4122
+ COMPLETE_WITH ("MATCHED" , "NOT MATCHED" );
4123
+
4124
+ /* Complete ... WHEN [NOT] MATCHED with THEN/AND */
4125
+ else if (TailMatches ("WHEN" , "MATCHED" ) ||
4126
+ TailMatches ("WHEN" , "NOT" , "MATCHED" ))
4095
4127
COMPLETE_WITH ("THEN" , "AND" );
4128
+
4129
+ /* Complete ... WHEN MATCHED THEN with UPDATE SET/DELETE/DO NOTHING */
4096
4130
else if (TailMatches ("WHEN" , "MATCHED" , "THEN" ))
4097
- COMPLETE_WITH ("UPDATE" , "DELETE" );
4131
+ COMPLETE_WITH ("UPDATE SET" , "DELETE" , "DO NOTHING" );
4132
+
4133
+ /* Complete ... WHEN NOT MATCHED THEN with INSERT/DO NOTHING */
4098
4134
else if (TailMatches ("WHEN" , "NOT" , "MATCHED" , "THEN" ))
4099
4135
COMPLETE_WITH ("INSERT" , "DO NOTHING" );
4100
4136
4101
- /* Complete LOCK [TABLE] [ONLY] <table> [IN lockmode MODE] with "NOWAIT" */
4102
- else if (HeadMatches ("LOCK" ) && TailMatches ("MODE" ))
4103
- COMPLETE_WITH ("NOWAIT" );
4104
-
4105
4137
/* NOTIFY --- can be inside EXPLAIN, RULE, etc */
4106
4138
else if (TailMatches ("NOTIFY" ))
4107
4139
COMPLETE_WITH_QUERY (Query_for_list_of_channels );
0 commit comments