From: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
To: Michael Paquier <michael@paquier.xyz>
Cc: pgsql-hackers@lists.postgresql.org
Subject: Re: [PATCH] Tab completion for ALTER TABLE … ADD …
Date: Fri, 27 Aug 2021 11:52:33 +0100
Message-ID: <87k0k7upla.fsf@wibble.ilmari.org> (raw)
In-Reply-To: <YShkMBE3sq8mDa1S@paquier.xyz>
References: <87bl6ehhpl.fsf@wibble.ilmari.org>
<YShkMBE3sq8mDa1S@paquier.xyz>
Michael Paquier <michael@paquier.xyz> writes:
> On Tue, Aug 03, 2021 at 12:48:38PM +0100, Dagfinn Ilmari Mannsåker wrote:
>> The other day I noticed that there's no tab completion after ALTER TABLE
>> … ADD, so here's a patch. In addition to COLUMN and all the table
>> constraint types, it also completes with the list of unique indexes on
>> the table after ALTER TABLE … ADD … USING INDEX.
>
> I was reading this patch (not actually tested), and that's a clear
> improvement. One extra thing that could be done here is to complete
> with types for a ALTER TABLE ADD COLUMN foo.
That was easy enough to add (just a bit of extra fiddling to handle
COLUMN being optional), done in the attached v2 patch.
> We could as well have a list of columns after UNIQUE or PRIMARY KEY,
> but that feels like extra cream on top of the cake.
Doing a list of arbitrarily many comma-separated names is more
complicated, so that can be the subject for another patch.
> In short I am fine with what you have here.
Thanks for the review.
- ilmari
Attachments:v2-0001-Add-tab-completion-for-ALTER-TABLE-ADD.patch (text/x-diff, 3.9K) download
From 0bdf91f2a66bf9393e6900db904bda1961c03350 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= <ilmari@ilmari.org>
Date: Tue, 3 Aug 2021 12:23:07 +0100
Subject: [PATCH v2] =?UTF-8?q?Add=20tab=20completion=20for=20ALTER=20TABLE?=
=?UTF-8?q?=20=E2=80=A6=20ADD=20=E2=80=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Complete with COLUMN plus the various table constraint types, list
unique indexes on the table after ADD (UNQIUE|PRIMARY KEY) USING INDEX,
and data types after ADD [COLUMN] <column_name>.
---
src/bin/psql/tab-complete.c | 49 +++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.cindex 7cdfc7c637..bb7c3fc5cf 100644--- a/src/bin/psql/tab-complete.c+++ b/src/bin/psql/tab-complete.c@@ -776,6 +776,10 @@ static const SchemaQuery Query_for_list_of_collations = {
" and pg_catalog.quote_ident(c1.relname)='%s'"\
" and pg_catalog.pg_table_is_visible(c2.oid)"
+#define Query_for_unique_index_of_table \+Query_for_index_of_table \+" and i.indisunique"+
/* the silly-looking length condition is just to eat up the current word */
#define Query_for_constraint_of_table \
"SELECT pg_catalog.quote_ident(conname) "\
@@ -2019,6 +2023,51 @@ psql_completion(const char *text, int start, int end)
"OWNER TO", "SET", "VALIDATE CONSTRAINT",
"REPLICA IDENTITY", "ATTACH PARTITION",
"DETACH PARTITION", "FORCE ROW LEVEL SECURITY");
+ /* ALTER TABLE xxx ADD */+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD"))+ COMPLETE_WITH("COLUMN", "CONSTRAINT", "CHECK", "UNIQUE", "PRIMARY KEY",+ "EXCLUDE", "FOREIGN KEY");+ /* ALTER TABLE xxx ADD CONSTRAINT yyy */+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny))+ COMPLETE_WITH("CHECK", "UNIQUE", "PRIMARY KEY", "EXCLUDE", "FOREIGN KEY");+ /* ALTER TABLE xxx ADD (CONSTRAINT yyy)? FOREIGN|PRIMARY */+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "FOREIGN|PRIMARY") ||+ Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, "FOREIGN|PRIMARY"))+ COMPLETE_WITH("KEY");+ /* ALTER TABLE xxx ADD (CONSTRAINT yyy)? (PRIMARY KEY|UNIQUE) */+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "PRIMARY", "KEY") ||+ Matches("ALTER", "TABLE", MatchAny, "ADD", "UNIQUE") ||+ Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, "PRIMARY", "KEY") ||+ Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny, "UNIQUE"))+ COMPLETE_WITH("(", "USING INDEX");+ /* ALTER TABLE xxx ADD (CONSTRAINT yyy)? ... USING INDEX */+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "PRIMARY", "KEY", "USING", "INDEX"))+ {+ completion_info_charp = prev6_wd;+ COMPLETE_WITH_QUERY(Query_for_unique_index_of_table);+ }+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "UNIQUE", "USING", "INDEX"))+ {+ completion_info_charp = prev5_wd;+ COMPLETE_WITH_QUERY(Query_for_unique_index_of_table);+ }+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny,+ "PRIMARY", "KEY", "USING", "INDEX"))+ {+ completion_info_charp = prev8_wd;+ COMPLETE_WITH_QUERY(Query_for_unique_index_of_table);+ }+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "CONSTRAINT", MatchAny,+ "UNIQUE", "USING", "INDEX"))+ {+ completion_info_charp = prev7_wd;+ COMPLETE_WITH_QUERY(Query_for_unique_index_of_table);+ }+ /* ADD column_name must be last of the ALTER TABLE xxx ADD matches */+ else if (Matches("ALTER", "TABLE", MatchAny, "ADD", "COLUMN", MatchAny) ||+ (Matches("ALTER", "TABLE", MatchAny, "ADD", MatchAny) &&+ !Matches("ALTER", "TABLE", MatchAny, "ADD", "COLUMN")))+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes, NULL);
/* ALTER TABLE xxx ENABLE */
else if (Matches("ALTER", "TABLE", MatchAny, "ENABLE"))
COMPLETE_WITH("ALWAYS", "REPLICA", "ROW LEVEL SECURITY", "RULE",
--
2.30.2
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: ilmari@ilmari.org, michael@paquier.xyz, pgsql-hackers@lists.postgresql.org
Subject: Re: [PATCH] Tab completion for ALTER TABLE … ADD …
In-Reply-To: <87k0k7upla.fsf@wibble.ilmari.org>
* 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