diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2010-07-13 09:03:01 +0000 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2010-07-13 09:03:01 +0000 |
commit | b9ded24614b3209e909014744a553f7b334331f2 (patch) | |
tree | 1d7f55f15189e68523f78962dcc0aca3a91a6c54 /src | |
parent | dae11908e8dfa72f87d6f3af3c9c2c29dadefcd4 (diff) | |
download | postgresql-b9ded24614b3209e909014744a553f7b334331f2.tar.gz postgresql-b9ded24614b3209e909014744a553f7b334331f2.zip |
Oops, in the previous fix to prevent a cursor that's being used in a FOR
loop from being dropped, I missed subtransaction cleanup. Pinned portals
must be dropped at subtransaction cleanup just as they are at main
transaction cleanup.
Per bug #5556 by Robert Walker. Backpatch to 8.0, 7.4 didn't have
subtransactions.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/utils/mmgr/portalmem.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 303c98e6286..bc668364ff3 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -12,7 +12,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.82.2.3 2010/07/05 09:27:42 heikki Exp $ + * $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.82.2.4 2010/07/13 09:03:01 heikki Exp $ * *------------------------------------------------------------------------- */ @@ -294,6 +294,9 @@ PortalCreateHoldStore(Portal portal) /* * PinPortal * Protect a portal from dropping. + * + * A pinned portal is still unpinned and dropped at transaction or + * subtransaction abort. */ void PinPortal(Portal portal) @@ -798,6 +801,14 @@ AtSubCleanup_Portals(SubTransactionId mySubid) if (portal->createSubid != mySubid) continue; + /* + * If a portal is still pinned, forcibly unpin it. PortalDrop will not + * let us drop the portal otherwise. Whoever pinned the portal was + * interrupted by the abort too and won't try to use it anymore. + */ + if (portal->portalPinned) + portal->portalPinned = false; + /* Zap it. */ PortalDrop(portal, false); } |