@@ -131,7 +131,9 @@ assign_param_for_var(PlannerInfo *root, Var *var)
131131
132132pitem = makeNode (PlannerParamItem );
133133pitem -> 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
136138root -> plan_params = lappend (root -> plan_params ,pitem );
137139
@@ -234,7 +236,9 @@ assign_param_for_placeholdervar(PlannerInfo *root, PlaceHolderVar *phv)
234236
235237pitem = makeNode (PlannerParamItem );
236238pitem -> 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
239243root -> plan_params = lappend (root -> plan_params ,pitem );
240244
@@ -323,7 +327,9 @@ replace_outer_agg(PlannerInfo *root, Aggref *agg)
323327
324328pitem = makeNode (PlannerParamItem );
325329pitem -> 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
328334root -> plan_params = lappend (root -> plan_params ,pitem );
329335
@@ -348,6 +354,7 @@ replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp)
348354Param * retval ;
349355PlannerParamItem * pitem ;
350356Index levelsup ;
357+ Oid ptype ;
351358
352359Assert (grp -> agglevelsup > 0 && grp -> agglevelsup < root -> query_level );
353360
@@ -362,17 +369,20 @@ replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp)
362369grp = copyObject (grp );
363370IncrementVarSublevelsUp ((Node * )grp ,- ((int )grp -> agglevelsup ),0 );
364371Assert (grp -> agglevelsup == 0 );
372+ ptype = exprType ((Node * )grp );
365373
366374pitem = makeNode (PlannerParamItem );
367375pitem -> 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
370380root -> plan_params = lappend (root -> plan_params ,pitem );
371381
372382retval = makeNode (Param );
373383retval -> paramkind = PARAM_EXEC ;
374384retval -> paramid = pitem -> paramId ;
375- retval -> paramtype = exprType (( Node * ) grp ) ;
385+ retval -> paramtype = ptype ;
376386retval -> paramtypmod = -1 ;
377387retval -> paramcollid = InvalidOid ;
378388retval -> 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
396407retval = makeNode (Param );
397408retval -> 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 );
399412retval -> paramtype = paramtype ;
400413retval -> paramtypmod = paramtypmod ;
401414retval -> 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 )
21022119return ;
21032120
21042121/*