)]}'
{
  "commit": "0f8a0808fd9cf0bd22d3c6b40a2016ee724ce185",
  "tree": "2c2d58a67d6607bf164e78eb7a1e31119d0508b9",
  "parents": [
    "ccaac9ad688265d272d4c3d9d824426ef7681669"
  ],
  "author": {
    "name": "Yicong Huang",
    "email": "17627829+Yicong-Huang@users.noreply.github.com",
    "time": "Fri Jan 23 01:18:13 2026 -0800"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Jan 23 10:18:13 2026 +0100"
  },
  "message": "GH-343: Fix ListVector offset buffer not properly serialized for nested empty arrays (#967)\n\n## What\u0027s Changed\n\nFix `ListVector`/`LargeListVector` IPC serialization when `valueCount`\nis 0.\n\n### Problem\n\nWhen `valueCount \u003d\u003d 0`, `setReaderAndWriterIndex()` was setting\n`offsetBuffer.writerIndex(0)`, which means `readableBytes() \u003d\u003d 0`. IPC\nserializer uses `readableBytes()` to determine buffer size, so 0 bytes\nwere written to the IPC stream. This crashes IPC readers in other\nlibraries because Arrow spec requires offset buffer to have at least one\nentry `[0]`.\n\n@viirya:\n\n\u003e The offset buffers are allocated properly. But during IPC\nserialization, they are ignored.\n\u003e ```\n\u003e   public long readableBytes() {\n\u003e       return writerIndex - readerIndex;\n\u003e   }\n\u003e ```\n\u003e So when ListVector.setReaderAndWriterIndex() sets writerIndex(0) and\nreaderIndex(0), readableBytes() returns 0 - 0 \u003d 0.\n\u003e \n\u003e Then when MessageSerializer.writeBatchBuffers() calls\nWriteChannel.write(buffer), it writes 0 bytes.\n\u003e\n\u003e So the flow is:\n\u003e \n\u003e valueCount\u003d0 → ListVector.setReaderAndWriterIndex() sets\noffsetBuffer.writerIndex(0)\n\u003e VectorUnloader.getFieldBuffers() returns the buffer with writerIndex\u003d0\n\u003e MessageSerializer.writeBatchBuffers() writes the buffer\n\u003e WriteChannel.write(buffer) checks buffer.readableBytes() which is 0\n\u003e 0 bytes are written to the IPC stream\n\u003e PyArrow read the batch with the missing buffer → crash when other\nlibraries to read\n\n### Fix\n\nSimplify `setReaderAndWriterIndex()` to always use `(valueCount + 1) *\nOFFSET_WIDTH` for offset buffer\u0027s `writerIndex`. When `valueCount \u003d\u003d 0`,\nthis correctly sets `writerIndex` to `OFFSET_WIDTH`, ensuring\n`offset[0]` is included in serialization.\n\n### Testing\n\nAdded tests for nested empty lists verifying offset buffer has correct\n`readableBytes()`.\n\nCloses #343.\n\n---------\n\nCo-authored-by: Yicong Huang \u003cyicong.huang+data@databricks.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "997b5a8b78d862fe19aeb9a39da4a3b00df010af",
      "old_mode": 33188,
      "old_path": "vector/src/main/java/org/apache/arrow/vector/complex/LargeListVector.java",
      "new_id": "92dd3eaef7dfedb1e1326b4585412a1a896f0d64",
      "new_mode": 33188,
      "new_path": "vector/src/main/java/org/apache/arrow/vector/complex/LargeListVector.java"
    },
    {
      "type": "modify",
      "old_id": "93a313ef4f7b58347ba1a4e683508b327350b153",
      "old_mode": 33188,
      "old_path": "vector/src/main/java/org/apache/arrow/vector/complex/ListVector.java",
      "new_id": "6c3993df6325c543268131bae8e8e7a2b904c6cd",
      "new_mode": 33188,
      "new_path": "vector/src/main/java/org/apache/arrow/vector/complex/ListVector.java"
    },
    {
      "type": "modify",
      "old_id": "ccc0d3e1763b2060bc20dd16bbf7f332f3c98092",
      "old_mode": 33188,
      "old_path": "vector/src/test/java/org/apache/arrow/vector/TestLargeListVector.java",
      "new_id": "bf9bba9c789b9bd3b349fe728b083a5f03b09071",
      "new_mode": 33188,
      "new_path": "vector/src/test/java/org/apache/arrow/vector/TestLargeListVector.java"
    },
    {
      "type": "modify",
      "old_id": "1fe4c59f6380eaef873deb41b61c4c929caa138a",
      "old_mode": 33188,
      "old_path": "vector/src/test/java/org/apache/arrow/vector/TestListVector.java",
      "new_id": "0c90b32abc3681c7956f3b9742191228fecc6825",
      "new_mode": 33188,
      "new_path": "vector/src/test/java/org/apache/arrow/vector/TestListVector.java"
    }
  ]
}
