diff --git a/ql/src/test/org/apache/hadoop/hive/ql/io/orc/TestOrcFile.java b/ql/src/test/org/apache/hadoop/hive/ql/io/orc/TestOrcFile.java index a7e657c..1af1921 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/io/orc/TestOrcFile.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/io/orc/TestOrcFile.java @@ -25,6 +25,7 @@ import java.io.File; import java.io.IOException; +import java.math.BigDecimal; import java.math.BigInteger; import java.nio.ByteBuffer; import java.sql.Date; @@ -108,6 +109,14 @@ @RunWith(value = Parameterized.class) public class TestOrcFile { + public static class DecimalStruct { + HiveDecimalWritable dec; + + DecimalStruct(HiveDecimalWritable hdw) { + this.dec = hdw; + } + } + public static class SimpleStruct { BytesWritable bytes1; Text string1; @@ -541,6 +550,36 @@ public void testTimestamp() throws Exception { } @Test + public void testHiveDecimalAllNulls() throws Exception { + ObjectInspector inspector; + synchronized (TestOrcFile.class) { + inspector = ObjectInspectorFactory.getReflectionObjectInspector + (DecimalStruct.class, ObjectInspectorFactory.ObjectInspectorOptions.JAVA); + } + + Writer writer = OrcFile.createWriter(testFilePath, + OrcFile.writerOptions(conf).inspector(inspector).stripeSize(100000).bufferSize(10000)); + // this is an invalid decimal value, getting HiveDecimal from it will return null + writer.addRow(new DecimalStruct(new HiveDecimalWritable("1.463040009E9".getBytes(), 8))); + writer.addRow(new DecimalStruct(null)); + writer.close(); + + Reader reader = OrcFile.createReader(testFilePath, + OrcFile.readerOptions(conf).filesystem(fs)); + StructObjectInspector readerInspector = + (StructObjectInspector) reader.getObjectInspector(); + List fields = readerInspector.getAllStructFieldRefs(); + HiveDecimalObjectInspector doi = (HiveDecimalObjectInspector) readerInspector. + getStructFieldRef("dec").getFieldObjectInspector(); + RecordReader rows = reader.rows(null); + while (rows.hasNext()) { + Object row = rows.next(null); + assertEquals(null, doi.getPrimitiveWritableObject(readerInspector.getStructFieldData(row, + fields.get(0)))); + } + } + + @Test public void testStringAndBinaryStatistics() throws Exception { ObjectInspector inspector; diff --git a/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/DecimalColumnVector.java b/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/DecimalColumnVector.java index fe8ad85..1523ff6 100644 --- a/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/DecimalColumnVector.java +++ b/storage-api/src/java/org/apache/hadoop/hive/ql/exec/vector/DecimalColumnVector.java @@ -108,12 +108,17 @@ public void stringifyValue(StringBuilder buffer, int row) { } public void set(int elementNum, HiveDecimalWritable writeable) { - HiveDecimal hiveDec = writeable.getHiveDecimal(precision, scale); - if (hiveDec == null) { + if (writeable == null) { noNulls = false; isNull[elementNum] = true; } else { - vector[elementNum].set(hiveDec); + HiveDecimal hiveDec = writeable.getHiveDecimal(precision, scale); + if (hiveDec == null) { + noNulls = false; + isNull[elementNum] = true; + } else { + vector[elementNum].set(hiveDec); + } } }