You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2013/04/16 16:23:20 UTC

svn commit: r1468427 - in /hive/branches/branch-0.11: ql/src/test/queries/clientnegative/ ql/src/test/queries/clientpositive/ ql/src/test/results/clientnegative/ ql/src/test/results/clientpositive/ serde/src/java/org/apache/hadoop/hive/serde2/objectins...

Author: hashutosh
Date: Tue Apr 16 14:23:20 2013
New Revision: 1468427

URL: http://svn.apache.org/r1468427
Log:
HIVE-4327 : NPE in constant folding with decimal (Gunther Hagleitner via Ashutosh Chauhan)

Added:
    hive/branches/branch-0.11/ql/src/test/queries/clientnegative/decimal_precision.q
    hive/branches/branch-0.11/ql/src/test/queries/clientnegative/decimal_precision_1.q
    hive/branches/branch-0.11/ql/src/test/results/clientnegative/decimal_precision.q.out
    hive/branches/branch-0.11/ql/src/test/results/clientnegative/decimal_precision_1.q.out
Modified:
    hive/branches/branch-0.11/ql/src/test/queries/clientpositive/decimal_precision.q
    hive/branches/branch-0.11/ql/src/test/queries/clientpositive/decimal_udf.q
    hive/branches/branch-0.11/ql/src/test/results/clientpositive/decimal_precision.q.out
    hive/branches/branch-0.11/ql/src/test/results/clientpositive/decimal_udf.q.out
    hive/branches/branch-0.11/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java
    hive/branches/branch-0.11/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java

Added: hive/branches/branch-0.11/ql/src/test/queries/clientnegative/decimal_precision.q
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.11/ql/src/test/queries/clientnegative/decimal_precision.q?rev=1468427&view=auto
==============================================================================
--- hive/branches/branch-0.11/ql/src/test/queries/clientnegative/decimal_precision.q (added)
+++ hive/branches/branch-0.11/ql/src/test/queries/clientnegative/decimal_precision.q Tue Apr 16 14:23:20 2013
@@ -0,0 +1,10 @@
+DROP TABLE IF EXISTS DECIMAL_PRECISION;
+
+CREATE TABLE DECIMAL_PRECISION(dec decimal) 
+ROW FORMAT DELIMITED
+   FIELDS TERMINATED BY ' '
+STORED AS TEXTFILE;
+
+SELECT dec * 123456789012345678901234567890.123456789bd FROM DECIMAL_PRECISION;
+
+DROP TABLE DECIMAL_PRECISION;

Added: hive/branches/branch-0.11/ql/src/test/queries/clientnegative/decimal_precision_1.q
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.11/ql/src/test/queries/clientnegative/decimal_precision_1.q?rev=1468427&view=auto
==============================================================================
--- hive/branches/branch-0.11/ql/src/test/queries/clientnegative/decimal_precision_1.q (added)
+++ hive/branches/branch-0.11/ql/src/test/queries/clientnegative/decimal_precision_1.q Tue Apr 16 14:23:20 2013
@@ -0,0 +1,10 @@
+DROP TABLE IF EXISTS DECIMAL_PRECISION;
+
+CREATE TABLE DECIMAL_PRECISION(dec decimal) 
+ROW FORMAT DELIMITED
+   FIELDS TERMINATED BY ' '
+STORED AS TEXTFILE;
+
+SELECT * from DECIMAL_PRECISION WHERE dec > 1234567890123456789.0123456789bd;
+
+DROP TABLE DECIMAL_PRECISION;

Modified: hive/branches/branch-0.11/ql/src/test/queries/clientpositive/decimal_precision.q
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.11/ql/src/test/queries/clientpositive/decimal_precision.q?rev=1468427&r1=1468426&r2=1468427&view=diff
==============================================================================
--- hive/branches/branch-0.11/ql/src/test/queries/clientpositive/decimal_precision.q (original)
+++ hive/branches/branch-0.11/ql/src/test/queries/clientpositive/decimal_precision.q Tue Apr 16 14:23:20 2013
@@ -17,4 +17,11 @@ SELECT dec, dec * dec FROM DECIMAL_PRECI
 
 SELECT avg(dec), sum(dec) FROM DECIMAL_PRECISION;
 
+SELECT dec * cast('123456789012345678901234567890.123456789' as decimal) FROM DECIMAL_PRECISION LIMIT 1;
+SELECT * from DECIMAL_PRECISION WHERE dec > cast('123456789012345678901234567890.123456789' as decimal) LIMIT 1;
+SELECT dec * 123456789012345678901234567890.123456789 FROM DECIMAL_PRECISION LIMIT 1;
+
+SELECT MIN(cast('123456789012345678901234567890.123456789' as decimal)) FROM DECIMAL_PRECISION;
+SELECT COUNT(cast('123456789012345678901234567890.123456789' as decimal)) FROM DECIMAL_PRECISION;
+
 DROP TABLE DECIMAL_PRECISION;

