/* Prepare the expressions for execution */
exprstates = ExecPrepareExprList(params, estate);
- paramLI = (ParamListInfo)
- palloc(offsetof(ParamListInfoData, params) +
- num_params * sizeof(ParamExternData));
- /* we have static list of params, so no hooks needed */
- paramLI->paramFetch = NULL;
- paramLI->paramFetchArg = NULL;
- paramLI->paramCompile = NULL;
- paramLI->paramCompileArg = NULL;
- paramLI->parserSetup = NULL;
- paramLI->parserSetupArg = NULL;
- paramLI->numParams = num_params;
+ paramLI = makeParamList(num_params);
i = 0;
foreach(l, exprstates)
if (nargs > 0)
{
ParamListInfo paramLI;
- int i;
if (fcache->paramLI == NULL)
{
- paramLI = (ParamListInfo)
- palloc(offsetof(ParamListInfoData, params) +
- nargs * sizeof(ParamExternData));
- /* we have static list of params, so no hooks needed */
- paramLI->paramFetch = NULL;
- paramLI->paramFetchArg = NULL;
- paramLI->paramCompile = NULL;
- paramLI->paramCompileArg = NULL;
- paramLI->parserSetup = NULL;
- paramLI->parserSetupArg = NULL;
- paramLI->numParams = nargs;
+ paramLI = makeParamList(nargs);
fcache->paramLI = paramLI;
}
else
Assert(paramLI->numParams == nargs);
}
- for (i = 0; i < nargs; i++)
+ for (int i = 0; i < nargs; i++)
{
ParamExternData *prm = ¶mLI->params[i];
if (nargs > 0)
{
- int i;
-
- paramLI = (ParamListInfo) palloc(offsetof(ParamListInfoData, params) +
- nargs * sizeof(ParamExternData));
- /* we have static list of params, so no hooks needed */
- paramLI->paramFetch = NULL;
- paramLI->paramFetchArg = NULL;
- paramLI->paramCompile = NULL;
- paramLI->paramCompileArg = NULL;
- paramLI->parserSetup = NULL;
- paramLI->parserSetupArg = NULL;
- paramLI->numParams = nargs;
-
- for (i = 0; i < nargs; i++)
+ paramLI = makeParamList(nargs);
+
+ for (int i = 0; i < nargs; i++)
{
ParamExternData *prm = ¶mLI->params[i];
#include "utils/lsyscache.h"
+/*
+ * Allocate and initialize a new ParamListInfo structure.
+ *
+ * To make a new structure for the "dynamic" way (with hooks), pass 0 for
+ * numParams and set numParams manually.
+ */
+ParamListInfo
+makeParamList(int numParams)
+{
+ ParamListInfo retval;
+ Size size;
+
+ size = offsetof(ParamListInfoData, params) +
+ numParams * sizeof(ParamExternData);
+
+ retval = (ParamListInfo) palloc(size);
+ retval->paramFetch = NULL;
+ retval->paramFetchArg = NULL;
+ retval->paramCompile = NULL;
+ retval->paramCompileArg = NULL;
+ retval->parserSetup = NULL;
+ retval->parserSetupArg = NULL;
+ retval->numParams = numParams;
+
+ return retval;
+}
+
/*
* Copy a ParamListInfo structure.
*
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->paramCompile = NULL;
- retval->paramCompileArg = NULL;
- retval->parserSetup = NULL;
- retval->parserSetupArg = NULL;
- retval->numParams = from->numParams;
+ retval = makeParamList(from->numParams);
- for (i = 0; i < from->numParams; i++)
+ for (int i = 0; i < from->numParams; i++)
{
ParamExternData *oprm;
ParamExternData *nprm = &retval->params[i];
RestoreParamList(char **start_address)
{
ParamListInfo paramLI;
- Size size;
- int i;
int nparams;
memcpy(&nparams, *start_address, sizeof(int));
*start_address += sizeof(int);
- size = offsetof(ParamListInfoData, params) +
- nparams * sizeof(ParamExternData);
-
- paramLI = (ParamListInfo) palloc(size);
- paramLI->paramFetch = NULL;
- paramLI->paramFetchArg = NULL;
- paramLI->paramCompile = NULL;
- paramLI->paramCompileArg = NULL;
- paramLI->parserSetup = NULL;
- paramLI->parserSetupArg = NULL;
- paramLI->numParams = nparams;
+ paramLI = makeParamList(nparams);
- for (i = 0; i < nparams; i++)
+ for (int i = 0; i < nparams; i++)
{
ParamExternData *prm = ¶mLI->params[i];
*/
if (numParams > 0)
{
- params = (ParamListInfo) palloc(offsetof(ParamListInfoData, params) +
- numParams * sizeof(ParamExternData));
- /* we have static list of params, so no hooks needed */
- params->paramFetch = NULL;
- params->paramFetchArg = NULL;
- params->paramCompile = NULL;
- params->paramCompileArg = NULL;
- params->parserSetup = NULL;
- params->parserSetupArg = NULL;
- params->numParams = numParams;
+ params = makeParamList(numParams);
for (int paramno = 0; paramno < numParams; paramno++)
{
/* Functions found in src/backend/nodes/params.c */
+extern ParamListInfo makeParamList(int numParams);
extern ParamListInfo copyParamList(ParamListInfo from);
extern Size EstimateParamListSpace(ParamListInfo paramLI);
extern void SerializeParamList(ParamListInfo paramLI, char **start_address);
estate->datum_context = CurrentMemoryContext;
/* initialize our ParamListInfo with appropriate hook functions */
- estate->paramLI = (ParamListInfo)
- palloc(offsetof(ParamListInfoData, params));
+ estate->paramLI = makeParamList(0);
estate->paramLI->paramFetch = plpgsql_param_fetch;
estate->paramLI->paramFetchArg = (void *) estate;
estate->paramLI->paramCompile = plpgsql_param_compile;