[CALCITE-4532] Correct code generated for primitive-object ConstantExpression
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index 5023db6..8bcd9d9 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -7762,6 +7762,12 @@
assertThat.query(query).returns("id=2008-03-31 12:23:34\nid=2018-02-03 00:00:00\n");
}
+ @Test public void testNestedCastBigInt() {
+ CalciteAssert.AssertThat assertThat = CalciteAssert.that();
+ String query = "SELECT CAST(CAST(4200000000 AS BIGINT) AS ANY) FROM (VALUES(1))";
+ assertThat.query(query).returns("EXPR$0=4200000000\n");
+ }
+
private static String sums(int n, boolean c) {
final StringBuilder b = new StringBuilder();
for (int i = 0; i < n; i++) {
diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantExpression.java
index 881cda6..444cd83 100644
--- a/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantExpression.java
+++ b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConstantExpression.java
@@ -136,6 +136,10 @@
write(writer, value, primitive2.primitiveClass);
return writer.append(")");
}
+ Primitive primitive3 = Primitive.ofBox(value.getClass());
+ if (Object.class.equals(type) && primitive3 != null) {
+ return write(writer, value, primitive3.primitiveClass);
+ }
if (value instanceof Enum) {
return writer.append(((Enum) value).getDeclaringClass())
.append('.')
@@ -206,6 +210,7 @@
"(\n", ",\n", ")");
return writer;
}
+
return writer.append(value);
}
diff --git a/linq4j/src/test/java/org/apache/calcite/linq4j/test/ExpressionTest.java b/linq4j/src/test/java/org/apache/calcite/linq4j/test/ExpressionTest.java
index 13bc869..e5fe9df 100644
--- a/linq4j/src/test/java/org/apache/calcite/linq4j/test/ExpressionTest.java
+++ b/linq4j/src/test/java/org/apache/calcite/linq4j/test/ExpressionTest.java
@@ -1357,6 +1357,21 @@
Expressions.toString(Expressions.constant(12.34, BigDecimal.class)));
}
+ @Test void testObjectConstantExpression() {
+ assertEquals("(byte)100",
+ Expressions.toString(Expressions.constant((byte) 100, Object.class)));
+ assertEquals("(char)100",
+ Expressions.toString(Expressions.constant((char) 100, Object.class)));
+ assertEquals("(short)100",
+ Expressions.toString(Expressions.constant((short) 100, Object.class)));
+ assertEquals("100L",
+ Expressions.toString(Expressions.constant(100L, Object.class)));
+ assertEquals("100.0F",
+ Expressions.toString(Expressions.constant(100F, Object.class)));
+ assertEquals("100.0D",
+ Expressions.toString(Expressions.constant(100D, Object.class)));
+ }
+
@Test void testClassDecl() {
final NewExpression newExpression =
Expressions.new_(