This is an automated email from the ASF dual-hosted git repository.

lidavidm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new cea7323772 GH-41968: [Java] Implement TransferPair functionality for 
BinaryView (#41980)
cea7323772 is described below

commit cea7323772beb5be6e5002624be36e6575a36418
Author: Vibhatha Lakmal Abeykoon <[email protected]>
AuthorDate: Thu Jun 6 13:07:11 2024 +0530

    GH-41968: [Java] Implement TransferPair functionality for BinaryView 
(#41980)
    
    ### Rationale for this change
    
    This PR contains the transferPair functionality for BinaryView vectors.
    
    ### What changes are included in this PR?
    
    This includes the addition of transferPair functionality in 
`ViewVarCharBinaryVector` and corresponding test cases.
    
    ### Are these changes tested?
    Yes
    
    ### Are there any user-facing changes?
    
    No
    * GitHub Issue: #41968
    
    Authored-by: Vibhatha Abeykoon <[email protected]>
    Signed-off-by: David Li <[email protected]>
---
 .../apache/arrow/vector/ViewVarBinaryVector.java   |  45 +-
 .../apache/arrow/vector/TestSplitAndTransfer.java  | 392 ++++++----
 .../apache/arrow/vector/TestVarCharViewVector.java | 814 ++++++++++++---------
 3 files changed, 756 insertions(+), 495 deletions(-)

diff --git 
a/java/vector/src/main/java/org/apache/arrow/vector/ViewVarBinaryVector.java 
b/java/vector/src/main/java/org/apache/arrow/vector/ViewVarBinaryVector.java
index 393df96b29..0a043b5106 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/ViewVarBinaryVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/ViewVarBinaryVector.java
@@ -205,14 +205,12 @@ public final class ViewVarBinaryVector extends 
BaseVariableWidthViewVector {
    */
   @Override
   public TransferPair getTransferPair(String ref, BufferAllocator allocator) {
-    // TODO: https://github.com/apache/arrow/issues/40932
-    throw new UnsupportedOperationException("Unsupported operation");
+    return new TransferImpl(ref, allocator);
   }
 
   @Override
   public TransferPair getTransferPair(Field field, BufferAllocator allocator) {
-    // TODO: https://github.com/apache/arrow/issues/40932
-    throw new UnsupportedOperationException("Unsupported operation");
+    return new TransferImpl(field, allocator);
   }
 
   /**
@@ -223,7 +221,42 @@ public final class ViewVarBinaryVector extends 
BaseVariableWidthViewVector {
    */
   @Override
   public TransferPair makeTransferPair(ValueVector to) {
-    // TODO: https://github.com/apache/arrow/issues/40932
-    throw new UnsupportedOperationException("Unsupported operation");
+    return new TransferImpl((ViewVarBinaryVector) to);
+  }
+
+  private class TransferImpl implements TransferPair {
+    ViewVarBinaryVector to;
+
+    public TransferImpl(String ref, BufferAllocator allocator) {
+      to = new ViewVarBinaryVector(ref, field.getFieldType(), allocator);
+    }
+
+    public TransferImpl(Field field, BufferAllocator allocator) {
+      to = new ViewVarBinaryVector(field, allocator);
+    }
+
+    public TransferImpl(ViewVarBinaryVector to) {
+      this.to = to;
+    }
+
+    @Override
+    public ViewVarBinaryVector getTo() {
+      return to;
+    }
+
+    @Override
+    public void transfer() {
+      transferTo(to);
+    }
+
+    @Override
+    public void splitAndTransfer(int startIndex, int length) {
+      splitAndTransferTo(startIndex, length, to);
+    }
+
+    @Override
+    public void copyValueSafe(int fromIndex, int toIndex) {
+      to.copyFromSafe(fromIndex, toIndex, ViewVarBinaryVector.this);
+    }
   }
 }
diff --git 
a/java/vector/src/test/java/org/apache/arrow/vector/TestSplitAndTransfer.java 
b/java/vector/src/test/java/org/apache/arrow/vector/TestSplitAndTransfer.java
index d2c03930ca..fece93de9b 100644
--- 
a/java/vector/src/test/java/org/apache/arrow/vector/TestSplitAndTransfer.java
+++ 
b/java/vector/src/test/java/org/apache/arrow/vector/TestSplitAndTransfer.java
@@ -67,7 +67,8 @@ public class TestSplitAndTransfer {
     vector.setValueCount(valueCount);
   }
 
-  private void populateViewVarcharVector(final ViewVarCharVector vector, int 
valueCount, String[] compareArray) {
+  private void populateBaseVariableWidthViewVector(final 
BaseVariableWidthViewVector vector, int valueCount,
+      String[] compareArray) {
     for (int i = 0; i < valueCount; i += 3) {
       final String s = String.format("%010d", i);
       vector.set(i, s.getBytes(StandardCharsets.UTF_8));
@@ -120,11 +121,16 @@ public class TestSplitAndTransfer {
     transferPair = varCharVector.getTransferPair(allocator);
     transferPair.splitAndTransfer(0, 0);
     assertEquals(0, transferPair.getTo().getValueCount());
-    // BaseVariableWidthViewVector
+    // BaseVariableWidthViewVector: ViewVarCharVector
     ViewVarCharVector viewVarCharVector = new ViewVarCharVector("", allocator);
     transferPair = viewVarCharVector.getTransferPair(allocator);
     transferPair.splitAndTransfer(0, 0);
     assertEquals(0, transferPair.getTo().getValueCount());
+    // BaseVariableWidthVector: ViewVarBinaryVector
+    ViewVarBinaryVector viewVarBinaryVector = new ViewVarBinaryVector("", 
allocator);
+    transferPair = viewVarBinaryVector.getTransferPair(allocator);
+    transferPair.splitAndTransfer(0, 0);
+    assertEquals(0, transferPair.getTo().getValueCount());
     // BaseLargeVariableWidthVector
     LargeVarCharVector largeVarCharVector = new LargeVarCharVector("", 
allocator);
     transferPair = largeVarCharVector.getTransferPair(allocator);
@@ -225,36 +231,46 @@ public class TestSplitAndTransfer {
     }
   }
 
-  @Test
-  public void testView() throws Exception {
-    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator)) {
-      viewVarCharVector.allocateNew(10000, 1000);
-
-      final int valueCount = 500;
-      final String[] compareArray = new String[valueCount];
+  private void testView(BaseVariableWidthViewVector vector) {
+    vector.allocateNew(10000, 1000);
+    final int valueCount = 500;
+    final String[] compareArray = new String[valueCount];
 
-      populateViewVarcharVector(viewVarCharVector, valueCount, compareArray);
+    populateBaseVariableWidthViewVector(vector, valueCount, compareArray);
 
-      final TransferPair tp = viewVarCharVector.getTransferPair(allocator);
-      final ViewVarCharVector newViewVarCharVector = (ViewVarCharVector) 
tp.getTo();
-      final int[][] startLengths = {{0, 201}, {201, 0}, {201, 200}, {401, 99}};
+    final TransferPair tp = vector.getTransferPair(allocator);
+    final BaseVariableWidthViewVector newVector = 
(BaseVariableWidthViewVector) tp.getTo();;
+    final int[][] startLengths = {{0, 201}, {201, 0}, {201, 200}, {401, 99}};
 
-      for (final int[] startLength : startLengths) {
-        final int start = startLength[0];
-        final int length = startLength[1];
-        tp.splitAndTransfer(start, length);
-        for (int i = 0; i < length; i++) {
-          final boolean expectedSet = ((start + i) % 3) == 0;
-          if (expectedSet) {
-            final byte[] expectedValue = compareArray[start + 
i].getBytes(StandardCharsets.UTF_8);
-            assertFalse(newViewVarCharVector.isNull(i));
-            assertArrayEquals(expectedValue, newViewVarCharVector.get(i));
-          } else {
-            assertTrue(newViewVarCharVector.isNull(i));
-          }
+    for (final int[] startLength : startLengths) {
+      final int start = startLength[0];
+      final int length = startLength[1];
+      tp.splitAndTransfer(start, length);
+      for (int i = 0; i < length; i++) {
+        final boolean expectedSet = ((start + i) % 3) == 0;
+        if (expectedSet) {
+          final byte[] expectedValue = compareArray[start + 
i].getBytes(StandardCharsets.UTF_8);
+          assertFalse(newVector.isNull(i));
+          assertArrayEquals(expectedValue, newVector.get(i));
+        } else {
+          assertTrue(newVector.isNull(i));
         }
-        newViewVarCharVector.clear();
       }
+      newVector.clear();
+    }
+  }
+
+  @Test
+  public void testUtf8View() {
+    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator)) {
+      testView(viewVarCharVector);
+    }
+  }
+
+  @Test
+  public void testBinaryView() throws Exception {
+    try (final ViewVarBinaryVector viewVarBinaryVector = new 
ViewVarBinaryVector("myvector", allocator)) {
+      testView(viewVarBinaryVector);
     }
   }
 
@@ -282,35 +298,47 @@ public class TestSplitAndTransfer {
     }
   }
 
-  @Test
-  public void testMemoryConstrainedTransferInViews() {
-    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator)) {
-      // Here we have the target vector being transferred with a long string
-      // hence, the data buffer will be allocated.
-      // The default data buffer allocation takes
-      // BaseVariableWidthViewVector.INITIAL_VIEW_VALUE_ALLOCATION * 
BaseVariableWidthViewVector.ELEMENT_SIZE
-      // set limit = BaseVariableWidthViewVector.INITIAL_VIEW_VALUE_ALLOCATION 
*
-      // BaseVariableWidthViewVector.ELEMENT_SIZE
-      final int setLimit = 
BaseVariableWidthViewVector.INITIAL_VIEW_VALUE_ALLOCATION *
-          BaseVariableWidthViewVector.ELEMENT_SIZE;
-      allocator.setLimit(setLimit);
-
-      viewVarCharVector.allocateNew(16000, 1000);
+  private void 
testMemoryConstrainedTransferInViews(BaseVariableWidthViewVector vector) {
+    // Here we have the target vector being transferred with a long string
+    // hence, the data buffer will be allocated.
+    // The default data buffer allocation takes
+    // BaseVariableWidthViewVector.INITIAL_VIEW_VALUE_ALLOCATION * 
BaseVariableWidthViewVector.ELEMENT_SIZE
+    // set limit = BaseVariableWidthViewVector.INITIAL_VIEW_VALUE_ALLOCATION *
+    // BaseVariableWidthViewVector.ELEMENT_SIZE
+    final int setLimit = 
BaseVariableWidthViewVector.INITIAL_VIEW_VALUE_ALLOCATION *
+        BaseVariableWidthViewVector.ELEMENT_SIZE;
+    allocator.setLimit(setLimit);
 
-      final int valueCount = 1000;
+    vector.allocateNew(16000, 1000);
 
-      populateViewVarcharVector(viewVarCharVector, valueCount, null);
+    final int valueCount = 1000;
 
-      final TransferPair tp = viewVarCharVector.getTransferPair(allocator);
-      final ViewVarCharVector newViewVarCharVector = (ViewVarCharVector) 
tp.getTo();
-      final int[][] startLengths = {{0, 700}, {700, 299}};
+    populateBaseVariableWidthViewVector(vector, valueCount, null);
 
-      for (final int[] startLength : startLengths) {
-        final int start = startLength[0];
-        final int length = startLength[1];
-        tp.splitAndTransfer(start, length);
-        newViewVarCharVector.clear();
-      }
+    final TransferPair tp = vector.getTransferPair(allocator);
+    final BaseVariableWidthViewVector newVector = 
(BaseVariableWidthViewVector) tp.getTo();
+
+    final int[][] startLengths = {{0, 700}, {700, 299}};
+
+    for (final int[] startLength : startLengths) {
+      final int start = startLength[0];
+      final int length = startLength[1];
+      tp.splitAndTransfer(start, length);
+      newVector.clear();
+    }
+  }
+
+  @Test
+  public void testMemoryConstrainedTransferInUtf8Views() {
+    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator)) {
+      testMemoryConstrainedTransferInViews(viewVarCharVector);
+    }
+  }
+
+  @Test
+  public void testMemoryConstrainedTransferInBinaryViews() {
+    try (final ViewVarBinaryVector viewVarBinaryVector = new 
ViewVarBinaryVector("myvector", allocator)) {
+      testMemoryConstrainedTransferInViews(viewVarBinaryVector);
     }
   }
 
@@ -345,34 +373,45 @@ public class TestSplitAndTransfer {
     }
   }
 
-  @Test
-  public void testTransferInViews() {
-    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator)) {
-      viewVarCharVector.allocateNew(16000, 1000);
+  private void testTransferInViews(BaseVariableWidthViewVector vector) {
+    vector.allocateNew(16000, 1000);
 
-      final int valueCount = 500;
-      final String[] compareArray = new String[valueCount];
-      populateViewVarcharVector(viewVarCharVector, valueCount, compareArray);
+    final int valueCount = 500;
+    final String[] compareArray = new String[valueCount];
+    populateBaseVariableWidthViewVector(vector, valueCount, compareArray);
 
-      final TransferPair tp = viewVarCharVector.getTransferPair(allocator);
-      final ViewVarCharVector newViewVarCharVector = (ViewVarCharVector) 
tp.getTo();
-      tp.transfer();
+    final TransferPair tp = vector.getTransferPair(allocator);
+    final BaseVariableWidthViewVector newVector = 
(BaseVariableWidthViewVector) tp.getTo();
+    tp.transfer();
 
-      assertEquals(0, viewVarCharVector.valueCount);
-      assertEquals(valueCount, newViewVarCharVector.valueCount);
+    assertEquals(0, vector.valueCount);
+    assertEquals(valueCount, newVector.valueCount);
 
-      for (int i = 0; i < valueCount; i++) {
-        final boolean expectedSet = (i % 3) == 0;
-        if (expectedSet) {
-          final byte[] expectedValue = 
compareArray[i].getBytes(StandardCharsets.UTF_8);
-          assertFalse(newViewVarCharVector.isNull(i));
-          assertArrayEquals(expectedValue, newViewVarCharVector.get(i));
-        } else {
-          assertTrue(newViewVarCharVector.isNull(i));
-        }
+    for (int i = 0; i < valueCount; i++) {
+      final boolean expectedSet = (i % 3) == 0;
+      if (expectedSet) {
+        final byte[] expectedValue = 
compareArray[i].getBytes(StandardCharsets.UTF_8);
+        assertFalse(newVector.isNull(i));
+        assertArrayEquals(expectedValue, newVector.get(i));
+      } else {
+        assertTrue(newVector.isNull(i));
       }
+    }
+
+    newVector.clear();
+  }
 
-      newViewVarCharVector.clear();
+  @Test
+  public void testTransferInUtf8Views() {
+    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator)) {
+      testTransferInViews(viewVarCharVector);
+    }
+  }
+
+  @Test
+  public void testTransferInBinaryViews() {
+    try (final ViewVarBinaryVector viewVarBinaryVector = new 
ViewVarBinaryVector("myvector", allocator)) {
+      testTransferInViews(viewVarBinaryVector);
     }
   }
 
