• Tom Lane's avatar
    Propagate lateral-reference information to indirect descendant relations. · bdd9a99a
    Tom Lane authored
    create_lateral_join_info() computes a bunch of information about lateral
    references between base relations, and then attempts to propagate those
    markings to appendrel children of the original base relations.  But the
    original coding neglected the possibility of indirect descendants
    (grandchildren etc).  During v11 development we noticed that this was
    wrong for partitioned-table cases, but failed to realize that it was just
    as wrong for any appendrel.  While the case can't arise for appendrels
    derived from traditional table inheritance (because we make a flat
    appendrel for that), nested appendrels can arise from nested UNION ALL
    subqueries.  Failure to mark the lower-level relations as having lateral
    references leads to confusion in add_paths_to_append_rel about whether
    unparameterized paths can be built.  It's not very clear whether that
    leads to any user-visible misbehavior; the lack of field reports suggests
    that it may cause nothing worse than minor cost misestimation.  Still,
    it's a bug, and it leads to failures of Asserts that I intend to add
    later.
    
    To fix, we need to propagate information from all appendrel parents,
    not just those that are RELOPT_BASERELs.  We can still do it in one
    pass, if we rely on the append_rel_list to be ordered with ancestor
    relationships before descendant ones; add assertions checking that.
    While fixing this, we can make a small performance improvement by
    traversing the append_rel_list just once instead of separately for
    each appendrel parent relation.
    
    Noted while investigating bug #15613, though this patch does not fix
    that (which is why I'm not committing the related Asserts yet).
    
    Discussion: https://postgr.es/m/3951.1549403812@sss.pgh.pa.us
    bdd9a99a
initsplan.c 89.1 KB