From a232f30f05848830dad21c6786e0841ddad991fb Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 18 Feb 2010 23:50:06 +0000
Subject: [PATCH] Volatile-ize all five places where we expect a PG_TRY block
 to restore old memory context in plpython.  Before only one of them was
 marked volatile, but per report from Zdenek Kotala, some compilers do the
 wrong thing here.

---
 src/pl/plpython/plpython.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index 37b8638a08f..4bba81aceb7 100644
--- a/src/pl/plpython/plpython.c
+++ b/src/pl/plpython/plpython.c
@@ -1,7 +1,7 @@
 /**********************************************************************
  * plpython.c - python as a procedural language for PostgreSQL
  *
- *	$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.137 2010/02/14 18:42:19 rhaas Exp $
+ *	$PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.138 2010/02/18 23:50:06 tgl Exp $
  *
  *********************************************************************
  */
@@ -2763,7 +2763,7 @@ PLy_spi_prepare(PyObject *self, PyObject *args)
 	PyObject   *volatile optr = NULL;
 	char	   *query;
 	void	   *tmpplan;
-	MemoryContext oldcontext;
+	volatile MemoryContext oldcontext;
 
 	/* Can't execute more if we have an unhandled error */
 	if (PLy_error_in_progress)
@@ -2934,7 +2934,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
 	int			i,
 				rv;
 	PLyPlanObject *plan;
-	MemoryContext oldcontext;
+	volatile MemoryContext oldcontext;
 
 	if (list != NULL)
 	{
@@ -3081,7 +3081,7 @@ static PyObject *
 PLy_spi_execute_query(char *query, long limit)
 {
 	int			rv;
-	MemoryContext oldcontext;
+	volatile MemoryContext oldcontext;
 
 	oldcontext = CurrentMemoryContext;
 	PG_TRY();
@@ -3116,7 +3116,7 @@ static PyObject *
 PLy_spi_execute_fetch_result(SPITupleTable *tuptable, int rows, int status)
 {
 	PLyResultObject *result;
-	MemoryContext oldcontext;
+	volatile MemoryContext oldcontext;
 
 	result = (PLyResultObject *) PLy_result_new();
 	Py_DECREF(result->status);
-- 
GitLab