Skip to content

UnionListWriter.list() is doing more than it should, this can cause data corruption #15815

@asfimport

Description

@asfimport

If you run the following code:

    MapVector parent = new MapVector("parent", allocator, null);
    ComplexWriter writer = new ComplexWriterImpl("root", parent);
    MapWriter rootWriter = writer.rootAsMap();

    ListWriter listWriter = rootWriter.list("list");
    ListWriter list = listWriter.list();

    rootWriter.start();
    {
      listWriter.startList();
      {
        list.startList();
        list.bigInt().writeBigInt(0);
        list.endList();
      }
      {
        list.startList();
        list.bigInt().writeBigInt(1);
        list.endList();
      }
      listWriter.endList();
    }
    rootWriter.end();

    writer.setValueCount(1);

    MapReader rootReader = new SingleMapReaderImpl(parent).reader("root");

    System.out.println(rootReader.reader("list").readObject());

You should expect it to print ```
[[0],[1]]

but it actually prints ```
[[0,1]]

If you change the code so that UnionListWriter.list() is called along with startList() then the code works fine:

    MapVector parent = new MapVector("parent", allocator, null);
    ComplexWriter writer = new ComplexWriterImpl("root", parent);
    MapWriter rootWriter = writer.rootAsMap();

    rootWriter.start();
    {
      ListWriter listWriter = rootWriter.list("mylist");
      listWriter.startList();
      {
        ListWriter list = listWriter.list();
        list.startList();
        list.bigInt().writeBigInt(0);
        list.endList();
      }
      {
        ListWriter list = listWriter.list();
        list.startList();
        list.bigInt().writeBigInt(1);
        list.endList();
      }
      listWriter.endList();
    }
    rootWriter.end();

    writer.setValueCount(1);

    MapReader rootReader = new SingleMapReaderImpl(parent).reader("root");

    System.out.println(rootReader.reader("mylist").readObject());

Reporter: Abdel Hakim Deneche / @adeneche
Assignee: Abdel Hakim Deneche / @adeneche

Note: This issue was originally created as ARROW-337. Please see the migration documentation for further details.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions