pg.ddx.io  pgsql-committers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Dean Rasheed <dean.a.rasheed@gmail.com>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Fix handling of self-modified tuples in MERGE.
Date: Thu, 07 Mar 2024 09:59:22 +0000
Message-ID: <E1riAX3-002X4d-Oa@gemulon.postgresql.org> (raw)

Fix handling of self-modified tuples in MERGE.

When an UPDATE or DELETE action in MERGE returns TM_SelfModified,
there are 2 possible causes:

1). The target tuple was already updated or deleted by the current
    command. This can happen if the target row joins to more than one
    source row, and the SQL standard explicitly says that this must be
    an error.

2). The target tuple was already updated or deleted by a later command
    in the current transaction. This can happen if the tuple is
    modified by a BEFORE trigger or a volatile function used in the
    query, and should be an error for the same reason that it is in a
    plain UPDATE or DELETE command.

In MERGE's primary error handling block, it failed to check for (2),
causing it to return a misleading error message in such cases.

In the secondary error handling block, following a concurrent update
from another session, it failed to check for (1), causing it to
silently ignore target rows joined to more than one source row,
instead of reporting an error.

Fix this, and add tests for both of these cases.

Per report from Wenjiang Zhang. Back-patch to v15, where MERGE was
introduced.

Discussion: https://postgr.es/m/tencent_41DE0FF443FE14B94A5898D373792109E408%40qq.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/29ef1dd19b4f3eb54569b2eece4a8a65034a2216

Modified Files
--------------
src/backend/executor/nodeModifyTable.c       | 46 +++++++++++++++++++++++-----
src/test/isolation/expected/merge-update.out | 43 ++++++++++++++++++++++++++
src/test/isolation/specs/merge-update.spec   | 13 ++++++++
src/test/regress/expected/triggers.out       |  8 +++++
src/test/regress/sql/triggers.sql            |  4 +++
5 files changed, 106 insertions(+), 8 deletions(-)



view thread (4+ messages)  latest in thread

Message-ID: <E1riAX3-002X4d-Oa@gemulon.postgresql.org>
Permalink:  ../E1riAX3-002X4d-Oa@gemulon.postgresql.org/
Also on:    postgresql.org/message-id/E1riAX3-002X4d-Oa@gemulon.postgresql.org

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-committers@postgresql.org
  Cc: dean.a.rasheed@gmail.com, pgsql-committers@lists.postgresql.org
  Subject: Re: pgsql: Fix handling of self-modified tuples in MERGE.
  In-Reply-To: <E1riAX3-002X4d-Oa@gemulon.postgresql.org>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox