-
- Downloads
Fix PlaceHolderVar mechanism's interaction with outer joins.
The point of a PlaceHolderVar is to allow a non-strict expression to be evaluated below an outer join, after which its value bubbles up like a Var and can be forced to NULL when the outer join's semantics require that. However, there was a serious design oversight in that, namely that we didn't ensure that there was actually a correct place in the plan tree to evaluate the placeholder :-(. It may be necessary to delay evaluation of an outer join to ensure that a placeholder that should be evaluated below the join can be evaluated there. Per recent bug report from Kirill Simonov. Back-patch to 8.4 where the PlaceHolderVar mechanism was introduced.
Showing
- src/backend/nodes/copyfuncs.c 1 addition, 0 deletionssrc/backend/nodes/copyfuncs.c
- src/backend/nodes/equalfuncs.c 1 addition, 0 deletionssrc/backend/nodes/equalfuncs.c
- src/backend/nodes/outfuncs.c 1 addition, 0 deletionssrc/backend/nodes/outfuncs.c
- src/backend/optimizer/plan/analyzejoins.c 2 additions, 0 deletionssrc/backend/optimizer/plan/analyzejoins.c
- src/backend/optimizer/plan/initsplan.c 37 additions, 0 deletionssrc/backend/optimizer/plan/initsplan.c
- src/backend/optimizer/plan/planmain.c 15 additions, 8 deletionssrc/backend/optimizer/plan/planmain.c
- src/backend/optimizer/util/placeholder.c 212 additions, 26 deletionssrc/backend/optimizer/util/placeholder.c
- src/include/nodes/relation.h 16 additions, 1 deletionsrc/include/nodes/relation.h
- src/include/optimizer/placeholder.h 4 additions, 1 deletionsrc/include/optimizer/placeholder.h
- src/test/regress/expected/join.out 45 additions, 0 deletionssrc/test/regress/expected/join.out
- src/test/regress/sql/join.sql 40 additions, 0 deletionssrc/test/regress/sql/join.sql
Loading
Please register or sign in to comment