aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/portalcmds.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-04-11 15:59:47 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-04-11 15:59:47 +0000
commitadd2c3f4d6b137b35c097354438779aacde2f1d9 (patch)
tree85082a447d44388b0e1346110994eb5ca8f7785c /src/backend/commands/portalcmds.c
parent88b229d9076748e09124c3ffae2987cf4ecd9ca3 (diff)
downloadpostgresql-add2c3f4d6b137b35c097354438779aacde2f1d9.tar.gz
postgresql-add2c3f4d6b137b35c097354438779aacde2f1d9.zip
PersistHoldablePortal must establish the correct value for ActiveSnapshot
while completing execution of the cursor's query. Otherwise we get wrong answers or even crashes from non-volatile functions called by the query. Per report from andrew@supernews.
Diffstat (limited to 'src/backend/commands/portalcmds.c')
-rw-r--r--src/backend/commands/portalcmds.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/backend/commands/portalcmds.c b/src/backend/commands/portalcmds.c
index ca72503d04a..78d1f7c20bb 100644
--- a/src/backend/commands/portalcmds.c
+++ b/src/backend/commands/portalcmds.c
@@ -14,7 +14,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.38 2004/12/31 21:59:41 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.38.4.1 2005/04/11 15:59:47 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -309,6 +309,7 @@ PersistHoldablePortal(Portal portal)
{
QueryDesc *queryDesc = PortalGetQueryDesc(portal);
Portal saveActivePortal;
+ Snapshot saveActiveSnapshot;
ResourceOwner saveResourceOwner;
MemoryContext savePortalContext;
MemoryContext saveQueryContext;
@@ -350,12 +351,14 @@ PersistHoldablePortal(Portal portal)
* Set up global portal context pointers.
*/
saveActivePortal = ActivePortal;
+ saveActiveSnapshot = ActiveSnapshot;
saveResourceOwner = CurrentResourceOwner;
savePortalContext = PortalContext;
saveQueryContext = QueryContext;
PG_TRY();
{
ActivePortal = portal;
+ ActiveSnapshot = queryDesc->snapshot;
CurrentResourceOwner = portal->resowner;
PortalContext = PortalGetHeapMemory(portal);
QueryContext = portal->queryContext;
@@ -428,6 +431,7 @@ PersistHoldablePortal(Portal portal)
/* Restore global vars and propagate error */
ActivePortal = saveActivePortal;
+ ActiveSnapshot = saveActiveSnapshot;
CurrentResourceOwner = saveResourceOwner;
PortalContext = savePortalContext;
QueryContext = saveQueryContext;
@@ -442,6 +446,7 @@ PersistHoldablePortal(Portal portal)
portal->status = PORTAL_READY;
ActivePortal = saveActivePortal;
+ ActiveSnapshot = saveActiveSnapshot;
CurrentResourceOwner = saveResourceOwner;
PortalContext = savePortalContext;
QueryContext = saveQueryContext;