Re: [PATCH] Tab complete EXECUTE FUNCTION for CREATE (EVENT) TRIGGER - Mailing list pgsql-hackers

From ilmari@ilmari.org (Dagfinn Ilmari Mannsåker)
Subject Re: [PATCH] Tab complete EXECUTE FUNCTION for CREATE (EVENT) TRIGGER
Date
Msg-id d8jwoq6nhev.fsf@dalvik.ping.uio.no
Whole thread Raw
In response to Re: [PATCH] Tab complete EXECUTE FUNCTION for CREATE (EVENT) TRIGGER  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: [PATCH] Tab complete EXECUTE FUNCTION for CREATE (EVENT) TRIGGER  (Michael Paquier <michael@paquier.xyz>)
List pgsql-hackers
Tom Lane <tgl@sss.pgh.pa.us> writes:

> ilmari@ilmari.org (Dagfinn Ilmari =?utf-8?Q?Manns=C3=A5ker?=) writes:
>> Tom Lane <tgl@sss.pgh.pa.us> writes:
>>> Yeah.  Why don't we keep the existing behavior of completing both
>>> words at once, but make it server-version-dependent which completion
>>> you get?
>
>> I did that initially, but because COMPLETE_WITHc() requres constant
>> arguments, I had to repeat the whole list with just changing PROCEDURE
>> to FUNCTION, which I thought was undesirably repetitive.  If there's a
>> more concise alternative to the below, or the consensus is that saving
>> one TAB press is worth it, I'll change it.
>
>>     else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("ON", MatchAny))
>>         if (pset.sversion >= 110000)
>>             COMPLETE_WITH("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
>>                           "REFERENCING", "FOR", "WHEN (", "EXECUTE FUNCTION");
>>         else
>>             COMPLETE_WITH("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
>>                           "REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
>
> Well, that's not beautiful, but there aren't so many alternatives
> that it's really unmaintainable.  I think it's probably better than
> requiring an additional TAB-press.

Okay, revised patches attached.  I also tweaked the CREATE EVENT TRIGGER
completion to accept multple <filter_varaible> IN (<filter_value>)
conditions seprated by AND in the WHEN clause (but not to suggest that,
since we only actually support one <filter_variable>, TAG).

- ilmari
-- 
"A disappointingly low fraction of the human race is,
 at any given time, on fire." - Stig Sandbeck Mathisen

From ba00a7ebc81008665b65bda5a3836b2b343dd804 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= <ilmari@ilmari.org>
Date: Fri, 19 Oct 2018 17:13:05 +0100
Subject: [PATCH v2 1/2] Tab complete EXECUTE FUNCTION for CREATE TRIGGER
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The change to accept EXECUTE FUNCTION as well as EXECUTE PROCEDURE in
CREATE TRIGGER (commit 0a63f996e018ac508c858e87fa39cc254a5db49f)
didn't tell psql's tab completion system about this.

In passing, add tab completion of EXECUTE FUNCTION/PROCEDURE after a
complete WHEN ( … ) clause.

The FUNCTION alternative for completing function names isn't strictly
necessary, because words_after_create makes it complete function names
after FUNCTION, but having all the completion logic for a single
command in one place seems neater to me.
---
 src/bin/psql/tab-complete.c | 43 +++++++++++++++++++++++++++----------
 1 file changed, 32 insertions(+), 11 deletions(-)

diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 299600652f..97825c9d54 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -2473,11 +2473,18 @@ psql_completion(const char *text, int start, int end)
     else if (TailMatches("CREATE", "TRIGGER", MatchAny, "INSTEAD", "OF", MatchAny, "ON"))
         COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views, NULL);
     else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("ON", MatchAny))
