1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-07 00:36:50 +03:00

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