aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/path/hashutils.c32
-rw-r--r--src/backend/optimizer/path/joinpath.c16
-rw-r--r--src/backend/optimizer/path/mergeutils.c20
-rw-r--r--src/include/optimizer/paths.h8
4 files changed, 35 insertions, 41 deletions
diff --git a/src/backend/optimizer/path/hashutils.c b/src/backend/optimizer/path/hashutils.c
index 78441f041a1..f67e4eb8eca 100644
--- a/src/backend/optimizer/path/hashutils.c
+++ b/src/backend/optimizer/path/hashutils.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/hashutils.c,v 1.14 1999/02/22 05:26:18 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/hashutils.c,v 1.15 1999/04/03 00:18:27 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -29,19 +29,20 @@ static HashInfo *match_hashop_hashinfo(Oid hashop, List *hashinfo_list);
* hash operator.
*
* 'restrictinfo_list' is the list of restrictinfo nodes
- * 'inner_relid' is the relid of the inner join relation
+ * 'inner_relids' is the list of relids in the inner join relation
+ * (used to determine whether a join var is inner or outer)
*
* Returns the new list of hashinfo nodes.
*
*/
List *
group_clauses_by_hashop(List *restrictinfo_list,
- int inner_relid)
+ Relids inner_relids)
{
List *hashinfo_list = NIL;
- RestrictInfo *restrictinfo = (RestrictInfo *) NULL;
- List *i = NIL;
- Oid hashjoinop = 0;
+ RestrictInfo *restrictinfo;
+ List *i;
+ Oid hashjoinop;
foreach(i, restrictinfo_list)
{
@@ -54,23 +55,21 @@ group_clauses_by_hashop(List *restrictinfo_list,
*/
if (hashjoinop)
{
- HashInfo *xhashinfo = (HashInfo *) NULL;
Expr *clause = restrictinfo->clause;
Var *leftop = get_leftop(clause);
Var *rightop = get_rightop(clause);
- JoinKey *joinkey = (JoinKey *) NULL;
+ HashInfo *xhashinfo;
+ JoinKey *joinkey;
xhashinfo = match_hashop_hashinfo(hashjoinop, hashinfo_list);
-
- if (inner_relid == leftop->varno)
+ joinkey = makeNode(JoinKey);
+ if (intMember(leftop->varno, inner_relids))
{
- joinkey = makeNode(JoinKey);
joinkey->outer = rightop;
joinkey->inner = leftop;
}
else
{
- joinkey = makeNode(JoinKey);
joinkey->outer = leftop;
joinkey->inner = rightop;
}
@@ -79,16 +78,15 @@ group_clauses_by_hashop(List *restrictinfo_list,
{
xhashinfo = makeNode(HashInfo);
xhashinfo->hashop = hashjoinop;
-
xhashinfo->jmethod.jmkeys = NIL;
xhashinfo->jmethod.clauses = NIL;
-
hashinfo_list = lcons(xhashinfo, hashinfo_list);
}
- xhashinfo->jmethod.clauses = lcons(clause, xhashinfo->jmethod.clauses);
-
- xhashinfo->jmethod.jmkeys = lcons(joinkey, xhashinfo->jmethod.jmkeys);
+ xhashinfo->jmethod.clauses = lcons(clause,
+ xhashinfo->jmethod.clauses);
+ xhashinfo->jmethod.jmkeys = lcons(joinkey,
+ xhashinfo->jmethod.jmkeys);
}
}
return hashinfo_list;
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c
index 47668a69b81..5edfed65b0e 100644
--- a/src/backend/optimizer/path/joinpath.c
+++ b/src/backend/optimizer/path/joinpath.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.32 1999/02/22 05:26:20 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/joinpath.c,v 1.33 1999/04/03 00:18:28 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -97,11 +97,11 @@ update_rels_pathlist_for_joins(Query *root, List *joinrels)
if (_enable_mergejoin_)
mergeinfo_list = group_clauses_by_order(joinrel->restrictinfo,
- lfirsti(innerrel->relids));
+ innerrel->relids);
if (_enable_hashjoin_)
hashinfo_list = group_clauses_by_hashop(joinrel->restrictinfo,
- lfirsti(innerrel->relids));
+ innerrel->relids);
/* need to flatten the relids list */
joinrel->relids = nconc(listCopy(outerrelids),
@@ -173,12 +173,10 @@ best_innerjoin(List *join_paths, Relids outer_relids)
{
Path *path = (Path *) lfirst(join_path);
- if (intMember(lfirsti(path->joinid), outer_relids)
- && ((cheapest == NULL ||
- path_is_cheaper((Path *) lfirst(join_path), cheapest))))
- {
- cheapest = (Path *) lfirst(join_path);
- }
+ if (intMember(lfirsti(path->joinid), outer_relids) &&
+ (cheapest == NULL ||
+ path_is_cheaper(path, cheapest)))
+ cheapest = path;
}
return cheapest;
}
diff --git a/src/backend/optimizer/path/mergeutils.c b/src/backend/optimizer/path/mergeutils.c
index 5f5a11bc787..a5bc8d96980 100644
--- a/src/backend/optimizer/path/mergeutils.c
+++ b/src/backend/optimizer/path/mergeutils.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/mergeutils.c,v 1.20 1999/03/01 00:10:32 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/optimizer/path/Attic/mergeutils.c,v 1.21 1999/04/03 00:18:28 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -36,14 +36,15 @@
* Something to fix next time...
*
* 'restrictinfo_list' is the list of restrictinfo nodes
- * 'inner_relid' is the relid of the inner join relation
+ * 'inner_relids' is the list of relids in the inner join relation
+ * (used to determine whether a join var is inner or outer)
*
* Returns the new list of mergeinfo nodes.
*
*/
List *
group_clauses_by_order(List *restrictinfo_list,
- int inner_relid)
+ Relids inner_relids)
{
List *mergeinfo_list = NIL;
List *xrestrictinfo;
@@ -59,26 +60,25 @@ group_clauses_by_order(List *restrictinfo_list,
* Create a new mergeinfo node and add it to 'mergeinfo_list'
* if one does not yet exist for this merge ordering.
*/
- PathOrder *pathorder;
- MergeInfo *xmergeinfo;
Expr *clause = restrictinfo->clause;
Var *leftop = get_leftop(clause);
Var *rightop = get_rightop(clause);
+ PathOrder *pathorder;
+ MergeInfo *xmergeinfo;
JoinKey *jmkeys;
pathorder = makeNode(PathOrder);
pathorder->ordtype = MERGE_ORDER;
pathorder->ord.merge = merge_ordering;
xmergeinfo = match_order_mergeinfo(pathorder, mergeinfo_list);
- if (inner_relid == leftop->varno)
+ jmkeys = makeNode(JoinKey);
+ if (intMember(leftop->varno, inner_relids))
{
- jmkeys = makeNode(JoinKey);
jmkeys->outer = rightop;
jmkeys->inner = leftop;
}
else
{
- jmkeys = makeNode(JoinKey);
jmkeys->outer = leftop;
jmkeys->inner = rightop;
}
@@ -86,10 +86,8 @@ group_clauses_by_order(List *restrictinfo_list,
if (xmergeinfo == NULL)
{
xmergeinfo = makeNode(MergeInfo);
-
xmergeinfo->m_ordering = merge_ordering;
- mergeinfo_list = lcons(xmergeinfo,
- mergeinfo_list);
+ mergeinfo_list = lcons(xmergeinfo, mergeinfo_list);
}
xmergeinfo->jmethod.clauses = lcons(clause,
diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h
index dfd2dfa7871..603efd7e52c 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.26 1999/02/22 05:26:52 momjian Exp $
+ * $Id: paths.h,v 1.27 1999/04/03 00:18:26 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -48,7 +48,7 @@ extern List *create_or_index_paths(Query *root, RelOptInfo *rel, List *clauses);
* routines to deal with hash keys and clauses
*/
extern List *group_clauses_by_hashop(List *restrictinfo_list,
- int inner_relid);
+ Relids inner_relids);
/*
* joinutils.h
@@ -70,9 +70,9 @@ extern List *new_join_pathkeys(List *outer_pathkeys,
* routines to deal with merge keys and clauses
*/
extern List *group_clauses_by_order(List *restrictinfo_list,
- int inner_relid);
+ Relids inner_relids);
extern MergeInfo *match_order_mergeinfo(PathOrder *ordering,
- List *mergeinfo_list);
+ List *mergeinfo_list);
/*
* joinrels.h