Improve tab completion for ALTER FUNCTION/PROCEDURE/ROUTINE.
authorDean Rasheed <[email protected]>
Fri, 6 Jan 2023 09:57:41 +0000 (09:57 +0000)
committerDean Rasheed <[email protected]>
Fri, 6 Jan 2023 09:57:41 +0000 (09:57 +0000)
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

index 5312a7e904458d5b344c15b81528b228068a3cbb..b07257c7aad10df8326bfadf75ef48212b324bf4 100644 (file)
@@ -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 <name> (...) */
-   else if (Matches("ALTER", "FUNCTION|PROCEDURE|ROUTINE", MatchAny, MatchAny))
+   /* ALTER FUNCTION <name> (...) */
+   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 <name> (...) */
+   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 <name> (...) */
+   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 <name> (...) PARALLEL */
+   else if (Matches("ALTER", "FUNCTION|ROUTINE", MatchAny, MatchAny, "PARALLEL"))
+       COMPLETE_WITH("RESTRICTED", "SAFE", "UNSAFE");
+   /* ALTER FUNCTION|PROCEDURE|ROUTINE <name> (...) [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 <name> (...) 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 <name> (...) 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 <name> */
    else if (Matches("ALTER", "PUBLICATION", MatchAny))