Fire non-deferred AFTER triggers immediately upon query completion,
Tom Lane <tgl@sss.pgh.pa.us>
Fire non-deferred AFTER triggers immediately upon query completion, rather than when returning to the idle loop. This makes no particular difference for interactively-issued queries, but it makes a big difference for queries issued within functions: trigger execution now occurs before the calling function is allowed to proceed. This responds to numerous complaints about nonintuitive behavior of foreign key checking, such as http://archives.postgresql.org/pgsql-bugs/2004-09/msg00020.php, and appears to be required by the SQL99 spec. Also take the opportunity to simplify the data structures used for the pending-trigger list, rename them for more clarity, and squeeze out a bit of space.
Files
| Path | Change | +/− |
|---|---|---|
| doc/src/sgml/ref/set_constraints.sgml | modified | +15 −16 |
| doc/src/sgml/release.sgml | modified | +24 −2 |
| src/backend/access/transam/xact.c | modified | +39 −43 |
| src/backend/commands/copy.c | modified | +11 −1 |
| src/backend/commands/explain.c | modified | +12 −3 |
| src/backend/commands/portalcmds.c | modified | +3 −1 |
| src/backend/commands/trigger.c | modified | +671 −524 |
| src/backend/executor/functions.c | modified | +8 −1 |
| src/backend/executor/spi.c | modified | +9 −3 |
| src/backend/tcop/postgres.c | modified | +1 −4 |
| src/backend/tcop/pquery.c | modified | +19 −3 |
| src/backend/tcop/utility.c | modified | +2 −2 |
| src/backend/utils/adt/ri_triggers.c | modified | +2 −2 |
| src/include/commands/trigger.h | modified | +15 −13 |
| src/test/regress/expected/foreign_key.out | modified | +1 −0 |
| src/test/regress/expected/plpgsql.out | modified | +71 −0 |
| src/test/regress/sql/plpgsql.sql | modified | +51 −0 |