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 */
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)

View File

@ -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];

View File

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

View File

@ -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 = makeParamList(from->numParams);
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;
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 = makeParamList(nparams);
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;
for (i = 0; i < nparams; i++)
for (int i = 0; i < nparams; i++)
{
ParamExternData *prm = &paramLI->params[i];

View File

@ -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++)
{

View File

@ -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);

View File

@ -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;