]> granicus.if.org Git - postgresql/blobdiff - src/backend/optimizer/plan/createplan.c
Add a Gather executor node.
[postgresql] / src / backend / optimizer / plan / createplan.c
index 404c6f593d7e5150dae984df348cf3a253c0206c..0ee7392bcce53dc2b80650176f4c3072f4ff1c4a 100644 (file)
@@ -60,6 +60,8 @@ static SeqScan *create_seqscan_plan(PlannerInfo *root, Path *best_path,
                                        List *tlist, List *scan_clauses);
 static SampleScan *create_samplescan_plan(PlannerInfo *root, Path *best_path,
                                           List *tlist, List *scan_clauses);
+static Gather *create_gather_plan(PlannerInfo *root,
+                                  GatherPath *best_path);
 static Scan *create_indexscan_plan(PlannerInfo *root, IndexPath *best_path,
                                          List *tlist, List *scan_clauses, bool indexonly);
 static BitmapHeapScan *create_bitmap_scan_plan(PlannerInfo *root,
@@ -104,6 +106,8 @@ static void copy_plan_costsize(Plan *dest, Plan *src);
 static SeqScan *make_seqscan(List *qptlist, List *qpqual, Index scanrelid);
 static SampleScan *make_samplescan(List *qptlist, List *qpqual, Index scanrelid,
                                TableSampleClause *tsc);
+static Gather *make_gather(List *qptlist, List *qpqual,
+                       int nworkers, bool single_copy, Plan *subplan);
 static IndexScan *make_indexscan(List *qptlist, List *qpqual, Index scanrelid,
                           Oid indexid, List *indexqual, List *indexqualorig,
                           List *indexorderby, List *indexorderbyorig,
@@ -273,6 +277,10 @@ create_plan_recurse(PlannerInfo *root, Path *best_path)
                        plan = create_unique_plan(root,
                                                                          (UniquePath *) best_path);
                        break;
+               case T_Gather:
+                       plan = (Plan *) create_gather_plan(root,
+                                                                                          (GatherPath *) best_path);
+                       break;
                default:
                        elog(ERROR, "unrecognized node type: %d",
                                 (int) best_path->pathtype);
@@ -1101,6 +1109,34 @@ create_unique_plan(PlannerInfo *root, UniquePath *best_path)
        return plan;
 }
 
+/*
+ * create_gather_plan
+ *
+ *       Create a Gather plan for 'best_path' and (recursively) plans
+ *       for its subpaths.
+ */
+static Gather *
+create_gather_plan(PlannerInfo *root, GatherPath *best_path)
+{
+       Gather     *gather_plan;
+       Plan       *subplan;
+
+       subplan = create_plan_recurse(root, best_path->subpath);
+
+       gather_plan = make_gather(subplan->targetlist,
+                                                         NIL,
+                                                         best_path->num_workers,
+                                                         best_path->single_copy,
+                                                         subplan);
+
+       copy_path_costsize(&gather_plan->plan, &best_path->path);
+
+       /* use parallel mode for parallel plans. */
+       root->glob->parallelModeNeeded = true;
+
+       return gather_plan;
+}
+
 
 /*****************************************************************************
  *
@@ -4735,6 +4771,27 @@ make_unique(Plan *lefttree, List *distinctList)
        return node;
 }
 
+static Gather *
+make_gather(List *qptlist,
+                       List *qpqual,
+                       int nworkers,
+                       bool single_copy,
+                       Plan *subplan)
+{
+       Gather     *node = makeNode(Gather);
+       Plan       *plan = &node->plan;
+
+       /* cost should be inserted by caller */
+       plan->targetlist = qptlist;
+       plan->qual = qpqual;
+       plan->lefttree = subplan;
+       plan->righttree = NULL;
+       node->num_workers = nworkers;
+       node->single_copy = single_copy;
+
+       return node;
+}
+
 /*
  * distinctList is a list of SortGroupClauses, identifying the targetlist
  * items that should be considered by the SetOp filter.  The input path must