@@ -424,21 +463,31 @@ public class TestSplitAndTransfer {
     }
   }
 
-  @Test
-  public void testSplitAndTransferNonInViews() {
-    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator)) {
+  private void testSplitAndTransferNonInViews(BaseVariableWidthViewVector 
vector) {
+    vector.allocateNew(16000, 1000);
+    final int valueCount = 500;
+    populateBaseVariableWidthViewVector(vector, valueCount, null);
 
-      viewVarCharVector.allocateNew(16000, 1000);
-      final int valueCount = 500;
-      populateViewVarcharVector(viewVarCharVector, valueCount, null);
+    final TransferPair tp = vector.getTransferPair(allocator);
+    BaseVariableWidthViewVector newVector = (BaseVariableWidthViewVector) 
tp.getTo();
 
-      final TransferPair tp = viewVarCharVector.getTransferPair(allocator);
-      ViewVarCharVector newViewVarCharVector = (ViewVarCharVector) tp.getTo();
+    tp.splitAndTransfer(0, 0);
+    assertEquals(0, newVector.getValueCount());
 
-      tp.splitAndTransfer(0, 0);
-      assertEquals(0, newViewVarCharVector.getValueCount());
+    newVector.clear();
+  }
 
-      newViewVarCharVector.clear();
+  @Test
+  public void testSplitAndTransferNonInUtf8Views() {
+    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator)) {
+      testSplitAndTransferNonInViews(viewVarCharVector);
+    }
+  }
+
+  @Test
+  public void testSplitAndTransferNonInBinaryViews() {
+    try (final ViewVarBinaryVector viewVarBinaryVector = new 
ViewVarBinaryVector("myvector", allocator)) {
+      testSplitAndTransferNonInViews(viewVarBinaryVector);
     }
   }
 
@@ -460,21 +509,31 @@ public class TestSplitAndTransfer {
     }
   }
 
-  @Test
-  public void testSplitAndTransferAllInViews() {
-    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator)) {
+  private void testSplitAndTransferAllInViews(BaseVariableWidthViewVector 
vector) {
+    vector.allocateNew(16000, 1000);
+    final int valueCount = 500;
+    populateBaseVariableWidthViewVector(vector, valueCount, null);
 
-      viewVarCharVector.allocateNew(16000, 1000);
-      final int valueCount = 500;
-      populateViewVarcharVector(viewVarCharVector, valueCount, null);
+    final TransferPair tp = vector.getTransferPair(allocator);
+    BaseVariableWidthViewVector newViewVarCharVector = 
(BaseVariableWidthViewVector) tp.getTo();
 
-      final TransferPair tp = viewVarCharVector.getTransferPair(allocator);
-      ViewVarCharVector newViewVarCharVector = (ViewVarCharVector) tp.getTo();
+    tp.splitAndTransfer(0, valueCount);
+    assertEquals(valueCount, newViewVarCharVector.getValueCount());
 
-      tp.splitAndTransfer(0, valueCount);
-      assertEquals(valueCount, newViewVarCharVector.getValueCount());
+    newViewVarCharVector.clear();
+  }
 
-      newViewVarCharVector.clear();
+  @Test
+  public void testSplitAndTransferAllInUtf8Views() {
+    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator)) {
+      testSplitAndTransferAllInViews(viewVarCharVector);
+    }
+  }
+
+  @Test
+  public void testSplitAndTransferAllInBinaryViews() {
+    try (final ViewVarBinaryVector viewVarBinaryVector = new 
ViewVarBinaryVector("myvector", allocator)) {
+      testSplitAndTransferAllInViews(viewVarBinaryVector);
     }
   }
 
