]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Add tab completion of EXECUTE FUNCTION for CREATE TRIGGER in psql
authorMichael Paquier <michael@paquier.xyz>
Fri, 26 Oct 2018 14:36:40 +0000 (23:36 +0900)
committerMichael Paquier <michael@paquier.xyz>
Fri, 26 Oct 2018 14:36:40 +0000 (23:36 +0900)
The change to accept EXECUTE FUNCTION as well as EXECUTE PROCEDURE in
CREATE TRIGGER (added by 0a63f99) forgot to tell psql's tab completion
system about this.

This change is version-aware, with FUNCTION being selected automatically
instead of PROCEDURE depending on the backend version, PROCEDURE being
an historical grammar kept for compatibility and considered as
deprecated in v11.

Author: Dagfinn Ilmari MannsÃ¥ker
Reviewed-by: Tom Lane, Michael Paquier
Discussion: https://postgr.es/m/d8jmur4q4yc.fsf@dalvik.ping.uio.no

src/bin/psql/tab-complete.c

index 2dda6f1bb4f799291dd3db9f98ab3ed25cee9f9f..7817bd72d780525768ad33067317ac8ec1be0ff8 100644 (file)
@@ -2775,7 +2775,8 @@ psql_completion(const char *text, int start, int end)
 
        /*
         * complete CREATE TRIGGER <name> BEFORE,AFTER event ON with a list of
-        * tables
+        * tables.  EXECUTE FUNCTION is the recommended grammar instead of EXECUTE
+        * PROCEDURE in version 11 and upwards.
         */
        else if (TailMatches6("CREATE", "TRIGGER", MatchAny, "BEFORE|AFTER", MatchAny, "ON"))
                COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL);
@@ -2783,11 +2784,26 @@ psql_completion(const char *text, int start, int end)
        else if (TailMatches7("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON"))
                COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL);
        else if (HeadMatches2("CREATE", "TRIGGER") && TailMatches2("ON", MatchAny))
-               COMPLETE_WITH_LIST7("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
-                                                       "REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+       {
+               if (pset.sversion >= 110000)
+                       COMPLETE_WITH_LIST7("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
+                                                               "REFERENCING", "FOR", "WHEN (",
+                                                               "EXECUTE FUNCTION");
+               else
+                       COMPLETE_WITH_LIST7("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
+                                                               "REFERENCING", "FOR", "WHEN (",
+                                                               "EXECUTE PROCEDURE");
+       }
        else if (HeadMatches2("CREATE", "TRIGGER") &&
                         (TailMatches1("DEFERRABLE") || TailMatches2("INITIALLY", "IMMEDIATE|DEFERRED")))
-               COMPLETE_WITH_LIST4("REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+       {
+               if (pset.sversion >= 110000)
+                       COMPLETE_WITH_LIST4("REFERENCING", "FOR", "WHEN (",
+                                                               "EXECUTE FUNCTION");
+               else
+                       COMPLETE_WITH_LIST4("REFERENCING", "FOR", "WHEN (",
+                                                               "EXECUTE PROCEDURE");
+       }
        else if (HeadMatches2("CREATE", "TRIGGER") && TailMatches1("REFERENCING"))
                COMPLETE_WITH_LIST2("OLD TABLE", "NEW TABLE");
        else if (HeadMatches2("CREATE", "TRIGGER") && TailMatches2("OLD|NEW", "TABLE"))
@@ -2795,17 +2811,36 @@ psql_completion(const char *text, int start, int end)
        else if (HeadMatches2("CREATE", "TRIGGER") &&
                         (TailMatches5("REFERENCING", "OLD", "TABLE", "AS", MatchAny) ||
                          TailMatches4("REFERENCING", "OLD", "TABLE", MatchAny)))
