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_5ybw...@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(-)
