Uploaded image for project: 'Apache Arrow'
  1. Apache Arrow
  2. ARROW-337

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

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • None
    • 0.2.0
    • Java
    • None

    Description

      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());
      

      Attachments

        Activity

          People

            adeneche Abdel Hakim Deneche
            adeneche Abdel Hakim Deneche
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: