From c8052a51cc07657b09940b6ebe7192080a3aab0b Mon Sep 17 00:00:00 2001 From: thorfour Date: Tue, 1 Aug 2023 11:18:42 -0500 Subject: [PATCH 1/2] unit test to ensure ipc doesn't leak bytes --- go/arrow/ipc/reader_test.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/go/arrow/ipc/reader_test.go b/go/arrow/ipc/reader_test.go index a8930984fbf37..7bcf737af0d6d 100644 --- a/go/arrow/ipc/reader_test.go +++ b/go/arrow/ipc/reader_test.go @@ -56,3 +56,40 @@ func TestReaderCatchPanic(t *testing.T) { assert.Contains(t, err.Error(), "arrow/ipc: unknown error while reading") } } + +func TestReaderCheckedAllocator(t *testing.T) { + alloc := memory.NewCheckedAllocator(memory.NewGoAllocator()) + defer alloc.AssertSize(t, 0) + schema := arrow.NewSchema([]arrow.Field{ + { + Name: "s", + Type: &arrow.DictionaryType{ + ValueType: arrow.BinaryTypes.String, + IndexType: arrow.PrimitiveTypes.Int32, + }, + }, + }, nil) + + b := array.NewRecordBuilder(alloc, schema) + defer b.Release() + + bldr := b.Field(0).(*array.BinaryDictionaryBuilder) + bldr.Append([]byte("foo")) + bldr.Append([]byte("bar")) + bldr.Append([]byte("baz")) + + rec := b.NewRecord() + defer rec.Release() + + buf := new(bytes.Buffer) + writer := NewWriter(buf, WithSchema(schema), WithAllocator(alloc)) + defer writer.Close() + require.NoError(t, writer.Write(rec)) + + reader, err := NewReader(buf, WithAllocator(alloc)) + require.NoError(t, err) + defer reader.Release() + + _, err = reader.Read() + require.NoError(t, err) +} From e7c8f5ea748881447df2fa37a6a5e00270673668 Mon Sep 17 00:00:00 2001 From: thorfour Date: Tue, 1 Aug 2023 11:19:19 -0500 Subject: [PATCH 2/2] release dictionary from reader --- go/arrow/ipc/reader.go | 1 + 1 file changed, 1 insertion(+) diff --git a/go/arrow/ipc/reader.go b/go/arrow/ipc/reader.go index 99aab597ce950..bee48cf965682 100644 --- a/go/arrow/ipc/reader.go +++ b/go/arrow/ipc/reader.go @@ -159,6 +159,7 @@ func (r *Reader) Release() { r.r.Release() r.r = nil } + r.memo.Clear() } }