• Tom Lane's avatar
    Be more careful about the shape of hashable subplan clauses. · 1e7629d2
    Tom Lane authored
    nodeSubplan.c expects that the testexpr for a hashable ANY SubPlan
    has the form of one or more OpExprs whose LHS is an expression of the
    outer query's, while the RHS is an expression over Params representing
    output columns of the subquery.  However, the planner only went as far
    as verifying that the clauses were all binary OpExprs.  This works
    99.99% of the time, because the clauses have the right shape when
    emitted by the parser --- but it's possible for function inlining to
    break that, as reported by PegoraroF10.  To fix, teach the planner
    to check that the LHS and RHS contain the right things, or more
    accurately don't contain the wrong things.  Given that this has been
    broken for years without anyone noticing, it seems sufficient to just
    give up hashing when it happens, rather than go to the trouble of
    commuting the clauses back again (which wouldn't necessarily work
    anyway).
    
    While poking at that, I also noticed that nodeSubplan.c had a baked-in
    assumption that the number of hash clauses is identical to the number
    of subquery output columns.  Again, that's fine as far as parser output
    goes, but it's not hard to break it via function inlining.  There seems
    little reason for that assumption though --- AFAICS, the only thing
    it's buying us is not having to store the number of hash clauses
    explicitly.  Adding code to the planner to reject such cases would take
    more code than getting nodeSubplan.c to cope, so I fixed it that way.
    
    This has been broken for as long as we've had hashable SubPlans,
    so back-patch to all supported branches.
    
    Discussion: https://postgr.es/m/1549209182255-0.post@n3.nabble.com
    1e7629d2
nodeSubplan.c 41.3 KB