Refactor ParamListInfo initialization
There were six copies of identical nontrivial code. Put it into a function.
This commit is contained in:
parent
1226d932b4
commit
c6ff0b892c
|
@ -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)
|
||||||
|
|
|
@ -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 = ¶mLI->params[i];
|
ParamExternData *prm = ¶mLI->params[i];
|
||||||
|
|
||||||
|
|
|
@ -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 = ¶mLI->params[i];
|
ParamExternData *prm = ¶mLI->params[i];
|
||||||
|
|
||||||
|
|
|
@ -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 = ¶mLI->params[i];
|
ParamExternData *prm = ¶mLI->params[i];
|
||||||
|
|
||||||
|
|
|
@ -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++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue