]> granicus.if.org Git - postgresql/blob - src/backend/optimizer/plan/createplan.c
Split the processing of INSERT/UPDATE/DELETE operations out of execMain.c.
[postgresql] / src / backend / optimizer / plan / createplan.c
1 /*-------------------------------------------------------------------------
2  *
3  * createplan.c
4  *        Routines to create the desired plan for processing a query.
5  *        Planning is complete, we just need to convert the selected
6  *        Path into a Plan.
7  *
8  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
9  * Portions Copyright (c) 1994, Regents of the University of California
10  *
11  *
12  * IDENTIFICATION
13  *        $PostgreSQL: pgsql/src/backend/optimizer/plan/createplan.c,v 1.264 2009/10/10 01:43:49 tgl Exp $
14  *
15  *-------------------------------------------------------------------------
16  */
17 #include "postgres.h"
18
19 #include <limits.h>
20 #include <math.h>
21
22 #include "access/skey.h"
23 #include "nodes/makefuncs.h"
24 #include "nodes/nodeFuncs.h"
25 #include "optimizer/clauses.h"
26 #include "optimizer/cost.h"
27 #include "optimizer/plancat.h"
28 #include "optimizer/planmain.h"
29 #include "optimizer/predtest.h"
30 #include "optimizer/restrictinfo.h"
31 #include "optimizer/tlist.h"
32 #include "optimizer/var.h"
33 #include "parser/parse_clause.h"
34 #include "parser/parsetree.h"
35 #include "utils/lsyscache.h"
36
37
38 static Plan *create_scan_plan(PlannerInfo *root, Path *best_path);
39 static List *build_relation_tlist(RelOptInfo *rel);
40 static bool use_physical_tlist(PlannerInfo *root, RelOptInfo *rel);
41 static void disuse_physical_tlist(Plan *plan, Path *path);
42 static Plan *create_gating_plan(PlannerInfo *root, Plan *plan, List *quals);
43 static Plan *create_join_plan(PlannerInfo *root, JoinPath *best_path);
44 static Plan *create_append_plan(PlannerInfo *root, AppendPath *best_path);
45 static Result *create_result_plan(PlannerInfo *root, ResultPath *best_path);
46 static Material *create_material_plan(PlannerInfo *root, MaterialPath *best_path);
47 static Plan *create_unique_plan(PlannerInfo *root, UniquePath *best_path);
48 static SeqScan *create_seqscan_plan(PlannerInfo *root, Path *best_path,
49                                         List *tlist, List *scan_clauses);
50 static IndexScan *create_indexscan_plan(PlannerInfo *root, IndexPath *best_path,
51                                           List *tlist, List *scan_clauses);
52 static BitmapHeapScan *create_bitmap_scan_plan(PlannerInfo *root,
53                                                 BitmapHeapPath *best_path,
54                                                 List *tlist, List *scan_clauses);
55 static Plan *create_bitmap_subplan(PlannerInfo *root, Path *bitmapqual,
56                                           List **qual, List **indexqual);
57 static TidScan *create_tidscan_plan(PlannerInfo *root, TidPath *best_path,
58                                         List *tlist, List *scan_clauses);
59 static SubqueryScan *create_subqueryscan_plan(PlannerInfo *root, Path *best_path,
60                                                  List *tlist, List *scan_clauses);
61 static FunctionScan *create_functionscan_plan(PlannerInfo *root, Path *best_path,
62                                                  List *tlist, List *scan_clauses);
63 static ValuesScan *create_valuesscan_plan(PlannerInfo *root, Path *best_path,
64                                            List *tlist, List *scan_clauses);
65 static CteScan *create_ctescan_plan(PlannerInfo *root, Path *best_path,
66                                         List *tlist, List *scan_clauses);
67 static WorkTableScan *create_worktablescan_plan(PlannerInfo *root, Path *best_path,
68                                                   List *tlist, List *scan_clauses);
69 static NestLoop *create_nestloop_plan(PlannerInfo *root, NestPath *best_path,
70                                          Plan *outer_plan, Plan *inner_plan);
71 static MergeJoin *create_mergejoin_plan(PlannerInfo *root, MergePath *best_path,
72                                           Plan *outer_plan, Plan *inner_plan);
73 static HashJoin *create_hashjoin_plan(PlannerInfo *root, HashPath *best_path,
74                                          Plan *outer_plan, Plan *inner_plan);
75 static List *fix_indexqual_references(List *indexquals, IndexPath *index_path);
76 static Node *fix_indexqual_operand(Node *node, IndexOptInfo *index);
77 static List *get_switched_clauses(List *clauses, Relids outerrelids);
78 static List *order_qual_clauses(PlannerInfo *root, List *clauses);
79 static void copy_path_costsize(Plan *dest, Path *src);
80 static void copy_plan_costsize(Plan *dest, Plan *src);
81 static SeqScan *make_seqscan(List *qptlist, List *qpqual, Index scanrelid);
82 static IndexScan *make_indexscan(List *qptlist, List *qpqual, Index scanrelid,
83                            Oid indexid, List *indexqual, List *indexqualorig,
84                            ScanDirection indexscandir);
85 static BitmapIndexScan *make_bitmap_indexscan(Index scanrelid, Oid indexid,
86                                           List *indexqual,
87                                           List *indexqualorig);
88 static BitmapHeapScan *make_bitmap_heapscan(List *qptlist,
89                                          List *qpqual,
90                                          Plan *lefttree,
91                                          List *bitmapqualorig,
92                                          Index scanrelid);
93 static TidScan *make_tidscan(List *qptlist, List *qpqual, Index scanrelid,
94                          List *tidquals);
95 static FunctionScan *make_functionscan(List *qptlist, List *qpqual,
96                                   Index scanrelid, Node *funcexpr, List *funccolnames,
97                                   List *funccoltypes, List *funccoltypmods);
98 static ValuesScan *make_valuesscan(List *qptlist, List *qpqual,
99                                 Index scanrelid, List *values_lists);
100 static CteScan *make_ctescan(List *qptlist, List *qpqual,
101                          Index scanrelid, int ctePlanId, int cteParam);
102 static WorkTableScan *make_worktablescan(List *qptlist, List *qpqual,
103                                    Index scanrelid, int wtParam);
104 static BitmapAnd *make_bitmap_and(List *bitmapplans);
105 static BitmapOr *make_bitmap_or(List *bitmapplans);
106 static NestLoop *make_nestloop(List *tlist,
107                           List *joinclauses, List *otherclauses,
108                           Plan *lefttree, Plan *righttree,
109                           JoinType jointype);
110 static HashJoin *make_hashjoin(List *tlist,
111                           List *joinclauses, List *otherclauses,
112                           List *hashclauses,
113                           Plan *lefttree, Plan *righttree,
114                           JoinType jointype);
115 static Hash *make_hash(Plan *lefttree,
116                   Oid skewTable,
117                   AttrNumber skewColumn,
118                   Oid skewColType,
119                   int32 skewColTypmod);
120 static MergeJoin *make_mergejoin(List *tlist,
121                            List *joinclauses, List *otherclauses,
122                            List *mergeclauses,
123                            Oid *mergefamilies,
124                            int *mergestrategies,
125                            bool *mergenullsfirst,
126                            Plan *lefttree, Plan *righttree,
127                            JoinType jointype);
128 static Sort *make_sort(PlannerInfo *root, Plan *lefttree, int numCols,
129                   AttrNumber *sortColIdx, Oid *sortOperators, bool *nullsFirst,
130                   double limit_tuples);
131 static Material *make_material(Plan *lefttree);
132
133
134 /*
135  * create_plan
136  *        Creates the access plan for a query by tracing backwards through the
137  *        desired chain of pathnodes, starting at the node 'best_path'.  For
138  *        every pathnode found, we create a corresponding plan node containing
139  *        appropriate id, target list, and qualification information.
140  *
141  *        The tlists and quals in the plan tree are still in planner format,
142  *        ie, Vars still correspond to the parser's numbering.  This will be
143  *        fixed later by setrefs.c.
144  *
145  *        best_path is the best access path
146  *
147  *        Returns a Plan tree.
148  */
149 Plan *
150 create_plan(PlannerInfo *root, Path *best_path)
151 {
152         Plan       *plan;
153
154         switch (best_path->pathtype)
155         {
156                 case T_SeqScan:
157                 case T_IndexScan:
158                 case T_BitmapHeapScan:
159                 case T_TidScan:
160                 case T_SubqueryScan:
161                 case T_FunctionScan:
162                 case T_ValuesScan:
163                 case T_CteScan:
164                 case T_WorkTableScan:
165                         plan = create_scan_plan(root, best_path);
166                         break;
167                 case T_Join:
168                         /* this is only used for no-op joins */
169                         Assert(IsA(best_path, NoOpPath));
170                         plan = create_plan(root, ((NoOpPath *) best_path)->subpath);
171                         break;
172                 case T_HashJoin:
173                 case T_MergeJoin:
174                 case T_NestLoop:
175                         plan = create_join_plan(root,
176                                                                         (JoinPath *) best_path);
177                         break;
178                 case T_Append:
179                         plan = create_append_plan(root,
180                                                                           (AppendPath *) best_path);
181                         break;
182                 case T_Result:
183                         plan = (Plan *) create_result_plan(root,
184                                                                                            (ResultPath *) best_path);
185                         break;
186                 case T_Material:
187                         plan = (Plan *) create_material_plan(root,
188                                                                                                  (MaterialPath *) best_path);
189                         break;
190                 case T_Unique:
191                         plan = create_unique_plan(root,
192                                                                           (UniquePath *) best_path);
193                         break;
194                 default:
195                         elog(ERROR, "unrecognized node type: %d",
196                                  (int) best_path->pathtype);
197                         plan = NULL;            /* keep compiler quiet */
198                         break;
199         }
200
201         return plan;
202 }
203
204 /*
205  * create_scan_plan
206  *       Create a scan plan for the parent relation of 'best_path'.
207  */
208 static Plan *
209 create_scan_plan(PlannerInfo *root, Path *best_path)
210 {
211         RelOptInfo *rel = best_path->parent;
212         List       *tlist;
213         List       *scan_clauses;
214         Plan       *plan;
215
216         /*
217          * For table scans, rather than using the relation targetlist (which is
218          * only those Vars actually needed by the query), we prefer to generate a
219          * tlist containing all Vars in order.  This will allow the executor to
220          * optimize away projection of the table tuples, if possible.  (Note that
221          * planner.c may replace the tlist we generate here, forcing projection to
222          * occur.)
223          */
224         if (use_physical_tlist(root, rel))
225         {
226                 tlist = build_physical_tlist(root, rel);
227                 /* if fail because of dropped cols, use regular method */
228                 if (tlist == NIL)
229                         tlist = build_relation_tlist(rel);
230         }
231         else
232                 tlist = build_relation_tlist(rel);
233
234         /*
235          * Extract the relevant restriction clauses from the parent relation. The
236          * executor must apply all these restrictions during the scan, except for
237          * pseudoconstants which we'll take care of below.
238          */
239         scan_clauses = rel->baserestrictinfo;
240
241         switch (best_path->pathtype)
242         {
243                 case T_SeqScan:
244                         plan = (Plan *) create_seqscan_plan(root,
245                                                                                                 best_path,
246                                                                                                 tlist,
247                                                                                                 scan_clauses);
248                         break;
249
250                 case T_IndexScan:
251                         plan = (Plan *) create_indexscan_plan(root,
252                                                                                                   (IndexPath *) best_path,
253                                                                                                   tlist,
254                                                                                                   scan_clauses);
255                         break;
256
257                 case T_BitmapHeapScan:
258                         plan = (Plan *) create_bitmap_scan_plan(root,
259                                                                                                 (BitmapHeapPath *) best_path,
260                                                                                                         tlist,
261                                                                                                         scan_clauses);
262                         break;
263
264                 case T_TidScan:
265                         plan = (Plan *) create_tidscan_plan(root,
266                                                                                                 (TidPath *) best_path,
267                                                                                                 tlist,
268                                                                                                 scan_clauses);
269                         break;
270
271                 case T_SubqueryScan:
272                         plan = (Plan *) create_subqueryscan_plan(root,
273                                                                                                          best_path,
274                                                                                                          tlist,
275                                                                                                          scan_clauses);
276                         break;
277
278                 case T_FunctionScan:
279                         plan = (Plan *) create_functionscan_plan(root,
280                                                                                                          best_path,
281                                                                                                          tlist,
282                                                                                                          scan_clauses);
283                         break;
284
285                 case T_ValuesScan:
286                         plan = (Plan *) create_valuesscan_plan(root,
287                                                                                                    best_path,
288                                                                                                    tlist,
289                                                                                                    scan_clauses);
290                         break;
291
292                 case T_CteScan:
293                         plan = (Plan *) create_ctescan_plan(root,
294                                                                                                 best_path,
295                                                                                                 tlist,
296                                                                                                 scan_clauses);
297                         break;
298
299                 case T_WorkTableScan:
300                         plan = (Plan *) create_worktablescan_plan(root,
301                                                                                                           best_path,
302                                                                                                           tlist,
303                                                                                                           scan_clauses);
304                         break;
305
306                 default:
307                         elog(ERROR, "unrecognized node type: %d",
308                                  (int) best_path->pathtype);
309                         plan = NULL;            /* keep compiler quiet */
310                         break;
311         }
312
313         /*
314          * If there are any pseudoconstant clauses attached to this node, insert a
315          * gating Result node that evaluates the pseudoconstants as one-time
316          * quals.
317          */
318         if (root->hasPseudoConstantQuals)
319                 plan = create_gating_plan(root, plan, scan_clauses);
320
321         return plan;
322 }
323
324 /*
325  * Build a target list (ie, a list of TargetEntry) for a relation.
326  */
327 static List *
328 build_relation_tlist(RelOptInfo *rel)
329 {
330         List       *tlist = NIL;
331         int                     resno = 1;
332         ListCell   *v;
333
334         foreach(v, rel->reltargetlist)
335         {
336                 /* Do we really need to copy here?      Not sure */
337                 Node       *node = (Node *) copyObject(lfirst(v));
338
339                 tlist = lappend(tlist, makeTargetEntry((Expr *) node,
340                                                                                            resno,
341                                                                                            NULL,
342                                                                                            false));
343                 resno++;
344         }
345         return tlist;
346 }
347
348 /*
349  * use_physical_tlist
350  *              Decide whether to use a tlist matching relation structure,
351  *              rather than only those Vars actually referenced.
352  */
353 static bool
354 use_physical_tlist(PlannerInfo *root, RelOptInfo *rel)
355 {
356         int                     i;
357         ListCell   *lc;
358
359         /*
360          * We can do this for real relation scans, subquery scans, function scans,
361          * values scans, and CTE scans (but not for, eg, joins).
362          */
363         if (rel->rtekind != RTE_RELATION &&
364                 rel->rtekind != RTE_SUBQUERY &&
365                 rel->rtekind != RTE_FUNCTION &&
366                 rel->rtekind != RTE_VALUES &&
367                 rel->rtekind != RTE_CTE)
368                 return false;
369
370         /*
371          * Can't do it with inheritance cases either (mainly because Append
372          * doesn't project).
373          */
374         if (rel->reloptkind != RELOPT_BASEREL)
375                 return false;
376
377         /*
378          * Can't do it if any system columns or whole-row Vars are requested.
379          * (This could possibly be fixed but would take some fragile assumptions
380          * in setrefs.c, I think.)
381          */
382         for (i = rel->min_attr; i <= 0; i++)
383         {
384                 if (!bms_is_empty(rel->attr_needed[i - rel->min_attr]))
385                         return false;
386         }
387
388         /*
389          * Can't do it if the rel is required to emit any placeholder expressions,
390          * either.
391          */
392         foreach(lc, root->placeholder_list)
393         {
394                 PlaceHolderInfo *phinfo = (PlaceHolderInfo *) lfirst(lc);
395
396                 if (bms_nonempty_difference(phinfo->ph_needed, rel->relids) &&
397                         bms_is_subset(phinfo->ph_eval_at, rel->relids))
398                         return false;
399         }
400
401         return true;
402 }
403
404 /*
405  * disuse_physical_tlist
406  *              Switch a plan node back to emitting only Vars actually referenced.
407  *
408  * If the plan node immediately above a scan would prefer to get only
409  * needed Vars and not a physical tlist, it must call this routine to
410  * undo the decision made by use_physical_tlist().      Currently, Hash, Sort,
411  * and Material nodes want this, so they don't have to store useless columns.
412  */
413 static void
414 disuse_physical_tlist(Plan *plan, Path *path)
415 {
416         /* Only need to undo it for path types handled by create_scan_plan() */
417         switch (path->pathtype)
418         {
419                 case T_SeqScan:
420                 case T_IndexScan:
421                 case T_BitmapHeapScan:
422                 case T_TidScan:
423                 case T_SubqueryScan:
424                 case T_FunctionScan:
425                 case T_ValuesScan:
426                 case T_CteScan:
427                 case T_WorkTableScan:
428                         plan->targetlist = build_relation_tlist(path->parent);
429                         break;
430                 default:
431                         break;
432         }
433 }
434
435 /*
436  * create_gating_plan
437  *        Deal with pseudoconstant qual clauses
438  *
439  * If the node's quals list includes any pseudoconstant quals, put them
440  * into a gating Result node atop the already-built plan.  Otherwise,
441  * return the plan as-is.
442  *
443  * Note that we don't change cost or size estimates when doing gating.
444  * The costs of qual eval were already folded into the plan's startup cost.
445  * Leaving the size alone amounts to assuming that the gating qual will
446  * succeed, which is the conservative estimate for planning upper queries.
447  * We certainly don't want to assume the output size is zero (unless the
448  * gating qual is actually constant FALSE, and that case is dealt with in
449  * clausesel.c).  Interpolating between the two cases is silly, because
450  * it doesn't reflect what will really happen at runtime, and besides which
451  * in most cases we have only a very bad idea of the probability of the gating
452  * qual being true.
453  */
454 static Plan *
455 create_gating_plan(PlannerInfo *root, Plan *plan, List *quals)
456 {
457         List       *pseudoconstants;
458
459         /* Sort into desirable execution order while still in RestrictInfo form */
460         quals = order_qual_clauses(root, quals);
461
462         /* Pull out any pseudoconstant quals from the RestrictInfo list */
463         pseudoconstants = extract_actual_clauses(quals, true);
464
465         if (!pseudoconstants)
466                 return plan;
467
468         return (Plan *) make_result(root,
469                                                                 plan->targetlist,
470                                                                 (Node *) pseudoconstants,
471                                                                 plan);
472 }
473
474 /*
475  * create_join_plan
476  *        Create a join plan for 'best_path' and (recursively) plans for its
477  *        inner and outer paths.
478  */
479 static Plan *
480 create_join_plan(PlannerInfo *root, JoinPath *best_path)
481 {
482         Plan       *outer_plan;
483         Plan       *inner_plan;
484         Plan       *plan;
485
486         outer_plan = create_plan(root, best_path->outerjoinpath);
487         inner_plan = create_plan(root, best_path->innerjoinpath);
488
489         switch (best_path->path.pathtype)
490         {
491                 case T_MergeJoin:
492                         plan = (Plan *) create_mergejoin_plan(root,
493                                                                                                   (MergePath *) best_path,
494                                                                                                   outer_plan,
495                                                                                                   inner_plan);
496                         break;
497                 case T_HashJoin:
498                         plan = (Plan *) create_hashjoin_plan(root,
499                                                                                                  (HashPath *) best_path,
500                                                                                                  outer_plan,
501                                                                                                  inner_plan);
502                         break;
503                 case T_NestLoop:
504                         plan = (Plan *) create_nestloop_plan(root,
505                                                                                                  (NestPath *) best_path,
506                                                                                                  outer_plan,
507                                                                                                  inner_plan);
508                         break;
509                 default:
510                         elog(ERROR, "unrecognized node type: %d",
511                                  (int) best_path->path.pathtype);
512                         plan = NULL;            /* keep compiler quiet */
513                         break;
514         }
515
516         /*
517          * If there are any pseudoconstant clauses attached to this node, insert a
518          * gating Result node that evaluates the pseudoconstants as one-time
519          * quals.
520          */
521         if (root->hasPseudoConstantQuals)
522                 plan = create_gating_plan(root, plan, best_path->joinrestrictinfo);
523
524 #ifdef NOT_USED
525
526         /*
527          * * Expensive function pullups may have pulled local predicates * into
528          * this path node.      Put them in the qpqual of the plan node. * JMH,
529          * 6/15/92
530          */
531         if (get_loc_restrictinfo(best_path) != NIL)
532                 set_qpqual((Plan) plan,
533                                    list_concat(get_qpqual((Plan) plan),
534                                            get_actual_clauses(get_loc_restrictinfo(best_path))));
535 #endif
536
537         return plan;
538 }
539
540 /*
541  * create_append_plan
542  *        Create an Append plan for 'best_path' and (recursively) plans
543  *        for its subpaths.
544  *
545  *        Returns a Plan node.
546  */
547 static Plan *
548 create_append_plan(PlannerInfo *root, AppendPath *best_path)
549 {
550         Append     *plan;
551         List       *tlist = build_relation_tlist(best_path->path.parent);
552         List       *subplans = NIL;
553         ListCell   *subpaths;
554
555         /*
556          * It is possible for the subplans list to contain only one entry, or even
557          * no entries.  Handle these cases specially.
558          *
559          * XXX ideally, if there's just one entry, we'd not bother to generate an
560          * Append node but just return the single child.  At the moment this does
561          * not work because the varno of the child scan plan won't match the
562          * parent-rel Vars it'll be asked to emit.
563          */
564         if (best_path->subpaths == NIL)
565         {
566                 /* Generate a Result plan with constant-FALSE gating qual */
567                 return (Plan *) make_result(root,
568                                                                         tlist,
569                                                                         (Node *) list_make1(makeBoolConst(false,
570                                                                                                                                           false)),
571                                                                         NULL);
572         }
573
574         /* Normal case with multiple subpaths */
575         foreach(subpaths, best_path->subpaths)
576         {
577                 Path       *subpath = (Path *) lfirst(subpaths);
578
579                 subplans = lappend(subplans, create_plan(root, subpath));
580         }
581
582         plan = make_append(subplans, tlist);
583
584         return (Plan *) plan;
585 }
586
587 /*
588  * create_result_plan
589  *        Create a Result plan for 'best_path'.
590  *        This is only used for the case of a query with an empty jointree.
591  *
592  *        Returns a Plan node.
593  */
594 static Result *
595 create_result_plan(PlannerInfo *root, ResultPath *best_path)
596 {
597         List       *tlist;
598         List       *quals;
599
600         /* The tlist will be installed later, since we have no RelOptInfo */
601         Assert(best_path->path.parent == NULL);
602         tlist = NIL;
603
604         /* best_path->quals is just bare clauses */
605
606         quals = order_qual_clauses(root, best_path->quals);
607
608         return make_result(root, tlist, (Node *) quals, NULL);
609 }
610
611 /*
612  * create_material_plan
613  *        Create a Material plan for 'best_path' and (recursively) plans
614  *        for its subpaths.
615  *
616  *        Returns a Plan node.
617  */
618 static Material *
619 create_material_plan(PlannerInfo *root, MaterialPath *best_path)
620 {
621         Material   *plan;
622         Plan       *subplan;
623
624         subplan = create_plan(root, best_path->subpath);
625
626         /* We don't want any excess columns in the materialized tuples */
627         disuse_physical_tlist(subplan, best_path->subpath);
628
629         plan = make_material(subplan);
630
631         copy_path_costsize(&plan->plan, (Path *) best_path);
632
633         return plan;
634 }
635
636 /*
637  * create_unique_plan
638  *        Create a Unique plan for 'best_path' and (recursively) plans
639  *        for its subpaths.
640  *
641  *        Returns a Plan node.
642  */
643 static Plan *
644 create_unique_plan(PlannerInfo *root, UniquePath *best_path)
645 {
646         Plan       *plan;
647         Plan       *subplan;
648         List       *in_operators;
649         List       *uniq_exprs;
650         List       *newtlist;
651         int                     nextresno;
652         bool            newitems;
653         int                     numGroupCols;
654         AttrNumber *groupColIdx;
655         int                     groupColPos;
656         ListCell   *l;
657
658         subplan = create_plan(root, best_path->subpath);
659
660         /* Done if we don't need to do any actual unique-ifying */
661         if (best_path->umethod == UNIQUE_PATH_NOOP)
662                 return subplan;
663
664         /*
665          * As constructed, the subplan has a "flat" tlist containing just the Vars
666          * needed here and at upper levels.  The values we are supposed to
667          * unique-ify may be expressions in these variables.  We have to add any
668          * such expressions to the subplan's tlist.
669          *
670          * The subplan may have a "physical" tlist if it is a simple scan plan. If
671          * we're going to sort, this should be reduced to the regular tlist, so
672          * that we don't sort more data than we need to.  For hashing, the tlist
673          * should be left as-is if we don't need to add any expressions; but if we
674          * do have to add expressions, then a projection step will be needed at
675          * runtime anyway, so we may as well remove unneeded items. Therefore
676          * newtlist starts from build_relation_tlist() not just a copy of the
677          * subplan's tlist; and we don't install it into the subplan unless we are
678          * sorting or stuff has to be added.
679          */
680         in_operators = best_path->in_operators;
681         uniq_exprs = best_path->uniq_exprs;
682
683         /* initialize modified subplan tlist as just the "required" vars */
684         newtlist = build_relation_tlist(best_path->path.parent);
685         nextresno = list_length(newtlist) + 1;
686         newitems = false;
687
688         foreach(l, uniq_exprs)
689         {
690                 Node       *uniqexpr = lfirst(l);
691                 TargetEntry *tle;
692
693                 tle = tlist_member(uniqexpr, newtlist);
694                 if (!tle)
695                 {
696                         tle = makeTargetEntry((Expr *) uniqexpr,
697                                                                   nextresno,
698                                                                   NULL,
699                                                                   false);
700                         newtlist = lappend(newtlist, tle);
701                         nextresno++;
702                         newitems = true;
703                 }
704         }
705
706         if (newitems || best_path->umethod == UNIQUE_PATH_SORT)
707         {
708                 /*
709                  * If the top plan node can't do projections, we need to add a Result
710                  * node to help it along.
711                  */
712                 if (!is_projection_capable_plan(subplan))
713                         subplan = (Plan *) make_result(root, newtlist, NULL, subplan);
714                 else
715                         subplan->targetlist = newtlist;
716         }
717
718         /*
719          * Build control information showing which subplan output columns are to
720          * be examined by the grouping step.  Unfortunately we can't merge this
721          * with the previous loop, since we didn't then know which version of the
722          * subplan tlist we'd end up using.
723          */
724         newtlist = subplan->targetlist;
725         numGroupCols = list_length(uniq_exprs);
726         groupColIdx = (AttrNumber *) palloc(numGroupCols * sizeof(AttrNumber));
727
728         groupColPos = 0;
729         foreach(l, uniq_exprs)
730         {
731                 Node       *uniqexpr = lfirst(l);
732                 TargetEntry *tle;
733
734                 tle = tlist_member(uniqexpr, newtlist);
735                 if (!tle)                               /* shouldn't happen */
736                         elog(ERROR, "failed to find unique expression in subplan tlist");
737                 groupColIdx[groupColPos++] = tle->resno;
738         }
739
740         if (best_path->umethod == UNIQUE_PATH_HASH)
741         {
742                 long            numGroups;
743                 Oid                *groupOperators;
744
745                 numGroups = (long) Min(best_path->rows, (double) LONG_MAX);
746
747                 /*
748                  * Get the hashable equality operators for the Agg node to use.
749                  * Normally these are the same as the IN clause operators, but if
750                  * those are cross-type operators then the equality operators are the
751                  * ones for the IN clause operators' RHS datatype.
752                  */
753                 groupOperators = (Oid *) palloc(numGroupCols * sizeof(Oid));
754                 groupColPos = 0;
755                 foreach(l, in_operators)
756                 {
757                         Oid                     in_oper = lfirst_oid(l);
758                         Oid                     eq_oper;
759
760                         if (!get_compatible_hash_operators(in_oper, NULL, &eq_oper))
761                                 elog(ERROR, "could not find compatible hash operator for operator %u",
762                                          in_oper);
763                         groupOperators[groupColPos++] = eq_oper;
764                 }
765
766                 /*
767                  * Since the Agg node is going to project anyway, we can give it the
768                  * minimum output tlist, without any stuff we might have added to the
769                  * subplan tlist.
770                  */
771                 plan = (Plan *) make_agg(root,
772                                                                  build_relation_tlist(best_path->path.parent),
773                                                                  NIL,
774                                                                  AGG_HASHED,
775                                                                  numGroupCols,
776                                                                  groupColIdx,
777                                                                  groupOperators,
778                                                                  numGroups,
779                                                                  0,
780                                                                  subplan);
781         }
782         else
783         {
784                 List       *sortList = NIL;
785
786                 /* Create an ORDER BY list to sort the input compatibly */
787                 groupColPos = 0;
788                 foreach(l, in_operators)
789                 {
790                         Oid                     in_oper = lfirst_oid(l);
791                         Oid                     sortop;
792                         TargetEntry *tle;
793                         SortGroupClause *sortcl;
794
795                         sortop = get_ordering_op_for_equality_op(in_oper, false);
796                         if (!OidIsValid(sortop))        /* shouldn't happen */
797                                 elog(ERROR, "could not find ordering operator for equality operator %u",
798                                          in_oper);
799                         tle = get_tle_by_resno(subplan->targetlist,
800                                                                    groupColIdx[groupColPos]);
801                         Assert(tle != NULL);
802                         sortcl = makeNode(SortGroupClause);
803                         sortcl->tleSortGroupRef = assignSortGroupRef(tle,
804                                                                                                                  subplan->targetlist);
805                         sortcl->eqop = in_oper;
806                         sortcl->sortop = sortop;
807                         sortcl->nulls_first = false;
808                         sortList = lappend(sortList, sortcl);
809                         groupColPos++;
810                 }
811                 plan = (Plan *) make_sort_from_sortclauses(root, sortList, subplan);
812                 plan = (Plan *) make_unique(plan, sortList);
813         }
814
815         /* Adjust output size estimate (other fields should be OK already) */
816         plan->plan_rows = best_path->rows;
817
818         return plan;
819 }
820
821
822 /*****************************************************************************
823  *
824  *      BASE-RELATION SCAN METHODS
825  *
826  *****************************************************************************/
827
828
829 /*
830  * create_seqscan_plan
831  *       Returns a seqscan plan for the base relation scanned by 'best_path'
832  *       with restriction clauses 'scan_clauses' and targetlist 'tlist'.
833  */
834 static SeqScan *
835 create_seqscan_plan(PlannerInfo *root, Path *best_path,
836                                         List *tlist, List *scan_clauses)
837 {
838         SeqScan    *scan_plan;
839         Index           scan_relid = best_path->parent->relid;
840
841         /* it should be a base rel... */
842         Assert(scan_relid > 0);
843         Assert(best_path->parent->rtekind == RTE_RELATION);
844
845         /* Sort clauses into best execution order */
846         scan_clauses = order_qual_clauses(root, scan_clauses);
847
848         /* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */
849         scan_clauses = extract_actual_clauses(scan_clauses, false);
850
851         scan_plan = make_seqscan(tlist,
852                                                          scan_clauses,
853                                                          scan_relid);
854
855         copy_path_costsize(&scan_plan->plan, best_path);
856
857         return scan_plan;
858 }
859
860 /*
861  * create_indexscan_plan
862  *        Returns an indexscan plan for the base relation scanned by 'best_path'
863  *        with restriction clauses 'scan_clauses' and targetlist 'tlist'.
864  *
865  * The indexquals list of the path contains implicitly-ANDed qual conditions.
866  * The list can be empty --- then no index restrictions will be applied during
867  * the scan.
868  */
869 static IndexScan *
870 create_indexscan_plan(PlannerInfo *root,
871                                           IndexPath *best_path,
872                                           List *tlist,
873                                           List *scan_clauses)
874 {
875         List       *indexquals = best_path->indexquals;
876         Index           baserelid = best_path->path.parent->relid;
877         Oid                     indexoid = best_path->indexinfo->indexoid;
878         List       *qpqual;
879         List       *stripped_indexquals;
880         List       *fixed_indexquals;
881         ListCell   *l;
882         IndexScan  *scan_plan;
883
884         /* it should be a base rel... */
885         Assert(baserelid > 0);
886         Assert(best_path->path.parent->rtekind == RTE_RELATION);
887
888         /*
889          * Build "stripped" indexquals structure (no RestrictInfos) to pass to
890          * executor as indexqualorig
891          */
892         stripped_indexquals = get_actual_clauses(indexquals);
893
894         /*
895          * The executor needs a copy with the indexkey on the left of each clause
896          * and with index attr numbers substituted for table ones.
897          */
898         fixed_indexquals = fix_indexqual_references(indexquals, best_path);
899
900         /*
901          * If this is an innerjoin scan, the indexclauses will contain join
902          * clauses that are not present in scan_clauses (since the passed-in value
903          * is just the rel's baserestrictinfo list).  We must add these clauses to
904          * scan_clauses to ensure they get checked.  In most cases we will remove
905          * the join clauses again below, but if a join clause contains a special
906          * operator, we need to make sure it gets into the scan_clauses.
907          *
908          * Note: pointer comparison should be enough to determine RestrictInfo
909          * matches.
910          */
911         if (best_path->isjoininner)
912                 scan_clauses = list_union_ptr(scan_clauses, best_path->indexclauses);
913
914         /*
915          * The qpqual list must contain all restrictions not automatically handled
916          * by the index.  All the predicates in the indexquals will be checked
917          * (either by the index itself, or by nodeIndexscan.c), but if there are
918          * any "special" operators involved then they must be included in qpqual.
919          * The upshot is that qpqual must contain scan_clauses minus whatever
920          * appears in indexquals.
921          *
922          * In normal cases simple pointer equality checks will be enough to spot
923          * duplicate RestrictInfos, so we try that first.  In some situations
924          * (particularly with OR'd index conditions) we may have scan_clauses that
925          * are not equal to, but are logically implied by, the index quals; so we
926          * also try a predicate_implied_by() check to see if we can discard quals
927          * that way.  (predicate_implied_by assumes its first input contains only
928          * immutable functions, so we have to check that.)
929          *
930          * We can also discard quals that are implied by a partial index's
931          * predicate, but only in a plain SELECT; when scanning a target relation
932          * of UPDATE/DELETE/SELECT FOR UPDATE, we must leave such quals in the
933          * plan so that they'll be properly rechecked by EvalPlanQual testing.
934          */
935         qpqual = NIL;
936         foreach(l, scan_clauses)
937         {
938                 RestrictInfo *rinfo = (RestrictInfo *) lfirst(l);
939
940                 Assert(IsA(rinfo, RestrictInfo));
941                 if (rinfo->pseudoconstant)
942                         continue;                       /* we may drop pseudoconstants here */
943                 if (list_member_ptr(indexquals, rinfo))
944                         continue;
945                 if (!contain_mutable_functions((Node *) rinfo->clause))
946                 {
947                         List       *clausel = list_make1(rinfo->clause);
948
949                         if (predicate_implied_by(clausel, indexquals))
950                                 continue;
951                         if (best_path->indexinfo->indpred)
952                         {
953                                 if (baserelid != root->parse->resultRelation &&
954                                         get_rowmark(root->parse, baserelid) == NULL)
955                                         if (predicate_implied_by(clausel,
956                                                                                          best_path->indexinfo->indpred))
957                                                 continue;
958                         }
959                 }
960                 qpqual = lappend(qpqual, rinfo);
961         }
962
963         /* Sort clauses into best execution order */
964         qpqual = order_qual_clauses(root, qpqual);
965
966         /* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */
967         qpqual = extract_actual_clauses(qpqual, false);
968
969         /* Finally ready to build the plan node */
970         scan_plan = make_indexscan(tlist,
971                                                            qpqual,
972                                                            baserelid,
973                                                            indexoid,
974                                                            fixed_indexquals,
975                                                            stripped_indexquals,
976                                                            best_path->indexscandir);
977
978         copy_path_costsize(&scan_plan->scan.plan, &best_path->path);
979         /* use the indexscan-specific rows estimate, not the parent rel's */
980         scan_plan->scan.plan.plan_rows = best_path->rows;
981
982         return scan_plan;
983 }
984
985 /*
986  * create_bitmap_scan_plan
987  *        Returns a bitmap scan plan for the base relation scanned by 'best_path'
988  *        with restriction clauses 'scan_clauses' and targetlist 'tlist'.
989  */
990 static BitmapHeapScan *
991 create_bitmap_scan_plan(PlannerInfo *root,
992                                                 BitmapHeapPath *best_path,
993                                                 List *tlist,
994                                                 List *scan_clauses)
995 {
996         Index           baserelid = best_path->path.parent->relid;
997         Plan       *bitmapqualplan;
998         List       *bitmapqualorig;
999         List       *indexquals;
1000         List       *qpqual;
1001         ListCell   *l;
1002         BitmapHeapScan *scan_plan;
1003
1004         /* it should be a base rel... */
1005         Assert(baserelid > 0);
1006         Assert(best_path->path.parent->rtekind == RTE_RELATION);
1007
1008         /* Process the bitmapqual tree into a Plan tree and qual lists */
1009         bitmapqualplan = create_bitmap_subplan(root, best_path->bitmapqual,
1010                                                                                    &bitmapqualorig, &indexquals);
1011
1012         /* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */
1013         scan_clauses = extract_actual_clauses(scan_clauses, false);
1014
1015         /*
1016          * If this is a innerjoin scan, the indexclauses will contain join clauses
1017          * that are not present in scan_clauses (since the passed-in value is just
1018          * the rel's baserestrictinfo list).  We must add these clauses to
1019          * scan_clauses to ensure they get checked.  In most cases we will remove
1020          * the join clauses again below, but if a join clause contains a special
1021          * operator, we need to make sure it gets into the scan_clauses.
1022          */
1023         if (best_path->isjoininner)
1024         {
1025                 scan_clauses = list_concat_unique(scan_clauses, bitmapqualorig);
1026         }
1027
1028         /*
1029          * The qpqual list must contain all restrictions not automatically handled
1030          * by the index.  All the predicates in the indexquals will be checked
1031          * (either by the index itself, or by nodeBitmapHeapscan.c), but if there
1032          * are any "special" operators involved then they must be added to qpqual.
1033          * The upshot is that qpqual must contain scan_clauses minus whatever
1034          * appears in indexquals.
1035          *
1036          * In normal cases simple equal() checks will be enough to spot duplicate
1037          * clauses, so we try that first.  In some situations (particularly with
1038          * OR'd index conditions) we may have scan_clauses that are not equal to,
1039          * but are logically implied by, the index quals; so we also try a
1040          * predicate_implied_by() check to see if we can discard quals that way.
1041          * (predicate_implied_by assumes its first input contains only immutable
1042          * functions, so we have to check that.)
1043          *
1044          * Unlike create_indexscan_plan(), we need take no special thought here
1045          * for partial index predicates; this is because the predicate conditions
1046          * are already listed in bitmapqualorig and indexquals.  Bitmap scans have
1047          * to do it that way because predicate conditions need to be rechecked if
1048          * the scan becomes lossy.
1049          */
1050         qpqual = NIL;
1051         foreach(l, scan_clauses)
1052         {
1053                 Node       *clause = (Node *) lfirst(l);
1054
1055                 if (list_member(indexquals, clause))
1056                         continue;
1057                 if (!contain_mutable_functions(clause))
1058                 {
1059                         List       *clausel = list_make1(clause);
1060
1061                         if (predicate_implied_by(clausel, indexquals))
1062                                 continue;
1063                 }
1064                 qpqual = lappend(qpqual, clause);
1065         }
1066
1067         /* Sort clauses into best execution order */
1068         qpqual = order_qual_clauses(root, qpqual);
1069
1070         /*
1071          * When dealing with special operators, we will at this point have
1072          * duplicate clauses in qpqual and bitmapqualorig.      We may as well drop
1073          * 'em from bitmapqualorig, since there's no point in making the tests
1074          * twice.
1075          */
1076         bitmapqualorig = list_difference_ptr(bitmapqualorig, qpqual);
1077
1078         /* Finally ready to build the plan node */
1079         scan_plan = make_bitmap_heapscan(tlist,
1080                                                                          qpqual,
1081                                                                          bitmapqualplan,
1082                                                                          bitmapqualorig,
1083                                                                          baserelid);
1084
1085         copy_path_costsize(&scan_plan->scan.plan, &best_path->path);
1086         /* use the indexscan-specific rows estimate, not the parent rel's */
1087         scan_plan->scan.plan.plan_rows = best_path->rows;
1088
1089         return scan_plan;
1090 }
1091
1092 /*
1093  * Given a bitmapqual tree, generate the Plan tree that implements it
1094  *
1095  * As byproducts, we also return in *qual and *indexqual the qual lists
1096  * (in implicit-AND form, without RestrictInfos) describing the original index
1097  * conditions and the generated indexqual conditions.  (These are the same in
1098  * simple cases, but when special index operators are involved, the former
1099  * list includes the special conditions while the latter includes the actual
1100  * indexable conditions derived from them.)  Both lists include partial-index
1101  * predicates, because we have to recheck predicates as well as index
1102  * conditions if the bitmap scan becomes lossy.
1103  *
1104  * Note: if you find yourself changing this, you probably need to change
1105  * make_restrictinfo_from_bitmapqual too.
1106  */
1107 static Plan *
1108 create_bitmap_subplan(PlannerInfo *root, Path *bitmapqual,
1109                                           List **qual, List **indexqual)
1110 {
1111         Plan       *plan;
1112
1113         if (IsA(bitmapqual, BitmapAndPath))
1114         {
1115                 BitmapAndPath *apath = (BitmapAndPath *) bitmapqual;
1116                 List       *subplans = NIL;
1117                 List       *subquals = NIL;
1118                 List       *subindexquals = NIL;
1119                 ListCell   *l;
1120
1121                 /*
1122                  * There may well be redundant quals among the subplans, since a
1123                  * top-level WHERE qual might have gotten used to form several
1124                  * different index quals.  We don't try exceedingly hard to eliminate
1125                  * redundancies, but we do eliminate obvious duplicates by using
1126                  * list_concat_unique.
1127                  */
1128                 foreach(l, apath->bitmapquals)
1129                 {
1130                         Plan       *subplan;
1131                         List       *subqual;
1132                         List       *subindexqual;
1133
1134                         subplan = create_bitmap_subplan(root, (Path *) lfirst(l),
1135                                                                                         &subqual, &subindexqual);
1136                         subplans = lappend(subplans, subplan);
1137                         subquals = list_concat_unique(subquals, subqual);
1138                         subindexquals = list_concat_unique(subindexquals, subindexqual);
1139                 }
1140                 plan = (Plan *) make_bitmap_and(subplans);
1141                 plan->startup_cost = apath->path.startup_cost;
1142                 plan->total_cost = apath->path.total_cost;
1143                 plan->plan_rows =
1144                         clamp_row_est(apath->bitmapselectivity * apath->path.parent->tuples);
1145                 plan->plan_width = 0;   /* meaningless */
1146                 *qual = subquals;
1147                 *indexqual = subindexquals;
1148         }
1149         else if (IsA(bitmapqual, BitmapOrPath))
1150         {
1151                 BitmapOrPath *opath = (BitmapOrPath *) bitmapqual;
1152                 List       *subplans = NIL;
1153                 List       *subquals = NIL;
1154                 List       *subindexquals = NIL;
1155                 bool            const_true_subqual = false;
1156                 bool            const_true_subindexqual = false;
1157                 ListCell   *l;
1158
1159                 /*
1160                  * Here, we only detect qual-free subplans.  A qual-free subplan would
1161                  * cause us to generate "... OR true ..."  which we may as well reduce
1162                  * to just "true".      We do not try to eliminate redundant subclauses
1163                  * because (a) it's not as likely as in the AND case, and (b) we might
1164                  * well be working with hundreds or even thousands of OR conditions,
1165                  * perhaps from a long IN list.  The performance of list_append_unique
1166                  * would be unacceptable.
1167                  */
1168                 foreach(l, opath->bitmapquals)
1169                 {
1170                         Plan       *subplan;
1171                         List       *subqual;
1172                         List       *subindexqual;
1173
1174                         subplan = create_bitmap_subplan(root, (Path *) lfirst(l),
1175                                                                                         &subqual, &subindexqual);
1176                         subplans = lappend(subplans, subplan);
1177                         if (subqual == NIL)
1178                                 const_true_subqual = true;
1179                         else if (!const_true_subqual)
1180                                 subquals = lappend(subquals,
1181                                                                    make_ands_explicit(subqual));
1182                         if (subindexqual == NIL)
1183                                 const_true_subindexqual = true;
1184                         else if (!const_true_subindexqual)
1185                                 subindexquals = lappend(subindexquals,
1186                                                                                 make_ands_explicit(subindexqual));
1187                 }
1188
1189                 /*
1190                  * In the presence of ScalarArrayOpExpr quals, we might have built
1191                  * BitmapOrPaths with just one subpath; don't add an OR step.
1192                  */
1193                 if (list_length(subplans) == 1)
1194                 {
1195                         plan = (Plan *) linitial(subplans);
1196                 }
1197                 else
1198                 {
1199                         plan = (Plan *) make_bitmap_or(subplans);
1200                         plan->startup_cost = opath->path.startup_cost;
1201                         plan->total_cost = opath->path.total_cost;
1202                         plan->plan_rows =
1203                                 clamp_row_est(opath->bitmapselectivity * opath->path.parent->tuples);
1204                         plan->plan_width = 0;           /* meaningless */
1205                 }
1206
1207                 /*
1208                  * If there were constant-TRUE subquals, the OR reduces to constant
1209                  * TRUE.  Also, avoid generating one-element ORs, which could happen
1210                  * due to redundancy elimination or ScalarArrayOpExpr quals.
1211                  */
1212                 if (const_true_subqual)
1213                         *qual = NIL;
1214                 else if (list_length(subquals) <= 1)
1215                         *qual = subquals;
1216                 else
1217                         *qual = list_make1(make_orclause(subquals));
1218                 if (const_true_subindexqual)
1219                         *indexqual = NIL;
1220                 else if (list_length(subindexquals) <= 1)
1221                         *indexqual = subindexquals;
1222                 else
1223                         *indexqual = list_make1(make_orclause(subindexquals));
1224         }
1225         else if (IsA(bitmapqual, IndexPath))
1226         {
1227                 IndexPath  *ipath = (IndexPath *) bitmapqual;
1228                 IndexScan  *iscan;
1229                 ListCell   *l;
1230
1231                 /* Use the regular indexscan plan build machinery... */
1232                 iscan = create_indexscan_plan(root, ipath, NIL, NIL);
1233                 /* then convert to a bitmap indexscan */
1234                 plan = (Plan *) make_bitmap_indexscan(iscan->scan.scanrelid,
1235                                                                                           iscan->indexid,
1236                                                                                           iscan->indexqual,
1237                                                                                           iscan->indexqualorig);
1238                 plan->startup_cost = 0.0;
1239                 plan->total_cost = ipath->indextotalcost;
1240                 plan->plan_rows =
1241                         clamp_row_est(ipath->indexselectivity * ipath->path.parent->tuples);
1242                 plan->plan_width = 0;   /* meaningless */
1243                 *qual = get_actual_clauses(ipath->indexclauses);
1244                 *indexqual = get_actual_clauses(ipath->indexquals);
1245                 foreach(l, ipath->indexinfo->indpred)
1246                 {
1247                         Expr       *pred = (Expr *) lfirst(l);
1248
1249                         /*
1250                          * We know that the index predicate must have been implied by the
1251                          * query condition as a whole, but it may or may not be implied by
1252                          * the conditions that got pushed into the bitmapqual.  Avoid
1253                          * generating redundant conditions.
1254                          */
1255                         if (!predicate_implied_by(list_make1(pred), ipath->indexclauses))
1256                         {
1257                                 *qual = lappend(*qual, pred);
1258                                 *indexqual = lappend(*indexqual, pred);
1259                         }
1260                 }
1261         }
1262         else
1263         {
1264                 elog(ERROR, "unrecognized node type: %d", nodeTag(bitmapqual));
1265                 plan = NULL;                    /* keep compiler quiet */
1266         }
1267
1268         return plan;
1269 }
1270
1271 /*
1272  * create_tidscan_plan
1273  *       Returns a tidscan plan for the base relation scanned by 'best_path'
1274  *       with restriction clauses 'scan_clauses' and targetlist 'tlist'.
1275  */
1276 static TidScan *
1277 create_tidscan_plan(PlannerInfo *root, TidPath *best_path,
1278                                         List *tlist, List *scan_clauses)
1279 {
1280         TidScan    *scan_plan;
1281         Index           scan_relid = best_path->path.parent->relid;
1282         List       *ortidquals;
1283
1284         /* it should be a base rel... */
1285         Assert(scan_relid > 0);
1286         Assert(best_path->path.parent->rtekind == RTE_RELATION);
1287
1288         /* Sort clauses into best execution order */
1289         scan_clauses = order_qual_clauses(root, scan_clauses);
1290
1291         /* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */
1292         scan_clauses = extract_actual_clauses(scan_clauses, false);
1293
1294         /*
1295          * Remove any clauses that are TID quals.  This is a bit tricky since the
1296          * tidquals list has implicit OR semantics.
1297          */
1298         ortidquals = best_path->tidquals;
1299         if (list_length(ortidquals) > 1)
1300                 ortidquals = list_make1(make_orclause(ortidquals));
1301         scan_clauses = list_difference(scan_clauses, ortidquals);
1302
1303         scan_plan = make_tidscan(tlist,
1304                                                          scan_clauses,
1305                                                          scan_relid,
1306                                                          best_path->tidquals);
1307
1308         copy_path_costsize(&scan_plan->scan.plan, &best_path->path);
1309
1310         return scan_plan;
1311 }
1312
1313 /*
1314  * create_subqueryscan_plan
1315  *       Returns a subqueryscan plan for the base relation scanned by 'best_path'
1316  *       with restriction clauses 'scan_clauses' and targetlist 'tlist'.
1317  */
1318 static SubqueryScan *
1319 create_subqueryscan_plan(PlannerInfo *root, Path *best_path,
1320                                                  List *tlist, List *scan_clauses)
1321 {
1322         SubqueryScan *scan_plan;
1323         Index           scan_relid = best_path->parent->relid;
1324
1325         /* it should be a subquery base rel... */
1326         Assert(scan_relid > 0);
1327         Assert(best_path->parent->rtekind == RTE_SUBQUERY);
1328
1329         /* Sort clauses into best execution order */
1330         scan_clauses = order_qual_clauses(root, scan_clauses);
1331
1332         /* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */
1333         scan_clauses = extract_actual_clauses(scan_clauses, false);
1334
1335         scan_plan = make_subqueryscan(tlist,
1336                                                                   scan_clauses,
1337                                                                   scan_relid,
1338                                                                   best_path->parent->subplan,
1339                                                                   best_path->parent->subrtable);
1340
1341         copy_path_costsize(&scan_plan->scan.plan, best_path);
1342
1343         return scan_plan;
1344 }
1345
1346 /*
1347  * create_functionscan_plan
1348  *       Returns a functionscan plan for the base relation scanned by 'best_path'
1349  *       with restriction clauses 'scan_clauses' and targetlist 'tlist'.
1350  */
1351 static FunctionScan *
1352 create_functionscan_plan(PlannerInfo *root, Path *best_path,
1353                                                  List *tlist, List *scan_clauses)
1354 {
1355         FunctionScan *scan_plan;
1356         Index           scan_relid = best_path->parent->relid;
1357         RangeTblEntry *rte;
1358
1359         /* it should be a function base rel... */
1360         Assert(scan_relid > 0);
1361         rte = planner_rt_fetch(scan_relid, root);
1362         Assert(rte->rtekind == RTE_FUNCTION);
1363
1364         /* Sort clauses into best execution order */
1365         scan_clauses = order_qual_clauses(root, scan_clauses);
1366
1367         /* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */
1368         scan_clauses = extract_actual_clauses(scan_clauses, false);
1369
1370         scan_plan = make_functionscan(tlist, scan_clauses, scan_relid,
1371                                                                   rte->funcexpr,
1372                                                                   rte->eref->colnames,
1373                                                                   rte->funccoltypes,
1374                                                                   rte->funccoltypmods);
1375
1376         copy_path_costsize(&scan_plan->scan.plan, best_path);
1377
1378         return scan_plan;
1379 }
1380
1381 /*
1382  * create_valuesscan_plan
1383  *       Returns a valuesscan plan for the base relation scanned by 'best_path'
1384  *       with restriction clauses 'scan_clauses' and targetlist 'tlist'.
1385  */
1386 static ValuesScan *
1387 create_valuesscan_plan(PlannerInfo *root, Path *best_path,
1388                                            List *tlist, List *scan_clauses)
1389 {
1390         ValuesScan *scan_plan;
1391         Index           scan_relid = best_path->parent->relid;
1392         RangeTblEntry *rte;
1393
1394         /* it should be a values base rel... */
1395         Assert(scan_relid > 0);
1396         rte = planner_rt_fetch(scan_relid, root);
1397         Assert(rte->rtekind == RTE_VALUES);
1398
1399         /* Sort clauses into best execution order */
1400         scan_clauses = order_qual_clauses(root, scan_clauses);
1401
1402         /* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */
1403         scan_clauses = extract_actual_clauses(scan_clauses, false);
1404
1405         scan_plan = make_valuesscan(tlist, scan_clauses, scan_relid,
1406                                                                 rte->values_lists);
1407
1408         copy_path_costsize(&scan_plan->scan.plan, best_path);
1409
1410         return scan_plan;
1411 }
1412
1413 /*
1414  * create_ctescan_plan
1415  *       Returns a ctescan plan for the base relation scanned by 'best_path'
1416  *       with restriction clauses 'scan_clauses' and targetlist 'tlist'.
1417  */
1418 static CteScan *
1419 create_ctescan_plan(PlannerInfo *root, Path *best_path,
1420                                         List *tlist, List *scan_clauses)
1421 {
1422         CteScan    *scan_plan;
1423         Index           scan_relid = best_path->parent->relid;
1424         RangeTblEntry *rte;
1425         SubPlan    *ctesplan = NULL;
1426         int                     plan_id;
1427         int                     cte_param_id;
1428         PlannerInfo *cteroot;
1429         Index           levelsup;
1430         int                     ndx;
1431         ListCell   *lc;
1432
1433         Assert(scan_relid > 0);
1434         rte = planner_rt_fetch(scan_relid, root);
1435         Assert(rte->rtekind == RTE_CTE);
1436         Assert(!rte->self_reference);
1437
1438         /*
1439          * Find the referenced CTE, and locate the SubPlan previously made for it.
1440          */
1441         levelsup = rte->ctelevelsup;
1442         cteroot = root;
1443         while (levelsup-- > 0)
1444         {
1445                 cteroot = cteroot->parent_root;
1446                 if (!cteroot)                   /* shouldn't happen */
1447                         elog(ERROR, "bad levelsup for CTE \"%s\"", rte->ctename);
1448         }
1449
1450         /*
1451          * Note: cte_plan_ids can be shorter than cteList, if we are still working
1452          * on planning the CTEs (ie, this is a side-reference from another CTE).
1453          * So we mustn't use forboth here.
1454          */
1455         ndx = 0;
1456         foreach(lc, cteroot->parse->cteList)
1457         {
1458                 CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc);
1459
1460                 if (strcmp(cte->ctename, rte->ctename) == 0)
1461                         break;
1462                 ndx++;
1463         }
1464         if (lc == NULL)                         /* shouldn't happen */
1465                 elog(ERROR, "could not find CTE \"%s\"", rte->ctename);
1466         if (ndx >= list_length(cteroot->cte_plan_ids))
1467                 elog(ERROR, "could not find plan for CTE \"%s\"", rte->ctename);
1468         plan_id = list_nth_int(cteroot->cte_plan_ids, ndx);
1469         Assert(plan_id > 0);
1470         foreach(lc, cteroot->init_plans)
1471         {
1472                 ctesplan = (SubPlan *) lfirst(lc);
1473                 if (ctesplan->plan_id == plan_id)
1474                         break;
1475         }
1476         if (lc == NULL)                         /* shouldn't happen */
1477                 elog(ERROR, "could not find plan for CTE \"%s\"", rte->ctename);
1478
1479         /*
1480          * We need the CTE param ID, which is the sole member of the SubPlan's
1481          * setParam list.
1482          */
1483         cte_param_id = linitial_int(ctesplan->setParam);
1484
1485         /* Sort clauses into best execution order */
1486         scan_clauses = order_qual_clauses(root, scan_clauses);
1487
1488         /* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */
1489         scan_clauses = extract_actual_clauses(scan_clauses, false);
1490
1491         scan_plan = make_ctescan(tlist, scan_clauses, scan_relid,
1492                                                          plan_id, cte_param_id);
1493
1494         copy_path_costsize(&scan_plan->scan.plan, best_path);
1495
1496         return scan_plan;
1497 }
1498
1499 /*
1500  * create_worktablescan_plan
1501  *       Returns a worktablescan plan for the base relation scanned by 'best_path'
1502  *       with restriction clauses 'scan_clauses' and targetlist 'tlist'.
1503  */
1504 static WorkTableScan *
1505 create_worktablescan_plan(PlannerInfo *root, Path *best_path,
1506                                                   List *tlist, List *scan_clauses)
1507 {
1508         WorkTableScan *scan_plan;
1509         Index           scan_relid = best_path->parent->relid;
1510         RangeTblEntry *rte;
1511         Index           levelsup;
1512         PlannerInfo *cteroot;
1513
1514         Assert(scan_relid > 0);
1515         rte = planner_rt_fetch(scan_relid, root);
1516         Assert(rte->rtekind == RTE_CTE);
1517         Assert(rte->self_reference);
1518
1519         /*
1520          * We need to find the worktable param ID, which is in the plan level
1521          * that's processing the recursive UNION, which is one level *below* where
1522          * the CTE comes from.
1523          */
1524         levelsup = rte->ctelevelsup;
1525         if (levelsup == 0)                      /* shouldn't happen */
1526                 elog(ERROR, "bad levelsup for CTE \"%s\"", rte->ctename);
1527         levelsup--;
1528         cteroot = root;
1529         while (levelsup-- > 0)
1530         {
1531                 cteroot = cteroot->parent_root;
1532                 if (!cteroot)                   /* shouldn't happen */
1533                         elog(ERROR, "bad levelsup for CTE \"%s\"", rte->ctename);
1534         }
1535         if (cteroot->wt_param_id < 0)           /* shouldn't happen */
1536                 elog(ERROR, "could not find param ID for CTE \"%s\"", rte->ctename);
1537
1538         /* Sort clauses into best execution order */
1539         scan_clauses = order_qual_clauses(root, scan_clauses);
1540
1541         /* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */
1542         scan_clauses = extract_actual_clauses(scan_clauses, false);
1543
1544         scan_plan = make_worktablescan(tlist, scan_clauses, scan_relid,
1545                                                                    cteroot->wt_param_id);
1546
1547         copy_path_costsize(&scan_plan->scan.plan, best_path);
1548
1549         return scan_plan;
1550 }
1551
1552
1553 /*****************************************************************************
1554  *
1555  *      JOIN METHODS
1556  *
1557  *****************************************************************************/
1558
1559 static NestLoop *
1560 create_nestloop_plan(PlannerInfo *root,
1561                                          NestPath *best_path,
1562                                          Plan *outer_plan,
1563                                          Plan *inner_plan)
1564 {
1565         List       *tlist = build_relation_tlist(best_path->path.parent);
1566         List       *joinrestrictclauses = best_path->joinrestrictinfo;
1567         List       *joinclauses;
1568         List       *otherclauses;
1569         NestLoop   *join_plan;
1570
1571         /*
1572          * If the inner path is a nestloop inner indexscan, it might be using some
1573          * of the join quals as index quals, in which case we don't have to check
1574          * them again at the join node.  Remove any join quals that are redundant.
1575          */
1576         joinrestrictclauses =
1577                 select_nonredundant_join_clauses(root,
1578                                                                                  joinrestrictclauses,
1579                                                                                  best_path->innerjoinpath);
1580
1581         /* Sort join qual clauses into best execution order */
1582         joinrestrictclauses = order_qual_clauses(root, joinrestrictclauses);
1583
1584         /* Get the join qual clauses (in plain expression form) */
1585         /* Any pseudoconstant clauses are ignored here */
1586         if (IS_OUTER_JOIN(best_path->jointype))
1587         {
1588                 extract_actual_join_clauses(joinrestrictclauses,
1589                                                                         &joinclauses, &otherclauses);
1590         }
1591         else
1592         {
1593                 /* We can treat all clauses alike for an inner join */
1594                 joinclauses = extract_actual_clauses(joinrestrictclauses, false);
1595                 otherclauses = NIL;
1596         }
1597
1598         join_plan = make_nestloop(tlist,
1599                                                           joinclauses,
1600                                                           otherclauses,
1601                                                           outer_plan,
1602                                                           inner_plan,
1603                                                           best_path->jointype);
1604
1605         copy_path_costsize(&join_plan->join.plan, &best_path->path);
1606
1607         return join_plan;
1608 }
1609
1610 static MergeJoin *
1611 create_mergejoin_plan(PlannerInfo *root,
1612                                           MergePath *best_path,
1613                                           Plan *outer_plan,
1614                                           Plan *inner_plan)
1615 {
1616         List       *tlist = build_relation_tlist(best_path->jpath.path.parent);
1617         List       *joinclauses;
1618         List       *otherclauses;
1619         List       *mergeclauses;
1620         List       *outerpathkeys;
1621         List       *innerpathkeys;
1622         int                     nClauses;
1623         Oid                *mergefamilies;
1624         int                *mergestrategies;
1625         bool       *mergenullsfirst;
1626         MergeJoin  *join_plan;
1627         int                     i;
1628         ListCell   *lc;
1629         ListCell   *lop;
1630         ListCell   *lip;
1631
1632         /* Sort join qual clauses into best execution order */
1633         /* NB: do NOT reorder the mergeclauses */
1634         joinclauses = order_qual_clauses(root, best_path->jpath.joinrestrictinfo);
1635
1636         /* Get the join qual clauses (in plain expression form) */
1637         /* Any pseudoconstant clauses are ignored here */
1638         if (IS_OUTER_JOIN(best_path->jpath.jointype))
1639         {
1640                 extract_actual_join_clauses(joinclauses,
1641                                                                         &joinclauses, &otherclauses);
1642         }
1643         else
1644         {
1645                 /* We can treat all clauses alike for an inner join */
1646                 joinclauses = extract_actual_clauses(joinclauses, false);
1647                 otherclauses = NIL;
1648         }
1649
1650         /*
1651          * Remove the mergeclauses from the list of join qual clauses, leaving the
1652          * list of quals that must be checked as qpquals.
1653          */
1654         mergeclauses = get_actual_clauses(best_path->path_mergeclauses);
1655         joinclauses = list_difference(joinclauses, mergeclauses);
1656
1657         /*
1658          * Rearrange mergeclauses, if needed, so that the outer variable is always
1659          * on the left; mark the mergeclause restrictinfos with correct
1660          * outer_is_left status.
1661          */
1662         mergeclauses = get_switched_clauses(best_path->path_mergeclauses,
1663                                                          best_path->jpath.outerjoinpath->parent->relids);
1664
1665         /*
1666          * Create explicit sort nodes for the outer and inner join paths if
1667          * necessary.  The sort cost was already accounted for in the path. Make
1668          * sure there are no excess columns in the inputs if sorting.
1669          */
1670         if (best_path->outersortkeys)
1671         {
1672                 disuse_physical_tlist(outer_plan, best_path->jpath.outerjoinpath);
1673                 outer_plan = (Plan *)
1674                         make_sort_from_pathkeys(root,
1675                                                                         outer_plan,
1676                                                                         best_path->outersortkeys,
1677                                                                         -1.0);
1678                 outerpathkeys = best_path->outersortkeys;
1679         }
1680         else
1681                 outerpathkeys = best_path->jpath.outerjoinpath->pathkeys;
1682
1683         if (best_path->innersortkeys)
1684         {
1685                 disuse_physical_tlist(inner_plan, best_path->jpath.innerjoinpath);
1686                 inner_plan = (Plan *)
1687                         make_sort_from_pathkeys(root,
1688                                                                         inner_plan,
1689                                                                         best_path->innersortkeys,
1690                                                                         -1.0);
1691                 innerpathkeys = best_path->innersortkeys;
1692         }
1693         else
1694                 innerpathkeys = best_path->jpath.innerjoinpath->pathkeys;
1695
1696         /*
1697          * If inner plan is a sort that is expected to spill to disk, add a
1698          * materialize node to shield it from the need to handle mark/restore.
1699          * This will allow it to perform the last merge pass on-the-fly, while in
1700          * most cases not requiring the materialize to spill to disk.
1701          *
1702          * XXX really, Sort oughta do this for itself, probably, to avoid the
1703          * overhead of a separate plan node.
1704          */
1705         if (IsA(inner_plan, Sort) &&
1706                 sort_exceeds_work_mem((Sort *) inner_plan))
1707         {
1708                 Plan       *matplan = (Plan *) make_material(inner_plan);
1709
1710                 /*
1711                  * We assume the materialize will not spill to disk, and therefore
1712                  * charge just cpu_tuple_cost per tuple.  (Keep this estimate in sync
1713                  * with similar ones in cost_mergejoin and create_mergejoin_path.)
1714                  */
1715                 copy_plan_costsize(matplan, inner_plan);
1716                 matplan->total_cost += cpu_tuple_cost * matplan->plan_rows;
1717
1718                 inner_plan = matplan;
1719         }
1720
1721         /*
1722          * Compute the opfamily/strategy/nullsfirst arrays needed by the executor.
1723          * The information is in the pathkeys for the two inputs, but we need to
1724          * be careful about the possibility of mergeclauses sharing a pathkey
1725          * (compare find_mergeclauses_for_pathkeys()).
1726          */
1727         nClauses = list_length(mergeclauses);
1728         Assert(nClauses == list_length(best_path->path_mergeclauses));
1729         mergefamilies = (Oid *) palloc(nClauses * sizeof(Oid));
1730         mergestrategies = (int *) palloc(nClauses * sizeof(int));
1731         mergenullsfirst = (bool *) palloc(nClauses * sizeof(bool));
1732
1733         lop = list_head(outerpathkeys);
1734         lip = list_head(innerpathkeys);
1735         i = 0;
1736         foreach(lc, best_path->path_mergeclauses)
1737         {
1738                 RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
1739                 EquivalenceClass *oeclass;
1740                 EquivalenceClass *ieclass;
1741                 PathKey    *opathkey;
1742                 PathKey    *ipathkey;
1743                 EquivalenceClass *opeclass;
1744                 EquivalenceClass *ipeclass;
1745                 ListCell   *l2;
1746
1747                 /* fetch outer/inner eclass from mergeclause */
1748                 Assert(IsA(rinfo, RestrictInfo));
1749                 if (rinfo->outer_is_left)
1750                 {
1751                         oeclass = rinfo->left_ec;
1752                         ieclass = rinfo->right_ec;
1753                 }
1754                 else
1755                 {
1756                         oeclass = rinfo->right_ec;
1757                         ieclass = rinfo->left_ec;
1758                 }
1759                 Assert(oeclass != NULL);
1760                 Assert(ieclass != NULL);
1761
1762                 /*
1763                  * For debugging purposes, we check that the eclasses match the
1764                  * paths' pathkeys.  In typical cases the merge clauses are one-to-one
1765                  * with the pathkeys, but when dealing with partially redundant query
1766                  * conditions, we might have clauses that re-reference earlier path
1767                  * keys.  The case that we need to reject is where a pathkey is
1768                  * entirely skipped over.
1769                  *
1770                  * lop and lip reference the first as-yet-unused pathkey elements;
1771                  * it's okay to match them, or any element before them.  If they're
1772                  * NULL then we have found all pathkey elements to be used.
1773                  */
1774                 if (lop)
1775                 {
1776                         opathkey = (PathKey *) lfirst(lop);
1777                         opeclass = opathkey->pk_eclass;
1778                         if (oeclass == opeclass)
1779                         {
1780                                 /* fast path for typical case */
1781                                 lop = lnext(lop);
1782                         }
1783                         else
1784                         {
1785                                 /* redundant clauses ... must match something before lop */
1786                                 foreach(l2, outerpathkeys)
1787                                 {
1788                                         if (l2 == lop)
1789                                                 break;
1790                                         opathkey = (PathKey *) lfirst(l2);
1791                                         opeclass = opathkey->pk_eclass;
1792                                         if (oeclass == opeclass)
1793                                                 break;
1794                                 }
1795                                 if (oeclass != opeclass)
1796                                         elog(ERROR, "outer pathkeys do not match mergeclauses");
1797                         }
1798                 }
1799                 else
1800                 {
1801                         /* redundant clauses ... must match some already-used pathkey */
1802                         opathkey = NULL;
1803                         opeclass = NULL;
1804                         foreach(l2, outerpathkeys)
1805                         {
1806                                 opathkey = (PathKey *) lfirst(l2);
1807                                 opeclass = opathkey->pk_eclass;
1808                                 if (oeclass == opeclass)
1809                                         break;
1810                         }
1811                         if (l2 == NULL)
1812                                 elog(ERROR, "outer pathkeys do not match mergeclauses");
1813                 }
1814
1815                 if (lip)
1816                 {
1817                         ipathkey = (PathKey *) lfirst(lip);
1818                         ipeclass = ipathkey->pk_eclass;
1819                         if (ieclass == ipeclass)
1820                         {
1821                                 /* fast path for typical case */
1822                                 lip = lnext(lip);
1823                         }
1824                         else
1825                         {
1826                                 /* redundant clauses ... must match something before lip */
1827                                 foreach(l2, innerpathkeys)
1828                                 {
1829                                         if (l2 == lip)
1830                                                 break;
1831                                         ipathkey = (PathKey *) lfirst(l2);
1832                                         ipeclass = ipathkey->pk_eclass;
1833                                         if (ieclass == ipeclass)
1834                                                 break;
1835                                 }
1836                                 if (ieclass != ipeclass)
1837                                         elog(ERROR, "inner pathkeys do not match mergeclauses");
1838                         }
1839                 }
1840                 else
1841                 {
1842                         /* redundant clauses ... must match some already-used pathkey */
1843                         ipathkey = NULL;
1844                         ipeclass = NULL;
1845                         foreach(l2, innerpathkeys)
1846                         {
1847                                 ipathkey = (PathKey *) lfirst(l2);
1848                                 ipeclass = ipathkey->pk_eclass;
1849                                 if (ieclass == ipeclass)
1850                                         break;
1851                         }
1852                         if (l2 == NULL)
1853                                 elog(ERROR, "inner pathkeys do not match mergeclauses");
1854                 }
1855
1856                 /* pathkeys should match each other too (more debugging) */
1857                 if (opathkey->pk_opfamily != ipathkey->pk_opfamily ||
1858                         opathkey->pk_strategy != ipathkey->pk_strategy ||
1859                         opathkey->pk_nulls_first != ipathkey->pk_nulls_first)
1860                         elog(ERROR, "left and right pathkeys do not match in mergejoin");
1861
1862                 /* OK, save info for executor */
1863                 mergefamilies[i] = opathkey->pk_opfamily;
1864                 mergestrategies[i] = opathkey->pk_strategy;
1865                 mergenullsfirst[i] = opathkey->pk_nulls_first;
1866                 i++;
1867         }
1868
1869         /*
1870          * Note: it is not an error if we have additional pathkey elements
1871          * (i.e., lop or lip isn't NULL here).  The input paths might be
1872          * better-sorted than we need for the current mergejoin.
1873          */
1874
1875         /*
1876          * Now we can build the mergejoin node.
1877          */
1878         join_plan = make_mergejoin(tlist,
1879                                                            joinclauses,
1880                                                            otherclauses,
1881                                                            mergeclauses,
1882                                                            mergefamilies,
1883                                                            mergestrategies,
1884                                                            mergenullsfirst,
1885                                                            outer_plan,
1886                                                            inner_plan,
1887                                                            best_path->jpath.jointype);
1888
1889         copy_path_costsize(&join_plan->join.plan, &best_path->jpath.path);
1890
1891         return join_plan;
1892 }
1893
1894 static HashJoin *
1895 create_hashjoin_plan(PlannerInfo *root,
1896                                          HashPath *best_path,
1897                                          Plan *outer_plan,
1898                                          Plan *inner_plan)
1899 {
1900         List       *tlist = build_relation_tlist(best_path->jpath.path.parent);
1901         List       *joinclauses;
1902         List       *otherclauses;
1903         List       *hashclauses;
1904         Oid                     skewTable = InvalidOid;
1905         AttrNumber      skewColumn = InvalidAttrNumber;
1906         Oid                     skewColType = InvalidOid;
1907         int32           skewColTypmod = -1;
1908         HashJoin   *join_plan;
1909         Hash       *hash_plan;
1910
1911         /* Sort join qual clauses into best execution order */
1912         joinclauses = order_qual_clauses(root, best_path->jpath.joinrestrictinfo);
1913         /* There's no point in sorting the hash clauses ... */
1914
1915         /* Get the join qual clauses (in plain expression form) */
1916         /* Any pseudoconstant clauses are ignored here */
1917         if (IS_OUTER_JOIN(best_path->jpath.jointype))
1918         {
1919                 extract_actual_join_clauses(joinclauses,
1920                                                                         &joinclauses, &otherclauses);
1921         }
1922         else
1923         {
1924                 /* We can treat all clauses alike for an inner join */
1925                 joinclauses = extract_actual_clauses(joinclauses, false);
1926                 otherclauses = NIL;
1927         }
1928
1929         /*
1930          * Remove the hashclauses from the list of join qual clauses, leaving the
1931          * list of quals that must be checked as qpquals.
1932          */
1933         hashclauses = get_actual_clauses(best_path->path_hashclauses);
1934         joinclauses = list_difference(joinclauses, hashclauses);
1935
1936         /*
1937          * Rearrange hashclauses, if needed, so that the outer variable is always
1938          * on the left.
1939          */
1940         hashclauses = get_switched_clauses(best_path->path_hashclauses,
1941                                                          best_path->jpath.outerjoinpath->parent->relids);
1942
1943         /* We don't want any excess columns in the hashed tuples */
1944         disuse_physical_tlist(inner_plan, best_path->jpath.innerjoinpath);
1945
1946         /* If we expect batching, suppress excess columns in outer tuples too */
1947         if (best_path->num_batches > 1)
1948                 disuse_physical_tlist(outer_plan, best_path->jpath.outerjoinpath);
1949
1950         /*
1951          * If there is a single join clause and we can identify the outer variable
1952          * as a simple column reference, supply its identity for possible use in
1953          * skew optimization.  (Note: in principle we could do skew optimization
1954          * with multiple join clauses, but we'd have to be able to determine the
1955          * most common combinations of outer values, which we don't currently have
1956          * enough stats for.)
1957          */
1958         if (list_length(hashclauses) == 1)
1959         {
1960                 OpExpr     *clause = (OpExpr *) linitial(hashclauses);
1961                 Node       *node;
1962
1963                 Assert(is_opclause(clause));
1964                 node = (Node *) linitial(clause->args);
1965                 if (IsA(node, RelabelType))
1966                         node = (Node *) ((RelabelType *) node)->arg;
1967                 if (IsA(node, Var))
1968                 {
1969                         Var                *var = (Var *) node;
1970                         RangeTblEntry *rte;
1971
1972                         rte = root->simple_rte_array[var->varno];
1973                         if (rte->rtekind == RTE_RELATION)
1974                         {
1975                                 skewTable = rte->relid;
1976                                 skewColumn = var->varattno;
1977                                 skewColType = var->vartype;
1978                                 skewColTypmod = var->vartypmod;
1979                         }
1980                 }
1981         }
1982
1983         /*
1984          * Build the hash node and hash join node.
1985          */
1986         hash_plan = make_hash(inner_plan,
1987                                                   skewTable,
1988                                                   skewColumn,
1989                                                   skewColType,
1990                                                   skewColTypmod);
1991         join_plan = make_hashjoin(tlist,
1992                                                           joinclauses,
1993                                                           otherclauses,
1994                                                           hashclauses,
1995                                                           outer_plan,
1996                                                           (Plan *) hash_plan,
1997                                                           best_path->jpath.jointype);
1998
1999         copy_path_costsize(&join_plan->join.plan, &best_path->jpath.path);
2000
2001         return join_plan;
2002 }
2003
2004
2005 /*****************************************************************************
2006  *
2007  *      SUPPORTING ROUTINES
2008  *
2009  *****************************************************************************/
2010
2011 /*
2012  * fix_indexqual_references
2013  *        Adjust indexqual clauses to the form the executor's indexqual
2014  *        machinery needs.
2015  *
2016  * We have three tasks here:
2017  *      * Remove RestrictInfo nodes from the input clauses.
2018  *      * Index keys must be represented by Var nodes with varattno set to the
2019  *        index's attribute number, not the attribute number in the original rel.
2020  *      * If the index key is on the right, commute the clause to put it on the
2021  *        left.
2022  *
2023  * The result is a modified copy of the indexquals list --- the
2024  * original is not changed.  Note also that the copy shares no substructure
2025  * with the original; this is needed in case there is a subplan in it (we need
2026  * two separate copies of the subplan tree, or things will go awry).
2027  */
2028 static List *
2029 fix_indexqual_references(List *indexquals, IndexPath *index_path)
2030 {
2031         IndexOptInfo *index = index_path->indexinfo;
2032         List       *fixed_indexquals;
2033         ListCell   *l;
2034
2035         fixed_indexquals = NIL;
2036
2037         /*
2038          * For each qual clause, commute if needed to put the indexkey operand on
2039          * the left, and then fix its varattno.  (We do not need to change the
2040          * other side of the clause.)
2041          */
2042         foreach(l, indexquals)
2043         {
2044                 RestrictInfo *rinfo = (RestrictInfo *) lfirst(l);
2045                 Expr       *clause;
2046
2047                 Assert(IsA(rinfo, RestrictInfo));
2048
2049                 /*
2050                  * Make a copy that will become the fixed clause.
2051                  *
2052                  * We used to try to do a shallow copy here, but that fails if there
2053                  * is a subplan in the arguments of the opclause.  So just do a full
2054                  * copy.
2055                  */
2056                 clause = (Expr *) copyObject((Node *) rinfo->clause);
2057
2058                 if (IsA(clause, OpExpr))
2059                 {
2060                         OpExpr     *op = (OpExpr *) clause;
2061
2062                         if (list_length(op->args) != 2)
2063                                 elog(ERROR, "indexqual clause is not binary opclause");
2064
2065                         /*
2066                          * Check to see if the indexkey is on the right; if so, commute
2067                          * the clause. The indexkey should be the side that refers to
2068                          * (only) the base relation.
2069                          */
2070                         if (!bms_equal(rinfo->left_relids, index->rel->relids))
2071                                 CommuteOpExpr(op);
2072
2073                         /*
2074                          * Now, determine which index attribute this is and change the
2075                          * indexkey operand as needed.
2076                          */
2077                         linitial(op->args) = fix_indexqual_operand(linitial(op->args),
2078                                                                                                            index);
2079                 }
2080                 else if (IsA(clause, RowCompareExpr))
2081                 {
2082                         RowCompareExpr *rc = (RowCompareExpr *) clause;
2083                         ListCell   *lc;
2084
2085                         /*
2086                          * Check to see if the indexkey is on the right; if so, commute
2087                          * the clause. The indexkey should be the side that refers to
2088                          * (only) the base relation.
2089                          */
2090                         if (!bms_overlap(pull_varnos(linitial(rc->largs)),
2091                                                          index->rel->relids))
2092                                 CommuteRowCompareExpr(rc);
2093
2094                         /*
2095                          * For each column in the row comparison, determine which index
2096                          * attribute this is and change the indexkey operand as needed.
2097                          */
2098                         foreach(lc, rc->largs)
2099                         {
2100                                 lfirst(lc) = fix_indexqual_operand(lfirst(lc),
2101                                                                                                    index);
2102                         }
2103                 }
2104                 else if (IsA(clause, ScalarArrayOpExpr))
2105                 {
2106                         ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) clause;
2107
2108                         /* Never need to commute... */
2109
2110                         /*
2111                          * Determine which index attribute this is and change the indexkey
2112                          * operand as needed.
2113                          */
2114                         linitial(saop->args) = fix_indexqual_operand(linitial(saop->args),
2115                                                                                                                  index);
2116                 }
2117                 else if (IsA(clause, NullTest))
2118                 {
2119                         NullTest   *nt = (NullTest *) clause;
2120
2121                         Assert(nt->nulltesttype == IS_NULL);
2122                         nt->arg = (Expr *) fix_indexqual_operand((Node *) nt->arg,
2123                                                                                                          index);
2124                 }
2125                 else
2126                         elog(ERROR, "unsupported indexqual type: %d",
2127                                  (int) nodeTag(clause));
2128
2129                 fixed_indexquals = lappend(fixed_indexquals, clause);
2130         }
2131
2132         return fixed_indexquals;
2133 }
2134
2135 static Node *
2136 fix_indexqual_operand(Node *node, IndexOptInfo *index)
2137 {
2138         /*
2139          * We represent index keys by Var nodes having the varno of the base table
2140          * but varattno equal to the index's attribute number (index column
2141          * position).  This is a bit hokey ... would be cleaner to use a
2142          * special-purpose node type that could not be mistaken for a regular Var.
2143          * But it will do for now.
2144          */
2145         Var                *result;
2146         int                     pos;
2147         ListCell   *indexpr_item;
2148
2149         /*
2150          * Remove any binary-compatible relabeling of the indexkey
2151          */
2152         if (IsA(node, RelabelType))
2153                 node = (Node *) ((RelabelType *) node)->arg;
2154
2155         if (IsA(node, Var) &&
2156                 ((Var *) node)->varno == index->rel->relid)
2157         {
2158                 /* Try to match against simple index columns */
2159                 int                     varatt = ((Var *) node)->varattno;
2160
2161                 if (varatt != 0)
2162                 {
2163                         for (pos = 0; pos < index->ncolumns; pos++)
2164                         {
2165                                 if (index->indexkeys[pos] == varatt)
2166                                 {
2167                                         result = (Var *) copyObject(node);
2168                                         result->varattno = pos + 1;
2169                                         return (Node *) result;
2170                                 }
2171                         }
2172                 }
2173         }
2174
2175         /* Try to match against index expressions */
2176         indexpr_item = list_head(index->indexprs);
2177         for (pos = 0; pos < index->ncolumns; pos++)
2178         {
2179                 if (index->indexkeys[pos] == 0)
2180                 {
2181                         Node       *indexkey;
2182
2183                         if (indexpr_item == NULL)
2184                                 elog(ERROR, "too few entries in indexprs list");
2185                         indexkey = (Node *) lfirst(indexpr_item);
2186                         if (indexkey && IsA(indexkey, RelabelType))
2187                                 indexkey = (Node *) ((RelabelType *) indexkey)->arg;
2188                         if (equal(node, indexkey))
2189                         {
2190                                 /* Found a match */
2191                                 result = makeVar(index->rel->relid, pos + 1,
2192                                                                  exprType(lfirst(indexpr_item)), -1,
2193                                                                  0);
2194                                 return (Node *) result;
2195                         }
2196                         indexpr_item = lnext(indexpr_item);
2197                 }
2198         }
2199
2200         /* Ooops... */
2201         elog(ERROR, "node is not an index attribute");
2202         return NULL;                            /* keep compiler quiet */
2203 }
2204
2205 /*
2206  * get_switched_clauses
2207  *        Given a list of merge or hash joinclauses (as RestrictInfo nodes),
2208  *        extract the bare clauses, and rearrange the elements within the
2209  *        clauses, if needed, so the outer join variable is on the left and
2210  *        the inner is on the right.  The original clause data structure is not
2211  *        touched; a modified list is returned.  We do, however, set the transient
2212  *        outer_is_left field in each RestrictInfo to show which side was which.
2213  */
2214 static List *
2215 get_switched_clauses(List *clauses, Relids outerrelids)
2216 {
2217         List       *t_list = NIL;
2218         ListCell   *l;
2219
2220         foreach(l, clauses)
2221         {
2222                 RestrictInfo *restrictinfo = (RestrictInfo *) lfirst(l);
2223                 OpExpr     *clause = (OpExpr *) restrictinfo->clause;
2224
2225                 Assert(is_opclause(clause));
2226                 if (bms_is_subset(restrictinfo->right_relids, outerrelids))
2227                 {
2228                         /*
2229                          * Duplicate just enough of the structure to allow commuting the
2230                          * clause without changing the original list.  Could use
2231                          * copyObject, but a complete deep copy is overkill.
2232                          */
2233                         OpExpr     *temp = makeNode(OpExpr);
2234
2235                         temp->opno = clause->opno;
2236                         temp->opfuncid = InvalidOid;
2237                         temp->opresulttype = clause->opresulttype;
2238                         temp->opretset = clause->opretset;
2239                         temp->args = list_copy(clause->args);
2240                         temp->location = clause->location;
2241                         /* Commute it --- note this modifies the temp node in-place. */
2242                         CommuteOpExpr(temp);
2243                         t_list = lappend(t_list, temp);
2244                         restrictinfo->outer_is_left = false;
2245                 }
2246                 else
2247                 {
2248                         Assert(bms_is_subset(restrictinfo->left_relids, outerrelids));
2249                         t_list = lappend(t_list, clause);
2250                         restrictinfo->outer_is_left = true;
2251                 }
2252         }
2253         return t_list;
2254 }
2255
2256 /*
2257  * order_qual_clauses
2258  *              Given a list of qual clauses that will all be evaluated at the same
2259  *              plan node, sort the list into the order we want to check the quals
2260  *              in at runtime.
2261  *
2262  * Ideally the order should be driven by a combination of execution cost and
2263  * selectivity, but it's not immediately clear how to account for both,
2264  * and given the uncertainty of the estimates the reliability of the decisions
2265  * would be doubtful anyway.  So we just order by estimated per-tuple cost,
2266  * being careful not to change the order when (as is often the case) the
2267  * estimates are identical.
2268  *
2269  * Although this will work on either bare clauses or RestrictInfos, it's
2270  * much faster to apply it to RestrictInfos, since it can re-use cost
2271  * information that is cached in RestrictInfos.
2272  *
2273  * Note: some callers pass lists that contain entries that will later be
2274  * removed; this is the easiest way to let this routine see RestrictInfos
2275  * instead of bare clauses.  It's OK because we only sort by cost, but
2276  * a cost/selectivity combination would likely do the wrong thing.
2277  */
2278 static List *
2279 order_qual_clauses(PlannerInfo *root, List *clauses)
2280 {
2281         typedef struct
2282         {
2283                 Node       *clause;
2284                 Cost            cost;
2285         } QualItem;
2286         int                     nitems = list_length(clauses);
2287         QualItem   *items;
2288         ListCell   *lc;
2289         int                     i;
2290         List       *result;
2291
2292         /* No need to work hard for 0 or 1 clause */
2293         if (nitems <= 1)
2294                 return clauses;
2295
2296         /*
2297          * Collect the items and costs into an array.  This is to avoid repeated
2298          * cost_qual_eval work if the inputs aren't RestrictInfos.
2299          */
2300         items = (QualItem *) palloc(nitems * sizeof(QualItem));
2301         i = 0;
2302         foreach(lc, clauses)
2303         {
2304                 Node       *clause = (Node *) lfirst(lc);
2305                 QualCost        qcost;
2306
2307                 cost_qual_eval_node(&qcost, clause, root);
2308                 items[i].clause = clause;
2309                 items[i].cost = qcost.per_tuple;
2310                 i++;
2311         }
2312
2313         /*
2314          * Sort.  We don't use qsort() because it's not guaranteed stable for
2315          * equal keys.  The expected number of entries is small enough that a
2316          * simple insertion sort should be good enough.
2317          */
2318         for (i = 1; i < nitems; i++)
2319         {
2320                 QualItem        newitem = items[i];
2321                 int                     j;
2322
2323                 /* insert newitem into the already-sorted subarray */
2324                 for (j = i; j > 0; j--)
2325                 {
2326                         if (newitem.cost >= items[j - 1].cost)
2327                                 break;
2328                         items[j] = items[j - 1];
2329                 }
2330                 items[j] = newitem;
2331         }
2332
2333         /* Convert back to a list */
2334         result = NIL;
2335         for (i = 0; i < nitems; i++)
2336                 result = lappend(result, items[i].clause);
2337
2338         return result;
2339 }
2340
2341 /*
2342  * Copy cost and size info from a Path node to the Plan node created from it.
2343  * The executor won't use this info, but it's needed by EXPLAIN.
2344  */
2345 static void
2346 copy_path_costsize(Plan *dest, Path *src)
2347 {
2348         if (src)
2349         {
2350                 dest->startup_cost = src->startup_cost;
2351                 dest->total_cost = src->total_cost;
2352                 dest->plan_rows = src->parent->rows;
2353                 dest->plan_width = src->parent->width;
2354         }
2355         else
2356         {
2357                 dest->startup_cost = 0;
2358                 dest->total_cost = 0;
2359                 dest->plan_rows = 0;
2360                 dest->plan_width = 0;
2361         }
2362 }
2363
2364 /*
2365  * Copy cost and size info from a lower plan node to an inserted node.
2366  * This is not critical, since the decisions have already been made,
2367  * but it helps produce more reasonable-looking EXPLAIN output.
2368  * (Some callers alter the info after copying it.)
2369  */
2370 static void
2371 copy_plan_costsize(Plan *dest, Plan *src)
2372 {
2373         if (src)
2374         {
2375                 dest->startup_cost = src->startup_cost;
2376                 dest->total_cost = src->total_cost;
2377                 dest->plan_rows = src->plan_rows;
2378                 dest->plan_width = src->plan_width;
2379         }
2380         else
2381         {
2382                 dest->startup_cost = 0;
2383                 dest->total_cost = 0;
2384                 dest->plan_rows = 0;
2385                 dest->plan_width = 0;
2386         }
2387 }
2388
2389
2390 /*****************************************************************************
2391  *
2392  *      PLAN NODE BUILDING ROUTINES
2393  *
2394  * Some of these are exported because they are called to build plan nodes
2395  * in contexts where we're not deriving the plan node from a path node.
2396  *
2397  *****************************************************************************/
2398
2399 static SeqScan *
2400 make_seqscan(List *qptlist,
2401                          List *qpqual,
2402                          Index scanrelid)
2403 {
2404         SeqScan    *node = makeNode(SeqScan);
2405         Plan       *plan = &node->plan;
2406
2407         /* cost should be inserted by caller */
2408         plan->targetlist = qptlist;
2409         plan->qual = qpqual;
2410         plan->lefttree = NULL;
2411         plan->righttree = NULL;
2412         node->scanrelid = scanrelid;
2413
2414         return node;
2415 }
2416
2417 static IndexScan *
2418 make_indexscan(List *qptlist,
2419                            List *qpqual,
2420                            Index scanrelid,
2421                            Oid indexid,
2422                            List *indexqual,
2423                            List *indexqualorig,
2424                            ScanDirection indexscandir)
2425 {
2426         IndexScan  *node = makeNode(IndexScan);
2427         Plan       *plan = &node->scan.plan;
2428
2429         /* cost should be inserted by caller */
2430         plan->targetlist = qptlist;
2431         plan->qual = qpqual;
2432         plan->lefttree = NULL;
2433         plan->righttree = NULL;
2434         node->scan.scanrelid = scanrelid;
2435         node->indexid = indexid;
2436         node->indexqual = indexqual;
2437         node->indexqualorig = indexqualorig;
2438         node->indexorderdir = indexscandir;
2439
2440         return node;
2441 }
2442
2443 static BitmapIndexScan *
2444 make_bitmap_indexscan(Index scanrelid,
2445                                           Oid indexid,
2446                                           List *indexqual,
2447                                           List *indexqualorig)
2448 {
2449         BitmapIndexScan *node = makeNode(BitmapIndexScan);
2450         Plan       *plan = &node->scan.plan;
2451
2452         /* cost should be inserted by caller */
2453         plan->targetlist = NIL;         /* not used */
2454         plan->qual = NIL;                       /* not used */
2455         plan->lefttree = NULL;
2456         plan->righttree = NULL;
2457         node->scan.scanrelid = scanrelid;
2458         node->indexid = indexid;
2459         node->indexqual = indexqual;
2460         node->indexqualorig = indexqualorig;
2461
2462         return node;
2463 }
2464
2465 static BitmapHeapScan *
2466 make_bitmap_heapscan(List *qptlist,
2467                                          List *qpqual,
2468                                          Plan *lefttree,
2469                                          List *bitmapqualorig,
2470                                          Index scanrelid)
2471 {
2472         BitmapHeapScan *node = makeNode(BitmapHeapScan);
2473         Plan       *plan = &node->scan.plan;
2474
2475         /* cost should be inserted by caller */
2476         plan->targetlist = qptlist;
2477         plan->qual = qpqual;
2478         plan->lefttree = lefttree;
2479         plan->righttree = NULL;
2480         node->scan.scanrelid = scanrelid;
2481         node->bitmapqualorig = bitmapqualorig;
2482
2483         return node;
2484 }
2485
2486 static TidScan *
2487 make_tidscan(List *qptlist,
2488                          List *qpqual,
2489                          Index scanrelid,
2490                          List *tidquals)
2491 {
2492         TidScan    *node = makeNode(TidScan);
2493         Plan       *plan = &node->scan.plan;
2494
2495         /* cost should be inserted by caller */
2496         plan->targetlist = qptlist;
2497         plan->qual = qpqual;
2498         plan->lefttree = NULL;
2499         plan->righttree = NULL;
2500         node->scan.scanrelid = scanrelid;
2501         node->tidquals = tidquals;
2502
2503         return node;
2504 }
2505
2506 SubqueryScan *
2507 make_subqueryscan(List *qptlist,
2508                                   List *qpqual,
2509                                   Index scanrelid,
2510                                   Plan *subplan,
2511                                   List *subrtable)
2512 {
2513         SubqueryScan *node = makeNode(SubqueryScan);
2514         Plan       *plan = &node->scan.plan;
2515
2516         /*
2517          * Cost is figured here for the convenience of prepunion.c.  Note this is
2518          * only correct for the case where qpqual is empty; otherwise caller
2519          * should overwrite cost with a better estimate.
2520          */
2521         copy_plan_costsize(plan, subplan);
2522         plan->total_cost += cpu_tuple_cost * subplan->plan_rows;
2523
2524         plan->targetlist = qptlist;
2525         plan->qual = qpqual;
2526         plan->lefttree = NULL;
2527         plan->righttree = NULL;
2528         node->scan.scanrelid = scanrelid;
2529         node->subplan = subplan;
2530         node->subrtable = subrtable;
2531
2532         return node;
2533 }
2534
2535 static FunctionScan *
2536 make_functionscan(List *qptlist,
2537                                   List *qpqual,
2538                                   Index scanrelid,
2539                                   Node *funcexpr,
2540                                   List *funccolnames,
2541                                   List *funccoltypes,
2542                                   List *funccoltypmods)
2543 {
2544         FunctionScan *node = makeNode(FunctionScan);
2545         Plan       *plan = &node->scan.plan;
2546
2547         /* cost should be inserted by caller */
2548         plan->targetlist = qptlist;
2549         plan->qual = qpqual;
2550         plan->lefttree = NULL;
2551         plan->righttree = NULL;
2552         node->scan.scanrelid = scanrelid;
2553         node->funcexpr = funcexpr;
2554         node->funccolnames = funccolnames;
2555         node->funccoltypes = funccoltypes;
2556         node->funccoltypmods = funccoltypmods;
2557
2558         return node;
2559 }
2560
2561 static ValuesScan *
2562 make_valuesscan(List *qptlist,
2563                                 List *qpqual,
2564                                 Index scanrelid,
2565                                 List *values_lists)
2566 {
2567         ValuesScan *node = makeNode(ValuesScan);
2568         Plan       *plan = &node->scan.plan;
2569
2570         /* cost should be inserted by caller */
2571         plan->targetlist = qptlist;
2572         plan->qual = qpqual;
2573         plan->lefttree = NULL;
2574         plan->righttree = NULL;
2575         node->scan.scanrelid = scanrelid;
2576         node->values_lists = values_lists;
2577
2578         return node;
2579 }
2580
2581 static CteScan *
2582 make_ctescan(List *qptlist,
2583                          List *qpqual,
2584                          Index scanrelid,
2585                          int ctePlanId,
2586                          int cteParam)
2587 {
2588         CteScan    *node = makeNode(CteScan);
2589         Plan       *plan = &node->scan.plan;
2590
2591         /* cost should be inserted by caller */
2592         plan->targetlist = qptlist;
2593         plan->qual = qpqual;
2594         plan->lefttree = NULL;
2595         plan->righttree = NULL;
2596         node->scan.scanrelid = scanrelid;
2597         node->ctePlanId = ctePlanId;
2598         node->cteParam = cteParam;
2599
2600         return node;
2601 }
2602
2603 static WorkTableScan *
2604 make_worktablescan(List *qptlist,
2605                                    List *qpqual,
2606                                    Index scanrelid,
2607                                    int wtParam)
2608 {
2609         WorkTableScan *node = makeNode(WorkTableScan);
2610         Plan       *plan = &node->scan.plan;
2611
2612         /* cost should be inserted by caller */
2613         plan->targetlist = qptlist;
2614         plan->qual = qpqual;
2615         plan->lefttree = NULL;
2616         plan->righttree = NULL;
2617         node->scan.scanrelid = scanrelid;
2618         node->wtParam = wtParam;
2619
2620         return node;
2621 }
2622
2623 Append *
2624 make_append(List *appendplans, List *tlist)
2625 {
2626         Append     *node = makeNode(Append);
2627         Plan       *plan = &node->plan;
2628         double          total_size;
2629         ListCell   *subnode;
2630
2631         /*
2632          * Compute cost as sum of subplan costs.  We charge nothing extra for the
2633          * Append itself, which perhaps is too optimistic, but since it doesn't do
2634          * any selection or projection, it is a pretty cheap node.
2635          */
2636         plan->startup_cost = 0;
2637         plan->total_cost = 0;
2638         plan->plan_rows = 0;
2639         total_size = 0;
2640         foreach(subnode, appendplans)
2641         {
2642                 Plan       *subplan = (Plan *) lfirst(subnode);
2643
2644                 if (subnode == list_head(appendplans))  /* first node? */
2645                         plan->startup_cost = subplan->startup_cost;
2646                 plan->total_cost += subplan->total_cost;
2647                 plan->plan_rows += subplan->plan_rows;
2648                 total_size += subplan->plan_width * subplan->plan_rows;
2649         }
2650         if (plan->plan_rows > 0)
2651                 plan->plan_width = rint(total_size / plan->plan_rows);
2652         else
2653                 plan->plan_width = 0;
2654
2655         plan->targetlist = tlist;
2656         plan->qual = NIL;
2657         plan->lefttree = NULL;
2658         plan->righttree = NULL;
2659         node->appendplans = appendplans;
2660
2661         return node;
2662 }
2663
2664 RecursiveUnion *
2665 make_recursive_union(List *tlist,
2666                                          Plan *lefttree,
2667                                          Plan *righttree,
2668                                          int wtParam,
2669                                          List *distinctList,
2670                                          long numGroups)
2671 {
2672         RecursiveUnion *node = makeNode(RecursiveUnion);
2673         Plan       *plan = &node->plan;
2674         int                     numCols = list_length(distinctList);
2675
2676         cost_recursive_union(plan, lefttree, righttree);
2677
2678         plan->targetlist = tlist;
2679         plan->qual = NIL;
2680         plan->lefttree = lefttree;
2681         plan->righttree = righttree;
2682         node->wtParam = wtParam;
2683
2684         /*
2685          * convert SortGroupClause list into arrays of attr indexes and equality
2686          * operators, as wanted by executor
2687          */
2688         node->numCols = numCols;
2689         if (numCols > 0)
2690         {
2691                 int                     keyno = 0;
2692                 AttrNumber *dupColIdx;
2693                 Oid                *dupOperators;
2694                 ListCell   *slitem;
2695
2696                 dupColIdx = (AttrNumber *) palloc(sizeof(AttrNumber) * numCols);
2697                 dupOperators = (Oid *) palloc(sizeof(Oid) * numCols);
2698
2699                 foreach(slitem, distinctList)
2700                 {
2701                         SortGroupClause *sortcl = (SortGroupClause *) lfirst(slitem);
2702                         TargetEntry *tle = get_sortgroupclause_tle(sortcl,
2703                                                                                                            plan->targetlist);
2704
2705                         dupColIdx[keyno] = tle->resno;
2706                         dupOperators[keyno] = sortcl->eqop;
2707                         Assert(OidIsValid(dupOperators[keyno]));
2708                         keyno++;
2709                 }
2710                 node->dupColIdx = dupColIdx;
2711                 node->dupOperators = dupOperators;
2712         }
2713         node->numGroups = numGroups;
2714
2715         return node;
2716 }
2717
2718 static BitmapAnd *
2719 make_bitmap_and(List *bitmapplans)
2720 {
2721         BitmapAnd  *node = makeNode(BitmapAnd);
2722         Plan       *plan = &node->plan;
2723
2724         /* cost should be inserted by caller */
2725         plan->targetlist = NIL;
2726         plan->qual = NIL;
2727         plan->lefttree = NULL;
2728         plan->righttree = NULL;
2729         node->bitmapplans = bitmapplans;
2730
2731         return node;
2732 }
2733
2734 static BitmapOr *
2735 make_bitmap_or(List *bitmapplans)
2736 {
2737         BitmapOr   *node = makeNode(BitmapOr);
2738         Plan       *plan = &node->plan;
2739
2740         /* cost should be inserted by caller */
2741         plan->targetlist = NIL;
2742         plan->qual = NIL;
2743         plan->lefttree = NULL;
2744         plan->righttree = NULL;
2745         node->bitmapplans = bitmapplans;
2746
2747         return node;
2748 }
2749
2750 static NestLoop *
2751 make_nestloop(List *tlist,
2752                           List *joinclauses,
2753                           List *otherclauses,
2754                           Plan *lefttree,
2755                           Plan *righttree,
2756                           JoinType jointype)
2757 {
2758         NestLoop   *node = makeNode(NestLoop);
2759         Plan       *plan = &node->join.plan;
2760
2761         /* cost should be inserted by caller */
2762         plan->targetlist = tlist;
2763         plan->qual = otherclauses;
2764         plan->lefttree = lefttree;
2765         plan->righttree = righttree;
2766         node->join.jointype = jointype;
2767         node->join.joinqual = joinclauses;
2768
2769         return node;
2770 }
2771
2772 static HashJoin *
2773 make_hashjoin(List *tlist,
2774                           List *joinclauses,
2775                           List *otherclauses,
2776                           List *hashclauses,
2777                           Plan *lefttree,
2778                           Plan *righttree,
2779                           JoinType jointype)
2780 {
2781         HashJoin   *node = makeNode(HashJoin);
2782         Plan       *plan = &node->join.plan;
2783
2784         /* cost should be inserted by caller */
2785         plan->targetlist = tlist;
2786         plan->qual = otherclauses;
2787         plan->lefttree = lefttree;
2788         plan->righttree = righttree;
2789         node->hashclauses = hashclauses;
2790         node->join.jointype = jointype;
2791         node->join.joinqual = joinclauses;
2792
2793         return node;
2794 }
2795
2796 static Hash *
2797 make_hash(Plan *lefttree,
2798                   Oid skewTable,
2799                   AttrNumber skewColumn,
2800                   Oid skewColType,
2801                   int32 skewColTypmod)
2802 {
2803         Hash       *node = makeNode(Hash);
2804         Plan       *plan = &node->plan;
2805
2806         copy_plan_costsize(plan, lefttree);
2807
2808         /*
2809          * For plausibility, make startup & total costs equal total cost of input
2810          * plan; this only affects EXPLAIN display not decisions.
2811          */
2812         plan->startup_cost = plan->total_cost;
2813         plan->targetlist = lefttree->targetlist;
2814         plan->qual = NIL;
2815         plan->lefttree = lefttree;
2816         plan->righttree = NULL;
2817
2818         node->skewTable = skewTable;
2819         node->skewColumn = skewColumn;
2820         node->skewColType = skewColType;
2821         node->skewColTypmod = skewColTypmod;
2822
2823         return node;
2824 }
2825
2826 static MergeJoin *
2827 make_mergejoin(List *tlist,
2828                            List *joinclauses,
2829                            List *otherclauses,
2830                            List *mergeclauses,
2831                            Oid *mergefamilies,
2832                            int *mergestrategies,
2833                            bool *mergenullsfirst,
2834                            Plan *lefttree,
2835                            Plan *righttree,
2836                            JoinType jointype)
2837 {
2838         MergeJoin  *node = makeNode(MergeJoin);
2839         Plan       *plan = &node->join.plan;
2840
2841         /* cost should be inserted by caller */
2842         plan->targetlist = tlist;
2843         plan->qual = otherclauses;
2844         plan->lefttree = lefttree;
2845         plan->righttree = righttree;
2846         node->mergeclauses = mergeclauses;
2847         node->mergeFamilies = mergefamilies;
2848         node->mergeStrategies = mergestrategies;
2849         node->mergeNullsFirst = mergenullsfirst;
2850         node->join.jointype = jointype;
2851         node->join.joinqual = joinclauses;
2852
2853         return node;
2854 }
2855
2856 /*
2857  * make_sort --- basic routine to build a Sort plan node
2858  *
2859  * Caller must have built the sortColIdx, sortOperators, and nullsFirst
2860  * arrays already.      limit_tuples is as for cost_sort (in particular, pass
2861  * -1 if no limit)
2862  */
2863 static Sort *
2864 make_sort(PlannerInfo *root, Plan *lefttree, int numCols,
2865                   AttrNumber *sortColIdx, Oid *sortOperators, bool *nullsFirst,
2866                   double limit_tuples)
2867 {
2868         Sort       *node = makeNode(Sort);
2869         Plan       *plan = &node->plan;
2870         Path            sort_path;              /* dummy for result of cost_sort */
2871
2872         copy_plan_costsize(plan, lefttree); /* only care about copying size */
2873         cost_sort(&sort_path, root, NIL,
2874                           lefttree->total_cost,
2875                           lefttree->plan_rows,
2876                           lefttree->plan_width,
2877                           limit_tuples);
2878         plan->startup_cost = sort_path.startup_cost;
2879         plan->total_cost = sort_path.total_cost;
2880         plan->targetlist = lefttree->targetlist;
2881         plan->qual = NIL;
2882         plan->lefttree = lefttree;
2883         plan->righttree = NULL;
2884         node->numCols = numCols;
2885         node->sortColIdx = sortColIdx;
2886         node->sortOperators = sortOperators;
2887         node->nullsFirst = nullsFirst;
2888
2889         return node;
2890 }
2891
2892 /*
2893  * add_sort_column --- utility subroutine for building sort info arrays
2894  *
2895  * We need this routine because the same column might be selected more than
2896  * once as a sort key column; if so, the extra mentions are redundant.
2897  *
2898  * Caller is assumed to have allocated the arrays large enough for the
2899  * max possible number of columns.      Return value is the new column count.
2900  */
2901 static int
2902 add_sort_column(AttrNumber colIdx, Oid sortOp, bool nulls_first,
2903                                 int numCols, AttrNumber *sortColIdx,
2904                                 Oid *sortOperators, bool *nullsFirst)
2905 {
2906         int                     i;
2907
2908         Assert(OidIsValid(sortOp));
2909
2910         for (i = 0; i < numCols; i++)
2911         {
2912                 /*
2913                  * Note: we check sortOp because it's conceivable that "ORDER BY foo
2914                  * USING <, foo USING <<<" is not redundant, if <<< distinguishes
2915                  * values that < considers equal.  We need not check nulls_first
2916                  * however because a lower-order column with the same sortop but
2917                  * opposite nulls direction is redundant.
2918                  */
2919                 if (sortColIdx[i] == colIdx &&
2920                         sortOperators[numCols] == sortOp)
2921                 {
2922                         /* Already sorting by this col, so extra sort key is useless */
2923                         return numCols;
2924                 }
2925         }
2926
2927         /* Add the column */
2928         sortColIdx[numCols] = colIdx;
2929         sortOperators[numCols] = sortOp;
2930         nullsFirst[numCols] = nulls_first;
2931         return numCols + 1;
2932 }
2933
2934 /*
2935  * make_sort_from_pathkeys
2936  *        Create sort plan to sort according to given pathkeys
2937  *
2938  *        'lefttree' is the node which yields input tuples
2939  *        'pathkeys' is the list of pathkeys by which the result is to be sorted
2940  *        'limit_tuples' is the bound on the number of output tuples;
2941  *                              -1 if no bound
2942  *
2943  * We must convert the pathkey information into arrays of sort key column
2944  * numbers and sort operator OIDs.
2945  *
2946  * If the pathkeys include expressions that aren't simple Vars, we will
2947  * usually need to add resjunk items to the input plan's targetlist to
2948  * compute these expressions (since the Sort node itself won't do it).
2949  * If the input plan type isn't one that can do projections, this means
2950  * adding a Result node just to do the projection.
2951  */
2952 Sort *
2953 make_sort_from_pathkeys(PlannerInfo *root, Plan *lefttree, List *pathkeys,
2954                                                 double limit_tuples)
2955 {
2956         List       *tlist = lefttree->targetlist;
2957         ListCell   *i;
2958         int                     numsortkeys;
2959         AttrNumber *sortColIdx;
2960         Oid                *sortOperators;
2961         bool       *nullsFirst;
2962
2963         /*
2964          * We will need at most list_length(pathkeys) sort columns; possibly less
2965          */
2966         numsortkeys = list_length(pathkeys);
2967         sortColIdx = (AttrNumber *) palloc(numsortkeys * sizeof(AttrNumber));
2968         sortOperators = (Oid *) palloc(numsortkeys * sizeof(Oid));
2969         nullsFirst = (bool *) palloc(numsortkeys * sizeof(bool));
2970
2971         numsortkeys = 0;
2972
2973         foreach(i, pathkeys)
2974         {
2975                 PathKey    *pathkey = (PathKey *) lfirst(i);
2976                 EquivalenceClass *ec = pathkey->pk_eclass;
2977                 TargetEntry *tle = NULL;
2978                 Oid                     pk_datatype = InvalidOid;
2979                 Oid                     sortop;
2980                 ListCell   *j;
2981
2982                 if (ec->ec_has_volatile)
2983                 {
2984                         /*
2985                          * If the pathkey's EquivalenceClass is volatile, then it must
2986                          * have come from an ORDER BY clause, and we have to match it to
2987                          * that same targetlist entry.
2988                          */
2989                         if (ec->ec_sortref == 0)        /* can't happen */
2990                                 elog(ERROR, "volatile EquivalenceClass has no sortref");
2991                         tle = get_sortgroupref_tle(ec->ec_sortref, tlist);
2992                         Assert(tle);
2993                         Assert(list_length(ec->ec_members) == 1);
2994                         pk_datatype = ((EquivalenceMember *) linitial(ec->ec_members))->em_datatype;
2995                 }
2996                 else
2997                 {
2998                         /*
2999                          * Otherwise, we can sort by any non-constant expression listed in
3000                          * the pathkey's EquivalenceClass.  For now, we take the first one
3001                          * that corresponds to an available item in the tlist.  If there
3002                          * isn't any, use the first one that is an expression in the
3003                          * input's vars.  (The non-const restriction only matters if the
3004                          * EC is below_outer_join; but if it isn't, it won't contain
3005                          * consts anyway, else we'd have discarded the pathkey as
3006                          * redundant.)
3007                          *
3008                          * XXX if we have a choice, is there any way of figuring out which
3009                          * might be cheapest to execute?  (For example, int4lt is likely
3010                          * much cheaper to execute than numericlt, but both might appear
3011                          * in the same equivalence class...)  Not clear that we ever will
3012                          * have an interesting choice in practice, so it may not matter.
3013                          */
3014                         foreach(j, ec->ec_members)
3015                         {
3016                                 EquivalenceMember *em = (EquivalenceMember *) lfirst(j);
3017
3018                                 if (em->em_is_const || em->em_is_child)
3019                                         continue;
3020
3021                                 tle = tlist_member((Node *) em->em_expr, tlist);
3022                                 if (tle)
3023                                 {
3024                                         pk_datatype = em->em_datatype;
3025                                         break;          /* found expr already in tlist */
3026                                 }
3027
3028                                 /*
3029                                  * We can also use it if the pathkey expression is a relabel
3030                                  * of the tlist entry, or vice versa.  This is needed for
3031                                  * binary-compatible cases (cf. make_pathkey_from_sortinfo).
3032                                  * We prefer an exact match, though, so we do the basic search
3033                                  * first.
3034                                  */
3035                                 tle = tlist_member_ignore_relabel((Node *) em->em_expr, tlist);
3036                                 if (tle)
3037                                 {
3038                                         pk_datatype = em->em_datatype;
3039                                         break;          /* found expr already in tlist */
3040                                 }
3041                         }
3042
3043                         if (!tle)
3044                         {
3045                                 /* No matching tlist item; look for a computable expression */
3046                                 Expr       *sortexpr = NULL;
3047
3048                                 foreach(j, ec->ec_members)
3049                                 {
3050                                         EquivalenceMember *em = (EquivalenceMember *) lfirst(j);
3051                                         List       *exprvars;
3052                                         ListCell   *k;
3053
3054                                         if (em->em_is_const || em->em_is_child)
3055                                                 continue;
3056                                         sortexpr = em->em_expr;
3057                                         exprvars = pull_var_clause((Node *) sortexpr,
3058                                                                                            PVC_INCLUDE_PLACEHOLDERS);
3059                                         foreach(k, exprvars)
3060                                         {
3061                                                 if (!tlist_member_ignore_relabel(lfirst(k), tlist))
3062                                                         break;
3063                                         }
3064                                         list_free(exprvars);
3065                                         if (!k)
3066                                         {
3067                                                 pk_datatype = em->em_datatype;
3068                                                 break;  /* found usable expression */
3069                                         }
3070                                 }
3071                                 if (!j)
3072                                         elog(ERROR, "could not find pathkey item to sort");
3073
3074                                 /*
3075                                  * Do we need to insert a Result node?
3076                                  */
3077                                 if (!is_projection_capable_plan(lefttree))
3078                                 {
3079                                         /* copy needed so we don't modify input's tlist below */
3080                                         tlist = copyObject(tlist);
3081                                         lefttree = (Plan *) make_result(root, tlist, NULL,
3082                                                                                                         lefttree);
3083                                 }
3084
3085                                 /*
3086                                  * Add resjunk entry to input's tlist
3087                                  */
3088                                 tle = makeTargetEntry(sortexpr,
3089                                                                           list_length(tlist) + 1,
3090                                                                           NULL,
3091                                                                           true);
3092                                 tlist = lappend(tlist, tle);
3093                                 lefttree->targetlist = tlist;   /* just in case NIL before */
3094                         }
3095                 }
3096
3097                 /*
3098                  * Look up the correct sort operator from the PathKey's slightly
3099                  * abstracted representation.
3100                  */
3101                 sortop = get_opfamily_member(pathkey->pk_opfamily,
3102                                                                          pk_datatype,
3103                                                                          pk_datatype,
3104                                                                          pathkey->pk_strategy);
3105                 if (!OidIsValid(sortop))        /* should not happen */
3106                         elog(ERROR, "could not find member %d(%u,%u) of opfamily %u",
3107                                  pathkey->pk_strategy, pk_datatype, pk_datatype,
3108                                  pathkey->pk_opfamily);
3109
3110                 /*
3111                  * The column might already be selected as a sort key, if the pathkeys
3112                  * contain duplicate entries.  (This can happen in scenarios where
3113                  * multiple mergejoinable clauses mention the same var, for example.)
3114                  * So enter it only once in the sort arrays.
3115                  */
3116                 numsortkeys = add_sort_column(tle->resno,
3117                                                                           sortop,
3118                                                                           pathkey->pk_nulls_first,
3119                                                                           numsortkeys,
3120                                                                           sortColIdx, sortOperators, nullsFirst);
3121         }
3122
3123         Assert(numsortkeys > 0);
3124
3125         return make_sort(root, lefttree, numsortkeys,
3126                                          sortColIdx, sortOperators, nullsFirst, limit_tuples);
3127 }
3128
3129 /*
3130  * make_sort_from_sortclauses
3131  *        Create sort plan to sort according to given sortclauses
3132  *
3133  *        'sortcls' is a list of SortGroupClauses
3134  *        'lefttree' is the node which yields input tuples
3135  */
3136 Sort *
3137 make_sort_from_sortclauses(PlannerInfo *root, List *sortcls, Plan *lefttree)
3138 {
3139         List       *sub_tlist = lefttree->targetlist;
3140         ListCell   *l;
3141         int                     numsortkeys;
3142         AttrNumber *sortColIdx;
3143         Oid                *sortOperators;
3144         bool       *nullsFirst;
3145
3146         /*
3147          * We will need at most list_length(sortcls) sort columns; possibly less
3148          */
3149         numsortkeys = list_length(sortcls);
3150         sortColIdx = (AttrNumber *) palloc(numsortkeys * sizeof(AttrNumber));
3151         sortOperators = (Oid *) palloc(numsortkeys * sizeof(Oid));
3152         nullsFirst = (bool *) palloc(numsortkeys * sizeof(bool));
3153
3154         numsortkeys = 0;
3155
3156         foreach(l, sortcls)
3157         {
3158                 SortGroupClause *sortcl = (SortGroupClause *) lfirst(l);
3159                 TargetEntry *tle = get_sortgroupclause_tle(sortcl, sub_tlist);
3160
3161                 /*
3162                  * Check for the possibility of duplicate order-by clauses --- the
3163                  * parser should have removed 'em, but no point in sorting
3164                  * redundantly.
3165                  */
3166                 numsortkeys = add_sort_column(tle->resno, sortcl->sortop,
3167                                                                           sortcl->nulls_first,
3168                                                                           numsortkeys,
3169                                                                           sortColIdx, sortOperators, nullsFirst);
3170         }
3171
3172         Assert(numsortkeys > 0);
3173
3174         return make_sort(root, lefttree, numsortkeys,
3175                                          sortColIdx, sortOperators, nullsFirst, -1.0);
3176 }
3177
3178 /*
3179  * make_sort_from_groupcols
3180  *        Create sort plan to sort based on grouping columns
3181  *
3182  * 'groupcls' is the list of SortGroupClauses
3183  * 'grpColIdx' gives the column numbers to use
3184  *
3185  * This might look like it could be merged with make_sort_from_sortclauses,
3186  * but presently we *must* use the grpColIdx[] array to locate sort columns,
3187  * because the child plan's tlist is not marked with ressortgroupref info
3188  * appropriate to the grouping node.  So, only the sort ordering info
3189  * is used from the SortGroupClause entries.
3190  */
3191 Sort *
3192 make_sort_from_groupcols(PlannerInfo *root,
3193                                                  List *groupcls,
3194                                                  AttrNumber *grpColIdx,
3195                                                  Plan *lefttree)
3196 {
3197         List       *sub_tlist = lefttree->targetlist;
3198         int                     grpno = 0;
3199         ListCell   *l;
3200         int                     numsortkeys;
3201         AttrNumber *sortColIdx;
3202         Oid                *sortOperators;
3203         bool       *nullsFirst;
3204
3205         /*
3206          * We will need at most list_length(groupcls) sort columns; possibly less
3207          */
3208         numsortkeys = list_length(groupcls);
3209         sortColIdx = (AttrNumber *) palloc(numsortkeys * sizeof(AttrNumber));
3210         sortOperators = (Oid *) palloc(numsortkeys * sizeof(Oid));
3211         nullsFirst = (bool *) palloc(numsortkeys * sizeof(bool));
3212
3213         numsortkeys = 0;
3214
3215         foreach(l, groupcls)
3216         {
3217                 SortGroupClause *grpcl = (SortGroupClause *) lfirst(l);
3218                 TargetEntry *tle = get_tle_by_resno(sub_tlist, grpColIdx[grpno]);
3219
3220                 /*
3221                  * Check for the possibility of duplicate group-by clauses --- the
3222                  * parser should have removed 'em, but no point in sorting
3223                  * redundantly.
3224                  */
3225                 numsortkeys = add_sort_column(tle->resno, grpcl->sortop,
3226                                                                           grpcl->nulls_first,
3227                                                                           numsortkeys,
3228                                                                           sortColIdx, sortOperators, nullsFirst);
3229                 grpno++;
3230         }
3231
3232         Assert(numsortkeys > 0);
3233
3234         return make_sort(root, lefttree, numsortkeys,
3235                                          sortColIdx, sortOperators, nullsFirst, -1.0);
3236 }
3237
3238 static Material *
3239 make_material(Plan *lefttree)
3240 {
3241         Material   *node = makeNode(Material);
3242         Plan       *plan = &node->plan;
3243
3244         /* cost should be inserted by caller */
3245         plan->targetlist = lefttree->targetlist;
3246         plan->qual = NIL;
3247         plan->lefttree = lefttree;
3248         plan->righttree = NULL;
3249
3250         return node;
3251 }
3252
3253 /*
3254  * materialize_finished_plan: stick a Material node atop a completed plan
3255  *
3256  * There are a couple of places where we want to attach a Material node
3257  * after completion of subquery_planner().      This currently requires hackery.
3258  * Since subquery_planner has already run SS_finalize_plan on the subplan
3259  * tree, we have to kluge up parameter lists for the Material node.
3260  * Possibly this could be fixed by postponing SS_finalize_plan processing
3261  * until setrefs.c is run?
3262  */
3263 Plan *
3264 materialize_finished_plan(Plan *subplan)
3265 {
3266         Plan       *matplan;
3267         Path            matpath;                /* dummy for result of cost_material */
3268
3269         matplan = (Plan *) make_material(subplan);
3270
3271         /* Set cost data */
3272         cost_material(&matpath,
3273                                   subplan->startup_cost,
3274                                   subplan->total_cost,
3275                                   subplan->plan_rows,
3276                                   subplan->plan_width);
3277         matplan->startup_cost = matpath.startup_cost;
3278         matplan->total_cost = matpath.total_cost;
3279         matplan->plan_rows = subplan->plan_rows;
3280         matplan->plan_width = subplan->plan_width;
3281
3282         /* parameter kluge --- see comments above */
3283         matplan->extParam = bms_copy(subplan->extParam);
3284         matplan->allParam = bms_copy(subplan->allParam);
3285
3286         return matplan;
3287 }
3288
3289 Agg *
3290 make_agg(PlannerInfo *root, List *tlist, List *qual,
3291                  AggStrategy aggstrategy,
3292                  int numGroupCols, AttrNumber *grpColIdx, Oid *grpOperators,
3293                  long numGroups, int numAggs,
3294                  Plan *lefttree)
3295 {
3296         Agg                *node = makeNode(Agg);
3297         Plan       *plan = &node->plan;
3298         Path            agg_path;               /* dummy for result of cost_agg */
3299         QualCost        qual_cost;
3300
3301         node->aggstrategy = aggstrategy;
3302         node->numCols = numGroupCols;
3303         node->grpColIdx = grpColIdx;
3304         node->grpOperators = grpOperators;
3305         node->numGroups = numGroups;
3306
3307         copy_plan_costsize(plan, lefttree); /* only care about copying size */
3308         cost_agg(&agg_path, root,
3309                          aggstrategy, numAggs,
3310                          numGroupCols, numGroups,
3311                          lefttree->startup_cost,
3312                          lefttree->total_cost,
3313                          lefttree->plan_rows);
3314         plan->startup_cost = agg_path.startup_cost;
3315         plan->total_cost = agg_path.total_cost;
3316
3317         /*
3318          * We will produce a single output tuple if not grouping, and a tuple per
3319          * group otherwise.
3320          */
3321         if (aggstrategy == AGG_PLAIN)
3322                 plan->plan_rows = 1;
3323         else
3324                 plan->plan_rows = numGroups;
3325
3326         /*
3327          * We also need to account for the cost of evaluation of the qual (ie, the
3328          * HAVING clause) and the tlist.  Note that cost_qual_eval doesn't charge
3329          * anything for Aggref nodes; this is okay since they are really
3330          * comparable to Vars.
3331          *
3332          * See notes in grouping_planner about why only make_agg, make_windowagg
3333          * and make_group worry about tlist eval cost.
3334          */
3335         if (qual)
3336         {
3337                 cost_qual_eval(&qual_cost, qual, root);
3338                 plan->startup_cost += qual_cost.startup;
3339                 plan->total_cost += qual_cost.startup;
3340                 plan->total_cost += qual_cost.per_tuple * plan->plan_rows;
3341         }
3342         cost_qual_eval(&qual_cost, tlist, root);
3343         plan->startup_cost += qual_cost.startup;
3344         plan->total_cost += qual_cost.startup;
3345         plan->total_cost += qual_cost.per_tuple * plan->plan_rows;
3346
3347         plan->qual = qual;
3348         plan->targetlist = tlist;
3349         plan->lefttree = lefttree;
3350         plan->righttree = NULL;
3351
3352         return node;
3353 }
3354
3355 WindowAgg *
3356 make_windowagg(PlannerInfo *root, List *tlist,
3357                            int numWindowFuncs, Index winref,
3358                            int partNumCols, AttrNumber *partColIdx, Oid *partOperators,
3359                            int ordNumCols, AttrNumber *ordColIdx, Oid *ordOperators,
3360                            int frameOptions, Plan *lefttree)
3361 {
3362         WindowAgg  *node = makeNode(WindowAgg);
3363         Plan       *plan = &node->plan;
3364         Path            windowagg_path; /* dummy for result of cost_windowagg */
3365         QualCost        qual_cost;
3366
3367         node->winref = winref;
3368         node->partNumCols = partNumCols;
3369         node->partColIdx = partColIdx;
3370         node->partOperators = partOperators;
3371         node->ordNumCols = ordNumCols;
3372         node->ordColIdx = ordColIdx;
3373         node->ordOperators = ordOperators;
3374         node->frameOptions = frameOptions;
3375
3376         copy_plan_costsize(plan, lefttree); /* only care about copying size */
3377         cost_windowagg(&windowagg_path, root,
3378                                    numWindowFuncs, partNumCols, ordNumCols,
3379                                    lefttree->startup_cost,
3380                                    lefttree->total_cost,
3381                                    lefttree->plan_rows);
3382         plan->startup_cost = windowagg_path.startup_cost;
3383         plan->total_cost = windowagg_path.total_cost;
3384
3385         /*
3386          * We also need to account for the cost of evaluation of the tlist.
3387          *
3388          * See notes in grouping_planner about why only make_agg, make_windowagg
3389          * and make_group worry about tlist eval cost.
3390          */
3391         cost_qual_eval(&qual_cost, tlist, root);
3392         plan->startup_cost += qual_cost.startup;
3393         plan->total_cost += qual_cost.startup;
3394         plan->total_cost += qual_cost.per_tuple * plan->plan_rows;
3395
3396         plan->targetlist = tlist;
3397         plan->lefttree = lefttree;
3398         plan->righttree = NULL;
3399         /* WindowAgg nodes never have a qual clause */
3400         plan->qual = NIL;
3401
3402         return node;
3403 }
3404
3405 Group *
3406 make_group(PlannerInfo *root,
3407                    List *tlist,
3408                    List *qual,
3409                    int numGroupCols,
3410                    AttrNumber *grpColIdx,
3411                    Oid *grpOperators,
3412                    double numGroups,
3413                    Plan *lefttree)
3414 {
3415         Group      *node = makeNode(Group);
3416         Plan       *plan = &node->plan;
3417         Path            group_path;             /* dummy for result of cost_group */
3418         QualCost        qual_cost;
3419
3420         node->numCols = numGroupCols;
3421         node->grpColIdx = grpColIdx;
3422         node->grpOperators = grpOperators;
3423
3424         copy_plan_costsize(plan, lefttree); /* only care about copying size */
3425         cost_group(&group_path, root,
3426                            numGroupCols, numGroups,
3427                            lefttree->startup_cost,
3428                            lefttree->total_cost,
3429                            lefttree->plan_rows);
3430         plan->startup_cost = group_path.startup_cost;
3431         plan->total_cost = group_path.total_cost;
3432
3433         /* One output tuple per estimated result group */
3434         plan->plan_rows = numGroups;
3435
3436         /*
3437          * We also need to account for the cost of evaluation of the qual (ie, the
3438          * HAVING clause) and the tlist.
3439          *
3440          * XXX this double-counts the cost of evaluation of any expressions used
3441          * for grouping, since in reality those will have been evaluated at a
3442          * lower plan level and will only be copied by the Group node. Worth
3443          * fixing?
3444          *
3445          * See notes in grouping_planner about why only make_agg, make_windowagg
3446          * and make_group worry about tlist eval cost.
3447          */
3448         if (qual)
3449         {
3450                 cost_qual_eval(&qual_cost, qual, root);
3451                 plan->startup_cost += qual_cost.startup;
3452                 plan->total_cost += qual_cost.startup;
3453                 plan->total_cost += qual_cost.per_tuple * plan->plan_rows;
3454         }
3455         cost_qual_eval(&qual_cost, tlist, root);
3456         plan->startup_cost += qual_cost.startup;
3457         plan->total_cost += qual_cost.startup;
3458         plan->total_cost += qual_cost.per_tuple * plan->plan_rows;
3459
3460         plan->qual = qual;
3461         plan->targetlist = tlist;
3462         plan->lefttree = lefttree;
3463         plan->righttree = NULL;
3464
3465         return node;
3466 }
3467
3468 /*
3469  * distinctList is a list of SortGroupClauses, identifying the targetlist items
3470  * that should be considered by the Unique filter.      The input path must
3471  * already be sorted accordingly.
3472  */
3473 Unique *
3474 make_unique(Plan *lefttree, List *distinctList)
3475 {
3476         Unique     *node = makeNode(Unique);
3477         Plan       *plan = &node->plan;
3478         int                     numCols = list_length(distinctList);
3479         int                     keyno = 0;
3480         AttrNumber *uniqColIdx;
3481         Oid                *uniqOperators;
3482         ListCell   *slitem;
3483
3484         copy_plan_costsize(plan, lefttree);
3485
3486         /*
3487          * Charge one cpu_operator_cost per comparison per input tuple. We assume
3488          * all columns get compared at most of the tuples.      (XXX probably this is
3489          * an overestimate.)
3490          */
3491         plan->total_cost += cpu_operator_cost * plan->plan_rows * numCols;
3492
3493         /*
3494          * plan->plan_rows is left as a copy of the input subplan's plan_rows; ie,
3495          * we assume the filter removes nothing.  The caller must alter this if he
3496          * has a better idea.
3497          */
3498
3499         plan->targetlist = lefttree->targetlist;
3500         plan->qual = NIL;
3501         plan->lefttree = lefttree;
3502         plan->righttree = NULL;
3503
3504         /*
3505          * convert SortGroupClause list into arrays of attr indexes and equality
3506          * operators, as wanted by executor
3507          */
3508         Assert(numCols > 0);
3509         uniqColIdx = (AttrNumber *) palloc(sizeof(AttrNumber) * numCols);
3510         uniqOperators = (Oid *) palloc(sizeof(Oid) * numCols);
3511
3512         foreach(slitem, distinctList)
3513         {
3514                 SortGroupClause *sortcl = (SortGroupClause *) lfirst(slitem);
3515                 TargetEntry *tle = get_sortgroupclause_tle(sortcl, plan->targetlist);
3516
3517                 uniqColIdx[keyno] = tle->resno;
3518                 uniqOperators[keyno] = sortcl->eqop;
3519                 Assert(OidIsValid(uniqOperators[keyno]));
3520                 keyno++;
3521         }
3522
3523         node->numCols = numCols;
3524         node->uniqColIdx = uniqColIdx;
3525         node->uniqOperators = uniqOperators;
3526
3527         return node;
3528 }
3529
3530 /*
3531  * distinctList is a list of SortGroupClauses, identifying the targetlist
3532  * items that should be considered by the SetOp filter.  The input path must
3533  * already be sorted accordingly.
3534  */
3535 SetOp *
3536 make_setop(SetOpCmd cmd, SetOpStrategy strategy, Plan *lefttree,
3537                    List *distinctList, AttrNumber flagColIdx, int firstFlag,
3538                    long numGroups, double outputRows)
3539 {
3540         SetOp      *node = makeNode(SetOp);
3541         Plan       *plan = &node->plan;
3542         int                     numCols = list_length(distinctList);
3543         int                     keyno = 0;
3544         AttrNumber *dupColIdx;
3545         Oid                *dupOperators;
3546         ListCell   *slitem;
3547
3548         copy_plan_costsize(plan, lefttree);
3549         plan->plan_rows = outputRows;
3550
3551         /*
3552          * Charge one cpu_operator_cost per comparison per input tuple. We assume
3553          * all columns get compared at most of the tuples.
3554          */
3555         plan->total_cost += cpu_operator_cost * lefttree->plan_rows * numCols;
3556
3557         plan->targetlist = lefttree->targetlist;
3558         plan->qual = NIL;
3559         plan->lefttree = lefttree;
3560         plan->righttree = NULL;
3561
3562         /*
3563          * convert SortGroupClause list into arrays of attr indexes and equality
3564          * operators, as wanted by executor
3565          */
3566         Assert(numCols > 0);
3567         dupColIdx = (AttrNumber *) palloc(sizeof(AttrNumber) * numCols);
3568         dupOperators = (Oid *) palloc(sizeof(Oid) * numCols);
3569
3570         foreach(slitem, distinctList)
3571         {
3572                 SortGroupClause *sortcl = (SortGroupClause *) lfirst(slitem);
3573                 TargetEntry *tle = get_sortgroupclause_tle(sortcl, plan->targetlist);
3574
3575                 dupColIdx[keyno] = tle->resno;
3576                 dupOperators[keyno] = sortcl->eqop;
3577                 Assert(OidIsValid(dupOperators[keyno]));
3578                 keyno++;
3579         }
3580
3581         node->cmd = cmd;
3582         node->strategy = strategy;
3583         node->numCols = numCols;
3584         node->dupColIdx = dupColIdx;
3585         node->dupOperators = dupOperators;
3586         node->flagColIdx = flagColIdx;
3587         node->firstFlag = firstFlag;
3588         node->numGroups = numGroups;
3589
3590         return node;
3591 }
3592
3593 /*
3594  * Note: offset_est and count_est are passed in to save having to repeat
3595  * work already done to estimate the values of the limitOffset and limitCount
3596  * expressions.  Their values are as returned by preprocess_limit (0 means
3597  * "not relevant", -1 means "couldn't estimate").  Keep the code below in sync
3598  * with that function!
3599  */
3600 Limit *
3601 make_limit(Plan *lefttree, Node *limitOffset, Node *limitCount,
3602                    int64 offset_est, int64 count_est)
3603 {
3604         Limit      *node = makeNode(Limit);
3605         Plan       *plan = &node->plan;
3606
3607         copy_plan_costsize(plan, lefttree);
3608
3609         /*
3610          * Adjust the output rows count and costs according to the offset/limit.
3611          * This is only a cosmetic issue if we are at top level, but if we are
3612          * building a subquery then it's important to report correct info to the
3613          * outer planner.
3614          *
3615          * When the offset or count couldn't be estimated, use 10% of the
3616          * estimated number of rows emitted from the subplan.
3617          */
3618         if (offset_est != 0)
3619         {
3620                 double          offset_rows;
3621
3622                 if (offset_est > 0)
3623                         offset_rows = (double) offset_est;
3624                 else
3625                         offset_rows = clamp_row_est(lefttree->plan_rows * 0.10);
3626                 if (offset_rows > plan->plan_rows)
3627                         offset_rows = plan->plan_rows;
3628                 if (plan->plan_rows > 0)
3629                         plan->startup_cost +=
3630                                 (plan->total_cost - plan->startup_cost)
3631                                 * offset_rows / plan->plan_rows;
3632                 plan->plan_rows -= offset_rows;
3633                 if (plan->plan_rows < 1)
3634                         plan->plan_rows = 1;
3635         }
3636
3637         if (count_est != 0)
3638         {
3639                 double          count_rows;
3640
3641                 if (count_est > 0)
3642                         count_rows = (double) count_est;
3643                 else
3644                         count_rows = clamp_row_est(lefttree->plan_rows * 0.10);
3645                 if (count_rows > plan->plan_rows)
3646                         count_rows = plan->plan_rows;
3647                 if (plan->plan_rows > 0)
3648                         plan->total_cost = plan->startup_cost +
3649                                 (plan->total_cost - plan->startup_cost)
3650                                 * count_rows / plan->plan_rows;
3651                 plan->plan_rows = count_rows;
3652                 if (plan->plan_rows < 1)
3653                         plan->plan_rows = 1;
3654         }
3655
3656         plan->targetlist = lefttree->targetlist;
3657         plan->qual = NIL;
3658         plan->lefttree = lefttree;
3659         plan->righttree = NULL;
3660
3661         node->limitOffset = limitOffset;
3662         node->limitCount = limitCount;
3663
3664         return node;
3665 }
3666
3667 /*
3668  * make_result
3669  *        Build a Result plan node
3670  *
3671  * If we have a subplan, assume that any evaluation costs for the gating qual
3672  * were already factored into the subplan's startup cost, and just copy the
3673  * subplan cost.  If there's no subplan, we should include the qual eval
3674  * cost.  In either case, tlist eval cost is not to be included here.
3675  */
3676 Result *
3677 make_result(PlannerInfo *root,
3678                         List *tlist,
3679                         Node *resconstantqual,
3680                         Plan *subplan)
3681 {
3682         Result     *node = makeNode(Result);
3683         Plan       *plan = &node->plan;
3684
3685         if (subplan)
3686                 copy_plan_costsize(plan, subplan);
3687         else
3688         {
3689                 plan->startup_cost = 0;
3690                 plan->total_cost = cpu_tuple_cost;
3691                 plan->plan_rows = 1;    /* wrong if we have a set-valued function? */
3692                 plan->plan_width = 0;   /* XXX is it worth being smarter? */
3693                 if (resconstantqual)
3694                 {
3695                         QualCost        qual_cost;
3696
3697                         cost_qual_eval(&qual_cost, (List *) resconstantqual, root);
3698                         /* resconstantqual is evaluated once at startup */
3699                         plan->startup_cost += qual_cost.startup + qual_cost.per_tuple;
3700                         plan->total_cost += qual_cost.startup + qual_cost.per_tuple;
3701                 }
3702         }
3703
3704         plan->targetlist = tlist;
3705         plan->qual = NIL;
3706         plan->lefttree = subplan;
3707         plan->righttree = NULL;
3708         node->resconstantqual = resconstantqual;
3709
3710         return node;
3711 }
3712
3713 /*
3714  * make_modifytable
3715  *        Build a ModifyTable plan node
3716  *
3717  * Currently, we don't charge anything extra for the actual table modification
3718  * work, nor for the RETURNING expressions if any.  It would only be window
3719  * dressing, since these are always top-level nodes and there is no way for
3720  * the costs to change any higher-level planning choices.  But we might want
3721  * to make it look better sometime.
3722  */
3723 ModifyTable *
3724 make_modifytable(CmdType operation, List *resultRelations,
3725                                  List *subplans, List *returningLists)
3726 {
3727         ModifyTable *node = makeNode(ModifyTable);
3728         Plan       *plan = &node->plan;
3729         double          total_size;
3730         ListCell   *subnode;
3731
3732         Assert(list_length(resultRelations) == list_length(subplans));
3733         Assert(returningLists == NIL ||
3734                    list_length(resultRelations) == list_length(returningLists));
3735
3736         /*
3737          * Compute cost as sum of subplan costs.
3738          */
3739         plan->startup_cost = 0;
3740         plan->total_cost = 0;
3741         plan->plan_rows = 0;
3742         total_size = 0;
3743         foreach(subnode, subplans)
3744         {
3745                 Plan       *subplan = (Plan *) lfirst(subnode);
3746
3747                 if (subnode == list_head(subplans))     /* first node? */
3748                         plan->startup_cost = subplan->startup_cost;
3749                 plan->total_cost += subplan->total_cost;
3750                 plan->plan_rows += subplan->plan_rows;
3751                 total_size += subplan->plan_width * subplan->plan_rows;
3752         }
3753         if (plan->plan_rows > 0)
3754                 plan->plan_width = rint(total_size / plan->plan_rows);
3755         else
3756                 plan->plan_width = 0;
3757
3758         node->plan.lefttree = NULL;
3759         node->plan.righttree = NULL;
3760         node->plan.qual = NIL;
3761
3762         /*
3763          * Set up the visible plan targetlist as being the same as the first
3764          * RETURNING list.  This is for the use of EXPLAIN; the executor won't
3765          * pay any attention to the targetlist.
3766          */
3767         if (returningLists)
3768                 node->plan.targetlist = copyObject(linitial(returningLists));
3769         else
3770                 node->plan.targetlist = NIL;
3771
3772         node->operation = operation;
3773         node->resultRelations = resultRelations;
3774         node->plans = subplans;
3775         node->returningLists = returningLists;
3776
3777         return node;
3778 }
3779
3780 /*
3781  * is_projection_capable_plan
3782  *              Check whether a given Plan node is able to do projection.
3783  */
3784 bool
3785 is_projection_capable_plan(Plan *plan)
3786 {
3787         /* Most plan types can project, so just list the ones that can't */
3788         switch (nodeTag(plan))
3789         {
3790                 case T_Hash:
3791                 case T_Material:
3792                 case T_Sort:
3793                 case T_Unique:
3794                 case T_SetOp:
3795                 case T_Limit:
3796                 case T_ModifyTable:
3797                 case T_Append:
3798                 case T_RecursiveUnion:
3799                         return false;
3800                 default:
3801                         break;
3802         }
3803         return true;
3804 }