From 9fd26a4c04494f2392e18c886b97bb63fc60798e Mon Sep 17 00:00:00 2001 From: Robins Tharakan Date: Sat, 15 Feb 2025 21:09:17 +1030 Subject: [PATCH 1/2] Add tab completion for ALTER DATABASE RESET Currently tab completion for ALTER DATABASE RESET shows a list of all vars that could be set on a database, which is only partially helpful. This patch allows tab completion to see which vars are currently set for the database and only show those options. --- src/bin/psql/tab-complete.in.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c index a9a81ab3c146..18fecd328071 100644 --- a/src/bin/psql/tab-complete.in.c +++ b/src/bin/psql/tab-complete.in.c @@ -1000,6 +1000,15 @@ static const SchemaQuery Query_for_trigger_of_table = { "SELECT datname FROM pg_catalog.pg_database "\ " WHERE datname LIKE '%s'" +#define Query_for_list_of_database_vars \ +"SELECT conf FROM ("\ +" SELECT setdatabase, pg_catalog.split_part(unnest(setconfig),'=',1) conf"\ +" FROM pg_db_role_setting "\ +" ) s, pg_database d "\ +" WHERE s.setdatabase = d.oid "\ +" AND conf LIKE '%s'"\ +" AND d.datname LIKE '%s'" + #define Query_for_list_of_tablespaces \ "SELECT spcname FROM pg_catalog.pg_tablespace "\ " WHERE spcname LIKE '%s'" @@ -2320,6 +2329,13 @@ match_previous_words(int pattern_id, "IS_TEMPLATE", "ALLOW_CONNECTIONS", "CONNECTION LIMIT"); + /* ALTER DATABASE RESET */ + else if (Matches("ALTER", "DATABASE", MatchAny, "RESET")) + { + set_completion_reference(prev2_wd); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_database_vars, "ALL"); + } + /* ALTER DATABASE SET TABLESPACE */ else if (Matches("ALTER", "DATABASE", MatchAny, "SET", "TABLESPACE")) COMPLETE_WITH_QUERY(Query_for_list_of_tablespaces); @@ -4906,7 +4922,9 @@ match_previous_words(int pattern_id, /* SET, RESET, SHOW */ /* Complete with a variable name */ - else if (TailMatches("SET|RESET") && !TailMatches("UPDATE", MatchAny, "SET")) + else if (TailMatches("SET|RESET") && + !TailMatches("UPDATE", MatchAny, "SET") && + !TailMatches("ALTER", "DATABASE", MatchAny, "RESET")) COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars, "CONSTRAINTS", "TRANSACTION", From 6fe04030efdc6ed8450434d3e35a5af440f7d5a9 Mon Sep 17 00:00:00 2001 From: Robins Tharakan Date: Fri, 29 Nov 2024 19:05:38 +1030 Subject: [PATCH 2/2] Add tab completion for ALTER USER RESET --- src/bin/psql/tab-complete.in.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/bin/psql/tab-complete.in.c b/src/bin/psql/tab-complete.in.c index 18fecd328071..eb8bc1287202 100644 --- a/src/bin/psql/tab-complete.in.c +++ b/src/bin/psql/tab-complete.in.c @@ -1077,6 +1077,11 @@ Keywords_for_list_of_owner_roles, "PUBLIC" " FROM pg_catalog.pg_user_mappings "\ " WHERE usename LIKE '%s'" +#define Query_for_list_of_user_vars \ +" SELECT pg_catalog.split_part(pg_catalog.unnest(rolconfig),'=',1) "\ +" FROM pg_catalog.pg_roles "\ +" WHERE rolname LIKE '%s'" + #define Query_for_list_of_access_methods \ " SELECT amname "\ " FROM pg_catalog.pg_am "\ @@ -2487,6 +2492,10 @@ match_previous_words(int pattern_id, "RENAME TO", "REPLICATION", "RESET", "SET", "SUPERUSER", "VALID UNTIL", "WITH"); + /* ALTER USER,ROLE RESET */ + else if (Matches("ALTER", "USER|ROLE", MatchAny, "RESET")) + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_user_vars, "ALL"); + /* ALTER USER,ROLE WITH */ else if (Matches("ALTER", "USER|ROLE", MatchAny, "WITH")) /* Similar to the above, but don't complete "WITH" again. */