aboutsummaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/createplan.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/plan/createplan.c')
-rw-r--r--src/backend/optimizer/plan/createplan.c400
1 files changed, 200 insertions, 200 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index bdceec18be3..413389f4756 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.12 1997/09/07 04:43:57 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v 1.13 1997/09/08 02:24:31 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -44,9 +44,9 @@
#define TEMP_SORT 1
#define TEMP_MATERIAL 2
-static List *switch_outer(List * clauses);
-static Scan *create_scan_node(Path * best_path, List * tlist);
-static Join *create_join_node(JoinPath * best_path, List * tlist);
+static List *switch_outer(List * clauses);
+static Scan *create_scan_node(Path * best_path, List * tlist);
+static Join *create_join_node(JoinPath * best_path, List * tlist);
static SeqScan *
create_seqscan_node(Path * best_path, List * tlist,
List * scan_clauses);
@@ -65,8 +65,8 @@ static HashJoin *
create_hashjoin_node(HashPath * best_path, List * tlist,
List * clauses, Plan * outer_node, List * outer_tlist,
Plan * inner_node, List * inner_tlist);
-static Node *fix_indxqual_references(Node * clause, Path * index_path);
-static Temp *
+static Node *fix_indxqual_references(Node * clause, Path * index_path);
+static Temp *
make_temp(List * tlist, List * keys, Oid * operators,
Plan * plan_node, int temptype);
static IndexScan *
@@ -78,7 +78,7 @@ make_nestloop(List * qptlist, List * qpqual, Plan * lefttree,
static HashJoin *
make_hashjoin(List * tlist, List * qpqual,
List * hashclauses, Plan * lefttree, Plan * righttree);
-static Hash *make_hash(List * tlist, Var * hashkey, Plan * lefttree);
+static Hash *make_hash(List * tlist, Var * hashkey, Plan * lefttree);
static MergeJoin *
make_mergesort(List * tlist, List * qpqual,
List * mergeclauses, Oid opcode, Oid * rightorder,
@@ -102,16 +102,16 @@ make_material(List * tlist, Oid tempid, Plan * lefttree,
*
* Returns the optimal(?) access plan.
*/
-Plan *
+Plan *
create_plan(Path * best_path)
{
- List *tlist;
- Plan *plan_node = (Plan *) NULL;
- Rel *parent_rel;
- int size;
- int width;
- int pages;
- int tuples;
+ List *tlist;
+ Plan *plan_node = (Plan *) NULL;
+ Rel *parent_rel;
+ int size;
+ int width;
+ int pages;
+ int tuples;
parent_rel = best_path->parent;
tlist = get_actual_tlist(parent_rel->targetlist);
@@ -122,18 +122,18 @@ create_plan(Path * best_path)
switch (best_path->pathtype)
{
- case T_IndexScan:
- case T_SeqScan:
- plan_node = (Plan *) create_scan_node(best_path, tlist);
- break;
- case T_HashJoin:
- case T_MergeJoin:
- case T_NestLoop:
- plan_node = (Plan *) create_join_node((JoinPath *) best_path, tlist);
- break;
- default:
- /* do nothing */
- break;
+ case T_IndexScan:
+ case T_SeqScan:
+ plan_node = (Plan *) create_scan_node(best_path, tlist);
+ break;
+ case T_HashJoin:
+ case T_MergeJoin:
+ case T_NestLoop:
+ plan_node = (Plan *) create_join_node((JoinPath *) best_path, tlist);
+ break;
+ default:
+ /* do nothing */
+ break;
}
plan_node->plan_size = size;
@@ -166,12 +166,12 @@ create_plan(Path * best_path)
*
* Returns the scan node.
*/
-static Scan *
+static Scan *
create_scan_node(Path * best_path, List * tlist)
{
- Scan *node = NULL;
- List *scan_clauses;
+ Scan *node = NULL;
+ List *scan_clauses;
/*
* Extract the relevant clauses from the parent relation and replace
@@ -186,20 +186,20 @@ create_scan_node(Path * best_path, List * tlist)
switch (best_path->pathtype)
{
- case T_SeqScan:
- node = (Scan *) create_seqscan_node(best_path, tlist, scan_clauses);
- break;
-
- case T_IndexScan:
- node = (Scan *) create_indexscan_node((IndexPath *) best_path,
- tlist,
- scan_clauses);
- break;
-
- default:
- elog(WARN, "create_scan_node: unknown node type",
- best_path->pathtype);
- break;
+ case T_SeqScan:
+ node = (Scan *) create_seqscan_node(best_path, tlist, scan_clauses);
+ break;
+
+ case T_IndexScan:
+ node = (Scan *) create_indexscan_node((IndexPath *) best_path,
+ tlist,
+ scan_clauses);
+ break;
+
+ default:
+ elog(WARN, "create_scan_node: unknown node type",
+ best_path->pathtype);
+ break;
}
return node;
@@ -215,15 +215,15 @@ create_scan_node(Path * best_path, List * tlist)
*
* Returns the join node.
*/
-static Join *
+static Join *
create_join_node(JoinPath * best_path, List * tlist)
{
- Plan *outer_node;
- List *outer_tlist;
- Plan *inner_node;
- List *inner_tlist;
- List *clauses;
- Join *retval = NULL;
+ Plan *outer_node;
+ List *outer_tlist;
+ Plan *inner_node;
+ List *inner_tlist;
+ List *clauses;
+ Join *retval = NULL;
outer_node = create_plan((Path *) best_path->outerjoinpath);
outer_tlist = outer_node->targetlist;
@@ -235,45 +235,45 @@ create_join_node(JoinPath * best_path, List * tlist)
switch (best_path->path.pathtype)
{
- case T_MergeJoin:
- retval = (Join *) create_mergejoin_node((MergePath *) best_path,
- tlist,
- clauses,
- outer_node,
- outer_tlist,
- inner_node,
- inner_tlist);
- break;
- case T_HashJoin:
- retval = (Join *) create_hashjoin_node((HashPath *) best_path,
- tlist,
- clauses,
- outer_node,
- outer_tlist,
- inner_node,
- inner_tlist);
- break;
- case T_NestLoop:
- retval = (Join *) create_nestloop_node((JoinPath *) best_path,
- tlist,
- clauses,
- outer_node,
- outer_tlist,
- inner_node,
- inner_tlist);
- break;
- default:
- /* do nothing */
- elog(WARN, "create_join_node: unknown node type",
- best_path->path.pathtype);
+ case T_MergeJoin:
+ retval = (Join *) create_mergejoin_node((MergePath *) best_path,
+ tlist,
+ clauses,
+ outer_node,
+ outer_tlist,
+ inner_node,
+ inner_tlist);
+ break;
+ case T_HashJoin:
+ retval = (Join *) create_hashjoin_node((HashPath *) best_path,
+ tlist,
+ clauses,
+ outer_node,
+ outer_tlist,
+ inner_node,
+ inner_tlist);
+ break;
+ case T_NestLoop:
+ retval = (Join *) create_nestloop_node((JoinPath *) best_path,
+ tlist,
+ clauses,
+ outer_node,
+ outer_tlist,
+ inner_node,
+ inner_tlist);
+ break;
+ default:
+ /* do nothing */
+ elog(WARN, "create_join_node: unknown node type",
+ best_path->path.pathtype);
}
#if 0
/*
* * Expensive function pullups may have pulled local predicates *
- * into this path node. Put them in the qpqual of the plan node. *
- * -- JMH, 6/15/92
+ * into this path node. Put them in the qpqual of the plan node. * --
+ * JMH, 6/15/92
*/
if (get_locclauseinfo(best_path) != NIL)
set_qpqual((Plan) retval,
@@ -300,9 +300,9 @@ create_join_node(JoinPath * best_path, List * tlist)
static SeqScan *
create_seqscan_node(Path * best_path, List * tlist, List * scan_clauses)
{
- SeqScan *scan_node = (SeqScan *) NULL;
- Index scan_relid = -1;
- List *temp;
+ SeqScan *scan_node = (SeqScan *) NULL;
+ Index scan_relid = -1;
+ List *temp;
temp = best_path->parent->relids;
if (temp == NULL)
@@ -335,15 +335,15 @@ create_indexscan_node(IndexPath * best_path,
* Extract the(first if conjunct, only if disjunct) clause from the
* clauseinfo list.
*/
- Expr *index_clause = (Expr *) NULL;
- List *indxqual = NIL;
- List *qpqual = NIL;
- List *fixed_indxqual = NIL;
- List *ixid;
- IndexScan *scan_node = (IndexScan *) NULL;
- bool lossy = FALSE;
- HeapTuple indexTuple;
- IndexTupleForm index;
+ Expr *index_clause = (Expr *) NULL;
+ List *indxqual = NIL;
+ List *qpqual = NIL;
+ List *fixed_indxqual = NIL;
+ List *ixid;
+ IndexScan *scan_node = (IndexScan *) NULL;
+ bool lossy = FALSE;
+ HeapTuple indexTuple;
+ IndexTupleForm index;
/*
* If an 'or' clause is to be used with this index, the indxqual field
@@ -358,7 +358,7 @@ create_indexscan_node(IndexPath * best_path,
if (or_clause((Node *) index_clause))
{
- List *temp = NIL;
+ List *temp = NIL;
foreach(temp, index_clause->args)
indxqual = lappend(indxqual, lcons(lfirst(temp), NIL));
@@ -438,7 +438,7 @@ create_nestloop_node(JoinPath * best_path,
Plan * inner_node,
List * inner_tlist)
{
- NestLoop *join_node = (NestLoop *) NULL;
+ NestLoop *join_node = (NestLoop *) NULL;
if (IsA(inner_node, IndexScan))
{
@@ -453,9 +453,9 @@ create_nestloop_node(JoinPath * best_path,
* case of multi-column indices. - vadim 03/18/97
*/
- List *inner_indxqual = lfirst(((IndexScan *) inner_node)->indxqual);
- List *inner_qual;
- bool found = false;
+ List *inner_indxqual = lfirst(((IndexScan *) inner_node)->indxqual);
+ List *inner_qual;
+ bool found = false;
foreach(inner_qual, inner_indxqual)
{
@@ -479,7 +479,7 @@ create_nestloop_node(JoinPath * best_path,
*/
if (found)
{
- List *new_inner_qual = NIL;
+ List *new_inner_qual = NIL;
clauses = set_difference(clauses, inner_indxqual); /* XXX */
new_inner_qual =
@@ -520,12 +520,12 @@ create_mergejoin_node(MergePath * best_path,
Plan * inner_node,
List * inner_tlist)
{
- List *qpqual,
- *mergeclauses;
- RegProcedure opcode;
- Oid *outer_order,
- *inner_order;
- MergeJoin *join_node;
+ List *qpqual,
+ *mergeclauses;
+ RegProcedure opcode;
+ Oid *outer_order,
+ *inner_order;
+ MergeJoin *join_node;
/*
@@ -564,11 +564,11 @@ create_mergejoin_node(MergePath * best_path,
*/
if (best_path->outersortkeys)
{
- Temp *sorted_outer_node = make_temp(outer_tlist,
+ Temp *sorted_outer_node = make_temp(outer_tlist,
best_path->outersortkeys,
- outer_order,
- outer_node,
- TEMP_SORT);
+ outer_order,
+ outer_node,
+ TEMP_SORT);
sorted_outer_node->plan.cost = outer_node->cost;
outer_node = (Plan *) sorted_outer_node;
@@ -576,11 +576,11 @@ create_mergejoin_node(MergePath * best_path,
if (best_path->innersortkeys)
{
- Temp *sorted_inner_node = make_temp(inner_tlist,
+ Temp *sorted_inner_node = make_temp(inner_tlist,
best_path->innersortkeys,
- inner_order,
- inner_node,
- TEMP_SORT);
+ inner_order,
+ inner_node,
+ TEMP_SORT);
sorted_inner_node->plan.cost = outer_node->cost;
inner_node = (Plan *) sorted_inner_node;
@@ -617,11 +617,11 @@ create_hashjoin_node(HashPath * best_path,
Plan * inner_node,
List * inner_tlist)
{
- List *qpqual;
- List *hashclauses;
- HashJoin *join_node;
- Hash *hash_node;
- Var *innerhashkey;
+ List *qpqual;
+ List *hashclauses;
+ HashJoin *join_node;
+ Hash *hash_node;
+ Var *innerhashkey;
/*
* Separate the hashclauses from the other join qualification clauses
@@ -662,18 +662,18 @@ create_hashjoin_node(HashPath * best_path,
*
*****************************************************************************/
-static Node *
+static Node *
fix_indxqual_references(Node * clause, Path * index_path)
{
- Node *newclause;
+ Node *newclause;
if (IsA(clause, Var))
{
if (lfirsti(index_path->parent->relids) == ((Var *) clause)->varno)
{
- int pos = 0;
- int varatt = ((Var *) clause)->varattno;
- int *indexkeys = ((IndexPath *) index_path)->indexkeys;
+ int pos = 0;
+ int varatt = ((Var *) clause)->varattno;
+ int *indexkeys = ((IndexPath *) index_path)->indexkeys;
if (indexkeys)
{
@@ -710,7 +710,7 @@ fix_indxqual_references(Node * clause, Path * index_path)
is_funcclause((Node *) get_leftop((Expr *) clause)) &&
((Func *) ((Expr *) get_leftop((Expr *) clause))->oper)->funcisindex)
{
- Var *newvar =
+ Var *newvar =
makeVar((Index) lfirsti(index_path->parent->relids),
1, /* func indices have one key */
((Func *) ((Expr *) clause)->oper)->functype,
@@ -725,10 +725,10 @@ fix_indxqual_references(Node * clause, Path * index_path)
}
else if (IsA(clause, Expr))
{
- Expr *expr = (Expr *) clause;
- List *new_subclauses = NIL;
- Node *subclause = NULL;
- List *i = NIL;
+ Expr *expr = (Expr *) clause;
+ List *new_subclauses = NIL;
+ Node *subclause = NULL;
+ List *i = NIL;
foreach(i, expr->args)
{
@@ -757,10 +757,10 @@ fix_indxqual_references(Node * clause, Path * index_path)
}
else
{
- List *oldclauses = (List *) clause;
- List *new_subclauses = NIL;
- Node *subclause = NULL;
- List *i = NIL;
+ List *oldclauses = (List *) clause;
+ List *new_subclauses = NIL;
+ Node *subclause = NULL;
+ List *i = NIL;
foreach(i, oldclauses)
{
@@ -799,14 +799,14 @@ fix_indxqual_references(Node * clause, Path * index_path)
*
* XXX Shouldn't the operator be commuted?!
*/
-static List *
+static List *
switch_outer(List * clauses)
{
- List *t_list = NIL;
- Expr *temp = NULL;
- List *i = NIL;
- Expr *clause;
- Node *op;
+ List *t_list = NIL;
+ Expr *temp = NULL;
+ List *i = NIL;
+ Expr *clause;
+ Node *op;
foreach(i, clauses)
{
@@ -843,13 +843,13 @@ switch_outer(List * clauses)
*
* Returns the modified target list.
*/
-static List *
+static List *
set_temp_tlist_operators(List * tlist, List * pathkeys, Oid * operators)
{
- Node *keys = NULL;
- int keyno = 1;
- Resdom *resdom = (Resdom *) NULL;
- List *i = NIL;
+ Node *keys = NULL;
+ int keyno = 1;
+ Resdom *resdom = (Resdom *) NULL;
+ List *i = NIL;
foreach(i, pathkeys)
{
@@ -891,15 +891,15 @@ set_temp_tlist_operators(List * tlist, List * pathkeys, Oid * operators)
* 'plan-node' is the node which yields tuples for the sort
* 'temptype' indicates which operation(sort or hash) to perform
*/
-static Temp *
+static Temp *
make_temp(List * tlist,
List * keys,
Oid * operators,
Plan * plan_node,
int temptype)
{
- List *temp_tlist;
- Temp *retval = NULL;
+ List *temp_tlist;
+ Temp *retval = NULL;
/* Create a new target list for the temporary, with keys set. */
temp_tlist = set_temp_tlist_operators(new_unsorted_tlist(tlist),
@@ -907,42 +907,42 @@ make_temp(List * tlist,
operators);
switch (temptype)
{
- case TEMP_SORT:
- retval = (Temp *) make_seqscan(tlist,
- NIL,
- _TEMP_RELATION_ID_,
- (Plan *) make_sort(temp_tlist,
+ case TEMP_SORT:
+ retval = (Temp *) make_seqscan(tlist,
+ NIL,
+ _TEMP_RELATION_ID_,
+ (Plan *) make_sort(temp_tlist,
_TEMP_RELATION_ID_,
- plan_node,
+ plan_node,
length(keys)));
- break;
+ break;
- case TEMP_MATERIAL:
- retval = (Temp *) make_seqscan(tlist,
- NIL,
- _TEMP_RELATION_ID_,
+ case TEMP_MATERIAL:
+ retval = (Temp *) make_seqscan(tlist,
+ NIL,
+ _TEMP_RELATION_ID_,
(Plan *) make_material(temp_tlist,
_TEMP_RELATION_ID_,
plan_node,
length(keys)));
- break;
+ break;
- default:
- elog(WARN, "make_temp: unknown temp type %d", temptype);
+ default:
+ elog(WARN, "make_temp: unknown temp type %d", temptype);
}
return (retval);
}
-SeqScan *
+SeqScan *
make_seqscan(List * qptlist,
List * qpqual,
Index scanrelid,
Plan * lefttree)
{
- SeqScan *node = makeNode(SeqScan);
- Plan *plan = &node->plan;
+ SeqScan *node = makeNode(SeqScan);
+ Plan *plan = &node->plan;
plan->cost = 0.0;
plan->state = (EState *) NULL;
@@ -963,8 +963,8 @@ make_indexscan(List * qptlist,
List * indxid,
List * indxqual)
{
- IndexScan *node = makeNode(IndexScan);
- Plan *plan = &node->scan.plan;
+ IndexScan *node = makeNode(IndexScan);
+ Plan *plan = &node->scan.plan;
plan->cost = 0.0;
plan->state = (EState *) NULL;
@@ -987,8 +987,8 @@ make_nestloop(List * qptlist,
Plan * lefttree,
Plan * righttree)
{
- NestLoop *node = makeNode(NestLoop);
- Plan *plan = &node->join;
+ NestLoop *node = makeNode(NestLoop);
+ Plan *plan = &node->join;
plan->cost = 0.0;
plan->state = (EState *) NULL;
@@ -1008,8 +1008,8 @@ make_hashjoin(List * tlist,
Plan * lefttree,
Plan * righttree)
{
- HashJoin *node = makeNode(HashJoin);
- Plan *plan = &node->join;
+ HashJoin *node = makeNode(HashJoin);
+ Plan *plan = &node->join;
plan->cost = 0.0;
plan->state = (EState *) NULL;
@@ -1026,11 +1026,11 @@ make_hashjoin(List * tlist,
return (node);
}
-static Hash *
+static Hash *
make_hash(List * tlist, Var * hashkey, Plan * lefttree)
{
- Hash *node = makeNode(Hash);
- Plan *plan = &node->plan;
+ Hash *node = makeNode(Hash);
+ Plan *plan = &node->plan;
plan->cost = 0.0;
plan->state = (EState *) NULL;
@@ -1056,8 +1056,8 @@ make_mergesort(List * tlist,
Plan * righttree,
Plan * lefttree)
{
- MergeJoin *node = makeNode(MergeJoin);
- Plan *plan = &node->join;
+ MergeJoin *node = makeNode(MergeJoin);
+ Plan *plan = &node->join;
plan->cost = 0.0;
plan->state = (EState *) NULL;
@@ -1073,11 +1073,11 @@ make_mergesort(List * tlist,
return (node);
}
-Sort *
+Sort *
make_sort(List * tlist, Oid tempid, Plan * lefttree, int keycount)
{
- Sort *node = makeNode(Sort);
- Plan *plan = &node->plan;
+ Sort *node = makeNode(Sort);
+ Plan *plan = &node->plan;
plan->cost = 0.0;
plan->state = (EState *) NULL;
@@ -1097,8 +1097,8 @@ make_material(List * tlist,
Plan * lefttree,
int keycount)
{
- Material *node = makeNode(Material);
- Plan *plan = &node->plan;
+ Material *node = makeNode(Material);
+ Plan *plan = &node->plan;
plan->cost = 0.0;
plan->state = (EState *) NULL;
@@ -1112,10 +1112,10 @@ make_material(List * tlist,
return (node);
}
-Agg *
+Agg *
make_agg(List * tlist, int nagg, Aggreg ** aggs)
{
- Agg *node = makeNode(Agg);
+ Agg *node = makeNode(Agg);
node->plan.cost = 0.0;
node->plan.state = (EState *) NULL;
@@ -1129,14 +1129,14 @@ make_agg(List * tlist, int nagg, Aggreg ** aggs)
return (node);
}
-Group *
+Group *
make_group(List * tlist,
bool tuplePerGroup,
int ngrp,
AttrNumber * grpColIdx,
Sort * lefttree)
{
- Group *node = makeNode(Group);
+ Group *node = makeNode(Group);
node->plan.cost = 0.0;
node->plan.state = (EState *) NULL;
@@ -1159,11 +1159,11 @@ make_group(List * tlist,
* or "*"
*/
-Unique *
+Unique *
make_unique(List * tlist, Plan * lefttree, char *uniqueAttr)
{
- Unique *node = makeNode(Unique);
- Plan *plan = &node->plan;
+ Unique *node = makeNode(Unique);
+ Plan *plan = &node->plan;
plan->cost = 0.0;
plan->state = (EState *) NULL;
@@ -1182,14 +1182,14 @@ make_unique(List * tlist, Plan * lefttree, char *uniqueAttr)
return (node);
}
-List *
+List *
generate_fjoin(List * tlist)
{
#if 0
- List tlistP;
- List newTlist = NIL;
- List fjoinList = NIL;
- int nIters = 0;
+ List tlistP;
+ List newTlist = NIL;
+ List fjoinList = NIL;
+ int nIters = 0;
/*
* Break the target list into elements with Iter nodes, and those
@@ -1197,7 +1197,7 @@ generate_fjoin(List * tlist)
*/
foreach(tlistP, tlist)
{
- List tlistElem;
+ List tlistElem;
tlistElem = lfirst(tlistP);
if (IsA(lsecond(tlistElem), Iter))
@@ -1216,11 +1216,11 @@ generate_fjoin(List * tlist)
*/
if (nIters > 0)
{
- List *inner;
- List *tempList;
- Fjoin *fjoinNode;
- DatumPtr results = (DatumPtr) palloc(nIters * sizeof(Datum));
- BoolPtr alwaysDone = (BoolPtr) palloc(nIters * sizeof(bool));
+ List *inner;
+ List *tempList;
+ Fjoin *fjoinNode;
+ DatumPtr results = (DatumPtr) palloc(nIters * sizeof(Datum));
+ BoolPtr alwaysDone = (BoolPtr) palloc(nIters * sizeof(bool));
inner = lfirst(fjoinList);
fjoinList = lnext(fjoinList);