I wrote: > Your other idea of forcing initPlan parameters to be evaluated before we > enter the EPQ execution environment is probably more workable.
Concretely, the attached seems to be enough to fix it (though I only tried the simplest case you posted). I don't find anything to love about ExecEvalParamExecParams: it's badly named, badly located, full of undocumented assumptions, and probably causes a memory leak. Plus it doesn't exist as far back as we need it for this. But fixing those problems is a separable task. In the meantime, this is an expedient way to test whether this approach can work. regards, tom lane
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index c583e02..35c9eb2 100644 *** a/src/backend/executor/execMain.c --- b/src/backend/executor/execMain.c *************** *** 46,51 **** --- 46,52 ---- #include "commands/matview.h" #include "commands/trigger.h" #include "executor/execdebug.h" + #include "executor/execExpr.h" #include "foreign/fdwapi.h" #include "mb/pg_wchar.h" #include "miscadmin.h" *************** EvalPlanQualBegin(EPQState *epqstate, ES *** 3078,3083 **** --- 3079,3087 ---- { int i; + /* First, force evaluation of any initPlans needed by subplan */ + ExecEvalParamExecParams(planstate->plan->extParam, parentestate); + i = list_length(parentestate->es_plannedstmt->paramExecTypes); while (--i >= 0) *************** EvalPlanQualStart(EPQState *epqstate, ES *** 3170,3175 **** --- 3174,3182 ---- { int i; + /* First, force evaluation of any initPlans needed by subplan */ + ExecEvalParamExecParams(planTree->extParam, parentestate); + i = list_length(parentestate->es_plannedstmt->paramExecTypes); estate->es_param_exec_vals = (ParamExecData *) palloc0(i * sizeof(ParamExecData));