diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index 600facb578d00e56aaa9f9b4f91f764ce7fd8b34..9df13765f4c711e85ae874307120100719eb0efd 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -16,7 +16,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.63 2009/02/25 03:30:37 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/optimizer/prep/prepjointree.c,v 1.64 2009/02/27 23:30:29 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -220,6 +220,15 @@ pull_up_sublinks_jointree_recurse(PlannerInfo *root, Node *jtnode, * The point of the available_rels machinations is to ensure that we * only pull up quals for which that's okay. * + * XXX for the moment, we refrain from pulling up IN/EXISTS clauses + * appearing in LEFT or RIGHT join conditions. Although it is + * semantically valid to do so under the above conditions, we end up + * with a query in which the semijoin or antijoin must be evaluated + * below the outer join, which could perform far worse than leaving + * it as a sublink that is executed only for row pairs that meet the + * other join conditions. Fixing this seems to require considerable + * restructuring of the executor, but maybe someday it can happen. + * * We don't expect to see any pre-existing JOIN_SEMI or JOIN_ANTI * nodes here. */ @@ -232,17 +241,21 @@ pull_up_sublinks_jointree_recurse(PlannerInfo *root, Node *jtnode, &jtlink); break; case JOIN_LEFT: +#ifdef NOT_USED /* see XXX comment above */ j->quals = pull_up_sublinks_qual_recurse(root, j->quals, rightrelids, &j->rarg); +#endif break; case JOIN_FULL: /* can't do anything with full-join quals */ break; case JOIN_RIGHT: +#ifdef NOT_USED /* see XXX comment above */ j->quals = pull_up_sublinks_qual_recurse(root, j->quals, leftrelids, &j->larg); +#endif break; default: elog(ERROR, "unrecognized join type: %d",