@@ -126,7 +126,6 @@ object CometCast extends CometExpressionSerde[Cast] with CometExprShim {
126126 isSupported(dt.elementType, DataTypes .StringType , timeZoneId, evalMode)
127127 case (dt : ArrayType , dt1 : ArrayType ) =>
128128 isSupported(dt.elementType, dt1.elementType, timeZoneId, evalMode)
129- case (from : DataType , _ : BinaryType ) => canCastToBinary(from)
130129 case (dt : DataType , _) if dt.typeName == " timestamp_ntz" =>
131130 // https://github.com/apache/datafusion-comet/issues/378
132131 toType match {
@@ -148,13 +147,13 @@ object CometCast extends CometExpressionSerde[Cast] with CometExprShim {
148147 case (DataTypes .BooleanType , _) =>
149148 canCastFromBoolean(toType)
150149 case (DataTypes .ByteType , _) =>
151- canCastFromByte(toType)
150+ canCastFromByte(toType, evalMode )
152151 case (DataTypes .ShortType , _) =>
153- canCastFromShort(toType)
152+ canCastFromShort(toType, evalMode )
154153 case (DataTypes .IntegerType , _) =>
155- canCastFromInt(toType)
154+ canCastFromInt(toType, evalMode )
156155 case (DataTypes .LongType , _) =>
157- canCastFromLong(toType)
156+ canCastFromLong(toType, evalMode )
158157 case (DataTypes .FloatType , _) =>
159158 canCastFromFloat(toType)
160159 case (DataTypes .DoubleType , _) =>
@@ -269,53 +268,85 @@ object CometCast extends CometExpressionSerde[Cast] with CometExprShim {
269268 case _ => unsupported(DataTypes .BooleanType , toType)
270269 }
271270
272- private def canCastFromByte (toType : DataType ): SupportLevel = toType match {
273- case DataTypes .BooleanType =>
274- Compatible ()
275- case DataTypes .ShortType | DataTypes .IntegerType | DataTypes .LongType =>
276- Compatible ()
277- case DataTypes .FloatType | DataTypes .DoubleType | _ : DecimalType =>
278- Compatible ()
279- case _ =>
280- unsupported(DataTypes .ByteType , toType)
281- }
271+ private def canCastFromByte (toType : DataType , evalMode : CometEvalMode .Value ): SupportLevel =
272+ toType match {
273+ case DataTypes .BooleanType =>
274+ Compatible ()
275+ case DataTypes .ShortType | DataTypes .IntegerType | DataTypes .LongType =>
276+ Compatible ()
277+ case DataTypes .FloatType | DataTypes .DoubleType | _ : DecimalType =>
278+ Compatible ()
279+ case DataTypes .BinaryType =>
280+ if (evalMode == CometEvalMode .LEGACY ) {
281+ Compatible ()
282+ } else {
283+ Unsupported (
284+ Some (s " Spark does not support byte to binary conversion in ${evalMode} eval mode " ))
285+ }
286+ case _ =>
287+ unsupported(DataTypes .ByteType , toType)
288+ }
282289
283- private def canCastFromShort (toType : DataType ): SupportLevel = toType match {
284- case DataTypes .BooleanType =>
285- Compatible ()
286- case DataTypes .ByteType | DataTypes .IntegerType | DataTypes .LongType =>
287- Compatible ()
288- case DataTypes .FloatType | DataTypes .DoubleType | _ : DecimalType =>
289- Compatible ()
290- case _ =>
291- unsupported(DataTypes .ShortType , toType)
292- }
290+ private def canCastFromShort (toType : DataType , evalMode : CometEvalMode .Value ): SupportLevel =
291+ toType match {
292+ case DataTypes .BooleanType =>
293+ Compatible ()
294+ case DataTypes .ByteType | DataTypes .IntegerType | DataTypes .LongType =>
295+ Compatible ()
296+ case DataTypes .FloatType | DataTypes .DoubleType | _ : DecimalType =>
297+ Compatible ()
298+ case DataTypes .BinaryType =>
299+ if (evalMode == CometEvalMode .LEGACY ) {
300+ Compatible ()
301+ } else {
302+ Unsupported (
303+ Some (s " Spark does not support short to binary conversion in ${evalMode} eval mode " ))
304+ }
305+ case _ =>
306+ unsupported(DataTypes .ShortType , toType)
307+ }
293308
294- private def canCastFromInt (toType : DataType ): SupportLevel = toType match {
295- case DataTypes .BooleanType =>
296- Compatible ()
297- case DataTypes .ByteType | DataTypes .ShortType | DataTypes .LongType =>
298- Compatible ()
299- case DataTypes .FloatType | DataTypes .DoubleType =>
300- Compatible ()
301- case _ : DecimalType =>
302- Compatible ()
303- case _ =>
304- unsupported(DataTypes .IntegerType , toType)
305- }
309+ private def canCastFromInt (toType : DataType , evalMode : CometEvalMode .Value ): SupportLevel =
310+ toType match {
311+ case DataTypes .BooleanType =>
312+ Compatible ()
313+ case DataTypes .ByteType | DataTypes .ShortType | DataTypes .LongType =>
314+ Compatible ()
315+ case DataTypes .FloatType | DataTypes .DoubleType =>
316+ Compatible ()
317+ case _ : DecimalType =>
318+ Compatible ()
319+ case DataTypes .BinaryType =>
320+ if (evalMode == CometEvalMode .LEGACY ) {
321+ Compatible ()
322+ } else {
323+ Unsupported (
324+ Some (s " Spark does not support int to binary conversion in ${evalMode} eval mode " ))
325+ }
326+ case _ =>
327+ unsupported(DataTypes .IntegerType , toType)
328+ }
306329
307- private def canCastFromLong (toType : DataType ): SupportLevel = toType match {
308- case DataTypes .BooleanType =>
309- Compatible ()
310- case DataTypes .ByteType | DataTypes .ShortType | DataTypes .IntegerType =>
311- Compatible ()
312- case DataTypes .FloatType | DataTypes .DoubleType =>
313- Compatible ()
314- case _ : DecimalType =>
315- Compatible ()
316- case _ =>
317- unsupported(DataTypes .LongType , toType)
318- }
330+ private def canCastFromLong (toType : DataType , evalMode : CometEvalMode .Value ): SupportLevel =
331+ toType match {
332+ case DataTypes .BooleanType =>
333+ Compatible ()
334+ case DataTypes .ByteType | DataTypes .ShortType | DataTypes .IntegerType =>
335+ Compatible ()
336+ case DataTypes .FloatType | DataTypes .DoubleType =>
337+ Compatible ()
338+ case _ : DecimalType =>
339+ Compatible ()
340+ case DataTypes .BinaryType =>
341+ if (evalMode == CometEvalMode .LEGACY ) {
342+ Compatible ()
343+ } else {
344+ Unsupported (
345+ Some (s " Spark does not support long to binary conversion in ${evalMode} eval mode " ))
346+ }
347+ case _ =>
348+ unsupported(DataTypes .LongType , toType)
349+ }
319350
320351 private def canCastFromFloat (toType : DataType ): SupportLevel = toType match {
321352 case DataTypes .BooleanType | DataTypes .DoubleType | DataTypes .ByteType | DataTypes .ShortType |
0 commit comments