Modified: hive/branches/branch-0.11/ql/src/test/queries/clientpositive/decimal_udf.q
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.11/ql/src/test/queries/clientpositive/decimal_udf.q?rev=1468427&r1=1468426&r2=1468427&view=diff
==============================================================================
--- hive/branches/branch-0.11/ql/src/test/queries/clientpositive/decimal_udf.q (original)
+++ hive/branches/branch-0.11/ql/src/test/queries/clientpositive/decimal_udf.q Tue Apr 16 14:23:20 2013
@@ -113,4 +113,16 @@ SELECT value, stddev_samp(key), var_samp
 EXPLAIN SELECT histogram_numeric(key, 3) FROM DECIMAL_UDF; 
 SELECT histogram_numeric(key, 3) FROM DECIMAL_UDF; 
 
+-- min
+EXPLAIN SELECT MIN(key) FROM DECIMAL_UDF;
+SELECT MIN(key) FROM DECIMAL_UDF;
+
+-- max
+EXPLAIN SELECT MAX(key) FROM DECIMAL_UDF;
+SELECT MAX(key) FROM DECIMAL_UDF;
+
+-- count
+EXPLAIN SELECT COUNT(key) FROM DECIMAL_UDF;
+SELECT COUNT(key) FROM DECIMAL_UDF;
+
 DROP TABLE IF EXISTS DECIMAL_UDF;

Added: hive/branches/branch-0.11/ql/src/test/results/clientnegative/decimal_precision.q.out
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.11/ql/src/test/results/clientnegative/decimal_precision.q.out?rev=1468427&view=auto
==============================================================================
--- hive/branches/branch-0.11/ql/src/test/results/clientnegative/decimal_precision.q.out (added)
+++ hive/branches/branch-0.11/ql/src/test/results/clientnegative/decimal_precision.q.out Tue Apr 16 14:23:20 2013
@@ -0,0 +1,16 @@
+PREHOOK: query: DROP TABLE IF EXISTS DECIMAL_PRECISION
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS DECIMAL_PRECISION
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE DECIMAL_PRECISION(dec decimal) 
+ROW FORMAT DELIMITED
+   FIELDS TERMINATED BY ' '
+STORED AS TEXTFILE
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE DECIMAL_PRECISION(dec decimal) 
+ROW FORMAT DELIMITED
+   FIELDS TERMINATED BY ' '
+STORED AS TEXTFILE
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@DECIMAL_PRECISION
+FAILED: SemanticException [Error 10029]: Line 3:13 Invalid numerical constant '123456789012345678901234567890.123456789bd'

Added: hive/branches/branch-0.11/ql/src/test/results/clientnegative/decimal_precision_1.q.out
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.11/ql/src/test/results/clientnegative/decimal_precision_1.q.out?rev=1468427&view=auto
==============================================================================
--- hive/branches/branch-0.11/ql/src/test/results/clientnegative/decimal_precision_1.q.out (added)
+++ hive/branches/branch-0.11/ql/src/test/results/clientnegative/decimal_precision_1.q.out Tue Apr 16 14:23:20 2013
@@ -0,0 +1,16 @@
+PREHOOK: query: DROP TABLE IF EXISTS DECIMAL_PRECISION
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE IF EXISTS DECIMAL_PRECISION
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: CREATE TABLE DECIMAL_PRECISION(dec decimal) 
+ROW FORMAT DELIMITED
+   FIELDS TERMINATED BY ' '
+STORED AS TEXTFILE
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE DECIMAL_PRECISION(dec decimal) 
+ROW FORMAT DELIMITED
+   FIELDS TERMINATED BY ' '
+STORED AS TEXTFILE
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@DECIMAL_PRECISION
+FAILED: SemanticException [Error 10029]: Line 3:44 Invalid numerical constant '1234567890123456789.0123456789bd'

Modified: hive/branches/branch-0.11/ql/src/test/results/clientpositive/decimal_precision.q.out
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.11/ql/src/test/results/clientpositive/decimal_precision.q.out?rev=1468427&r1=1468426&r2=1468427&view=diff
==============================================================================
--- hive/branches/branch-0.11/ql/src/test/results/clientpositive/decimal_precision.q.out (original)
+++ hive/branches/branch-0.11/ql/src/test/results/clientpositive/decimal_precision.q.out Tue Apr 16 14:23:20 2013
@@ -514,6 +514,50 @@ POSTHOOK: type: QUERY
 POSTHOOK: Input: default@decimal_precision
 #### A masked pattern was here ####
 NULL	NULL
