@@ -776,6 +776,10 @@ static const SchemaQuery Query_for_list_of_collations = {
776
776
" and pg_catalog.quote_ident(c1.relname)='%s'"\
777
777
" and pg_catalog.pg_table_is_visible(c2.oid)"
778
778
779
+ #define Query_for_unique_index_of_table \
780
+ Query_for_index_of_table \
781
+ " and i.indisunique"
782
+
779
783
/* the silly-looking length condition is just to eat up the current word */
780
784
#define Query_for_constraint_of_table \
781
785
"SELECT pg_catalog.quote_ident(conname) "\
@@ -2019,6 +2023,45 @@ psql_completion(const char *text, int start, int end)
2019
2023
"OWNER TO" ,"SET" ,"VALIDATE CONSTRAINT" ,
2020
2024
"REPLICA IDENTITY" ,"ATTACH PARTITION" ,
2021
2025
"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
+ }
2022
2065
/* ALTER TABLE xxx ENABLE */
2023
2066
else if (Matches ("ALTER" ,"TABLE" ,MatchAny ,"ENABLE" ))
2024
2067
COMPLETE_WITH ("ALWAYS" ,"REPLICA" ,"ROW LEVEL SECURITY" ,"RULE" ,