PostgreSQL Source Code: src/backend/optimizer/util/paramassign.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
52
58
59
60
61
62
63
64
65static int
67{
71
72
73 for (levelsup = var->varlevelsup; levelsup > 0; levelsup--)
75
76
77 foreach(ppl, root->plan_params)
78 {
81 {
83
84
85
86
87
88
91 pvar->vartype == var->vartype &&
92 pvar->vartypmod == var->vartypmod &&
93 pvar->varcollid == var->varcollid &&
95 bms_equal(pvar->varnullingrels, var->varnullingrels))
97 }
98 }
99
100
103
108 var->vartype);
109
111
113}
114
115
116
117
118
119
122{
124 int i;
125
127
128
130
134 retval->paramtype = var->vartype;
135 retval->paramtypmod = var->vartypmod;
136 retval->paramcollid = var->varcollid;
138
139 return retval;
140}
141
142
143
144
145
146
147
148
149static int
151{
155
156
157 for (levelsup = phv->phlevelsup; levelsup > 0; levelsup--)
159
160
161 foreach(ppl, root->plan_params)
162 {
165 {
167
168
171 }
172 }
173
174
178
184
186
188}
189
190
191
192
193
194
195
196
199{
201 int i;
202
204
205
207
212 retval->paramtypmod = exprTypmod((Node *) phv->phexpr);
215
216 return retval;
217}
218
219
220
221
222
223
226{
230
231 Assert(agg->agglevelsup > 0 && agg->agglevelsup < root->query_level);
232
233
234 for (levelsup = agg->agglevelsup; levelsup > 0; levelsup--)
236
237
238
239
240
243 Assert(agg->agglevelsup == 0);
244
249 agg->aggtype);
250
252
256 retval->paramtype = agg->aggtype;
257 retval->paramtypmod = -1;
258 retval->paramcollid = agg->aggcollid;
260
261 return retval;
262}
263
264
265
266
267
268
269
272{
277
279
280
281 for (levelsup = grp->agglevelsup; levelsup > 0; levelsup--)
283
284
285
286
287
291
296 ptype);
297
299
304 retval->paramtypmod = -1;
307
308 return retval;
309}
310
311
312
313
314
315
316
319{
323
325
326
327
328
329
330 do
331 {
333 if (root == NULL)
334 elog(ERROR, "MergeSupportFunc found outside MERGE");
336
337
338
339
340
342
347 ptype);
348
350
355 retval->paramtypmod = -1;
358
359 return retval;
360}
361
362
363
364
365
366
369{
374
376
377
378 for (levelsup = rexpr->retlevelsup; levelsup > 0; levelsup--)
380
381
382
383
384
388
390 pitem->item = (Node *) rexpr;
393 ptype);
394
396
404
405 return retval;
406}
407
408
409
410
411
412
415{
419
420
421 foreach(lc, root->curOuterParams)
422 {
425 {
426
431 param->paramtypmod = var->vartypmod;
432 param->paramcollid = var->varcollid;
434 return param;
435 }
436 }
437
438
440 var->vartype,
441 var->vartypmod,
442 var->varcollid);
444
445
449 root->curOuterParams = lappend(root->curOuterParams, nlp);
450
451
452 return param;
453}
454
455
456
457
458
459
460
461
464{
468
469
470 foreach(lc, root->curOuterParams)
471 {
474 {
475
480 param->paramtypmod = exprTypmod((Node *) phv->phexpr);
483 return param;
484 }
485 }
486
487
492
493
497 root->curOuterParams = lappend(root->curOuterParams, nlp);
498
499
500 return param;
501}
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526void
528{
530
531 foreach(lc, subplan_params)
532 {
534
536 {
540
541
543 elog(ERROR, "non-LATERAL parameter required by subquery");
544
545
546 foreach(lc2, root->curOuterParams)
547 {
549 if (nlp->paramno == pitem->paramId)
550 {
552
553 break;
554 }
555 }
556 if (lc2 == NULL)
557 {
558
560 nlp->paramno = pitem->paramId;
562 root->curOuterParams = lappend(root->curOuterParams, nlp);
563 }
564 }
566 {
570
571
573 root->curOuterRels))
574 elog(ERROR, "non-LATERAL parameter required by subquery");
575
576
577 foreach(lc2, root->curOuterParams)
578 {
580 if (nlp->paramno == pitem->paramId)
581 {
583
584 break;
585 }
586 }
587 if (lc2 == NULL)
588 {
589
591 nlp->paramno = pitem->paramId;
593 root->curOuterParams = lappend(root->curOuterParams, nlp);
594 }
595 }
596 else
597 elog(ERROR, "unexpected type of subquery parameter");
598 }
599}
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
630{
631 List *result;
633
634 result = NIL;
635 foreach(cell, root->curOuterParams)
636 {
638
639
640
641
642
643
644
647 {
649
651 cell);
652 var->varnullingrels = bms_intersect(var->varnullingrels,
653 leftrelids);
654 result = lappend(result, nlp);
655 }
659 leftrelids))
660 {
662
664 cell);
666 leftrelids);
667 result = lappend(result, nlp);
668 }
669 }
670 return result;
671}
672
673
674
675
676
677
678
679
680
681
682
685 Oid paramcollation)
686{
688
693 paramtype);
695 retval->paramtypmod = paramtypmod;
696 retval->paramcollid = paramcollation;
698
699 return retval;
700}
701
702
703
704
705
706
707
708
709
710int
712{
714
717 return paramId;
718}
Bitmapset * bms_intersect(const Bitmapset *a, const Bitmapset *b)
bool bms_equal(const Bitmapset *a, const Bitmapset *b)
bool bms_is_subset(const Bitmapset *a, const Bitmapset *b)
bool bms_is_member(int x, const Bitmapset *a)
bool equal(const void *a, const void *b)
Assert(PointerIsAligned(start, uint64))
if(TABLE==NULL||TABLE_index==NULL)
List * lappend(List *list, void *datum)
List * lappend_oid(List *list, Oid datum)
Oid exprType(const Node *expr)
int32 exprTypmod(const Node *expr)
Oid exprCollation(const Node *expr)
int exprLocation(const Node *expr)
#define IsA(nodeptr, _type_)
Param * replace_outer_merge_support(PlannerInfo *root, MergeSupportFunc *msf)
static int assign_param_for_var(PlannerInfo *root, Var *var)
static int assign_param_for_placeholdervar(PlannerInfo *root, PlaceHolderVar *phv)
Param * generate_new_exec_param(PlannerInfo *root, Oid paramtype, int32 paramtypmod, Oid paramcollation)
Param * replace_outer_agg(PlannerInfo *root, Aggref *agg)
List * identify_current_nestloop_params(PlannerInfo *root, Relids leftrelids)
Param * replace_outer_returning(PlannerInfo *root, ReturningExpr *rexpr)
Param * replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp)
Param * replace_outer_var(PlannerInfo *root, Var *var)
void process_subquery_nestloop_params(PlannerInfo *root, List *subplan_params)
Param * replace_outer_placeholdervar(PlannerInfo *root, PlaceHolderVar *phv)
Param * replace_nestloop_param_placeholdervar(PlannerInfo *root, PlaceHolderVar *phv)
int assign_special_exec_param(PlannerInfo *root)
Param * replace_nestloop_param_var(PlannerInfo *root, Var *var)
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define foreach_delete_current(lst, var_or_cell)
PlaceHolderInfo * find_placeholder_info(PlannerInfo *root, PlaceHolderVar *phv)
void IncrementVarSublevelsUp(Node *node, int delta_sublevels_up, int min_sublevels_up)
VarReturningType varreturningtype