@@ -21,7 +21,7 @@ package org.apache.comet.serde
2121
2222import java .util .Locale
2323
24- import org .apache .spark .sql .catalyst .expressions .{Attribute , DateAdd , DateSub , DayOfMonth , DayOfWeek , DayOfYear , GetDateField , Hour , Literal , Minute , Month , Quarter , Second , TruncDate , TruncTimestamp , WeekDay , WeekOfYear , Year }
24+ import org .apache .spark .sql .catalyst .expressions .{Attribute , DateAdd , DateSub , DayOfMonth , DayOfWeek , DayOfYear , GetDateField , Hour , Literal , Minute , Month , Quarter , Second , TruncDate , TruncTimestamp , UnixDate , WeekDay , WeekOfYear , Year }
2525import org .apache .spark .sql .types .{DateType , IntegerType }
2626import org .apache .spark .unsafe .types .UTF8String
2727
@@ -258,6 +258,33 @@ object CometDateAdd extends CometScalarFunction[DateAdd]("date_add")
258258
259259object CometDateSub extends CometScalarFunction [DateSub ](" date_sub" )
260260
261+ /**
262+ * Converts a date to the number of days since Unix epoch (1970-01-01). Since dates are internally
263+ * stored as days since epoch, this is a simple cast to integer.
264+ */
265+ object CometUnixDate extends CometExpressionSerde [UnixDate ] {
266+ override def convert (
267+ expr : UnixDate ,
268+ inputs : Seq [Attribute ],
269+ binding : Boolean ): Option [ExprOuterClass .Expr ] = {
270+ val childExpr = exprToProtoInternal(expr.child, inputs, binding)
271+ val optExpr = childExpr.map { child =>
272+ Expr
273+ .newBuilder()
274+ .setCast(
275+ ExprOuterClass .Cast
276+ .newBuilder()
277+ .setChild(child)
278+ .setDatatype(serializeDataType(IntegerType ).get)
279+ .setEvalMode(ExprOuterClass .EvalMode .LEGACY )
280+ .setAllowIncompat(false )
281+ .build())
282+ .build()
283+ }
284+ optExprWithInfo(optExpr, expr, expr.child)
285+ }
286+ }
287+
261288object CometTruncDate extends CometExpressionSerde [TruncDate ] {
262289
263290 val supportedFormats : Seq [String ] =
0 commit comments