pgsql: Throw error if expiring tuple is again updated or deleted. - Mailing list pgsql-committers

From Kevin Grittner
Subject pgsql: Throw error if expiring tuple is again updated or deleted.
Date
Msg-id E1TRq6M-0000P3-AY@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Throw error if expiring tuple is again updated or deleted.

This prevents surprising behavior when a FOR EACH ROW trigger
BEFORE UPDATE or BEFORE DELETE directly or indirectly updates or
deletes the the old row.  Prior to this patch the requested action
on the row could be silently ignored while all triggered actions
based on the occurence of the requested action could be committed.
One example of how this could happen is if the BEFORE DELETE
trigger for a "parent" row deleted "children" which had trigger
functions to update summary or status data on the parent.

This also prevents similar surprising problems if the query has a
volatile function which updates a target row while it is already
being updated.

There are related issues present in FOR UPDATE cursors and READ
COMMITTED queries which are not handled by this patch.  These
issues need further evalution to determine what change, if any, is
needed.

Where the new error messages are generated, in most cases the best
fix will be to move code from the BEFORE trigger to an AFTER
trigger.  Where this is not feasible, the trigger can avoid the
error by re-issuing the triggering statement and returning NULL.

Documentation changes will be submitted in a separate patch.

Kevin Grittner and Tom Lane with input from Florian Pflug and
Robert Haas, based on problems encountered during conversion of
Wisconsin Circuit Court trigger logic to plpgsql triggers.

Branch
------
master

Details
-------
http://git.postgresql.org/pg/commitdiff/6868ed7491b7ea7f0af6133bb66566a2f5fe5a75

Modified Files
--------------
src/backend/access/heap/heapam.c       |   85 ++++++++-------
src/backend/commands/trigger.c         |   31 ++++--
src/backend/executor/execMain.c        |   43 +++++---
src/backend/executor/nodeLockRows.c    |   27 +++--
src/backend/executor/nodeModifyTable.c |   93 ++++++++++++---
src/include/access/heapam.h            |   36 +++++-
src/test/regress/expected/triggers.out |  194 ++++++++++++++++++++++++++++++++
src/test/regress/sql/triggers.sql      |  155 +++++++++++++++++++++++++
8 files changed, 566 insertions(+), 98 deletions(-)


pgsql-committers by date:

Previous
From: Tom Lane
Date:
Subject: pgsql: Prefer actual constants to pseudo-constants in equivalence class
Next
From: Peter Eisentraut
Date:
Subject: pgsql: Preserve intermediate .c files in coverage mode