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)