aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/commands/prepare.c12
-rw-r--r--src/backend/executor/functions.c15
-rw-r--r--src/backend/executor/spi.c17
-rw-r--r--src/backend/nodes/params.c59
-rw-r--r--src/backend/tcop/postgres.c11
-rw-r--r--src/include/nodes/params.h1
-rw-r--r--src/pl/plpgsql/src/pl_exec.c3
7 files changed, 40 insertions, 78 deletions
diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c
index a98c8362d72..fc231caf707 100644
--- a/src/backend/commands/prepare.c
+++ b/src/backend/commands/prepare.c
@@ -393,17 +393,7 @@ EvaluateParams(PreparedStatement *pstmt, List *params,
/* 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)
diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c
index c6b7203f813..965e5dea70e 100644
--- a/src/backend/executor/functions.c
+++ b/src/backend/executor/functions.c
@@ -906,21 +906,10 @@ postquel_sub_params(SQLFunctionCachePtr fcache,
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
@@ -929,7 +918,7 @@ postquel_sub_params(SQLFunctionCachePtr fcache,
Assert(paramLI->numParams == nargs);
}
- for (i = 0; i < nargs; i++)
+ for (int i = 0; i < nargs; i++)
{
ParamExternData *prm = &paramLI->params[i];
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index 70c03e0f605..d898f4ca78d 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -2387,20 +2387,9 @@ _SPI_convert_params(int nargs, Oid *argtypes,
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 = &paramLI->params[i];
diff --git a/src/backend/nodes/params.c b/src/backend/nodes/params.c
index a89a25ea631..f5d56138ee5 100644
--- a/src/backend/nodes/params.c
+++ b/src/backend/nodes/params.c
@@ -23,6 +23,33 @@
/*
+ * 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.
*
* The result is allocated in CurrentMemoryContext.
@@ -36,25 +63,13 @@ 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->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];
@@ -211,26 +226,14 @@ ParamListInfo
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 = &paramLI->params[i];
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 8b4d94c9a13..f9ce3d8f22a 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -1731,16 +1731,7 @@ exec_bind_message(StringInfo input_message)
*/
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++)
{
diff --git a/src/include/nodes/params.h b/src/include/nodes/params.h
index ded3b3a3aeb..fd9046619cc 100644
--- a/src/include/nodes/params.h
+++ b/src/include/nodes/params.h
@@ -151,6 +151,7 @@ typedef struct ParamExecData
/* 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);
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index a5aafa8c09f..6dfcd1611a8 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -3874,8 +3874,7 @@ plpgsql_estate_setup(PLpgSQL_execstate *estate,
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;