Tab completion for CREATE TABLE ... AS

Started by Gilles Daroldabout 2 years ago5 messages
#1Gilles Darold
gilles@darold.net
1 attachment(s)

Hi,

Look like the tab completion for CREATE TABLE ... AS is not proposed.

gilles=# CREATE TABLE test
(             OF            PARTITION OF

 The attached patch fix that and also propose the further completion
after the AS keyword.

gilles=# CREATE TABLE test
(             AS            OF            PARTITION OF
gilles=# CREATE TABLE test AS
SELECT  WITH

Adding the patch to current commitfest.

Best regards,

--
Gilles Darold
http://www.darold.net/

Attachments:

fix-create-as-completion-v1.patchtext/x-patch; charset=UTF-8; name=fix-create-as-completion-v1.patchDownload
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 93742fc6ac..d793a94d6a 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -3231,11 +3231,15 @@ psql_completion(const char *text, int start, int end)
 	/* Complete CREATE TABLE <name> with '(', OF or PARTITION OF */
 	else if (TailMatches("CREATE", "TABLE", MatchAny) ||
 			 TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny))
-		COMPLETE_WITH("(", "OF", "PARTITION OF");
+		COMPLETE_WITH("(", "OF", "PARTITION OF", "AS");
 	/* Complete CREATE TABLE <name> OF with list of composite types */
 	else if (TailMatches("CREATE", "TABLE", MatchAny, "OF") ||
 			 TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "OF"))
 		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes);
+	/* Complete CREATE TABLE <name> AS with list of keywords */
+	else if (TailMatches("CREATE", "TABLE", MatchAny, "AS") ||
+			 TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "AS"))
+		COMPLETE_WITH("SELECT", "WITH");
 	/* Complete CREATE TABLE name (...) with supported options */
 	else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)") ||
 			 TailMatches("CREATE", "UNLOGGED", "TABLE", MatchAny, "(*)"))
#2Jim Jones
jim.jones@uni-muenster.de
In reply to: Gilles Darold (#1)
Re: Tab completion for CREATE TABLE ... AS

Hi

On 02.11.23 17:27, Gilles Darold wrote:

Hi,

Look like the tab completion for CREATE TABLE ... AS is not proposed.

gilles=# CREATE TABLE test
(             OF            PARTITION OF

 The attached patch fix that and also propose the further completion
after the AS keyword.

gilles=# CREATE TABLE test
(             AS            OF            PARTITION OF
gilles=# CREATE TABLE test AS
SELECT  WITH

Adding the patch to current commitfest.

Best regards,

Thanks for the patch!
It applies and builds cleanly, and it works as expected

"AS" is suggested after "CREATE TABLE t":

postgres=# CREATE TABLE t <TAB><TAB>
(             AS            OF            PARTITION OF

--
Jim

#3Michael Paquier
michael@paquier.xyz
In reply to: Gilles Darold (#1)
Re: Tab completion for CREATE TABLE ... AS

On Thu, Nov 02, 2023 at 07:27:02PM +0300, Gilles Darold wrote:

Look like the tab completion for CREATE TABLE ... AS is not
proposed.

+	/* Complete CREATE TABLE <name> AS with list of keywords */
+	else if (TailMatches("CREATE", "TABLE", MatchAny, "AS") ||
+			 TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "AS"))
+		COMPLETE_WITH("SELECT", "WITH");

There is a bit more than SELECT and WITH as possible query for a CTAS.
How about VALUES, TABLE or even EXECUTE (itself able to handle a
SELECT, TABLE or VALUES)?
--
Michael

#4Gilles Darold
gilles@darold.net
In reply to: Michael Paquier (#3)
1 attachment(s)
Re: Tab completion for CREATE TABLE ... AS

Le 15/11/2023 à 03:58, Michael Paquier a écrit :

On Thu, Nov 02, 2023 at 07:27:02PM +0300, Gilles Darold wrote:

Look like the tab completion for CREATE TABLE ... AS is not
proposed.

+	/* Complete CREATE TABLE <name> AS with list of keywords */
+	else if (TailMatches("CREATE", "TABLE", MatchAny, "AS") ||
+			 TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "AS"))
+		COMPLETE_WITH("SELECT", "WITH");

There is a bit more than SELECT and WITH as possible query for a CTAS.
How about VALUES, TABLE or even EXECUTE (itself able to handle a
SELECT, TABLE or VALUES)?
--
Michael

Right, I don't know how I have missed the sql-createtableas page in the
documentation.

Patched v2 fixes the keyword list, I have also sorted by alphabetical
order the CREATE TABLE completion (AS was at the end of the list).

It has also been re-based on current master.

--
Gilles Darold
http://www.darold.net/

Attachments:

fix-create-as-completion-v2.patchtext/x-patch; charset=UTF-8; name=fix-create-as-completion-v2.patchDownload
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index a1dfc11f6b..e6c88cf1a1 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -2501,11 +2501,15 @@ psql_completion(const char *text, int start, int end)
 	/* Complete CREATE TABLE <name> with '(', OF or PARTITION OF */
 	else if (TailMatches("CREATE", "TABLE", MatchAny) ||
 			 TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny))
-		COMPLETE_WITH("(", "OF", "PARTITION OF");
+		COMPLETE_WITH("(", "AS", "OF", "PARTITION OF");
 	/* Complete CREATE TABLE <name> OF with list of composite types */
 	else if (TailMatches("CREATE", "TABLE", MatchAny, "OF") ||
 			 TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "OF"))
 		COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes, NULL);
+	/* Complete CREATE TABLE <name> AS with list of keywords */
+	else if (TailMatches("CREATE", "TABLE", MatchAny, "AS") ||
+			TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "AS"))
+		COMPLETE_WITH("EXECUTE", "SELECT", "TABLE", "VALUES", "WITH");
 	/* Complete CREATE TABLE name (...) with supported options */
 	else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)") ||
 			 TailMatches("CREATE", "UNLOGGED", "TABLE", MatchAny, "(*)"))
#5Michael Paquier
michael@paquier.xyz
In reply to: Gilles Darold (#4)
Re: Tab completion for CREATE TABLE ... AS

On Wed, Nov 15, 2023 at 05:26:58PM +0300, Gilles Darold wrote:

Right, I don't know how I have missed the sql-createtableas page in the
documentation.

Patched v2 fixes the keyword list, I have also sorted by alphabetical order
the CREATE TABLE completion (AS was at the end of the list).

It has also been re-based on current master.

Fun. It has failed to apply here.

Anyway, I can see that a comment update has been forgotten. A second
thing is that it requires two more lines to add the query keywords for
the case where a CTAS has a list of column names. I've added both
changes, and applied the patch on HEAD. That's not all the patterns
possible, but this covers the most useful ones.
--
Michael