On Fri, 4 Apr 2025 19:18:11 +0900 Fujii Masao <masao.fu...@oss.nttdata.com> wrote:
> > > On 2025/04/04 0:21, Fujii Masao wrote: > > Thanks for updating the patch! > > > > If there are no objections, I'll proceed with committing it using the > > following commit log. > > I've pushed the patch. Thanks! Thank you! > While testing the feature, I noticed that psql doesn't complete > "ALTER DEFAULT PRIVILEGES GRANT/REVOKE ... ON LARGE OBJECTS" or > "GRANT/REVOKE ... ON LARGE OBJECT ..." with TO/FROM. The attached > patch adds tab-completion support for both cases. This patch looks good to me. This works as expected. While looking into this patch, I found that the tab completion suggests TO/FROM even after "LARGE OBJECT", but it is not correct because there should be largeobject id at that place. This is same for the "FOREIGN SERVER", server names should be suggested ratar than TO/FROM in this case. The additional patch 0002 fixed to prevents to suggest TO or FROM right after LARGE OBJECT or FOREIGN SERVER. Also, it allows to suggest list of foreign server names after FOREIGN SERVER. The 0001 patch is the same you proposed. Regards, Yugo Nagata -- Yugo NAGATA <nag...@sraoss.co.jp>
>From 64d5aead5ab080d40fa85f9bd51cb0a09490266f Mon Sep 17 00:00:00 2001 From: Yugo Nagata <nag...@sraoss.co.jp> Date: Tue, 8 Apr 2025 12:15:45 +0900 Subject: [PATCH 2/2] psql: Some improvement of tab completion for GRANT/REVOKE This prevents to suggest TO or FROM just after LARGE OBJECT or FOREIGN SERVER because there should be largeobject id or server name at that place. Also, it allows to suggest list of foreign server names after FOREIGN SERVER. --- src/bin/psql/tab-complete.in.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c index bdeb95fb3c8..c58ed27e872 100644 --- a/src/bin/psql/tab-complete.in.c +++ b/src/bin/psql/tab-complete.in.c @@ -4567,10 +4567,18 @@ match_previous_words(int pattern_id, else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", MatchAnyN, "TO", MatchAny)) COMPLETE_WITH("WITH GRANT OPTION"); /* Complete "GRANT/REVOKE ... ON * *" with TO/FROM */ - else if (Matches("GRANT", MatchAnyN, "ON", MatchAny, MatchAny)) - COMPLETE_WITH("TO"); - else if (Matches("REVOKE", MatchAnyN, "ON", MatchAny, MatchAny)) - COMPLETE_WITH("FROM"); + else if (Matches("GRANT/REVOKE", MatchAnyN, "ON", MatchAny, MatchAny)) + { + if (TailMatches("FOREIGN", "SERVER")) + COMPLETE_WITH_QUERY(Query_for_list_of_servers); + else if (!TailMatches("LARGE", "OBJECT")) + { + if (Matches("GRANT", MatchAnyN, "ON", MatchAny, MatchAny)) + COMPLETE_WITH("TO"); + else + COMPLETE_WITH("FROM"); + } + } /* Complete "GRANT/REVOKE * ON ALL * IN SCHEMA *" with TO/FROM */ else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "ALL", MatchAny, "IN", "SCHEMA", MatchAny) || -- 2.34.1
>From 8402036dcc5e32a249a7af0fb9e27c31ba8b72a6 Mon Sep 17 00:00:00 2001 From: Fujii Masao <fu...@postgresql.org> Date: Fri, 4 Apr 2025 10:51:20 +0900 Subject: [PATCH 1/2] psql: Improve psql tab completion for GRANT/REVOKE on large objects. This commit enhances psql's tab completion to support TO/FROM after "GRANT/REVOKE ... ON LARGE OBJECT ...". Additionally, since "ALTER DEFAULT PRIVILEGES" now supports large objects, tab completion is also updated for "GRANT/REVOKE ... ON LARGE OBJECTS" with TO/FROM. --- src/bin/psql/tab-complete.in.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c index c916b9299a8..bdeb95fb3c8 100644 --- a/src/bin/psql/tab-complete.in.c +++ b/src/bin/psql/tab-complete.in.c @@ -4602,6 +4602,26 @@ match_previous_words(int pattern_id, COMPLETE_WITH("FROM"); } + /* Complete "GRANT/REVOKE * ON LARGE OBJECT *" with TO/FROM */ + else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "LARGE", "OBJECT", MatchAny) || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "LARGE", "OBJECT", MatchAny)) + { + if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny, MatchAny, MatchAny)) + COMPLETE_WITH("TO"); + else + COMPLETE_WITH("FROM"); + } + + /* Complete "GRANT/REVOKE * ON LARGE OBJECTS" with TO/FROM */ + else if (TailMatches("GRANT|REVOKE", MatchAny, "ON", "LARGE", "OBJECTS") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR", MatchAny, "ON", "LARGE", "OBJECTS")) + { + if (TailMatches("GRANT", MatchAny, MatchAny, MatchAny, MatchAny)) + COMPLETE_WITH("TO"); + else + COMPLETE_WITH("FROM"); + } + /* GROUP BY */ else if (TailMatches("FROM", MatchAny, "GROUP")) COMPLETE_WITH("BY"); -- 2.34.1