diff options
author | Hanifi Gunes <hgunes@maprtech.com> | 2014-08-12 18:57:51 -0700 |
---|---|---|
committer | Aditya Kishore <aditya@maprtech.com> | 2014-08-18 14:56:51 +0530 |
commit | 88c1b92fe6750a1224cfd2530d9d024e1f9aa453 (patch) | |
tree | 08f5c4ccd781613bd9582489a93765c19ca4c709 /exec/java-exec/src/main | |
parent | db7627434a313d2af926cbd5977eddaccacc60b6 (diff) |
DRILL-1205: group by causes access to DeadBuf
* Fix an issue that causes calls to splitAndTransferTo malfunction on repeated vector types
Diffstat (limited to 'exec/java-exec/src/main')
-rw-r--r-- | exec/java-exec/src/main/codegen/templates/RepeatedValueVectors.java | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/exec/java-exec/src/main/codegen/templates/RepeatedValueVectors.java b/exec/java-exec/src/main/codegen/templates/RepeatedValueVectors.java index 7cbc50cb7..107a66794 100644 --- a/exec/java-exec/src/main/codegen/templates/RepeatedValueVectors.java +++ b/exec/java-exec/src/main/codegen/templates/RepeatedValueVectors.java @@ -49,8 +49,7 @@ package org.apache.drill.exec.vector; private int parentValueCount; private int childValueCount; - protected int sliceOffset = 0; - + private final UInt4Vector offsets; // offsets to start of each record private final ${minor.class}Vector values; private final Mutator mutator = new Mutator(); @@ -103,13 +102,16 @@ package org.apache.drill.exec.vector; } public void splitAndTransferTo(int startIndex, int length, Repeated${minor.class}Vector target) { - int startValue = offsets.getAccessor().get(startIndex); - int endValue = offsets.getAccessor().get(startIndex + length); - values.splitAndTransferTo(startValue, endValue - startValue, target.values); - offsets.splitAndTransferTo(startIndex, length, target.offsets); - target.parentValueCount = parentValueCount; - target.childValueCount = childValueCount; - sliceOffset = startIndex; + int startPos = offsets.getAccessor().get(startIndex); + int endPos = offsets.getAccessor().get(startIndex+length); + values.splitAndTransferTo(startIndex, endPos-startPos, target.values); + target.offsets.clear(); + target.offsets.allocateNew(length+1); + int normalizedPos = 0; + for (int i=0; i<length+1;i++) { + normalizedPos = offsets.getAccessor().get(startIndex+i) - startPos; + target.offsets.getMutator().set(i, normalizedPos); + } } private class TransferImpl implements TransferPair{ @@ -166,7 +168,6 @@ package org.apache.drill.exec.vector; if(!values.allocateNewSafe()) return false; mutator.reset(); accessor.reset(); - sliceOffset = 0; return true; } @@ -176,7 +177,6 @@ package org.apache.drill.exec.vector; values.allocateNew(); mutator.reset(); accessor.reset(); - sliceOffset = 0; } <#if type.major == "VarLen"> @@ -196,7 +196,6 @@ package org.apache.drill.exec.vector; values.allocateNew(totalBytes, childValueCount); mutator.reset(); accessor.reset(); - sliceOffset = 0; } @Override @@ -302,8 +301,8 @@ package org.apache.drill.exec.vector; public List<${friendlyType}> getObject(int index) { List<${friendlyType}> vals = new JsonStringArrayList(); - int start = offsets.getAccessor().get(index) - sliceOffset; - int end = offsets.getAccessor().get(index+1) - sliceOffset; + int start = offsets.getAccessor().get(index); + int end = offsets.getAccessor().get(index+1); for(int i = start; i < end; i++){ vals.add(values.getAccessor().getObject(i)); } @@ -326,7 +325,7 @@ package org.apache.drill.exec.vector; public <#if type.major == "VarLen">byte[] <#else>${minor.javaType!type.javaType} </#if> get(int index, int positionIndex) { - return values.getAccessor().get(offsets.getAccessor().get(index) - sliceOffset + positionIndex); + return values.getAccessor().get(offsets.getAccessor().get(index) + positionIndex); } @@ -335,8 +334,8 @@ package org.apache.drill.exec.vector; } public void get(int index, Repeated${minor.class}Holder holder){ - holder.start = offsets.getAccessor().get(index) - sliceOffset; - holder.end = offsets.getAccessor().get(index+1) - sliceOffset; + holder.start = offsets.getAccessor().get(index); + holder.end = offsets.getAccessor().get(index+1); holder.vector = values; } |