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;