diff --git a/go/arrow/ipc/ipc_test.go b/go/arrow/ipc/ipc_test.go index 2208a02a221..553ed2d9f34 100644 --- a/go/arrow/ipc/ipc_test.go +++ b/go/arrow/ipc/ipc_test.go @@ -589,3 +589,34 @@ func Example_listSlice() { // rows: 1 // col[0][list]: [["index3" "tag_int"]] } + +func TestIpcEmptyMap(t *testing.T) { + mem := memory.NewCheckedAllocator(memory.DefaultAllocator) + defer mem.AssertSize(t, 0) + + dt := arrow.MapOf(arrow.BinaryTypes.String, arrow.BinaryTypes.String) + schema := arrow.NewSchema([]arrow.Field{{ + Name: "map", + Type: dt, + }}, nil) + + arr, _, err := array.FromJSON(mem, dt, strings.NewReader(`[]`)) + require.NoError(t, err) + defer arr.Release() + + rec := array.NewRecord(schema, []arrow.Array{arr}, int64(arr.Len())) + defer rec.Release() + + var buf bytes.Buffer + w := ipc.NewWriter(&buf, ipc.WithSchema(rec.Schema())) + require.NoError(t, w.Write(rec)) + assert.NoError(t, w.Close()) + + r, err := ipc.NewReader(&buf) + require.NoError(t, err) + defer r.Release() + + assert.True(t, r.Next()) + assert.Zero(t, r.Record().NumRows()) + assert.True(t, arrow.TypeEqual(dt, r.Record().Column(0).DataType())) +} diff --git a/go/arrow/ipc/writer.go b/go/arrow/ipc/writer.go index 088c6419526..89412e3b490 100644 --- a/go/arrow/ipc/writer.go +++ b/go/arrow/ipc/writer.go @@ -649,44 +649,7 @@ func (w *recordEncoder) visit(p *Payload, arr arrow.Array) error { } } w.depth++ - case *arrow.MapType: - arr := arr.(*array.Map) - voffsets, err := w.getZeroBasedValueOffsets(arr) - if err != nil { - return fmt.Errorf("could not retrieve zero-based value offsets for array %T: %w", arr, err) - } - p.body = append(p.body, voffsets) - - w.depth-- - var ( - values = arr.ListValues() - mustRelease = false - values_offset int64 - values_end int64 - ) - defer func() { - if mustRelease { - values.Release() - } - }() - - if voffsets != nil { - values_offset, _ = arr.ValueOffsets(0) - _, values_end = arr.ValueOffsets(arr.Len() - 1) - } - - if arr.Len() != 0 || values_end < int64(values.Len()) { - // must also slice the values - values = array.NewSlice(values, values_offset, values_end) - mustRelease = true - } - err = w.visit(p, values) - - if err != nil { - return fmt.Errorf("could not visit list element for array %T: %w", arr, err) - } - w.depth++ - case *arrow.ListType, *arrow.LargeListType: + case *arrow.MapType, *arrow.ListType, *arrow.LargeListType: arr := arr.(array.ListLike) voffsets, err := w.getZeroBasedValueOffsets(arr) if err != nil {