From c6ff0b892c30122b75d32c524109d16ee3c973f0 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 14 Mar 2019 13:30:09 +0100 Subject: [PATCH] Refactor ParamListInfo initialization There were six copies of identical nontrivial code. Put it into a function. --- src/backend/commands/prepare.c | 12 +------ src/backend/executor/functions.c | 15 ++------ src/backend/executor/spi.c | 17 ++------- src/backend/nodes/params.c | 59 +++++++++++++++++--------------- src/backend/tcop/postgres.c | 11 +----- src/include/nodes/params.h | 1 + src/pl/plpgsql/src/pl_exec.c | 3 +- 7 files changed, 40 insertions(+), 78 deletions(-) diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index a98c8362d7..fc231caf70 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 c6b7203f81..965e5dea70 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 = ¶mLI->params[i]; diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 70c03e0f60..d898f4ca78 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 = ¶mLI->params[i]; diff --git a/src/backend/nodes/params.c b/src/backend/nodes/params.c index a89a25ea63..f5d56138ee 100644 --- a/src/backend/nodes/params.c +++ b/src/backend/nodes/params.c @@ -22,6 +22,33 @@ #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. * @@ -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 = ¶mLI->params[i]; diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 8b4d94c9a1..f9ce3d8f22 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 ded3b3a3ae..fd9046619c 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 a5aafa8c09..6dfcd1611a 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; -- 2.30.2