Commit 31cce21f authored by Bruce Momjian's avatar Bruce Momjian

Fix bushy plans. Cleanup.

parent c82ca4c1
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.72 1999/02/15 05:21:01 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.73 1999/02/18 00:49:12 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1066,7 +1066,6 @@ _copyRelOptInfo(RelOptInfo * from) ...@@ -1066,7 +1066,6 @@ _copyRelOptInfo(RelOptInfo * from)
Node_Copy(from, newnode, restrictinfo); Node_Copy(from, newnode, restrictinfo);
Node_Copy(from, newnode, joininfo); Node_Copy(from, newnode, joininfo);
Node_Copy(from, newnode, innerjoin); Node_Copy(from, newnode, innerjoin);
Node_Copy(from, newnode, superrels);
return newnode; return newnode;
} }
...@@ -1428,12 +1427,11 @@ _copyJoinInfo(JoinInfo *from) ...@@ -1428,12 +1427,11 @@ _copyJoinInfo(JoinInfo *from)
* copy remainder of node * copy remainder of node
* ---------------- * ----------------
*/ */
newnode->unjoined_rels = listCopy(from->unjoined_rels); newnode->unjoined_relids = listCopy(from->unjoined_relids);
Node_Copy(from, newnode, jinfo_restrictinfo); Node_Copy(from, newnode, jinfo_restrictinfo);
newnode->mergejoinable = from->mergejoinable; newnode->mergejoinable = from->mergejoinable;
newnode->hashjoinable = from->hashjoinable; newnode->hashjoinable = from->hashjoinable;
newnode->bushy_inactive = from->bushy_inactive;
return newnode; return newnode;
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.34 1999/02/15 05:21:02 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v 1.35 1999/02/18 00:49:14 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -526,7 +526,7 @@ _equalJoinInfo(JoinInfo *a, JoinInfo *b) ...@@ -526,7 +526,7 @@ _equalJoinInfo(JoinInfo *a, JoinInfo *b)
{ {
Assert(IsA(a, JoinInfo)); Assert(IsA(a, JoinInfo));
Assert(IsA(b, JoinInfo)); Assert(IsA(b, JoinInfo));
if (!equal(a->unjoined_rels, b->unjoined_rels)) if (!equal(a->unjoined_relids, b->unjoined_relids))
return false; return false;
if (!equal(a->jinfo_restrictinfo, b->jinfo_restrictinfo)) if (!equal(a->jinfo_restrictinfo, b->jinfo_restrictinfo))
return false; return false;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.12 1999/02/15 05:21:02 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/Attic/freefuncs.c,v 1.13 1999/02/18 00:49:14 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -740,7 +740,6 @@ _freeRelOptInfo(RelOptInfo *node) ...@@ -740,7 +740,6 @@ _freeRelOptInfo(RelOptInfo *node)
freeObject(node->restrictinfo); freeObject(node->restrictinfo);
freeObject(node->joininfo); freeObject(node->joininfo);
freeObject(node->innerjoin); freeObject(node->innerjoin);
freeObject(node->superrels);
pfree(node); pfree(node);
} }
...@@ -1024,7 +1023,7 @@ _freeJoinInfo(JoinInfo *node) ...@@ -1024,7 +1023,7 @@ _freeJoinInfo(JoinInfo *node)
* free remainder of node * free remainder of node
* ---------------- * ----------------
*/ */
freeList(node->unjoined_rels); freeList(node->unjoined_relids);
freeObject(node->jinfo_restrictinfo); freeObject(node->jinfo_restrictinfo);
pfree(node); pfree(node);
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: outfuncs.c,v 1.74 1999/02/15 05:21:02 momjian Exp $ * $Id: outfuncs.c,v 1.75 1999/02/18 00:49:14 momjian Exp $
* *
* NOTES * NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which * Every (plan) node in POSTGRES has an associated "out" routine which
...@@ -61,7 +61,7 @@ _outIntList(StringInfo str, List *list) ...@@ -61,7 +61,7 @@ _outIntList(StringInfo str, List *list)
appendStringInfo(str, "("); appendStringInfo(str, "(");
foreach(l, list) foreach(l, list)
{ {
appendStringInfo(str, " %d ", (int) lfirst(l)); appendStringInfo(str, " %d ", lfirsti(l));
} }
appendStringInfo(str, ")"); appendStringInfo(str, ")");
} }
...@@ -1198,8 +1198,8 @@ _outHashInfo(StringInfo str, HashInfo *node) ...@@ -1198,8 +1198,8 @@ _outHashInfo(StringInfo str, HashInfo *node)
static void static void
_outJoinInfo(StringInfo str, JoinInfo *node) _outJoinInfo(StringInfo str, JoinInfo *node)
{ {
appendStringInfo(str, " JINFO :unjoined_rels "); appendStringInfo(str, " JINFO :unjoined_relids ");
_outIntList(str, node->unjoined_rels); _outIntList(str, node->unjoined_relids);
appendStringInfo(str, " :jinfo_restrictinfo "); appendStringInfo(str, " :jinfo_restrictinfo ");
_outNode(str, node->jinfo_restrictinfo); _outNode(str, node->jinfo_restrictinfo);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.58 1999/02/15 05:21:03 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.59 1999/02/18 00:49:15 momjian Exp $
* *
* NOTES * NOTES
* Most of the read functions for plan nodes are tested. (In fact, they * Most of the read functions for plan nodes are tested. (In fact, they
...@@ -1982,8 +1982,8 @@ _readJoinInfo() ...@@ -1982,8 +1982,8 @@ _readJoinInfo()
local_node = makeNode(JoinInfo); local_node = makeNode(JoinInfo);
token = lsptok(NULL, &length); /* get :unjoined_rels */ token = lsptok(NULL, &length); /* get :unjoined_relids */
local_node->unjoined_rels = toIntList(nodeRead(true)); /* now read it */ local_node->unjoined_relids = toIntList(nodeRead(true)); /* now read it */
token = lsptok(NULL, &length); /* get :jinfo_restrictinfo */ token = lsptok(NULL, &length); /* get :jinfo_restrictinfo */
local_node->jinfo_restrictinfo = nodeRead(true); /* now read it */ local_node->jinfo_restrictinfo = nodeRead(true); /* now read it */
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/xfunc.c,v 1.28 1999/02/13 23:16:24 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/_deadcode/Attic/xfunc.c,v 1.1 1999/02/18 00:49:24 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
/* local funcs */ /* local funcs */
static int xfunc_card_unreferenced(Query *queryInfo, static int xfunc_card_unreferenced(Query *queryInfo,
Expr *clause, Relid referenced); Expr *clause, Relids referenced);
*/ */
...@@ -631,10 +631,10 @@ xfunc_width(LispValue clause) ...@@ -631,10 +631,10 @@ xfunc_width(LispValue clause)
} }
else if (IsA(clause, Param)) else if (IsA(clause, Param))
{ {
if (typeidTypeRelid(get_paramtype((Param) clause))) if (typeidTypeRelids(get_paramtype((Param) clause)))
{ {
/* Param node returns a tuple. Find its width */ /* Param node returns a tuple. Find its width */
rd = heap_open(typeidTypeRelid(get_paramtype((Param) clause))); rd = heap_open(typeidTypeRelids(get_paramtype((Param) clause)));
retval = xfunc_tuple_width(rd); retval = xfunc_tuple_width(rd);
heap_close(rd); heap_close(rd);
} }
...@@ -724,9 +724,9 @@ exit: ...@@ -724,9 +724,9 @@ exit:
*/ */
static Count static Count
xfunc_card_unreferenced(Query *queryInfo, xfunc_card_unreferenced(Query *queryInfo,
LispValue clause, Relid referenced) LispValue clause, Relids referenced)
{ {
Relid unreferenced, Relids unreferenced,
allrelids = LispNil; allrelids = LispNil;
LispValue temp; LispValue temp;
...@@ -751,7 +751,7 @@ xfunc_card_unreferenced(Query *queryInfo, ...@@ -751,7 +751,7 @@ xfunc_card_unreferenced(Query *queryInfo,
** multiple together cardinalities of a list relations. ** multiple together cardinalities of a list relations.
*/ */
Count Count
xfunc_card_product(Query *queryInfo, Relid relids) xfunc_card_product(Query *queryInfo, Relids relids)
{ {
LispValue cinfonode; LispValue cinfonode;
LispValue temp; LispValue temp;
...@@ -1310,9 +1310,9 @@ xfunc_func_width(RegProcedure funcid, LispValue args) ...@@ -1310,9 +1310,9 @@ xfunc_func_width(RegProcedure funcid, LispValue args)
proc = (Form_pg_proc) GETSTRUCT(tupl); proc = (Form_pg_proc) GETSTRUCT(tupl);
/* if function returns a tuple, get the width of that */ /* if function returns a tuple, get the width of that */
if (typeidTypeRelid(proc->prorettype)) if (typeidTypeRelids(proc->prorettype))
{ {
rd = heap_open(typeidTypeRelid(proc->prorettype)); rd = heap_open(typeidTypeRelids(proc->prorettype));
retval = xfunc_tuple_width(rd); retval = xfunc_tuple_width(rd);
heap_close(rd); heap_close(rd);
goto exit; goto exit;
...@@ -1478,7 +1478,6 @@ xfunc_copyrel(RelOptInfo from, RelOptInfo *to) ...@@ -1478,7 +1478,6 @@ xfunc_copyrel(RelOptInfo from, RelOptInfo *to)
Node_Copy(from, newnode, alloc, restrictinfo); Node_Copy(from, newnode, alloc, restrictinfo);
Node_Copy(from, newnode, alloc, joininfo); Node_Copy(from, newnode, alloc, joininfo);
Node_Copy(from, newnode, alloc, innerjoin); Node_Copy(from, newnode, alloc, innerjoin);
Node_Copy(from, newnode, alloc, superrels);
(*to) = newnode; (*to) = newnode;
return true; return true;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.40 1999/02/16 00:40:59 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/allpaths.c,v 1.41 1999/02/18 00:49:17 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -191,6 +191,8 @@ make_one_rel_by_joins(Query *root, List *rels, int levels_needed) ...@@ -191,6 +191,8 @@ make_one_rel_by_joins(Query *root, List *rels, int levels_needed)
merge_rels_with_same_relids(joined_rels); merge_rels_with_same_relids(joined_rels);
root->join_rel_list = rels = joined_rels;
#if 0 #if 0
/* /*
* * for each expensive predicate in each path in each distinct * * for each expensive predicate in each path in each distinct
...@@ -203,17 +205,6 @@ make_one_rel_by_joins(Query *root, List *rels, int levels_needed) ...@@ -203,17 +205,6 @@ make_one_rel_by_joins(Query *root, List *rels, int levels_needed)
rels_set_cheapest(joined_rels); rels_set_cheapest(joined_rels);
if (BushyPlanFlag)
{
/*
* In case of bushy trees if there is still a join between a
* join relation and another relation, add a new joininfo that
* involves the join relation to the joininfo list of the
* other relation
*/
add_rel_to_rel_joininfos(root, joined_rels, rels);
}
foreach(x, joined_rels) foreach(x, joined_rels)
{ {
rel = (RelOptInfo *) lfirst(x); rel = (RelOptInfo *) lfirst(x);
...@@ -228,20 +219,6 @@ make_one_rel_by_joins(Query *root, List *rels, int levels_needed) ...@@ -228,20 +219,6 @@ make_one_rel_by_joins(Query *root, List *rels, int levels_needed)
#endif #endif
} }
if (BushyPlanFlag)
{
/*
* prune rels that have been completely incorporated into new
* join rels
*/
joined_rels = del_rels_all_bushy_inactive(rels);
/*
* merge join rels if then contain the same list of base rels
*/
merge_rels_with_same_relids(joined_rels);
}
root->join_rel_list = rels = joined_rels;
} }
Assert(BushyPlanFlag || length(rels) == 1); Assert(BushyPlanFlag || length(rels) == 1);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.50 1999/02/15 05:50:00 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/indxpath.c,v 1.51 1999/02/18 00:49:18 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -1208,7 +1208,7 @@ indexable_joinclauses(RelOptInfo *rel, RelOptInfo *index, ...@@ -1208,7 +1208,7 @@ indexable_joinclauses(RelOptInfo *rel, RelOptInfo *index,
{ {
List *clauses = lfirst(clausegroups); List *clauses = lfirst(clausegroups);
((RestrictInfo *) lfirst(clauses))->restrictinfojoinid = joininfo->unjoined_rels; ((RestrictInfo *) lfirst(clauses))->restrictinfojoinid = joininfo->unjoined_relids;
} }
cg_list = nconc(cg_list, clausegroups); cg_list = nconc(cg_list, clausegroups);
} }
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.27 1999/02/15 03:22:05 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.28 1999/02/18 00:49:19 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -71,8 +71,8 @@ update_rels_pathlist_for_joins(Query *root, List *joinrels) ...@@ -71,8 +71,8 @@ update_rels_pathlist_for_joins(Query *root, List *joinrels)
foreach(j, joinrels) foreach(j, joinrels)
{ {
RelOptInfo *joinrel = (RelOptInfo *) lfirst(j); RelOptInfo *joinrel = (RelOptInfo *) lfirst(j);
List *innerrelids; Relids innerrelids;
List *outerrelids; Relids outerrelids;
RelOptInfo *innerrel; RelOptInfo *innerrel;
RelOptInfo *outerrel; RelOptInfo *outerrel;
Path *bestinnerjoin; Path *bestinnerjoin;
...@@ -163,7 +163,7 @@ update_rels_pathlist_for_joins(Query *root, List *joinrels) ...@@ -163,7 +163,7 @@ update_rels_pathlist_for_joins(Query *root, List *joinrels)
* Returns the pathnode of the selected path. * Returns the pathnode of the selected path.
*/ */
static Path * static Path *
best_innerjoin(List *join_paths, List *outer_relids) best_innerjoin(List *join_paths, Relids outer_relids)
{ {
Path *cheapest = (Path *) NULL; Path *cheapest = (Path *) NULL;
List *join_path; List *join_path;
......
This diff is collapsed.
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.36 1999/02/16 00:41:00 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/prune.c,v 1.37 1999/02/18 00:49:21 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include "utils/elog.h" #include "utils/elog.h"
static List *merge_rel_with_same_relids(RelOptInfo *rel, List *unjoined_rels); static List *merge_rel_with_same_relids(RelOptInfo *rel, Relids unjoined_relids);
/* /*
* merge_rels_with_same_relids * merge_rels_with_same_relids
...@@ -49,7 +49,7 @@ merge_rels_with_same_relids(List *rel_list) ...@@ -49,7 +49,7 @@ merge_rels_with_same_relids(List *rel_list)
/* /*
* merge_rel_with_same_relids * merge_rel_with_same_relids
* Prunes those relations from 'unjoined_rels' that are redundant with * Prunes those relations from 'unjoined_relids' that are redundant with
* 'rel'. A relation is redundant if it is built up of the same * 'rel'. A relation is redundant if it is built up of the same
* relations as 'rel'. Paths for the redundant relation are merged into * relations as 'rel'. Paths for the redundant relation are merged into
* the pathlist of 'rel'. * the pathlist of 'rel'.
...@@ -59,12 +59,12 @@ merge_rels_with_same_relids(List *rel_list) ...@@ -59,12 +59,12 @@ merge_rels_with_same_relids(List *rel_list)
* *
*/ */
static List * static List *
merge_rel_with_same_relids(RelOptInfo *rel, List *unjoined_rels) merge_rel_with_same_relids(RelOptInfo *rel, Relids unjoined_relids)
{ {
List *i = NIL; List *i = NIL;
List *result = NIL; List *result = NIL;
foreach(i, unjoined_rels) foreach(i, unjoined_relids)
{ {
RelOptInfo *unjoined_rel = (RelOptInfo *) lfirst(i); RelOptInfo *unjoined_rel = (RelOptInfo *) lfirst(i);
...@@ -105,49 +105,3 @@ rels_set_cheapest(List *rel_list) ...@@ -105,49 +105,3 @@ rels_set_cheapest(List *rel_list)
elog(ERROR, "non JoinPath called"); elog(ERROR, "non JoinPath called");
} }
} }
/*
* del_rels_all_bushy_inactive
* If all the joininfo's in a rel node are bushy_inactive,
* that means that this node has been joined into
* other nodes in all possible ways, therefore
* this node can be discarded. If not, it will cause
* extra complexity of the optimizer.
*
* old_rels is a list of rel nodes
*
* Returns a new list of rel nodes
*/
List *
del_rels_all_bushy_inactive(List *old_rels)
{
RelOptInfo *rel;
List *joininfo_list,
*xjoininfo,
*i,
*temp_list = NIL;
foreach(i, old_rels)
{
rel = (RelOptInfo *) lfirst(i);
joininfo_list = rel->joininfo;
if (joininfo_list == NIL)
temp_list = lcons(rel, temp_list);
else
{
foreach(xjoininfo, joininfo_list)
{
JoinInfo *joininfo = (JoinInfo *) lfirst(xjoininfo);
if (!joininfo->bushy_inactive)
{
temp_list = lcons(rel, temp_list);
break;
}
}
}
}
return temp_list;
}
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.27 1999/02/15 05:21:06 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/initsplan.c,v 1.28 1999/02/18 00:49:26 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -41,8 +41,8 @@ extern int Quiet; ...@@ -41,8 +41,8 @@ extern int Quiet;
static void add_restrict_and_join_to_rel(Query *root, List *clause); static void add_restrict_and_join_to_rel(Query *root, List *clause);
static void add_join_info_to_rels(Query *root, RestrictInfo *restrictinfo, static void add_join_info_to_rels(Query *root, RestrictInfo *restrictinfo,
List *join_relids); Relids join_relids);
static void add_vars_to_targetlist(Query *root, List *vars, List *join_relids); static void add_vars_to_targetlist(Query *root, List *vars, Relids join_relids);
static MergeOrder *mergejoinop(Expr *clause); static MergeOrder *mergejoinop(Expr *clause);
static Oid hashjoinop(Expr *clause); static Oid hashjoinop(Expr *clause);
...@@ -107,7 +107,7 @@ add_missing_vars_to_tlist(Query *root, List *tlist) ...@@ -107,7 +107,7 @@ add_missing_vars_to_tlist(Query *root, List *tlist)
foreach(l, root->rtable) foreach(l, root->rtable)
{ {
RangeTblEntry *rte = (RangeTblEntry *) lfirst(l); RangeTblEntry *rte = (RangeTblEntry *) lfirst(l);
List *relids; Relids relids;
RelOptInfo *result; RelOptInfo *result;
Var *var; Var *var;
...@@ -165,7 +165,7 @@ add_restrict_and_join_to_rels(Query *root, List *clauses) ...@@ -165,7 +165,7 @@ add_restrict_and_join_to_rels(Query *root, List *clauses)
static void static void
add_restrict_and_join_to_rel(Query *root, List *clause) add_restrict_and_join_to_rel(Query *root, List *clause)
{ {
List *relids; Relids relids;
List *vars; List *vars;
RestrictInfo *restrictinfo = makeNode(RestrictInfo); RestrictInfo *restrictinfo = makeNode(RestrictInfo);
...@@ -235,31 +235,31 @@ add_restrict_and_join_to_rel(Query *root, List *clause) ...@@ -235,31 +235,31 @@ add_restrict_and_join_to_rel(Query *root, List *clause)
* 'restrictinfo' describes the join clause * 'restrictinfo' describes the join clause
* 'join_relids' is the list of relations participating in the join clause * 'join_relids' is the list of relations participating in the join clause
* *
* Returns nothing.
*
*/ */
static void static void
add_join_info_to_rels(Query *root, RestrictInfo *restrictinfo, List *join_relids) add_join_info_to_rels(Query *root, RestrictInfo *restrictinfo,
Relids join_relids)
{ {
List *join_relid; List *join_relid;
/* For every relid, find the rel, and add the proper join entries */
foreach(join_relid, join_relids) foreach(join_relid, join_relids)
{ {
JoinInfo *joininfo; JoinInfo *joininfo;
List *unjoined_rels = NIL; Relids unjoined_relids = NIL;
List *rel; List *rel;
/* Get the relids not equal to the current relid */
foreach(rel, join_relids) foreach(rel, join_relids)
{ {
if (lfirsti(rel) != lfirsti(join_relid)) if (lfirsti(rel) != lfirsti(join_relid))
unjoined_rels = lappendi(unjoined_rels, lfirsti(rel)); unjoined_relids = lappendi(unjoined_relids, lfirsti(rel));
} }
joininfo = find_joininfo_node(get_base_rel(root, lfirsti(join_relid)), joininfo = find_joininfo_node(get_base_rel(root, lfirsti(join_relid)),
unjoined_rels); unjoined_relids);
joininfo->jinfo_restrictinfo = lcons(copyObject((void *) restrictinfo), joininfo->jinfo_restrictinfo = lcons(copyObject((void *) restrictinfo),
joininfo->jinfo_restrictinfo); joininfo->jinfo_restrictinfo);
} }
} }
...@@ -279,7 +279,7 @@ add_join_info_to_rels(Query *root, RestrictInfo *restrictinfo, List *join_relids ...@@ -279,7 +279,7 @@ add_join_info_to_rels(Query *root, RestrictInfo *restrictinfo, List *join_relids
* Returns nothing. * Returns nothing.
*/ */
static void static void
add_vars_to_targetlist(Query *root, List *vars, List *join_relids) add_vars_to_targetlist(Query *root, List *vars, Relids join_relids)
{ {
Var *var; Var *var;
List *temp = NIL; List *temp = NIL;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.29 1999/02/13 23:16:40 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.30 1999/02/18 00:49:32 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
#include "optimizer/planner.h" #include "optimizer/planner.h"
#include "optimizer/planmain.h" #include "optimizer/planmain.h"
static List *plan_inherit_query(List *relids, Index rt_index, static List *plan_inherit_query(Relids relids, Index rt_index,
RangeTblEntry *rt_entry, Query *parse, RangeTblEntry *rt_entry, Query *parse,
List **union_rtentriesPtr); List **union_rtentriesPtr);
static RangeTblEntry *new_rangetable_entry(Oid new_relid, static RangeTblEntry *new_rangetable_entry(Oid new_relid,
...@@ -248,7 +248,7 @@ plan_inherit_queries(Query *parse, Index rt_index) ...@@ -248,7 +248,7 @@ plan_inherit_queries(Query *parse, Index rt_index)
* in union_rtentries. * in union_rtentries.
*/ */
static List * static List *
plan_inherit_query(List *relids, plan_inherit_query(Relids relids,
Index rt_index, Index rt_index,
RangeTblEntry *rt_entry, RangeTblEntry *rt_entry,
Query *root, Query *root,
...@@ -301,8 +301,8 @@ plan_inherit_query(List *relids, ...@@ -301,8 +301,8 @@ plan_inherit_query(List *relids,
* lists. * lists.
*/ */
List * List *
find_all_inheritors(List *unexamined_relids, find_all_inheritors(Relids unexamined_relids,
List *examined_relids) Relids examined_relids)
{ {
List *new_inheritors = NIL; List *new_inheritors = NIL;
List *new_examined_relids = NIL; List *new_examined_relids = NIL;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.30 1999/02/14 22:24:25 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.31 1999/02/18 00:49:37 momjian Exp $
* *
* HISTORY * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -369,7 +369,7 @@ pull_constant_clauses(List *quals, List **constantQual) ...@@ -369,7 +369,7 @@ pull_constant_clauses(List *quals, List **constantQual)
* *
*/ */
void void
clause_get_relids_vars(Node *clause, List **relids, List **vars) clause_get_relids_vars(Node *clause, Relids *relids, List **vars)
{ {
List *clvars = pull_var_clause(clause); List *clvars = pull_var_clause(clause);
List *var_list = NIL; List *var_list = NIL;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/joininfo.c,v 1.17 1999/02/15 05:21:11 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/joininfo.c,v 1.18 1999/02/18 00:49:37 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -38,16 +38,16 @@ ...@@ -38,16 +38,16 @@
JoinInfo * JoinInfo *
joininfo_member(List *join_relids, List *joininfo_list) joininfo_member(List *join_relids, List *joininfo_list)
{ {
List *i = NIL; List *i;
List *other_rels = NIL;
foreach(i, joininfo_list) foreach(i, joininfo_list)
{ {
other_rels = lfirst(i); JoinInfo *joininfo = (JoinInfo *)lfirst(i);
if (same(join_relids, ((JoinInfo *) other_rels)->unjoined_rels))
return (JoinInfo *) other_rels; if (same(join_relids, joininfo->unjoined_relids))
return joininfo;
} }
return (JoinInfo *) NULL; return NULL;
} }
...@@ -62,7 +62,7 @@ joininfo_member(List *join_relids, List *joininfo_list) ...@@ -62,7 +62,7 @@ joininfo_member(List *join_relids, List *joininfo_list)
* *
*/ */
JoinInfo * JoinInfo *
find_joininfo_node(RelOptInfo *this_rel, List *join_relids) find_joininfo_node(RelOptInfo *this_rel, Relids join_relids)
{ {
JoinInfo *joininfo = joininfo_member(join_relids, JoinInfo *joininfo = joininfo_member(join_relids,
this_rel->joininfo); this_rel->joininfo);
...@@ -70,11 +70,10 @@ find_joininfo_node(RelOptInfo *this_rel, List *join_relids) ...@@ -70,11 +70,10 @@ find_joininfo_node(RelOptInfo *this_rel, List *join_relids)
if (joininfo == NULL) if (joininfo == NULL)
{ {
joininfo = makeNode(JoinInfo); joininfo = makeNode(JoinInfo);
joininfo->unjoined_rels = join_relids; joininfo->unjoined_relids = join_relids;
joininfo->jinfo_restrictinfo = NIL; joininfo->jinfo_restrictinfo = NIL;
joininfo->mergejoinable = false; joininfo->mergejoinable = false;
joininfo->hashjoinable = false; joininfo->hashjoinable = false;
joininfo->bushy_inactive = false;
this_rel->joininfo = lcons(joininfo, this_rel->joininfo); this_rel->joininfo = lcons(joininfo, this_rel->joininfo);
} }
return joininfo; return joininfo;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.36 1999/02/15 03:22:16 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/pathnode.c,v 1.37 1999/02/18 00:49:38 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -633,7 +633,7 @@ create_hashjoin_path(RelOptInfo *joinrel, ...@@ -633,7 +633,7 @@ create_hashjoin_path(RelOptInfo *joinrel,
pathnode->jpath.path.pathorder->ordtype = SORTOP_ORDER; pathnode->jpath.path.pathorder->ordtype = SORTOP_ORDER;
pathnode->jpath.path.pathorder->ord.sortop = NULL; pathnode->jpath.path.pathorder->ord.sortop = NULL;
pathnode->jpath.path.outerjoincost = (Cost) 0.0; pathnode->jpath.path.outerjoincost = (Cost) 0.0;
pathnode->jpath.path.joinid = (Relid) NULL; pathnode->jpath.path.joinid = (Relids) NULL;
/* pathnode->hashjoinoperator = operator; */ /* pathnode->hashjoinoperator = operator; */
pathnode->path_hashclauses = hashclauses; pathnode->path_hashclauses = hashclauses;
pathnode->outerhashkeys = outerkeys; pathnode->outerhashkeys = outerkeys;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/util/relnode.c,v 1.14 1999/02/15 03:22:17 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/optimizer/util/relnode.c,v 1.15 1999/02/18 00:49:38 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
RelOptInfo * RelOptInfo *
get_base_rel(Query *root, int relid) get_base_rel(Query *root, int relid)
{ {
List *relids; Relids relids;
RelOptInfo *rel; RelOptInfo *rel;
relids = lconsi(relid, NIL); relids = lconsi(relid, NIL);
...@@ -53,7 +53,6 @@ get_base_rel(Query *root, int relid) ...@@ -53,7 +53,6 @@ get_base_rel(Query *root, int relid)
rel->restrictinfo = NIL; rel->restrictinfo = NIL;
rel->joininfo = NIL; rel->joininfo = NIL;
rel->innerjoin = NIL; rel->innerjoin = NIL;
rel->superrels = NIL;
root->base_rel_list = lcons(rel, root->base_rel_list); root->base_rel_list = lcons(rel, root->base_rel_list);
...@@ -76,7 +75,6 @@ get_base_rel(Query *root, int relid) ...@@ -76,7 +75,6 @@ get_base_rel(Query *root, int relid)
bool hasindex; bool hasindex;
int pages, int pages,
tuples; tuples;
/* /*
* Otherwise, retrieve relation characteristics from the * Otherwise, retrieve relation characteristics from the
* system catalogs. * system catalogs.
...@@ -93,11 +91,10 @@ get_base_rel(Query *root, int relid) ...@@ -93,11 +91,10 @@ get_base_rel(Query *root, int relid)
/* /*
* get_join_rel * get_join_rel
* Returns relation entry corresponding to 'relid' (a list of relids), * Returns relation entry corresponding to 'relid' (a list of relids),
* creating a new one if necessary. This is for join relations. * or NULL.
*
*/ */
RelOptInfo * RelOptInfo *
get_join_rel(Query *root, List *relid) get_join_rel(Query *root, Relids relid)
{ {
return rel_member(relid, root->join_rel_list); return rel_member(relid, root->join_rel_list);
} }
...@@ -111,17 +108,17 @@ get_join_rel(Query *root, List *relid) ...@@ -111,17 +108,17 @@ get_join_rel(Query *root, List *relid)
* *
*/ */
RelOptInfo * RelOptInfo *
rel_member(List *relid, List *rels) rel_member(Relids relids, List *rels)
{ {
List *temp = NIL; List *temp = NIL;
List *temprelid = NIL; List *temprelid = NIL;
if (relid != NIL && rels != NIL) if (relids != NIL && rels != NIL)
{ {
foreach(temp, rels) foreach(temp, rels)
{ {
temprelid = ((RelOptInfo *) lfirst(temp))->relids; temprelid = ((RelOptInfo *) lfirst(temp))->relids;
if (same(temprelid, relid)) if (same(temprelid, relids))
return (RelOptInfo *) (lfirst(temp)); return (RelOptInfo *) (lfirst(temp));
} }
} }
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: relation.h,v 1.25 1999/02/15 05:21:12 momjian Exp $ * $Id: relation.h,v 1.26 1999/02/18 00:49:38 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -17,11 +17,11 @@ ...@@ -17,11 +17,11 @@
#include <nodes/primnodes.h> #include <nodes/primnodes.h>
/* /*
* Relid * Relids
* List of relation identifiers (indexes into the rangetable). * List of relation identifiers (indexes into the rangetable).
*/ */
typedef List *Relid; typedef List *Relids;
/* /*
* RelOptInfo * RelOptInfo
...@@ -72,7 +72,7 @@ typedef struct RelOptInfo ...@@ -72,7 +72,7 @@ typedef struct RelOptInfo
NodeTag type; NodeTag type;
/* all relations: */ /* all relations: */
Relid relids; Relids relids; /* integer list of base relids involved */
/* catalog statistics information */ /* catalog statistics information */
bool indexed; bool indexed;
...@@ -84,7 +84,7 @@ typedef struct RelOptInfo ...@@ -84,7 +84,7 @@ typedef struct RelOptInfo
/* materialization information */ /* materialization information */
List *targetlist; List *targetlist;
List *pathlist; /* Path structures */ List *pathlist; /* Path structures */
struct Path *cheapestpath; struct Path *cheapestpath;
bool pruneable; bool pruneable;
/* used solely by indices: */ /* used solely by indices: */
...@@ -100,7 +100,6 @@ typedef struct RelOptInfo ...@@ -100,7 +100,6 @@ typedef struct RelOptInfo
List *restrictinfo; /* RestrictInfo structures */ List *restrictinfo; /* RestrictInfo structures */
List *joininfo; /* JoinInfo structures */ List *joininfo; /* JoinInfo structures */
List *innerjoin; List *innerjoin;
List *superrels;
} RelOptInfo; } RelOptInfo;
extern Var *get_expr(TargetEntry *foo); extern Var *get_expr(TargetEntry *foo);
...@@ -148,7 +147,7 @@ typedef struct Path ...@@ -148,7 +147,7 @@ typedef struct Path
* indexes. * indexes.
*/ */
Cost outerjoincost; Cost outerjoincost;
Relid joinid; Relids joinid;
List *loc_restrictinfo; List *loc_restrictinfo;
} Path; } Path;
...@@ -221,7 +220,7 @@ typedef struct RestrictInfo ...@@ -221,7 +220,7 @@ typedef struct RestrictInfo
/* hashjoin only */ /* hashjoin only */
Oid hashjoinoperator; Oid hashjoinoperator;
Relid restrictinfojoinid; Relids restrictinfojoinid;
} RestrictInfo; } RestrictInfo;
typedef struct JoinMethod typedef struct JoinMethod
...@@ -246,11 +245,10 @@ typedef struct MergeInfo ...@@ -246,11 +245,10 @@ typedef struct MergeInfo
typedef struct JoinInfo typedef struct JoinInfo
{ {
NodeTag type; NodeTag type;
List *unjoined_rels; Relids unjoined_relids;
List *jinfo_restrictinfo; List *jinfo_restrictinfo;
bool mergejoinable; bool mergejoinable;
bool hashjoinable; bool hashjoinable;
bool bushy_inactive;
} JoinInfo; } JoinInfo;
typedef struct Iter typedef struct Iter
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: clauses.h,v 1.15 1999/02/13 23:21:42 momjian Exp $ * $Id: clauses.h,v 1.16 1999/02/18 00:49:46 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#define CLAUSES_H #define CLAUSES_H
#include <nodes/primnodes.h> #include <nodes/primnodes.h>
#include <nodes/relation.h>
extern Expr *make_clause(int type, Node *oper, List *args); extern Expr *make_clause(int type, Node *oper, List *args);
extern bool is_opclause(Node *clause); extern bool is_opclause(Node *clause);
...@@ -37,7 +38,7 @@ extern Expr *make_andclause(List *andclauses); ...@@ -37,7 +38,7 @@ extern Expr *make_andclause(List *andclauses);
extern bool case_clause(Node *clause); extern bool case_clause(Node *clause);
extern List *pull_constant_clauses(List *quals, List **constantQual); extern List *pull_constant_clauses(List *quals, List **constantQual);
extern void clause_get_relids_vars(Node *clause, List **relids, List **vars); extern void clause_get_relids_vars(Node *clause, Relids *relids, List **vars);
extern int NumRelids(Node *clause); extern int NumRelids(Node *clause);
extern bool contains_not(Node *clause); extern bool contains_not(Node *clause);
extern bool is_joinable(Node *clause); extern bool is_joinable(Node *clause);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: pathnode.h,v 1.14 1999/02/13 23:21:49 momjian Exp $ * $Id: pathnode.h,v 1.15 1999/02/18 00:49:46 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -42,9 +42,9 @@ extern HashPath *create_hashjoin_path(RelOptInfo *joinrel, int outersize, ...@@ -42,9 +42,9 @@ extern HashPath *create_hashjoin_path(RelOptInfo *joinrel, int outersize,
/* /*
* prototypes for rel.c * prototypes for rel.c
*/ */
extern RelOptInfo *rel_member(List *relid, List *rels); extern RelOptInfo *rel_member(Relids relid, List *rels);
extern RelOptInfo *get_base_rel(Query *root, int relid); extern RelOptInfo *get_base_rel(Query *root, int relid);
extern RelOptInfo *get_join_rel(Query *root, List *relid); extern RelOptInfo *get_join_rel(Query *root, Relids relid);
/* /*
* prototypes for indexnode.h * prototypes for indexnode.h
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: paths.h,v 1.20 1999/02/16 00:41:03 momjian Exp $ * $Id: paths.h,v 1.21 1999/02/18 00:49:47 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -78,9 +78,8 @@ extern MergeInfo *match_order_mergeinfo(PathOrder *ordering, ...@@ -78,9 +78,8 @@ extern MergeInfo *match_order_mergeinfo(PathOrder *ordering,
* routines to determine which relations to join * routines to determine which relations to join
*/ */
extern List *make_rels_by_joins(Query *root, List *outer_rels); extern List *make_rels_by_joins(Query *root, List *outer_rels);
extern void add_rel_to_rel_joininfos(Query *root, List *joinrels, List *outerrels);
extern List *make_rels_by_clause_joins(Query *root, RelOptInfo *outer_rel, extern List *make_rels_by_clause_joins(Query *root, RelOptInfo *outer_rel,
List *joininfo_list, List *only_relids); List *joininfo_list, Relids only_relids);
extern List *make_rels_by_clauseless_joins(RelOptInfo *outer_rel, extern List *make_rels_by_clauseless_joins(RelOptInfo *outer_rel,
List *inner_rels); List *inner_rels);
extern RelOptInfo *make_join_rel(RelOptInfo *outer_rel, RelOptInfo *inner_rel, JoinInfo *joininfo); extern RelOptInfo *make_join_rel(RelOptInfo *outer_rel, RelOptInfo *inner_rel, JoinInfo *joininfo);
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * Copyright (c) 1994, Regents of the University of California
* *
* $Id: xfunc.h,v 1.15 1999/02/13 23:21:54 momjian Exp $ * $Id: xfunc.h,v 1.16 1999/02/18 00:49:48 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -62,8 +62,8 @@ extern Cost xfunc_func_expense(Expr *node, List *args); ...@@ -62,8 +62,8 @@ extern Cost xfunc_func_expense(Expr *node, List *args);
extern int xfunc_width(Expr *clause); extern int xfunc_width(Expr *clause);
/* static, moved to xfunc.c */ /* static, moved to xfunc.c */
/* extern int xfunc_card_unreferenced(Expr *clause, Relid referenced); */ /* extern int xfunc_card_unreferenced(Expr *clause, Relids referenced); */
extern int xfunc_card_product(Relid relids); extern int xfunc_card_product(Relids relids);
extern List *xfunc_find_references(List *clause); extern List *xfunc_find_references(List *clause);
extern List *xfunc_primary_join(JoinPath *pathnode); extern List *xfunc_primary_join(JoinPath *pathnode);
extern Cost xfunc_get_path_cost(Path *pathnode); extern Cost xfunc_get_path_cost(Path *pathnode);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment