diff options
author | Salim Achouche <sachouche2@gmail.com> | 2018-06-29 19:58:12 -0700 |
---|---|---|
committer | Boaz Ben-Zvi <boaz@mapr.com> | 2018-07-06 10:44:28 -0700 |
commit | aee899c1b26ebb9a5781d280d5a73b42c273d4d5 (patch) | |
tree | 850670646afd488ee65eec4fd6e22142f7ebb083 /exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders | |
parent | 287adec537f654e548404d1d337133fd21a1a937 (diff) |
DRILL-6570: Fixed IndexOutofBoundException in Parquet Reader
Diffstat (limited to 'exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders')
-rw-r--r-- | exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders/VarLenColumnBulkEntry.java | 32 |
1 files changed, 12 insertions, 20 deletions
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders/VarLenColumnBulkEntry.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders/VarLenColumnBulkEntry.java index bc7741553..e37700a3f 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders/VarLenColumnBulkEntry.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders/VarLenColumnBulkEntry.java @@ -18,7 +18,7 @@ package org.apache.drill.exec.store.parquet.columnreaders; import org.apache.drill.exec.store.parquet.columnreaders.VarLenColumnBulkInput.ColumnPrecisionInfo; -import org.apache.drill.exec.store.parquet.columnreaders.VarLenColumnBulkInput.ColumnPrecisionType; +import org.apache.drill.exec.vector.UInt4Vector; import org.apache.drill.exec.vector.VarLenBulkEntry; import io.netty.buffer.DrillBuf; @@ -55,25 +55,17 @@ final class VarLenColumnBulkEntry implements VarLenBulkEntry { } VarLenColumnBulkEntry(ColumnPrecisionInfo columnPrecInfo, int buffSz) { - int lengthSz = -1; - int dataSz = -1; - - if (ColumnPrecisionType.isPrecTypeFixed(columnPrecInfo.columnPrecisionType)) { - final int expectedDataLen = columnPrecInfo.precision; - final int maxNumValues = buffSz / (4 + expectedDataLen); - lengthSz = maxNumValues; - dataSz = maxNumValues * expectedDataLen + PADDING; - - } else { - // For variable length data, we need to handle a) maximum number of entries and b) max entry length - final int smallestDataLen = 1; - final int largestDataLen = buffSz - 4; - final int maxNumValues = buffSz / (4 + smallestDataLen); - lengthSz = maxNumValues; - dataSz = largestDataLen + PADDING; - } - - this.lengths = new int[lengthSz]; + + // For variable length data, we need to handle a) maximum number of entries + // and b) max entry length. Note that we don't optimize for fixed length + // columns as the reader can notice a false-positive (that is, the first + // values were fixed but not the rest). + final int largestDataLen = buffSz - UInt4Vector.VALUE_WIDTH; + final int maxNumValues = buffSz / UInt4Vector.VALUE_WIDTH; + final int lengthSz = maxNumValues; + final int dataSz = largestDataLen + PADDING; + + this.lengths = new int[lengthSz]; this.internalArray = new byte[dataSz]; } |