scampi commented on a change in pull request #6402:
URL: https://github.com/apache/arrow/pull/6402#discussion_r439780145



##########
File path: 
java/vector/src/main/java/org/apache/arrow/vector/BaseVariableWidthVector.java
##########
@@ -740,10 +740,16 @@ private void splitAndTransferOffsetBuffer(int startIndex, 
int length, BaseVariab
     final int start = offsetBuffer.getInt(startIndex * OFFSET_WIDTH);
     final int end = offsetBuffer.getInt((startIndex + length) * OFFSET_WIDTH);
     final int dataLength = end - start;
-    target.allocateOffsetBuffer((length + 1) * OFFSET_WIDTH);
-    for (int i = 0; i < length + 1; i++) {
-      final int relativeSourceOffset = offsetBuffer.getInt((startIndex + i) * 
OFFSET_WIDTH) - start;
-      target.offsetBuffer.setInt(i * OFFSET_WIDTH, relativeSourceOffset);
+
+    if (startIndex == 0) {
+      target.offsetBuffer = offsetBuffer.slice(0, (1 + length) * OFFSET_WIDTH);
+      target.offsetBuffer.getReferenceManager().retain();

Review comment:
       > If the testSplitAndTransfer tests were run with two child buffer 
allocators I think they would fail.
   
   @rymurr there was indeed a problem in that case where the sliced data was 
not transferred to the target allocator. See 
da7e3eacaf021580b4aae0f17492c17dbbef44a0 for a test about that.
   
   > A clearer/more complete optimization would probably to simply read the 
initial starting offset at the index that we're slicing from and if that is 
zero, don't do the allocate/copy
   
   @jacques-n I have extended the condition to include also that case of 
empties/nulls. See e304816f1e88609ce79a18d45c657901489e0b13




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to