| From: | Peter Eisentraut <peter(at)eisentraut(dot)org> |
|---|---|
| To: | pgsql-committers(at)lists(dot)postgresql(dot)org |
| Subject: | pgsql: Fix RLS checks for FOR PORTION OF leftover rows |
| Date: | 2026-07-20 06:50:52 |
| Message-ID: | E1wlhq0-000EN9-2U@gemulon.postgresql.org |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-committers |
Fix RLS checks for FOR PORTION OF leftover rows
UPDATE/DELETE FOR PORTION OF may insert leftover rows to preserve the
parts of the old row that are outside the target range. Those inserts
go through ExecInsert(), which checks RLS policies using
WCO_RLS_INSERT_CHECK.
However, the rewriter only added RLS WITH CHECK options for the
original statement command. For UPDATE, that meant only
WCO_RLS_UPDATE_CHECK options were available, so ExecInsert() skipped
them. For DELETE, no RLS WITH CHECK options were added at all. As a
result, leftover rows could be inserted even when they violated INSERT
RLS policies.
Fix this by adding INSERT RLS WITH CHECK options for UPDATE/DELETE FOR
PORTION OF target relations. Also add regression coverage for both
UPDATE and DELETE, including cases where allowed leftovers still
succeed and disallowed leftovers are rejected.
Author: Chao Li <lic(at)highgo(dot)com>
Co-authored-by: Paul A Jungwirth <pj(at)illuminatedcomputing(dot)com>
Reviewed-by: Paul A Jungwirth <pj(at)illuminatedcomputing(dot)com>
Reviewed-by: Ayush Tiwari <ayushtiwari(dot)slg01(at)gmail(dot)com>
Reviewed-by: Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>
Discussion: https://www.postgresql.org/message-id/flat/6C34A987-AC50-4477-BD71-2D4AFEE1A589%40gmail.com
Discussion: https://www.postgresql.org/message-id/flat/CAJTYsWWdeBkoH5g8D-k9LDw9ciqsMxb21EJSiFXAzP4J%3DXyxOQ%40mail.gmail.com
Branch
------
master
Details
-------
https://git.postgresql.org/pg/commitdiff/20fe90bbb93df755e00dc88ace5988fda0b1d7d3
Modified Files
--------------
doc/src/sgml/ref/create_policy.sgml | 32 ++++++++++++
doc/src/sgml/ref/delete.sgml | 3 +-
doc/src/sgml/ref/update.sgml | 3 +-
src/backend/rewrite/rowsecurity.c | 25 ++++++++++
src/test/regress/expected/for_portion_of.out | 75 ++++++++++++++++++++++++++++
src/test/regress/expected/rowsecurity.out | 39 ++++++++++++++-
src/test/regress/sql/for_portion_of.sql | 58 +++++++++++++++++++++
src/test/regress/sql/rowsecurity.sql | 33 +++++++++++-
8 files changed, 264 insertions(+), 4 deletions(-)
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Michael Paquier | 2026-07-20 06:52:32 | pgsql: Improve pgstat_get_entry_ref_cached() behavior on out-of-memory |
| Previous Message | Amit Kapila | 2026-07-20 05:51:42 | pgsql: Handle concurrent sequence refreshes. |