This is an automated email from the ASF dual-hosted git repository.
korlov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 3616287d60f IGNITE-28197: Incorrect cast of null with type DATE to
TIMESTAMP type (#7768)
3616287d60f is described below
commit 3616287d60f40245f9308a5a907df00b03a1688e
Author: Max Zhuravkov <[email protected]>
AuthorDate: Thu Mar 19 16:57:26 2026 +0200
IGNITE-28197: Incorrect cast of null with type DATE to TIMESTAMP type
(#7768)
---
.../internal/sql/engine/ItDataTypesTest.java | 56 ++++++++++++++++++++++
.../sql/engine/exec/exp/ConverterUtils.java | 14 ++++--
.../internal/sql/engine/exec/exp/RexImpTable.java | 1 +
3 files changed, 66 insertions(+), 5 deletions(-)
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
index 409a92c44c6..9935e333f6b 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
@@ -973,6 +973,62 @@ public class ItDataTypesTest extends
BaseSqlIntegrationTest {
);
}
+ @Test
+ public void testNullDateToTimestamp() {
+ sql("CREATE TABLE test(id INT PRIMARY KEY, t1 DATE, t2 TIMESTAMP)");
+ sql("INSERT INTO test (id, t1) VALUES (1, null)");
+
+ assertQuery("SELECT id, t1::TIMESTAMP FROM test")
+ .returns(1, null)
+ .check();
+
+ assertQuery("SELECT id, t1::TIMESTAMP FROM (VALUES (1, null::DATE))
test(id, t1) ")
+ .returns(1, null)
+ .check();
+
+ // Update
+ sql("UPDATE test SET t2=t1::TIMESTAMP WHERE id=1");
+ assertQuery("SELECT id, t2 FROM test")
+ .returns(1, null)
+ .check();
+
+ // Insert
+ sql("CREATE TABLE test2(id INT PRIMARY KEY, t1 TIMESTAMP)");
+ sql("INSERT INTO test2 SELECT id, t1::TIMESTAMP FROM test");
+
+ assertQuery("SELECT id, t1 FROM test2")
+ .returns(1, null)
+ .check();
+ }
+
+ @Test
+ public void testNullDateToTimestampLtz() {
+ sql("CREATE TABLE test(id INT PRIMARY KEY, t1 DATE, t2 TIMESTAMP WITH
LOCAL TIME ZONE)");
+ sql("INSERT INTO test (id, t1) VALUES (1, null)");
+
+ assertQuery("SELECT id, t1::TIMESTAMP WITH LOCAL TIME ZONE FROM test")
+ .returns(1, null)
+ .check();
+
+ assertQuery("SELECT id, t1::TIMESTAMP WITH LOCAL TIME ZONE FROM
(VALUES (1, null::DATE)) test(id, t1) ")
+ .returns(1, null)
+ .check();
+
+ // Update
+ sql("UPDATE test SET t2=t1::TIMESTAMP WITH LOCAL TIME ZONE WHERE
id=1");
+ assertQuery("SELECT id, t2 FROM test")
+ .returns(1, null)
+ .check();
+
+ // Insert
+ sql("CREATE TABLE test2(id INT PRIMARY KEY, t1 TIMESTAMP WITH LOCAL
TIME ZONE)");
+ sql("INSERT INTO test2 SELECT id, t1::TIMESTAMP WITH LOCAL TIME ZONE
FROM test");
+
+ assertQuery("SELECT id, t1 FROM test2")
+ .returns(1, null)
+ .check();
+ }
+
private static RelDataType sqlType(SqlTypeName typeName) {
return Commons.typeFactory().createSqlType(typeName);
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/ConverterUtils.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/ConverterUtils.java
index 5be9dd63e2a..138b51fe6f3 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/ConverterUtils.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/ConverterUtils.java
@@ -221,11 +221,15 @@ public class ConverterUtils {
methodName = "toTimestampLtzExact";
}
- return Expressions.call(
- IgniteSqlFunctions.class,
- methodName,
- operand,
- Expressions.constant(targetType.getPrecision())
+ // Returns either (long) <call> or (Long) <call> depending on
nullability of a target type.
+ return Expressions.convert_(
+ Expressions.call(
+ IgniteSqlFunctions.class,
+ methodName,
+ operand,
+ Expressions.constant(targetType.getPrecision())
+ ),
+ Commons.typeFactory().getJavaClass(targetType)
);
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
index a27c28d007c..1a94869ec1a 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
@@ -507,6 +507,7 @@ import
org.apache.calcite.sql.validate.SqlUserDefinedTableMacro;
import org.apache.calcite.util.BuiltInMethod;
import org.apache.calcite.util.Util;
import org.apache.ignite.internal.sql.engine.sql.fun.IgniteSqlOperatorTable;
+import org.apache.ignite.internal.sql.engine.util.Commons;
import org.apache.ignite.internal.sql.engine.util.IgniteMethod;
import org.jetbrains.annotations.Nullable;