diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index 6e04c9c74aa5f5679d96caf567f3ac7a63b5d4b8..b9ccc770a431c923b1fe4e510bb7de9ebc1bc215 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.149 2003/11/29 19:51:50 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/path/indxpath.c,v 1.150 2003/12/18 00:22:12 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -600,14 +600,43 @@ group_clauses_by_indexkey_for_join(Query *root, { Oid curClass = classes[0]; FastList clausegroup; + int numsources; List *i; FastListInit(&clausegroup); + /* + * We can always use plain restriction clauses for the rel. We scan + * these first because we want them first in the clausegroup list + * for the convenience of remove_redundant_join_clauses, which can + * never remove non-join clauses and hence won't be able to get rid + * of a non-join clause if it appears after a join clause it is + * redundant with. + */ + foreach(i, rel->baserestrictinfo) + { + RestrictInfo *rinfo = (RestrictInfo *) lfirst(i); + + /* Can't use pushed-down clauses in outer join */ + if (isouterjoin && rinfo->ispusheddown) + continue; + + if (match_clause_to_indexcol(rel, + index, + indexcol, + curClass, + rinfo->clause)) + FastAppend(&clausegroup, rinfo); + } + + /* found anything in base restrict list? */ + numsources = (FastListValue(&clausegroup) != NIL) ? 1 : 0; + /* Look for joinclauses that are usable with given outer_relids */ foreach(i, rel->joininfo) { JoinInfo *joininfo = (JoinInfo *) lfirst(i); + bool jfoundhere = false; List *j; if (!bms_is_subset(joininfo->unjoined_relids, outer_relids)) @@ -628,20 +657,21 @@ group_clauses_by_indexkey_for_join(Query *root, rinfo->clause)) { FastAppend(&clausegroup, rinfo); - jfound = true; + if (!jfoundhere) + { + jfoundhere = true; + jfound = true; + numsources++; + } } } } /* - * If we found join clauses in more than one joininfo list, we may - * now have clauses that are known redundant. Get rid of 'em. - * (There is no point in looking at restriction clauses, because - * remove_redundant_join_clauses will never think they are - * redundant, so we do this before adding restriction clauses to - * the clause group.) + * If we found clauses in more than one list, we may now have clauses + * that are known redundant. Get rid of 'em. */ - if (FastListValue(&clausegroup) != NIL) + if (numsources > 1) { List *nl; @@ -651,23 +681,6 @@ group_clauses_by_indexkey_for_join(Query *root, FastListFromList(&clausegroup, nl); } - /* We can also use plain restriction clauses for the rel */ - foreach(i, rel->baserestrictinfo) - { - RestrictInfo *rinfo = (RestrictInfo *) lfirst(i); - - /* Can't use pushed-down clauses in outer join */ - if (isouterjoin && rinfo->ispusheddown) - continue; - - if (match_clause_to_indexcol(rel, - index, - indexcol, - curClass, - rinfo->clause)) - FastAppend(&clausegroup, rinfo); - } - /* * If no clauses match this key, we're done; we don't want to look * at keys to its right.