From d977ff7b52e6952da38619977fff1bab565a0653 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Thu, 18 Feb 1999 04:45:36 +0000 Subject: [PATCH] more optimizer cleanups --- src/backend/optimizer/path/joinrels.c | 84 +++++++++++---------------- src/include/optimizer/paths.h | 10 ++-- 2 files changed, 40 insertions(+), 54 deletions(-) diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c index df74130cfc..195e72a052 100644 --- a/src/backend/optimizer/path/joinrels.c +++ b/src/backend/optimizer/path/joinrels.c @@ -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; diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index f49d018255..ca84268b1d 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -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); /*