+PREHOOK: query: SELECT dec * cast('123456789012345678901234567890.123456789' as decimal) FROM DECIMAL_PRECISION LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@decimal_precision
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT dec * cast('123456789012345678901234567890.123456789' as decimal) FROM DECIMAL_PRECISION LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@decimal_precision
+#### A masked pattern was here ####
+NULL
+PREHOOK: query: SELECT * from DECIMAL_PRECISION WHERE dec > cast('123456789012345678901234567890.123456789' as decimal) LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@decimal_precision
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT * from DECIMAL_PRECISION WHERE dec > cast('123456789012345678901234567890.123456789' as decimal) LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@decimal_precision
+#### A masked pattern was here ####
+PREHOOK: query: SELECT dec * 123456789012345678901234567890.123456789 FROM DECIMAL_PRECISION LIMIT 1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@decimal_precision
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT dec * 123456789012345678901234567890.123456789 FROM DECIMAL_PRECISION LIMIT 1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@decimal_precision
+#### A masked pattern was here ####
+NULL
+PREHOOK: query: SELECT MIN(cast('123456789012345678901234567890.123456789' as decimal)) FROM DECIMAL_PRECISION
+PREHOOK: type: QUERY
+PREHOOK: Input: default@decimal_precision
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT MIN(cast('123456789012345678901234567890.123456789' as decimal)) FROM DECIMAL_PRECISION
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@decimal_precision
+#### A masked pattern was here ####
+NULL
+PREHOOK: query: SELECT COUNT(cast('123456789012345678901234567890.123456789' as decimal)) FROM DECIMAL_PRECISION
+PREHOOK: type: QUERY
+PREHOOK: Input: default@decimal_precision
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT COUNT(cast('123456789012345678901234567890.123456789' as decimal)) FROM DECIMAL_PRECISION
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@decimal_precision
+#### A masked pattern was here ####
+0
 PREHOOK: query: DROP TABLE DECIMAL_PRECISION
 PREHOOK: type: DROPTABLE
 PREHOOK: Input: default@decimal_precision

Modified: hive/branches/branch-0.11/ql/src/test/results/clientpositive/decimal_udf.q.out
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.11/ql/src/test/results/clientpositive/decimal_udf.q.out?rev=1468427&r1=1468426&r2=1468427&view=diff
==============================================================================
--- hive/branches/branch-0.11/ql/src/test/results/clientpositive/decimal_udf.q.out (original)
+++ hive/branches/branch-0.11/ql/src/test/results/clientpositive/decimal_udf.q.out Tue Apr 16 14:23:20 2013
@@ -2482,6 +2482,216 @@ POSTHOOK: type: QUERY
 POSTHOOK: Input: default@decimal_udf
 #### A masked pattern was here ####
 [{"x":-1.2345678901234567E9,"y":1.0},{"x":-148.75058823529412,"y":34.0},{"x":1.2345678901234567E9,"y":1.0}]
