]> granicus.if.org Git - postgresql/commit
Simplify query_planner's API by having it return the top-level RelOptInfo.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 5 Aug 2013 19:00:57 +0000 (15:00 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 5 Aug 2013 19:01:09 +0000 (15:01 -0400)
commit3ced8837db2cd602422bb36102cec73289691d40
tree0fae9ca9ba7f5f259ef678d685717a70710ac0c4
parent841c29c8b3be98ee30486ee245ebee782d4dedd4
Simplify query_planner's API by having it return the top-level RelOptInfo.

Formerly, query_planner returned one or possibly two Paths for the topmost
join relation, so that grouping_planner didn't see the join RelOptInfo
(at least not directly; it didn't have any hesitation about examining
cheapest_path->parent, though).  However, correct selection of the Paths
involved a significant amount of coupling between query_planner and
grouping_planner, a problem which has gotten worse over time.  It seems
best to give up on this API choice and instead return the topmost
RelOptInfo explicitly.  Then grouping_planner can pull out the Paths it
wants from the rel's path list.  In this way we can remove all knowledge
of grouping behaviors from query_planner.

The only real benefit of the old way is that in the case of an empty
FROM clause, we never made any RelOptInfos at all, just a Path.  Now
we have to gin up a dummy RelOptInfo to represent the empty FROM clause.
That's not a very big deal though.

While at it, simplify query_planner's API a bit more by having the caller
set up root->tuple_fraction and root->limit_tuples, rather than passing
those values as separate parameters.  Since query_planner no longer does
anything with either value, requiring it to fill the PlannerInfo fields
seemed pretty arbitrary.

This patch just rearranges code; it doesn't (intentionally) change any
behaviors.  Followup patches will do more interesting things.
src/backend/optimizer/README
src/backend/optimizer/plan/planagg.c
src/backend/optimizer/plan/planmain.c
src/backend/optimizer/plan/planner.c
src/backend/optimizer/prep/prepjointree.c
src/backend/optimizer/util/relnode.c
src/include/optimizer/pathnode.h
src/include/optimizer/planmain.h