@@ -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 */
20232066else if (Matches ("ALTER" ,"TABLE" ,MatchAny ,"ENABLE" ))
20242067COMPLETE_WITH ("ALWAYS" ,"REPLICA" ,"ROW LEVEL SECURITY" ,"RULE" ,