PersistHoldablePortal must establish the correct value for ActiveSnapshot
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Apr 2005 15:59:34 +0000 (15:59 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 11 Apr 2005 15:59:34 +0000 (15:59 +0000)
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.

src/backend/commands/portalcmds.c

index 3d5133f8254a89a6aa52fef4b19d195454b90e83..b3170499adc888690dbadb11e1234f24a99ff1cd 100644 (file)
@@ -14,7 +14,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.39 2005/03/25 21:57:58 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/portalcmds.c,v 1.40 2005/04/11 15:59:34 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;