Add tab completion of EXECUTE FUNCTION for CREATE TRIGGER in psql
authorMichael Paquier
Fri, 26 Oct 2018 14:36:40 +0000 (23:36 +0900)
committerMichael Paquier
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/[email protected]

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  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  */