summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2009-01-01 17:12:16 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2009-01-01 17:12:16 +0000
commit87081b2d35057c4919a8a05a7c52fe87845874d5 (patch)
treef231a0cdc069ac6a84a804983bd91bd290cbf11d
parentdf0ea5a1cdc9b5a8ed172124818d42a9d33bc971 (diff)
downloadpostgresql-87081b2d35057c4919a8a05a7c52fe87845874d5.tar.gz
Fix an oversight in my patch of a couple weeks ago that ensured a snapshot
is available during datatype input in Bind message processing. I put the PopActiveSnapshot() or equivalent just before PortalDefineQuery, which is an unsafe spot for it (in 8.3 and later) because we are carrying a plancache refcount that hasn't yet been assigned to the portal. Any error thrown there would result in leaking the refcount. It's not exactly likely that PopActiveSnapshot would throw an elog, perhaps, but it could happen. Reorder the code and add another comment warning not to do that.
-rw-r--r--src/backend/tcop/postgres.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index e43846eedf..4da4748033 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.562 2008/12/13 02:29:21 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.563 2009/01/01 17:12:16 tgl Exp $
*
* NOTES
* this is the "main" module of the postgres backend and
@@ -1714,12 +1714,11 @@ exec_bind_message(StringInfo input_message)
cplan = NULL;
}
- /* Done with the snapshot used for parameter I/O and parsing/planning */
- if (snapshot_set)
- PopActiveSnapshot();
-
/*
- * Define portal and start execution.
+ * Now we can define the portal.
+ *
+ * DO NOT put any code that could possibly throw an error between the
+ * above "RevalidateCachedPlan(psrc, false)" call and here.
*/
PortalDefineQuery(portal,
saved_stmt_name,
@@ -1728,6 +1727,13 @@ exec_bind_message(StringInfo input_message)
plan_list,
cplan);
+ /* Done with the snapshot used for parameter I/O and parsing/planning */
+ if (snapshot_set)
+ PopActiveSnapshot();
+
+ /*
+ * And we're ready to start portal execution.
+ */
PortalStart(portal, params, InvalidSnapshot);
/*