nbauernfeind opened a new issue, #471:
URL: https://github.com/apache/arrow-java/issues/471

   ### Describe the bug, including details regarding any error messages, 
version, and platform.
   
   `ListViewVector`'s `#copyFrom` is broken. Here is a test (that otherwise 
works for `List`):
   ```java
       @Test
       public void testListViewCopy() {
           final Field childField = new Field("testChild",
                   new FieldType(false, new ArrowType.Int(32, true), null), 
null);
           final Field listField = new Field("test",
                   new FieldType(false, ArrowType.ListView.INSTANCE, null), 
Collections.singletonList(childField));
           try (final ListViewVector src = (ListViewVector) 
listField.createVector(allocator);
                final ListViewVector dst = (ListViewVector) 
listField.createVector(allocator)) {
               // init child vector
               final int numValues = 10;
               final IntVector childSrc = (IntVector) src.getDataVector();
               childSrc.setValueCount(numValues);
               for (int ii = 0; ii < numValues; ++ii) {
                   childSrc.set(ii, ii);
               }
   
               // init source vector
               src.setValueCount(1);
               src.startNewValue(0);
               src.endValue(0, numValues);
   
               assertEquals(List.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), 
src.getObject(0));
   
               dst.setValueCount(src.getValueCount());
               dst.getDataVector().setValueCount(numValues);
               dst.copyFrom(0, 0, src);
               assertEquals(src.getObject(0), dst.getObject(0));
           }
       }
   ```
   
   `ComplexCopier#writeValue` has impl:
   ```java
         case LIST:
         case LISTVIEW:
         case LARGELIST:
         case LARGELISTVIEW:
         case FIXED_SIZE_LIST:
           if (reader.isSet()) {
             writer.startList();
             while (reader.next()) {
               FieldReader childReader = reader.reader();
               FieldWriter childWriter = getListWriterForReader(childReader, 
writer);
               if (childReader.isSet()) {
                 writeValue(childReader, childWriter);
               } else {
                 childWriter.writeNull();
               }
             }
             writer.endList();
           } else {
             writer.writeNull();
           }
           break;
   ```
   
   Note that the implementation of `UnionListViewReader#next` will never ever 
return false:
   ```java
     @Override
     public boolean next() {
       // Here, the currentOffSet keeps track of the current position in the 
vector inside the list at
       // set position.
       // And, size keeps track of the elements count in the list, so to make 
sure we traverse
       // the full list, we need to check if the currentOffset is less than the 
currentOffset + size
       if (currentOffset < currentOffset + size) {
         data.getReader().setPosition(currentOffset++);
         return true;
       } else {
         return false;
       }
     }
   ```
   
   Notice how `currentOffset < currentOffset + size` can only ever be false if 
`size <= 0` -- but `size` is never modified.
   
   I suspect the desired conditional is:
   ```
       if (currentOffset < size) {
   ```
   
   Please note that the embedded comment is also nonsense. It's not clear why 
the approach differs from `UnionListReader`, keeping a consistent approach 
would have prevented introducing a bug.


-- 
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.

To unsubscribe, e-mail: issues-unsubscr...@arrow.apache.org.apache.org

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

Reply via email to