On Wed, Jun 09, 2004 at 11:32:08PM -0700, Stephan Szabo wrote:

> > Unfortunately, I've gotten it to fail, but I haven't looked in depth (I'm
> > at work, so I'm doing it during compilations and such.)

[...]

> Okay - I think I see what's going on here.
> 
> It looks like deferredTriggerInvokeEvents is being run (immediate_only),
> but since deferredTriggers->events_imm is NULL it's using
> deferredTriggers->events as the start of the list to check, but this value
> isn't getting reset in DeferredTriggerEndSubXact in the case that the
> entire list was created in an aborted subtransaction.

Ok, thanks for the test and diagnostics; patch attached.  I'll see if I
can find other situations like this.

-- 
Alvaro Herrera (<alvherre[a]dcc.uchile.cl>)
"No hay cielo posible sin hundir nuestras raíces
en la profundidad de la tierra"                        (Malucha Pinto)
diff -u 10bgwriter/src/backend/commands/trigger.c 
13commitOpt/src/backend/commands/trigger.c
--- 10bgwriter/src/backend/commands/trigger.c   2004-06-03 19:26:35.000000000 -0400
+++ 13commitOpt/src/backend/commands/trigger.c  2004-06-10 16:33:27.000000000 -0400
@@ -2278,9 +2278,11 @@
                        deferredTriggers->imm_stack[deferredTriggers->numpushed];
 
                /*
-                * Make sure the last element is last.
+                * Cleanup the head and the tail of the list.
                 */
-               if (deferredTriggers->tail_thisxact != NULL)
+               if (deferredTriggers->tail_thisxact == NULL)
+                       deferredTriggers->events = NULL;
+               else
                        deferredTriggers->tail_thisxact->dte_next = NULL;
 
                /*
---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

Reply via email to