| From: | Amit Kapila <amit(dot)kapila16(at)gmail(dot)com> |
|---|---|
| To: | "Zhijie Hou (Fujitsu)" <houzj(dot)fnst(at)fujitsu(dot)com> |
| Cc: | "Hayato Kuroda (Fujitsu)" <kuroda(dot)hayato(at)fujitsu(dot)com>, Shinya Kato <shinya11(dot)kato(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
| Subject: | Re: Logical replication row filter loses unchanged toasted columns |
| Date: | 2026-08-13 11:38:47 |
| Message-ID: | CAA4eK1JqUQQOKHaC8+gsFZq-W_yb6rhG__ruHozFTx9AApvgAQ@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
On Thu, Aug 13, 2026 at 11:12 AM Zhijie Hou (Fujitsu)
<houzj(dot)fnst(at)fujitsu(dot)com> wrote:
>
> I feel catching such an unchanged toasted column issue during INSERT in the
> apply worker could be better. The apply worker provides native context about the
> transaction and the action being replayed, making the error easier to diagnose.
> Erroring in the apply worker also gives users more flexibility to resolve the
> issue, for example, they could define a temporary trigger on the target table to
> skip the conflict or fill in the toasted value manually (after querying it from
> the publisher), or skip the whole transaction using ALTER SUB SKIP, or disable
> the subscription for now and analyze the issue and resolve later.
>
Sounds like a reasonable approach to fix the problem.
> I also thought of reporting ERROR during DML, like putting this in
> CheckCmdReplicaIdentity, but we can't tell at that point whether the tuple
> being updated has a toasted column. And we also could not simply error out in
> CheckCmdReplicaIdentity for any column that could be toasted, because lots of
> columns types (text, varchar ...) is default with EXTENDED storage that can
> potentially be toasted, so that would be too broad.
>
> The only feasible place for DML error is at a lower level, like heap_update,
> where we can error out if an unchanged toasted column (that is not part of the
> replica identity) is being updated on a table published with a row filter.
> However, this might overkill in cases where the row filter would not convert the
> update to an INSERT, and I'm not sure we want to evaluate the row filter
> expression during DML to do more detailed check. So I think it's not a great
> idea to do it in DML.
>
> Beyond this specific row filter issue, I'm thinking about a more general
> problem: when an unchanged toasted column is not logged in the new tuple, the
> subscriber cannot perform proper conflict resolution. For example, if an update
> hits an update_exists conflict and the user wants to keep the remote change
> (converting the UPDATE to an INSERT), without the unchanged toasted value, the
> resolution lacks the data needed for the INSERT. I think we may need to support
> logging additional columns beyond the replica identity in the future to address
> this.
>
> BTW, other CDC solutions also suffer from the lack of unchanged toasted
> columns - I've seen several blogs mention this as a limitation [1][2].
>
> So, I think after applying the fix to report an ERROR, it would be worth
> implementing an additional WAL logging feature on top of it, allowing users to specify
> which columns should be logged in WAL for logical decoding and replication. I
> can see several use cases for this: 1) Allowing users to add non-RI columns to
> publication row filter expressions. 2) Helping with conflict resolution. 3)
> Giving subscriber replication workers more column data for analysis, such as
> detecting whether two transactions modify the same subscriber-only unique index
> and enabling parallel apply if not. 4) Making it easier for other CDC solutions
> to handle missing values.
>
The only way to support these currently is to use REPLICA IDENTITY
FULL which could be costly. One idea is to have INCLUDE-like syntax
similar to what we have for CREATE INDEX to include columns for WAL
logging unchanged toast columns. However, we can do that as a
HEAD-only improvement in a separate thread.
--
With Regards,
Amit Kapila.
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Ashutosh Bapat | 2026-08-13 12:01:50 | Re: Limit GRAPH_TABLE path combinations to prevent memory exhaustion |
| Previous Message | Dilip Kumar | 2026-08-13 11:28:05 | Re: [PATCH] Add RetrieveInstrumentation hook for CustomScan providers |