Mihai Budiu created CALCITE-5877:
------------------------------------

             Summary: Calcite crashes with AssertionError when compiling MOD 
with arguments with large scales
                 Key: CALCITE-5877
                 URL: https://issues.apache.org/jira/browse/CALCITE-5877
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.35.0
            Reporter: Mihai Budiu


Adding the following test to RelToSqlConverterTest produces an AssertionFailure:
{code:java}
@Test void testNumericScaleMod() {
    final String sql = "SELECT MOD(CAST(2 AS DECIMAL(39, 20)), 2)";
    final String expected = "";
    sql(sql).withPostgresqlModifiedDecimalTypeSystem()
        .ok(expected);
  }
{code}
The exception is here:
{code:java}
java.lang.AssertionError
        at 
org.apache.calcite.rel.type.RelDataTypeSystem.deriveDecimalModType(RelDataTypeSystem.java:383)
        at 
org.apache.calcite.sql.type.ReturnTypes.lambda$static$11(ReturnTypes.java:849)
        at 
org.apache.calcite.sql.type.SqlTypeTransformCascade.inferReturnType(SqlTypeTransformCascade.java:58)
        at 
org.apache.calcite.sql.type.SqlReturnTypeInferenceChain.inferReturnType(SqlReturnTypeInferenceChain.java:55)
{code}
In this line:
{code:java}
int scale = Math.max(s1, s2);
assert scale <= getMaxNumericScale();
{code}
I suspect that doing a Math.max with the getMaxNumericScale (instead of an 
Assert) is sufficient to fix this particular problem. The question is whether 
the compiler should really enforce the invariant that this assertion checks.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to