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());

Reply via email to