Improve planner's handling of SetOp plans.
Tom Lane <tgl@sss.pgh.pa.us>
Improve planner's handling of SetOp plans. Remove the code for inserting flag columns in the inputs of a SetOp. That was the only reason why there would be resjunk columns in a set-operations plan tree, so we can get rid of some code that supported that, too. Get rid of choose_hashed_setop() in favor of building Paths for the hashed and sorted alternatives, and letting them fight it out within add_path(). Remove set_operation_ordered_results_useful(), which was giving wrong answers due to examining the wrong ancestor node: we need to examine the immediate SetOperationStmt parent not the topmost node. Instead make each caller of recurse_set_operations() pass down the relevant parent node. (This thinko seems to have led only to wasted planning cycles and possibly-inferior plans, not wrong query answers. Perhaps we should back-patch it, but I'm not doing so right now.) Teach generate_nonunion_paths() to consider pre-sorted inputs for sorted SetOps, rather than always generating a Sort node. Patch by me; thanks to Richard Guo and David Rowley for review. Discussion: https://postgr.es/m/1850138.1731549611@sss.pgh.pa.us
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/optimizer/plan/planner.c | modified | +3 −4 |
| src/backend/optimizer/prep/prepunion.c | modified | +182 −296 |
| src/backend/optimizer/util/pathnode.c | modified | +61 −8 |
| src/include/optimizer/prep.h | modified | +0 −1 |
| src/test/regress/expected/subselect.out | modified | +47 −1 |
| src/test/regress/expected/union.out | modified | +32 −21 |
| src/test/regress/sql/subselect.sql | modified | +31 −1 |
| src/test/regress/sql/union.sql | modified | +9 −0 |
Discussion
- Converting SetOp to read its two inputs separately 17 messages · 2024-11-14 → 2024-12-19