psql: Add tab completion for view options.

Add support for tab completion of WITH (...) options to CREATE VIEW,
and for the corresponding SET/RESET (...) options in ALTER VIEW.

Christoph Heiss, reviewed by Melih Mutlu, Vignesh C, Jim Jones,
Mikhail Gribkov, David Zhang, Shubham Khanna, and me.

Discussion: https://postgr.es/m/a2075c5a-66f9-a564-f038-9ac044b03117@c8h4.io
This commit is contained in:
Dean Rasheed 2023-11-28 09:50:17 +00:00
parent a9a8108411
commit cd34247489
1 changed files with 46 additions and 4 deletions

View File

@ -1329,6 +1329,13 @@ static const char *const table_storage_parameters[] = {
NULL
};
/* Optional parameters for CREATE VIEW and ALTER VIEW */
static const char *const view_optional_parameters[] = {
"check_option",
"security_barrier",
"security_invoker",
NULL
};
/* Forward declaration of functions */
static char **psql_completion(const char *text, int start, int end);
@ -2216,8 +2223,7 @@ psql_completion(const char *text, int start, int end)
COMPLETE_WITH("TO");
/* ALTER VIEW <name> */
else if (Matches("ALTER", "VIEW", MatchAny))
COMPLETE_WITH("ALTER COLUMN", "OWNER TO", "RENAME",
"SET SCHEMA");
COMPLETE_WITH("ALTER COLUMN", "OWNER TO", "RENAME", "RESET", "SET");
/* ALTER VIEW xxx RENAME */
else if (Matches("ALTER", "VIEW", MatchAny, "RENAME"))
COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "TO");
@ -2233,6 +2239,21 @@ psql_completion(const char *text, int start, int end)
/* ALTER VIEW xxx RENAME COLUMN yyy */
else if (Matches("ALTER", "VIEW", MatchAny, "RENAME", "COLUMN", MatchAnyExcept("TO")))
COMPLETE_WITH("TO");
/* ALTER VIEW xxx RESET ( */
else if (Matches("ALTER", "VIEW", MatchAny, "RESET"))
COMPLETE_WITH("(");
/* Complete ALTER VIEW xxx SET with "(" or "SCHEMA" */
else if (Matches("ALTER", "VIEW", MatchAny, "SET"))
COMPLETE_WITH("(", "SCHEMA");
/* ALTER VIEW xxx SET|RESET ( yyy [= zzz] ) */
else if (Matches("ALTER", "VIEW", MatchAny, "SET|RESET", "("))
COMPLETE_WITH_LIST(view_optional_parameters);
else if (Matches("ALTER", "VIEW", MatchAny, "SET", "(", MatchAny))
COMPLETE_WITH("=");
else if (Matches("ALTER", "VIEW", MatchAny, "SET", "(", "check_option", "="))
COMPLETE_WITH("local", "cascaded");
else if (Matches("ALTER", "VIEW", MatchAny, "SET", "(", "security_barrier|security_invoker", "="))
COMPLETE_WITH("true", "false");
/* ALTER MATERIALIZED VIEW <name> */
else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny))
@ -3531,14 +3552,35 @@ psql_completion(const char *text, int start, int end)
}
/* CREATE VIEW --- is allowed inside CREATE SCHEMA, so use TailMatches */
/* Complete CREATE [ OR REPLACE ] VIEW <name> with AS */
/* Complete CREATE [ OR REPLACE ] VIEW <name> with AS or WITH */
else if (TailMatches("CREATE", "VIEW", MatchAny) ||
TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny))
COMPLETE_WITH("AS");
COMPLETE_WITH("AS", "WITH");
/* Complete "CREATE [ OR REPLACE ] VIEW <sth> AS with "SELECT" */
else if (TailMatches("CREATE", "VIEW", MatchAny, "AS") ||
TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "AS"))
COMPLETE_WITH("SELECT");
/* CREATE [ OR REPLACE ] VIEW <name> WITH ( yyy [= zzz] ) */
else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH") ||
TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH"))
COMPLETE_WITH("(");
else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH", "(") ||
TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH", "("))
COMPLETE_WITH_LIST(view_optional_parameters);
else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH", "(", "check_option") ||
TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH", "(", "check_option"))
COMPLETE_WITH("=");
else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH", "(", "check_option", "=") ||
TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH", "(", "check_option", "="))
COMPLETE_WITH("local", "cascaded");
/* CREATE [ OR REPLACE ] VIEW <name> WITH ( ... ) AS */
else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH", "(*)") ||
TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH", "(*)"))
COMPLETE_WITH("AS");
/* CREATE [ OR REPLACE ] VIEW <name> WITH ( ... ) AS SELECT */
else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH", "(*)", "AS") ||
TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH", "(*)", "AS"))
COMPLETE_WITH("SELECT");
/* CREATE MATERIALIZED VIEW */
else if (Matches("CREATE", "MATERIALIZED"))