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

andygrove pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-comet.git


The following commit(s) were added to refs/heads/main by this push:
     new 5372d76148 fix: report FromUnixTime non-default format as Unsupported 
(#4847)
5372d76148 is described below

commit 5372d7614836abca5a2c414945154d399c0fdcef
Author: Andy Grove <[email protected]>
AuthorDate: Wed Jul 8 08:16:07 2026 -0600

    fix: report FromUnixTime non-default format as Unsupported (#4847)
---
 .../scala/org/apache/comet/serde/unixtime.scala    | 32 ++++++++++++++++------
 .../org/apache/comet/CometExpressionSuite.scala    |  7 +++++
 .../org/apache/spark/sql/CometCollationSuite.scala |  5 +++-
 .../org/apache/spark/sql/CometCollationSuite.scala |  5 +++-
 4 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/spark/src/main/scala/org/apache/comet/serde/unixtime.scala 
b/spark/src/main/scala/org/apache/comet/serde/unixtime.scala
index 467058ccea..256baffa95 100644
--- a/spark/src/main/scala/org/apache/comet/serde/unixtime.scala
+++ b/spark/src/main/scala/org/apache/comet/serde/unixtime.scala
@@ -29,21 +29,35 @@ import 
org.apache.comet.serde.QueryPlanSerde.{exprToProtoInternal, optExprWithFa
 // https://github.com/apache/datafusion/issues/16594
 object CometFromUnixTime extends CometExpressionSerde[FromUnixTime] with 
CodegenDispatchFallback {
 
-  private val collationReason = DatetimeCollation.reason("from_unixtime")
+  // Applies even to the default format: Comet executes natively but 
DataFusion's valid timestamp
+  // range differs from Spark, so results can differ outside that range.
+  private val timestampRangeReason =
+    "DataFusion's valid timestamp range differs from Spark" +
+      " (https://github.com/apache/datafusion/issues/16594)"
 
+  // The native (DataFusion) path covers only the default pattern; documented 
as an unsupported
+  // limitation of that path rather than an incompatibility (see #4575).
   private val formatReason =
-    "Only supports the default datetime format pattern `yyyy-MM-dd HH:mm:ss`." 
+
-      " DataFusion's valid timestamp range differs from Spark" +
-      " (https://github.com/apache/datafusion/issues/16594)"
+    "Only the default datetime format pattern `yyyy-MM-dd HH:mm:ss` is 
supported"
 
   override def getIncompatibleReasons(): Seq[String] =
-    Seq(formatReason) ++ DatetimeCollation.incompatibleReasons("from_unixtime")
+    Seq(timestampRangeReason)
 
+  override def getUnsupportedReasons(): Seq[String] =
+    Seq(formatReason)
+
+  // A non-default format has no native (DataFusion) path, so it is 
`Unsupported`. Because
+  // `CodegenDispatchFallback` is mixed in, an `Unsupported` result still 
stays in the Comet
+  // pipeline via JVM codegen dispatch (Spark's own `doGenCode`) rather than 
falling back to Spark.
+  //
+  // Unlike the other datetime expressions, from_unixtime needs no collation 
guard: a collation can
+  // only appear on the format argument, and any collated format is a 
non-default format, which is
+  // already `Unsupported` here.
   override def getSupportLevel(expr: FromUnixTime): SupportLevel = {
-    if (DatetimeCollation.hasNonDefaultCollation(expr)) {
-      Incompatible(Some(collationReason))
+    if (expr.format != Literal(TimestampFormatter.defaultPattern)) {
+      Unsupported(Some(formatReason))
     } else {
-      Incompatible(Some(formatReason))
+      Incompatible(Some(timestampRangeReason))
     }
   }
 
@@ -60,7 +74,7 @@ object CometFromUnixTime extends 
CometExpressionSerde[FromUnixTime] with Codegen
     val timeZone = exprToProtoInternal(Literal(expr.timeZoneId.orNull), 
inputs, binding)
 
     if (expr.format != Literal(TimestampFormatter.defaultPattern)) {
-      withFallbackReason(expr, "Datetime pattern format is unsupported")
+      withFallbackReason(expr, formatReason)
       None
     } else if (secExpr.isDefined && formatExpr.isDefined) {
       val timestampExpr =
diff --git a/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala 
b/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala
index 33bd58c55e..d6955fb78b 100644
--- a/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala
+++ b/spark/src/test/scala/org/apache/comet/CometExpressionSuite.scala
@@ -1860,6 +1860,13 @@ class CometExpressionSuite extends CometTestBase with 
AdaptiveSparkPlanHelper {
             // After fixing these issues, change checkSparkAnswer to 
checkSparkAnswerAndOperator
             checkSparkAnswer(s"SELECT from_unixtime(_5, 'yyyy') FROM $table 
$where")
             checkSparkAnswer(s"SELECT from_unixtime(_8, 'yyyy') FROM $table 
$where")
+            // A non-default format is Unsupported (no native DataFusion 
path), but at the default
+            // allowIncompatible=false it stays a Comet operator via 
CodegenDispatchFallback
+            // (Spark's own codegen) rather than falling back to Spark. See 
#4575.
+            withSQLConf(
+              CometConf.getExprAllowIncompatConfigKey(classOf[FromUnixTime]) 
-> "false") {
+              checkSparkAnswerAndOperator(s"SELECT from_unixtime(_5, 'yyyy') 
FROM $table $where")
+            }
             withSQLConf(SESSION_LOCAL_TIMEZONE.key -> "Asia/Kathmandu") {
               checkSparkAnswerAndOperator(s"SELECT from_unixtime(_5) FROM 
$table $where")
               checkSparkAnswerAndOperator(s"SELECT from_unixtime(_8) FROM 
$table $where")
diff --git 
a/spark/src/test/spark-4.0/org/apache/spark/sql/CometCollationSuite.scala 
b/spark/src/test/spark-4.0/org/apache/spark/sql/CometCollationSuite.scala
index 4ac077d240..40e1d270cb 100644
--- a/spark/src/test/spark-4.0/org/apache/spark/sql/CometCollationSuite.scala
+++ b/spark/src/test/spark-4.0/org/apache/spark/sql/CometCollationSuite.scala
@@ -306,9 +306,12 @@ class CometCollationSuite extends CometTestBase {
   }
 
   test("from_unixtime rejects non-UTF8_BINARY collated format (issue #4646)") {
+    // A collation can only appear on the format argument, so a collated 
format is a non-default
+    // format. from_unixtime has no native path for non-default formats, so it 
is reported as
+    // Unsupported (the format reason) rather than Incompatible (the collation 
reason).
     checkDatetimeFallback(
       "SELECT from_unixtime(_10, _6 COLLATE utf8_lcase) FROM 
datetime_collation_tbl",
-      "from_unixtime does not support non-UTF8_BINARY collations")
+      "Only the default datetime format pattern `yyyy-MM-dd HH:mm:ss` is 
supported")
   }
 
   test("make_timestamp rejects non-UTF8_BINARY collated timezone (issue 
#4646)") {
diff --git 
a/spark/src/test/spark-4.1/org/apache/spark/sql/CometCollationSuite.scala 
b/spark/src/test/spark-4.1/org/apache/spark/sql/CometCollationSuite.scala
index e1b9713d75..05b488d8cd 100644
--- a/spark/src/test/spark-4.1/org/apache/spark/sql/CometCollationSuite.scala
+++ b/spark/src/test/spark-4.1/org/apache/spark/sql/CometCollationSuite.scala
@@ -127,9 +127,12 @@ class CometCollationSuite extends CometTestBase {
   }
 
   test("from_unixtime rejects non-UTF8_BINARY collated format (issue #4646)") {
+    // A collation can only appear on the format argument, so a collated 
format is a non-default
+    // format. from_unixtime has no native path for non-default formats, so it 
is reported as
+    // Unsupported (the format reason) rather than Incompatible (the collation 
reason).
     checkDatetimeFallback(
       "SELECT from_unixtime(_10, _6 COLLATE utf8_lcase) FROM 
datetime_collation_tbl",
-      "from_unixtime does not support non-UTF8_BINARY collations")
+      "Only the default datetime format pattern `yyyy-MM-dd HH:mm:ss` is 
supported")
   }
 
   test("make_timestamp rejects non-UTF8_BINARY collated timezone (issue 
#4646)") {


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

Reply via email to