mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-13 23:29:33 +02:00
09d8d110a6
Replace some bogus "x[1]" declarations with "x[FLEXIBLE_ARRAY_MEMBER]". Aside from being more self-documenting, this should help prevent bogus warnings from static code analyzers and perhaps compiler misoptimizations. This patch is just a down payment on eliminating the whole problem, but it gets rid of a lot of easy-to-fix cases. Note that the main problem with doing this is that one must no longer rely on computing sizeof(the containing struct), since the result would be compiler-dependent. Instead use offsetof(struct, lastfield). Autoconf also warns against spelling that offsetof(struct, lastfield[0]). Michael Paquier, review and additional fixes by me.
76 lines
2.0 KiB
C
76 lines
2.0 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* params.c
|
|
* Support for finding the values associated with Param nodes.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* IDENTIFICATION
|
|
* src/backend/nodes/params.c
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "nodes/params.h"
|
|
#include "utils/datum.h"
|
|
#include "utils/lsyscache.h"
|
|
|
|
|
|
/*
|
|
* Copy a ParamListInfo structure.
|
|
*
|
|
* The result is allocated in CurrentMemoryContext.
|
|
*
|
|
* Note: the intent of this function is to make a static, self-contained
|
|
* set of parameter values. If dynamic parameter hooks are present, we
|
|
* intentionally do not copy them into the result. Rather, we forcibly
|
|
* instantiate all available parameter values and copy the datum values.
|
|
*/
|
|
ParamListInfo
|
|
copyParamList(ParamListInfo from)
|
|
{
|
|
ParamListInfo retval;
|
|
Size size;
|
|
int i;
|
|
|
|
if (from == NULL || from->numParams <= 0)
|
|
return NULL;
|
|
|
|
size = offsetof(ParamListInfoData, params) +
|
|
from->numParams * sizeof(ParamExternData);
|
|
|
|
retval = (ParamListInfo) palloc(size);
|
|
retval->paramFetch = NULL;
|
|
retval->paramFetchArg = NULL;
|
|
retval->parserSetup = NULL;
|
|
retval->parserSetupArg = NULL;
|
|
retval->numParams = from->numParams;
|
|
|
|
for (i = 0; i < from->numParams; i++)
|
|
{
|
|
ParamExternData *oprm = &from->params[i];
|
|
ParamExternData *nprm = &retval->params[i];
|
|
int16 typLen;
|
|
bool typByVal;
|
|
|
|
/* give hook a chance in case parameter is dynamic */
|
|
if (!OidIsValid(oprm->ptype) && from->paramFetch != NULL)
|
|
(*from->paramFetch) (from, i + 1);
|
|
|
|
/* flat-copy the parameter info */
|
|
*nprm = *oprm;
|
|
|
|
/* need datumCopy in case it's a pass-by-reference datatype */
|
|
if (nprm->isnull || !OidIsValid(nprm->ptype))
|
|
continue;
|
|
get_typlenbyval(nprm->ptype, &typLen, &typByVal);
|
|
nprm->value = datumCopy(nprm->value, typByVal, typLen);
|
|
}
|
|
|
|
return retval;
|
|
}
|