Refactor ParamListInfo initialization

There were six copies of identical nontrivial code.  Put it into a
function.
This commit is contained in:
Peter Eisentraut 2019-03-14 13:30:09 +01:00
parent 1226d932b4
commit c6ff0b892c
7 changed files with 39 additions and 77 deletions

View File

@ -393,17 +393,7 @@ EvaluateParams(PreparedStatement *pstmt, List *params,
/* Prepare the expressions for execution */ /* Prepare the expressions for execution */
exprstates = ExecPrepareExprList(params, estate); exprstates = ExecPrepareExprList(params, estate);
paramLI = (ParamListInfo) paramLI = makeParamList(num_params);
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;
i = 0; i = 0;
foreach(l, exprstates) foreach(l, exprstates)

View File

@ -906,21 +906,10 @@ postquel_sub_params(SQLFunctionCachePtr fcache,
if (nargs > 0) if (nargs > 0)
{ {
ParamListInfo paramLI; ParamListInfo paramLI;
int i;
if (fcache->paramLI == NULL) if (fcache->paramLI == NULL)
{ {
paramLI = (ParamListInfo) paramLI = makeParamList(nargs);
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;
fcache->paramLI = paramLI; fcache->paramLI = paramLI;
} }
else else
@ -929,7 +918,7 @@ postquel_sub_params(SQLFunctionCachePtr fcache,
Assert(paramLI->numParams == nargs); Assert(paramLI->numParams == nargs);
} }
for (i = 0; i < nargs; i++) for (int i = 0; i < nargs; i++)
{ {
ParamExternData *prm = &paramLI->params[i]; ParamExternData *prm = &paramLI->params[i];

View File

@ -2387,20 +2387,9 @@ _SPI_convert_params(int nargs, Oid *argtypes,
if (nargs > 0) if (nargs > 0)
{ {
int i; paramLI = makeParamList(nargs);
paramLI = (ParamListInfo) palloc(offsetof(ParamListInfoData, params) + for (int i = 0; i < nargs; i++)
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++)
{ {
ParamExternData *prm = &paramLI->params[i]; ParamExternData *prm = &paramLI->params[i];

View File

@ -22,6 +22,33 @@
#include "utils/lsyscache.h" #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. * Copy a ParamListInfo structure.
* *
@ -36,25 +63,13 @@ ParamListInfo
copyParamList(ParamListInfo from) copyParamList(ParamListInfo from)
{ {
ParamListInfo retval; ParamListInfo retval;
Size size;
int i;
if (from == NULL || from->numParams <= 0) if (from == NULL || from->numParams <= 0)
return NULL; return NULL;
size = offsetof(ParamListInfoData, params) + retval = makeParamList(from->numParams);
from->numParams * sizeof(ParamExternData);
retval = (ParamListInfo) palloc(size); for (int i = 0; i < from->numParams; i++)
retval->paramFetch = NULL;
retval->paramFetchArg = NULL;
retval->paramCompile = NULL;
retval->paramCompileArg = NULL;
retval->parserSetup = NULL;
retval->parserSetupArg = NULL;
retval->numParams = from->numParams;
for (i = 0; i < from->numParams; i++)
{ {
ParamExternData *oprm; ParamExternData *oprm;
ParamExternData *nprm = &retval->params[i]; ParamExternData *nprm = &retval->params[i];
@ -211,26 +226,14 @@ ParamListInfo
RestoreParamList(char **start_address) RestoreParamList(char **start_address)
{ {
ParamListInfo paramLI; ParamListInfo paramLI;
Size size;
int i;
int nparams; int nparams;
memcpy(&nparams, *start_address, sizeof(int)); memcpy(&nparams, *start_address, sizeof(int));
*start_address += sizeof(int); *start_address += sizeof(int);
size = offsetof(ParamListInfoData, params) + paramLI = makeParamList(nparams);
nparams * sizeof(ParamExternData);
paramLI = (ParamListInfo) palloc(size); for (int i = 0; i < nparams; i++)
paramLI->paramFetch = NULL;
paramLI->paramFetchArg = NULL;
paramLI->paramCompile = NULL;
paramLI->paramCompileArg = NULL;
paramLI->parserSetup = NULL;
paramLI->parserSetupArg = NULL;
paramLI->numParams = nparams;
for (i = 0; i < nparams; i++)
{ {
ParamExternData *prm = &paramLI->params[i]; ParamExternData *prm = &paramLI->params[i];

View File

@ -1731,16 +1731,7 @@ exec_bind_message(StringInfo input_message)
*/ */
if (numParams > 0) if (numParams > 0)
{ {
params = (ParamListInfo) palloc(offsetof(ParamListInfoData, params) + params = makeParamList(numParams);
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;
for (int paramno = 0; paramno < numParams; paramno++) for (int paramno = 0; paramno < numParams; paramno++)
{ {

View File

@ -151,6 +151,7 @@ typedef struct ParamExecData
/* Functions found in src/backend/nodes/params.c */ /* Functions found in src/backend/nodes/params.c */
extern ParamListInfo makeParamList(int numParams);
extern ParamListInfo copyParamList(ParamListInfo from); extern ParamListInfo copyParamList(ParamListInfo from);
extern Size EstimateParamListSpace(ParamListInfo paramLI); extern Size EstimateParamListSpace(ParamListInfo paramLI);
extern void SerializeParamList(ParamListInfo paramLI, char **start_address); extern void SerializeParamList(ParamListInfo paramLI, char **start_address);

View File

@ -3874,8 +3874,7 @@ plpgsql_estate_setup(PLpgSQL_execstate *estate,
estate->datum_context = CurrentMemoryContext; estate->datum_context = CurrentMemoryContext;
/* initialize our ParamListInfo with appropriate hook functions */ /* initialize our ParamListInfo with appropriate hook functions */
estate->paramLI = (ParamListInfo) estate->paramLI = makeParamList(0);
palloc(offsetof(ParamListInfoData, params));
estate->paramLI->paramFetch = plpgsql_param_fetch; estate->paramLI->paramFetch = plpgsql_param_fetch;
estate->paramLI->paramFetchArg = (void *) estate; estate->paramLI->paramFetchArg = (void *) estate;
estate->paramLI->paramCompile = plpgsql_param_compile; estate->paramLI->paramCompile = plpgsql_param_compile;