Timothy Farkas commented on DRILL-6234:

Hi [~paul-rogers], I agree with your analysis. What I tried doing was having 
the vector remember it's value count without being explicitly told it. In the 
case of variable length vectors the value count is effectively last index 
written to + 1. If someone set a larger value count we would simply increase 
the size of the offset vector but internally use the last written index + 1 as 
the effective value count. If someone sets a smaller value count than the 
current, then we trim the vector as the method does now. I got things to work 
as I wanted in isolation, but things broke down in the integration tests when 
transferTo, load, and getMetadata were called. Then I realized how pointless 
this whole thing was and you were right all along :) and gave up. I'm going to 
salvage some of the Javadoc and unit tests I wrote and supplement it with some 
of your explanation in an effort to prevent other people from being confused by 
this. I'll open a small PR with the documentation improvements and tag you on 

> VarCharVector setValueCount can throw IndexOutOfBoundsException
> ---------------------------------------------------------------
>                 Key: DRILL-6234
>                 URL: https://issues.apache.org/jira/browse/DRILL-6234
>             Project: Apache Drill
>          Issue Type: Improvement
>            Reporter: Timothy Farkas
>            Assignee: Timothy Farkas
>            Priority: Major
> Doing the following will throw an Index out of bounds exception.
> {code}
>       final VarCharVector vector = new VarCharVector(field, allocator);
>       vector.allocateNew();
>       vector.getMutator().setValueCount(100);
> {code}
> The expected behavior is to resize the array appropriately. If an index is 
> uninitialized you should not call get for that index.
> {code}
>       at 
> org.apache.drill.exec.memory.BoundsChecking.checkIndex(BoundsChecking.java:80)
>       at 
> org.apache.drill.exec.memory.BoundsChecking.lengthCheck(BoundsChecking.java:86)
>       at io.netty.buffer.DrillBuf.chk(DrillBuf.java:114)
>       at io.netty.buffer.DrillBuf.getInt(DrillBuf.java:484)
>       at 
> org.apache.drill.exec.vector.UInt4Vector$Accessor.get(UInt4Vector.java:432)
>       at 
> org.apache.drill.exec.vector.VarCharVector$Mutator.setValueCount(VarCharVector.java:729)
>       at 
> org.apache.drill.exec.vector.VarCharVectorTest.testExpandingNonEmptyVectorSetValueCount(VarCharVectorTest.java:97)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at java.lang.reflect.Method.invoke(Method.java:606)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at java.lang.reflect.Method.invoke(Method.java:606)
>       at 
> com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
>       at 
> com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
>       at 
> com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
>       at 
> com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
> {code}

This message was sent by Atlassian JIRA

Reply via email to