@@ -659,6 +659,28 @@ static const SchemaQuery Query_for_list_of_updatables = {
659
659
NULL
660
660
};
661
661
662
+ /* Relations supporting MERGE */
663
+ static const SchemaQuery Query_for_list_of_mergetargets = {
664
+ /* min_server_version */
665
+ 110000 ,
666
+ /* catname */
667
+ "pg_catalog.pg_class c" ,
668
+ /* selcondition */
669
+ "c.relkind IN (" CppAsString2 (RELKIND_RELATION )", "
670
+ CppAsString2 (RELKIND_PARTITIONED_TABLE )") AND "
671
+ "c.relhasrules = false AND "
672
+ "(c.relhassubclass = false OR "
673
+ " c.relkind = " CppAsString2 (RELKIND_PARTITIONED_TABLE )")" ,
674
+ /* viscondition */
675
+ "pg_catalog.pg_table_is_visible(c.oid)" ,
676
+ /* namespace */
677
+ "c.relnamespace" ,
678
+ /* result */
679
+ "pg_catalog.quote_ident(c.relname)" ,
680
+ /* qualresult */
681
+ NULL
682
+ };
683
+
662
684
static const SchemaQuery Query_for_list_of_relations = {
663
685
/* min_server_version */
664
686
0 ,
@@ -1605,7 +1627,7 @@ psql_completion(const char *text, int start, int end)
1605
1627
"COMMENT" ,"COMMIT" ,"COPY" ,"CREATE" ,"DEALLOCATE" ,"DECLARE" ,
1606
1628
"DELETE FROM" ,"DISCARD" ,"DO" ,"DROP" ,"END" ,"EXECUTE" ,"EXPLAIN" ,
1607
1629
"FETCH" ,"GRANT" ,"IMPORT" ,"INSERT" ,"LISTEN" ,"LOAD" ,"LOCK" ,
1608
- "MOVE" ,"NOTIFY" ,"PREPARE" ,
1630
+ "MERGE" , " MOVE" ,"NOTIFY" ,"PREPARE" ,
1609
1631
"REASSIGN" ,"REFRESH MATERIALIZED VIEW" ,"REINDEX" ,"RELEASE" ,
1610
1632
"RESET" ,"REVOKE" ,"ROLLBACK" ,
1611
1633
"SAVEPOINT" ,"SECURITY LABEL" ,"SELECT" ,"SET" ,"SHOW" ,"START" ,
@@ -2999,14 +3021,15 @@ psql_completion(const char *text, int start, int end)
2999
3021
* Complete EXPLAIN [ANALYZE] [VERBOSE] with list of EXPLAIN-able commands
3000
3022
*/
3001
3023
else if (Matches1 ("EXPLAIN" ))
3002
- COMPLETE_WITH_LIST7 ("SELECT" ,"INSERT" ,"DELETE" ,"UPDATE" ,"DECLARE " ,
3003
- "ANALYZE" ,"VERBOSE" );
3024
+ COMPLETE_WITH_LIST8 ("SELECT" ,"INSERT" ,"DELETE" ,"UPDATE" ,"MERGE " ,
3025
+ "DECLARE" , " ANALYZE" ,"VERBOSE" );
3004
3026
else if (Matches2 ("EXPLAIN" ,"ANALYZE" ))
3005
- COMPLETE_WITH_LIST6 ("SELECT" ,"INSERT" ,"DELETE" ,"UPDATE" ,"DECLARE " ,
3006
- "VERBOSE" );
3027
+ COMPLETE_WITH_LIST7 ("SELECT" ,"INSERT" ,"DELETE" ,"UPDATE" ,"MERGE " ,
3028
+ "DECLARE" , " VERBOSE" );
3007
3029
else if (Matches2 ("EXPLAIN" ,"VERBOSE" )||
3008
3030
Matches3 ("EXPLAIN" ,"ANALYZE" ,"VERBOSE" ))
3009
- COMPLETE_WITH_LIST5 ("SELECT" ,"INSERT" ,"DELETE" ,"UPDATE" ,"DECLARE" );
3031
+ COMPLETE_WITH_LIST6 ("SELECT" ,"INSERT" ,"DELETE" ,"UPDATE" ,"MERGE" ,
3032
+ "DECLARE" );
3010
3033
3011
3034
/* FETCH && MOVE */
3012
3035
/* Complete FETCH with one of FORWARD, BACKWARD, RELATIVE */
@@ -3229,6 +3252,9 @@ psql_completion(const char *text, int start, int end)
3229
3252
COMPLETE_WITH_CONST ("SCHEMA" );
3230
3253
3231
3254
/* INSERT --- can be inside EXPLAIN, RULE, etc */
3255
+ /* Complete NOT MATCHED THEN INSERT */
3256
+ else if (TailMatches4 ("NOT" ,"MATCHED" ,"THEN" ,"INSERT" ))
3257
+ COMPLETE_WITH_LIST2 ("VALUES" ,"(" );
3232
3258
/* Complete INSERT with "INTO" */
3233
3259
else if (TailMatches1 ("INSERT" ))
3234
3260
COMPLETE_WITH_CONST ("INTO" );
@@ -3300,6 +3326,55 @@ psql_completion(const char *text, int start, int end)
3300
3326
Matches5 ("LOCK" ,"TABLE" ,MatchAny ,"IN" ,"SHARE" ))
3301
3327
COMPLETE_WITH_LIST3 ("MODE" ,"ROW EXCLUSIVE MODE" ,
3302
3328
"UPDATE EXCLUSIVE MODE" );
3329
+ /* MERGE --- can be inside EXPLAIN */
3330
+ else if (TailMatches1 ("MERGE" ))
3331
+ COMPLETE_WITH_CONST ("INTO" );
3332
+ else if (TailMatches2 ("MERGE" ,"INTO" ))
3333
+ COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_mergetargets ,NULL );
3334
+ else if (TailMatches3 ("MERGE" ,"INTO" ,MatchAny ))
3335
+ COMPLETE_WITH_LIST2 ("USING" ,"AS" );
3336
+ else if (TailMatches4 ("MERGE" ,"INTO" ,MatchAny ,"USING" ))
3337
+ COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_tables ,NULL );
3338
+ /* with [AS] alias */
3339
+ else if (TailMatches5 ("MERGE" ,"INTO" ,MatchAny ,"AS" ,MatchAny ))
3340
+ COMPLETE_WITH_CONST ("USING" );
3341
+ else if (TailMatches4 ("MERGE" ,"INTO" ,MatchAny ,MatchAny ))
3342
+ COMPLETE_WITH_CONST ("USING" );
3343
+ else if (TailMatches6 ("MERGE" ,"INTO" ,MatchAny ,"AS" ,MatchAny ,"USING" ))
3344
+ COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_tables ,NULL );
3345
+ else if (TailMatches5 ("MERGE" ,"INTO" ,MatchAny ,MatchAny ,"USING" ))
3346
+ COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_tables ,NULL );
3347
+ /* ON */
3348
+ else if (TailMatches5 ("MERGE" ,"INTO" ,MatchAny ,"USING" ,MatchAny ))
3349
+ COMPLETE_WITH_CONST ("ON" );
3350
+ else if (TailMatches8 ("INTO" ,MatchAny ,"AS" ,MatchAny ,"USING" ,MatchAny ,"AS" ,MatchAny ))
3351
+ COMPLETE_WITH_CONST ("ON" );
3352
+ else if (TailMatches6 ("INTO" ,MatchAny ,MatchAny ,"USING" ,MatchAny ,MatchAny ))
3353
+ COMPLETE_WITH_CONST ("ON" );
3354
+ /* ON condition */
3355
+ else if (TailMatches5 ("INTO" ,MatchAny ,"USING" ,MatchAny ,"ON" ))
3356
+ COMPLETE_WITH_ATTR (prev4_wd ,"" );
3357
+ else if (TailMatches9 ("INTO" ,MatchAny ,"AS" ,MatchAny ,"USING" ,MatchAny ,"AS" ,MatchAny ,"ON" ))
3358
+ COMPLETE_WITH_ATTR (prev8_wd ,"" );
3359
+ else if (TailMatches7 ("INTO" ,MatchAny ,MatchAny ,"USING" ,MatchAny ,MatchAny ,"ON" ))
3360
+ COMPLETE_WITH_ATTR (prev6_wd ,"" );
3361
+ /* WHEN [NOT] MATCHED */
3362
+ else if (TailMatches4 ("USING" ,MatchAny ,"ON" ,MatchAny ))
3363
+ COMPLETE_WITH_LIST2 ("WHEN MATCHED" ,"WHEN NOT MATCHED" );
3364
+ else if (TailMatches6 ("USING" ,MatchAny ,"AS" ,MatchAny ,"ON" ,MatchAny ))
3365
+ COMPLETE_WITH_LIST2 ("WHEN MATCHED" ,"WHEN NOT MATCHED" );
3366
+ else if (TailMatches5 ("USING" ,MatchAny ,MatchAny ,"ON" ,MatchAny ))
3367
+ COMPLETE_WITH_LIST2 ("WHEN MATCHED" ,"WHEN NOT MATCHED" );
3368
+ else if (TailMatches2 ("WHEN" ,"MATCHED" ))
3369
+ COMPLETE_WITH_LIST2 ("THEN" ,"AND" );
3370
+ else if (TailMatches3 ("WHEN" ,"NOT" ,"MATCHED" ))
3371
+ COMPLETE_WITH_LIST2 ("THEN" ,"AND" );
3372
+ else if (TailMatches3 ("WHEN" ,"MATCHED" ,"THEN" ))
3373
+ COMPLETE_WITH_LIST2 ("UPDATE" ,"DELETE" );
3374
+ else if (TailMatches4 ("WHEN" ,"NOT" ,"MATCHED" ,"THEN" ))
3375
+ COMPLETE_WITH_LIST2 ("INSERT" ,"DO" );
3376
+ else if (TailMatches5 ("WHEN" ,"NOT" ,"MATCHED" ,"THEN" ,"DO" ))
3377
+ COMPLETE_WITH_CONST ("NOTHING" );
3303
3378
3304
3379
/* NOTIFY --- can be inside EXPLAIN, RULE, etc */
3305
3380
else if (TailMatches1 ("NOTIFY" ))