+PREHOOK: query: -- min
+EXPLAIN SELECT MIN(key) FROM DECIMAL_UDF
+PREHOOK: type: QUERY
+POSTHOOK: query: -- min
+EXPLAIN SELECT MIN(key) FROM DECIMAL_UDF
+POSTHOOK: type: QUERY
+ABSTRACT SYNTAX TREE:
+  (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME DECIMAL_UDF))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION MIN (TOK_TABLE_OR_COL key))))))
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Alias -> Map Operator Tree:
+        decimal_udf 
+          TableScan
+            alias: decimal_udf
+            Select Operator
+              expressions:
+                    expr: key
+                    type: decimal
+              outputColumnNames: key
+              Group By Operator
+                aggregations:
+                      expr: min(key)
+                bucketGroup: false
+                mode: hash
+                outputColumnNames: _col0
+                Reduce Output Operator
+                  sort order: 
+                  tag: -1
+                  value expressions:
+                        expr: _col0
+                        type: decimal
+      Reduce Operator Tree:
+        Group By Operator
+          aggregations:
+                expr: min(VALUE._col0)
+          bucketGroup: false
+          mode: mergepartial
+          outputColumnNames: _col0
+          Select Operator
+            expressions:
+                  expr: _col0
+                  type: decimal
+            outputColumnNames: _col0
+            File Output Operator
+              compressed: false
+              GlobalTableId: 0
+              table:
+                  input format: org.apache.hadoop.mapred.TextInputFormat
+                  output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+
+
+PREHOOK: query: SELECT MIN(key) FROM DECIMAL_UDF
+PREHOOK: type: QUERY
+PREHOOK: Input: default@decimal_udf
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT MIN(key) FROM DECIMAL_UDF
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@decimal_udf
+#### A masked pattern was here ####
+-1234567890.123456789
+PREHOOK: query: -- max
+EXPLAIN SELECT MAX(key) FROM DECIMAL_UDF
+PREHOOK: type: QUERY
+POSTHOOK: query: -- max
+EXPLAIN SELECT MAX(key) FROM DECIMAL_UDF
+POSTHOOK: type: QUERY
+ABSTRACT SYNTAX TREE:
+  (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME DECIMAL_UDF))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION MAX (TOK_TABLE_OR_COL key))))))
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Alias -> Map Operator Tree:
+        decimal_udf 
+          TableScan
+            alias: decimal_udf
+            Select Operator
+              expressions:
+                    expr: key
+                    type: decimal
+              outputColumnNames: key
+              Group By Operator
+                aggregations:
+                      expr: max(key)
+                bucketGroup: false
+                mode: hash
+                outputColumnNames: _col0
+                Reduce Output Operator
+                  sort order: 
+                  tag: -1
+                  value expressions:
+                        expr: _col0
+                        type: decimal
+      Reduce Operator Tree:
+        Group By Operator
+          aggregations:
+                expr: max(VALUE._col0)
+          bucketGroup: false
+          mode: mergepartial
+          outputColumnNames: _col0
+          Select Operator
+            expressions:
+                  expr: _col0
+                  type: decimal
+            outputColumnNames: _col0
+            File Output Operator
+              compressed: false
+              GlobalTableId: 0
+              table:
+                  input format: org.apache.hadoop.mapred.TextInputFormat
+                  output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+
+
+PREHOOK: query: SELECT MAX(key) FROM DECIMAL_UDF
+PREHOOK: type: QUERY
+PREHOOK: Input: default@decimal_udf
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT MAX(key) FROM DECIMAL_UDF
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@decimal_udf
+#### A masked pattern was here ####
+1234567890.12345678
+PREHOOK: query: -- count
+EXPLAIN SELECT COUNT(key) FROM DECIMAL_UDF
+PREHOOK: type: QUERY
+POSTHOOK: query: -- count
+EXPLAIN SELECT COUNT(key) FROM DECIMAL_UDF
+POSTHOOK: type: QUERY
+ABSTRACT SYNTAX TREE:
+  (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME DECIMAL_UDF))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_FUNCTION COUNT (TOK_TABLE_OR_COL key))))))
+
+STAGE DEPENDENCIES:
+  Stage-1 is a root stage
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-1
+    Map Reduce
+      Alias -> Map Operator Tree:
+        decimal_udf 
+          TableScan
+            alias: decimal_udf
+            Select Operator
+              expressions:
+                    expr: key
+                    type: decimal
+              outputColumnNames: key
+              Group By Operator
+                aggregations:
+                      expr: count(key)
+                bucketGroup: false
+                mode: hash
+                outputColumnNames: _col0
+                Reduce Output Operator
+                  sort order: 
+                  tag: -1
+                  value expressions:
+                        expr: _col0
+                        type: bigint
+      Reduce Operator Tree:
+        Group By Operator
+          aggregations:
+                expr: count(VALUE._col0)
+          bucketGroup: false
+          mode: mergepartial
+          outputColumnNames: _col0
+          Select Operator
+            expressions:
+                  expr: _col0
+                  type: bigint
+            outputColumnNames: _col0
+            File Output Operator
+              compressed: false
+              GlobalTableId: 0
+              table:
+                  input format: org.apache.hadoop.mapred.TextInputFormat
+                  output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+
+
+PREHOOK: query: SELECT COUNT(key) FROM DECIMAL_UDF
+PREHOOK: type: QUERY
+PREHOOK: Input: default@decimal_udf
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT COUNT(key) FROM DECIMAL_UDF
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@decimal_udf
+#### A masked pattern was here ####
+36
 PREHOOK: query: DROP TABLE IF EXISTS DECIMAL_UDF
 PREHOOK: type: DROPTABLE
 PREHOOK: Input: default@decimal_udf

Modified: hive/branches/branch-0.11/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.11/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java?rev=1468427&r1=1468426&r2=1468427&view=diff
==============================================================================
--- hive/branches/branch-0.11/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java (original)
+++ hive/branches/branch-0.11/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorConverter.java Tue Apr 16 14:23:20 2013
@@ -276,10 +276,14 @@ public class PrimitiveObjectInspectorCon
       if (input == null) {
         return null;
       }
