Repository: incubator-drill Updated Branches: refs/heads/master f7688be48 -> d616259d3
setSafe() in variable length vector should check has capacity to hold new value. Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/6c3d59e5 Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/6c3d59e5 Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/6c3d59e5 Branch: refs/heads/master Commit: 6c3d59e558210fd570bd9e95108de22456b178f4 Parents: 27e2213 Author: Jinfeng Ni <[email protected]> Authored: Thu May 22 07:57:07 2014 -0700 Committer: Jinfeng Ni <[email protected]> Committed: Thu May 22 14:45:18 2014 -0700 ---------------------------------------------------------------------- .../src/main/codegen/templates/VariableLengthVectors.java | 3 +++ .../org/apache/drill/exec/physical/impl/WireRecordBatch.java | 4 +++- .../drill/exec/store/parquet/VarLengthColumnReaders.java | 8 ++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/6c3d59e5/exec/java-exec/src/main/codegen/templates/VariableLengthVectors.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/codegen/templates/VariableLengthVectors.java b/exec/java-exec/src/main/codegen/templates/VariableLengthVectors.java index 990ae1d..cc6f5e7 100644 --- a/exec/java-exec/src/main/codegen/templates/VariableLengthVectors.java +++ b/exec/java-exec/src/main/codegen/templates/VariableLengthVectors.java @@ -352,6 +352,8 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V public boolean setSafe(int index, byte[] bytes) { assert index >= 0; + if(index >= getValueCapacity()) return false; + int currentOffset = offsetVector.getAccessor().get(index); if (data.capacity() < currentOffset + bytes.length) { allocationMonitor--; @@ -382,6 +384,7 @@ public final class ${minor.class}Vector extends BaseDataValueVector implements V public boolean setSafe(int index, byte[] bytes, int start, int length) { assert index >= 0; + if(index >= getValueCapacity()) return false; int currentOffset = offsetVector.getAccessor().get(index); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/6c3d59e5/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/WireRecordBatch.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/WireRecordBatch.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/WireRecordBatch.java index d9ac881..1163af0 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/WireRecordBatch.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/WireRecordBatch.java @@ -41,7 +41,9 @@ public class WireRecordBatch implements RecordBatch { public WireRecordBatch(FragmentContext context, RawFragmentBatchProvider fragProvider) throws OutOfMemoryException { this.fragProvider = fragProvider; this.context = context; - this.batchLoader = new RecordBatchLoader(null); + // In normal case, batchLoader does not require an allocator. However, in case of splitAndTransfer of a value vector, + // we may need an allocator for the new offset vector. Therefore, here we pass the context's allocator to batchLoader. + this.batchLoader = new RecordBatchLoader(context.getAllocator()); } @Override http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/6c3d59e5/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/VarLengthColumnReaders.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/VarLengthColumnReaders.java b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/VarLengthColumnReaders.java index f0f2146..bbc669d 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/VarLengthColumnReaders.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/store/parquet/VarLengthColumnReaders.java @@ -228,6 +228,8 @@ public class VarLengthColumnReaders { @Override public boolean setSafe(int index, byte[] bytes, int start, int length) { boolean success; + if(index >= varCharVector.getValueCapacity()) return false; + if (usingDictionary) { success = varCharVector.getMutator().setSafe(valuesReadInCurrentPass, currDictVal.getBytes(), 0, currDictVal.length()); @@ -260,6 +262,8 @@ public class VarLengthColumnReaders { public boolean setSafe(int index, byte[] value, int start, int length) { boolean success; + if(index >= nullableVarCharVector.getValueCapacity()) return false; + if (usingDictionary) { success = nullableVarCharVector.getMutator().setSafe(valuesReadInCurrentPass, currDictVal.getBytes(), 0, currDictVal.length()); @@ -301,6 +305,8 @@ public class VarLengthColumnReaders { @Override public boolean setSafe(int index, byte[] bytes, int start, int length) { boolean success; + if(index >= varBinaryVector.getValueCapacity()) return false; + if (usingDictionary) { success = varBinaryVector.getMutator().setSafe(valuesReadInCurrentPass, currDictVal.getBytes(), 0, currDictVal.length()); @@ -333,6 +339,8 @@ public class VarLengthColumnReaders { public boolean setSafe(int index, byte[] value, int start, int length) { boolean success; + if(index >= nullableVarBinaryVector.getValueCapacity()) return false; + if (usingDictionary) { success = nullableVarBinaryVector.getMutator().setSafe(valuesReadInCurrentPass, currDictVal.getBytes(), 0, currDictVal.length());
