@@ -220,7 +220,7 @@ object DecimalLiteral {
220
220
/**
221
221
* In order to do type checking, use Literal.create() instead of constructor
222
222
*/
223
- case class Literal (value : Any , dataType : DataType ) extends LeafExpression {
223
+ case class Literal (value : Any , dataType : DataType ) extends LeafExpression with CodegenFallback {
224
224
225
225
override def foldable : Boolean = true
226
226
override def nullable : Boolean = value == null
@@ -271,28 +271,45 @@ case class Literal (value: Any, dataType: DataType) extends LeafExpression {
271
271
ev.isNull = " true"
272
272
ev.copy(s " final ${ctx.javaType(dataType)} ${ev.value} = ${ctx.defaultValue(dataType)}; " )
273
273
} else {
274
- ev.isNull = " false"
275
- ev.value = dataType match {
276
- case BooleanType | IntegerType | DateType => value.toString
274
+ dataType match {
275
+ case BooleanType =>
276
+ ev.isNull = " false"
277
+ ev.value = value.toString
278
+ ev.copy(" " )
277
279
case FloatType =>
278
280
val v = value.asInstanceOf [Float ]
279
281
if (v.isNaN || v.isInfinite) {
280
- ctx.addReferenceObj(v )
282
+ super [ CodegenFallback ].doGenCode(ctx, ev )
281
283
} else {
282
- s " ${value}f "
284
+ ev.isNull = " false"
285
+ ev.value = s " ${value}f "
286
+ ev.copy(" " )
283
287
}
284
288
case DoubleType =>
285
289
val v = value.asInstanceOf [Double ]
286
290
if (v.isNaN || v.isInfinite) {
287
- ctx.addReferenceObj(v )
291
+ super [ CodegenFallback ].doGenCode(ctx, ev )
288
292
} else {
289
- s " ${value}D "
293
+ ev.isNull = " false"
294
+ ev.value = s " ${value}D "
295
+ ev.copy(" " )
290
296
}
291
- case ByteType | ShortType => s " ( ${ctx.javaType(dataType)}) $value"
292
- case TimestampType | LongType => s " ${value}L "
293
- case other => ctx.addReferenceObj(" literal" , value, ctx.javaType(dataType))
297
+ case ByteType | ShortType =>
298
+ ev.isNull = " false"
299
+ ev.value = s " ( ${ctx.javaType(dataType)}) $value"
300
+ ev.copy(" " )
301
+ case IntegerType | DateType =>
302
+ ev.isNull = " false"
303
+ ev.value = value.toString
304
+ ev.copy(" " )
305
+ case TimestampType | LongType =>
306
+ ev.isNull = " false"
307
+ ev.value = s " ${value}L "
308
+ ev.copy(" " )
309
+ // eval() version may be faster for non-primitive types
310
+ case other =>
311
+ super [CodegenFallback ].doGenCode(ctx, ev)
294
312
}
295
- ev.copy(" " )
296
313
}
297
314
}
298
315
0 commit comments