summaryrefslogtreecommitdiff
path: root/src/pl
diff options
context:
space:
mode:
authorTom Lane2004-06-05 19:48:09 +0000
committerTom Lane2004-06-05 19:48:09 +0000
commitc3a153afed84e29dac664bdc6123724a9e3a906f (patch)
tree8249c3dd76ddc9874656ec36f763227327c0a70e /src/pl
parent24a1e20f146f3b4b88f0f5189a7631c511796310 (diff)
Tweak palloc/repalloc to allow zero bytes to be requested, as per recent
proposal. Eliminate several dozen now-unnecessary hacks to avoid palloc(0). (It's likely there are more that I didn't find.)
Diffstat (limited to 'src/pl')
-rw-r--r--src/pl/plpgsql/src/pl_exec.c21
-rw-r--r--src/pl/plpython/plpython.c71
2 files changed, 43 insertions, 49 deletions
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 5a3d77a07c6..e479094099e 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -3,7 +3,7 @@
* procedural language
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.104 2004/06/04 02:37:06 tgl Exp $
+ * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.105 2004/06/05 19:48:09 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -1942,10 +1942,8 @@ exec_prepare_plan(PLpgSQL_execstate * estate,
/*
* We need a temporary argtypes array to load with data. (The finished
* plan structure will contain a copy of it.)
- *
- * +1 is just to avoid palloc(0) error.
*/
- argtypes = (Oid *) palloc(sizeof(Oid) * (expr->nparams + 1));
+ argtypes = (Oid *) palloc(expr->nparams * sizeof(Oid));
for (i = 0; i < expr->nparams; i++)
{
@@ -1998,8 +1996,8 @@ exec_stmt_execsql(PLpgSQL_execstate * estate,
/*
* Now build up the values and nulls arguments for SPI_execp()
*/
- values = palloc(sizeof(Datum) * (expr->nparams + 1));
- nulls = palloc(expr->nparams + 1);
+ values = (Datum *) palloc(expr->nparams * sizeof(Datum));
+ nulls = (char *) palloc(expr->nparams * sizeof(char));
for (i = 0; i < expr->nparams; i++)
{
@@ -2479,8 +2477,8 @@ exec_stmt_open(PLpgSQL_execstate * estate, PLpgSQL_stmt_open * stmt)
* refcursor opened with OPEN ... FOR SELECT ...;
* ----------
*/
- values = palloc(sizeof(Datum) * (query->nparams + 1));
- nulls = palloc(query->nparams + 1);
+ values = (Datum *) palloc(query->nparams * sizeof(Datum));
+ nulls = (char *) palloc(query->nparams * sizeof(char));
for (i = 0; i < query->nparams; i++)
{
@@ -3324,8 +3322,8 @@ exec_run_select(PLpgSQL_execstate * estate,
/*
* Now build up the values and nulls arguments for SPI_execp()
*/
- values = palloc(sizeof(Datum) * (expr->nparams + 1));
- nulls = palloc(expr->nparams + 1);
+ values = (Datum *) palloc(expr->nparams * sizeof(Datum));
+ nulls = (char *) palloc(expr->nparams * sizeof(char));
for (i = 0; i < expr->nparams; i++)
{
@@ -3528,8 +3526,7 @@ exec_move_row(PLpgSQL_execstate * estate,
/* If we have a tupdesc but no data, form an all-nulls tuple */
char *nulls;
- /* +1 to avoid possible palloc(0) if no attributes */
- nulls = (char *) palloc(tupdesc->natts * sizeof(char) + 1);
+ nulls = (char *) palloc(tupdesc->natts * sizeof(char));
memset(nulls, 'n', tupdesc->natts * sizeof(char));
rec->tup = heap_formtuple(tupdesc, NULL, nulls);
diff --git a/src/pl/plpython/plpython.c b/src/pl/plpython/plpython.c
index f660adf2973..d07af29c816 100644
--- a/src/pl/plpython/plpython.c
+++ b/src/pl/plpython/plpython.c
@@ -29,7 +29,7 @@
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.47 2004/05/07 00:24:59 tgl Exp $
+ * $PostgreSQL: pgsql/src/pl/plpython/plpython.c,v 1.48 2004/06/05 19:48:09 tgl Exp $
*
*********************************************************************
*/
@@ -531,10 +531,9 @@ PLy_modify_tuple(PLyProcedure * proc, PyObject * pltd, TriggerData *tdata,
plkeys = PyDict_Keys(plntup);
natts = PyList_Size(plkeys);
- /* +1 to avoid palloc(0) on empty tuple */
- modattrs = palloc(natts * sizeof(int) + 1);
- modvalues = palloc(natts * sizeof(Datum) + 1);
- modnulls = palloc(natts + 1);
+ modattrs = (int *) palloc(natts * sizeof(int));
+ modvalues = (Datum *) palloc(natts * sizeof(Datum));
+ modnulls = (char *) palloc(natts * sizeof(char));
tupdesc = tdata->tg_relation->rd_att;
@@ -2174,48 +2173,46 @@ PLy_spi_execute_plan(PyObject * ob, PyObject * list, int limit)
RERAISE_EXC();
}
- if (nargs)
+ nulls = palloc(nargs * sizeof(char));
+
+ for (i = 0; i < nargs; i++)
{
- nulls = palloc((nargs + 1) * sizeof(char));
+ PyObject *elem,
+ *so;
+ char *sv;
- for (i = 0; i < nargs; i++)
+ elem = PySequence_GetItem(list, i);
+ if (elem != Py_None)
{
- PyObject *elem,
- *so;
- char *sv;
+ so = PyObject_Str(elem);
+ sv = PyString_AsString(so);
- elem = PySequence_GetItem(list, i);
- if (elem != Py_None)
- {
- so = PyObject_Str(elem);
- sv = PyString_AsString(so);
-
- /*
- * FIXME -- if this can elog, we have leak
- */
- plan->values[i] = FunctionCall3(&(plan->args[i].out.d.typfunc),
- CStringGetDatum(sv),
- ObjectIdGetDatum(plan->args[i].out.d.typelem),
- Int32GetDatum(-1));
+ /*
+ * FIXME -- if this can elog, we have leak
+ */
+ plan->values[i] =
+ FunctionCall3(&(plan->args[i].out.d.typfunc),
+ CStringGetDatum(sv),
+ ObjectIdGetDatum(plan->args[i].out.d.typelem),
+ Int32GetDatum(-1));
- Py_DECREF(so);
- Py_DECREF(elem);
+ Py_DECREF(so);
+ Py_DECREF(elem);
- nulls[i] = ' ';
- }
- else
- {
- Py_DECREF(elem);
- plan->values[i] = (Datum) 0;
- nulls[i] = 'n';
- }
+ nulls[i] = ' ';
+ }
+ else
+ {
+ Py_DECREF(elem);
+ plan->values[i] = (Datum) 0;
+ nulls[i] = 'n';
}
- nulls[i] = '\0';
}
- else
- nulls = NULL;
rv = SPI_execp(plan->plan, plan->values, nulls, limit);
+
+ pfree(nulls);
+
RESTORE_EXC();
for (i = 0; i < nargs; i++)