aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/createplan.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/plan/createplan.c')
-rw-r--r--src/backend/optimizer/plan/createplan.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 1cdc3628b20..79855b00c0f 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.147 2003/06/29 23:05:04 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.148 2003/07/14 22:35:54 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -811,6 +811,8 @@ create_subqueryscan_plan(Path *best_path, List *tlist, List *scan_clauses)
scan_relid,
best_path->parent->subplan);
+ copy_path_costsize(&scan_plan->scan.plan, best_path);
+
return scan_plan;
}
@@ -1503,8 +1505,14 @@ make_subqueryscan(List *qptlist,
SubqueryScan *node = makeNode(SubqueryScan);
Plan *plan = &node->scan.plan;
- /* cost is figured here for the convenience of prepunion.c */
+ /*
+ * Cost is figured here for the convenience of prepunion.c. Note this
+ * is only correct for the case where qpqual is empty; otherwise caller
+ * should overwrite cost with a better estimate.
+ */
copy_plan_costsize(plan, subplan);
+ plan->total_cost += cpu_tuple_cost * subplan->plan_rows;
+
plan->targetlist = qptlist;
plan->qual = qpqual;
plan->lefttree = NULL;
@@ -1540,7 +1548,11 @@ make_append(List *appendplans, bool isTarget, List *tlist)
Plan *plan = &node->plan;
List *subnode;
- /* compute costs from subplan costs */
+ /*
+ * Compute cost as sum of subplan costs. We charge nothing extra for
+ * the Append itself, which perhaps is too optimistic, but since it
+ * doesn't do any selection or projection, it is a pretty cheap node.
+ */
plan->startup_cost = 0;
plan->total_cost = 0;
plan->plan_rows = 0;
@@ -1556,6 +1568,7 @@ make_append(List *appendplans, bool isTarget, List *tlist)
if (plan->plan_width < subplan->plan_width)
plan->plan_width = subplan->plan_width;
}
+
plan->targetlist = tlist;
plan->qual = NIL;
plan->lefttree = NULL;