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