• Tom Lane's avatar
    Compute correct em_nullable_relids in get_eclass_for_sort_expr(). · f3b3b8d5
    Tom Lane authored
    Bug #8591 from Claudio Freire demonstrates that get_eclass_for_sort_expr
    must be able to compute valid em_nullable_relids for any new equivalence
    class members it creates.  I'd worried about this in the commit message
    for db9f0e1d, but claimed that it wasn't a
    problem because multi-member ECs should already exist when it runs.  That
    is transparently wrong, though, because this function is also called by
    initialize_mergeclause_eclasses, which runs during deconstruct_jointree.
    The example given in the bug report (which the new regression test item
    is based upon) fails because the COALESCE() expression is first seen by
    initialize_mergeclause_eclasses rather than process_equivalence.
    
    Fixing this requires passing the appropriate nullable_relids set to
    get_eclass_for_sort_expr, and it requires new code to compute that set
    for top-level expressions such as ORDER BY, GROUP BY, etc.  We store
    the top-level nullable_relids in a new field in PlannerInfo to avoid
    computing it many times.  In the back branches, I've added the new
    field at the end of the struct to minimize ABI breakage for planner
    plugins.  There doesn't seem to be a good alternative to changing
    get_eclass_for_sort_expr's API signature, though.  There probably aren't
    any third-party extensions calling that function directly; moreover,
    if there are, they probably need to think about what to pass for
    nullable_relids anyway.
    
    Back-patch to 9.2, like the previous patch in this area.
    f3b3b8d5
join.sql 31 KB