aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/path/allpaths.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/path/allpaths.c')
-rw-r--r--src/backend/optimizer/path/allpaths.c44
1 files changed, 42 insertions, 2 deletions
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c
index 4b09f03e6e7..25bd55dadf3 100644
--- a/src/backend/optimizer/path/allpaths.c
+++ b/src/backend/optimizer/path/allpaths.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.133 2005/06/09 04:18:59 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/path/allpaths.c,v 1.134 2005/06/10 03:32:21 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -353,6 +353,28 @@ set_inherited_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
set_cheapest(rel);
}
+/* quick-and-dirty test to see if any joining is needed */
+static bool
+has_multiple_baserels(PlannerInfo *root)
+{
+ int num_base_rels = 0;
+ Index rti;
+
+ for (rti = 1; rti < root->base_rel_array_size; rti++)
+ {
+ RelOptInfo *brel = root->base_rel_array[rti];
+
+ if (brel == NULL)
+ continue;
+
+ /* ignore RTEs that are "other rels" */
+ if (brel->reloptkind == RELOPT_BASEREL)
+ if (++num_base_rels > 1)
+ return true;
+ }
+ return false;
+}
+
/*
* set_subquery_pathlist
* Build the (single) access path for a subquery RTE
@@ -361,8 +383,10 @@ static void
set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel,
Index rti, RangeTblEntry *rte)
{
+ Query *parse = root->parse;
Query *subquery = rte->subquery;
bool *differentTypes;
+ double tuple_fraction;
List *pathkeys;
List *subquery_pathkeys;
@@ -416,8 +440,24 @@ set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel,
pfree(differentTypes);
+ /*
+ * We can safely pass the outer tuple_fraction down to the subquery
+ * if the outer level has no joining, aggregation, or sorting to do.
+ * Otherwise we'd better tell the subquery to plan for full retrieval.
+ * (XXX This could probably be made more intelligent ...)
+ */
+ if (parse->hasAggs ||
+ parse->groupClause ||
+ parse->havingQual ||
+ parse->distinctClause ||
+ parse->sortClause ||
+ has_multiple_baserels(root))
+ tuple_fraction = 0.0; /* default case */
+ else
+ tuple_fraction = root->tuple_fraction;
+
/* Generate the plan for the subquery */
- rel->subplan = subquery_planner(subquery, 0.0 /* default case */,
+ rel->subplan = subquery_planner(subquery, tuple_fraction,
&subquery_pathkeys);
/* Copy number of output rows from subplan */