@@ -499,24 +558,35 @@ public class TestSplitAndTransfer {
     }
   }
 
-  @Test
-  public void testInvalidStartIndexInViews() {
-    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator);
-        final ViewVarCharVector newViewVarCharVector = new 
ViewVarCharVector("newvector", allocator)) {
+  private void testInvalidStartIndexInViews(BaseVariableWidthViewVector 
vector, BaseVariableWidthViewVector newVector) {
+    vector.allocateNew(16000, 1000);
+    final int valueCount = 500;
+    populateBaseVariableWidthViewVector(vector, valueCount, null);
 
-      viewVarCharVector.allocateNew(16000, 1000);
-      final int valueCount = 500;
-      populateViewVarcharVector(viewVarCharVector, valueCount, null);
+    final TransferPair tp = vector.makeTransferPair(newVector);
 
-      final TransferPair tp = 
viewVarCharVector.makeTransferPair(newViewVarCharVector);
+    IllegalArgumentException e = assertThrows(
+        IllegalArgumentException.class,
+        () -> tp.splitAndTransfer(valueCount, 10));
 
-      IllegalArgumentException e = assertThrows(
-          IllegalArgumentException.class,
-          () -> tp.splitAndTransfer(valueCount, 10));
+    assertEquals("Invalid parameters startIndex: 500, length: 10 for 
valueCount: 500", e.getMessage());
 
-      assertEquals("Invalid parameters startIndex: 500, length: 10 for 
valueCount: 500", e.getMessage());
+    newVector.clear();
+  }
 
-      newViewVarCharVector.clear();
+  @Test
+  public void testInvalidStartIndexInUtf8Views() {
+    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator);
+        final ViewVarCharVector newViewVarCharVector = new 
ViewVarCharVector("newvector", allocator)) {
+      testInvalidStartIndexInViews(viewVarCharVector, newViewVarCharVector);
+    }
+  }
+
+  @Test
+  public void testInvalidStartIndexInBinaryViews() {
+    try (final ViewVarBinaryVector viewVarBinaryVector = new 
ViewVarBinaryVector("myvector", allocator);
+        final ViewVarBinaryVector newViewVarBinaryVector = new 
ViewVarBinaryVector("newvector", allocator)) {
+      testInvalidStartIndexInViews(viewVarBinaryVector, 
newViewVarBinaryVector);
     }
   }
 
@@ -541,24 +611,35 @@ public class TestSplitAndTransfer {
     }
   }
 
-  @Test
-  public void testInvalidLengthInViews() {
-    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator);
-        final ViewVarCharVector newViewVarCharVector = new 
ViewVarCharVector("newvector", allocator)) {
+  private void testInvalidLengthInViews(BaseVariableWidthViewVector vector, 
BaseVariableWidthViewVector newVector) {
+    vector.allocateNew(16000, 1000);
+    final int valueCount = 500;
+    populateBaseVariableWidthViewVector(vector, valueCount, null);
 
-      viewVarCharVector.allocateNew(16000, 1000);
-      final int valueCount = 500;
-      populateViewVarcharVector(viewVarCharVector, valueCount, null);
+    final TransferPair tp = vector.makeTransferPair(newVector);
 
-      final TransferPair tp = 
viewVarCharVector.makeTransferPair(newViewVarCharVector);
+    IllegalArgumentException e = assertThrows(
+        IllegalArgumentException.class,
+        () -> tp.splitAndTransfer(0, valueCount * 2));
 
-      IllegalArgumentException e = assertThrows(
-          IllegalArgumentException.class,
-          () -> tp.splitAndTransfer(0, valueCount * 2));
+    assertEquals("Invalid parameters startIndex: 0, length: 1000 for 
valueCount: 500", e.getMessage());
 
-      assertEquals("Invalid parameters startIndex: 0, length: 1000 for 
valueCount: 500", e.getMessage());
+    newVector.clear();
+  }
 
-      newViewVarCharVector.clear();
+  @Test
+  public void testInvalidLengthInUtf8Views() {
+    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator);
+        final ViewVarCharVector newViewVarCharVector = new 
ViewVarCharVector("newvector", allocator)) {
+      testInvalidLengthInViews(viewVarCharVector, newViewVarCharVector);
+    }
+  }
+
+  @Test
+  public void testInvalidLengthInBinaryViews() {
+    try (final ViewVarBinaryVector viewVarBinaryVector = new 
ViewVarBinaryVector("myvector", allocator);
+        final ViewVarBinaryVector newViewVarBinaryVector = new 
ViewVarBinaryVector("newvector", allocator)) {
+      testInvalidLengthInViews(viewVarBinaryVector, newViewVarBinaryVector);
     }
   }
 
@@ -580,21 +661,33 @@ public class TestSplitAndTransfer {
     }
   }
 
-  @Test
-  public void testZeroStartIndexAndLengthInViews() {
-    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator);
-        final ViewVarCharVector newViewVarCharVector = new 
ViewVarCharVector("newvector", allocator)) {
+  private void testZeroStartIndexAndLengthInViews(BaseVariableWidthViewVector 
vector,
+      BaseVariableWidthViewVector newVector) {
+    vector.allocateNew(0, 0);
+    final int valueCount = 0;
+    populateBaseVariableWidthViewVector(vector, valueCount, null);
 
-      viewVarCharVector.allocateNew(0, 0);
-      final int valueCount = 0;
-      populateViewVarcharVector(viewVarCharVector, valueCount, null);
+    final TransferPair tp = vector.makeTransferPair(newVector);
 
-      final TransferPair tp = 
viewVarCharVector.makeTransferPair(newViewVarCharVector);
+    tp.splitAndTransfer(0, 0);
+    assertEquals(valueCount, newVector.getValueCount());
 
-      tp.splitAndTransfer(0, 0);
-      assertEquals(valueCount, newViewVarCharVector.getValueCount());
+    newVector.clear();
+  }
 
-      newViewVarCharVector.clear();
+  @Test
+  public void testZeroStartIndexAndLengthInUtf8Views() {
+    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator);
+        final ViewVarCharVector newViewVarCharVector = new 
ViewVarCharVector("newvector", allocator)) {
+      testZeroStartIndexAndLengthInViews(viewVarCharVector, 
newViewVarCharVector);
+    }
+  }
+
+  @Test
+  public void testZeroStartIndexAndLengthInBinaryViews() {
+    try (final ViewVarBinaryVector viewVarBinaryVector = new 
ViewVarBinaryVector("myvector", allocator);
+        final ViewVarBinaryVector newViewVarBinaryVector = new 
ViewVarBinaryVector("newvector", allocator)) {
+      testZeroStartIndexAndLengthInViews(viewVarBinaryVector, 
newViewVarBinaryVector);
     }
   }
 
@@ -616,21 +709,32 @@ public class TestSplitAndTransfer {
     }
   }
 
