@@ -841,7 +841,7 @@ psql_completion(char *text, int start, int end)
841841
842842/* ALTER SCHEMA <name> */
843843else if (pg_strcasecmp (prev3_wd ,"ALTER" )== 0 &&
844- pg_strcasecmp (prev2_wd ,"SCHEMA" )== 0 )
844+ pg_strcasecmp (prev2_wd ,"SCHEMA" )== 0 )
845845{
846846static const char * const list_ALTERGEN []=
847847{"OWNER TO" ,"RENAME TO" ,NULL };
@@ -906,7 +906,7 @@ psql_completion(char *text, int start, int end)
906906pg_strcasecmp (prev2_wd ,"WRAPPER" )== 0 )
907907{
908908static const char * const list_ALTER_FDW []=
909- {"VALIDATOR" ,"OPTIONS" ,"OWNER TO" ,NULL };
909+ {"HANDLER" , " VALIDATOR" ,"OPTIONS" ,"OWNER TO" ,NULL };
910910
911911COMPLETE_WITH_LIST (list_ALTER_FDW );
912912}
@@ -1128,15 +1128,15 @@ psql_completion(char *text, int start, int end)
11281128COMPLETE_WITH_CONST ("RENAME TO" );
11291129
11301130/*
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
11331132 */
11341133else if (pg_strcasecmp (prev3_wd ,"ALTER" )== 0 &&
11351134pg_strcasecmp (prev2_wd ,"TABLE" )== 0 )
11361135{
11371136static const char * const list_ALTER2 []=
11381137{"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 };
11401140
11411141COMPLETE_WITH_LIST (list_ALTER2 );
11421142}
@@ -1420,11 +1420,21 @@ psql_completion(char *text, int start, int end)
14201420pg_strcasecmp (prev2_wd ,"TYPE" )== 0 )
14211421{
14221422static const char * const list_ALTERTYPE []=
1423- {"ADD ATTRIBUTE" ,"ALTER ATTRIBUTE" ,"DROP ATTRIBUTE" ,
1423+ {"ADD ATTRIBUTE" ,"ADD VALUE" , " ALTER ATTRIBUTE" ,"DROP ATTRIBUTE" ,
14241424"OWNER TO" ,"RENAME" ,"SET SCHEMA" ,NULL };
14251425
14261426COMPLETE_WITH_LIST (list_ALTERTYPE );
14271427}
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+ }
14281438/* ALTER TYPE <foo> RENAME */
14291439else if (pg_strcasecmp (prev4_wd ,"ALTER" )== 0 &&
14301440pg_strcasecmp (prev3_wd ,"TYPE" )== 0 &&
@@ -1598,7 +1608,7 @@ psql_completion(char *text, int start, int end)
15981608pg_strcasecmp (prev2_wd ,"TO" )== 0 ))
15991609{
16001610static const char * const list_COPY []=
1601- {"BINARY" ,"OIDS" ,"DELIMITER" ,"NULL" ,"CSV" ,NULL };
1611+ {"BINARY" ,"OIDS" ,"DELIMITER" ,"NULL" ,"CSV" ,"ENCODING" , NULL };
16021612
16031613COMPLETE_WITH_LIST (list_COPY );
16041614}
@@ -1609,7 +1619,7 @@ psql_completion(char *text, int start, int end)
16091619pg_strcasecmp (prev3_wd ,"TO" )== 0 ))
16101620{
16111621static const char * const list_CSV []=
1612- {"HEADER" ,"QUOTE" ,"ESCAPE" ,"FORCE QUOTE" ,NULL };
1622+ {"HEADER" ,"QUOTE" ,"ESCAPE" ,"FORCE QUOTE" ,"FORCE NOT NULL" , NULL };
16131623
16141624COMPLETE_WITH_LIST (list_CSV );
16151625}
@@ -1655,7 +1665,12 @@ psql_completion(char *text, int start, int end)
16551665pg_strcasecmp (prev4_wd ,"FOREIGN" )== 0 &&
16561666pg_strcasecmp (prev3_wd ,"DATA" )== 0 &&
16571667pg_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+ }
16591674
16601675/* CREATE INDEX */
16611676/* First off we complete CREATE UNIQUE with "INDEX" */
@@ -1836,11 +1851,25 @@ psql_completion(char *text, int start, int end)
18361851
18371852COMPLETE_WITH_LIST (list_CREATETRIGGER_EVENTS );
18381853}
1839- /* complete CREATE TRIGGER <name>BEFORE,AFTER sth withOR,ON */
1854+ /* complete CREATE TRIGGER <name>INSTEAD OF withan event */
18401855else if (pg_strcasecmp (prev5_wd ,"CREATE" )== 0 &&
18411856pg_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 ))
18441873{
18451874static const char * const list_CREATETRIGGER2 []=
18461875{"ON" ,"OR" ,NULL };
@@ -1857,6 +1886,11 @@ psql_completion(char *text, int start, int end)
18571886pg_strcasecmp (prev3_wd ,"AFTER" )== 0 )&&
18581887pg_strcasecmp (prev_wd ,"ON" )== 0 )
18591888COMPLETE_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 );
18601894/* complete CREATE TRIGGER ... EXECUTE with PROCEDURE */
18611895else if (pg_strcasecmp (prev_wd ,"EXECUTE" )== 0 )
18621896COMPLETE_WITH_CONST ("PROCEDURE" );