From 5cd8468b999c5b9c7d6400c1b70691c5b3d9e2a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20R=C3=B6hrich?= Date: Thu, 9 Feb 2023 23:41:04 +0100 Subject: [PATCH] replace erroneous reflect.New with reflect.Zero in TryWrapStructScanPlan --- pgtype/pgtype.go | 2 +- pgtype/pgtype_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/pgtype/pgtype.go b/pgtype/pgtype.go index 7dcdc68b..7b300709 100644 --- a/pgtype/pgtype.go +++ b/pgtype/pgtype.go @@ -1028,7 +1028,7 @@ func TryWrapStructScanPlan(target any) (plan WrappedScanPlanNextSetter, nextValu var targetElemValue reflect.Value if targetValue.IsNil() { - targetElemValue = reflect.New(targetValue.Type().Elem()) + targetElemValue = reflect.Zero(targetValue.Type().Elem()) } else { targetElemValue = targetValue.Elem() } diff --git a/pgtype/pgtype_test.go b/pgtype/pgtype_test.go index 5574b676..cbdcb656 100644 --- a/pgtype/pgtype_test.go +++ b/pgtype/pgtype_test.go @@ -291,6 +291,39 @@ func TestScanPlanInterface(t *testing.T) { assert.Error(t, err) } +func TestPointerPointerStructScan(t *testing.T) { + m := pgtype.NewMap() + type composite struct { + ID int + } + + int4Type, _ := m.TypeForOID(pgtype.Int4OID) + pgt := &pgtype.Type{ + Codec: &pgtype.CompositeCodec{ + Fields: []pgtype.CompositeCodecField{ + { + Name: "id", + Type: int4Type, + }, + }, + }, + Name: "composite", + OID: 215333, + } + m.RegisterType(pgt) + + var c *composite + plan := m.PlanScan(pgt.OID, pgtype.BinaryFormatCode, &c) + err := plan.Scan([]byte{ + 0, 0, 0, 1, + 0, 0, 0, 23, + 0, 0, 0, 4, + 0, 0, 0, 1, + }, &c) + require.NoError(t, err) + require.Equal(t, c.ID, 1) +} + // https://github.com/jackc/pgx/issues/1263 func TestMapScanPtrToPtrToSlice(t *testing.T) { m := pgtype.NewMap()