• Tom Lane's avatar
    Fix planner crash from pfree'ing a partial path that a GatherPath uses. · c45bf575
    Tom Lane authored
    We mustn't run generate_gather_paths() during add_paths_to_joinrel(),
    because that function can be invoked multiple times for the same target
    joinrel.  Not only is it wasteful to build GatherPaths repeatedly, but
    a later add_partial_path() could delete the partial path that a previously
    created GatherPath depends on.  Instead establish the convention that we
    do generate_gather_paths() for a rel only just before set_cheapest().
    
    The code was accidentally not broken for baserels, because as of today there
    never is more than one partial path for a baserel.  But that assumption
    obviously has a pretty short half-life, so move the generate_gather_paths()
    calls for those cases as well.
    
    Also add some generic comments explaining how and why this all works.
    
    Per fuzz testing by Andreas Seltenreich.
    
    Report: <871t5pgwdt.fsf@credativ.de>
    c45bf575
joinpath.c 51.6 KB