Re: Simplify code building the LR conflict messages - Mailing list pgsql-hackers

From Amit Kapila
Subject Re: Simplify code building the LR conflict messages
Date
Msg-id CAA4eK1+e07k7GVqCL7WEWpzXGmcs_d5iU20ebGet9GNGi0MUVQ@mail.gmail.com
Whole thread Raw
In response to Re: Simplify code building the LR conflict messages  (Amit Kapila <amit.kapila16@gmail.com>)
Responses Re: Simplify code building the LR conflict messages
List pgsql-hackers
On Fri, Jan 16, 2026 at 9:16 AM Amit Kapila <amit.kapila16@gmail.com> wrote:
>
> On Wed, Jan 14, 2026 at 5:01 PM Hayato Kuroda (Fujitsu)
> <kuroda.hayato@fujitsu.com> wrote:
> >
> > In below I want to show some examples.
> >
> > Case 1: multiple_unique_conflicts with UPDATE
> > HEAD:
> > DETAIL:  Key already exists in unique index "foo_pkey", modified locally in transaction 789 at ...
> >         Key (a)=(6); existing local row (6, 6, 6); remote row (6, 7, 8); replica identity (a)=(5).
> >         Key already exists in unique index "foo_b_key", modified locally in transaction 789 at ...
> >         Key (b)=(7); existing local row (7, 7, 7); remote row (6, 7, 8); replica identity (a)=(5).
> >         Key already exists in unique index "foo_c_key", modified locally in transaction 789 at ...
> >         Key (c)=(8); existing local row (8, 8, 8); remote row (6, 7, 8); replica identity (a)=(5).
> >
> > V1:
> > DETAIL:  Could not apply remote row (6, 7, 8) by using replica identity (a)=(5).
> >         Key (a)=(6) already exists in unique index "foo_pkey", modified locally in transaction 790 at ...: local
row(6, 6, 6). 
> >         Key (b)=(7) already exists in unique index "foo_b_key", modified locally in transaction 790 at ...: local
row(7, 7, 7). 
> >         Key (c)=(8) already exists in unique index "foo_c_key", modified locally in transaction 790 at ...: local
row(8, 8, 8). 
> >
> > V2:
> > DETAIL:  Could not apply remote change by using replica identity (a)=(5): remote row (6, 7, 8).
> >         Key (a)=(6) already exists in unique index "foo_pkey", modified locally in transaction 788 at ...: local
row(6, 6, 6). 
> >         Key (b)=(7) already exists in unique index "foo_b_key", modified locally in transaction 788 at ...: local
row(7, 7, 7). 
> >         Key (c)=(8) already exists in unique index "foo_c_key", modified locally in transaction 788 at ...: local
row(8, 8, 8). 
> >
>
> V2 looks better as in V1, if the length of the remote row is large
> then it would be inconvenient to read.
>
> > Case 2: update_origin_differs
> > HEAD:
> > DETAIL:  Updating the row that was modified locally in transaction 790 at ...
> >         Existing local row (5, 5, 5); remote row (6, 7, 8); replica identity (a)=(5).
> >
> > V1:
> > DETAIL:  Remote row (6, 7, 8) was applied but previously modified by different origin.
> >         Local row (5, 5, 5) detected by replica identity (a)=(5) is being updated, but it was previously modified
locallyin transaction 790 at .... 
> >
> > V2:
> > DETAIL:  Updating the row that was modified locally in transaction 790 at ...: local row (5, 5, 5), remote row (6,
7,8), replica identity (a)=(5). 
> >
> > Case 3: delete_origin_differs with huge column
> > HEAD:
> > DETAIL:  Deleting the row that was modified locally in transaction 795 at ...
> >         Existing local row (1, testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttest...); replica
identity(id)=(1). 
> >
> > V1:
> > DETAIL:  Local row (1, testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttest...) detected by replica
identity(id)=(1) is being deleted, but it was previously modified locally in transaction 797 at .... 
> >
> > V2:
> > DETAIL:  Deleting the row that was modified locally in transaction 807 at ...: local row (1,
testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttest...),replica identity (id)=(1). 
> >
>
> In V2 for case-2 and case-3, it seems you only removed 'Existing'
> before the local row, is that correct?
>
> > Case 4: update_deleted
> > HEAD:
> > DETAIL:  The row to be updated was deleted locally in transaction 789 at ...
> >         Remote row (6, 7, 8); replica identity (a)=(5).
> >
> > V1:
> > DETAIL:  Could not find remote row (6, 7, 8) by using replica identity (a)=(5).
> >         Local row was previously deleted locally in transaction 795 at ....
> >
> > V2:
> > DETAIL:  Could not find the row by using replica identity (a)=(5): remote row (6, 7, 8).
> >         The row to be updated was deleted locally in transaction 789 at ....
> >
>
> V2 looks better because of the same reason as for case-1.
>
> You haven't shared the details for update/delete_missing and
> insert/update_exists. Is it because they haven't changed or something
> else?
>

One more point:
HEAD: conflict detected on relation "public.tab_full_pk":
conflict=update_missing
PATCH: conflict update_missing detected on relation "public.tab_full_pk"

I am not very sure whether all users like the change of moving
conflict_type to earlier in the message string even though it appears
better. I think it will be easier for scripts to grep what we have in
HEAD. Can we at least move it to a second patch so that we can discuss
it separately once the DETAIL messages are fixed.

BTW, the patch should update the docs [1] to reflect the changes.

[1] - https://www.postgresql.org/docs/devel/logical-replication-conflicts.html

--
With Regards,
Amit Kapila.



pgsql-hackers by date:

Previous
From: 洪伊
Date:
Subject: Re: [PATCH] pl: fix can not build free-thread for plpython extension like 3.14t
Next
From: Tom Lane
Date:
Subject: Re: [PATCH] pl: fix can not build free-thread for plpython extension like 3.14t