agora inbox for pgsql-committers@postgresql.org
help / color / mirror / Atom feedFrom: Richard Guo <rguo@postgresql.org>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Fix incorrect NEW references to generated columns in rule rewrit
Date: Tue, 21 Apr 2026 05:36:36 +0000
Message-ID: <E1wF3mm-001xxR-05@gemulon.postgresql.org> (raw)
Fix incorrect NEW references to generated columns in rule rewriting
When a rule action or rule qualification references NEW.col where col
is a generated column (stored or virtual), the rewriter produces
incorrect results.
rewriteTargetListIU removes generated columns from the query's target
list, since stored generated columns are recomputed by the executor
and virtual ones store nothing. However, ReplaceVarsFromTargetList
then cannot find these columns when resolving NEW references during
rule rewriting. For UPDATE, the REPLACEVARS_CHANGE_VARNO fallback
redirects NEW.col to the original target relation, making it read the
pre-update value (same as OLD.col). For INSERT,
REPLACEVARS_SUBSTITUTE_NULL replaces it with NULL. Both are wrong
when the generated column depends on columns being modified.
Fix by building target list entries for generated columns from their
generation expressions, pre-resolving the NEW.attribute references
within those expressions against the query's targetlist, and passing
them together with the query's targetlist to ReplaceVarsFromTargetList.
Back-patch to all supported branches. Virtual generated columns were
added in v18, so the back-patches in pre-v18 branches only handle
stored generated columns.
Reported-by: SATYANARAYANA NARLAPURAM <satyanarlapuram@gmail.com>
Author: Richard Guo <guofenglinux@gmail.com>
Author: Dean Rasheed <dean.a.rasheed@gmail.com>
Reviewed-by: Chao Li <li.evan.chao@gmail.com>
Discussion: https://postgr.es/m/CAHg+QDexGTmCZzx=73gXkY2ZADS6LRhpnU+-8Y_QmrdTS6yUhA@mail.gmail.com
Backpatch-through: 14
Branch
------
REL_18_STABLE
Details
-------
https://git.postgresql.org/pg/commitdiff/e528bfe971900fcd1a74da53931ade4c06eca662
Modified Files
--------------
src/backend/rewrite/rewriteHandler.c | 145 +++++++++++++++++-------
src/test/regress/expected/generated_stored.out | 34 ++++++
src/test/regress/expected/generated_virtual.out | 34 ++++++
src/test/regress/sql/generated_stored.sql | 23 ++++
src/test/regress/sql/generated_virtual.sql | 23 ++++
5 files changed, 221 insertions(+), 38 deletions(-)
view thread (6+ messages) latest in thread
Message-ID: <E1wF3mm-001xxR-05@gemulon.postgresql.org>
Permalink: ../E1wF3mm-001xxR-05@gemulon.postgresql.org/
Also on: postgresql.org/message-id/E1wF3mm-001xxR-05@gemulon.postgresql.org
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-committers@postgresql.org
Cc: rguo@postgresql.org, pgsql-committers@lists.postgresql.org
Subject: Re: pgsql: Fix incorrect NEW references to generated columns in rule rewrit
In-Reply-To: <E1wF3mm-001xxR-05@gemulon.postgresql.org>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox