aboutsummaryrefslogtreecommitdiff
path: root/src/pl/plpython/plpython.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2011-01-25 00:43:25 +0200
committerPeter Eisentraut <peter_e@gmx.net>2011-01-25 00:43:25 +0200
commit88dcdf9007895b6703dfaf90d15244055384c603 (patch)
tree9c784e15043c6ed002bee9ebba2eeb49bb32d148 /src/pl/plpython/plpython.c
parent52713d02c73926898629e349a9804cd0cae0470b (diff)
downloadpostgresql-88dcdf9007895b6703dfaf90d15244055384c603.tar.gz
postgresql-88dcdf9007895b6703dfaf90d15244055384c603.zip
Call PLy_spi_execute_fetch_result inside the try/catch block
This way errors from fetching tuples are correctly reported as errors in the SPI call. While at it, avoid palloc(0). Jan UrbaƄski
Diffstat (limited to 'src/pl/plpython/plpython.c')
-rw-r--r--src/pl/plpython/plpython.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index cb04f12382e..1a111727d99 100644
--- a/src/pl/plpython/plpython.c
+++ b/src/pl/plpython/plpython.c
@@ -2978,6 +2978,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
rv;
PLyPlanObject *plan;
volatile MemoryContext oldcontext;
+ PyObject *ret;
if (list != NULL)
{
@@ -3014,9 +3015,14 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
oldcontext = CurrentMemoryContext;
PG_TRY();
{
- char *nulls = palloc(nargs * sizeof(char));
+ char *nulls;
volatile int j;
+ if (nargs > 0)
+ nulls = palloc(nargs * sizeof(char));
+ else
+ nulls = NULL;
+
for (j = 0; j < nargs; j++)
{
PyObject *elem;
@@ -3055,8 +3061,10 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
rv = SPI_execute_plan(plan->plan, plan->values, nulls,
PLy_curr_procedure->fn_readonly, limit);
+ ret = PLy_spi_execute_fetch_result(SPI_tuptable, SPI_processed, rv);
- pfree(nulls);
+ if (nargs > 0)
+ pfree(nulls);
}
PG_CATCH();
{
@@ -3099,7 +3107,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit)
}
}
- return PLy_spi_execute_fetch_result(SPI_tuptable, SPI_processed, rv);
+ return ret;
}
static PyObject *
@@ -3107,12 +3115,14 @@ PLy_spi_execute_query(char *query, long limit)
{
int rv;
volatile MemoryContext oldcontext;
+ PyObject *ret;
oldcontext = CurrentMemoryContext;
PG_TRY();
{
pg_verifymbstr(query, strlen(query), false);
rv = SPI_execute(query, PLy_curr_procedure->fn_readonly, limit);
+ ret = PLy_spi_execute_fetch_result(SPI_tuptable, SPI_processed, rv);
}
PG_CATCH();
{
@@ -3138,7 +3148,7 @@ PLy_spi_execute_query(char *query, long limit)
return NULL;
}
- return PLy_spi_execute_fetch_result(SPI_tuptable, SPI_processed, rv);
+ return ret;
}
static PyObject *