Re: Mystery with REVOKE PRIVILEGE

From: Konstantin Knizhnik <knizhnik(at)garret(dot)ru>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: Mystery with REVOKE PRIVILEGE
Date: 2026-01-20 20:45:44
Message-ID: e0d4cfd8-f488-4683-950d-df79c03074db@garret.ru
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers


> On 20/01/2026 9:26 PM, Tom Lane wrote:
>> Konstantin Knizhnik <knizhnik(at)garret(dot)ru> writes:
>>> I found some very confusing behaviour of REVOKE PRIVILEGE.
>>> ...
>>> where <ADMIN_ROLE> is any role with admin permissions under which you
>>> logged in.
>> "admin permissions" is not well-defined terminology in Postgres.
>> I thought perhaps you meant "superuser", but some experimentation
>> indicates that that role doesn't need any special permissions, it
>> only has to be the table owner to produce the strange behavior.
>>
>>> So granted read privilege was not revoked.
>> This seems like it may be a consequence of this statement in
>> the REVOKE man page:
>>
>> If the role executing REVOKE holds privileges indirectly via more
>> than one role membership path, it is unspecified which containing
>> role will be used to perform the command. In such cases it is best
>> practice to use SET ROLE to become the specific role you want to
>> do the REVOKE as. Failure to do so might lead to revoking
>> privileges other than the ones you intended, or not revoking
>> anything at all.
>>
>> In this example, "somebody" is a member of the table owner role
>> as well as having some privilege granted directly, so the ambiguity
>> does exist. I didn't dig further than that. It does seem sad
>> if we fail to revoke a privilege that is an exact match, though.
>>
>> regards, tom lane

> The problem really seems to be in `select_best_grantor` - it choose
> "wrong" grantor.
> It seems to be the bug because as a result of this operation no
> privilege is revoked at all (because then `merge_acl_with_grant` found
> no match).
> I wonder if `select_best_grantor` should always prefer exact match?

I mean something like this (see attached patch).

Attachment Content-Type Size
select_best_grantor.patch text/plain 1.1 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Corey Huinker 2026-01-20 20:48:01 Re: Extended Statistics set/restore/clear functions.
Previous Message Peter Geoghegan 2026-01-20 20:41:52 Re: index prefetching