]> granicus.if.org Git - postgresql/blob - src/backend/optimizer/plan/subselect.c
ed76612dc0a4ab4803cc6ea4536ac88815bb9d54
[postgresql] / src / backend / optimizer / plan / subselect.c
1 /*-------------------------------------------------------------------------
2  *
3  * subselect.c
4  *        Planning routines for subselects and parameters.
5  *
6  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  * IDENTIFICATION
10  *        $PostgreSQL: pgsql/src/backend/optimizer/plan/subselect.c,v 1.116 2007/01/05 22:19:32 momjian Exp $
11  *
12  *-------------------------------------------------------------------------
13  */
14 #include "postgres.h"
15
16 #include "catalog/pg_operator.h"
17 #include "catalog/pg_type.h"
18 #include "miscadmin.h"
19 #include "nodes/makefuncs.h"
20 #include "optimizer/clauses.h"
21 #include "optimizer/planmain.h"
22 #include "optimizer/planner.h"
23 #include "optimizer/subselect.h"
24 #include "optimizer/var.h"
25 #include "parser/parse_expr.h"
26 #include "parser/parse_relation.h"
27 #include "parser/parsetree.h"
28 #include "rewrite/rewriteManip.h"
29 #include "utils/builtins.h"
30 #include "utils/lsyscache.h"
31 #include "utils/syscache.h"
32
33
34 Index           PlannerQueryLevel;      /* level of current query */
35 List       *PlannerInitPlan;    /* init subplans for current query */
36 List       *PlannerParamList;   /* to keep track of cross-level Params */
37
38 int                     PlannerPlanId = 0;      /* to assign unique ID to subquery plans */
39
40 /*
41  * PlannerParamList keeps track of the PARAM_EXEC slots that we have decided
42  * we need for the query.  At runtime these slots are used to pass values
43  * either down into subqueries (for outer references in subqueries) or up out
44  * of subqueries (for the results of a subplan).  The n'th entry in the list
45  * (n counts from 0) corresponds to Param->paramid = n.
46  *
47  * Each ParamList item shows the absolute query level it is associated with,
48  * where the outermost query is level 1 and nested subqueries have higher
49  * numbers.  The item the parameter slot represents can be one of three kinds:
50  *
51  * A Var: the slot represents a variable of that level that must be passed
52  * down because subqueries have outer references to it.  The varlevelsup
53  * value in the Var will always be zero.
54  *
55  * An Aggref (with an expression tree representing its argument): the slot
56  * represents an aggregate expression that is an outer reference for some
57  * subquery.  The Aggref itself has agglevelsup = 0, and its argument tree
58  * is adjusted to match in level.
59  *
60  * A Param: the slot holds the result of a subplan (it is a setParam item
61  * for that subplan).  The absolute level shown for such items corresponds
62  * to the parent query of the subplan.
63  *
64  * Note: we detect duplicate Var parameters and coalesce them into one slot,
65  * but we do not do this for Aggref or Param slots.
66  */
67 typedef struct PlannerParamItem
68 {
69         Node       *item;                       /* the Var, Aggref, or Param */
70         Index           abslevel;               /* its absolute query level */
71 } PlannerParamItem;
72
73
74 typedef struct convert_testexpr_context
75 {
76         int                     rtindex;                /* RT index for Vars, or 0 for Params */
77         List       *righthandIds;       /* accumulated list of Vars or Param IDs */
78 } convert_testexpr_context;
79
80 typedef struct finalize_primnode_context
81 {
82         Bitmapset  *paramids;           /* Set of PARAM_EXEC paramids found */
83         Bitmapset  *outer_params;       /* Set of accessible outer paramids */
84 } finalize_primnode_context;
85
86
87 static Node *convert_testexpr(Node *testexpr,
88                                  int rtindex,
89                                  List **righthandIds);
90 static Node *convert_testexpr_mutator(Node *node,
91                                                  convert_testexpr_context *context);
92 static bool subplan_is_hashable(SubLink *slink, SubPlan *node);
93 static bool hash_ok_operator(OpExpr *expr);
94 static Node *replace_correlation_vars_mutator(Node *node, void *context);
95 static Node *process_sublinks_mutator(Node *node, bool *isTopQual);
96 static Bitmapset *finalize_plan(Plan *plan, List *rtable,
97                           Bitmapset *outer_params,
98                           Bitmapset *valid_params);
99 static bool finalize_primnode(Node *node, finalize_primnode_context *context);
100
101
102 /*
103  * Generate a Param node to replace the given Var,
104  * which is expected to have varlevelsup > 0 (ie, it is not local).
105  */
106 static Param *
107 replace_outer_var(Var *var)
108 {
109         Param      *retval;
110         ListCell   *ppl;
111         PlannerParamItem *pitem;
112         Index           abslevel;
113         int                     i;
114
115         Assert(var->varlevelsup > 0 && var->varlevelsup < PlannerQueryLevel);
116         abslevel = PlannerQueryLevel - var->varlevelsup;
117
118         /*
119          * If there's already a PlannerParamList entry for this same Var, just use
120          * it.  NOTE: in sufficiently complex querytrees, it is possible for the
121          * same varno/abslevel to refer to different RTEs in different parts of
122          * the parsetree, so that different fields might end up sharing the same
123          * Param number.  As long as we check the vartype as well, I believe that
124          * this sort of aliasing will cause no trouble. The correct field should
125          * get stored into the Param slot at execution in each part of the tree.
126          *
127          * We also need to demand a match on vartypmod.  This does not matter for
128          * the Param itself, since those are not typmod-dependent, but it does
129          * matter when make_subplan() instantiates a modified copy of the Var for
130          * a subplan's args list.
131          */
132         i = 0;
133         foreach(ppl, PlannerParamList)
134         {
135                 pitem = (PlannerParamItem *) lfirst(ppl);
136                 if (pitem->abslevel == abslevel && IsA(pitem->item, Var))
137                 {
138                         Var                *pvar = (Var *) pitem->item;
139
140                         if (pvar->varno == var->varno &&
141                                 pvar->varattno == var->varattno &&
142                                 pvar->vartype == var->vartype &&
143                                 pvar->vartypmod == var->vartypmod)
144                                 break;
145                 }
146                 i++;
147         }
148
149         if (!ppl)
150         {
151                 /* Nope, so make a new one */
152                 var = (Var *) copyObject(var);
153                 var->varlevelsup = 0;
154
155                 pitem = (PlannerParamItem *) palloc(sizeof(PlannerParamItem));
156                 pitem->item = (Node *) var;
157                 pitem->abslevel = abslevel;
158
159                 PlannerParamList = lappend(PlannerParamList, pitem);
160                 /* i is already the correct index for the new item */
161         }
162
163         retval = makeNode(Param);
164         retval->paramkind = PARAM_EXEC;
165         retval->paramid = i;
166         retval->paramtype = var->vartype;
167         retval->paramtypmod = var->vartypmod;
168
169         return retval;
170 }
171
172 /*
173  * Generate a Param node to replace the given Aggref
174  * which is expected to have agglevelsup > 0 (ie, it is not local).
175  */
176 static Param *
177 replace_outer_agg(Aggref *agg)
178 {
179         Param      *retval;
180         PlannerParamItem *pitem;
181         Index           abslevel;
182         int                     i;
183
184         Assert(agg->agglevelsup > 0 && agg->agglevelsup < PlannerQueryLevel);
185         abslevel = PlannerQueryLevel - agg->agglevelsup;
186
187         /*
188          * It does not seem worthwhile to try to match duplicate outer aggs. Just
189          * make a new slot every time.
190          */
191         agg = (Aggref *) copyObject(agg);
192         IncrementVarSublevelsUp((Node *) agg, -((int) agg->agglevelsup), 0);
193         Assert(agg->agglevelsup == 0);
194
195         pitem = (PlannerParamItem *) palloc(sizeof(PlannerParamItem));
196         pitem->item = (Node *) agg;
197         pitem->abslevel = abslevel;
198
199         PlannerParamList = lappend(PlannerParamList, pitem);
200         i = list_length(PlannerParamList) - 1;
201
202         retval = makeNode(Param);
203         retval->paramkind = PARAM_EXEC;
204         retval->paramid = i;
205         retval->paramtype = agg->aggtype;
206         retval->paramtypmod = -1;
207
208         return retval;
209 }
210
211 /*
212  * Generate a new Param node that will not conflict with any other.
213  *
214  * This is used to allocate PARAM_EXEC slots for subplan outputs.
215  */
216 static Param *
217 generate_new_param(Oid paramtype, int32 paramtypmod)
218 {
219         Param      *retval;
220         PlannerParamItem *pitem;
221
222         retval = makeNode(Param);
223         retval->paramkind = PARAM_EXEC;
224         retval->paramid = list_length(PlannerParamList);
225         retval->paramtype = paramtype;
226         retval->paramtypmod = paramtypmod;
227
228         pitem = (PlannerParamItem *) palloc(sizeof(PlannerParamItem));
229         pitem->item = (Node *) retval;
230         pitem->abslevel = PlannerQueryLevel;
231
232         PlannerParamList = lappend(PlannerParamList, pitem);
233
234         return retval;
235 }
236
237 /*
238  * Convert a SubLink (as created by the parser) into a SubPlan.
239  *
240  * We are given the original SubLink and the already-processed testexpr
241  * (use this instead of the SubLink's own field).  We are also told if
242  * this expression appears at top level of a WHERE/HAVING qual.
243  *
244  * The result is whatever we need to substitute in place of the SubLink
245  * node in the executable expression.  This will be either the SubPlan
246  * node (if we have to do the subplan as a subplan), or a Param node
247  * representing the result of an InitPlan, or a row comparison expression
248  * tree containing InitPlan Param nodes.
249  */
250 static Node *
251 make_subplan(SubLink *slink, Node *testexpr, bool isTopQual)
252 {
253         SubPlan    *node = makeNode(SubPlan);
254         Query      *subquery = (Query *) (slink->subselect);
255         double          tuple_fraction;
256         Plan       *plan;
257         Bitmapset  *tmpset;
258         int                     paramid;
259         Node       *result;
260
261         /*
262          * Copy the source Query node.  This is a quick and dirty kluge to resolve
263          * the fact that the parser can generate trees with multiple links to the
264          * same sub-Query node, but the planner wants to scribble on the Query.
265          * Try to clean this up when we do querytree redesign...
266          */
267         subquery = (Query *) copyObject(subquery);
268
269         /*
270          * For an EXISTS subplan, tell lower-level planner to expect that only the
271          * first tuple will be retrieved.  For ALL and ANY subplans, we will be
272          * able to stop evaluating if the test condition fails, so very often not
273          * all the tuples will be retrieved; for lack of a better idea, specify
274          * 50% retrieval.  For EXPR and ROWCOMPARE subplans, use default behavior
275          * (we're only expecting one row out, anyway).
276          *
277          * NOTE: if you change these numbers, also change cost_qual_eval_walker()
278          * in path/costsize.c.
279          *
280          * XXX If an ALL/ANY subplan is uncorrelated, we may decide to hash or
281          * materialize its result below.  In that case it would've been better to
282          * specify full retrieval.      At present, however, we can only detect
283          * correlation or lack of it after we've made the subplan :-(. Perhaps
284          * detection of correlation should be done as a separate step. Meanwhile,
285          * we don't want to be too optimistic about the percentage of tuples
286          * retrieved, for fear of selecting a plan that's bad for the
287          * materialization case.
288          */
289         if (slink->subLinkType == EXISTS_SUBLINK)
290                 tuple_fraction = 1.0;   /* just like a LIMIT 1 */
291         else if (slink->subLinkType == ALL_SUBLINK ||
292                          slink->subLinkType == ANY_SUBLINK)
293                 tuple_fraction = 0.5;   /* 50% */
294         else
295                 tuple_fraction = 0.0;   /* default behavior */
296
297         /*
298          * Generate the plan for the subquery.
299          */
300         node->plan = plan = subquery_planner(subquery, tuple_fraction, NULL);
301
302         node->plan_id = PlannerPlanId++;        /* Assign unique ID to this SubPlan */
303
304         node->rtable = subquery->rtable;
305
306         /*
307          * Initialize other fields of the SubPlan node.
308          */
309         node->subLinkType = slink->subLinkType;
310         node->testexpr = NULL;
311         node->paramIds = NIL;
312         node->useHashTable = false;
313         /* At top level of a qual, can treat UNKNOWN the same as FALSE */
314         node->unknownEqFalse = isTopQual;
315         node->setParam = NIL;
316         node->parParam = NIL;
317         node->args = NIL;
318
319         /*
320          * Make parParam list of params that current query level will pass to this
321          * child plan.
322          */
323         tmpset = bms_copy(plan->extParam);
324         while ((paramid = bms_first_member(tmpset)) >= 0)
325         {
326                 PlannerParamItem *pitem = list_nth(PlannerParamList, paramid);
327
328                 if (pitem->abslevel == PlannerQueryLevel)
329                         node->parParam = lappend_int(node->parParam, paramid);
330         }
331         bms_free(tmpset);
332
333         /*
334          * Un-correlated or undirect correlated plans of EXISTS, EXPR, ARRAY, or
335          * ROWCOMPARE types can be used as initPlans.  For EXISTS, EXPR, or ARRAY,
336          * we just produce a Param referring to the result of evaluating the
337          * initPlan.  For ROWCOMPARE, we must modify the testexpr tree to contain
338          * PARAM_EXEC Params instead of the PARAM_SUBLINK Params emitted by the
339          * parser.
340          */
341         if (node->parParam == NIL && slink->subLinkType == EXISTS_SUBLINK)
342         {
343                 Param      *prm;
344
345                 prm = generate_new_param(BOOLOID, -1);
346                 node->setParam = list_make1_int(prm->paramid);
347                 PlannerInitPlan = lappend(PlannerInitPlan, node);
348                 result = (Node *) prm;
349         }
350         else if (node->parParam == NIL && slink->subLinkType == EXPR_SUBLINK)
351         {
352                 TargetEntry *te = linitial(plan->targetlist);
353                 Param      *prm;
354
355                 Assert(!te->resjunk);
356                 prm = generate_new_param(exprType((Node *) te->expr),
357                                                                  exprTypmod((Node *) te->expr));
358                 node->setParam = list_make1_int(prm->paramid);
359                 PlannerInitPlan = lappend(PlannerInitPlan, node);
360                 result = (Node *) prm;
361         }
362         else if (node->parParam == NIL && slink->subLinkType == ARRAY_SUBLINK)
363         {
364                 TargetEntry *te = linitial(plan->targetlist);
365                 Oid                     arraytype;
366                 Param      *prm;
367
368                 Assert(!te->resjunk);
369                 arraytype = get_array_type(exprType((Node *) te->expr));
370                 if (!OidIsValid(arraytype))
371                         elog(ERROR, "could not find array type for datatype %s",
372                                  format_type_be(exprType((Node *) te->expr)));
373                 prm = generate_new_param(arraytype, exprTypmod((Node *) te->expr));
374                 node->setParam = list_make1_int(prm->paramid);
375                 PlannerInitPlan = lappend(PlannerInitPlan, node);
376                 result = (Node *) prm;
377         }
378         else if (node->parParam == NIL && slink->subLinkType == ROWCOMPARE_SUBLINK)
379         {
380                 /* Adjust the Params */
381                 result = convert_testexpr(testexpr,
382                                                                   0,
383                                                                   &node->paramIds);
384                 node->setParam = list_copy(node->paramIds);
385                 PlannerInitPlan = lappend(PlannerInitPlan, node);
386
387                 /*
388                  * The executable expression is returned to become part of the outer
389                  * plan's expression tree; it is not kept in the initplan node.
390                  */
391         }
392         else
393         {
394                 List       *args;
395                 ListCell   *l;
396
397                 /* Adjust the Params */
398                 node->testexpr = convert_testexpr(testexpr,
399                                                                                   0,
400                                                                                   &node->paramIds);
401
402                 /*
403                  * We can't convert subplans of ALL_SUBLINK or ANY_SUBLINK types to
404                  * initPlans, even when they are uncorrelated or undirect correlated,
405                  * because we need to scan the output of the subplan for each outer
406                  * tuple.  But if it's an IN (= ANY) test, we might be able to use a
407                  * hashtable to avoid comparing all the tuples.
408                  */
409                 if (subplan_is_hashable(slink, node))
410                         node->useHashTable = true;
411
412                 /*
413                  * Otherwise, we have the option to tack a MATERIAL node onto the top
414                  * of the subplan, to reduce the cost of reading it repeatedly.  This
415                  * is pointless for a direct-correlated subplan, since we'd have to
416                  * recompute its results each time anyway.      For uncorrelated/undirect
417                  * correlated subplans, we add MATERIAL unless the subplan's top plan
418                  * node would materialize its output anyway.
419                  */
420                 else if (node->parParam == NIL)
421                 {
422                         bool            use_material;
423
424                         switch (nodeTag(plan))
425                         {
426                                 case T_Material:
427                                 case T_FunctionScan:
428                                 case T_Sort:
429                                         use_material = false;
430                                         break;
431                                 default:
432                                         use_material = true;
433                                         break;
434                         }
435                         if (use_material)
436                                 node->plan = plan = materialize_finished_plan(plan);
437                 }
438
439                 /*
440                  * Make node->args from parParam.
441                  */
442                 args = NIL;
443                 foreach(l, node->parParam)
444                 {
445                         PlannerParamItem *pitem = list_nth(PlannerParamList, lfirst_int(l));
446
447                         /*
448                          * The Var or Aggref has already been adjusted to have the correct
449                          * varlevelsup or agglevelsup.  We probably don't even need to
450                          * copy it again, but be safe.
451                          */
452                         args = lappend(args, copyObject(pitem->item));
453                 }
454                 node->args = args;
455
456                 result = (Node *) node;
457         }
458
459         return result;
460 }
461
462 /*
463  * convert_testexpr: convert the testexpr given by the parser into
464  * actually executable form.  This entails replacing PARAM_SUBLINK Params
465  * with Params or Vars representing the results of the sub-select:
466  *
467  * If rtindex is 0, we build Params to represent the sub-select outputs.
468  * The paramids of the Params created are returned in the *righthandIds list.
469  *
470  * If rtindex is not 0, we build Vars using that rtindex as varno.      Copies
471  * of the Var nodes are returned in *righthandIds (this is a bit of a type
472  * cheat, but we can get away with it).
473  *
474  * The given testexpr has already been recursively processed by
475  * process_sublinks_mutator.  Hence it can no longer contain any
476  * PARAM_SUBLINK Params for lower SubLink nodes; we can safely assume that
477  * any we find are for our own level of SubLink.
478  */
479 static Node *
480 convert_testexpr(Node *testexpr,
481                                  int rtindex,
482                                  List **righthandIds)
483 {
484         Node       *result;
485         convert_testexpr_context context;
486
487         context.rtindex = rtindex;
488         context.righthandIds = NIL;
489         result = convert_testexpr_mutator(testexpr, &context);
490         *righthandIds = context.righthandIds;
491         return result;
492 }
493
494 static Node *
495 convert_testexpr_mutator(Node *node,
496                                                  convert_testexpr_context *context)
497 {
498         if (node == NULL)
499                 return NULL;
500         if (IsA(node, Param))
501         {
502                 Param      *param = (Param *) node;
503
504                 if (param->paramkind == PARAM_SUBLINK)
505                 {
506                         /*
507                          * We expect to encounter the Params in column-number sequence. We
508                          * could handle non-sequential order if necessary, but for now
509                          * there's no need.  (This is also a useful cross-check that we
510                          * aren't finding any unexpected Params.)
511                          */
512                         if (param->paramid != list_length(context->righthandIds) + 1)
513                                 elog(ERROR, "unexpected PARAM_SUBLINK ID: %d", param->paramid);
514
515                         if (context->rtindex)
516                         {
517                                 /* Make the Var node representing the subplan's result */
518                                 Var                *newvar;
519
520                                 newvar = makeVar(context->rtindex,
521                                                                  param->paramid,
522                                                                  param->paramtype,
523                                                                  param->paramtypmod,
524                                                                  0);
525
526                                 /*
527                                  * Copy it for caller.  NB: we need a copy to avoid having
528                                  * doubly-linked substructure in the modified parse tree.
529                                  */
530                                 context->righthandIds = lappend(context->righthandIds,
531                                                                                                 copyObject(newvar));
532                                 return (Node *) newvar;
533                         }
534                         else
535                         {
536                                 /* Make the Param node representing the subplan's result */
537                                 Param      *newparam;
538
539                                 newparam = generate_new_param(param->paramtype,
540                                                                                           param->paramtypmod);
541                                 /* Record its ID */
542                                 context->righthandIds = lappend_int(context->righthandIds,
543                                                                                                         newparam->paramid);
544                                 return (Node *) newparam;
545                         }
546                 }
547         }
548         return expression_tree_mutator(node,
549                                                                    convert_testexpr_mutator,
550                                                                    (void *) context);
551 }
552
553 /*
554  * subplan_is_hashable: decide whether we can implement a subplan by hashing
555  *
556  * Caution: the SubPlan node is not completely filled in yet.  We can rely
557  * on its plan and parParam fields, however.
558  */
559 static bool
560 subplan_is_hashable(SubLink *slink, SubPlan *node)
561 {
562         double          subquery_size;
563         ListCell   *l;
564
565         /*
566          * The sublink type must be "= ANY" --- that is, an IN operator.  We
567          * expect that the test expression will be either a single OpExpr, or an
568          * AND-clause containing OpExprs.  (If it's anything else then the parser
569          * must have determined that the operators have non-equality-like
570          * semantics.  In the OpExpr case we can't be sure what the operator's
571          * semantics are like, but the test below for hashability will reject
572          * anything that's not equality.)
573          */
574         if (slink->subLinkType != ANY_SUBLINK)
575                 return false;
576         if (slink->testexpr == NULL ||
577                 (!IsA(slink->testexpr, OpExpr) &&
578                  !and_clause(slink->testexpr)))
579                 return false;
580
581         /*
582          * The subplan must not have any direct correlation vars --- else we'd
583          * have to recompute its output each time, so that the hashtable wouldn't
584          * gain anything.
585          */
586         if (node->parParam != NIL)
587                 return false;
588
589         /*
590          * The estimated size of the subquery result must fit in work_mem. (Note:
591          * we use sizeof(HeapTupleHeaderData) here even though the tuples will
592          * actually be stored as MinimalTuples; this provides some fudge factor
593          * for hashtable overhead.)
594          */
595         subquery_size = node->plan->plan_rows *
596                 (MAXALIGN(node->plan->plan_width) + MAXALIGN(sizeof(HeapTupleHeaderData)));
597         if (subquery_size > work_mem * 1024L)
598                 return false;
599
600         /*
601          * The combining operators must be hashable, strict, and self-commutative.
602          * The need for hashability is obvious, since we want to use hashing.
603          * Without strictness, behavior in the presence of nulls is too
604          * unpredictable.  (We actually must assume even more than plain
605          * strictness, see nodeSubplan.c for details.)  And commutativity ensures
606          * that the left and right datatypes are the same; this allows us to
607          * assume that the combining operators are equality for the righthand
608          * datatype, so that they can be used to compare righthand tuples as well
609          * as comparing lefthand to righthand tuples.  (This last restriction
610          * could be relaxed by using two different sets of operators with the hash
611          * table, but there is no obvious usefulness to that at present.)
612          */
613         if (IsA(slink->testexpr, OpExpr))
614         {
615                 if (!hash_ok_operator((OpExpr *) slink->testexpr))
616                         return false;
617         }
618         else
619         {
620                 foreach(l, ((BoolExpr *) slink->testexpr)->args)
621                 {
622                         Node       *andarg = (Node *) lfirst(l);
623
624                         if (!IsA(andarg, OpExpr))
625                                 return false;   /* probably can't happen */
626                         if (!hash_ok_operator((OpExpr *) andarg))
627                                 return false;
628                 }
629         }
630
631         return true;
632 }
633
634 static bool
635 hash_ok_operator(OpExpr *expr)
636 {
637         Oid                     opid = expr->opno;
638         HeapTuple       tup;
639         Form_pg_operator optup;
640
641         tup = SearchSysCache(OPEROID,
642                                                  ObjectIdGetDatum(opid),
643                                                  0, 0, 0);
644         if (!HeapTupleIsValid(tup))
645                 elog(ERROR, "cache lookup failed for operator %u", opid);
646         optup = (Form_pg_operator) GETSTRUCT(tup);
647         if (!optup->oprcanhash || optup->oprcom != opid ||
648                 !func_strict(optup->oprcode))
649         {
650                 ReleaseSysCache(tup);
651                 return false;
652         }
653         ReleaseSysCache(tup);
654         return true;
655 }
656
657 /*
658  * convert_IN_to_join: can we convert an IN SubLink to join style?
659  *
660  * The caller has found a SubLink at the top level of WHERE, but has not
661  * checked the properties of the SubLink at all.  Decide whether it is
662  * appropriate to process this SubLink in join style.  If not, return NULL.
663  * If so, build the qual clause(s) to replace the SubLink, and return them.
664  *
665  * Side effects of a successful conversion include adding the SubLink's
666  * subselect to the query's rangetable and adding an InClauseInfo node to
667  * its in_info_list.
668  */
669 Node *
670 convert_IN_to_join(PlannerInfo *root, SubLink *sublink)
671 {
672         Query      *parse = root->parse;
673         Query      *subselect = (Query *) sublink->subselect;
674         Relids          left_varnos;
675         int                     rtindex;
676         RangeTblEntry *rte;
677         RangeTblRef *rtr;
678         InClauseInfo *ininfo;
679
680         /*
681          * The sublink type must be "= ANY" --- that is, an IN operator.  We
682          * expect that the test expression will be either a single OpExpr, or an
683          * AND-clause containing OpExprs.  (If it's anything else then the parser
684          * must have determined that the operators have non-equality-like
685          * semantics.  In the OpExpr case we can't be sure what the operator's
686          * semantics are like, and must check for ourselves.)
687          */
688         if (sublink->subLinkType != ANY_SUBLINK)
689                 return NULL;
690         if (sublink->testexpr && IsA(sublink->testexpr, OpExpr))
691         {
692                 List       *opfamilies;
693                 List       *opstrats;
694
695                 get_op_btree_interpretation(((OpExpr *) sublink->testexpr)->opno,
696                                                                         &opfamilies, &opstrats);
697                 if (!list_member_int(opstrats, ROWCOMPARE_EQ))
698                         return NULL;
699         }
700         else if (!and_clause(sublink->testexpr))
701                 return NULL;
702
703         /*
704          * The sub-select must not refer to any Vars of the parent query. (Vars of
705          * higher levels should be okay, though.)
706          */
707         if (contain_vars_of_level((Node *) subselect, 1))
708                 return NULL;
709
710         /*
711          * The left-hand expressions must contain some Vars of the current query,
712          * else it's not gonna be a join.
713          */
714         left_varnos = pull_varnos(sublink->testexpr);
715         if (bms_is_empty(left_varnos))
716                 return NULL;
717
718         /*
719          * The combining operators and left-hand expressions mustn't be volatile.
720          */
721         if (contain_volatile_functions(sublink->testexpr))
722                 return NULL;
723
724         /*
725          * Okay, pull up the sub-select into top range table and jointree.
726          *
727          * We rely here on the assumption that the outer query has no references
728          * to the inner (necessarily true, other than the Vars that we build
729          * below). Therefore this is a lot easier than what pull_up_subqueries has
730          * to go through.
731          */
732         rte = addRangeTableEntryForSubquery(NULL,
733                                                                                 subselect,
734                                                                                 makeAlias("IN_subquery", NIL),
735                                                                                 false);
736         parse->rtable = lappend(parse->rtable, rte);
737         rtindex = list_length(parse->rtable);
738         rtr = makeNode(RangeTblRef);
739         rtr->rtindex = rtindex;
740         parse->jointree->fromlist = lappend(parse->jointree->fromlist, rtr);
741
742         /*
743          * Now build the InClauseInfo node.
744          */
745         ininfo = makeNode(InClauseInfo);
746         ininfo->lefthand = left_varnos;
747         ininfo->righthand = bms_make_singleton(rtindex);
748         root->in_info_list = lappend(root->in_info_list, ininfo);
749
750         /*
751          * Build the result qual expression.  As a side effect,
752          * ininfo->sub_targetlist is filled with a list of Vars representing the
753          * subselect outputs.
754          */
755         return convert_testexpr(sublink->testexpr,
756                                                         rtindex,
757                                                         &ininfo->sub_targetlist);
758 }
759
760 /*
761  * Replace correlation vars (uplevel vars) with Params.
762  *
763  * Uplevel aggregates are replaced, too.
764  *
765  * Note: it is critical that this runs immediately after SS_process_sublinks.
766  * Since we do not recurse into the arguments of uplevel aggregates, they will
767  * get copied to the appropriate subplan args list in the parent query with
768  * uplevel vars not replaced by Params, but only adjusted in level (see
769  * replace_outer_agg).  That's exactly what we want for the vars of the parent
770  * level --- but if an aggregate's argument contains any further-up variables,
771  * they have to be replaced with Params in their turn.  That will happen when
772  * the parent level runs SS_replace_correlation_vars.  Therefore it must do
773  * so after expanding its sublinks to subplans.  And we don't want any steps
774  * in between, else those steps would never get applied to the aggregate
775  * argument expressions, either in the parent or the child level.
776  */
777 Node *
778 SS_replace_correlation_vars(Node *expr)
779 {
780         /* No setup needed for tree walk, so away we go */
781         return replace_correlation_vars_mutator(expr, NULL);
782 }
783
784 static Node *
785 replace_correlation_vars_mutator(Node *node, void *context)
786 {
787         if (node == NULL)
788                 return NULL;
789         if (IsA(node, Var))
790         {
791                 if (((Var *) node)->varlevelsup > 0)
792                         return (Node *) replace_outer_var((Var *) node);
793         }
794         if (IsA(node, Aggref))
795         {
796                 if (((Aggref *) node)->agglevelsup > 0)
797                         return (Node *) replace_outer_agg((Aggref *) node);
798         }
799         return expression_tree_mutator(node,
800                                                                    replace_correlation_vars_mutator,
801                                                                    context);
802 }
803
804 /*
805  * Expand SubLinks to SubPlans in the given expression.
806  *
807  * The isQual argument tells whether or not this expression is a WHERE/HAVING
808  * qualifier expression.  If it is, any sublinks appearing at top level need
809  * not distinguish FALSE from UNKNOWN return values.
810  */
811 Node *
812 SS_process_sublinks(Node *expr, bool isQual)
813 {
814         /* The only context needed is the initial are-we-in-a-qual flag */
815         return process_sublinks_mutator(expr, &isQual);
816 }
817
818 static Node *
819 process_sublinks_mutator(Node *node, bool *isTopQual)
820 {
821         bool            locTopQual;
822
823         if (node == NULL)
824                 return NULL;
825         if (IsA(node, SubLink))
826         {
827                 SubLink    *sublink = (SubLink *) node;
828                 Node       *testexpr;
829
830                 /*
831                  * First, recursively process the lefthand-side expressions, if any.
832                  */
833                 locTopQual = false;
834                 testexpr = process_sublinks_mutator(sublink->testexpr, &locTopQual);
835
836                 /*
837                  * Now build the SubPlan node and make the expr to return.
838                  */
839                 return make_subplan(sublink, testexpr, *isTopQual);
840         }
841
842         /*
843          * We should never see a SubPlan expression in the input (since this is
844          * the very routine that creates 'em to begin with).  We shouldn't find
845          * ourselves invoked directly on a Query, either.
846          */
847         Assert(!is_subplan(node));
848         Assert(!IsA(node, Query));
849
850         /*
851          * Because make_subplan() could return an AND or OR clause, we have to
852          * take steps to preserve AND/OR flatness of a qual.  We assume the input
853          * has been AND/OR flattened and so we need no recursion here.
854          *
855          * If we recurse down through anything other than an AND node, we are
856          * definitely not at top qual level anymore.  (Due to the coding here, we
857          * will not get called on the List subnodes of an AND, so no check is
858          * needed for List.)
859          */
860         if (and_clause(node))
861         {
862                 List       *newargs = NIL;
863                 ListCell   *l;
864
865                 /* Still at qual top-level */
866                 locTopQual = *isTopQual;
867
868                 foreach(l, ((BoolExpr *) node)->args)
869                 {
870                         Node       *newarg;
871
872                         newarg = process_sublinks_mutator(lfirst(l),
873                                                                                           (void *) &locTopQual);
874                         if (and_clause(newarg))
875                                 newargs = list_concat(newargs, ((BoolExpr *) newarg)->args);
876                         else
877                                 newargs = lappend(newargs, newarg);
878                 }
879                 return (Node *) make_andclause(newargs);
880         }
881
882         /* otherwise not at qual top-level */
883         locTopQual = false;
884
885         if (or_clause(node))
886         {
887                 List       *newargs = NIL;
888                 ListCell   *l;
889
890                 foreach(l, ((BoolExpr *) node)->args)
891                 {
892                         Node       *newarg;
893
894                         newarg = process_sublinks_mutator(lfirst(l),
895                                                                                           (void *) &locTopQual);
896                         if (or_clause(newarg))
897                                 newargs = list_concat(newargs, ((BoolExpr *) newarg)->args);
898                         else
899                                 newargs = lappend(newargs, newarg);
900                 }
901                 return (Node *) make_orclause(newargs);
902         }
903
904         return expression_tree_mutator(node,
905                                                                    process_sublinks_mutator,
906                                                                    (void *) &locTopQual);
907 }
908
909 /*
910  * SS_finalize_plan - do final sublink processing for a completed Plan.
911  *
912  * This recursively computes the extParam and allParam sets for every Plan
913  * node in the given plan tree.  It also attaches any generated InitPlans
914  * to the top plan node.
915  */
916 void
917 SS_finalize_plan(Plan *plan, List *rtable)
918 {
919         Bitmapset  *outer_params,
920                            *valid_params,
921                            *initExtParam,
922                            *initSetParam;
923         Cost            initplan_cost;
924         int                     paramid;
925         ListCell   *l;
926
927         /*
928          * First, scan the param list to discover the sets of params that are
929          * available from outer query levels and my own query level. We do this
930          * once to save time in the per-plan recursion steps.
931          */
932         outer_params = valid_params = NULL;
933         paramid = 0;
934         foreach(l, PlannerParamList)
935         {
936                 PlannerParamItem *pitem = (PlannerParamItem *) lfirst(l);
937
938                 if (pitem->abslevel < PlannerQueryLevel)
939                 {
940                         /* valid outer-level parameter */
941                         outer_params = bms_add_member(outer_params, paramid);
942                         valid_params = bms_add_member(valid_params, paramid);
943                 }
944                 else if (pitem->abslevel == PlannerQueryLevel &&
945                                  IsA(pitem->item, Param))
946                 {
947                         /* valid local parameter (i.e., a setParam of my child) */
948                         valid_params = bms_add_member(valid_params, paramid);
949                 }
950
951                 paramid++;
952         }
953
954         /*
955          * Now recurse through plan tree.
956          */
957         (void) finalize_plan(plan, rtable, outer_params, valid_params);
958
959         bms_free(outer_params);
960         bms_free(valid_params);
961
962         /*
963          * Finally, attach any initPlans to the topmost plan node, and add their
964          * extParams to the topmost node's, too.  However, any setParams of the
965          * initPlans should not be present in the topmost node's extParams, only
966          * in its allParams.  (As of PG 8.1, it's possible that some initPlans
967          * have extParams that are setParams of other initPlans, so we have to
968          * take care of this situation explicitly.)
969          *
970          * We also add the total_cost of each initPlan to the startup cost of the
971          * top node.  This is a conservative overestimate, since in fact each
972          * initPlan might be executed later than plan startup, or even not at all.
973          */
974         plan->initPlan = PlannerInitPlan;
975         PlannerInitPlan = NIL;          /* make sure they're not attached twice */
976
977         initExtParam = initSetParam = NULL;
978         initplan_cost = 0;
979         foreach(l, plan->initPlan)
980         {
981                 SubPlan    *initplan = (SubPlan *) lfirst(l);
982                 ListCell   *l2;
983
984                 initExtParam = bms_add_members(initExtParam,
985                                                                            initplan->plan->extParam);
986                 foreach(l2, initplan->setParam)
987                 {
988                         initSetParam = bms_add_member(initSetParam, lfirst_int(l2));
989                 }
990                 initplan_cost += initplan->plan->total_cost;
991         }
992         /* allParam must include all these params */
993         plan->allParam = bms_add_members(plan->allParam, initExtParam);
994         plan->allParam = bms_add_members(plan->allParam, initSetParam);
995         /* but extParam shouldn't include any setParams */
996         initExtParam = bms_del_members(initExtParam, initSetParam);
997         /* empty test ensures extParam is exactly NULL if it's empty */
998         if (!bms_is_empty(initExtParam))
999                 plan->extParam = bms_join(plan->extParam, initExtParam);
1000
1001         plan->startup_cost += initplan_cost;
1002         plan->total_cost += initplan_cost;
1003 }
1004
1005 /*
1006  * Recursive processing of all nodes in the plan tree
1007  *
1008  * The return value is the computed allParam set for the given Plan node.
1009  * This is just an internal notational convenience.
1010  */
1011 static Bitmapset *
1012 finalize_plan(Plan *plan, List *rtable,
1013                           Bitmapset *outer_params, Bitmapset *valid_params)
1014 {
1015         finalize_primnode_context context;
1016
1017         if (plan == NULL)
1018                 return NULL;
1019
1020         context.paramids = NULL;        /* initialize set to empty */
1021         context.outer_params = outer_params;
1022
1023         /*
1024          * When we call finalize_primnode, context.paramids sets are automatically
1025          * merged together.  But when recursing to self, we have to do it the hard
1026          * way.  We want the paramids set to include params in subplans as well as
1027          * at this level.
1028          */
1029
1030         /* Find params in targetlist and qual */
1031         finalize_primnode((Node *) plan->targetlist, &context);
1032         finalize_primnode((Node *) plan->qual, &context);
1033
1034         /* Check additional node-type-specific fields */
1035         switch (nodeTag(plan))
1036         {
1037                 case T_Result:
1038                         finalize_primnode(((Result *) plan)->resconstantqual,
1039                                                           &context);
1040                         break;
1041
1042                 case T_IndexScan:
1043                         finalize_primnode((Node *) ((IndexScan *) plan)->indexqual,
1044                                                           &context);
1045
1046                         /*
1047                          * we need not look at indexqualorig, since it will have the same
1048                          * param references as indexqual.
1049                          */
1050                         break;
1051
1052                 case T_BitmapIndexScan:
1053                         finalize_primnode((Node *) ((BitmapIndexScan *) plan)->indexqual,
1054                                                           &context);
1055
1056                         /*
1057                          * we need not look at indexqualorig, since it will have the same
1058                          * param references as indexqual.
1059                          */
1060                         break;
1061
1062                 case T_BitmapHeapScan:
1063                         finalize_primnode((Node *) ((BitmapHeapScan *) plan)->bitmapqualorig,
1064                                                           &context);
1065                         break;
1066
1067                 case T_TidScan:
1068                         finalize_primnode((Node *) ((TidScan *) plan)->tidquals,
1069                                                           &context);
1070                         break;
1071
1072                 case T_SubqueryScan:
1073
1074                         /*
1075                          * In a SubqueryScan, SS_finalize_plan has already been run on the
1076                          * subplan by the inner invocation of subquery_planner, so there's
1077                          * no need to do it again.      Instead, just pull out the subplan's
1078                          * extParams list, which represents the params it needs from my
1079                          * level and higher levels.
1080                          */
1081                         context.paramids = bms_add_members(context.paramids,
1082                                                                  ((SubqueryScan *) plan)->subplan->extParam);
1083                         break;
1084
1085                 case T_FunctionScan:
1086                         {
1087                                 RangeTblEntry *rte;
1088
1089                                 rte = rt_fetch(((FunctionScan *) plan)->scan.scanrelid,
1090                                                            rtable);
1091                                 Assert(rte->rtekind == RTE_FUNCTION);
1092                                 finalize_primnode(rte->funcexpr, &context);
1093                         }
1094                         break;
1095
1096                 case T_ValuesScan:
1097                         {
1098                                 RangeTblEntry *rte;
1099
1100                                 rte = rt_fetch(((ValuesScan *) plan)->scan.scanrelid,
1101                                                            rtable);
1102                                 Assert(rte->rtekind == RTE_VALUES);
1103                                 finalize_primnode((Node *) rte->values_lists, &context);
1104                         }
1105                         break;
1106
1107                 case T_Append:
1108                         {
1109                                 ListCell   *l;
1110
1111                                 foreach(l, ((Append *) plan)->appendplans)
1112                                 {
1113                                         context.paramids =
1114                                                 bms_add_members(context.paramids,
1115                                                                                 finalize_plan((Plan *) lfirst(l),
1116                                                                                                           rtable,
1117                                                                                                           outer_params,
1118                                                                                                           valid_params));
1119                                 }
1120                         }
1121                         break;
1122
1123                 case T_BitmapAnd:
1124                         {
1125                                 ListCell   *l;
1126
1127                                 foreach(l, ((BitmapAnd *) plan)->bitmapplans)
1128                                 {
1129                                         context.paramids =
1130                                                 bms_add_members(context.paramids,
1131                                                                                 finalize_plan((Plan *) lfirst(l),
1132                                                                                                           rtable,
1133                                                                                                           outer_params,
1134                                                                                                           valid_params));
1135                                 }
1136                         }
1137                         break;
1138
1139                 case T_BitmapOr:
1140                         {
1141                                 ListCell   *l;
1142
1143                                 foreach(l, ((BitmapOr *) plan)->bitmapplans)
1144                                 {
1145                                         context.paramids =
1146                                                 bms_add_members(context.paramids,
1147                                                                                 finalize_plan((Plan *) lfirst(l),
1148                                                                                                           rtable,
1149                                                                                                           outer_params,
1150                                                                                                           valid_params));
1151                                 }
1152                         }
1153                         break;
1154
1155                 case T_NestLoop:
1156                         finalize_primnode((Node *) ((Join *) plan)->joinqual,
1157                                                           &context);
1158                         break;
1159
1160                 case T_MergeJoin:
1161                         finalize_primnode((Node *) ((Join *) plan)->joinqual,
1162                                                           &context);
1163                         finalize_primnode((Node *) ((MergeJoin *) plan)->mergeclauses,
1164                                                           &context);
1165                         break;
1166
1167                 case T_HashJoin:
1168                         finalize_primnode((Node *) ((Join *) plan)->joinqual,
1169                                                           &context);
1170                         finalize_primnode((Node *) ((HashJoin *) plan)->hashclauses,
1171                                                           &context);
1172                         break;
1173
1174                 case T_Limit:
1175                         finalize_primnode(((Limit *) plan)->limitOffset,
1176                                                           &context);
1177                         finalize_primnode(((Limit *) plan)->limitCount,
1178                                                           &context);
1179                         break;
1180
1181                 case T_Hash:
1182                 case T_Agg:
1183                 case T_SeqScan:
1184                 case T_Material:
1185                 case T_Sort:
1186                 case T_Unique:
1187                 case T_SetOp:
1188                 case T_Group:
1189                         break;
1190
1191                 default:
1192                         elog(ERROR, "unrecognized node type: %d",
1193                                  (int) nodeTag(plan));
1194         }
1195
1196         /* Process left and right child plans, if any */
1197         context.paramids = bms_add_members(context.paramids,
1198                                                                            finalize_plan(plan->lefttree,
1199                                                                                                          rtable,
1200                                                                                                          outer_params,
1201                                                                                                          valid_params));
1202
1203         context.paramids = bms_add_members(context.paramids,
1204                                                                            finalize_plan(plan->righttree,
1205                                                                                                          rtable,
1206                                                                                                          outer_params,
1207                                                                                                          valid_params));
1208
1209         /* Now we have all the paramids */
1210
1211         if (!bms_is_subset(context.paramids, valid_params))
1212                 elog(ERROR, "plan should not reference subplan's variable");
1213
1214         plan->extParam = bms_intersect(context.paramids, outer_params);
1215         plan->allParam = context.paramids;
1216
1217         /*
1218          * For speed at execution time, make sure extParam/allParam are actually
1219          * NULL if they are empty sets.
1220          */
1221         if (bms_is_empty(plan->extParam))
1222         {
1223                 bms_free(plan->extParam);
1224                 plan->extParam = NULL;
1225         }
1226         if (bms_is_empty(plan->allParam))
1227         {
1228                 bms_free(plan->allParam);
1229                 plan->allParam = NULL;
1230         }
1231
1232         return plan->allParam;
1233 }
1234
1235 /*
1236  * finalize_primnode: add IDs of all PARAM_EXEC params appearing in the given
1237  * expression tree to the result set.
1238  */
1239 static bool
1240 finalize_primnode(Node *node, finalize_primnode_context *context)
1241 {
1242         if (node == NULL)
1243                 return false;
1244         if (IsA(node, Param))
1245         {
1246                 if (((Param *) node)->paramkind == PARAM_EXEC)
1247                 {
1248                         int                     paramid = ((Param *) node)->paramid;
1249
1250                         context->paramids = bms_add_member(context->paramids, paramid);
1251                 }
1252                 return false;                   /* no more to do here */
1253         }
1254         if (is_subplan(node))
1255         {
1256                 SubPlan    *subplan = (SubPlan *) node;
1257
1258                 /* Add outer-level params needed by the subplan to paramids */
1259                 context->paramids = bms_join(context->paramids,
1260                                                                          bms_intersect(subplan->plan->extParam,
1261                                                                                                    context->outer_params));
1262                 /* fall through to recurse into subplan args */
1263         }
1264         return expression_tree_walker(node, finalize_primnode,
1265                                                                   (void *) context);
1266 }
1267
1268 /*
1269  * SS_make_initplan_from_plan - given a plan tree, make it an InitPlan
1270  *
1271  * The plan is expected to return a scalar value of the indicated type.
1272  * We build an EXPR_SUBLINK SubPlan node and put it into the initplan
1273  * list for the current query level.  A Param that represents the initplan's
1274  * output is returned.
1275  *
1276  * We assume the plan hasn't been put through SS_finalize_plan.
1277  */
1278 Param *
1279 SS_make_initplan_from_plan(PlannerInfo *root, Plan *plan,
1280                                                    Oid resulttype, int32 resulttypmod)
1281 {
1282         List       *saved_initplan = PlannerInitPlan;
1283         SubPlan    *node;
1284         Param      *prm;
1285
1286         /*
1287          * Set up for a new level of subquery.  This is just to keep
1288          * SS_finalize_plan from becoming confused.
1289          */
1290         PlannerQueryLevel++;
1291         PlannerInitPlan = NIL;
1292
1293         /*
1294          * Build extParam/allParam sets for plan nodes.
1295          */
1296         SS_finalize_plan(plan, root->parse->rtable);
1297
1298         /* Return to outer subquery context */
1299         PlannerQueryLevel--;
1300         PlannerInitPlan = saved_initplan;
1301
1302         /*
1303          * Create a SubPlan node and add it to the outer list of InitPlans.
1304          */
1305         node = makeNode(SubPlan);
1306         node->subLinkType = EXPR_SUBLINK;
1307         node->plan = plan;
1308         node->plan_id = PlannerPlanId++;        /* Assign unique ID to this SubPlan */
1309
1310         node->rtable = root->parse->rtable;
1311
1312         PlannerInitPlan = lappend(PlannerInitPlan, node);
1313
1314         /*
1315          * The node can't have any inputs (since it's an initplan), so the
1316          * parParam and args lists remain empty.
1317          */
1318
1319         /*
1320          * Make a Param that will be the subplan's output.
1321          */
1322         prm = generate_new_param(resulttype, resulttypmod);
1323         node->setParam = list_make1_int(prm->paramid);
1324
1325         return prm;
1326 }