Get rid of the planner's LateralJoinInfo data structure.
I originally modeled this data structure on SpecialJoinInfo, but after commit acfcd45c that looks like a pretty poor decision. All we really need is relid sets identifying laterally-referenced rels; and most of the time, what we want to know about includes indirect lateral references, a case the LateralJoinInfo data was unsuited to compute with any efficiency. The previous commit redefined RelOptInfo.lateral_relids as the transitive closure of lateral references, so that it easily supports checking indirect references. For the places where we really do want just direct references, add a new RelOptInfo field direct_lateral_relids, which is easily set up as a copy of lateral_relids before we perform the transitive closure calculation. Then we can just drop lateral_info_list and LateralJoinInfo and the supporting code. This makes the planner's handling of lateral references noticeably more efficient, and shorter too. Such a change can't be back-patched into stable branches for fear of breaking extensions that might be looking at the planner's data structures; but it seems not too late to push it into 9.5, so I've done so.
Showing
- src/backend/nodes/copyfuncs.c 0 additions, 17 deletionssrc/backend/nodes/copyfuncs.c
- src/backend/nodes/equalfuncs.c 0 additions, 12 deletionssrc/backend/nodes/equalfuncs.c
- src/backend/nodes/outfuncs.c 1 addition, 13 deletionssrc/backend/nodes/outfuncs.c
- src/backend/optimizer/path/joinrels.c 6 additions, 30 deletionssrc/backend/optimizer/path/joinrels.c
- src/backend/optimizer/plan/analyzejoins.c 0 additions, 3 deletionssrc/backend/optimizer/plan/analyzejoins.c
- src/backend/optimizer/plan/initsplan.c 55 additions, 107 deletionssrc/backend/optimizer/plan/initsplan.c
- src/backend/optimizer/plan/planagg.c 1 addition, 2 deletionssrc/backend/optimizer/plan/planagg.c
- src/backend/optimizer/plan/planmain.c 2 additions, 4 deletionssrc/backend/optimizer/plan/planmain.c
- src/backend/optimizer/plan/planner.c 1 addition, 2 deletionssrc/backend/optimizer/plan/planner.c
- src/backend/optimizer/prep/prepjointree.c 2 additions, 7 deletionssrc/backend/optimizer/prep/prepjointree.c
- src/backend/optimizer/prep/prepunion.c 0 additions, 1 deletionsrc/backend/optimizer/prep/prepunion.c
- src/backend/optimizer/util/placeholder.c 13 additions, 47 deletionssrc/backend/optimizer/util/placeholder.c
- src/backend/optimizer/util/relnode.c 17 additions, 0 deletionssrc/backend/optimizer/util/relnode.c
- src/backend/optimizer/util/var.c 0 additions, 1 deletionsrc/backend/optimizer/util/var.c
- src/backend/rewrite/rewriteManip.c 0 additions, 3 deletionssrc/backend/rewrite/rewriteManip.c
- src/include/nodes/nodes.h 0 additions, 1 deletionsrc/include/nodes/nodes.h
- src/include/nodes/relation.h 2 additions, 39 deletionssrc/include/nodes/relation.h
Loading
Please register or sign in to comment