aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/trigger.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-09-07 21:48:30 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-09-07 21:48:30 +0000
commit6bb0d54eb87fba3b7462ef45aa9db74859c8abac (patch)
treeb84778c87e7d37ab9aa7d74c0bbd2ad88c21c959 /src/backend/commands/trigger.c
parent2750b11e181a691363f0660b197dd0a57f9accc2 (diff)
downloadpostgresql-6bb0d54eb87fba3b7462ef45aa9db74859c8abac.tar.gz
postgresql-6bb0d54eb87fba3b7462ef45aa9db74859c8abac.zip
Fix a couple of small errors in trigger-list management, as per recent
discussion.
Diffstat (limited to 'src/backend/commands/trigger.c')
-rw-r--r--src/backend/commands/trigger.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 18260e62729..85e125c2311 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.169 2004/09/06 23:32:54 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.170 2004/09/07 21:48:30 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -2006,13 +2006,13 @@ deferredTriggerInvokeEvents(bool immediate_only)
int i;
/*
- * Skip executing cancelled events, and events done by
- * transactions that are not aborted.
+ * Skip executing cancelled events, and events already done,
+ * unless they were done by a subtransaction that later aborted.
*/
- if (!(event->dte_event & TRIGGER_DEFERRED_CANCELED) ||
- (event->dte_event & TRIGGER_DEFERRED_DONE &&
- TransactionIdIsValid(event->dte_done_xid) &&
- !TransactionIdDidAbort(event->dte_done_xid)))
+ if (!(event->dte_event & TRIGGER_DEFERRED_CANCELED) &&
+ !(event->dte_event & TRIGGER_DEFERRED_DONE &&
+ TransactionIdIsValid(event->dte_done_xid) &&
+ !TransactionIdDidAbort(event->dte_done_xid)))
{
MemoryContextReset(per_tuple_context);
@@ -2091,7 +2091,7 @@ deferredTriggerInvokeEvents(bool immediate_only)
*/
next_event = event->dte_next;
- if (still_deferred_ones)
+ if (still_deferred_ones || !immediate_only)
{
/* Not done, keep in list */
prev_event = event;
@@ -2103,7 +2103,7 @@ deferredTriggerInvokeEvents(bool immediate_only)
* inside a subtransaction because it could abort later on. We
* will want to check the item again if it does.
*/
- if (immediate_only && !IsSubTransaction())
+ if (!IsSubTransaction())
{
/* delink it from list and free it */
if (prev_event)
@@ -2115,10 +2115,11 @@ deferredTriggerInvokeEvents(bool immediate_only)
else
{
/*
- * Mark the event done.
+ * Mark the event-as-a-whole done, but keep it in the list.
*/
event->dte_event |= TRIGGER_DEFERRED_DONE;
event->dte_done_xid = GetCurrentTransactionId();
+ prev_event = event;
}
}