Restructure planning code so that preprocessing of targetlist and quals
Tom Lane <tgl@sss.pgh.pa.us>
Restructure planning code so that preprocessing of targetlist and quals to simplify constant expressions and expand SubLink nodes into SubPlans is done in a separate routine subquery_planner() that calls union_planner(). We formerly did most of this work in query_planner(), but that's the wrong place because it may never see the real targetlist. Splitting union_planner into two routines also allows us to avoid redundant work when union_planner is invoked recursively for UNION and inheritance cases. Upshot is that it is now possible to do something like select float8(count(*)) / (select count(*) from int4_tbl) from int4_tbl group by f1; which has never worked before.
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/optimizer/plan/planmain.c | modified | +13 −65 |
| src/backend/optimizer/plan/planner.c | modified | +130 −55 |
| src/backend/optimizer/plan/subselect.c | modified | +2 −2 |
| src/backend/optimizer/prep/prepunion.c | modified | +10 −3 |
| src/backend/optimizer/README | modified | +14 −7 |
| src/backend/optimizer/util/clauses.c | modified | +13 −24 |
| src/include/optimizer/clauses.h | modified | +2 −4 |
| src/include/optimizer/planner.h | modified | +2 −1 |