Обсуждение: pgsql: Remove unreachable code in expression evaluation.
Remove unreachable code in expression evaluation. The previous code still contained expression evaluation time support for CaseExprs without a defresult. But transformCaseExpr() creates a default expression if necessary. Author: Andres Freund Discussion: https://postgr.es/m/4834.1490480275@sss.pgh.pa.us Branch ------ master Details ------- http://git.postgresql.org/pg/commitdiff/ad46a2aa79f9ee79aecd889d0ace9ecc08dae984 Modified Files -------------- src/backend/executor/execExpr.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-)
Andres Freund <andres@anarazel.de> writes: > Remove unreachable code in expression evaluation. > The previous code still contained expression evaluation time support > for CaseExprs without a defresult. But transformCaseExpr() creates a > default expression if necessary. BTW, now that I think about it, I wonder if a better answer wouldn't be to leave the execExpr code as it stood, and remove the code in transformCaseExpr that pre-creates a default expression. You'd end up with identical code at runtime, and eliminate some parse/rewrite/plan overhead for dealing with that subexpression. It's possible there's some code somewhere else that expects defresult to always be non-null, but I can't think what, or why that would be a good thing to assume. regards, tom lane
On 2017-03-26 00:14:30 -0400, Tom Lane wrote: > Andres Freund <andres@anarazel.de> writes: > > Remove unreachable code in expression evaluation. > > The previous code still contained expression evaluation time support > > for CaseExprs without a defresult. But transformCaseExpr() creates a > > default expression if necessary. > > BTW, now that I think about it, I wonder if a better answer wouldn't > be to leave the execExpr code as it stood, and remove the code in > transformCaseExpr that pre-creates a default expression. You'd end > up with identical code at runtime, and eliminate some parse/rewrite/plan > overhead for dealing with that subexpression. > > It's possible there's some code somewhere else that expects defresult > to always be non-null, but I can't think what, or why that would be > a good thing to assume. There's some relationship with the type inferrence code in transformCaseExpr(). I don't think it'd be hard to change, however - just move resultexprs = lcons(newc->defresult, resultexprs); into the else branch of if defresult == NULL. - Andres