Refactor ParamListInfo initialization
authorPeter Eisentraut <[email protected]>
Thu, 14 Mar 2019 12:30:09 +0000 (13:30 +0100)
committerPeter Eisentraut <[email protected]>
Thu, 14 Mar 2019 12:30:09 +0000 (13:30 +0100)
There were six copies of identical nontrivial code.  Put it into a
function.

src/backend/commands/prepare.c
src/backend/executor/functions.c
src/backend/executor/spi.c
src/backend/nodes/params.c
src/backend/tcop/postgres.c
src/include/nodes/params.h
src/pl/plpgsql/src/pl_exec.c

index a98c8362d7262cb701987c5855b0509574483a9d..fc231caf707728f849d8fe103ee419b5351eaa55 100644 (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)
index c6b7203f81390e8167206c308793218d2ec920a3..965e5dea70ed17051d577747b113e52358ea6926 100644 (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];
 
index 70c03e0f605728e29d7dd1adb6334045ec22582d..d898f4ca78d4dc1c0ff9e19ad1ccdb2b2248271d 100644 (file)
@@ -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 = &paramLI->params[i];
 
index a89a25ea63194b074952e74adaa8b91b7bedc059..f5d56138ee53db6601b1be669378343a1f639ce7 100644 (file)
 #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 = &paramLI->params[i];
 
index 8b4d94c9a135813ba123f9e5411ccc1069bfab80..f9ce3d8f22a35a69d558e332e84d1e7be27a6377 100644 (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++)
        {
index ded3b3a3aebff0a34419c1da96da069b70c77c58..fd9046619cccd0ea6df29ed095abe92393c4a26f 100644 (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);
index a5aafa8c09f6a8e87d7bb22fdf064f84d9da6a33..6dfcd1611a8d109f64ef9ae4f32fdca3c7db863c 100644 (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;