mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-16 12:00:21 +02:00
bd61a623ac
Fully update git head, and update back branches in ./COPYRIGHT and legal.sgml files.
77 lines
2.0 KiB
C
77 lines
2.0 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* params.c
|
|
* Support for finding the values associated with Param nodes.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2013, 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;
|
|
|
|
/* sizeof(ParamListInfoData) includes the first array element */
|
|
size = sizeof(ParamListInfoData) +
|
|
(from->numParams - 1) * 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;
|
|
}
|