]> granicus.if.org Git - postgresql/commit
Fix planner crash from pfree'ing a partial path that a GatherPath uses.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 30 Apr 2016 16:29:21 +0000 (12:29 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 30 Apr 2016 16:29:21 +0000 (12:29 -0400)
commitc45bf5751b6338488bd79ce777210285531da373
tree35684865b22644359c5109f0583ac68cc9ebb321
parent17d5db352c1780f4721664f67bc3a3f3b1cf933c
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>
src/backend/optimizer/README
src/backend/optimizer/geqo/geqo_eval.c
src/backend/optimizer/path/allpaths.c
src/backend/optimizer/path/joinpath.c
src/backend/optimizer/util/pathnode.c