@@ -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" ,
0 commit comments