@@ -88,6 +88,7 @@ private[hive] trait HiveInspectors {
88
88
* @return convert the data into catalyst type
89
89
*/
90
90
def unwrap (data : Any , oi : ObjectInspector ): Any = oi match {
91
+ case _ if data == null => null
91
92
case hvoi : HiveVarcharObjectInspector =>
92
93
if (data == null ) null else hvoi.getPrimitiveJavaObject(data).getValue
93
94
case hdoi : HiveDecimalObjectInspector =>
@@ -254,46 +255,59 @@ private[hive] trait HiveInspectors {
254
255
}
255
256
256
257
def toInspector (expr : Expression ): ObjectInspector = expr match {
257
- case Literal (value : String , StringType ) =>
258
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
259
- case Literal (value : Int , IntegerType ) =>
260
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
261
- case Literal (value : Double , DoubleType ) =>
262
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
263
- case Literal (value : Boolean , BooleanType ) =>
264
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
265
- case Literal (value : Long , LongType ) =>
266
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
267
- case Literal (value : Float , FloatType ) =>
268
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
269
- case Literal (value : Short , ShortType ) =>
270
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
271
- case Literal (value : Byte , ByteType ) =>
272
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
273
- case Literal (value : Array [Byte ], BinaryType ) =>
274
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
275
- case Literal (value : java.sql.Date , DateType ) =>
276
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
277
- case Literal (value : java.sql.Timestamp , TimestampType ) =>
278
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
279
- case Literal (value : BigDecimal , DecimalType ()) =>
280
- HiveShim .getPrimitiveWritableConstantObjectInspector(value)
281
- case Literal (value : Decimal , DecimalType ()) =>
282
- HiveShim .getPrimitiveWritableConstantObjectInspector(value.toBigDecimal)
258
+ case Literal (value, StringType ) =>
259
+ HiveShim .getPrimitiveWritableConstantObjectInspector(value.asInstanceOf [String ])
260
+ case Literal (value, IntegerType ) =>
261
+ HiveShim .getPrimitiveWritableConstantObjectInspector(value.asInstanceOf [Int ])
262
+ case Literal (value, DoubleType ) =>
263
+ HiveShim .getPrimitiveWritableConstantObjectInspector(value.asInstanceOf [Double ])
264
+ case Literal (value, BooleanType ) =>
265
+ HiveShim .getPrimitiveWritableConstantObjectInspector(value.asInstanceOf [Boolean ])
266
+ case Literal (value, LongType ) =>
267
+ HiveShim .getPrimitiveWritableConstantObjectInspector(value.asInstanceOf [Long ])
268
+ case Literal (value, FloatType ) =>
269
+ HiveShim .getPrimitiveWritableConstantObjectInspector(value.asInstanceOf [Float ])
270
+ case Literal (value, ShortType ) =>
271
+ HiveShim .getPrimitiveWritableConstantObjectInspector(value.asInstanceOf [Short ])
272
+ case Literal (value, ByteType ) =>
273
+ HiveShim .getPrimitiveWritableConstantObjectInspector(value.asInstanceOf [Byte ])
274
+ case Literal (value, BinaryType ) =>
275
+ HiveShim .getPrimitiveWritableConstantObjectInspector(value.asInstanceOf [Array [Byte ]])
276
+ case Literal (value, DateType ) =>
277
+ HiveShim .getPrimitiveWritableConstantObjectInspector(value.asInstanceOf [java.sql.Date ])
278
+ case Literal (value, TimestampType ) =>
279
+ HiveShim .getPrimitiveWritableConstantObjectInspector(value.asInstanceOf [java.sql.Timestamp ])
280
+ case Literal (value, DecimalType ()) =>
281
+ if (null == value) {
282
+ HiveShim .getPrimitiveWritableConstantObjectInspector(
283
+ null .asInstanceOf [BigDecimal ])
284
+ } else {
285
+ HiveShim .getPrimitiveWritableConstantObjectInspector(
286
+ value.asInstanceOf [Decimal ].toBigDecimal)
287
+ }
283
288
case Literal (_, NullType ) =>
284
289
HiveShim .getPrimitiveNullWritableConstantObjectInspector
285
- case Literal (value : Seq [_] , ArrayType (dt, _)) =>
290
+ case Literal (value, ArrayType (dt, _)) =>
286
291
val listObjectInspector = toInspector(dt)
287
- val list = new java.util.ArrayList [Object ]()
288
- value.foreach(v => list.add(wrap(v, listObjectInspector)))
289
- ObjectInspectorFactory .getStandardConstantListObjectInspector(listObjectInspector, list)
290
- case Literal (map : Map [_, _], MapType (keyType, valueType, _)) =>
291
- val value = new java.util.HashMap [Object , Object ]()
292
+ if (value == null ) {
293
+ ObjectInspectorFactory .getStandardConstantListObjectInspector(listObjectInspector, null )
294
+ } else {
295
+ val list = new java.util.ArrayList [Object ]()
296
+ value.asInstanceOf [Seq [_]].foreach(v => list.add(wrap(v, listObjectInspector)))
297
+ ObjectInspectorFactory .getStandardConstantListObjectInspector(listObjectInspector, list)
298
+ }
299
+ case Literal (value, MapType (keyType, valueType, _)) =>
292
300
val keyOI = toInspector(keyType)
293
301
val valueOI = toInspector(valueType)
294
- map.foreach (entry => value.put(wrap(entry._1, keyOI), wrap(entry._2, valueOI)))
295
- ObjectInspectorFactory .getStandardConstantMapObjectInspector(keyOI, valueOI, value)
296
- case Literal (_, dt) => sys.error(s " Hive doesn't support the constant type [ $dt]. " )
302
+ if (value == null ) {
303
+ ObjectInspectorFactory .getStandardConstantMapObjectInspector(keyOI, valueOI, null )
304
+ } else {
305
+ val map = new java.util.HashMap [Object , Object ]()
306
+ value.asInstanceOf [Map [_, _]].foreach (entry => {
307
+ map.put(wrap(entry._1, keyOI), wrap(entry._2, valueOI))
308
+ })
309
+ ObjectInspectorFactory .getStandardConstantMapObjectInspector(keyOI, valueOI, map)
310
+ }
297
311
case _ => toInspector(expr.dataType)
298
312
}
299
313
0 commit comments