From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 6 Dec 2004 23:57:17 +0000 (+0000)
Subject: ActiveSnapshot must be set to something valid while running deferred
X-Git-Tag: REL8_0_0RC2~87
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d5df606cb224fd893b41aef6dc4851bc666c0f77;p=postgresql

ActiveSnapshot must be set to something valid while running deferred
triggers during COMMIT.  Per trouble report from Frank van Vugt.
---

diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 62071a6878..e3d8021c3f 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.175 2004/11/14 02:04:14 neilc Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/trigger.c,v 1.176 2004/12/06 23:57:17 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2364,6 +2364,14 @@ AfterTriggerEndXact(void)
 	/* ... but not inside a query */
 	Assert(afterTriggers->query_depth == -1);
 
+	/*
+	 * If there are any triggers to fire, make sure we have set a snapshot
+	 * for them to use.  (Since PortalRunUtility doesn't set a snap for
+	 * COMMIT, we can't assume ActiveSnapshot is valid on entry.)
+	 */
+	if (afterTriggers->events.head != NULL)
+		ActiveSnapshot = CopySnapshot(GetTransactionSnapshot());
+
 	/*
 	 * Run all the remaining triggers.  Loop until they are all gone,
 	 * just in case some trigger queues more for us to do.