pgsql: Fix MakeTransitionCaptureState() to return a consistent result - Mailing list pgsql-committers

From Michael Paquier
Subject pgsql: Fix MakeTransitionCaptureState() to return a consistent result
Date
Msg-id E1tiThN-006s4L-0k@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Fix MakeTransitionCaptureState() to return a consistent result

When an UPDATE trigger referencing a new table and a DELETE trigger
referencing an old table are both present, MakeTransitionCaptureState()
returns an inconsistent result for UPDATE commands in its set of flags
and tuplestores holding the TransitionCaptureState for transition
tables.

As proved by the test added here, this issue causes a crash in v14 and
earlier versions (down to 11, actually, older versions do not support
triggers on partitioned tables) during cross-partition updates on a
partitioned table.  v15 and newer versions are safe thanks to
7103ebb7aae8.

This commit fixes the function so that it returns a consistent state
by using portions of the changes made in commit 7103ebb7aae8 for v13 and
v14.  v15 and newer versions are slightly tweaked to match with the
older versions, mainly for consistency across branches.

Author: Kyotaro Horiguchi
Discussion: https://postgr.es/m/20250207.150238.968446820828052276.horikyota.ntt@gmail.com
Backpatch-through: 13

Branch
------
REL_16_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/139beb0355c2a3c96df8c629a424eb38cba238b5

Modified Files
--------------
src/backend/commands/trigger.c         |  8 +++---
src/test/regress/expected/triggers.out | 49 ++++++++++++++++++++++++++++++++++
src/test/regress/sql/triggers.sql      | 46 +++++++++++++++++++++++++++++++
3 files changed, 99 insertions(+), 4 deletions(-)


pgsql-committers by date:

Previous
From: Masahiko Sawada
Date:
Subject: pgsql: Rename RBTXN_PREPARE to RBTXN_IS_PREPARE for better clarificatio
Next
From: Peter Eisentraut
Date:
Subject: pgsql: XLogRegisterData, XLogRegisterBufData void * argument for binary