Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gZlnz-0001bp-Ba for pgsql-hackers@arkaria.postgresql.org; Thu, 20 Dec 2018 00:03:11 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1gZlnx-0004Qh-CR for pgsql-hackers@arkaria.postgresql.org; Thu, 20 Dec 2018 00:03:09 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gZlnx-0004Qa-24 for pgsql-hackers@lists.postgresql.org; Thu, 20 Dec 2018 00:03:09 +0000 Received: from ping.uio.no ([2001:700:100:570::196]) by makus.postgresql.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gZlno-0001dK-Ab for pgsql-hackers@postgresql.org; Thu, 20 Dec 2018 00:03:06 +0000 Received: from [2001:700:100:570::211] (helo=dalvik.ping.uio.no ident=Debian-exim) by ping.uio.no with esmtp (Exim 4.72 #1 (Debian)) id 1gZlng-00065x-QQ; Thu, 20 Dec 2018 01:02:54 +0100 Received: from ilmari by dalvik.ping.uio.no with local (Exim 4.84_2) (envelope-from ) id 1gZlng-0002Ib-KD; Thu, 20 Dec 2018 01:02:52 +0100 From: ilmari@ilmari.org (Dagfinn Ilmari =?utf-8?Q?Manns=C3=A5ker?=) To: Michael Paquier Cc: pgsql-hackers@postgresql.org Subject: Re: [PATCH] Improve tab completion for CREATE TABLE References: <20181219050530.GC19856@paquier.xyz> <20181219234408.GD27104@paquier.xyz> Mail-Copies-To: nobody Date: Thu, 20 Dec 2018 00:02:52 +0000 In-Reply-To: <20181219234408.GD27104@paquier.xyz> (Michael Paquier's message of "Thu, 20 Dec 2018 08:44:08 +0900") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Exiscan-Spam-Score: -3.7 (---) X-Exiscan-Spam-Report: SpamAssassin 3.3.1 (2010-03-16) on pike.ping.uio.no Score Rule * -5.0 PING_UIO_MAIL_IS_INTERNAL Message has never been outside * 129.240.0.0/16 or 193.157.115.0/24 * 1.3 RDNS_NONE Delivered to internal network by a host with no rDNS List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Michael Paquier writes: > On Wed, Dec 19, 2018 at 11:22:29PM +0000, Dagfinn Ilmari Mannsåker wrote: >> Michael Paquier writes: >>> + /* Complete ON COMMIT actions for temp tables */ >>> + else if (TailMatches("ON", "COMMIT")) >>> + COMPLETE_WITH("PRESERVE ROWS", "DELETE ROWS", "DROP"); >>> >>> This causes ON COMMIT to show up for permanent and unlogged tables. >> >> No, this is for completing _after_ ON COMMIT, which is only suggested by >> the clause for temporary tables above. > > If a user types "CREATE TABLE foo () ON COMMIT" by himself and then asks > for tab completion then he would get the suggestion, which is incorrect? Point, fixed in the attached v4. OTOH, as I mentioned in my other email, that runs into the problem that it won't complete the actions after e.g. "CREATE TEMP TABLE FOO () WITH () ON COMMIT". -- - Twitter seems more influential [than blogs] in the 'gets reported in the mainstream press' sense at least. - Matt McLeod - That'd be because the content of a tweet is easier to condense down to a mainstream media article. - Calle Dybedahl --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=v4-0001-Tab-complete-more-options-for-CREATE-TABLE.patch From 294480116f52ba96ad10ed49850ffc3785e1a43c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= Date: Fri, 23 Nov 2018 15:23:21 +0000 Subject: [PATCH v4] Tab complete more options for CREATE TABLE - ( or OF or PARTITION OF after the name - composite type names after CREATE TABLE OF - options after the column list - actions after ON COMMIT --- src/bin/psql/tab-complete.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index fa44b2820b..2996c8e68f 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -344,6 +344,18 @@ static const SchemaQuery Query_for_list_of_datatypes = { .qualresult = "pg_catalog.quote_ident(t.typname)", }; +static const SchemaQuery Query_for_list_of_composite_datatypes = { + .catname = "pg_catalog.pg_type t", + /* selcondition --- only get free-standing composite types */ + .selcondition = "(SELECT c.relkind = " CppAsString2(RELKIND_COMPOSITE_TYPE) + " FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid) " + "AND t.typname !~ '^_'", + .viscondition = "pg_catalog.pg_type_is_visible(t.oid)", + .namespace = "t.typnamespace", + .result = "pg_catalog.format_type(t.oid, NULL)", + .qualresult = "pg_catalog.quote_ident(t.typname)", +}; + static const SchemaQuery Query_for_list_of_domains = { .catname = "pg_catalog.pg_type t", .selcondition = "t.typtype = 'd'", @@ -2412,6 +2424,23 @@ psql_completion(const char *text, int start, int end) /* Limited completion support for partition bound specification */ else if (TailMatches("PARTITION", "OF", MatchAny)) COMPLETE_WITH("FOR VALUES", "DEFAULT"); + /* Complete after CREATE TABLE */ + else if (TailMatches("CREATE", "TABLE", MatchAny) || + TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny)) + COMPLETE_WITH("(", "OF", "PARTITION OF"); + /* Complete with list of composite types after CREATE TABLE OF */ + 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 options after CREATE TABLE name (...) */ + else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)") || + TailMatches("CREATE", "UNLOGGED", "TABLE", MatchAny, "(*)")) + COMPLETE_WITH("INHERITS (", "PARTITION BY", "WITH (", "TABLESPACE"); + else if (TailMatches("CREATE", "TEMP|TEMPORARY", "TABLE", MatchAny, "(*)")) + COMPLETE_WITH("INHERITS (", "PARTITION BY", "WITH (", "ON COMMIT", "TABLESPACE"); + /* Complete ON COMMIT actions for temp tables */ + else if (TailMatches("CREATE", "TEMP|TEMPORARY", "TABLE", MatchAny, "(*)", "ON", "COMMIT")) + COMPLETE_WITH("PRESERVE ROWS", "DELETE ROWS", "DROP"); /* CREATE TABLESPACE */ else if (Matches("CREATE", "TABLESPACE", MatchAny)) -- 2.20.1 --=-=-=--