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