| From: | Richard Guo <guofenglinux(at)gmail(dot)com> |
|---|---|
| To: | Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com> |
| Cc: | Chao Li <li(dot)evan(dot)chao(at)gmail(dot)com>, SATYANARAYANA NARLAPURAM <satyanarlapuram(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Peter Eisentraut <peter(at)eisentraut(dot)org> |
| Subject: | Re: Bug: Rule actions see wrong values for generated columns (NEW.gen reads OLD value) |
| Date: | 2026-04-20 05:25:43 |
| Message-ID: | CAMbWs48s9EVTz__xq9s0nAGeh-Z918t4VoGD+pxCXOq0mnc_7Q@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Fri, Apr 17, 2026 at 7:35 PM Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com> wrote:
> I don't quite buy the argument that the rule action is typically
> small. We have no idea how big it might be. Note that, at that point
> in the code, sub_action is the combination of both the original query
> and the rule action.
>
> I do accept though that rules are not widely used, and that it's not
> worth optimising too much, if it means a lot of extra complexity.
> However, IMO, it is slightly simpler and neater to put the expanded
> generated columns in the replacement list used by
> ReplaceVarsFromTargetList() on sub_action.
Fair point.
> In the attached v2 patch, I've done that by refactoring
> expand_generated_columns_internal(), renaming it to
> get_generated_columns(), and making it just return the list of
> generated column expressions, rather than doing the rewrite -- I never
> particularly liked the separation of concerns between
> expand_generated_columns_internal() and
> expand_generated_columns_in_expr(), especially after the rest of the
> code expanding virtual generated columns was moved out of the
> rewriter, so that expand_generated_columns_in_expr() became the only
> caller of expand_generated_columns_internal(). Doing this simplifies
> the function, since it's no longer necessary to pass it node, rte, and
> result_relation.
>
> With that change, all rewriteRuleAction() needs to do is get the
> generated columns, rewrite any new.attribute references in them, and
> then use that list plus the original target list as the replacement
> list when rewriting sub_action.
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.
- Richard
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Amit Kapila | 2026-04-20 05:45:02 | Re: DOCS - CREATE PUBLICATION ... EXCEPT missing details on ONLY |
| Previous Message | Amul Sul | 2026-04-20 05:06:21 | Cleanup: Replace sscanf with strtol/strtoul in snapmgr |