• Tom Lane's avatar
    Prevent overly-aggressive collapsing of joins to RTE_RESULT relations. · 6ea364e7
    Tom Lane authored
    The RTE_RESULT simplification logic added by commit 4be058fe had a
    flaw: it would collapse out a RTE_RESULT that is due to compute a
    PlaceHolderVar, and reassign the PHV to the parent join level, even if
    another input relation of the join contained a lateral reference to
    the PHV.  That can't work because the PHV would be computed too late.
    In practice it led to failures of internal sanity checks later in
    planning (either assertion failures or errors such as "failed to
    construct the join relation").
    
    To fix, add code to check for the presence of such PHVs in relevant
    portions of the query tree.  Notably, this required refactoring
    range_table_walker so that a caller could ask to walk individual RTEs
    not the whole list.  (It might be a good idea to refactor
    range_table_mutator in the same way, if only to keep those functions
    looking similar; but I didn't do so here as it wasn't necessary for
    the bug fix.)
    
    This exercise also taught me that find_dependent_phvs(), as it stood,
    could only safely be used on the entire Query, not on subtrees.
    Adjust its API to reflect that; which in passing allows it to have
    a fast path for the common case of no PHVs anywhere.
    
    Per report from Will Leinweber.  Back-patch to v12 where the bug
    was introduced.
    
    Discussion: https://postgr.es/m/CALLb-4xJMd4GZt2YCecMC95H-PafuWNKcmps4HLRx2NHNBfB4g@mail.gmail.com
    6ea364e7
join.sql 61.6 KB