Re: Bug: Rule actions see wrong values for generated columns (NEW.gen reads OLD value)
Chao Li <li.evan.chao@gmail.com>
From: Chao Li <li.evan.chao@gmail.com>
To: Richard Guo <guofenglinux@gmail.com>
Cc: SATYANARAYANA NARLAPURAM <satyanarlapuram@gmail.com>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>,
Peter Eisentraut <peter@eisentraut.org>
Date: 2026-04-13T07:21:05Z
Lists: pgsql-hackers
> On Apr 13, 2026, at 10:35, Richard Guo <guofenglinux@gmail.com> wrote:
>
> On Mon, Apr 13, 2026 at 10:59 AM SATYANARAYANA NARLAPURAM
> <satyanarlapuram@gmail.com> wrote:
>> NEW.<generated_coulmn> is resolved to the OLD row's value
>> for update or NULL for insert cases in a DO ALSO rule action for
>> generated columns. This bug affects both stored and virtual
>> generated columns. Reporting here to see if this is a known issue
>> with generated columns.
>
> I didn't find related item in open items. This does not seem to be a
> known issue. I think we should fix it anyway.
>
> cc-ing Peter.
>
> - Richard
>
Hi Richard and Satya,
I reproduced the bug following Satya’s procedure and spent some time debugging it.
I think the issue is that rewriteTargetListIU() removes generated columns from the target list, as described by this comment:
```
if (att_tup->attgenerated)
{
/*
* virtual generated column stores a null value; stored generated
* column will be fixed in executor
*/
new_tle = NULL;
}
```
Later, when the rule action is rewritten, ReplaceVarsFromTargetList() cannot find a target list entry for NEW.gen. For UPDATE rules, the missing NEW column is handled with REPLACEVARS_CHANGE_VARNO, so it falls back to referencing the original target relation row, which gives the old value.
One possible fix is to build a new target list that adds generated columns back when there are rules to fire. I tried the solution locally with some quick and dirty code and it seems to fix both stored and virtual generated columns for me.
Do either of you plan to propose a patch for this? If so, please go ahead and I can review it. Otherwise, I can propose a patch in a couple of days.
Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix incorrect NEW references to generated columns in rule rewriting
- 8e39951beac7 14.23 landed
- 7062bd577ec9 15.18 landed
- 07b257189ea4 16.14 landed
- 9d6208939a0a 17.10 landed
- e528bfe97190 18.4 landed
- c6a79be3f3c7 19 (unreleased) landed