[ https://issues.apache.org/jira/browse/CALCITE-6168?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
ASF GitHub Bot updated CALCITE-6168: ------------------------------------ Labels: pull-request-available (was: ) > RexExecutor can throw during compilation > ---------------------------------------- > > Key: CALCITE-6168 > URL: https://issues.apache.org/jira/browse/CALCITE-6168 > Project: Calcite > Issue Type: Bug > Components: core > Affects Versions: 1.36.0 > Reporter: Mihai Budiu > Priority: Minor > Labels: pull-request-available > > The RexExecutor is supposed to evaluate expressions at compilation time; if > an expression causes an exception, it should be caught and the expression > should be unchanged. The goal is to have the exception be reported at > runtime. The executor does catch exceptions during its "execute" phase, but > some exceptions can be caught during its "compile" phase. > The following SqlOperatorTest will exhibit such an instance: > {code:java} > @Test > void testCast() { > final SqlOperatorFixture f = fixture(); > f.checkFails("CAST(200 as TINYINT)", "", true); > } > } > {code} > This is the relevant portion of the stack trace: > {code} > at > org.apache.calcite.linq4j.tree.Primitive.checkRoundedRange(Primitive.java:383) > at > org.apache.calcite.linq4j.tree.Primitive.numberValue(Primitive.java:398) > at > org.apache.calcite.linq4j.tree.Expressions.constant(Expressions.java:575) > at > org.apache.calcite.linq4j.tree.OptimizeShuttle.visit(OptimizeShuttle.java:305) > at > org.apache.calcite.linq4j.tree.UnaryExpression.accept(UnaryExpression.java:39) > at > org.apache.calcite.linq4j.tree.TernaryExpression.accept(TernaryExpression.java:47) > at > org.apache.calcite.linq4j.tree.Expressions.acceptExpressions(Expressions.java:3214) > at > org.apache.calcite.linq4j.tree.NewArrayExpression.accept(NewArrayExpression.java:49) > at > org.apache.calcite.linq4j.tree.GotoStatement.accept(GotoStatement.java:64) > at > org.apache.calcite.linq4j.tree.BlockBuilder.optimize(BlockBuilder.java:455) > at > org.apache.calcite.linq4j.tree.BlockBuilder.toBlock(BlockBuilder.java:340) > at > org.apache.calcite.rex.RexExecutorImpl.compile(RexExecutorImpl.java:102) > at > org.apache.calcite.rex.RexExecutorImpl.compile(RexExecutorImpl.java:68) > at > org.apache.calcite.rex.RexExecutorImpl.reduce(RexExecutorImpl.java:133) > at > org.apache.calcite.rex.RexSimplify.simplifyCast(RexSimplify.java:2265) > at org.apache.calcite.rex.RexSimplify.simplify(RexSimplify.java:292) > at > org.apache.calcite.rex.RexSimplify.simplifyUnknownAs(RexSimplify.java:250) > at > org.apache.calcite.rex.RexSimplify.simplifyPreservingType(RexSimplify.java:189) > at > org.apache.calcite.rex.RexSimplify.simplifyPreservingType(RexSimplify.java:184) > at > org.apache.calcite.tools.RelBuilder.lambda$project_$7(RelBuilder.java:2050) > {code} > Notice that this happens during the compile stage: > at > org.apache.calcite.rex.RexExecutorImpl.compile(RexExecutorImpl.java:68) > The simplest fix is probably to move the try/catch block earlier in the flow. -- This message was sent by Atlassian Jira (v8.20.10#820010)