aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/trigger.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/trigger.c')
-rw-r--r--src/backend/commands/trigger.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 2505de06230..09199ed27be 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.1 2009/10/27 20:14:33 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.248.2.2 2010/01/24 21:49:31 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -3296,10 +3296,9 @@ AfterTriggerEndSubXact(bool isCommit)
/*
* Pop the prior state if needed.
*/
- Assert(my_level < afterTriggers->maxtransdepth);
-
if (isCommit)
{
+ Assert(my_level < afterTriggers->maxtransdepth);
/* If we saved a prior state, we don't need it anymore */
state = afterTriggers->state_stack[my_level];
if (state != NULL)
@@ -3312,8 +3311,16 @@ AfterTriggerEndSubXact(bool isCommit)
else
{
/*
- * Aborting. Release any event lists from queries being aborted, and
- * restore query_depth to its pre-subxact value.
+ * Aborting. It is possible subxact start failed before calling
+ * AfterTriggerBeginSubXact, in which case we mustn't risk touching
+ * stack levels that aren't there.
+ */
+ if (my_level >= afterTriggers->maxtransdepth)
+ return;
+
+ /*
+ * Release any event lists from queries being aborted, and restore
+ * query_depth to its pre-subxact value.
*/
while (afterTriggers->query_depth > afterTriggers->depth_stack[my_level])
{