Index: portalmem.c =================================================================== RCS file: /home/alvherre/cvs/pgsql/src/backend/utils/mmgr/portalmem.c,v retrieving revision 1.76 diff -c -r1.76 portalmem.c *** portalmem.c 31 Dec 2004 22:02:48 -0000 1.76 --- portalmem.c 25 Jan 2005 17:52:52 -0000 *************** *** 623,663 **** continue; /* ! * Force any active portals of my own transaction into FAILED * state. This is mostly to ensure that a portal running a FETCH * will go FAILED if the underlying cursor fails. (Note we do NOT * want to do this to upper-level portals, since they may be able * to continue.) */ ! if (portal->status == PORTAL_ACTIVE) portal->status = PORTAL_FAILED; ! /* ! * If the portal is READY then allow it to survive into the parent ! * transaction; otherwise shut it down. ! */ ! if (portal->status == PORTAL_READY) ! { ! portal->createSubid = parentSubid; ! if (portal->resowner) ! ResourceOwnerNewParent(portal->resowner, parentXactOwner); ! } ! else { ! /* let portalcmds.c clean up the state it knows about */ ! if (PointerIsValid(portal->cleanup)) ! { ! (*portal->cleanup) (portal); ! portal->cleanup = NULL; ! } ! ! /* ! * Any resources belonging to the portal will be released in ! * the upcoming transaction-wide cleanup; they will be gone ! * before we run PortalDrop. ! */ ! portal->resowner = NULL; } } } --- 623,650 ---- continue; /* ! * Force any active and ready portals of my own transaction into FAILED * state. This is mostly to ensure that a portal running a FETCH * will go FAILED if the underlying cursor fails. (Note we do NOT * want to do this to upper-level portals, since they may be able * to continue.) */ ! if (portal->status == PORTAL_ACTIVE || portal->status == PORTAL_READY) portal->status = PORTAL_FAILED; ! /* let portalcmds.c clean up the state it knows about */ ! if (PointerIsValid(portal->cleanup)) { ! (*portal->cleanup) (portal); ! portal->cleanup = NULL; } + + /* + * Any resources belonging to the portal will be released in + * the upcoming transaction-wide cleanup; they will be gone + * before we run PortalDrop. + */ + portal->resowner = NULL; } }