AfterTriggerFireDeferred() drained its queued events in a loop, then called FireAfterTriggerBatchCallbacks() once after the loop to flush the RI fast-path FK-check batches the fired triggers accumulated. A batch callback runs user-supplied cast or equality functions, whose DML can queue further deferred trigger events. Because the flush ran after the loop had exited, such an event was left in afterTriggers.events with nothing to fire it, since AfterTriggerFireDeferred() is the last drainer at commit. The deferred check was skipped and a row violating the constraint committed. Move the flush inside the loop, after afterTriggerInvokeEvents(), and drop the "all fired" break, so afterTriggerMarkEvents() re-checks after each flush and fires events a flush queued at the correct time. The other FireAfterTriggerBatchCallbacks() callers leave any queued event for the eventual commit-time AfterTriggerFireDeferred(), so only the commit-time firing, which has no later drainer, lost events. Reported-by: Noah Misch <noah@leadboat.com> Reviewed-by: Ayush Tiwari <ayushtiwari.slg01@gmail.com> Discussion: https://postgr.es/m/20260705210533.ee.noahmisch@microsoft.com Backpatch-through: 19
PostgreSQL Database Management System
This directory contains the source code distribution of the PostgreSQL database management system.
PostgreSQL is an advanced object-relational database management system that supports an extended subset of the SQL standard, including transactions, foreign keys, subqueries, triggers, user-defined types and functions. This distribution also contains C language bindings.
Copyright and license information can be found in the file COPYRIGHT.
General documentation about this version of PostgreSQL can be found at https://www.postgresql.org/docs/19/. In particular, information about building PostgreSQL from the source code can be found at https://www.postgresql.org/docs/19/installation.html.
The latest version of this software, and related software, may be obtained at https://www.postgresql.org/download/. For more information look at our web site located at https://www.postgresql.org/.