• Tom Lane's avatar
    Fix thinko in previous patch for optimizing EXISTS-within-EXISTS. · cd1f0d04
    Tom Lane authored
    When recursing after an optimization in pull_up_sublinks_qual_recurse, the
    available_rels value passed down must include only the relations that are
    in the righthand side of the new SEMI or ANTI join; it's incorrect to pull
    up a sub-select that refers to other relations, as seen in the added test
    case.  Per report from BangarRaju Vadapalli.
    
    While at it, rethink the idea of recursing below a NOT EXISTS.  That is
    essentially the same situation as pulling up ANY/EXISTS sub-selects that
    are in the ON clause of an outer join, and it has the same disadvantage:
    we'd force the two joins to be evaluated according to the syntactic nesting
    order, because the lower join will most likely not be able to commute with
    the ANTI join.  That could result in having to form a rather large join
    product, whereas the handling of a correlated subselect is not quite that
    dumb.  So until we can handle those cases better, #ifdef NOT_USED that
    case.  (I think it's okay to pull up in the EXISTS/ANY cases, because SEMI
    joins aren't so inflexible about ordering.)
    
    Back-patch to 8.4, same as for previous patch in this area.  Fortunately
    that patch hadn't made it into any shipped releases yet.
    cd1f0d04
subselect.out 14.4 KB