aboutsummaryrefslogtreecommitdiff
path: root/exec/java-exec/src/main
diff options
context:
space:
mode:
authorHanifi Gunes <hgunes@maprtech.com>2014-08-12 18:57:51 -0700
committerAditya Kishore <aditya@maprtech.com>2014-08-18 14:56:51 +0530
commit88c1b92fe6750a1224cfd2530d9d024e1f9aa453 (patch)
tree08f5c4ccd781613bd9582489a93765c19ca4c709 /exec/java-exec/src/main
parentdb7627434a313d2af926cbd5977eddaccacc60b6 (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.java33
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;
}