@@ -131,7 +131,9 @@ assign_param_for_var(PlannerInfo *root, Var *var)
131
131
132
132
pitem = makeNode (PlannerParamItem );
133
133
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 );
135
137
136
138
root -> plan_params = lappend (root -> plan_params , pitem );
137
139
@@ -234,7 +236,9 @@ assign_param_for_placeholdervar(PlannerInfo *root, PlaceHolderVar *phv)
234
236
235
237
pitem = makeNode (PlannerParamItem );
236
238
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 ));
238
242
239
243
root -> plan_params = lappend (root -> plan_params , pitem );
240
244
@@ -323,7 +327,9 @@ replace_outer_agg(PlannerInfo *root, Aggref *agg)
323
327
324
328
pitem = makeNode (PlannerParamItem );
325
329
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 );
327
333
328
334
root -> plan_params = lappend (root -> plan_params , pitem );
329
335
@@ -348,6 +354,7 @@ replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp)
348
354
Param * retval ;
349
355
PlannerParamItem * pitem ;
350
356
Index levelsup ;
357
+ Oid ptype ;
351
358
352
359
Assert (grp -> agglevelsup > 0 && grp -> agglevelsup < root -> query_level );
353
360
@@ -362,17 +369,20 @@ replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp)
362
369
grp = copyObject (grp );
363
370
IncrementVarSublevelsUp ((Node * ) grp , - ((int ) grp -> agglevelsup ), 0 );
364
371
Assert (grp -> agglevelsup == 0 );
372
+ ptype = exprType ((Node * ) grp );
365
373
366
374
pitem = makeNode (PlannerParamItem );
367
375
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 );
369
379
370
380
root -> plan_params = lappend (root -> plan_params , pitem );
371
381
372
382
retval = makeNode (Param );
373
383
retval -> paramkind = PARAM_EXEC ;
374
384
retval -> paramid = pitem -> paramId ;
375
- retval -> paramtype = exprType (( Node * ) grp ) ;
385
+ retval -> paramtype = ptype ;
376
386
retval -> paramtypmod = -1 ;
377
387
retval -> paramcollid = InvalidOid ;
378
388
retval -> location = grp -> location ;
@@ -385,7 +395,8 @@ replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp)
385
395
*
386
396
* This is used to create Params representing subplan outputs.
387
397
* 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).
389
400
*/
390
401
static Param *
391
402
generate_new_param (PlannerInfo * root , Oid paramtype , int32 paramtypmod ,
@@ -395,7 +406,9 @@ generate_new_param(PlannerInfo *root, Oid paramtype, int32 paramtypmod,
395
406
396
407
retval = makeNode (Param );
397
408
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 );
399
412
retval -> paramtype = paramtype ;
400
413
retval -> paramtypmod = paramtypmod ;
401
414
retval -> paramcollid = paramcollation ;
@@ -415,7 +428,11 @@ generate_new_param(PlannerInfo *root, Oid paramtype, int32 paramtypmod,
415
428
int
416
429
SS_assign_special_param (PlannerInfo * root )
417
430
{
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 ;
419
436
}
420
437
421
438
/*
@@ -2098,7 +2115,7 @@ SS_identify_outer_params(PlannerInfo *root)
2098
2115
* If no parameters have been assigned anywhere in the tree, we certainly
2099
2116
* don't need to do anything here.
2100
2117
*/
2101
- if (root -> glob -> nParamExec == 0 )
2118
+ if (root -> glob -> paramExecTypes == NIL )
2102
2119
return ;
2103
2120
2104
2121
/*
0 commit comments