agora inbox for pgsql-committers@postgresql.org  
help / color / mirror / Atom feed
From: Amit Langote <amitlan@postgresql.org>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Remove batching from RI fast-path checks
Date: Thu, 10 Sep 2026 05:46:01 +0000
Message-ID: <E1x4Xbk-00000004FD2-32Wt@gemulon.postgresql.org> (raw)

Remove batching from RI fast-path checks

Commit b7b27eb41a5 added batching to the direct-index fast path for
foreign key checks introduced by 2da86c1ef9b. Instead of probing the
referenced index once per row, it accumulated referencing rows and
checked them in groups, using SK_SEARCHARRAY for single-column foreign
keys.

The batching requires state to survive across trigger invocations and
to be flushed at the end of each trigger-firing cycle. Follow-up work
has had to define how that state interacts with nested trigger firing,
subtransactions, deferred constraints, and SET CONSTRAINTS.

Failure to handle one of those cases can leave a buffered check
unperformed, allowing a transaction to commit a permanent foreign key
violation without reporting an error. With PostgreSQL 19 close to
release, there is not enough time to gain confidence that all relevant
trigger and transaction states have been covered.

Remove the batching and its after-trigger callback infrastructure,
including the per-batch RI cache and associated subtransaction cleanup.
Restore the early exit in AfterTriggerFireDeferred(), since batch
callbacks can no longer queue additional deferred triggers after
afterTriggerInvokeEvents() returns.

Remove tests that exercise only the batching implementation and its
callback and cache lifetime machinery. Retain tests that continue to
exercise the underlying per-row fast path, including validation,
scan-key construction, cross-type rechecks, deferred checks, and
metadata invalidation.

Keep the underlying per-row fast path. It performs each check
synchronously and retains no pending checks across trigger invocations.
Also retain the fixes made to the per-row probe path, including support
for domain-typed referencing columns, restriction to btree referenced
indexes, concurrent index replacement, metadata invalidation, and
nullable referenced keys.

This removal applies only to REL_19_STABLE.

Discussion: https://postgr.es/m/CA+HiwqEDcCSDoYTtoXH4Ta_BpGN+revMZSLLj6GRz2_5ybwE1g@mail.gmail.com

Branch
------
REL_19_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/25649d6e791c2d803fff0ce8b69ed968028a5edc

Modified Files
--------------
.git-blame-ignore-revs                             |   3 -
doc/src/sgml/release-19.sgml                       |   4 -
src/backend/access/transam/xact.c                  |   2 -
src/backend/commands/trigger.c                     | 206 +----
src/backend/utils/adt/ri_triggers.c                | 937 +--------------------
src/include/commands/trigger.h                     |  24 -
src/test/isolation/isolation_schedule              |   2 +-
.../specs/ri_fastpath_reindex.spec                 |  12 +-
src/test/regress/expected/foreign_key.out          | 347 +-------
src/test/regress/expected/triggers.out             |  24 -
src/test/regress/sql/foreign_key.sql               | 305 +------
src/test/regress/sql/triggers.sql                  |  23 -
src/tools/pgindent/typedefs.list                   |   4 -
13 files changed, 128 insertions(+), 1765 deletions(-)



Message-ID: <E1x4Xbk-00000004FD2-32Wt@gemulon.postgresql.org>
Permalink:  ../E1x4Xbk-00000004FD2-32Wt@gemulon.postgresql.org/
Also on:    postgresql.org/message-id/E1x4Xbk-00000004FD2-32Wt@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: amitlan@postgresql.org, pgsql-committers@lists.postgresql.org
  Subject: Re: pgsql: Remove batching from RI fast-path checks
  In-Reply-To: <E1x4Xbk-00000004FD2-32Wt@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 agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox