From a3bc631ea96a7c04962df3c97dbeac860be06c03 Mon Sep 17 00:00:00 2001 From: Dean Rasheed Date: Fri, 6 Jan 2023 09:57:41 +0000 Subject: [PATCH] Improve tab completion for ALTER FUNCTION/PROCEDURE/ROUTINE. This adds psql tab completion for each of the actions supported by ALTER FUNCTION/PROCEDURE/ROUTINE. Vignesh C, reviewed by Dong Wook Lee, Michael Paquier, Melih Mutlu and me. Discussion: https://postgr.es/m/CALDaNm0s7GQmkLP_mx5Cvk=UzYMnjhPmXBxU8DsHEunFbC5sTg@mail.gmail.com --- src/bin/psql/tab-complete.c | 53 ++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 5312a7e904..b07257c7aa 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1149,6 +1149,21 @@ static const SchemaQuery Query_for_trigger_of_table = { "CREATE", "CONNECT", "TEMPORARY", "EXECUTE", "USAGE", "SET", "ALTER SYSTEM", \ "MAINTAIN", "ALL" +/* ALTER PROCEDURE options */ +#define Alter_procedure_options \ +"DEPENDS ON EXTENSION", "EXTERNAL SECURITY", "NO DEPENDS ON EXTENSION", \ +"OWNER TO", "RENAME TO", "RESET", "SECURITY", "SET" + +/* ALTER ROUTINE options */ +#define Alter_routine_options \ +Alter_procedure_options, "COST", "IMMUTABLE", "LEAKPROOF", "NOT LEAKPROOF", \ +"PARALLEL", "ROWS", "STABLE", "VOLATILE" + +/* ALTER FUNCTION options */ +#define Alter_function_options \ +Alter_routine_options, "CALLED ON NULL INPUT", "RETURNS NULL ON NULL INPUT", \ +"STRICT", "SUPPORT" + /* * These object types were introduced later than our support cutoff of * server version 9.2. We use the VersionedQuery infrastructure so that @@ -1812,15 +1827,45 @@ psql_completion(const char *text, int start, int end) else COMPLETE_WITH_FUNCTION_ARG(prev2_wd); } - /* ALTER FUNCTION,PROCEDURE,ROUTINE (...) */ - else if (Matches("ALTER", "FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny)) + /* ALTER FUNCTION (...) */ + else if (Matches("ALTER", "FUNCTION", MatchAny, MatchAny)) + { + if (ends_with(prev_wd, ')')) + COMPLETE_WITH(Alter_function_options); + else + COMPLETE_WITH_FUNCTION_ARG(prev2_wd); + } + /* ALTER PROCEDURE (...) */ + else if (Matches("ALTER", "PROCEDURE", MatchAny, MatchAny)) { if (ends_with(prev_wd, ')')) - COMPLETE_WITH("OWNER TO", "RENAME TO", "SET SCHEMA", - "DEPENDS ON EXTENSION", "NO DEPENDS ON EXTENSION"); + COMPLETE_WITH(Alter_procedure_options); else COMPLETE_WITH_FUNCTION_ARG(prev2_wd); } + /* ALTER ROUTINE (...) */ + else if (Matches("ALTER", "ROUTINE", MatchAny, MatchAny)) + { + if (ends_with(prev_wd, ')')) + COMPLETE_WITH(Alter_routine_options); + else + COMPLETE_WITH_FUNCTION_ARG(prev2_wd); + } + /* ALTER FUNCTION|ROUTINE (...) PARALLEL */ + else if (Matches("ALTER", "FUNCTION|ROUTINE", MatchAny, MatchAny, "PARALLEL")) + COMPLETE_WITH("RESTRICTED", "SAFE", "UNSAFE"); + /* ALTER FUNCTION|PROCEDURE|ROUTINE (...) [EXTERNAL] SECURITY */ + else if (Matches("ALTER", "FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny, "SECURITY") || + Matches("ALTER", "FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny, "EXTERNAL", "SECURITY")) + COMPLETE_WITH("DEFINER", "INVOKER"); + /* ALTER FUNCTION|PROCEDURE|ROUTINE (...) RESET */ + else if (Matches("ALTER", "FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny, "RESET")) + COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars, + "ALL"); + /* ALTER FUNCTION|PROCEDURE|ROUTINE (...) SET */ + else if (Matches("ALTER", "FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny, "SET")) + COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars, + "SCHEMA"); /* ALTER PUBLICATION */ else if (Matches("ALTER", "PUBLICATION", MatchAny)) -- 2.30.2