Thanks for help!
This is patch for src/backend/optimizer/path/prune.c.
Access pathes of pruned joinrels were not merged and better
pathes were lost, sometimes...
Vadim
*** prune.c.orig Thu Apr 2 14:56:54 1998
--- prune.c Thu Apr 2 15:16:17 1998
***************
*** 61,99 ****
static List *
prune_joinrel(Rel *rel, List *other_rels)
{
! List *cur = NIL;
! List *return_list = NIL;
! /* find first relation that doesn't match */
! foreach(cur, other_rels)
{
! Rel *other_rel = (Rel *) lfirst(cur);
!
! if (!same(rel->relids, other_rel->relids))
! break;
! }
!
! /* we now know cur doesn't match, or is NIL */
! return_list = cur;
!
! /*
! * remove relations that do match, we use lnext so we can remove
! * easily
! */
! while (cur != NIL && lnext(cur) != NIL)
! {
! Rel *other_rel = (Rel *) lfirst(lnext(cur));
!
if (same(rel->relids, other_rel->relids))
{
rel->pathlist = add_pathlist(rel,
rel->pathlist,
other_rel->pathlist);
- lnext(cur) = lnext(lnext(cur)); /* delete it */
}
! cur = lnext(cur);
}
! return return_list;
}
/*
--- 61,85 ----
static List *
prune_joinrel(Rel *rel, List *other_rels)
{
! List *i = NIL;
! List *result = NIL;
! foreach(i, other_rels)
{
! Rel *other_rel = (Rel *) lfirst(i);
!
if (same(rel->relids, other_rel->relids))
{
rel->pathlist = add_pathlist(rel,
rel->pathlist,
other_rel->pathlist);
}
! else
! {
! result = nconc(result, lcons(other_rel, NIL));
! }
}
! return (result);
}
/*