From bbfb7b964fd6e0a0675b444cf50a96e41177c314 Mon Sep 17 00:00:00 2001 From: James Henderson Date: Fri, 19 Jul 2024 02:52:34 +0100 Subject: [PATCH] GH-43320: [Java] fix for SchemaChangeRuntimeException transferring empty FixedSizeListVector (#43321) ### What changes are included in this PR? When we create a FSLV through TransferImpl, we check to see if the source's element vector is a ZeroVector and, if not, we don't call addOrGetVector. ### Are these changes tested? Yep - see TestFixedSizeListVector ### Are there any user-facing changes? No * GitHub Issue: #43320 Authored-by: James Henderson Signed-off-by: David Li --- .../vector/complex/FixedSizeListVector.java | 4 ++- .../arrow/vector/TestFixedSizeListVector.java | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/FixedSizeListVector.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/FixedSizeListVector.java index 7a88eaf162314..cb4550848088c 100644 --- a/java/vector/src/main/java/org/apache/arrow/vector/complex/FixedSizeListVector.java +++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/FixedSizeListVector.java @@ -602,7 +602,9 @@ public TransferImpl(Field field, BufferAllocator allocator, CallBack callBack) { public TransferImpl(FixedSizeListVector to) { this.to = to; - to.addOrGetVector(vector.getField().getFieldType()); + if (!(vector instanceof ZeroVector)) { + to.addOrGetVector(vector.getField().getFieldType()); + } dataPair = vector.makeTransferPair(to.vector); } diff --git a/java/vector/src/test/java/org/apache/arrow/vector/TestFixedSizeListVector.java b/java/vector/src/test/java/org/apache/arrow/vector/TestFixedSizeListVector.java index fc220e0f05a14..f582406de6808 100644 --- a/java/vector/src/test/java/org/apache/arrow/vector/TestFixedSizeListVector.java +++ b/java/vector/src/test/java/org/apache/arrow/vector/TestFixedSizeListVector.java @@ -26,6 +26,7 @@ import java.math.BigDecimal; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.arrow.memory.BufferAllocator; @@ -243,6 +244,34 @@ public void testTransferPair() { } } + @Test + public void testTransferEmptyVector() throws Exception { + // #43320 + try (FixedSizeListVector src = + new FixedSizeListVector( + "src", allocator, FieldType.nullable(new ArrowType.FixedSizeList(2)), null); + FixedSizeListVector dest = + new FixedSizeListVector( + "dest", allocator, FieldType.nullable(new ArrowType.FixedSizeList(2)), null)) { + src.makeTransferPair(dest).transfer(); + + IntVector els = + (IntVector) dest.addOrGetVector(FieldType.nullable(MinorType.INT.getType())).getVector(); + + dest.allocateNew(); + dest.startNewValue(0); + els.setSafe(0, 1); + els.setSafe(1, 2); + dest.setValueCount(1); + + List expected = new ArrayList<>(2); + expected.add(1); + expected.add(2); + + assertEquals(expected, dest.getObject(0)); + } + } + @Test public void testConsistentChildName() throws Exception { try (FixedSizeListVector listVector =