1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-11 04:22:52 +03:00

Fix tab completion for ALTER ROLE|USER ... RESET

Commit c407d5426b added tab completion for ALTER ROLE|USER ... RESET,
with the intent to offer only the variables actually set on the role.
But as soon as the user started typing something, it would start to
offer all possible matching variables.

Fix this the same way ALTER DATABASE ... RESET does it, i.e. by
properly considering the prefix.

A second issue causing similar symptoms (offering variables that are not
actually set for a role) was caused by a match to another pattern. The
ALTER DATABASE ... RESET was already excluded, so do the same thing for
ROLE/USER.

Report and fix by Dagfinn Ilmari Mannsåker. Backpatch to 18, same as
c407d5426b.

Author: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Reviewed-by: jian he <jian.universality@gmail.com>
Discussion: https://postgr.es/m/87qzyghw2x.fsf%40wibble.ilmari.org
Discussion: https://postgr.es/m/87tt4lumqz.fsf%40wibble.ilmari.org
Backpatch-through: 18
This commit is contained in:
Tomas Vondra
2025-07-31 15:17:26 +02:00
parent 72c437f6e4
commit 88914332ea

View File

@@ -1078,9 +1078,12 @@ Keywords_for_list_of_owner_roles, "PUBLIC"
" WHERE usename LIKE '%s'" " WHERE usename LIKE '%s'"
#define Query_for_list_of_user_vars \ #define Query_for_list_of_user_vars \
" SELECT pg_catalog.split_part(pg_catalog.unnest(rolconfig),'=',1) "\ "SELECT conf FROM ("\
" FROM pg_catalog.pg_roles "\ " SELECT rolname, pg_catalog.split_part(pg_catalog.unnest(rolconfig),'=',1) conf"\
" WHERE rolname LIKE '%s'" " FROM pg_catalog.pg_roles"\
" ) s"\
" WHERE s.conf like '%s' "\
" AND s.rolname LIKE '%s'"
#define Query_for_list_of_access_methods \ #define Query_for_list_of_access_methods \
" SELECT amname "\ " SELECT amname "\
@@ -2508,7 +2511,10 @@ match_previous_words(int pattern_id,
/* ALTER USER,ROLE <name> RESET */ /* ALTER USER,ROLE <name> RESET */
else if (Matches("ALTER", "USER|ROLE", MatchAny, "RESET")) else if (Matches("ALTER", "USER|ROLE", MatchAny, "RESET"))
{
set_completion_reference(prev2_wd);
COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_user_vars, "ALL"); COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_user_vars, "ALL");
}
/* ALTER USER,ROLE <name> WITH */ /* ALTER USER,ROLE <name> WITH */
else if (Matches("ALTER", "USER|ROLE", MatchAny, "WITH")) else if (Matches("ALTER", "USER|ROLE", MatchAny, "WITH"))
@@ -4958,7 +4964,7 @@ match_previous_words(int pattern_id,
/* Complete with a variable name */ /* Complete with a variable name */
else if (TailMatches("SET|RESET") && else if (TailMatches("SET|RESET") &&
!TailMatches("UPDATE", MatchAny, "SET") && !TailMatches("UPDATE", MatchAny, "SET") &&
!TailMatches("ALTER", "DATABASE", MatchAny, "RESET")) !TailMatches("ALTER", "DATABASE|USER|ROLE", MatchAny, "RESET"))
COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars, COMPLETE_WITH_QUERY_VERBATIM_PLUS(Query_for_list_of_set_vars,
"CONSTRAINTS", "CONSTRAINTS",
"TRANSACTION", "TRANSACTION",