-      return outputOI.set(r, PrimitiveObjectInspectorUtils.getHiveDecimal(input,
-          inputOI));
+      
+      try {
+        return outputOI.set(r, PrimitiveObjectInspectorUtils.getHiveDecimal(input,
+            inputOI));
+      } catch (NumberFormatException e) {
+        return null;
+      }
     }
-
   }
 
   public static class BinaryConverter implements Converter{

Modified: hive/branches/branch-0.11/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java
URL: http://svn.apache.org/viewvc/hive/branches/branch-0.11/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java?rev=1468427&r1=1468426&r2=1468427&view=diff
==============================================================================
--- hive/branches/branch-0.11/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java (original)
+++ hive/branches/branch-0.11/serde/src/java/org/apache/hadoop/hive/serde2/objectinspector/primitive/PrimitiveObjectInspectorUtils.java Tue Apr 16 14:23:20 2013
@@ -778,52 +778,48 @@ public final class PrimitiveObjectInspec
     }
 
     HiveDecimal result = null;
-    try {
-      switch (oi.getPrimitiveCategory()) {
-      case VOID:
-        result = null;
-        break;
-      case BOOLEAN:
-        result = ((BooleanObjectInspector) oi).get(o) ?
-            HiveDecimal.ONE : HiveDecimal.ZERO;
-        break;
-      case BYTE:
-        result = new HiveDecimal(((ByteObjectInspector) oi).get(o));
-        break;
-      case SHORT:
-        result = new HiveDecimal(((ShortObjectInspector) oi).get(o));
-        break;
-      case INT:
-        result = new HiveDecimal(((IntObjectInspector) oi).get(o));
-        break;
-      case LONG:
-        result = new HiveDecimal(((LongObjectInspector) oi).get(o));
-        break;
-      case FLOAT:
-        Float f = ((FloatObjectInspector) oi).get(o);
-        result = new HiveDecimal(f.toString());
-        break;
-      case DOUBLE:
-        Double d = ((DoubleObjectInspector) oi).get(o);
-        result = new HiveDecimal(d.toString());
-        break;
-      case STRING:
-        result = new HiveDecimal(((StringObjectInspector) oi).getPrimitiveJavaObject(o));
-        break;
-      case TIMESTAMP:
-        Double ts = ((TimestampObjectInspector) oi).getPrimitiveWritableObject(o)
+    switch (oi.getPrimitiveCategory()) {
+    case VOID:
+      result = null;
+      break;
+    case BOOLEAN:
+      result = ((BooleanObjectInspector) oi).get(o) ?
+        HiveDecimal.ONE : HiveDecimal.ZERO;
+      break;
+    case BYTE:
+      result = new HiveDecimal(((ByteObjectInspector) oi).get(o));
+      break;
+    case SHORT:
+      result = new HiveDecimal(((ShortObjectInspector) oi).get(o));
+      break;
+    case INT:
+      result = new HiveDecimal(((IntObjectInspector) oi).get(o));
+      break;
+    case LONG:
+      result = new HiveDecimal(((LongObjectInspector) oi).get(o));
+      break;
+    case FLOAT:
+      Float f = ((FloatObjectInspector) oi).get(o);
+      result = new HiveDecimal(f.toString());
+      break;
+    case DOUBLE:
+      Double d = ((DoubleObjectInspector) oi).get(o);
+      result = new HiveDecimal(d.toString());
+      break;
+    case STRING:
+      result = new HiveDecimal(((StringObjectInspector) oi).getPrimitiveJavaObject(o));
+      break;
+    case TIMESTAMP:
+      Double ts = ((TimestampObjectInspector) oi).getPrimitiveWritableObject(o)
         .getDouble();
-        result = new HiveDecimal(ts.toString());
-        break;
-      case DECIMAL:
-        result = ((HiveDecimalObjectInspector) oi).getPrimitiveJavaObject(o);
-        break;
-      default:
-        throw new RuntimeException("Hive 2 Internal error: unknown type: "
-            + oi.getTypeName());
-      }
-    } catch(NumberFormatException e) {
-      // return null
+      result = new HiveDecimal(ts.toString());
+      break;
+    case DECIMAL:
+      result = ((HiveDecimalObjectInspector) oi).getPrimitiveJavaObject(o);
+      break;
+    default:
+      throw new RuntimeException("Hive 2 Internal error: unknown type: "
+                                 + oi.getTypeName());
     }
     return result;
   }