From 3fc4e87a1818cbc1386b0cf07275a2af0ee2e27b 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 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.

Change the completion from EXECUTE PROCEDURE to just EXECUTE, then
complete any CREATE TRIGGER â¦ EXECUTE with FUNCTION instead of
PROCEDURE if we're connected to a version 11 or newer server.

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 | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 299600652f..b665d1f5e4 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -2474,10 +2474,10 @@ psql_completion(const char *text, int start, int end)
 		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");
+					  "REFERENCING", "FOR", "WHEN (", "EXECUTE");
 	else if (HeadMatches("CREATE", "TRIGGER") &&
 			 (TailMatches("DEFERRABLE") || TailMatches("INITIALLY", "IMMEDIATE|DEFERRED")))
-		COMPLETE_WITH("REFERENCING", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+		COMPLETE_WITH("REFERENCING", "FOR", "WHEN (", "EXECUTE");
 	else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("REFERENCING"))
 		COMPLETE_WITH("OLD TABLE", "NEW TABLE");
 	else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("OLD|NEW", "TABLE"))
@@ -2485,17 +2485,17 @@ 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");
+		COMPLETE_WITH("NEW TABLE", "FOR", "WHEN (", "EXECUTE");
 	else if (HeadMatches("CREATE", "TRIGGER") &&
 			 (TailMatches("REFERENCING", "NEW", "TABLE", "AS", MatchAny) ||
 			  TailMatches("REFERENCING", "NEW", "TABLE", MatchAny)))
-		COMPLETE_WITH("OLD TABLE", "FOR", "WHEN (", "EXECUTE PROCEDURE");
+		COMPLETE_WITH("OLD TABLE", "FOR", "WHEN (", "EXECUTE");
 	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");
+		COMPLETE_WITH("FOR", "WHEN (", "EXECUTE");
 	else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("FOR"))
 		COMPLETE_WITH("EACH", "ROW", "STATEMENT");
 	else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("FOR", "EACH"))
@@ -2503,11 +2503,15 @@ 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 */
+		COMPLETE_WITH("WHEN (", "EXECUTE");
+	else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("WHEN", "(*)"))
+		COMPLETE_WITH("EXECUTE");
 	else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("EXECUTE"))
-		COMPLETE_WITH("PROCEDURE");
-	else if (HeadMatches("CREATE", "TRIGGER") && TailMatches("EXECUTE", "PROCEDURE"))
+		if (pset.sversion >= 110000)
+			COMPLETE_WITH("FUNCTION");
+		else
+			COMPLETE_WITH("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

