mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
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.)
This commit is contained in:
@@ -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);
|
||||
|
@@ -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++)
|
||||
|
Reference in New Issue
Block a user