@@ -841,7 +841,7 @@ psql_completion(char *text, int start, int end)
841
841
842
842
/* ALTER SCHEMA <name> */
843
843
else if (pg_strcasecmp (prev3_wd ,"ALTER" )== 0 &&
844
- pg_strcasecmp (prev2_wd ,"SCHEMA" )== 0 )
844
+ pg_strcasecmp (prev2_wd ,"SCHEMA" )== 0 )
845
845
{
846
846
static const char * const list_ALTERGEN []=
847
847
{"OWNER TO" ,"RENAME TO" ,NULL };
@@ -906,7 +906,7 @@ psql_completion(char *text, int start, int end)
906
906
pg_strcasecmp (prev2_wd ,"WRAPPER" )== 0 )
907
907
{
908
908
static const char * const list_ALTER_FDW []=
909
- {"VALIDATOR" ,"OPTIONS" ,"OWNER TO" ,NULL };
909
+ {"HANDLER" , " VALIDATOR" ,"OPTIONS" ,"OWNER TO" ,NULL };
910
910
911
911
COMPLETE_WITH_LIST (list_ALTER_FDW );
912
912
}
@@ -1128,15 +1128,15 @@ psql_completion(char *text, int start, int end)
1128
1128
COMPLETE_WITH_CONST ("RENAME TO" );
1129
1129
1130
1130
/*
1131
- * If we detect ALTER TABLE <name>, suggest either ADD, DROP, ALTER,
1132
- * RENAME, CLUSTER ON or OWNER
1131
+ * If we detect ALTER TABLE <name>, suggest sub commands
1133
1132
*/
1134
1133
else if (pg_strcasecmp (prev3_wd ,"ALTER" )== 0 &&
1135
1134
pg_strcasecmp (prev2_wd ,"TABLE" )== 0 )
1136
1135
{
1137
1136
static const char * const list_ALTER2 []=
1138
1137
{"ADD" ,"ALTER" ,"CLUSTER ON" ,"DISABLE" ,"DROP" ,"ENABLE" ,"INHERIT" ,
1139
- "NO INHERIT" ,"RENAME" ,"RESET" ,"OWNER TO" ,"SET" ,NULL };
1138
+ "NO INHERIT" ,"RENAME" ,"RESET" ,"OWNER TO" ,"SET" ,
1139
+ "VALIDATE CONSTRAINT" ,NULL };
1140
1140
1141
1141
COMPLETE_WITH_LIST (list_ALTER2 );
1142
1142
}
@@ -1420,11 +1420,21 @@ psql_completion(char *text, int start, int end)
1420
1420
pg_strcasecmp (prev2_wd ,"TYPE" )== 0 )
1421
1421
{
1422
1422
static const char * const list_ALTERTYPE []=
1423
- {"ADD ATTRIBUTE" ,"ALTER ATTRIBUTE" ,"DROP ATTRIBUTE" ,
1423
+ {"ADD ATTRIBUTE" ,"ADD VALUE" , " ALTER ATTRIBUTE" ,"DROP ATTRIBUTE" ,
1424
1424
"OWNER TO" ,"RENAME" ,"SET SCHEMA" ,NULL };
1425
1425
1426
1426
COMPLETE_WITH_LIST (list_ALTERTYPE );
1427
1427
}
1428
+ /* complete ALTER TYPE <foo> ADD with actions */
1429
+ else if (pg_strcasecmp (prev4_wd ,"ALTER" )== 0 &&
1430
+ pg_strcasecmp (prev3_wd ,"TYPE" )== 0 &&
1431
+ pg_strcasecmp (prev_wd ,"ADD" )== 0 )
1432
+ {
1433
+ static const char * const list_ALTERTYPE []=
1434
+ {"ATTRIBUTE" ,"VALUE" ,NULL };
1435
+
1436
+ COMPLETE_WITH_LIST (list_ALTERTYPE );
1437
+ }
1428
1438
/* ALTER TYPE <foo> RENAME */
1429
1439
else if (pg_strcasecmp (prev4_wd ,"ALTER" )== 0 &&
1430
1440
pg_strcasecmp (prev3_wd ,"TYPE" )== 0 &&
@@ -1598,7 +1608,7 @@ psql_completion(char *text, int start, int end)
1598
1608
pg_strcasecmp (prev2_wd ,"TO" )== 0 ))
1599
1609
{
1600
1610
static const char * const list_COPY []=
1601
- {"BINARY" ,"OIDS" ,"DELIMITER" ,"NULL" ,"CSV" ,NULL };
1611
+ {"BINARY" ,"OIDS" ,"DELIMITER" ,"NULL" ,"CSV" ,"ENCODING" , NULL };
1602
1612
1603
1613
COMPLETE_WITH_LIST (list_COPY );
1604
1614
}
@@ -1609,7 +1619,7 @@ psql_completion(char *text, int start, int end)
1609
1619
pg_strcasecmp (prev3_wd ,"TO" )== 0 ))
1610
1620
{
1611
1621
static const char * const list_CSV []=
1612
- {"HEADER" ,"QUOTE" ,"ESCAPE" ,"FORCE QUOTE" ,NULL };
1622
+ {"HEADER" ,"QUOTE" ,"ESCAPE" ,"FORCE QUOTE" ,"FORCE NOT NULL" , NULL };
1613
1623
1614
1624
COMPLETE_WITH_LIST (list_CSV );
1615
1625
}
@@ -1655,7 +1665,12 @@ psql_completion(char *text, int start, int end)
1655
1665
pg_strcasecmp (prev4_wd ,"FOREIGN" )== 0 &&
1656
1666
pg_strcasecmp (prev3_wd ,"DATA" )== 0 &&
1657
1667
pg_strcasecmp (prev2_wd ,"WRAPPER" )== 0 )
1658
- COMPLETE_WITH_CONST ("VALIDATOR" );
1668
+ {
1669
+ static const char * const list_CREATE_FOREIGN_DATA_WRAPPER []=
1670
+ {"HANDLER" ,"VALIDATOR" ,NULL };
1671
+
1672
+ COMPLETE_WITH_LIST (list_CREATE_FOREIGN_DATA_WRAPPER );
1673
+ }
1659
1674
1660
1675
/* CREATE INDEX */
1661
1676
/* First off we complete CREATE UNIQUE with "INDEX" */
@@ -1836,11 +1851,25 @@ psql_completion(char *text, int start, int end)
1836
1851
1837
1852
COMPLETE_WITH_LIST (list_CREATETRIGGER_EVENTS );
1838
1853
}
1839
- /* complete CREATE TRIGGER <name>BEFORE,AFTER sth withOR,ON */
1854
+ /* complete CREATE TRIGGER <name>INSTEAD OF withan event */
1840
1855
else if (pg_strcasecmp (prev5_wd ,"CREATE" )== 0 &&
1841
1856
pg_strcasecmp (prev4_wd ,"TRIGGER" )== 0 &&
1842
- (pg_strcasecmp (prev2_wd ,"BEFORE" )== 0 ||
1843
- pg_strcasecmp (prev2_wd ,"AFTER" )== 0 ))
1857
+ pg_strcasecmp (prev2_wd ,"INSTEAD" )== 0 &&
1858
+ pg_strcasecmp (prev_wd ,"OF" )== 0 )
1859
+ {
1860
+ static const char * const list_CREATETRIGGER_EVENTS []=
1861
+ {"INSERT" ,"DELETE" ,"UPDATE" ,NULL };
1862
+
1863
+ COMPLETE_WITH_LIST (list_CREATETRIGGER_EVENTS );
1864
+ }
1865
+ /* complete CREATE TRIGGER <name> BEFORE,AFTER sth with OR,ON */
1866
+ else if ((pg_strcasecmp (prev5_wd ,"CREATE" )== 0 &&
1867
+ pg_strcasecmp (prev4_wd ,"TRIGGER" )== 0 &&
1868
+ (pg_strcasecmp (prev2_wd ,"BEFORE" )== 0 ||
1869
+ pg_strcasecmp (prev2_wd ,"AFTER" )== 0 ))||
1870
+ (pg_strcasecmp (prev5_wd ,"TRIGGER" )== 0 &&
1871
+ pg_strcasecmp (prev3_wd ,"INSTEAD" )== 0 &&
1872
+ pg_strcasecmp (prev2_wd ,"OF" )== 0 ))
1844
1873
{
1845
1874
static const char * const list_CREATETRIGGER2 []=
1846
1875
{"ON" ,"OR" ,NULL };
@@ -1857,6 +1886,11 @@ psql_completion(char *text, int start, int end)
1857
1886
pg_strcasecmp (prev3_wd ,"AFTER" )== 0 )&&
1858
1887
pg_strcasecmp (prev_wd ,"ON" )== 0 )
1859
1888
COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_tables ,NULL );
1889
+ /* complete CREATE TRIGGER ... INSTEAD OF event ON with a list of views */
1890
+ else if (pg_strcasecmp (prev4_wd ,"INSTEAD" )== 0 &&
1891
+ pg_strcasecmp (prev3_wd ,"OF" )== 0 &&
1892
+ pg_strcasecmp (prev_wd ,"ON" )== 0 )
1893
+ COMPLETE_WITH_SCHEMA_QUERY (Query_for_list_of_views ,NULL );
1860
1894
/* complete CREATE TRIGGER ... EXECUTE with PROCEDURE */
1861
1895
else if (pg_strcasecmp (prev_wd ,"EXECUTE" )== 0 )
1862
1896
COMPLETE_WITH_CONST ("PROCEDURE" );