CurtHagenlocher opened a new pull request, #444:
URL: https://github.com/apache/arrow-dotnet/pull/444

   ## What's Changed
   
   Fixes the three `ArrowArrayConcatenator` problems reported in #443, plus a 
related lifetime issue found while fixing them.
   
   - **Extension arrays are concatenated.** `ExtensionType.Accept` passes the 
visitor through to the storage type, so the storage visitor then rejected the 
`Extension` type ID. `ArrayDataConcatenator.Concatenate` now checks for an 
extension type first. It requires every input to have the same extension name 
and metadata, concatenates the storage arrays, and puts the extension type back 
on the result. This path also applies to child arrays, so e.g. a list of 
`GuidArray`s works too.
   - **View results own their data buffers.** `ConcatenateBinaryViewArrayData` 
now calls `Retain()` on each variadic data buffer it takes from an input. The 
result stays valid after the inputs (including `SliceShared` inputs) are 
disposed.
   - **Empty view inputs with data buffers no longer throw.** The loop that 
copies data buffers now skips zero-length inputs, just as 
`ConcatenateViewBuffer` already did when counting them. The buffer count and 
the view buffer indices now match.
   - **Other results that aliased an input now retain it.** The result used to 
share an input's memory without holding a reference in three cases: a single 
input to either `Concatenate` method, a nested child where only one input 
contributed values (for example, lists where only one has values), and the 
zero-length child or values array used when every input is empty. These now use 
`Retain()` / `SliceShared(0, 0)`.
   
   Note: a single-input `Concatenate` call now returns a new array that holds 
its own references, not the input object itself. The caller should dispose it 
like any other concatenation result.
   
   ### Tests
   
   Eight new tests in `ArrowArrayConcatenatorTests` cover extension arrays 
(plain, nested in a list, mismatched types), view results that outlive their 
inputs (plain and `SliceShared`), empty view inputs with data buffers, and 
results that outlive a single input, a list with one non-empty input, and a 
run-end encoded array with one non-empty input. All eight fail without the fix. 
The full `Apache.Arrow.Tests` suite passes on net8.0, net462 and net472.
   
   Closes #443.
   
   🤖 Generated with [Claude Code](https://claude.com/claude-code)
   


-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to