summaryrefslogtreecommitdiff
path: root/src/include/utils/portal.h
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2010-07-05 09:27:24 +0000
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2010-07-05 09:27:24 +0000
commit0f0b236b0311fc78f37cfb526685a8a105643f6d (patch)
treec3fb7c710ce41b63363e4b3644141f31964d8e57 /src/include/utils/portal.h
parentbf53e7938d14d9cbe22d5756c76529a882420085 (diff)
The previous fix in CVS HEAD and 8.4 for handling the case where a cursor
being used in a PL/pgSQL FOR loop is closed was inadequate, as Tom Lane pointed out. The bug affects FOR statement variants too, because you can close an implicitly created cursor too by guessing the "<unnamed portal X>" name created for it. To fix that, "pin" the portal to prevent it from being dropped while it's being used in a PL/pgSQL FOR loop. Backpatch all the way to 7.4 which is the oldest supported version.
Diffstat (limited to 'src/include/utils/portal.h')
-rw-r--r--src/include/utils/portal.h5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/include/utils/portal.h b/src/include/utils/portal.h
index c19867310a3..ca8546c1e5a 100644
--- a/src/include/utils/portal.h
+++ b/src/include/utils/portal.h
@@ -39,7 +39,7 @@
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/include/utils/portal.h,v 1.81 2009/01/01 17:24:02 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/utils/portal.h,v 1.81.2.1 2010/07/05 09:27:24 heikki Exp $
*
*-------------------------------------------------------------------------
*/
@@ -133,6 +133,7 @@ typedef struct PortalData
/* Status data */
PortalStatus status; /* see above */
+ bool portalPinned; /* a pinned portal can't be dropped */
/* If not NULL, Executor is active; call ExecutorEnd eventually: */
QueryDesc *queryDesc; /* info needed for executor invocation */
@@ -199,6 +200,8 @@ extern void AtSubAbort_Portals(SubTransactionId mySubid,
extern void AtSubCleanup_Portals(SubTransactionId mySubid);
extern Portal CreatePortal(const char *name, bool allowDup, bool dupSilent);
extern Portal CreateNewPortal(void);
+extern void PinPortal(Portal portal);
+extern void UnpinPortal(Portal portal);
extern void PortalDrop(Portal portal, bool isTopCommit);
extern Portal GetPortalByName(const char *name);
extern void PortalDefineQuery(Portal portal,