Michael Fuhr <[EMAIL PROTECTED]> writes:
> Tom Lane says he's found the problem; I expect he'll be committing
> a fix shortly.

The attached patch allows it to generate the expected plan, at least
in the test case I tried.

                        regards, tom lane

*** src/backend/optimizer/path/indxpath.c.orig  Sun Aug 28 18:47:20 2005
--- src/backend/optimizer/path/indxpath.c       Thu Sep 22 19:17:41 2005
***************
*** 955,969 ****
        /*
         * Examine each joinclause in the joininfo list to see if it matches any
         * key of any index.  If so, add the clause's other rels to the result.
-        * (Note: we consider only actual participants, not extraneous rels
-        * possibly mentioned in required_relids.)
         */
        foreach(l, rel->joininfo)
        {
                RestrictInfo *joininfo = (RestrictInfo *) lfirst(l);
                Relids  other_rels;
  
!               other_rels = bms_difference(joininfo->clause_relids, 
rel->relids);
                if (matches_any_index(joininfo, rel, other_rels))
                        outer_relids = bms_join(outer_relids, other_rels);
                else
--- 955,967 ----
        /*
         * Examine each joinclause in the joininfo list to see if it matches any
         * key of any index.  If so, add the clause's other rels to the result.
         */
        foreach(l, rel->joininfo)
        {
                RestrictInfo *joininfo = (RestrictInfo *) lfirst(l);
                Relids  other_rels;
  
!               other_rels = bms_difference(joininfo->required_relids, 
rel->relids);
                if (matches_any_index(joininfo, rel, other_rels))
                        outer_relids = bms_join(outer_relids, other_rels);
                else

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Reply via email to