diff options
| author | Tom Lane | 2004-06-05 19:48:09 +0000 |
|---|---|---|
| committer | Tom Lane | 2004-06-05 19:48:09 +0000 |
| commit | c3a153afed84e29dac664bdc6123724a9e3a906f (patch) | |
| tree | 8249c3dd76ddc9874656ec36f763227327c0a70e /src/pl | |
| parent | 24a1e20f146f3b4b88f0f5189a7631c511796310 (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.c | 21 | ||||
| -rw-r--r-- | src/pl/plpython/plpython.c | 71 |
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++) |
