diff options
-rw-r--r-- | src/backend/commands/trigger.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 09199ed27be..15871bbab54 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.248.2.2 2010/01/24 21:49:31 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.248.2.3 2010/08/19 15:46:30 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -2534,6 +2534,7 @@ afterTriggerAddEvent(AfterTriggerEventList *events, else events->tail->next = chunk; events->tail = chunk; + /* events->tailfree is now out of sync, but we'll fix it below */ } /* @@ -2935,6 +2936,15 @@ afterTriggerInvokeEvents(AfterTriggerEventList *events, { chunk->freeptr = CHUNK_DATA_START(chunk); chunk->endfree = chunk->endptr; + + /* + * If it's last chunk, must sync event list's tailfree too. Note + * that delete_ok must NOT be passed as true if there could be + * stacked AfterTriggerEventList values pointing at this event + * list, since we'd fail to fix their copies of tailfree. + */ + if (chunk == events->tail) + events->tailfree = chunk->freeptr; } } |