summaryrefslogtreecommitdiff
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.c48
1 files changed, 17 insertions, 31 deletions
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index c818f0ddf1..8b432ba93f 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.240 2008/08/07 01:11:50 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/optimizer/plan/planner.c,v 1.241 2008/08/14 18:47:59 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -55,8 +55,7 @@ planner_hook_type planner_hook = NULL;
#define EXPRKIND_RTFUNC 2
#define EXPRKIND_VALUES 3
#define EXPRKIND_LIMIT 4
-#define EXPRKIND_ININFO 5
-#define EXPRKIND_APPINFO 6
+#define EXPRKIND_APPINFO 5
static Node *preprocess_expression(PlannerInfo *root, Node *expr, int kind);
@@ -255,6 +254,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
PlannerInfo *root;
Plan *plan;
List *newHaving;
+ bool hasOuterJoins;
ListCell *l;
/* Create a PlannerInfo data structure for this subquery */
@@ -265,23 +265,22 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
root->planner_cxt = CurrentMemoryContext;
root->init_plans = NIL;
root->eq_classes = NIL;
- root->in_info_list = NIL;
root->append_rel_list = NIL;
/*
- * Look for IN clauses at the top level of WHERE, and transform them into
- * joins. Note that this step only handles IN clauses originally at top
- * level of WHERE; if we pull up any subqueries below, their INs are
- * processed just before pulling them up.
+ * Look for ANY and EXISTS SubLinks at the top level of WHERE, and try to
+ * transform them into joins. Note that this step only handles SubLinks
+ * originally at top level of WHERE; if we pull up any subqueries below,
+ * their SubLinks are processed just before pulling them up.
*/
if (parse->hasSubLinks)
- parse->jointree->quals = pull_up_IN_clauses(root,
- parse->jointree->quals);
+ parse->jointree->quals = pull_up_sublinks(root,
+ parse->jointree->quals);
/*
* Scan the rangetable for set-returning functions, and inline them
* if possible (producing subqueries that might get pulled up next).
- * Recursion issues here are handled in the same way as for IN clauses.
+ * Recursion issues here are handled in the same way as for SubLinks.
*/
inline_set_returning_functions(root);
@@ -295,16 +294,11 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
/*
* Detect whether any rangetable entries are RTE_JOIN kind; if not, we can
* avoid the expense of doing flatten_join_alias_vars(). Also check for
- * outer joins --- if none, we can skip reduce_outer_joins() and some
- * other processing. This must be done after we have done
- * pull_up_subqueries, of course.
- *
- * Note: if reduce_outer_joins manages to eliminate all outer joins,
- * root->hasOuterJoins is not reset currently. This is OK since its
- * purpose is merely to suppress unnecessary processing in simple cases.
+ * outer joins --- if none, we can skip reduce_outer_joins().
+ * This must be done after we have done pull_up_subqueries, of course.
*/
root->hasJoinRTEs = false;
- root->hasOuterJoins = false;
+ hasOuterJoins = false;
foreach(l, parse->rtable)
{
RangeTblEntry *rte = (RangeTblEntry *) lfirst(l);
@@ -314,7 +308,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
root->hasJoinRTEs = true;
if (IS_OUTER_JOIN(rte->jointype))
{
- root->hasOuterJoins = true;
+ hasOuterJoins = true;
/* Can quit scanning once we find an outer join */
break;
}
@@ -362,9 +356,6 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
parse->limitCount = preprocess_expression(root, parse->limitCount,
EXPRKIND_LIMIT);
- root->in_info_list = (List *)
- preprocess_expression(root, (Node *) root->in_info_list,
- EXPRKIND_ININFO);
root->append_rel_list = (List *)
preprocess_expression(root, (Node *) root->append_rel_list,
EXPRKIND_APPINFO);
@@ -442,7 +433,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
* This step is most easily done after we've done expression
* preprocessing.
*/
- if (root->hasOuterJoins)
+ if (hasOuterJoins)
reduce_outer_joins(root);
/*
@@ -639,20 +630,15 @@ inheritance_planner(PlannerInfo *root)
continue;
/*
- * Generate modified query with this rel as target. We have to be
- * prepared to translate varnos in in_info_list as well as in the
- * Query proper.
+ * Generate modified query with this rel as target.
*/
memcpy(&subroot, root, sizeof(PlannerInfo));
subroot.parse = (Query *)
adjust_appendrel_attrs((Node *) parse,
appinfo);
- subroot.in_info_list = (List *)
- adjust_appendrel_attrs((Node *) root->in_info_list,
- appinfo);
subroot.init_plans = NIL;
/* There shouldn't be any OJ info to translate, as yet */
- Assert(subroot.oj_info_list == NIL);
+ Assert(subroot.join_info_list == NIL);
/* Generate plan */
subplan = grouping_planner(&subroot, 0.0 /* retrieve all tuples */ );