This is an automated email from the ASF dual-hosted git repository.

zhouyuan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gluten.git


The following commit(s) were added to refs/heads/main by this push:
     new aaee2ead9b [GLUTEN-11622][VL] Enable make_timestamp_ntz and 
try_make_timestamp_ntz native execution in Velox backend (#13017)
aaee2ead9b is described below

commit aaee2ead9b0a6b87c2c2e468219cc2b24918a40c
Author: Mariam AlMesfer <[email protected]>
AuthorDate: Tue Oct 6 19:17:10 2026 +0300

    [GLUTEN-11622][VL] Enable make_timestamp_ntz and try_make_timestamp_ntz 
native execution in Velox backend (#13017)
---
 .../gluten/functions/DateFunctionsValidateSuite.scala      | 14 ++++++++++++++
 .../org/apache/gluten/expression/ExpressionConverter.scala | 11 ++++++++++-
 .../gluten/extension/columnar/validator/Validators.scala   |  3 ++-
 .../org/apache/gluten/expression/ExpressionNames.scala     |  3 +++
 4 files changed, 29 insertions(+), 2 deletions(-)

diff --git 
a/backends-velox/src/test/scala/org/apache/gluten/functions/DateFunctionsValidateSuite.scala
 
b/backends-velox/src/test/scala/org/apache/gluten/functions/DateFunctionsValidateSuite.scala
index 604c455b99..103c8b8127 100644
--- 
a/backends-velox/src/test/scala/org/apache/gluten/functions/DateFunctionsValidateSuite.scala
+++ 
b/backends-velox/src/test/scala/org/apache/gluten/functions/DateFunctionsValidateSuite.scala
@@ -623,6 +623,11 @@ class DateFunctionsValidateSuite extends 
FunctionsValidateSuite {
           "select convert_timezone('America/Los_Angeles', 'Asia/Shanghai', ts) 
from view") {
           checkGlutenPlan[ProjectExecTransformer]
         }
+        // make_timestamp_ntz runs natively; output stays timestamp_ntz.
+        runQueryAndCompare(
+          "select make_timestamp_ntz(2021, 7, 11, 6, 30, 45.678) from view") {
+          checkGlutenPlan[ProjectExecTransformer]
+        }
 
         // cast(timestamp_ntz as timestamp)
         runQueryAndCompare("select cast(ts as timestamp) from view") {
@@ -716,4 +721,13 @@ class DateFunctionsValidateSuite extends 
FunctionsValidateSuite {
         }
     }
   }
+
+  testWithMinSparkVersion("try_make_timestamp_ntz", "4.0") {
+    // try_make_timestamp_ntz runs natively; invalid input returns NULL, not 
an error.
+    runQueryAndCompare(
+      "select try_make_timestamp_ntz(2021, 7, 11, 6, 30, 45.678)," +
+        " try_make_timestamp_ntz(2021, 13, 11, 6, 30, 45.678)") {
+      checkGlutenPlan[ProjectExecTransformer]
+    }
+  }
 }
diff --git 
a/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionConverter.scala
 
b/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionConverter.scala
index 7827055969..ff8acfb8a2 100644
--- 
a/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionConverter.scala
+++ 
b/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionConverter.scala
@@ -688,8 +688,17 @@ object ExpressionConverter extends SQLConfHelper with 
Logging {
           a
         )
       case m: MakeTimestamp =>
+        // The 4 make_timestamp* builtins share this class; resolve the name 
from
+        // dataType/failOnError since the static expressionsMap can't.
+        val isNtz = m.dataType.typeName == "timestamp_ntz"
+        val makeTimestampExprName = (isNtz, m.failOnError) match {
+          case (true, true) => ExpressionNames.MAKE_TIMESTAMP_NTZ
+          case (true, false) => ExpressionNames.TRY_MAKE_TIMESTAMP_NTZ
+          case (false, true) => ExpressionNames.MAKE_TIMESTAMP
+          case (false, false) => ExpressionNames.TRY_MAKE_TIMESTAMP
+        }
         
BackendsApiManager.getSparkPlanExecApiInstance.genMakeTimestampTransformer(
-          substraitExprName,
+          makeTimestampExprName,
           m.children.map(replaceWithExpressionTransformer0(_, attributeSeq, 
expressionsMap)),
           m)
       case tsAdd: BinaryExpression if 
tsAdd.getClass.getSimpleName.equals("TimestampAdd") =>
diff --git 
a/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala
 
b/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala
index a12bda1ce3..07f847f70a 100644
--- 
a/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala
+++ 
b/gluten-substrait/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala
@@ -25,7 +25,7 @@ import 
org.apache.gluten.extension.columnar.offload.OffloadSingleNode
 import org.apache.gluten.sql.shims.SparkShimLoader
 
 import org.apache.spark.internal.Logging
-import org.apache.spark.sql.catalyst.expressions.{Alias, Attribute, Cast, 
ConvertTimezone, Expression, GetStructField, Hour, IsNotNull, IsNull, Minute, 
Second, TimestampAdd}
+import org.apache.spark.sql.catalyst.expressions.{Alias, Attribute, Cast, 
ConvertTimezone, Expression, GetStructField, Hour, IsNotNull, IsNull, 
MakeTimestamp, Minute, Second, TimestampAdd}
 import org.apache.spark.sql.execution._
 import org.apache.spark.sql.execution.aggregate.{HashAggregateExec, 
ObjectHashAggregateExec, SortAggregateExec}
 import org.apache.spark.sql.execution.datasources.WriteFilesExec
@@ -293,6 +293,7 @@ object Validators {
                   case Second(child, _) => containsNTZ(child.dataType)
                   case TimestampAdd(_, _, child, _) => 
containsNTZ(child.dataType)
                   case ConvertTimezone(_, _, child) => 
containsNTZ(child.dataType)
+                  case m: MakeTimestamp if isNTZ(m.dataType) => true
                   case c: Cast if isNTZ(c.dataType) || isNTZ(c.child.dataType) 
=> true
                   case IsNull(child) => containsNTZ(child.dataType)
                   case IsNotNull(child) => containsNTZ(child.dataType)
diff --git 
a/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
 
b/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
index fc881d8553..50e7c0097f 100644
--- 
a/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
+++ 
b/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala
@@ -237,6 +237,9 @@ object ExpressionNames {
   final val UNIX_DATE = "unix_date"
   final val MAKE_DATE = "make_date"
   final val MAKE_TIMESTAMP = "make_timestamp"
+  final val TRY_MAKE_TIMESTAMP = "try_make_timestamp"
+  final val MAKE_TIMESTAMP_NTZ = "make_timestamp_ntz"
+  final val TRY_MAKE_TIMESTAMP_NTZ = "try_make_timestamp_ntz"
   final val MAKE_YM_INTERVAL = "make_ym_interval"
   final val TO_UTC_TIMESTAMP = "to_utc_timestamp"
   final val FROM_UTC_TIMESTAMP = "from_utc_timestamp"


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to