summaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/planmain.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/plan/planmain.c')
-rw-r--r--src/backend/optimizer/plan/planmain.c78
1 files changed, 13 insertions, 65 deletions
diff --git a/src/backend/optimizer/plan/planmain.c b/src/backend/optimizer/plan/planmain.c
index cfa134a3889..acc4eb5d938 100644
--- a/src/backend/optimizer/plan/planmain.c
+++ b/src/backend/optimizer/plan/planmain.c
@@ -3,29 +3,31 @@
* planmain.c
* Routines to plan a single query
*
+ * What's in a name, anyway? The top-level entry point of the planner/
+ * optimizer is over in planner.c, not here as you might think from the
+ * file name. But this is the main code for planning a basic join operation,
+ * shorn of features like subselects, inheritance, aggregates, grouping,
+ * and so on. (Those are the things planner.c deals with.)
+ *
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.52 2000/02/15 20:49:18 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v 1.53 2000/03/21 05:11:58 tgl Exp $
*
*-------------------------------------------------------------------------
*/
-#include <sys/types.h>
-
#include "postgres.h"
+#include <sys/types.h>
#include "optimizer/clauses.h"
#include "optimizer/cost.h"
#include "optimizer/pathnode.h"
#include "optimizer/paths.h"
#include "optimizer/planmain.h"
-#include "optimizer/prep.h"
-#include "optimizer/subselect.h"
#include "optimizer/tlist.h"
-#include "utils/lsyscache.h"
static Plan *subplanner(Query *root, List *flat_tlist, List *qual,
@@ -34,19 +36,15 @@ static Plan *subplanner(Query *root, List *flat_tlist, List *qual,
/*--------------------
* query_planner
- * Routine to create a query plan. It does so by first creating a
- * subplan for the topmost level of attributes in the query. Then,
- * it modifies all target list and qualifications to consider the next
- * level of nesting and creates a plan for this modified query by
- * recursively calling itself. The two pieces are then merged together
- * by creating a result node that indicates which attributes should
- * be placed where and any relation level qualifications to be
- * satisfied.
+ * Generate a plan for a basic query, which may involve joins but
+ * not any fancier features.
*
- * tlist is the target list of the query (do NOT use root->targetList!)
+ * tlist is the target list the query should produce (NOT root->targetList!)
* qual is the qualification of the query (likewise!)
* tuple_fraction is the fraction of tuples we expect will be retrieved
*
+ * qual must already have been converted to implicit-AND form.
+ *
* Note: the Query node now also includes a query_pathkeys field, which
* is both an input and an output of query_planner(). The input value
* signals query_planner that the indicated sort order is wanted in the
@@ -84,46 +82,6 @@ query_planner(Query *root,
Plan *subplan;
/*
- * Note: union_planner should already have done constant folding
- * in both the tlist and qual, so we don't do it again here
- * (indeed, we may be getting a flattened var-only tlist anyway).
- *
- * Is there any value in re-folding the qual after canonicalize_qual?
- */
-
- /*
- * Canonicalize the qual, and convert it to implicit-AND format.
- */
- qual = canonicalize_qual((Expr *) qual, true);
-#ifdef OPTIMIZER_DEBUG
- printf("After canonicalize_qual()\n");
- pprint(qual);
-#endif
-
- /* Replace uplevel vars with Param nodes */
- if (PlannerQueryLevel > 1)
- {
- tlist = (List *) SS_replace_correlation_vars((Node *) tlist);
- qual = (List *) SS_replace_correlation_vars((Node *) qual);
- }
-
- /* Expand SubLinks to SubPlans */
- if (root->hasSubLinks)
- {
- tlist = (List *) SS_process_sublinks((Node *) tlist);
- qual = (List *) SS_process_sublinks((Node *) qual);
- if (root->groupClause != NIL)
- {
- /*
- * Check for ungrouped variables passed to subplans.
- * Note we do NOT do this for subplans in WHERE; it's legal
- * there because WHERE is evaluated pre-GROUP.
- */
- check_subplans_for_ungrouped_vars((Node *) tlist, root, tlist);
- }
- }
-
- /*
* If the query contains no relation references at all, it must be
* something like "SELECT 2+2;". Build a trivial "Result" plan.
*/
@@ -192,16 +150,6 @@ query_planner(Query *root,
}
return subplan;
-
-#ifdef NOT_USED
-
- /*
- * Destructively modify the query plan's targetlist to add fjoin lists
- * to flatten functions that return sets of base types
- */
- subplan->targetlist = generate_fjoin(subplan->targetlist);
-#endif
-
}
/*