Mihai Budiu created CALCITE-6168:
------------------------------------

             Summary: 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


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)

Reply via email to