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}