-               COMPLETE_WITH_LIST4("NEW TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+       {
+               if (pset.sversion >= 110000)
+                       COMPLETE_WITH_LIST4("NEW TABLE", "FOR", "WHEN (",
+                                                               "EXECUTE FUNCTION");
+               else
+                       COMPLETE_WITH_LIST4("NEW TABLE", "FOR", "WHEN (",
+                                                               "EXECUTE PROCEDURE");
+       }
        else if (HeadMatches2("CREATE", "TRIGGER") &&
                         (TailMatches5("REFERENCING", "NEW", "TABLE", "AS", MatchAny) ||
                          TailMatches4("REFERENCING", "NEW", "TABLE", MatchAny)))
-               COMPLETE_WITH_LIST4("OLD TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+       {
+               if (pset.sversion >= 110000)
+                       COMPLETE_WITH_LIST4("OLD TABLE", "FOR", "WHEN (",
+                                                               "EXECUTE FUNCTION");
+               else
+                       COMPLETE_WITH_LIST4("OLD TABLE", "FOR", "WHEN (",
+                                                               "EXECUTE PROCEDURE");
+       }
        else if (HeadMatches2("CREATE", "TRIGGER") &&
                         (TailMatches9("REFERENCING", "OLD|NEW", "TABLE", "AS", MatchAny, "OLD|NEW", "TABLE", "AS", MatchAny) ||
                          TailMatches8("REFERENCING", "OLD|NEW", "TABLE", MatchAny, "OLD|NEW", "TABLE", "AS", MatchAny) ||
                          TailMatches8("REFERENCING", "OLD|NEW", "TABLE", "AS", MatchAny, "OLD|NEW", "TABLE", MatchAny) ||
                          TailMatches7("REFERENCING", "OLD|NEW", "TABLE", MatchAny, "OLD|NEW", "TABLE", MatchAny)))
-               COMPLETE_WITH_LIST3("FOR", "WHEN (", "EXECUTE PROCEDURE");
+       {
+               if (pset.sversion >= 110000)
+                       COMPLETE_WITH_LIST3("FOR", "WHEN (", "EXECUTE FUNCTION");
+               else
+                       COMPLETE_WITH_LIST3("FOR", "WHEN (", "EXECUTE PROCEDURE");
+       }
        else if (HeadMatches2("CREATE", "TRIGGER") && TailMatches1("FOR"))
                COMPLETE_WITH_LIST3("EACH", "ROW", "STATEMENT");
        else if (HeadMatches2("CREATE", "TRIGGER") && TailMatches2("FOR", "EACH"))
@@ -2813,11 +2848,22 @@ psql_completion(const char *text, int start, int end)
        else if (HeadMatches2("CREATE", "TRIGGER") &&
                         (TailMatches3("FOR", "EACH", "ROW|STATEMENT") ||
                          TailMatches2("FOR", "ROW|STATEMENT")))
-               COMPLETE_WITH_LIST2("WHEN (", "EXECUTE PROCEDURE");
+       {
+               if (pset.sversion >= 110000)
+                       COMPLETE_WITH_LIST2("WHEN (", "EXECUTE FUNCTION");
+               else
+                       COMPLETE_WITH_LIST2("WHEN (", "EXECUTE PROCEDURE");
+       }
        /* complete CREATE TRIGGER ... EXECUTE with PROCEDURE */
        else if (HeadMatches2("CREATE", "TRIGGER") && TailMatches1("EXECUTE"))
-               COMPLETE_WITH_CONST("PROCEDURE");
-       else if (HeadMatches2("CREATE", "TRIGGER") && TailMatches2("EXECUTE", "PROCEDURE"))
+       {
+               if (pset.sversion >= 110000)
+                       COMPLETE_WITH_CONST("FUNCTION");
+               else
+                       COMPLETE_WITH_CONST("PROCEDURE");
+       }
+       else if (HeadMatches2("CREATE", "TRIGGER") &&
+                        TailMatches2("EXECUTE", "FUNCTION|PROCEDURE"))
                COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions, NULL);
 
 /* CREATE ROLE,USER,GROUP <name> */