Skip to content

Commit d3fa876

Browse files
committed
Add more tab completion support for ALTER TABLE ADD in psql
This includes the detection of new patterns for various constraint types, with the addition of USING INDEX for unique indexes of a table on primary keys and unique constraints. Author: Dagfinn Ilmari Mannsåker Discussion: https://postgr.es/m/87bl6ehhpl.fsf@wibble.ilmari.org
1 parent 10d5822 commit d3fa876

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

src/bin/psql/tab-complete.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)