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]