aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/planner.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2002-05-18 02:25:50 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2002-05-18 02:25:50 +0000
commit51fd22abdd9582e5b0edd545be93306a3edf0048 (patch)
tree61fa1b61c672a7fecc3acd3e393860de230f417e /src/backend/optimizer/plan/planner.c
parent0a757154bd4592b69e3715a7066645f4046ee57e (diff)
downloadpostgresql-51fd22abdd9582e5b0edd545be93306a3edf0048.tar.gz
postgresql-51fd22abdd9582e5b0edd545be93306a3edf0048.zip
Change set_plan_references and join_references to take an rtable List
rather than a Query node; this allows set_plan_references to recurse into subplans correctly. Fixes core dump on full outer joins in subplans. Also, invoke preprocess_expression on function RTEs' function expressions. This seems to fix the planner's problems with outer-level Vars in function RTEs.
Diffstat (limited to 'src/backend/optimizer/plan/planner.c')
-rw-r--r--src/backend/optimizer/plan/planner.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index 500297f2155..a3eeced7bb1 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.117 2002/05/12 23:43:03 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v 1.118 2002/05/18 02:25:49 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -101,7 +101,7 @@ planner(Query *parse)
result_plan->nParamExec = length(PlannerParamVar);
/* final cleanup of the plan */
- set_plan_references(parse, result_plan);
+ set_plan_references(result_plan, parse->rtable);
/* restore state for outer planner, if any */
PlannerQueryLevel = save_PlannerQueryLevel;
@@ -175,6 +175,17 @@ subquery_planner(Query *parse, double tuple_fraction)
parse->havingQual = preprocess_expression(parse, parse->havingQual,
EXPRKIND_HAVING);
+ /* Also need to preprocess expressions for function RTEs */
+ foreach(lst, parse->rtable)
+ {
+ RangeTblEntry *rte = (RangeTblEntry *) lfirst(lst);
+
+ if (rte->rtekind == RTE_FUNCTION)
+ rte->funcexpr = preprocess_expression(parse, rte->funcexpr,
+ EXPRKIND_TARGET);
+ /* These are not targetlist items, but close enough... */
+ }
+
/*
* Check for ungrouped variables passed to subplans in targetlist and
* HAVING clause (but not in WHERE or JOIN/ON clauses, since those are
@@ -737,7 +748,7 @@ preprocess_expression(Query *parse, Node *expr, int kind)
}
}
if (has_join_rtes)
- expr = flatten_join_alias_vars(expr, parse, false);
+ expr = flatten_join_alias_vars(expr, parse->rtable, false);
return expr;
}