Maksim Zhuravkov created CALCITE-7075:
-----------------------------------------

             Summary: Incorrect code generation for CAST int_returning_func AS 
INTERVAL DAY
                 Key: CALCITE-7075
                 URL: https://issues.apache.org/jira/browse/CALCITE-7075
             Project: Calcite
          Issue Type: Bug
    Affects Versions: 1.40.0
            Reporter: Maksim Zhuravkov


Reproducer 
{noformat}
// JdbcTest

@Test
  void testCastIntToIntervalDays() throws Exception {
    String hsqldbMemUrl = "jdbc:hsqldb:mem:.";
    Properties info = new Properties();
    info.put("model",
        "inline:"
            + "{\n"
            + "  version: '1.0',\n"
            + "  defaultSchema: 'BASEJDBC',\n"
            + "  schemas: [\n"
            + "     {\n"
            + "       type: 'jdbc',\n"
            + "       name: 'BASEJDBC',\n"
            + "       jdbcDriver: '" + jdbcDriver.class.getName() + "',\n"
            + "       jdbcUrl: '" + hsqldbMemUrl + "',\n"
            + "       jdbcCatalog: null,\n"
            + "       jdbcSchema: null\n"
            + "     }\n"
            + "  ]\n"
            + "}");

    try (Connection conn = DriverManager.getConnection("jdbc:calcite:", info)) {
      String statement = "SELECT CAST(RAND_INTEGER(10) AS INTERVAL DAY), CAST(1 
AS INTERVAL DAY)";
      try (ResultSet rs = conn.prepareStatement(statement).executeQuery()) {
        rs.next();
        System.err.println(rs.getString(1)); // + some multiple of 86400000
        System.err.println(rs.getString(2));// + 1
      }
    }
  }
{noformat}

The intermediate result of the INT-to-DAY conversion for the first expression 
is multiplied by the number of milliseconds twice:

{noformat}
{
  final org.apache.calcite.linq4j.Enumerable _inputEnumerable = 
org.apache.calcite.linq4j.Linq4j.asEnumerable(new Integer[] {
    0});
  return new org.apache.calcite.linq4j.AbstractEnumerable(){
      public org.apache.calcite.linq4j.Enumerator<Object[]> enumerator() {
        return new org.apache.calcite.linq4j.Enumerator<Object[]>(){
            public final org.apache.calcite.linq4j.Enumerator<int> 
inputEnumerator = _inputEnumerable.enumerator();
            public void reset() {
              inputEnumerator.reset();
            }

            public boolean moveNext() {
              return inputEnumerator.moveNext();
            }

            public void close() {
              inputEnumerator.close();
            }

            public Object current() {
              return new Object[] {
                  
((Number)org.apache.calcite.linq4j.tree.Primitive.of(long.class).numberValueRoundDown(($L4J$C$new_org_apache_calcite_runtime_RandomFunction_.randInteger(10)))).longValue()
 * 86400000 * 86400000,
                  86400000L};  
            }

            static final org.apache.calcite.runtime.RandomFunction 
$L4J$C$new_org_apache_calcite_runtime_RandomFunction_ = new 
org.apache.calcite.runtime.RandomFunction();
          };
      }

    };
}
{noformat}

The issue is reproducible on both the main and the latest release so far (1.40).




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

Reply via email to