@@ -21,14 +21,14 @@ package org.apache.comet.serde
2121
2222import java .util .Locale
2323
24- import org .apache .spark .sql .catalyst .expressions .{Attribute , Cast , Concat , Expression , InitCap , Left , Length , Like , Literal , Lower , RegExpReplace , RLike , StringLPad , StringRepeat , StringRPad , Substring , Upper }
24+ import org .apache .spark .sql .catalyst .expressions .{Attribute , Cast , Concat , Expression , InitCap , Left , Length , Like , Literal , Lower , RegExpReplace , RLike , StringLPad , StringRepeat , StringRPad , StringSplit , Substring , Upper }
2525import org .apache .spark .sql .types .{BinaryType , DataTypes , LongType , StringType }
2626
2727import org .apache .comet .CometConf
2828import org .apache .comet .CometSparkSessionExtensions .withInfo
2929import org .apache .comet .expressions .{CometCast , CometEvalMode , RegExp }
3030import org .apache .comet .serde .ExprOuterClass .Expr
31- import org .apache .comet .serde .QueryPlanSerde .{createBinaryExpr , exprToProtoInternal , optExprWithInfo , scalarFunctionExprToProto }
31+ import org .apache .comet .serde .QueryPlanSerde .{createBinaryExpr , exprToProtoInternal , optExprWithInfo , scalarFunctionExprToProto , scalarFunctionExprToProtoWithReturnType }
3232
3333object CometStringRepeat extends CometExpressionSerde [StringRepeat ] {
3434
@@ -289,6 +289,32 @@ object CometRegExpReplace extends CometExpressionSerde[RegExpReplace] {
289289 }
290290}
291291
292+ /**
293+ * Serde for StringSplit expression.
294+ * This is a custom Comet function (not a built-in DataFusion function),
295+ * so we need to include the return type in the protobuf to avoid
296+ * DataFusion registry lookup failures.
297+ */
298+ object CometStringSplit extends CometExpressionSerde [StringSplit ] {
299+
300+ override def convert (
301+ expr : StringSplit ,
302+ inputs : Seq [Attribute ],
303+ binding : Boolean ): Option [Expr ] = {
304+ val strExpr = exprToProtoInternal(expr.str, inputs, binding)
305+ val regexExpr = exprToProtoInternal(expr.regex, inputs, binding)
306+ val limitExpr = exprToProtoInternal(expr.limit, inputs, binding)
307+ val optExpr = scalarFunctionExprToProtoWithReturnType(
308+ " split" ,
309+ expr.dataType,
310+ false ,
311+ strExpr,
312+ regexExpr,
313+ limitExpr)
314+ optExprWithInfo(optExpr, expr, expr.str, expr.regex, expr.limit)
315+ }
316+ }
317+
292318trait CommonStringExprs {
293319
294320 def stringDecode (
0 commit comments