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

agrove 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 732b9feae fix: Support concat_ws with literal NULL separator (#3542)
732b9feae is described below

commit 732b9feaeff92fae38854ce3adaae1979d03ce79
Author: ChenChen Lai <[email protected]>
AuthorDate: Thu Feb 19 07:26:36 2026 +0800

    fix: Support concat_ws with literal NULL separator (#3542)
---
 .../org/apache/comet/serde/QueryPlanSerde.scala    |  2 +-
 .../scala/org/apache/comet/serde/strings.scala     | 23 +++++++++++++++++++++-
 .../sql-tests/expressions/string/concat_ws.sql     |  4 ++--
 3 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala 
b/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala
index f627b0c46..6f399fa9f 100644
--- a/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala
+++ b/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala
@@ -149,7 +149,7 @@ object QueryPlanSerde extends Logging with CometExprShim {
     classOf[Ascii] -> CometScalarFunction("ascii"),
     classOf[BitLength] -> CometScalarFunction("bit_length"),
     classOf[Chr] -> CometScalarFunction("char"),
-    classOf[ConcatWs] -> CometScalarFunction("concat_ws"),
+    classOf[ConcatWs] -> CometConcatWs,
     classOf[Concat] -> CometConcat,
     classOf[Contains] -> CometScalarFunction("contains"),
     classOf[EndsWith] -> CometScalarFunction("ends_with"),
diff --git a/spark/src/main/scala/org/apache/comet/serde/strings.scala 
b/spark/src/main/scala/org/apache/comet/serde/strings.scala
index ae32b625d..64ba64404 100644
--- a/spark/src/main/scala/org/apache/comet/serde/strings.scala
+++ b/spark/src/main/scala/org/apache/comet/serde/strings.scala
@@ -21,7 +21,7 @@ package org.apache.comet.serde
 
 import java.util.Locale
 
-import org.apache.spark.sql.catalyst.expressions.{Attribute, Cast, Concat, 
Expression, If, InitCap, IsNull, Left, Length, Like, Literal, Lower, 
RegExpReplace, Right, RLike, StringLPad, StringRepeat, StringRPad, StringSplit, 
Substring, Upper}
+import org.apache.spark.sql.catalyst.expressions.{Attribute, Cast, Concat, 
ConcatWs, Expression, If, InitCap, IsNull, Left, Length, Like, Literal, Lower, 
RegExpReplace, Right, RLike, StringLPad, StringRepeat, StringRPad, StringSplit, 
Substring, Upper}
 import org.apache.spark.sql.types.{BinaryType, DataTypes, LongType, StringType}
 import org.apache.spark.unsafe.types.UTF8String
 
@@ -199,6 +199,27 @@ object CometConcat extends 
CometScalarFunction[Concat]("concat") {
   }
 }
 
+object CometConcatWs extends CometExpressionSerde[ConcatWs] {
+
+  override def convert(expr: ConcatWs, inputs: Seq[Attribute], binding: 
Boolean): Option[Expr] = {
+    expr.children.headOption match {
+      // Match Spark behavior: when the separator is NULL, the result of 
concat_ws is NULL.
+      case Some(Literal(null, _)) =>
+        val nullLiteral = Literal.create(null, expr.dataType)
+        exprToProtoInternal(nullLiteral, inputs, binding)
+
+      case _ if expr.children.forall(_.foldable) =>
+        // Fall back to Spark for all-literal args so ConstantFolding can 
handle it
+        withInfo(expr, "all arguments are foldable")
+        None
+
+      case _ =>
+        // For all other cases, use the generic scalar function implementation.
+        CometScalarFunction[ConcatWs]("concat_ws").convert(expr, inputs, 
binding)
+    }
+  }
+}
+
 object CometLike extends CometExpressionSerde[Like] {
 
   override def convert(expr: Like, inputs: Seq[Attribute], binding: Boolean): 
Option[Expr] = {
diff --git 
a/spark/src/test/resources/sql-tests/expressions/string/concat_ws.sql 
b/spark/src/test/resources/sql-tests/expressions/string/concat_ws.sql
index 4a3df6896..81ccfb0f3 100644
--- a/spark/src/test/resources/sql-tests/expressions/string/concat_ws.sql
+++ b/spark/src/test/resources/sql-tests/expressions/string/concat_ws.sql
@@ -42,6 +42,6 @@ INSERT INTO names VALUES(1, 'James', 'B', 'Taylor'), (2, 
'Smith', 'C', 'Davis'),
 query
 SELECT concat_ws(' ', first_name, middle_initial, last_name) FROM names
 
--- literal + literal + literal
-query ignore(https://github.com/apache/datafusion-comet/issues/3339)
+-- literal + literal + literal (falls back to Spark when all args are foldable)
+query spark_answer_only
 SELECT concat_ws(',', 'hello', 'world'), concat_ws(',', '', ''), 
concat_ws(',', NULL, 'b', 'c'), concat_ws(NULL, 'a', 'b')


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

Reply via email to