From: Stephen Frost <sfrost@snowman.net>
To: Gilles Darold <gilles.darold@dalibo.com>
Cc: pgsql-hackers@postgresql.org
Subject: Re: [patch] psql tab completion for ALTER DEFAULT PRIVILEGES
Date: Thu, 22 Dec 2016 22:27:40 -0500
Message-ID: <20161223032740.GV18360@tamriel.snowman.net> (raw)
In-Reply-To: <9905474c-ab29-bb66-408f-ca776fb3d69c@dalibo.com>
References: <1614593c-e356-5b27-6dba-66320a9bc68b@dalibo.com>
<9905474c-ab29-bb66-408f-ca776fb3d69c@dalibo.com>
List-Unsubscribe: <mailto:majordomo@postgresql.org?body=unsub%20pgsql-hackers>
Gilles,
* Gilles Darold (gilles.darold@dalibo.com) wrote:
> Added to next commitfest. To explain more this patch, the completion of
> SQL command:
>
> ALTER DEFAULT PRIVILEGES FOR ROLE xxx [tab]
Here is a cleaned up patch for master and 9.6. Tomorrow I'll look into
what we can do for 9.5 and earlier, which are also wrong, but the code
is quite a bit different.
Note that beyond just changing the comments, I removed the alternative
spelling of 'role' when doing tab completion- there's no different
between 'role' and 'user', so there's no point in making the user have
to pick one when they're tab-completing. Of course, we still accept
both and if the user chooses to write out 'for user', we will handle
that correctly and continue the tab completion beyond that.
Thanks!
Stephen
Attachments:patch-completion-alter-default-privileges_v2_master.diff (text/x-diff, 5.5K) download
From 1f7eb8473d40497b67cc30b40aefe2e1529317c0 Mon Sep 17 00:00:00 2001
From: Stephen Frost <sfrost@snowman.net>
Date: Thu, 22 Dec 2016 22:00:55 -0500
Subject: [PATCH] Fix tab completion in psql for ALTER DEFAULT PRIVILEGES
When providing tab completion for ALTER DEFAULT PRIVILEGES, we are
including the list of roles as possible options for completion after the
GRANT or REVOKE. Further, we accept FOR ROLE/IN SCHEMA at the same time
and in either order, but the tab completion was only working for one or
the other. Lastly, we weren't using the actual list of allowed kinds of
objects for default privileges for completion after the 'GRANT X ON' but
instead were completeing to what 'GRANT X ON' supports, which isn't the
ssame at all.
Address these issues by improving the forward tab-completion for ALTER
DEFAULT PRIVILEGES and then constrain and correct how the tail
completion is done when it is for ALTER DEFAULT PRIVILEGES.
Author: Gilles Darold, cleaned up and comments added by me.
Discussion: https://www.postgresql.org/message-id/1614593c-e356-5b27-6dba-66320a9bc68b@dalibo.com
Back-patch to 9.2.
---
src/bin/psql/tab-complete.c | 57 ++++++++++++++++++++++++++++++++++++++-------
1 file changed, 48 insertions(+), 9 deletions(-)
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.cindex cd64c39..02c8d60 100644--- a/src/bin/psql/tab-complete.c+++ b/src/bin/psql/tab-complete.c@@ -1570,13 +1570,31 @@ psql_completion(const char *text, int start, int end)
COMPLETE_WITH_CONST("PASSWORD");
/* ALTER DEFAULT PRIVILEGES */
else if (Matches3("ALTER", "DEFAULT", "PRIVILEGES"))
- COMPLETE_WITH_LIST3("FOR ROLE", "FOR USER", "IN SCHEMA");+ COMPLETE_WITH_LIST2("FOR ROLE", "IN SCHEMA");
/* ALTER DEFAULT PRIVILEGES FOR */
else if (Matches4("ALTER", "DEFAULT", "PRIVILEGES", "FOR"))
- COMPLETE_WITH_LIST2("ROLE", "USER");- /* ALTER DEFAULT PRIVILEGES { FOR ROLE ... | IN SCHEMA ... } */- else if (Matches6("ALTER", "DEFAULT", "PRIVILEGES", "FOR", "ROLE|USER", MatchAny) ||- Matches6("ALTER", "DEFAULT", "PRIVILEGES", "IN", "SCHEMA", MatchAny))+ COMPLETE_WITH_CONST("ROLE");+ /* ALTER DEFAULT PRIVILEGES IN */+ else if (Matches4("ALTER", "DEFAULT", "PRIVILEGES", "IN"))+ COMPLETE_WITH_CONST("SCHEMA");+ /* ALTER DEFAULT PRIVILEGES FOR ROLE|USER ... */+ else if (Matches6("ALTER", "DEFAULT", "PRIVILEGES", "FOR", "ROLE|USER",+ MatchAny))+ COMPLETE_WITH_LIST3("GRANT", "REVOKE", "IN SCHEMA");+ /* ALTER DEFAULT PRIVILEGES IN SCHEMA ... */+ else if (Matches6("ALTER", "DEFAULT", "PRIVILEGES", "IN", "SCHEMA",+ MatchAny))+ COMPLETE_WITH_LIST3("GRANT", "REVOKE", "FOR ROLE");+ /* ALTER DEFAULT PRIVILEGES IN SCHEMA ... FOR */+ else if (Matches7("ALTER", "DEFAULT", "PRIVILEGES", "IN", "SCHEMA",+ MatchAny, "FOR"))+ COMPLETE_WITH_CONST("ROLE");+ /* ALTER DEFAULT PRIVILEGES FOR ROLE|USER ... IN SCHEMA ... */+ /* ALTER DEFAULT PRIVILEGES IN SCHEMA ... FOR ROLE|USER ... */+ else if (Matches9("ALTER", "DEFAULT", "PRIVILEGES", "FOR", "ROLE|USER",+ MatchAny, "IN", "SCHEMA", MatchAny) ||+ Matches9("ALTER", "DEFAULT", "PRIVILEGES", "IN", "SCHEMA",+ MatchAny, "FOR", "ROLE|USER", MatchAny))
COMPLETE_WITH_LIST2("GRANT", "REVOKE");
/* ALTER DOMAIN <name> */
else if (Matches3("ALTER", "DOMAIN", MatchAny))
@@ -2566,10 +2584,22 @@ psql_completion(const char *text, int start, int end)
else if (TailMatches2("FOREIGN", "SERVER"))
COMPLETE_WITH_QUERY(Query_for_list_of_servers);
-/* GRANT && REVOKE --- is allowed inside CREATE SCHEMA, so use TailMatches */+/*+ * GRANT and REVOKE are allowed inside CREATE SCHEMA and+ * ALTER DEFAULT PRIVILEGES, so use TailMatches+ */
/* Complete GRANT/REVOKE with a list of roles and privileges */
else if (TailMatches1("GRANT|REVOKE"))
- COMPLETE_WITH_QUERY(Query_for_list_of_roles+ /*+ * With ALTER DEFAULT PRIVILEGES, restrict completion+ * to grantable privileges (can't grant roles)+ */+ if (HeadMatches3("ALTER","DEFAULT","PRIVILEGES"))+ COMPLETE_WITH_LIST10("SELECT", "INSERT", "UPDATE",+ "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER",+ "EXECUTE", "USAGE", "ALL");+ else+ COMPLETE_WITH_QUERY(Query_for_list_of_roles
" UNION SELECT 'SELECT'"
" UNION SELECT 'INSERT'"
" UNION SELECT 'UPDATE'"
@@ -2610,7 +2640,14 @@ psql_completion(const char *text, int start, int end)
* privilege.
*/
else if (TailMatches3("GRANT|REVOKE", MatchAny, "ON"))
- COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsvmf,+ /*+ * With ALTER DEFAULT PRIVILEGES, restrict completion+ * to the kinds of objects supported.+ */+ if (HeadMatches3("ALTER","DEFAULT","PRIVILEGES"))+ COMPLETE_WITH_LIST4("TABLES", "SEQUENCES", "FUNCTIONS", "TYPES");+ else+ COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tsvmf,
" UNION SELECT 'ALL FUNCTIONS IN SCHEMA'"
" UNION SELECT 'ALL SEQUENCES IN SCHEMA'"
" UNION SELECT 'ALL TABLES IN SCHEMA'"
@@ -2673,7 +2710,9 @@ psql_completion(const char *text, int start, int end)
else if ((HeadMatches1("GRANT") && TailMatches1("TO")) ||
(HeadMatches1("REVOKE") && TailMatches1("FROM")))
COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles);
-+ /* Complete "ALTER DEFAULT PRIVILEGES ... GRANT/REVOKE ... TO/FROM */+ else if (HeadMatches3("ALTER","DEFAULT", "PRIVILEGES") && TailMatches1("TO|FROM"))+ COMPLETE_WITH_QUERY(Query_for_list_of_grant_roles);
/* Complete "GRANT/REVOKE ... ON * *" with TO/FROM */
else if (HeadMatches1("GRANT") && TailMatches3("ON", MatchAny, MatchAny))
COMPLETE_WITH_CONST("TO");
--
2.7.4
signature.asc (application/pgp-signature, 818B) 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: sfrost@snowman.net, gilles.darold@dalibo.com
Subject: Re: [patch] psql tab completion for ALTER DEFAULT PRIVILEGES
In-Reply-To: <20161223032740.GV18360@tamriel.snowman.net>
* 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