From 5655f9d5933a8920d8dd7cedd2af611a9f2a8d35 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Sat, 8 Oct 2022 08:10:40 -0500 Subject: [PATCH] Fix scan to pointer to pointer to renamed type refs https://github.com/jackc/pgx/issues/1326 --- pgtype/pgtype.go | 7 ++++++- pgtype/pgtype_test.go | 12 ++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/pgtype/pgtype.go b/pgtype/pgtype.go index ce2336a2..536a5fd8 100644 --- a/pgtype/pgtype.go +++ b/pgtype/pgtype.go @@ -659,7 +659,12 @@ func TryFindUnderlyingTypeScanPlan(dst any) (plan WrappedScanPlanNextSetter, nex dstValue := reflect.ValueOf(dst) if dstValue.Kind() == reflect.Ptr { - elemValue := dstValue.Elem() + var elemValue reflect.Value + if dstValue.IsNil() { + elemValue = reflect.New(dstValue.Type().Elem()).Elem() + } else { + elemValue = dstValue.Elem() + } nextDstType := elemKindToPointerTypes[elemValue.Kind()] if nextDstType == nil && elemValue.Kind() == reflect.Slice { if elemValue.Type().Elem().Kind() == reflect.Uint8 { diff --git a/pgtype/pgtype_test.go b/pgtype/pgtype_test.go index 8363b3b8..721872d6 100644 --- a/pgtype/pgtype_test.go +++ b/pgtype/pgtype_test.go @@ -317,6 +317,18 @@ func TestMapEncodeBinaryFormatDatabaseValuerThatReturnsString(t *testing.T) { require.Equal(t, []byte{0, 0, 0, 42}, buf) } +// https://github.com/jackc/pgx/issues/1326 +func TestMapScanPointerToRenamedType(t *testing.T) { + srcBuf := []byte("foo") + m := pgtype.NewMap() + + var rs *_string + err := m.Scan(pgtype.TextOID, pgx.TextFormatCode, srcBuf, &rs) + assert.NoError(t, err) + require.NotNil(t, rs) + assert.Equal(t, "foo", string(*rs)) +} + func BenchmarkMapScanInt4IntoBinaryDecoder(b *testing.B) { m := pgtype.NewMap() src := []byte{0, 0, 0, 42}