This is an automated email from the ASF dual-hosted git repository.
rui-mo 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 90186c196e [GLUTEN-11622][VL] Enable convert_timezone(timestamp_ntz)
native execution (#12979)
90186c196e is described below
commit 90186c196eb572fd352a9f34996b893e3b9e3abe
Author: Mariam AlMesfer <[email protected]>
AuthorDate: Wed Sep 16 19:03:51 2026 +0300
[GLUTEN-11622][VL] Enable convert_timezone(timestamp_ntz) native execution
(#12979)
Co-authored-by: Mariam-Almesfer <[email protected]>
---
.../org/apache/gluten/functions/DateFunctionsValidateSuite.scala | 8 ++++++++
.../scala/org/apache/gluten/expression/ExpressionMappings.scala | 1 +
.../apache/gluten/extension/columnar/validator/Validators.scala | 3 ++-
.../main/scala/org/apache/gluten/expression/ExpressionNames.scala | 1 +
4 files changed, 12 insertions(+), 1 deletion(-)
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 98a8b4a4b4..9eaea0c498 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
@@ -615,6 +615,14 @@ class DateFunctionsValidateSuite extends
FunctionsValidateSuite {
runQueryAndCompare("select timestampadd(hour, 1, ts) from view") {
checkGlutenPlan[ProjectExecTransformer]
}
+ // convert_timezone(timestamp_ntz) runs natively; output stays
timestamp_ntz.
+ runQueryAndCompare("select convert_timezone('America/Los_Angeles', ts)
from view") {
+ checkGlutenPlan[ProjectExecTransformer]
+ }
+ runQueryAndCompare(
+ "select convert_timezone('America/Los_Angeles', 'Asia/Shanghai', ts)
from view") {
+ checkGlutenPlan[ProjectExecTransformer]
+ }
// cast(timestamp_ntz as timestamp)
runQueryAndCompare("select cast(ts as timestamp) from view") {
diff --git
a/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
b/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
index 29c263f1f4..972aca0534 100644
---
a/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
+++
b/gluten-substrait/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala
@@ -307,6 +307,7 @@ object ExpressionMappings {
Sig[KnownNullable](KNOWN_NULLABLE),
Sig[TimestampAdd](TIMESTAMP_ADD),
Sig[TimestampDiff](TIMESTAMP_DIFF),
+ Sig[ConvertTimezone](CONVERT_TIMEZONE),
Sig[RoundFloor](FLOOR),
Sig[RoundCeil](CEIL)
) ++ SparkShimLoader.getSparkShims.scalarExpressionMappings
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 b8e894a415..6c648efaba 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.{Cast, Hour, Minute, Second,
TimestampAdd}
+import org.apache.spark.sql.catalyst.expressions.{Cast, ConvertTimezone, Hour,
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
@@ -283,6 +283,7 @@ object Validators {
case Minute(child, _) => containsNTZ(child.dataType)
case Second(child, _) => containsNTZ(child.dataType)
case TimestampAdd(_, _, child, _) =>
containsNTZ(child.dataType)
+ case ConvertTimezone(_, _, child) =>
containsNTZ(child.dataType)
case c: Cast if isNTZ(c.dataType) || isNTZ(c.child.dataType)
=> true
case _ => false
}
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 5c52b52db0..fc881d8553 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
@@ -240,6 +240,7 @@ object ExpressionNames {
final val MAKE_YM_INTERVAL = "make_ym_interval"
final val TO_UTC_TIMESTAMP = "to_utc_timestamp"
final val FROM_UTC_TIMESTAMP = "from_utc_timestamp"
+ final val CONVERT_TIMEZONE = "convert_timezone"
final val UNIX_SECONDS = "unix_seconds"
final val UNIX_MILLIS = "unix_millis"
final val UNIX_MICROS = "unix_micros"
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]