From: Michael Paquier <michael@paquier.xyz>
To: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Cc: Suraj Khamkar <khamkarsuraj.b@gmail.com>
Cc: pgsql-hackers@lists.postgresql.org
Subject: Re: Tab completion for CREATE SCHEMAAUTHORIZATION
Date: Tue, 9 May 2023 12:26:16 +0900
Message-ID: <ZFm9WKBe1czsWOR4@paquier.xyz> (raw)
In-Reply-To: <87ttwmu6es.fsf@wibble.ilmari.org>
References: <87im0efqhp.fsf@wibble.ilmari.org>
<YRMk378EUuVmJ2Fq@paquier.xyz>
<Yalwm1pc6X+GVxWn@paquier.xyz>
<87ildyqwks.fsf@wibble.ilmari.org>
<ZDoGocfchN9KFxFC@paquier.xyz>
<ZFBw99aDs5AczF6v@paquier.xyz>
<875y9buhys.fsf@wibble.ilmari.org>
<87354fudqy.fsf@wibble.ilmari.org>
<ZFXCY0s1D1KtJi+5@paquier.xyz>
<87ttwmu6es.fsf@wibble.ilmari.org>
On Mon, May 08, 2023 at 05:36:27PM +0100, Dagfinn Ilmari Mannsåker wrote:
> Here's an updated v3 patch with that. While adding that, I noticed that
> CREATE UNLOGGED only tab-completes TABLE and MATERIALIZED VIEW, not
> SEQUENCE, so I added that (and removed MATERIALIZED VIEW when part of
> CREATE SCHEMA).
+ /* but not MATVIEW in CREATE SCHEMA */
+ if (HeadMatches("CREATE", "SCHEMA"))
+ COMPLETE_WITH("TABLE", "SEQUENCE");
+ else
+ COMPLETE_WITH("TABLE", "SEQUENCE", "MATERIALIZED VIEW");
This may look strange at first glance, but the grammar is what it
is.. Perhaps matviews could be part of that at some point. Or not. :)
+ /* only some object types can be created as part of CREATE SCHEMA */
+ if (HeadMatches("CREATE", "SCHEMA"))
+ COMPLETE_WITH("TABLE", "VIEW", "INDEX", "SEQUENCE", "TRIGGER",
+ /* for INDEX and TABLE/SEQUENCE, respectively */
+ "UNIQUE", "UNLOGGED");
Not including TEMPORARY is OK here as the grammar does not allow a
directly to create a temporary schema. The (many) code paths that
have TailMatches() to cope with CREATE SCHEMA would continue the
completion of added, but at least this approach avoids the
recommendation if possible.
That looks pretty much OK to me. One tiny comment I have is that this
lacks brackets for the inner blocks, so I have added some in the v4
attached.
--
Michael
Attachments:v4-0001-Add-tab-completion-for-CREATE-SCHEMA.patch (text/x-diff, 4.4K) download
From d163ead2e81048af130ab4b72642b8e89d0c7e32 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Tue, 9 May 2023 12:25:03 +0900
Subject: [PATCH v4] Add tab completion for CREATE SCHEMA
- AUTHORIZATION both in addition to and after a schema name
- list of owner roles after AUTHORIZATION
- CREATE and GRANT after any otherwise-complete command
- Only the allowed object types after CREATE
Also adjust complation after CREATE UNLOGGED:
- Add SEQUENCE
- Don't suggest MATERIALIZED VIEW in CREATE TABLE
---
src/bin/psql/tab-complete.c | 45 ++++++++++++++++++++++++++++++-------
1 file changed, 37 insertions(+), 8 deletions(-)
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.cindex bd04244969..9b0b7ddb33 100644--- a/src/bin/psql/tab-complete.c+++ b/src/bin/psql/tab-complete.c@@ -1031,9 +1031,13 @@ static const SchemaQuery Query_for_trigger_of_table = {
" FROM pg_catalog.pg_roles "\
" WHERE rolname LIKE '%s'"
+/* add these to Query_for_list_of_roles in OWNER contexts */+#define Keywords_for_list_of_owner_roles \+"CURRENT_ROLE", "CURRENT_USER", "SESSION_USER"+
/* add these to Query_for_list_of_roles in GRANT contexts */
#define Keywords_for_list_of_grant_roles \
-"PUBLIC", "CURRENT_ROLE", "CURRENT_USER", "SESSION_USER"+Keywords_for_list_of_owner_roles, "PUBLIC"
#define Query_for_all_table_constraints \
"SELECT conname "\
@@ -1785,8 +1789,15 @@ psql_completion(const char *text, int start, int end)
/* CREATE */
/* complete with something you can create */
else if (TailMatches("CREATE"))
- matches = rl_completion_matches(text, create_command_generator);-+ {+ /* only some object types can be created as part of CREATE SCHEMA */+ if (HeadMatches("CREATE", "SCHEMA"))+ COMPLETE_WITH("TABLE", "VIEW", "INDEX", "SEQUENCE", "TRIGGER",+ /* for INDEX and TABLE/SEQUENCE, respectively */+ "UNIQUE", "UNLOGGED");+ else+ matches = rl_completion_matches(text, create_command_generator);+ }
/* complete with something you can create or replace */
else if (TailMatches("CREATE", "OR", "REPLACE"))
COMPLETE_WITH("FUNCTION", "PROCEDURE", "LANGUAGE", "RULE", "VIEW",
@@ -3154,6 +3165,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);
+/* CREATE SCHEMA [ <name> ] [ AUTHORIZATION ] */+ else if (Matches("CREATE", "SCHEMA"))+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas,+ "AUTHORIZATION");+ else if (Matches("CREATE", "SCHEMA", "AUTHORIZATION") ||+ Matches("CREATE", "SCHEMA", MatchAny, "AUTHORIZATION"))+ COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,+ Keywords_for_list_of_owner_roles);+ else if (Matches("CREATE", "SCHEMA", "AUTHORIZATION", MatchAny) ||+ Matches("CREATE", "SCHEMA", MatchAny, "AUTHORIZATION", MatchAny))+ COMPLETE_WITH("CREATE", "GRANT");+ else if (Matches("CREATE", "SCHEMA", MatchAny))+ COMPLETE_WITH("AUTHORIZATION", "CREATE", "GRANT");+
/* CREATE SEQUENCE --- is allowed inside CREATE SCHEMA, so use TailMatches */
else if (TailMatches("CREATE", "SEQUENCE", MatchAny) ||
TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny))
@@ -3185,9 +3210,15 @@ psql_completion(const char *text, int start, int end)
/* Complete "CREATE TEMP/TEMPORARY" with the possible temp objects */
else if (TailMatches("CREATE", "TEMP|TEMPORARY"))
COMPLETE_WITH("SEQUENCE", "TABLE", "VIEW");
- /* Complete "CREATE UNLOGGED" with TABLE or MATVIEW */+ /* Complete "CREATE UNLOGGED" with TABLE, SEQUENCE or MATVIEW */
else if (TailMatches("CREATE", "UNLOGGED"))
- COMPLETE_WITH("TABLE", "MATERIALIZED VIEW");+ {+ /* but not MATVIEW in CREATE SCHEMA */+ if (HeadMatches("CREATE", "SCHEMA"))+ COMPLETE_WITH("TABLE", "SEQUENCE");+ else+ COMPLETE_WITH("TABLE", "SEQUENCE", "MATERIALIZED VIEW");+ }
/* Complete PARTITION BY with RANGE ( or LIST ( or ... */
else if (TailMatches("PARTITION", "BY"))
COMPLETE_WITH("RANGE (", "LIST (", "HASH (");
@@ -4263,9 +4294,7 @@ psql_completion(const char *text, int start, int end)
/* OWNER TO - complete with available roles */
else if (TailMatches("OWNER", "TO"))
COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles,
- "CURRENT_ROLE",- "CURRENT_USER",- "SESSION_USER");+ Keywords_for_list_of_owner_roles);
/* ORDER BY */
else if (TailMatches("FROM", MatchAny, "ORDER"))
--
2.40.1
signature.asc (application/pgp-signature, 832B) download
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: michael@paquier.xyz, ilmari@ilmari.org, khamkarsuraj.b@gmail.com, pgsql-hackers@lists.postgresql.org
Subject: Re: Tab completion for CREATE SCHEMAAUTHORIZATION
In-Reply-To: <ZFm9WKBe1czsWOR4@paquier.xyz>
* 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