diff --git a/parquet/variant/variant.go b/parquet/variant/variant.go index 0e8a904b5..25eacd430 100644 --- a/parquet/variant/variant.go +++ b/parquet/variant/variant.go @@ -258,7 +258,8 @@ func (m Metadata) KeyAt(id uint32) (string, error) { id, len(m.keys)) } - return unsafe.String(&m.keys[id][0], len(m.keys[id])), nil + key := m.keys[id] + return unsafe.String(unsafe.SliceData(key), len(key)), nil } // IdFor returns the dictionary IDs for the given key. diff --git a/parquet/variant/variant_test.go b/parquet/variant/variant_test.go index b2f55339a..649a719c7 100644 --- a/parquet/variant/variant_test.go +++ b/parquet/variant/variant_test.go @@ -122,6 +122,22 @@ func TestBasicRead(t *testing.T) { }) } +func TestMetadataEmptyKey(t *testing.T) { + var b variant.Builder + start := b.Offset() + fields := []variant.FieldEntry{b.NextField(start, "")} + require.NoError(t, b.AppendNull()) + require.NoError(t, b.FinishObject(start, fields)) + value, err := b.Build() + require.NoError(t, err) + metadata := value.Metadata() + + key, err := metadata.KeyAt(0) + require.NoError(t, err) + assert.Empty(t, key) + assert.Equal(t, []uint32{0}, metadata.IdFor("")) +} + func loadVariant(t *testing.T, test string) variant.Value { dir := getVariantDir() if dir == "" {