| From: | Kirill Reshke <reshkekirill(at)gmail(dot)com> |
|---|---|
| To: | shihao zhong <zhong950419(at)gmail(dot)com> |
| Cc: | pgsql-hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, dean(dot)a(dot)rasheed(at)gmail(dot)com, v(at)viktorh(dot)net, andreas(at)proxel(dot)se, jian he <jian(dot)universality(at)gmail(dot)com> |
| Subject: | Re: ON CONFLICT DO SELECT returns rows hidden by a view |
| Date: | 2026-09-25 10:48:37 |
| Message-ID: | CALdSSPgy+e5b8q45VRzHr5E00u8nFuDaYn7G_nWBQAVseviRAA@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Fri, 25 Sept 2026 at 09:45, shihao zhong <zhong950419(at)gmail(dot)com> wrote:
>
> Hi hackers,
>
> In 19, a user with only INSERT and SELECT on a security_barrier view can
> read rows that the view hides, with ON CONFLICT DO SELECT. Before 19 that
> user had no way to reach a hidden row, because DO UPDATE needs UPDATE.
>
> create view my_log with (security_barrier) as
> select * from documents where owner = current_user;
> grant select, insert on my_log to alice;
>
> -- as alice, row 1 belongs to bob
> insert into my_log (id, title) values (1, '')
> on conflict (id) do select returning *;
> id | owner | title | body
> ----+-------+---------------+----------------------
> 1 | bob | salary review | bob 180k, alice 120k
>
> With generate_series as the source and a rollback at the end, this reads
> the whole table. WITH CHECK OPTION does not help, since nothing is
> written. RLS is not affected, ExecOnConflictSelect() checks the existing
> row against the SELECT policies.
>
> The docs have the pieces. insert.sgml says DO SELECT needs only SELECT,
> and create_view.sgml says it "may similarly affect an existing row not
> visible through the view". They do not say that the row is returned, and
> the security_barrier section in rules.sgml does not mention ON CONFLICT
> at all. The create_view.sgml sentence was added as a doc fix during
> review [1], and I could not find any discussion of the new exposure for
> users without UPDATE.
>
> I see two ways to go. Keep the behavior and say it plainly in the
> security_barrier docs. Or check the existing row against the
> view's quals in DO SELECT, the same way RLS does, and raise an error when
> the row is hidden. I have a draft patch for the second, for views with a
> check option.
>
> Which way do people prefer? If it is the second, should it be a 19 open
> item?
>
> [1] https://postgr.es/m/d631b406-13b7-433e-8c0b-c6040c4b4663@Spark
>
> Regards,
> Shihao Zhong
I think that retrieving rows that configured to be unretrievable (in
< v19) is a regression and this needs both fix and being listed as
Open Item
--
Best regards,
Kirill Reshke
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Ashutosh Bapat | 2026-09-25 10:57:38 | Re: [PATCH] Two remaining shmem attachment issues in single-user mode |
| Previous Message | Thom Brown | 2026-09-25 10:40:01 | Re: REPACK (CONCURRENTLY) can silently lose updates when the toast table is rewritten |