@@ -88,6 +88,7 @@ private[hive] trait HiveInspectors {
8888 * @return convert the data into catalyst type
8989 */
9090 def unwrap (data : Any , oi : ObjectInspector ): Any = oi match {
91+ case _ if data == null => null
9192 case hvoi : HiveVarcharObjectInspector =>
9293 if (data == null ) null else hvoi.getPrimitiveJavaObject(data).getValue
9394 case hdoi : HiveDecimalObjectInspector =>
@@ -254,46 +255,59 @@ private[hive] trait HiveInspectors {
254255 }
255256
256257 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+ }
283288 case Literal (_, NullType ) =>
284289 HiveShim .getPrimitiveNullWritableConstantObjectInspector
285- case Literal (value : Seq [_] , ArrayType (dt, _)) =>
290+ case Literal (value, ArrayType (dt, _)) =>
286291 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, _)) =>
292300 val keyOI = toInspector(keyType)
293301 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+ }
297311 case _ => toInspector(expr.dataType)
298312 }
299313
0 commit comments