@@ -776,6 +776,10 @@ static const SchemaQuery Query_for_list_of_collations = {
776776" and pg_catalog.quote_ident(c1.relname)='%s'"\
777777" and pg_catalog.pg_table_is_visible(c2.oid)"
778778
779+ #define Query_for_unique_index_of_table \
780+ Query_for_index_of_table \
781+ " and i.indisunique"
782+
779783/* the silly-looking length condition is just to eat up the current word */
780784#define Query_for_constraint_of_table \
781785"SELECT pg_catalog.quote_ident(conname) "\
@@ -2019,6 +2023,45 @@ psql_completion(const char *text, int start, int end)
20192023 "OWNER TO" , "SET" , "VALIDATE CONSTRAINT" ,
20202024 "REPLICA IDENTITY" , "ATTACH PARTITION" ,
20212025 "DETACH PARTITION" , "FORCE ROW LEVEL SECURITY" );
2026+ /* ALTER TABLE xxx ADD */
2027+ else if (Matches ("ALTER" , "TABLE" , MatchAny , "ADD" ))
2028+ COMPLETE_WITH ("COLUMN" , "CONSTRAINT" , "CHECK" , "UNIQUE" , "PRIMARY KEY" ,
2029+ "EXCLUDE" , "FOREIGN KEY" );
2030+ /* ALTER TABLE xxx ADD CONSTRAINT yyy */
2031+ else if (Matches ("ALTER" , "TABLE" , MatchAny , "ADD" , "CONSTRAINT" , MatchAny ))
2032+ COMPLETE_WITH ("CHECK" , "UNIQUE" , "PRIMARY KEY" , "EXCLUDE" , "FOREIGN KEY" );
2033+ /* ALTER TABLE xxx ADD [CONSTRAINT yyy] (PRIMARY KEY|UNIQUE) */
2034+ else if (Matches ("ALTER" , "TABLE" , MatchAny , "ADD" , "PRIMARY" , "KEY" ) ||
2035+ Matches ("ALTER" , "TABLE" , MatchAny , "ADD" , "UNIQUE" ) ||
2036+ Matches ("ALTER" , "TABLE" , MatchAny , "ADD" , "CONSTRAINT" , MatchAny , "PRIMARY" , "KEY" ) ||
2037+ Matches ("ALTER" , "TABLE" , MatchAny , "ADD" , "CONSTRAINT" , MatchAny , "UNIQUE" ))
2038+ COMPLETE_WITH ("(" , "USING INDEX" );
2039+ /* ALTER TABLE xxx ADD PRIMARY KEY USING INDEX */
2040+ else if (Matches ("ALTER" , "TABLE" , MatchAny , "ADD" , "PRIMARY" , "KEY" , "USING" , "INDEX" ))
2041+ {
2042+ completion_info_charp = prev6_wd ;
2043+ COMPLETE_WITH_QUERY (Query_for_unique_index_of_table );
2044+ }
2045+ /* ALTER TABLE xxx ADD UNIQUE USING INDEX */
2046+ else if (Matches ("ALTER" , "TABLE" , MatchAny , "ADD" , "UNIQUE" , "USING" , "INDEX" ))
2047+ {
2048+ completion_info_charp = prev5_wd ;
2049+ COMPLETE_WITH_QUERY (Query_for_unique_index_of_table );
2050+ }
2051+ /* ALTER TABLE xxx ADD CONSTRAINT yyy PRIMARY KEY USING INDEX */
2052+ else if (Matches ("ALTER" , "TABLE" , MatchAny , "ADD" , "CONSTRAINT" , MatchAny ,
2053+ "PRIMARY" , "KEY" , "USING" , "INDEX" ))
2054+ {
2055+ completion_info_charp = prev8_wd ;
2056+ COMPLETE_WITH_QUERY (Query_for_unique_index_of_table );
2057+ }
2058+ /* ALTER TABLE xxx ADD CONSTRAINT yyy UNIQUE USING INDEX */
2059+ else if (Matches ("ALTER" , "TABLE" , MatchAny , "ADD" , "CONSTRAINT" , MatchAny ,
2060+ "UNIQUE" , "USING" , "INDEX" ))
2061+ {
2062+ completion_info_charp = prev7_wd ;
2063+ COMPLETE_WITH_QUERY (Query_for_unique_index_of_table );
2064+ }
20222065 /* ALTER TABLE xxx ENABLE */
20232066 else if (Matches ("ALTER" , "TABLE" , MatchAny , "ENABLE" ))
20242067 COMPLETE_WITH ("ALWAYS" , "REPLICA" , "ROW LEVEL SECURITY" , "RULE" ,
0 commit comments