pgsql: Fix COMMIT/ROLLBACK AND CHAIN in the presence of subtransactions

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix COMMIT/ROLLBACK AND CHAIN in the presence of subtransactions
Date: 2023-09-22 03:12:00
Message-ID: E1qjWaF-005EQI-VB@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix COMMIT/ROLLBACK AND CHAIN in the presence of subtransactions.

In older branches, COMMIT/ROLLBACK AND CHAIN failed to propagate
the current transaction's properties to the new transaction if
there was any open subtransaction (unreleased savepoint).
Instead, some previous transaction's properties would be restored.
This is because the "if (s->chain)" check in CommitTransactionCommand
examined the wrong instance of the "chain" flag and falsely
concluded that it didn't need to save transaction properties.

Our regression tests would have noticed this, except they used
identical transaction properties for multiple tests in a row,
so that the faulty behavior was not distinguishable from correct
behavior.

Commit 12d768e70 fixed the problem in v15 and later, but only rather
accidentally, because I removed the "if (s->chain)" test to avoid a
compiler warning, while not realizing that the warning was flagging a
real bug.

In v14 and before, remove the if-test and save transaction properties
unconditionally; just as in the newer branches, that's not expensive
enough to justify thinking harder.

Add the comment and extra regression test to v15 and later to
forestall any future recurrence, but there's no live bug in those
branches.

Patch by me, per bug #18118 from Liu Xiang. Back-patch to v12 where
the AND CHAIN feature was added.

Discussion: https://postgr.es/m/18118-4b72fcbb903aace6@postgresql.org

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/48e2b234f822ea1610826be4526bb56ca4734dbe

Modified Files
--------------
src/backend/access/transam/xact.c | 1 +
src/test/regress/expected/transactions.out | 40 ++++++++++++++++++++++++++++++
src/test/regress/sql/transactions.sql | 11 ++++++++
3 files changed, 52 insertions(+)

Browse pgsql-committers by date

  From Date Subject
Next Message Peter Eisentraut 2023-09-22 05:59:22 pgsql: Simplify information schema check constraint deparsing
Previous Message Bruce Momjian 2023-09-21 15:27:55 pgsql: doc: PG 16 relnotes: improve wording of promote_trigger item