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

Reply via email to