Hi I found myself needing to work with ALTER ROLE ... IN DATABASE ... recently and was annoyed by the lack of tab completion for this, so patch attached.
Regards Ian Barwick
From de1cb4cb546b9cfac280c44aea2cf112a85bc7e9 Mon Sep 17 00:00:00 2001 From: Ian Barwick <[email protected]> Date: Fri, 21 Nov 2025 11:47:26 +0900 Subject: [PATCH v1] psql: add tab completion for ALTER ROLE ... IN DATABASE ... This patch adds tab completion for the "IN DATABASE" clause of ALTER ROLE. --- src/bin/psql/tab-complete.in.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c index 51806597037..1d03d8eb49e 100644 --- a/src/bin/psql/tab-complete.in.c +++ b/src/bin/psql/tab-complete.in.c @@ -2536,12 +2536,34 @@ match_previous_words(int pattern_id, else if (Matches("ALTER", "USER|ROLE", MatchAny) && !TailMatches("USER", "MAPPING")) COMPLETE_WITH("BYPASSRLS", "CONNECTION LIMIT", "CREATEDB", "CREATEROLE", - "ENCRYPTED PASSWORD", "INHERIT", "LOGIN", "NOBYPASSRLS", - "NOCREATEDB", "NOCREATEROLE", "NOINHERIT", + "ENCRYPTED PASSWORD", "IN DATABASE", "INHERIT", "LOGIN", + "NOBYPASSRLS", "NOCREATEDB", "NOCREATEROLE", "NOINHERIT", "NOLOGIN", "NOREPLICATION", "NOSUPERUSER", "PASSWORD", "RENAME TO", "REPLICATION", "RESET", "SET", "SUPERUSER", "VALID UNTIL", "WITH"); + /* ALTER USER,ROLE <name> IN */ + else if (Matches("ALTER", "USER|ROLE", MatchAny, "IN")) + COMPLETE_WITH("DATABASE"); + + /* ALTER USER,ROLE <name> IN DATABASE */ + else if (HeadMatches("ALTER", "USER|ROLE", MatchAny, "IN")) + { + if (TailMatches("DATABASE")) + COMPLETE_WITH_QUERY(Query_for_list_of_databases); + + else if (TailMatches("DATABASE", MatchAny)) + COMPLETE_WITH("SET", "RESET"); + + else if (TailMatches("DATABASE", MatchAny, "SET")) + COMPLETE_WITH_QUERY(Query_for_list_of_set_vars); + + else if (TailMatches("DATABASE", MatchAny, "RESET")) + { + set_completion_reference(prev5_wd); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_user_vars, "ALL"); + } + } /* ALTER USER,ROLE <name> RESET */ else if (Matches("ALTER", "USER|ROLE", MatchAny, "RESET")) { base-commit: 266543a62055541ddefe4e66797e0e1e4aa8705a -- 2.43.0
