aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/planner.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r--src/backend/optimizer/plan/planner.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index d8f228f2b94..1831c1bb9ca 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.175 2004/08/30 02:54:38 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.176 2004/10/02 22:39:46 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -320,8 +320,7 @@ subquery_planner(Query *parse, double tuple_fraction)
* grouping_planner.
*/
if (parse->resultRelation &&
- (lst = expand_inherited_rtentry(parse, parse->resultRelation,
- false)) != NIL)
+ (lst = expand_inherited_rtentry(parse, parse->resultRelation)) != NIL)
plan = inheritance_planner(parse, lst);
else
plan = grouping_planner(parse, tuple_fraction);
@@ -513,7 +512,6 @@ inheritance_planner(Query *parse, List *inheritlist)
{
int childRTindex = lfirst_int(l);
Oid childOID = getrelid(childRTindex, parse->rtable);
- int subrtlength;
Query *subquery;
Plan *subplan;
@@ -526,22 +524,40 @@ inheritance_planner(Query *parse, List *inheritlist)
subplans = lappend(subplans, subplan);
/*
- * It's possible that additional RTEs got added to the rangetable
- * due to expansion of inherited source tables (see allpaths.c).
- * If so, we must copy 'em back to the main parse tree's rtable.
+ * XXX my goodness this next bit is ugly. Really need to think about
+ * ways to rein in planner's habit of scribbling on its input.
*
- * XXX my goodness this is ugly. Really need to think about ways to
- * rein in planner's habit of scribbling on its input.
+ * Planning of the subquery might have modified the rangetable,
+ * either by addition of RTEs due to expansion of inherited source
+ * tables, or by changes of the Query structures inside subquery
+ * RTEs. We have to ensure that this gets propagated back to the
+ * master copy. However, if we aren't done planning yet, we also
+ * need to ensure that subsequent calls to grouping_planner have
+ * virgin sub-Queries to work from. So, if we are at the last
+ * list entry, just copy the subquery rangetable back to the master
+ * copy; if we are not, then extend the master copy by adding
+ * whatever the subquery added. (We assume these added entries
+ * will go untouched by the future grouping_planner calls. We are
+ * also effectively assuming that sub-Queries will get planned
+ * identically each time, or at least that the impacts on their
+ * rangetables will be the same each time. Did I say this is ugly?)
*/
- subrtlength = list_length(subquery->rtable);
- if (subrtlength > mainrtlength)
+ if (lnext(l) == NULL)
+ parse->rtable = subquery->rtable;
+ else
{
- List *subrt;
+ int subrtlength = list_length(subquery->rtable);
+
+ if (subrtlength > mainrtlength)
+ {
+ List *subrt;
- subrt = list_copy_tail(subquery->rtable, mainrtlength);
- parse->rtable = list_concat(parse->rtable, subrt);
- mainrtlength = subrtlength;
+ subrt = list_copy_tail(subquery->rtable, mainrtlength);
+ parse->rtable = list_concat(parse->rtable, subrt);
+ mainrtlength = subrtlength;
+ }
}
+
/* Save preprocessed tlist from first rel for use in Append */
if (tlist == NIL)
tlist = subplan->targetlist;