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;
 

Reply via email to