[
https://issues.apache.org/jira/browse/ARROW-18274?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Matthew Topol resolved ARROW-18274.
-----------------------------------
Fix Version/s: 11.0.0
Resolution: Fixed
Issue resolved by pull request 14604
[https://github.com/apache/arrow/pull/14604]
> [Go] Sparse union of structs is buggy
> -------------------------------------
>
> Key: ARROW-18274
> URL: https://issues.apache.org/jira/browse/ARROW-18274
> Project: Apache Arrow
> Issue Type: Bug
> Components: Go
> Affects Versions: 10.0.0
> Reporter: Laurent Querel
> Assignee: Matthew Topol
> Priority: Major
> Labels: pull-request-available
> Fix For: 11.0.0
>
> Time Spent: 0.5h
> Remaining Estimate: 0h
>
> There is a bug with union of structs in V10.
> The first unit test crash with a panic (i.e. invalid memory address or nil
> pointer dereference). The second test works as expected.
>
> {code:go}
> func TestDoesNotWork(t *testing.T) {
> dt1 := arrow.SparseUnionOf([]arrow.Field{
> {Name: "c", Type: arrow2.DictU16String},
> }, []arrow.UnionTypeCode{0})
> dt2 := arrow.StructOf(
> arrow.Field{Name: "b", Type: dt1},
> )
> dt3 := arrow.SparseUnionOf([]arrow.Field{
> {Name: "a", Type: dt2},
> }, []arrow.UnionTypeCode{0})
> pool := memory.NewGoAllocator()
> builder := array.NewSparseUnionBuilder(pool, dt3)
> defer builder.Release()
> arr := builder.NewArray()
> defer arr.Release()
> assert.Equal(t, 0, arr.Len())
> }
> func TestWorksAsExpected(t *testing.T) {
> dt1 := arrow.SparseUnionOf([]arrow.Field{
> {Name: "c", Type: &arrow.DictionaryType{
> IndexType: arrow.PrimitiveTypes.Uint16,
> ValueType: arrow.BinaryTypes.String,
> Ordered: false,
> }},
> }, []arrow.UnionTypeCode{0})
> dt2 := arrow.SparseUnionOf([]arrow.Field{
> {Name: "a", Type: dt1},
> }, []arrow.UnionTypeCode{0})
> pool := memory.NewGoAllocator()
> builder := array.NewSparseUnionBuilder(pool, dt2)
> defer builder.Release()
> arr := builder.NewArray()
> defer arr.Release()
> assert.Equal(t, 0, arr.Len())
> } {code}
>
> *Analysis:*
> - The `NewSparseUnionBuilder` calls the builders for each variant and also
> calls defer builder.Release.
> - The Struct Release method calls the Release methods of every field even if
> the refCount is not 0, so the Release method of the second union is called
> followed by the Release method of the dictionary.
> - Although, the union builder is returned without error, the builder is not
> usable.
> - This bug doesn't happen with 2 nested unions. As the internal counter is
> properly tested.
>
> First, I don't understand why the Release method of each variant is called
> right after the Union constructor is created. I also don't understand why the
> Release method of the structure calls the Release method of each field
> regardless of the value of the internal refCount. This looks like a bug to
> me, but I'm not quite sure yet what the right way to fix it will be.
>
> Any idea?
--
This message was sent by Atlassian Jira
(v8.20.10#820010)