-        COMPLETE_WITH("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
-                      "REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+        if (pset.sversion >= 110000)
+            COMPLETE_WITH("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
+                          "REFERENCING", "FOR", "WHEN (", "EXECUTE FUNCTION");
+        else
+            COMPLETE_WITH("NOT DEFERRABLE", "DEFERRABLE", "INITIALLY",
+                          "REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
     else if (HeadMatches("CREATE", "TRIGGER") &&
              (TailMatches("DEFERRABLE") || TailMatches("INITIALLY", "IMMEDIATE|DEFERRED")))
-        COMPLETE_WITH("REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+        if (pset.sversion >= 110000)
+            COMPLETE_WITH("REFERENCING", "FOR", "WHEN (", "EXECUTE FUNCTION");
+        else
+            COMPLETE_WITH("REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
     else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("REFERENCING"))
         COMPLETE_WITH("OLD TABLE", "NEW TABLE");
     else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("OLD|NEW", "TABLE"))
@@ -2485,17 +2492,26 @@ psql_completion(const char *text, int start, int end)
     else if (HeadMatches("CREATE", "TRIGGER") &&
              (TailMatches("REFERENCING", "OLD", "TABLE", "AS", MatchAny) ||
               TailMatches("REFERENCING", "OLD", "TABLE", MatchAny)))
-        COMPLETE_WITH("NEW TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+        if (pset.sversion >= 110000)
+            COMPLETE_WITH("NEW TABLE", "FOR", "WHEN (", "EXECUTE FUNCTION");
+        else
+            COMPLETE_WITH("NEW TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE");
     else if (HeadMatches("CREATE", "TRIGGER") &&
              (TailMatches("REFERENCING", "NEW", "TABLE", "AS", MatchAny) ||
               TailMatches("REFERENCING", "NEW", "TABLE", MatchAny)))
-        COMPLETE_WITH("OLD TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+        if (pset.sversion >= 110000)
+            COMPLETE_WITH("OLD TABLE", "FOR", "WHEN (", "EXECUTE FUNCTION");
+        else
+            COMPLETE_WITH("OLD TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE");
     else if (HeadMatches("CREATE", "TRIGGER") &&
              (TailMatches("REFERENCING", "OLD|NEW", "TABLE", "AS", MatchAny, "OLD|NEW", "TABLE", "AS", MatchAny) ||
               TailMatches("REFERENCING", "OLD|NEW", "TABLE", MatchAny, "OLD|NEW", "TABLE", "AS", MatchAny) ||
               TailMatches("REFERENCING", "OLD|NEW", "TABLE", "AS", MatchAny, "OLD|NEW", "TABLE", MatchAny) ||
               TailMatches("REFERENCING", "OLD|NEW", "TABLE", MatchAny, "OLD|NEW", "TABLE", MatchAny)))
-        COMPLETE_WITH("FOR", "WHEN (", "EXECUTE PROCEDURE");
+        if (pset.sversion >= 110000)
+            COMPLETE_WITH("FOR", "WHEN (", "EXECUTE FUNCTION");
+        else
+            COMPLETE_WITH("FOR", "WHEN (", "EXECUTE PROCEDURE");
     else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("FOR"))
         COMPLETE_WITH("EACH", "ROW", "STATEMENT");
     else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("FOR", "EACH"))
@@ -2503,11 +2519,16 @@ psql_completion(const char *text, int start, int end)
     else if (HeadMatches("CREATE", "TRIGGER") &&
              (TailMatches("FOR", "EACH", "ROW|STATEMENT") ||
               TailMatches("FOR", "ROW|STATEMENT")))
-        COMPLETE_WITH("WHEN (", "EXECUTE PROCEDURE");
-    /* complete CREATE TRIGGER ... EXECUTE with PROCEDURE */
-    else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("EXECUTE"))
-        COMPLETE_WITH("PROCEDURE");
-    else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("EXECUTE", "PROCEDURE"))
+        if (pset.sversion >= 110000)
+            COMPLETE_WITH("WHEN (", "EXECUTE FUNCTION");
+        else
+            COMPLETE_WITH("WHEN (", "EXECUTE PROCEDURE");
+    else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("WHEN", "(*)"))
+        if (pset.sversion >= 110000)
+            COMPLETE_WITH("EXECUTE FUNCTION");
+        else
+            COMPLETE_WITH("EXECUTE PROCEDURE");
+    else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("EXECUTE", "FUNCTION|PROCEDURE"))
         COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions, NULL);
 
 /* CREATE ROLE,USER,GROUP <name> */
-- 
2.19.1

From e4aaa0f2c5c5f11c5796b726ef2e2b9ab1ac8f33 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= <ilmari@ilmari.org>
Date: Mon, 22 Oct 2018 18:06:20 +0100
Subject: [PATCH v2 2/2] Improve CREATE EVENT TRIGGER tab completion

This adds tab completion of the WHEN and EXECUTE FUNCTION/PROCEDURE
clauses to CREATE EVENT TRIGGER, similar to CREATE TRIGGER in the
previous commit.
---
 src/bin/psql/tab-complete.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 97825c9d54..3d0d738bed 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -2584,6 +2584,18 @@ psql_completion(const char *text, int start, int end)
     /* Complete CREATE EVENT TRIGGER <name> ON with event_type */
     else if (Matches("CREATE", "EVENT", "TRIGGER", MatchAny, "ON"))
         COMPLETE_WITH("ddl_command_start", "ddl_command_end", "sql_drop");
+    else if (Matches("CREATE", "EVENT", "TRIGGER", MatchAny, "ON", MatchAny))
+        if (pset.sversion >= 110000)
+            COMPLETE_WITH("WHEN TAG IN (", "EXECUTE FUNCTION");
+        else
+            COMPLETE_WITH("WHEN TAG IN (", "EXECUTE PROCEDURE");
+    else if (HeadMatches("CREATE", "EVENT", "TRIGGER") && TailMatches("WHEN|AND", MatchAny, "IN", "(*)"))
+        if (pset.sversion >= 110000)
+            COMPLETE_WITH("EXECUTE FUNCTION");
+        else
+            COMPLETE_WITH("EXECUTE PROCEDURE");
+    else if (HeadMatches("CREATE", "EVENT", "TRIGGER") && TailMatches("EXECUTE", "FUNCTION|PROCEDURE"))
+        COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions, NULL);
 
 /* DEALLOCATE */
     else if (Matches("DEALLOCATE"))
-- 
2.19.1


pgsql-hackers by date:

Previous
From: Krzysztof Nienartowicz
Date:
Subject: Re: Speeding up INSERTs and UPDATEs to partitioned tables
Next
From: David Fetter
Date:
Subject: Re: Log timestamps at higher resolution