more optimizer cleanups

This commit is contained in:
Bruce Momjian 1999-02-18 04:45:36 +00:00
parent 63393bdf90
commit d977ff7b52
2 changed files with 40 additions and 54 deletions

View File

@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinrels.c,v 1.27 1999/02/18 00:49:20 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinrels.c,v 1.28 1999/02/18 04:45:36 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -46,37 +46,35 @@ static void set_joinrel_size(RelOptInfo *joinrel, RelOptInfo *outer_rel,
* of these exist for a given relation, all remaining possibilities are
* considered.
*
* 'outer_rels' is the list of rel nodes
*
* Returns a list of rel nodes corresponding to the new join relations.
*/
List *
make_rels_by_joins(Query *root, List *outer_rels)
make_rels_by_joins(Query *root, List *old_rels)
{
List *joins = NIL;
List *joined_rels = NIL;
List *join_list = NIL;
List *r = NIL;
foreach(r, outer_rels)
foreach(r, old_rels)
{
RelOptInfo *outer_rel = (RelOptInfo *) lfirst(r);
RelOptInfo *old_rel = (RelOptInfo *) lfirst(r);
if (!(joins = make_rels_by_clause_joins(root, outer_rel,
outer_rel->joininfo,
if (!(joined_rels = make_rels_by_clause_joins(root, old_rel,
old_rel->joininfo,
NIL)))
{
/*
* Oops, we have a relation that is not joined to any other
* relation. Cartesian product time.
*/
if (!BushyPlanFlag)
joins = make_rels_by_clauseless_joins(outer_rel,
root->base_rel_list);
else
joins = make_rels_by_clauseless_joins(outer_rel, outer_rels);
joined_rels = make_rels_by_clauseless_joins(old_rel,
root->base_rel_list);
if (BushyPlanFlag)
joined_rels = make_rels_by_clauseless_joins(old_rel,
old_rels);
}
join_list = nconc(join_list, joins);
join_list = nconc(join_list, joined_rels);
}
return join_list;
@ -98,7 +96,7 @@ make_rels_by_joins(Query *root, List *outer_rels)
* Returns a list of new join relations.
*/
List *
make_rels_by_clause_joins(Query *root, RelOptInfo *outer_rel,
make_rels_by_clause_joins(Query *root, RelOptInfo *old_rel,
List *joininfo_list, Relids only_relids)
{
List *join_list = NIL;
@ -107,7 +105,7 @@ make_rels_by_clause_joins(Query *root, RelOptInfo *outer_rel,
foreach(i, joininfo_list)
{
JoinInfo *joininfo = (JoinInfo *) lfirst(i);
RelOptInfo *rel;
RelOptInfo *joined_rel;
Relids unjoined_relids = joininfo->unjoined_relids;
if (unjoined_relids != NIL)
@ -117,20 +115,21 @@ make_rels_by_clause_joins(Query *root, RelOptInfo *outer_rel,
/* geqo only wants certain relids to make new rels */
intMember(lfirsti(unjoined_relids), only_relids)))
{
rel = make_join_rel(outer_rel,
get_base_rel(root, lfirsti(unjoined_relids)),
joined_rel = make_join_rel(old_rel,
get_base_rel(root,
lfirsti(unjoined_relids)),
joininfo);
join_list = lappend(join_list, rel);
join_list = lappend(join_list, joined_rel);
/* Right-sided plan */
if (_use_right_sided_plans_ &&
length(outer_rel->relids) > 1)
length(old_rel->relids) > 1)
{
rel = make_join_rel(
joined_rel = make_join_rel(
get_base_rel(root, lfirsti(unjoined_relids)),
outer_rel,
joininfo);
join_list = lappend(join_list, rel);
old_rel,
joininfo);
join_list = lappend(join_list, joined_rel);
}
}
@ -144,22 +143,12 @@ make_rels_by_clause_joins(Query *root, RelOptInfo *outer_rel,
Assert(length(join_rel->relids) > 1);
if (is_subset(unjoined_relids, join_rel->relids) &&
nonoverlap_sets(outer_rel->relids, join_rel->relids))
nonoverlap_sets(old_rel->relids, join_rel->relids))
{
rel = make_join_rel(outer_rel,
join_rel,
joininfo);
join_list = lappend(join_list, rel);
/* Right-sided plan */
if (_use_right_sided_plans_ &&
length(outer_rel->relids) > 1)
{
rel = make_join_rel(join_rel,
outer_rel,
joininfo);
join_list = lappend(join_list, rel);
}
joined_rel = make_join_rel(old_rel,
join_rel,
joininfo);
join_list = lappend(join_list, joined_rel);
}
}
}
@ -178,7 +167,7 @@ make_rels_by_clause_joins(Query *root, RelOptInfo *outer_rel,
* Returns a list of new join relations.
*/
List *
make_rels_by_clauseless_joins(RelOptInfo *outer_rel, List *inner_rels)
make_rels_by_clauseless_joins(RelOptInfo *old_rel, List *inner_rels)
{
RelOptInfo *inner_rel;
List *t_list = NIL;
@ -187,10 +176,10 @@ make_rels_by_clauseless_joins(RelOptInfo *outer_rel, List *inner_rels)
foreach(i, inner_rels)
{
inner_rel = (RelOptInfo *) lfirst(i);
if (nonoverlap_sets(inner_rel->relids, outer_rel->relids))
if (nonoverlap_sets(inner_rel->relids, old_rel->relids))
{
t_list = lappend(t_list,
make_join_rel(outer_rel,
make_join_rel(old_rel,
inner_rel,
(JoinInfo *) NULL));
}
@ -223,11 +212,9 @@ make_join_rel(RelOptInfo *outer_rel, RelOptInfo *inner_rel, JoinInfo *joininfo)
* of the outer and inner join relations and then merging the results
* together.
*/
new_outer_tlist = new_join_tlist(outer_rel->targetlist, /* XXX 1-based attnos */
inner_rel->relids, 1);
new_inner_tlist = new_join_tlist(inner_rel->targetlist, /* XXX 1-based attnos */
outer_rel->relids,
length(new_outer_tlist) + 1);
new_outer_tlist = new_join_tlist(outer_rel->targetlist, 1);
new_inner_tlist = new_join_tlist(inner_rel->targetlist,
length(new_outer_tlist) + 1);
joinrel->relids = NIL;
joinrel->indexed = false;
@ -286,7 +273,6 @@ make_join_rel(RelOptInfo *outer_rel, RelOptInfo *inner_rel, JoinInfo *joininfo)
*/
List *
new_join_tlist(List *tlist,
Relids other_relids,
int first_resdomno)
{
int resdomno = first_resdomno - 1;

View File

@ -7,7 +7,7 @@
*
* Copyright (c) 1994, Regents of the University of California
*
* $Id: paths.h,v 1.21 1999/02/18 00:49:47 momjian Exp $
* $Id: paths.h,v 1.22 1999/02/18 04:45:36 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@ -77,13 +77,13 @@ extern MergeInfo *match_order_mergeinfo(PathOrder *ordering,
* joinrels.h
* routines to determine which relations to join
*/
extern List *make_rels_by_joins(Query *root, List *outer_rels);
extern List *make_rels_by_clause_joins(Query *root, RelOptInfo *outer_rel,
extern List *make_rels_by_joins(Query *root, List *old_rels);
extern List *make_rels_by_clause_joins(Query *root, RelOptInfo *old_rel,
List *joininfo_list, Relids only_relids);
extern List *make_rels_by_clauseless_joins(RelOptInfo *outer_rel,
extern List *make_rels_by_clauseless_joins(RelOptInfo *old_rel,
List *inner_rels);
extern RelOptInfo *make_join_rel(RelOptInfo *outer_rel, RelOptInfo *inner_rel, JoinInfo *joininfo);
extern List *new_join_tlist(List *tlist, List *other_relids,int first_resdomno);
extern List *new_join_tlist(List *tlist, int first_resdomno);
extern RelOptInfo *get_cheapest_complete_rel(List *join_rel_list);
/*