aboutsummaryrefslogtreecommitdiff
path: root/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders
diff options
context:
space:
mode:
authorSalim Achouche <sachouche2@gmail.com>2018-06-29 19:58:12 -0700
committerBoaz Ben-Zvi <boaz@mapr.com>2018-07-06 10:44:28 -0700
commitaee899c1b26ebb9a5781d280d5a73b42c273d4d5 (patch)
tree850670646afd488ee65eec4fd6e22142f7ebb083 /exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/columnreaders
parent287adec537f654e548404d1d337133fd21a1a937 (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.java32
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];
}