On Mon, Apr 20, 2026 at 2:25 PM Richard Guo <guofenglinux@gmail.com> wrote:
> Yeah, this is a better approach. The change looks good to me.
>
> A nitpick: For the comment "The generated column expressions typically
> refer to new.attribute ...", maybe we can remove "typically", as
> generation expressions always refer to columns of the same relation.
I noticed a couple of issues after a further look.
1. The ReplaceVarsFromTargetList call on "gen_cols" fails to handle
hasSubLinks. This can cause error if targetList contains SubLinks:
update t set a = (select max(a) from t);
ERROR: replace_rte_variables inserted a SubLink, but has noplace to record it
2. The same bug fixed in this patch also exists in rule quals:
create table t (a int, b int generated always as (a *2));
insert into t values (1);
create rule rule_qual as on update to t where new.b > 100
do instead nothing;
update t set a = 100;
select * from t;
a | b
-----+-----
100 | 200
(1 row)
I think we should apply the same fix to CopyAndAddInvertedQual.
Attached v3 fixes them.
- Richard