pg.ddx.io  pgsql-hackers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Ken Kato <katouknl@oss.nttdata.com>
To: Michael Paquier <michael@paquier.xyz>
Cc: pgsql-hackers@lists.postgresql.org
Subject: Re: CREATE tab completion
Date: Thu, 18 Nov 2021 16:25:30 +0900
Message-ID: <1e16d01ba570efea94d6d82e4254dc88@oss.nttdata.com> (raw)
In-Reply-To: <YZSv1Ydpfgu+n1Qf@paquier.xyz>
References: <8d370135aef066659eef8e8fbfa6315b@oss.nttdata.com>
	<YZSv1Ydpfgu+n1Qf@paquier.xyz>

> +       else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny)
> +               COMPLETE_WITH("LANGUAGE")
> +       else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny, 
> "LANGUAGE")
> 
> Those three lines are wrong, for two different reasons and three
> mistakes.  You may want to compile your code before sending it :)
> 
> +               COMPLETE_WITH_QUERY(Query_for_list_of_schemas
> +                                                       " UNION SELECT
> 'AUTORIZATION'");
> Incorrect completion here, s/AUTORIZATION/AUTHORIZATION/.

Thank you for the comments.

I am sorry for the compile error and a typo. I will make sure to compile 
before sending it and double check typos.


> "CREATE [TEMP|TEMPORARY] SEQUENCE name AS" could be completed with the
> supported types.  There are three of them.

For this part, I did the following:
+	else if (TailMatches("CREATE", "SEQUENCE", MatchAny, "AS") ||
+			 TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny, 
"AS"))
+		COMPLETE_WITH("smallint", "integer", "bigint");

Am I doing this right? or Are there better ways to do it?


Best wishes,

-- 
Ken Kato
Advanced Computing Technology Center
Research and Development Headquarters
NTT DATA CORPORATION

Attachments:

