Describe the bug, including details regarding any error messages, version, and platform.
On 19.0.0 (and on master), calling setPosition on a ListVector that came off the wire via IPC with valueCount == 0 throws IndexOutOfBoundsException.
Some callers may hit this without touching setPosition themselves as
SingleStructReaderImpl.reader(String) calls setPosition(idx()) the first time a child reader on a struct is looked up.
UnionMapReader inherits from UnionListReader and breaks the same way.
UnionLargeListReader has a related variant; capacity guard seems to be missing and it fails whenever the offset buffer is shorter than (idx + 2) * 8 bytes.
The reader code hasn't changed. ListVector.setReaderAndWriterIndex changes and now correctly emits the leading [0] offset when valueCount == 0 (as per the Arrow spec), so the receiver's offset buffer is no longer "zero-capacity" and if block capacity() == 0 never enters.
Repro
The shape we actually hit — a struct with a list-typed child, struct itself having valueCount == 0:
StructVector parent = ...; // child "l" is LIST<INT>, valueCount == 0
parent.getReader().reader("l"); // IOOBE
Describe the bug, including details regarding any error messages, version, and platform.
On 19.0.0 (and on master), calling
setPositionon aListVectorthat came off the wire via IPC withvalueCount == 0throwsIndexOutOfBoundsException.Some callers may hit this without touching
setPositionthemselves asSingleStructReaderImpl.reader(String)callssetPosition(idx())the first time a child reader on a struct is looked up.UnionMapReaderinherits fromUnionListReaderand breaks the same way.UnionLargeListReaderhas a related variant; capacity guard seems to be missing and it fails whenever the offset buffer is shorter than(idx + 2) * 8bytes.The reader code hasn't changed.
ListVector.setReaderAndWriterIndexchanges and now correctly emits the leading[0]offset whenvalueCount == 0(as per the Arrow spec), so the receiver's offset buffer is no longer "zero-capacity" and if blockcapacity() == 0never enters.Repro
The shape we actually hit — a struct with a list-typed child, struct itself having
valueCount == 0: