diff --git a/java/vector/src/main/java/org/apache/arrow/vector/BaseLargeVariableWidthVector.java b/java/vector/src/main/java/org/apache/arrow/vector/BaseLargeVariableWidthVector.java index c239edbcc3c29..0d458e94a7257 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/BaseLargeVariableWidthVector.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/BaseLargeVariableWidthVector.java @@ -73,7 +73,8 @@ public BaseLargeVariableWidthVector(Field field, final BufferAllocator allocator lastValueCapacity = INITIAL_VALUE_ALLOCATION - 1; valueCount = 0; lastSet = -1; - offsetBuffer = allocator.getEmpty(); + // According to Arrow spec, the offsets buffer contains length + 1 elements + allocateOffsetBuffer(OFFSET_WIDTH); validityBuffer = allocator.getEmpty(); valueBuffer = allocator.getEmpty(); } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/BaseVariableWidthVector.java b/java/vector/src/main/java/org/apache/arrow/vector/BaseVariableWidthVector.java index 4cf495a349f02..0d8b87d3a68d5 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/BaseVariableWidthVector.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/BaseVariableWidthVector.java @@ -74,7 +74,8 @@ public BaseVariableWidthVector(Field field, final BufferAllocator allocator) { lastValueCapacity = INITIAL_VALUE_ALLOCATION - 1; valueCount = 0; lastSet = -1; - offsetBuffer = allocator.getEmpty(); + // According to Arrow spec, the offsets buffer contains length + 1 elements + allocateOffsetBuffer(OFFSET_WIDTH); validityBuffer = allocator.getEmpty(); valueBuffer = allocator.getEmpty(); } diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/BaseRepeatedValueVector.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/BaseRepeatedValueVector.java index 8ba2e48dc2fa3..c02c6c0561f7c 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/complex/BaseRepeatedValueVector.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/BaseRepeatedValueVector.java @@ -68,7 +68,8 @@ protected BaseRepeatedValueVector(String name, BufferAllocator allocator, CallBa protected BaseRepeatedValueVector(String name, BufferAllocator allocator, FieldVector vector, CallBack callBack) { super(allocator); this.name = name; - this.offsetBuffer = allocator.getEmpty(); + // According to Arrow spec, the offsets buffer contains length + 1 elements + allocateOffsetBuffer(OFFSET_WIDTH); this.vector = Preconditions.checkNotNull(vector, "data vector cannot be null"); this.repeatedCallBack = callBack; this.valueCount = 0; diff --git a/java/vector/src/test/java/org/apache/arrow/vector/TestLargeVarCharVector.java b/java/vector/src/test/java/org/apache/arrow/vector/TestLargeVarCharVector.java index 62d09da86d652..a89e6aa055008 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/TestLargeVarCharVector.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/TestLargeVarCharVector.java @@ -68,6 +68,13 @@ public void shutdown() { allocator.close(); } + @Test + public void testEmptyLargeVarCharVector() { + LargeVarCharVector vector = new LargeVarCharVector("empty", allocator); + assertEquals(8, vector.getOffsetBuffer().capacity()); + vector.close(); + } + @Test public void testTransfer() { try (BufferAllocator childAllocator1 = allocator.newChildAllocator("child1", 1000000, 1000000); diff --git a/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java b/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java index 10091aebdd50b..9be62f368c017 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/TestValueVector.java @@ -315,6 +315,13 @@ public void testFixedType2() { } } + @Test + public void testEmptyVarCharVector() { + VarCharVector vector = new VarCharVector(EMPTY_SCHEMA_PATH, allocator); + assertEquals(4, vector.getOffsetBuffer().capacity()); + vector.close(); + } + @Test /* VarCharVector */ public void testSizeOfValueBuffer() { try (final VarCharVector vector = new VarCharVector(EMPTY_SCHEMA_PATH, allocator)) { @@ -3216,7 +3223,7 @@ public void testEmptyBufBehavior() { assertEquals(1, vector.getOffsetBuffer().refCnt()); assertEquals(0, vector.getDataBuffer().capacity()); assertEquals(0, vector.getValidityBuffer().capacity()); - assertEquals(0, vector.getOffsetBuffer().capacity()); + assertEquals(4, vector.getOffsetBuffer().capacity()); vector.allocateNew(valueCount); assertEquals(1, vector.getDataBuffer().refCnt()); @@ -3239,7 +3246,7 @@ public void testEmptyBufBehavior() { assertEquals(1, vector.getValidityBuffer().refCnt()); assertEquals(1, vector.getOffsetBuffer().refCnt()); assertEquals(0, vector.getValidityBuffer().capacity()); - assertEquals(0, vector.getOffsetBuffer().capacity()); + assertEquals(4, vector.getOffsetBuffer().capacity()); vector.setValueCount(valueCount); vector.allocateNewSafe(); diff --git a/java/vector/src/test/java/org/apache/arrow/vector/TestVarCharListVector.java b/java/vector/src/test/java/org/apache/arrow/vector/TestVarCharListVector.java index bfe489fa5af4e..9e14b03ff468e 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/TestVarCharListVector.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/TestVarCharListVector.java @@ -44,6 +44,14 @@ public void terminate() throws Exception { allocator.close(); } + @Test + public void testEmptyVarCharList() { + ListVector vector = new ListVector("VarList", allocator, + FieldType.nullable(Types.MinorType.VARCHAR.getType()), null); + Assert.assertEquals(4, vector.getOffsetBuffer().capacity()); + vector.close(); + } + @Test public void testVarCharListWithNulls() { byte[] bytes = "a".getBytes(StandardCharsets.UTF_8);