create_tab_completion.patch (text/x-diff, 5.0K) download diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 4f724e4428..efa7bb1f5f 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -2572,6 +2572,26 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("true", "false"); } + /* CREATE CONVERSION */ + else if (Matches("CREATE", "CONVERSION", MatchAny) || + Matches("CREATE", "DEFAULT", "CONVERSION", MatchAny)) + COMPLETE_WITH("FOR"); + else if (Matches("CREATE", "CONVERSION", MatchAny, "FOR") || + Matches("CREATE", "DEFAULT", "CONVERSION", MatchAny, "FOR")) + COMPLETE_WITH_QUERY(Query_for_list_of_encodings); + else if (Matches("CREATE", "CONVERSION", MatchAny, "FOR", MatchAny) || + Matches("CREATE", "DEFAULT", "CONVERSION", MatchAny, "FOR", MatchAny)) + COMPLETE_WITH("TO"); + else if (Matches("CREATE", "CONVERSION", MatchAny, "FOR", MatchAny, "TO") || + Matches("CREATE", "DEFAULT", "CONVERSION", MatchAny, "FOR", MatchAny, "TO")) + COMPLETE_WITH_QUERY(Query_for_list_of_encodings); + else if (Matches("CREATE", "CONVERSION", MatchAny, "FOR", MatchAny, "TO", MatchAny) || + Matches("CREATE", "DEFAULT", "CONVERSION", MatchAny, "FOR", MatchAny, "TO", MatchAny)) + COMPLETE_WITH("FROM"); + else if (Matches("CREATE", "CONVERSION", MatchAny, "FOR", MatchAny, "TO", MatchAny, "FROM") || + Matches("CREATE", "DEFAULT", "CONVERSION", MatchAny, "FOR", MatchAny, "TO", MatchAny, "FROM")) + COMPLETE_WITH_VERSIONED_SCHEMA_QUERY(Query_for_list_of_functions, NULL); + /* CREATE DATABASE */ else if (Matches("CREATE", "DATABASE", MatchAny)) COMPLETE_WITH("OWNER", "TEMPLATE", "ENCODING", "TABLESPACE", @@ -2582,6 +2602,17 @@ psql_completion(const char *text, int start, int end) else if (Matches("CREATE", "DATABASE", MatchAny, "TEMPLATE")) COMPLETE_WITH_QUERY(Query_for_list_of_template_databases); + /* CREATE DOMAIN */ + else if (Matches("CREATE", "DOMAIN", MatchAny)) + COMPLETE_WITH("AS"); + else if (Matches("CREATE", "DOMAIN", MatchAny, "AS")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL); + else if (Matches("CREATE", "DOMAIN", MatchAny, "AS", MatchAny)) + COMPLETE_WITH("COLLATE", "DEFAULT", "CONSTRAINT", + "NOT NULL", "NULL", "CHECK ("); + else if (Matches("CREATE", "DOMAIN", MatchAny, "COLLATE")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_collations, NULL); + /* CREATE EXTENSION */ /* Complete with available extensions rather than installed ones. */ else if (Matches("CREATE", "EXTENSION")) @@ -2661,6 +2692,14 @@ psql_completion(const char *text, int start, int end) !TailMatches("FOR", MatchAny, MatchAny, MatchAny)) COMPLETE_WITH("("); + /* CREATE LANGUAGE */ + else if (Matches("CREATE", "LANGUAGE", MatchAny) || + Matches("CREATE", "OR", "REPLACE", "LANGUAGE", MatchAny)) + COMPLETE_WITH("HANDLER"); + else if (Matches("CREATE", "LANGUAGE", MatchAny, "HANDLER", MatchAny) || + Matches("CREATE", "OR", "REPLACE", "LANGUAGE", MatchAny, "HANDLER", MatchAny)) + COMPLETE_WITH("INLINE", "VALIDATOR"); + /* CREATE OR REPLACE */ else if (Matches("CREATE", "OR")) COMPLETE_WITH("REPLACE"); @@ -2802,11 +2841,20 @@ psql_completion(const char *text, int start, int end) else if (TailMatches("AS", "ON", "SELECT|UPDATE|INSERT|DELETE", "TO")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables, NULL); +/* CREATE SCHEMA */ + else if (Matches("CREATE", "SCHEMA")) + COMPLETE_WITH("AUTHORIZATION"); + else if (Matches("CREATE", "SCHEMA") && TailMatches("AUTHORIZATION")) + COMPLETE_WITH_QUERY(Query_for_list_of_roles); + /* CREATE SEQUENCE --- is allowed inside CREATE SCHEMA, so use TailMatches */ else if (TailMatches("CREATE", "SEQUENCE", MatchAny) || TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny)) - COMPLETE_WITH("INCREMENT BY", "MINVALUE", "MAXVALUE", "NO", "CACHE", - "CYCLE", "OWNED BY", "START WITH"); + COMPLETE_WITH("AS", "INCREMENT BY", "MINVALUE", "MAXVALUE", "NO", + "CACHE", "CYCLE", "OWNED BY", "START WITH"); + else if (TailMatches("CREATE", "SEQUENCE", MatchAny, "AS") || + TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny, "AS")) + COMPLETE_WITH("smallint", "integer", "bigint"); else if (TailMatches("CREATE", "SEQUENCE", MatchAny, "NO") || TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny, "NO")) COMPLETE_WITH("MINVALUE", "MAXVALUE", "CYCLE"); @@ -2882,6 +2930,19 @@ psql_completion(const char *text, int start, int end) else if (Matches("CREATE", "TEXT", "SEARCH", "CONFIGURATION|DICTIONARY|PARSER|TEMPLATE", MatchAny)) COMPLETE_WITH("("); +/* CREATE TRANSFORM */ + else if (Matches("CREATE", "TRANSFORM")) + COMPLETE_WITH("FOR"); + else if (Matches("CREATE", "TRANSFORM", "FOR")) + COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL); + else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny)) + COMPLETE_WITH("LANGUAGE"); + else if (Matches("CREATE", "TRANSFORM", "FOR", MatchAny, "LANGUAGE")) + { + completion_info_charp = prev2_wd; + COMPLETE_WITH_QUERY(Query_for_list_of_languages); + } + /* CREATE SUBSCRIPTION */ else if (Matches("CREATE", "SUBSCRIPTION", MatchAny)) COMPLETE_WITH("CONNECTION");

view thread (8+ messages)  latest in thread

Message-ID: <1e16d01ba570efea94d6d82e4254dc88@oss.nttdata.com>
Permalink:  ../1e16d01ba570efea94d6d82e4254dc88@oss.nttdata.com/
Also on:    postgresql.org/message-id/1e16d01ba570efea94d6d82e4254dc88@oss.nttdata.com

 ·  · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-hackers@postgresql.org
  Cc: katouknl@oss.nttdata.com, michael@paquier.xyz, pgsql-hackers@lists.postgresql.org
  Subject: Re: CREATE tab completion
  In-Reply-To: <1e16d01ba570efea94d6d82e4254dc88@oss.nttdata.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox