@@ -131,7 +131,9 @@ assign_param_for_var(PlannerInfo *root, Var *var)
131131
132132 pitem = makeNode (PlannerParamItem );
133133 pitem -> item = (Node * ) var ;
134- pitem -> paramId = root -> glob -> nParamExec ++ ;
134+ pitem -> paramId = list_length (root -> glob -> paramExecTypes );
135+ root -> glob -> paramExecTypes = lappend_oid (root -> glob -> paramExecTypes ,
136+ var -> vartype );
135137
136138 root -> plan_params = lappend (root -> plan_params , pitem );
137139
@@ -234,7 +236,9 @@ assign_param_for_placeholdervar(PlannerInfo *root, PlaceHolderVar *phv)
234236
235237 pitem = makeNode (PlannerParamItem );
236238 pitem -> item = (Node * ) phv ;
237- pitem -> paramId = root -> glob -> nParamExec ++ ;
239+ pitem -> paramId = list_length (root -> glob -> paramExecTypes );
240+ root -> glob -> paramExecTypes = lappend_oid (root -> glob -> paramExecTypes ,
241+ exprType ((Node * ) phv -> phexpr ));
238242
239243 root -> plan_params = lappend (root -> plan_params , pitem );
240244
@@ -323,7 +327,9 @@ replace_outer_agg(PlannerInfo *root, Aggref *agg)
323327
324328 pitem = makeNode (PlannerParamItem );
325329 pitem -> item = (Node * ) agg ;
326- pitem -> paramId = root -> glob -> nParamExec ++ ;
330+ pitem -> paramId = list_length (root -> glob -> paramExecTypes );
331+ root -> glob -> paramExecTypes = lappend_oid (root -> glob -> paramExecTypes ,
332+ agg -> aggtype );
327333
328334 root -> plan_params = lappend (root -> plan_params , pitem );
329335
@@ -348,6 +354,7 @@ replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp)
348354 Param * retval ;
349355 PlannerParamItem * pitem ;
350356 Index levelsup ;
357+ Oid ptype ;
351358
352359 Assert (grp -> agglevelsup > 0 && grp -> agglevelsup < root -> query_level );
353360
@@ -362,17 +369,20 @@ replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp)
362369 grp = copyObject (grp );
363370 IncrementVarSublevelsUp ((Node * ) grp , - ((int ) grp -> agglevelsup ), 0 );
364371 Assert (grp -> agglevelsup == 0 );
372+ ptype = exprType ((Node * ) grp );
365373
366374 pitem = makeNode (PlannerParamItem );
367375 pitem -> item = (Node * ) grp ;
368- pitem -> paramId = root -> glob -> nParamExec ++ ;
376+ pitem -> paramId = list_length (root -> glob -> paramExecTypes );
377+ root -> glob -> paramExecTypes = lappend_oid (root -> glob -> paramExecTypes ,
378+ ptype );
369379
370380 root -> plan_params = lappend (root -> plan_params , pitem );
371381
372382 retval = makeNode (Param );
373383 retval -> paramkind = PARAM_EXEC ;
374384 retval -> paramid = pitem -> paramId ;
375- retval -> paramtype = exprType (( Node * ) grp ) ;
385+ retval -> paramtype = ptype ;
376386 retval -> paramtypmod = -1 ;
377387 retval -> paramcollid = InvalidOid ;
378388 retval -> location = grp -> location ;
@@ -385,7 +395,8 @@ replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp)
385395 *
386396 * This is used to create Params representing subplan outputs.
387397 * We don't need to build a PlannerParamItem for such a Param, but we do
388- * need to record the PARAM_EXEC slot number as being allocated.
398+ * need to make sure we record the type in paramExecTypes (otherwise,
399+ * there won't be a slot allocated for it).
389400 */
390401static Param *
391402generate_new_param (PlannerInfo * root , Oid paramtype , int32 paramtypmod ,
@@ -395,7 +406,9 @@ generate_new_param(PlannerInfo *root, Oid paramtype, int32 paramtypmod,
395406
396407 retval = makeNode (Param );
397408 retval -> paramkind = PARAM_EXEC ;
398- retval -> paramid = root -> glob -> nParamExec ++ ;
409+ retval -> paramid = list_length (root -> glob -> paramExecTypes );
410+ root -> glob -> paramExecTypes = lappend_oid (root -> glob -> paramExecTypes ,
411+ paramtype );
399412 retval -> paramtype = paramtype ;
400413 retval -> paramtypmod = paramtypmod ;
401414 retval -> paramcollid = paramcollation ;
@@ -415,7 +428,11 @@ generate_new_param(PlannerInfo *root, Oid paramtype, int32 paramtypmod,
415428int
416429SS_assign_special_param (PlannerInfo * root )
417430{
418- return root -> glob -> nParamExec ++ ;
431+ int paramId = list_length (root -> glob -> paramExecTypes );
432+
433+ root -> glob -> paramExecTypes = lappend_oid (root -> glob -> paramExecTypes ,
434+ InvalidOid );
435+ return paramId ;
419436}
420437
421438/*
@@ -2098,7 +2115,7 @@ SS_identify_outer_params(PlannerInfo *root)
20982115 * If no parameters have been assigned anywhere in the tree, we certainly
20992116 * don't need to do anything here.
21002117 */
2101- if (root -> glob -> nParamExec == 0 )
2118+ if (root -> glob -> paramExecTypes == NIL )
21022119 return ;
21032120
21042121 /*
0 commit comments