-  @Test
-  public void testZeroLengthInViews() {
-    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator);
-        final ViewVarCharVector newViewVarCharVector = new 
ViewVarCharVector("newvector", allocator)) {
+  private void testZeroLengthInViews(BaseVariableWidthViewVector vector, 
BaseVariableWidthViewVector newVector) {
+    vector.allocateNew(16000, 1000);
+    final int valueCount = 500;
+    populateBaseVariableWidthViewVector(vector, valueCount, null);
 
-      viewVarCharVector.allocateNew(16000, 1000);
-      final int valueCount = 500;
-      populateViewVarcharVector(viewVarCharVector, valueCount, null);
+    final TransferPair tp = vector.makeTransferPair(newVector);
 
-      final TransferPair tp = 
viewVarCharVector.makeTransferPair(newViewVarCharVector);
+    tp.splitAndTransfer(500, 0);
+    assertEquals(0, newVector.getValueCount());
 
-      tp.splitAndTransfer(500, 0);
-      assertEquals(0, newViewVarCharVector.getValueCount());
+    newVector.clear();
+  }
 
-      newViewVarCharVector.clear();
+  @Test
+  public void testZeroLengthInUtf8Views() {
+    try (final ViewVarCharVector viewVarCharVector = new 
ViewVarCharVector("myvector", allocator);
+        final ViewVarCharVector newViewVarCharVector = new 
ViewVarCharVector("newvector", allocator)) {
+      testZeroLengthInViews(viewVarCharVector, newViewVarCharVector);
+    }
+  }
+
+  @Test
+  public void testZeroLengthInBinaryViews() {
+    try (final ViewVarBinaryVector viewVarBinaryVector = new 
ViewVarBinaryVector("myvector", allocator);
+        final ViewVarBinaryVector newViewVarBinaryVector = new 
ViewVarBinaryVector("newvector", allocator)) {
+      testZeroLengthInViews(viewVarBinaryVector, newViewVarBinaryVector);
     }
   }
 
diff --git 
a/java/vector/src/test/java/org/apache/arrow/vector/TestVarCharViewVector.java 
b/java/vector/src/test/java/org/apache/arrow/vector/TestVarCharViewVector.java
index 817941ecb4..ebf9b58da7 100644
--- 
a/java/vector/src/test/java/org/apache/arrow/vector/TestVarCharViewVector.java
+++ 
b/java/vector/src/test/java/org/apache/arrow/vector/TestVarCharViewVector.java
@@ -37,7 +37,9 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 import java.util.Random;
+import java.util.function.BiConsumer;
 import java.util.function.Function;
+import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
 import org.apache.arrow.memory.ArrowBuf;
@@ -86,9 +88,12 @@ public class TestVarCharViewVector {
 
   private BufferAllocator allocator;
 
+  private Random random;
+
   @BeforeEach
   public void prepare() {
     allocator = new RootAllocator(Integer.MAX_VALUE);
+    random = new Random();
   }
 
   @AfterEach
@@ -1717,6 +1722,44 @@ public class TestVarCharViewVector {
     }
   }
 
+  public byte[] generateRandomBinaryData(int size) {
+    byte[] binaryData = new byte[size];
+    random.nextBytes(binaryData);
+    return binaryData;
+  }
+
+  private byte[][] generateBinaryDataArray(int size, int length) {
+    byte[][] binaryDataArray = new byte[size][];
+    for (int i = 0; i < size; i++) {
+      binaryDataArray[i] = generateRandomBinaryData(length);
+    }
+    return binaryDataArray;
+  }
+
+  private void 
testSplitAndTransferOnSlicedBufferHelper(BaseVariableWidthViewVector 
targetVector,
+      BaseVariableWidthViewVector sourceVector, int startIndex, int length, 
byte[][] data) {
+    sourceVector.allocateNew(1024 * 10, 1024);
+
+    for (int i = 0; i < data.length; i++) {
+      sourceVector.set(i, data[i]);
+    }
+    sourceVector.setValueCount(data.length);
+
+    final long allocatedMem = allocator.getAllocatedMemory();
+    final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
+    final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
+
+    sourceVector.splitAndTransferTo(startIndex, length, targetVector);
+    // we allocate view and data buffers for the target vector
+    assertTrue(allocatedMem < allocator.getAllocatedMemory());
+
+    // The validity buffer is sliced from the same buffer.See 
BaseFixedWidthViewVector#allocateBytes.
+    // Therefore, the refcnt of the validity buffer is increased once since 
the startIndex is 0.
+    assertEquals(validityRefCnt + 1, 
sourceVector.getValidityBuffer().refCnt());
+    // since the new view buffer is allocated, the refcnt is the same as the 
source vector.
+    assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
+  }
+
   /**
    * ARROW-7831:
    * this checks a slice taken off a buffer is still readable
@@ -1724,32 +1767,32 @@ public class TestVarCharViewVector {
    * With short strings.
    */
   @Test
-  public void testSplitAndTransfer1() {
+  public void testSplitAndTransferWithShortStringOnSlicedBuffer() {
+    final byte [][] data = new byte[][]{STR4, STR5, STR6};
+    final int startIndex = 0;
+    final int length = 2;
+
+    BiConsumer<BaseVariableWidthViewVector, byte[][]> validateVector = 
(targetVector, expectedData) -> {
+      IntStream.range(startIndex, length).forEach(i ->
+          assertArrayEquals(expectedData[i], targetVector.get(i - 
startIndex)));
+    };
+
     try (final ViewVarCharVector targetVector = 
newViewVarCharVector("split-target", allocator)) {
       try (final ViewVarCharVector sourceVector = 
newViewVarCharVector(EMPTY_SCHEMA_PATH, allocator)) {
-        sourceVector.allocateNew(1024 * 10, 1024);
-
-        sourceVector.set(0, STR4);
-        sourceVector.set(1, STR5);
-        sourceVector.set(2, STR6);
-        sourceVector.setValueCount(3);
-
-        final long allocatedMem = allocator.getAllocatedMemory();
-        final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
-        final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
-
-        sourceVector.splitAndTransferTo(0, 2, targetVector);
-        // we allocate view and data buffers for the target vector
-        assertTrue(allocatedMem < allocator.getAllocatedMemory());
-
-        // The validity buffer is sliced from the same buffer.See 
BaseFixedWidthViewVector#allocateBytes.
-        // Therefore, the refcnt of the validity buffer is increased once 
since the startIndex is 0.
-        assertEquals(validityRefCnt + 1, 
sourceVector.getValidityBuffer().refCnt());
-        // since the new view buffer is allocated, the refcnt is the same as 
the source vector.
-        assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
+        testSplitAndTransferOnSlicedBufferHelper(targetVector, sourceVector,
+            startIndex, length, data);
       }
-      assertArrayEquals(STR4, targetVector.get(0));
-      assertArrayEquals(STR5, targetVector.get(1));
+      validateVector.accept(targetVector, data);
+    }
+
+    final byte [][] binaryData = generateBinaryDataArray(3, 10);
+
+    try (final ViewVarBinaryVector targetVector = 
newViewVarBinaryVector("split-target", allocator)) {
+      try (final ViewVarBinaryVector sourceVector = 
newViewVarBinaryVector(EMPTY_SCHEMA_PATH, allocator)) {
+        testSplitAndTransferOnSlicedBufferHelper(targetVector, sourceVector,
+            startIndex, length, binaryData);
+      }
+      validateVector.accept(targetVector, binaryData);
     }
   }
 
@@ -1760,36 +1803,58 @@ public class TestVarCharViewVector {
    * With a long string included.
    */
   @Test
-  public void testSplitAndTransfer2() {
+  public void testSplitAndTransferWithLongStringsOnSlicedBuffer() {
+    final byte [][] data = new byte[][]{STR2, STR5, STR6};
+    final int startIndex = 0;
+    final int length = 2;
+
+    BiConsumer<BaseVariableWidthViewVector, byte[][]> validateVector = 
(targetVector, expectedData) -> {
+      IntStream.range(startIndex, length).forEach(i ->
+          assertArrayEquals(expectedData[i], targetVector.get(i - 
startIndex)));
+    };
+
     try (final ViewVarCharVector targetVector = 
newViewVarCharVector("split-target", allocator)) {
       try (final ViewVarCharVector sourceVector = 
newViewVarCharVector(EMPTY_SCHEMA_PATH, allocator)) {
-        sourceVector.allocateNew(1024 * 10, 1024);
-
-        sourceVector.set(0, STR2);
-        sourceVector.set(1, STR5);
-        sourceVector.set(2, STR6);
-        sourceVector.setValueCount(3);
-
-        final long allocatedMem = allocator.getAllocatedMemory();
-        final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
-        final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
-
-        sourceVector.splitAndTransferTo(0, 2, targetVector);
-        // we allocate view and data buffers for the target vector
-        assertTrue(allocatedMem < allocator.getAllocatedMemory());
-
-        // The validity buffer is sliced from the same buffer.See 
BaseFixedWidthViewVector#allocateBytes.
-        // Therefore, the refcnt of the validity buffer is increased once 
since the startIndex is 0.
-        assertEquals(validityRefCnt + 1, 
sourceVector.getValidityBuffer().refCnt());
-        // since the new view buffer is allocated, the refcnt is the same as 
the source vector.
-        assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
-
-        assertArrayEquals(STR2, sourceVector.get(0));
-        assertArrayEquals(STR5, sourceVector.get(1));
-        assertArrayEquals(STR6, sourceVector.get(2));
+        testSplitAndTransferOnSlicedBufferHelper(targetVector, sourceVector,
+            startIndex, length, data);
       }
-      assertArrayEquals(STR2, targetVector.get(0));
-      assertArrayEquals(STR5, targetVector.get(1));
+      validateVector.accept(targetVector, data);
+    }
+
+    final byte [][] binaryData = generateBinaryDataArray(3, 18);
+    try (final ViewVarBinaryVector targetVector = 
newViewVarBinaryVector("split-target", allocator)) {
+      try (final ViewVarBinaryVector sourceVector = 
newViewVarBinaryVector(EMPTY_SCHEMA_PATH, allocator)) {
+        testSplitAndTransferOnSlicedBufferHelper(targetVector, sourceVector,
+            startIndex, length, binaryData);
+      }
+      validateVector.accept(targetVector, binaryData);
+    }
+  }
+
+  private void 
testSplitAndTransferOnSlicedVectorHelper(BaseVariableWidthViewVector 
sourceVector,
+      BaseVariableWidthViewVector targetVector, int startIndex, int length, 
byte[][] data) {
+    sourceVector.allocateNew(1024 * 10, 1024);
+
+    for (int i = 0; i < data.length; i++) {
+      sourceVector.set(i, data[i]);
+    }
+    sourceVector.setValueCount(data.length);
+
+    final long allocatedMem = allocator.getAllocatedMemory();
+    final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
+    final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
+
+    sourceVector.splitAndTransferTo(startIndex, length, targetVector);
+    // we allocate view and data buffers for the target vector
+    assertTrue(allocatedMem < allocator.getAllocatedMemory());
+    // The validity buffer is sliced from the same buffer.See 
BaseFixedWidthViewVector#allocateBytes.
+    // Therefore, the refcnt of the validity buffer is increased once since 
the startIndex is 0.
+    assertEquals(validityRefCnt + 1, 
sourceVector.getValidityBuffer().refCnt());
+    // since the new view buffer is allocated, the refcnt is the same as the 
source vector.
+    assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
+
+    for (int i = startIndex; i < length ; i++) {
+      assertArrayEquals(data[i], targetVector.get(i - startIndex));
     }
   }
 
@@ -1800,35 +1865,31 @@ public class TestVarCharViewVector {
    * With short strings.
    */
   @Test
-  public void testSplitAndTransfer3() {
+  public void testSplitAndTransferWithShortStringsOnSlicedVector() {
+    byte [][] data = new byte[][]{STR4, STR5, STR6};
+    final int startIndex = 0;
+    final int length = 2;
+
+    BiConsumer<BaseVariableWidthViewVector, byte[][]> validateVector = 
(sourceVector, expectedData) -> {
+      IntStream.range(startIndex, length).forEach(i ->
+          assertArrayEquals(expectedData[i], sourceVector.get(i)));
+    };
+
     try (final ViewVarCharVector sourceVector = 
newViewVarCharVector(EMPTY_SCHEMA_PATH, allocator)) {
       try (final ViewVarCharVector targetVector = 
newViewVarCharVector("split-target", allocator)) {
-        sourceVector.allocateNew(1024 * 10, 1024);
-
-        sourceVector.set(0, STR4);
-        sourceVector.set(1, STR5);
-        sourceVector.set(2, STR6);
-        sourceVector.setValueCount(3);
-
-        final long allocatedMem = allocator.getAllocatedMemory();
-        final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
-        final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
-
-        sourceVector.splitAndTransferTo(0, 2, targetVector);
-        // we allocate view and data buffers for the target vector
-        assertTrue(allocatedMem < allocator.getAllocatedMemory());
-        // The validity buffer is sliced from the same buffer.See 
BaseFixedWidthViewVector#allocateBytes.
-        // Therefore, the refcnt of the validity buffer is increased once 
since the startIndex is 0.
-        assertEquals(validityRefCnt + 1, 
sourceVector.getValidityBuffer().refCnt());
-        // since the new view buffer is allocated, the refcnt is the same as 
the source vector.
-        assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
-
-        assertArrayEquals(STR4, targetVector.get(0));
-        assertArrayEquals(STR5, targetVector.get(1));
+        testSplitAndTransferOnSlicedVectorHelper(sourceVector, targetVector,
+            startIndex, length, data);
+      }
+      validateVector.accept(sourceVector, data);
+    }
+
+    byte [][] binaryData = generateBinaryDataArray(3, 10);
+    try (final ViewVarBinaryVector sourceVector = 
newViewVarBinaryVector(EMPTY_SCHEMA_PATH, allocator)) {
+      try (final ViewVarBinaryVector targetVector = 
newViewVarBinaryVector("split-target", allocator)) {
+        testSplitAndTransferOnSlicedVectorHelper(sourceVector, targetVector,
+            startIndex, length, binaryData);
       }
-      assertArrayEquals(STR4, sourceVector.get(0));
-      assertArrayEquals(STR5, sourceVector.get(1));
-      assertArrayEquals(STR6, sourceVector.get(2));
+      validateVector.accept(sourceVector, binaryData);
     }
   }
 
@@ -1839,35 +1900,77 @@ public class TestVarCharViewVector {
    * With a long string included.
    */
   @Test
-  public void testSplitAndTransfer4() {
+  public void testSplitAndTransferWithLongStringsOnSlicedVector() {
+    final byte [][] data = new byte[][]{STR2, STR5, STR6};
+    final int startIndex = 0;
+    final int length = 2;
+
+    BiConsumer<BaseVariableWidthViewVector, byte[][]> validateVector = 
(sourceVector, expectedData) -> {
+      IntStream.range(startIndex, length).forEach(i ->
+          assertArrayEquals(expectedData[i], sourceVector.get(i)));
+    };
+
     try (final ViewVarCharVector sourceVector = 
newViewVarCharVector(EMPTY_SCHEMA_PATH, allocator)) {
       try (final ViewVarCharVector targetVector = 
newViewVarCharVector("split-target", allocator)) {
-        sourceVector.allocateNew(1024 * 10, 1024);
-
-        sourceVector.set(0, STR2);
-        sourceVector.set(1, STR5);
-        sourceVector.set(2, STR6);
-        sourceVector.setValueCount(3);
-
-        final long allocatedMem = allocator.getAllocatedMemory();
-        final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
-        final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
-
-        sourceVector.splitAndTransferTo(0, 2, targetVector);
-        // we allocate view and data buffers for the target vector
-        assertTrue(allocatedMem < allocator.getAllocatedMemory());
-        // The validity buffer is sliced from the same buffer.See 
BaseFixedWidthViewVector#allocateBytes.
-        // Therefore, the refcnt of the validity buffer is increased once 
since the startIndex is 0.
-        assertEquals(validityRefCnt + 1, 
sourceVector.getValidityBuffer().refCnt());
-        // since the new view buffer is allocated, the refcnt is the same as 
the source vector.
-        assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
-
-        assertArrayEquals(STR2, targetVector.get(0));
-        assertArrayEquals(STR5, targetVector.get(1));
+        testSplitAndTransferOnSlicedVectorHelper(sourceVector, targetVector,
+            startIndex, length, data);
+      }
+      validateVector.accept(sourceVector, data);
+    }
+
+    final byte [][] binaryData = generateBinaryDataArray(3, 20);
+    try (final ViewVarBinaryVector sourceVector = 
newViewVarBinaryVector(EMPTY_SCHEMA_PATH, allocator)) {
+      try (final ViewVarBinaryVector targetVector = 
newViewVarBinaryVector("split-target", allocator)) {
+        testSplitAndTransferOnSlicedVectorHelper(sourceVector, targetVector,
+            startIndex, length, binaryData);
+      }
+      validateVector.accept(sourceVector, binaryData);
+    }
+  }
+
+  private void testSplitAndTransferOnValiditySplitHelper(
+      BaseVariableWidthViewVector targetVector, BaseVariableWidthViewVector 
sourceVector,
+      int startIndex, int length, byte[][] data) {
+    sourceVector.allocateNew(1024 * 10, 1024);
+
+    sourceVector.set(0, new byte[0]);
+    sourceVector.setNull(1);
+    for (int i = 0; i < data.length; i++) {
+      if (data[i] == null) {
+        sourceVector.setNull(i);
+      } else {
+        sourceVector.set(i, data[i]);
+      }
+    }
+    sourceVector.setValueCount(data.length);
+
+    final long allocatedMem = allocator.getAllocatedMemory();
+    final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
+    final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
+
+    sourceVector.splitAndTransferTo(startIndex, length, targetVector);
+    // the allocation only consists in the size needed for the validity buffer
+    final long validitySize =
+        DefaultRoundingPolicy.DEFAULT_ROUNDING_POLICY.getRoundedSize(
+            BaseValueVector.getValidityBufferSizeFromCount(2));
+    // we allocate view and data buffers for the target vector
+    assertTrue(allocatedMem + validitySize < allocator.getAllocatedMemory());
+    // The validity is sliced from the same buffer.See 
BaseFixedWidthViewVector#allocateBytes.
+    // Since values up to the startIndex are empty/null validity refcnt should 
not change.
+    assertEquals(validityRefCnt, sourceVector.getValidityBuffer().refCnt());
+    // since the new view buffer is allocated, the refcnt is the same as the 
source vector.
+    assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
+
+    for (int i = startIndex; i < startIndex + length; i++) {
+      assertArrayEquals(data[i], targetVector.get(i - startIndex));
+    }
+
+    for (int i = 0; i < data.length; i++) {
+      if (data[i] == null) {
+        assertTrue(sourceVector.isNull(i));
+      } else {
+        assertArrayEquals(data[i], sourceVector.get(i));
       }
-      assertArrayEquals(STR2, sourceVector.get(0));
-      assertArrayEquals(STR5, sourceVector.get(1));
-      assertArrayEquals(STR6, sourceVector.get(2));
     }
   }
 
@@ -1878,43 +1981,24 @@ public class TestVarCharViewVector {
    * With short strings.
    */
   @Test
-  public void testSplitAndTransfer5() {
+  public void testSplitAndTransferWithShortStringsOnValiditySplit() {
+    final byte [][] data = new byte[][]{new byte[0], null, STR4, STR5, STR6};
+    final int startIndex = 2;
+    final int length = 2;
+
     try (final ViewVarCharVector targetVector = 
newViewVarCharVector("split-target", allocator);
         final ViewVarCharVector sourceVector = 
newViewVarCharVector(EMPTY_SCHEMA_PATH, allocator)) {
-      sourceVector.allocateNew(1024 * 10, 1024);
-
-      sourceVector.set(0, new byte[0]);
-      sourceVector.setNull(1);
-      sourceVector.set(2, STR4);
-      sourceVector.set(3, STR5);
-      sourceVector.set(4, STR6);
-      sourceVector.setValueCount(5);
-
-      final long allocatedMem = allocator.getAllocatedMemory();
-      final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
-      final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
-
-      sourceVector.splitAndTransferTo(2, 2, targetVector);
-      // the allocation only consists in the size needed for the validity 
buffer
-      final long validitySize =
-          DefaultRoundingPolicy.DEFAULT_ROUNDING_POLICY.getRoundedSize(
-              BaseValueVector.getValidityBufferSizeFromCount(2));
-      // we allocate view and data buffers for the target vector
-      assertTrue(allocatedMem + validitySize < allocator.getAllocatedMemory());
-      // The validity is sliced from the same buffer.See 
BaseFixedWidthViewVector#allocateBytes.
-      // Since values up to the startIndex are empty/null validity refcnt 
should not change.
-      assertEquals(validityRefCnt, sourceVector.getValidityBuffer().refCnt());
-      // since the new view buffer is allocated, the refcnt is the same as the 
source vector.
-      assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
-
-      assertArrayEquals(STR4, targetVector.get(0));
-      assertArrayEquals(STR5, targetVector.get(1));
-
-      assertArrayEquals(new byte[0], sourceVector.get(0));
-      assertTrue(sourceVector.isNull(1));
-      assertArrayEquals(STR4, sourceVector.get(2));
-      assertArrayEquals(STR5, sourceVector.get(3));
-      assertArrayEquals(STR6, sourceVector.get(4));
+      testSplitAndTransferOnValiditySplitHelper(targetVector, sourceVector,
+          startIndex, length, data);
+    }
+
+    final byte [][] binaryData = generateBinaryDataArray(5, 10);
+    binaryData[0] = new byte[0];
+    binaryData[1] = null;
+    try (final ViewVarBinaryVector targetVector = 
newViewVarBinaryVector("split-target", allocator);
+        final ViewVarBinaryVector sourceVector = 
newViewVarBinaryVector(EMPTY_SCHEMA_PATH, allocator)) {
+      testSplitAndTransferOnValiditySplitHelper(targetVector, sourceVector,
+          startIndex, length, binaryData);
     }
   }
 
@@ -1925,44 +2009,59 @@ public class TestVarCharViewVector {
    * With long strings.
    */
   @Test
-  public void testSplitAndTransfer6() {
+  public void testSplitAndTransferWithLongStringsOnValiditySplit() {
+    final byte [][] data = new byte[][]{new byte[0], null, STR1, STR2, STR3};
+    final int startIndex = 2;
+    final int length = 2;
+
     try (final ViewVarCharVector targetVector = 
newViewVarCharVector("split-target", allocator);
         final ViewVarCharVector sourceVector = 
newViewVarCharVector(EMPTY_SCHEMA_PATH, allocator)) {
-      sourceVector.allocateNew(1024 * 10, 1024);
-
-      sourceVector.set(0, new byte[0]);
-      sourceVector.setNull(1);
-      sourceVector.set(2, STR1);
-      sourceVector.set(3, STR2);
-      sourceVector.set(4, STR3);
-      sourceVector.setValueCount(5);
-
-      final long allocatedMem = allocator.getAllocatedMemory();
-      final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
-      final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
-
-      sourceVector.splitAndTransferTo(2, 2, targetVector);
-      // the allocation consists in the size needed for the validity buffer 
and the long string
-      // allocation
-      final long validitySize =
-          DefaultRoundingPolicy.DEFAULT_ROUNDING_POLICY.getRoundedSize(
-              BaseValueVector.getValidityBufferSizeFromCount(2));
-      // we allocate view and data buffers for the target vector
-      assertTrue(allocatedMem + validitySize < allocator.getAllocatedMemory());
-      // The validity is sliced from the same buffer.See 
BaseFixedWidthViewVector#allocateBytes.
-      // Since values up to the startIndex are empty/null validity refcnt 
should not change.
-      assertEquals(validityRefCnt, sourceVector.getValidityBuffer().refCnt());
-      // since the new view buffer is allocated, the refcnt is the same as the 
source vector.
-      assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
-
-      assertArrayEquals(STR1, targetVector.get(0));
-      assertArrayEquals(STR2, targetVector.get(1));
-
-      assertArrayEquals(new byte[0], sourceVector.get(0));
-      assertTrue(sourceVector.isNull(1));
-      assertArrayEquals(STR1, sourceVector.get(2));
-      assertArrayEquals(STR2, sourceVector.get(3));
-      assertArrayEquals(STR3, sourceVector.get(4));
+      testSplitAndTransferOnValiditySplitHelper(targetVector, sourceVector,
+          startIndex, length, data);
+    }
+
+    final byte [][] binaryData = generateBinaryDataArray(5, 18);
+    binaryData[0] = new byte[0];
+    binaryData[1] = null;
+
+    try (final ViewVarBinaryVector targetVector = 
newViewVarBinaryVector("split-target", allocator);
+        final ViewVarBinaryVector sourceVector = 
newViewVarBinaryVector(EMPTY_SCHEMA_PATH, allocator)) {
+      testSplitAndTransferOnValiditySplitHelper(targetVector, sourceVector,
+          startIndex, length, data);
+    }
+  }
+
+  private void 
testSplitAndTransferOnAllocatorToAllocator(BaseVariableWidthViewVector 
targetVector,
+      BaseVariableWidthViewVector sourceVector, int startIndex, int length, 
byte[][] data) {
+    sourceVector.allocateNew(50, data.length);
+
+    for (int i = 0; i < data.length; i++) {
+      sourceVector.set(i, data[i]);
+    }
+    sourceVector.setValueCount(data.length);
+
+    final long allocatedMem = allocator.getAllocatedMemory();
+    final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
+    final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
+
+    sourceVector.splitAndTransferTo(startIndex, length, targetVector);
+
+    if (sourceVector.getDataBuffers().isEmpty()) {
+      // no extra allocation as strings are all inline
+      assertEquals(allocatedMem, allocator.getAllocatedMemory());
+    } else {
+      // extra allocation as some strings are not inline
+      assertTrue(allocatedMem < allocator.getAllocatedMemory());
+    }
+
+    // the refcnts of each buffer for this test should be the same as what
+    // the source allocator ended up with.
+    assertEquals(validityRefCnt, sourceVector.getValidityBuffer().refCnt());
+    // since the new view buffer is allocated, the refcnt is the same as the 
source vector.
+    assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
+
+    for (int i = 0; i < data.length; i++) {
+      assertArrayEquals(data[i], sourceVector.get(i));
     }
   }
 
@@ -1973,39 +2072,36 @@ public class TestVarCharViewVector {
    * With short strings.
    */
   @Test
-  public void testSplitAndTransfer7() {
+  public void testSplitAndTransferWithShortStringsOnAllocatorToAllocator() {
     final int maxAllocation = 512;
+    final byte [][] data = new byte[][]{STR4, STR5, STR6};
+    final int startIndex = 0;
+    final int length = 2;
+
+    BiConsumer<BaseVariableWidthViewVector, byte[][]> validateVector = 
(targetVector, expectedData) -> {
+      IntStream.range(startIndex, length).forEach(i ->
+          assertArrayEquals(expectedData[i], targetVector.get(i - 
startIndex)));
+    };
+
     try (final BufferAllocator targetAllocator = 
allocator.newChildAllocator("target-alloc", 256, maxAllocation);
         final ViewVarCharVector targetVector = 
newViewVarCharVector("split-target", targetAllocator)) {
       try (final BufferAllocator sourceAllocator = 
allocator.newChildAllocator("source-alloc", 256, maxAllocation);
           final ViewVarCharVector sourceVector = 
newViewVarCharVector(EMPTY_SCHEMA_PATH, sourceAllocator)) {
-        sourceVector.allocateNew(50, 3);
-
-        sourceVector.set(0, STR4);
-        sourceVector.set(1, STR5);
-        sourceVector.set(2, STR6);
-        sourceVector.setValueCount(3);
-
-        final long allocatedMem = allocator.getAllocatedMemory();
-        final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
-        final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
-
-        sourceVector.splitAndTransferTo(0, 2, targetVector);
-        // no extra allocation as strings are all inline
-        assertEquals(allocatedMem, allocator.getAllocatedMemory());
-
-        // the refcnts of each buffer for this test should be the same as what
-        // the source allocator ended up with.
-        assertEquals(validityRefCnt, 
sourceVector.getValidityBuffer().refCnt());
-        // since the new view buffer is allocated, the refcnt is the same as 
the source vector.
-        assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
-
-        assertArrayEquals(STR4, sourceVector.get(0));
-        assertArrayEquals(STR5, sourceVector.get(1));
-        assertArrayEquals(STR6, sourceVector.get(2));
+        testSplitAndTransferOnAllocatorToAllocator(targetVector, sourceVector,
+            startIndex, length, data);
       }
-      assertArrayEquals(STR4, targetVector.get(0));
-      assertArrayEquals(STR5, targetVector.get(1));
+      validateVector.accept(targetVector, data);
+    }
+
+    final byte [][] binaryData = generateBinaryDataArray(3, 10);
+    try (final BufferAllocator targetAllocator = 
allocator.newChildAllocator("target-alloc", 256, maxAllocation);
+        final ViewVarBinaryVector targetVector = 
newViewVarBinaryVector("split-target", targetAllocator)) {
+      try (final BufferAllocator sourceAllocator = 
allocator.newChildAllocator("source-alloc", 256, maxAllocation);
+          final ViewVarBinaryVector sourceVector = 
newViewVarBinaryVector(EMPTY_SCHEMA_PATH, sourceAllocator)) {
+        testSplitAndTransferOnAllocatorToAllocator(targetVector, sourceVector,
+            startIndex, length, binaryData);
+      }
+      validateVector.accept(targetVector, binaryData);
     }
   }
 
@@ -2016,12 +2112,21 @@ public class TestVarCharViewVector {
    * With long strings.
    */
   @Test
-  public void testSplitAndTransfer8() {
+  public void testSplitAndTransferWithLongStringsOnAllocatorToAllocator() {
     final int initialReservation = 1024;
     // Here we have the target vector being transferred with a long string
     // hence, the data buffer will be allocated.
     // The default data buffer allocation takes
     // BaseVariableWidthViewVector.INITIAL_VIEW_VALUE_ALLOCATION * 
BaseVariableWidthViewVector.ELEMENT_SIZE
+    final byte [][] data = new byte[][]{STR1, STR2, STR3};
+    final int startIndex = 0;
+    final int length = 2;
+
+    BiConsumer<BaseVariableWidthViewVector, byte[][]> validateVector = 
(targetVector, expectedData) -> {
+      IntStream.range(startIndex, length).forEach(i ->
+          assertArrayEquals(expectedData[i], targetVector.get(i - 
startIndex)));
+    };
+
     final int maxAllocation = initialReservation +
         BaseVariableWidthViewVector.INITIAL_VIEW_VALUE_ALLOCATION * 
BaseVariableWidthViewVector.ELEMENT_SIZE;
     try (final BufferAllocator targetAllocator = 
allocator.newChildAllocator("target-alloc",
@@ -2030,136 +2135,169 @@ public class TestVarCharViewVector {
       try (final BufferAllocator sourceAllocator = 
allocator.newChildAllocator("source-alloc",
           initialReservation, maxAllocation);
           final ViewVarCharVector sourceVector = 
newViewVarCharVector(EMPTY_SCHEMA_PATH, sourceAllocator)) {
-        sourceVector.allocateNew(48, 3);
-
-        sourceVector.set(0, STR1);
-        sourceVector.set(1, STR2);
-        sourceVector.set(2, STR3);
-        sourceVector.setValueCount(3);
-
-        final long allocatedMem = allocator.getAllocatedMemory();
-        final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
-        final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
-
-        sourceVector.splitAndTransferTo(0, 2, targetVector);
-        // we allocate view and data buffers for the target vector
-        assertTrue(allocatedMem < allocator.getAllocatedMemory());
-
-        // the refcnts of each buffer for this test should be the same as what
-        // the source allocator ended up with.
-        assertEquals(validityRefCnt, 
sourceVector.getValidityBuffer().refCnt());
-        // since the new view buffer is allocated, the refcnt is the same as 
the source vector.
-        assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
-
-        assertArrayEquals(STR1, sourceVector.get(0));
-        assertArrayEquals(STR2, sourceVector.get(1));
-        assertArrayEquals(STR3, sourceVector.get(2));
+        testSplitAndTransferOnAllocatorToAllocator(targetVector, sourceVector,
+            startIndex, length, data);
       }
-      assertArrayEquals(STR1, targetVector.get(0));
-      assertArrayEquals(STR2, targetVector.get(1));
+      validateVector.accept(targetVector, data);
     }
-  }
 
-  @Test
-  public void testReallocAfterVectorTransfer1() {
-    try (final ViewVarCharVector vector = new 
ViewVarCharVector(EMPTY_SCHEMA_PATH, allocator)) {
-      /* 4096 values with 16 bytes per record */
-      final int bytesPerRecord = 32;
-      vector.allocateNew(4096 * bytesPerRecord, 4096);
-      int valueCapacity = vector.getValueCapacity();
-      assertTrue(valueCapacity >= 4096);
-
-      /* populate the vector */
-      for (int i = 0; i < valueCapacity; i++) {
-        if ((i & 1) == 1) {
-          vector.set(i, STR1);
-        } else {
-          vector.set(i, STR2);
-        }
+    final byte [][] binaryData = generateBinaryDataArray(3, 18);
+
+    try (final BufferAllocator targetAllocator = 
allocator.newChildAllocator("target-alloc",
+        initialReservation, maxAllocation);
+        final ViewVarBinaryVector targetVector = 
newViewVarBinaryVector("split-target", targetAllocator)) {
+      try (final BufferAllocator sourceAllocator = 
allocator.newChildAllocator("source-alloc",
+          initialReservation, maxAllocation);
+          final ViewVarBinaryVector sourceVector = 
newViewVarBinaryVector(EMPTY_SCHEMA_PATH, sourceAllocator)) {
+        testSplitAndTransferOnAllocatorToAllocator(targetVector, sourceVector,
+            startIndex, length, binaryData);
       }
+      validateVector.accept(targetVector, binaryData);
+    }
+  }
 
-      /* Check the vector output */
-      for (int i = 0; i < valueCapacity; i++) {
-        if ((i & 1) == 1) {
-          assertArrayEquals(STR1, vector.get(i));
-        } else {
-          assertArrayEquals(STR2, vector.get(i));
-        }
+  private void 
testReallocAfterVectorTransferHelper(BaseVariableWidthViewVector vector,
+      byte[] str1, byte[] str2) {
+    /* 4096 values with 16 bytes per record */
+    final int bytesPerRecord = 32;
+    vector.allocateNew(4096 * bytesPerRecord, 4096);
+    int valueCapacity = vector.getValueCapacity();
+    assertTrue(valueCapacity >= 4096);
+
+    /* populate the vector */
+    for (int i = 0; i < valueCapacity; i++) {
+      if ((i & 1) == 1) {
+        vector.set(i, str1);
+      } else {
+        vector.set(i, str2);
       }
+    }
 
-      /* trigger first realloc */
-      vector.setSafe(valueCapacity, STR2, 0, STR2.length);
-      assertTrue(vector.getValueCapacity() >= 2 * valueCapacity);
-      while (vector.getByteCapacity() < bytesPerRecord * 
vector.getValueCapacity()) {
-        vector.reallocViewBuffer();
-        vector.reallocViewDataBuffer();
+    /* Check the vector output */
+    for (int i = 0; i < valueCapacity; i++) {
+      if ((i & 1) == 1) {
+        assertArrayEquals(str1, vector.get(i));
+      } else {
+        assertArrayEquals(str2, vector.get(i));
       }
+    }
 
-      /* populate the remaining vector */
-      for (int i = valueCapacity; i < vector.getValueCapacity(); i++) {
-        if ((i & 1) == 1) {
-          vector.set(i, STR1);
-        } else {
-          vector.set(i, STR2);
-        }
+    /* trigger first realloc */
+    vector.setSafe(valueCapacity, str2, 0, str2.length);
+    assertTrue(vector.getValueCapacity() >= 2 * valueCapacity);
+    while (vector.getByteCapacity() < bytesPerRecord * 
vector.getValueCapacity()) {
+      vector.reallocViewBuffer();
+      vector.reallocViewDataBuffer();
+    }
+
+    /* populate the remaining vector */
+    for (int i = valueCapacity; i < vector.getValueCapacity(); i++) {
+      if ((i & 1) == 1) {
+        vector.set(i, str1);
+      } else {
+        vector.set(i, str2);
       }
+    }
 
-      /* Check the vector output */
-      valueCapacity = vector.getValueCapacity();
-      for (int i = 0; i < valueCapacity; i++) {
-        if ((i & 1) == 1) {
-          assertArrayEquals(STR1, vector.get(i));
-        } else {
-          assertArrayEquals(STR2, vector.get(i));
-        }
+    /* Check the vector output */
+    valueCapacity = vector.getValueCapacity();
+    for (int i = 0; i < valueCapacity; i++) {
+      if ((i & 1) == 1) {
+        assertArrayEquals(str1, vector.get(i));
+      } else {
+        assertArrayEquals(str2, vector.get(i));
       }
+    }
+
+    /* trigger second realloc */
+    vector.setSafe(valueCapacity + bytesPerRecord, str2, 0, str2.length);
+    assertTrue(vector.getValueCapacity() >= 2 * valueCapacity);
+    while (vector.getByteCapacity() < bytesPerRecord * 
vector.getValueCapacity()) {
+      vector.reallocViewBuffer();
+      vector.reallocViewDataBuffer();
+    }
 
-      /* trigger second realloc */
-      vector.setSafe(valueCapacity + bytesPerRecord, STR2, 0, STR2.length);
-      assertTrue(vector.getValueCapacity() >= 2 * valueCapacity);
-      while (vector.getByteCapacity() < bytesPerRecord * 
vector.getValueCapacity()) {
-        vector.reallocViewBuffer();
-        vector.reallocViewDataBuffer();
+    /* populate the remaining vector */
+    for (int i = valueCapacity; i < vector.getValueCapacity(); i++) {
+      if ((i & 1) == 1) {
+        vector.set(i, str1);
+      } else {
+        vector.set(i, str2);
       }
+    }
 
-      /* populate the remaining vector */
-      for (int i = valueCapacity; i < vector.getValueCapacity(); i++) {
-        if ((i & 1) == 1) {
-          vector.set(i, STR1);
-        } else {
-          vector.set(i, STR2);
-        }
+    /* Check the vector output */
+    valueCapacity = vector.getValueCapacity();
+    for (int i = 0; i < valueCapacity; i++) {
+      if ((i & 1) == 1) {
+        assertArrayEquals(str1, vector.get(i));
+      } else {
+        assertArrayEquals(str2, vector.get(i));
       }
+    }
 
-      /* Check the vector output */
-      valueCapacity = vector.getValueCapacity();
-      for (int i = 0; i < valueCapacity; i++) {
-        if ((i & 1) == 1) {
-          assertArrayEquals(STR1, vector.get(i));
-        } else {
-          assertArrayEquals(STR2, vector.get(i));
-        }
+    /* We are potentially working with 4x the size of vector buffer
+     * that we initially started with.
+     * Now let's transfer the vector.
+     */
+
+    TransferPair transferPair = vector.getTransferPair(allocator);
+    transferPair.transfer();
+    BaseVariableWidthViewVector toVector = (BaseVariableWidthViewVector) 
transferPair.getTo();
+    valueCapacity = toVector.getValueCapacity();
+
+    for (int i = 0; i < valueCapacity; i++) {
+      if ((i & 1) == 1) {
+        assertArrayEquals(str1, toVector.get(i));
+      } else {
+        assertArrayEquals(str2, toVector.get(i));
       }
+    }
+    toVector.close();
+  }
 
-      /* We are potentially working with 4x the size of vector buffer
-       * that we initially started with.
-       * Now let's transfer the vector.
-       */
+  @Test
+  public void testReallocAfterVectorTransfer() {
+    try (final ViewVarCharVector vector = new 
ViewVarCharVector(EMPTY_SCHEMA_PATH, allocator)) {
+      testReallocAfterVectorTransferHelper(vector, STR1, STR2);
+    }
 
-      TransferPair transferPair = vector.getTransferPair(allocator);
-      transferPair.transfer();
-      ViewVarCharVector toVector = (ViewVarCharVector) transferPair.getTo();
-      valueCapacity = toVector.getValueCapacity();
+    try (final ViewVarBinaryVector vector = new 
ViewVarBinaryVector(EMPTY_SCHEMA_PATH, allocator)) {
+      testReallocAfterVectorTransferHelper(vector, 
generateRandomBinaryData(12),
+          generateRandomBinaryData(13));
+    }
+  }
 
-      for (int i = 0; i < valueCapacity; i++) {
-        if ((i & 1) == 1) {
-          assertArrayEquals(STR1, toVector.get(i));
-        } else {
-          assertArrayEquals(STR2, toVector.get(i));
-        }
-      }
+  private void 
testSplitAndTransferWithMultipleDataBuffersHelper(BaseVariableWidthViewVector 
sourceVector,
+      BaseVariableWidthViewVector targetVector, int startIndex, int length, 
byte[][] data) {
+    sourceVector.allocateNew(48, 4);
+
+    for (int i = 0; i < data.length; i++) {
+      sourceVector.set(i, data[i]);
+    }
+    sourceVector.setValueCount(data.length);
+
+    // we should have multiple data buffers
+    assertTrue(sourceVector.getDataBuffers().size() > 1);
+
+    final long allocatedMem = allocator.getAllocatedMemory();
+    final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
+    final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
 
-      toVector.close();
+    // split and transfer with slice starting at the beginning:
+    // this should not allocate anything new
+    sourceVector.splitAndTransferTo(startIndex, length, targetVector);
+    // we allocate view and data buffers for the target vector
+    assertTrue(allocatedMem < allocator.getAllocatedMemory());
+
+    // the refcnts of each buffer for this test should be the same as what
+    // the source allocator ended up with.
+    assertEquals(validityRefCnt, sourceVector.getValidityBuffer().refCnt());
+    // since the new view buffer is allocated, the refcnt is the same as the 
source vector.
+    assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
+
+    for (int i = 0; i < data.length; i++) {
+      assertArrayEquals(data[i], sourceVector.get(i));
     }
   }
 
@@ -2171,45 +2309,31 @@ public class TestVarCharViewVector {
    * Check multi-data buffer source copying
    */
   @Test
-  public void testSplitAndTransfer9() {
+  public void testSplitAndTransferWithMultipleDataBuffers() {
+    final String str4 = generateRandomString(35);
+    final byte[][] data = new byte[][]{STR1, STR2, STR3, 
str4.getBytes(StandardCharsets.UTF_8)};
+    final int startIndex = 1;
+    final int length = 3;
+
+    BiConsumer<BaseVariableWidthViewVector, byte[][]> validateVector = 
(targetVector, expectedData) -> {
+      IntStream.range(startIndex, length).forEach(i ->
+          assertArrayEquals(expectedData[i], targetVector.get(i - 
startIndex)));
+    };
+
     try (final ViewVarCharVector targetVector = new 
ViewVarCharVector("target", allocator)) {
-      String str4 = generateRandomString(35);
       try (final ViewVarCharVector sourceVector = new 
ViewVarCharVector("source", allocator)) {
-        sourceVector.allocateNew(48, 4);
-
-        sourceVector.set(0, STR1);
-        sourceVector.set(1, STR2);
-        sourceVector.set(2, STR3);
-        sourceVector.set(3, str4.getBytes(StandardCharsets.UTF_8));
-        sourceVector.setValueCount(4);
-
-        // we should have multiple data buffers
-        assertTrue(sourceVector.getDataBuffers().size() > 1);
-
-        final long allocatedMem = allocator.getAllocatedMemory();
-        final int validityRefCnt = sourceVector.getValidityBuffer().refCnt();
-        final int dataRefCnt = sourceVector.getDataBuffer().refCnt();
-
-        // split and transfer with slice starting at the beginning:
-        // this should not allocate anything new
-        sourceVector.splitAndTransferTo(1, 3, targetVector);
-        // we allocate view and data buffers for the target vector
-        assertTrue(allocatedMem < allocator.getAllocatedMemory());
-
-        // the refcnts of each buffer for this test should be the same as what
-        // the source allocator ended up with.
-        assertEquals(validityRefCnt, 
sourceVector.getValidityBuffer().refCnt());
-        // since the new view buffer is allocated, the refcnt is the same as 
the source vector.
-        assertEquals(dataRefCnt, sourceVector.getDataBuffer().refCnt());
-
-        assertArrayEquals(STR1, sourceVector.get(0));
-        assertArrayEquals(STR2, sourceVector.get(1));
-        assertArrayEquals(STR3, sourceVector.get(2));
-        assertArrayEquals(str4.getBytes(StandardCharsets.UTF_8), 
sourceVector.get(3));
+        testSplitAndTransferWithMultipleDataBuffersHelper(sourceVector, 
targetVector,
+            startIndex, length, data);
+      }
+      validateVector.accept(targetVector, data);
+    }
+
+    try (final ViewVarBinaryVector targetVector = new 
ViewVarBinaryVector("target", allocator)) {
+      try (final ViewVarBinaryVector sourceVector = new 
ViewVarBinaryVector("source", allocator)) {
+        testSplitAndTransferWithMultipleDataBuffersHelper(sourceVector, 
targetVector,
+            startIndex, length, data);
       }
-      assertArrayEquals(STR2, targetVector.get(0));
-      assertArrayEquals(STR3, targetVector.get(1));
-      assertArrayEquals(str4.getBytes(StandardCharsets.UTF_8), 
targetVector.get(2));
+      validateVector.accept(targetVector, data);
     }
   }
 

Reply via email to