mirror of
https://github.com/postgres/postgres.git
synced 2025-07-11 10:01:57 +03:00
Fix planner crash from pfree'ing a partial path that a GatherPath uses.
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>
This commit is contained in:
@ -223,12 +223,7 @@ add_paths_to_joinrel(PlannerInfo *root,
|
||||
jointype, &extra);
|
||||
|
||||
/*
|
||||
* 6. Consider gathering partial paths.
|
||||
*/
|
||||
generate_gather_paths(root, joinrel);
|
||||
|
||||
/*
|
||||
* 7. Finally, give extensions a chance to manipulate the path list.
|
||||
* 6. Finally, give extensions a chance to manipulate the path list.
|
||||
*/
|
||||
if (set_join_pathlist_hook)
|
||||
set_join_pathlist_hook(root, joinrel, outerrel, innerrel,
|
||||
|
Reference in New Issue
Block a user