diff --git a/pgtype/pgtype.go b/pgtype/pgtype.go index bd065e01..5180e27a 100644 --- a/pgtype/pgtype.go +++ b/pgtype/pgtype.go @@ -952,7 +952,12 @@ func TryWrapStructScanPlan(target interface{}) (plan WrappedScanPlanNextSetter, return nil, nil, false } - targetElemValue := targetValue.Elem() + var targetElemValue reflect.Value + if targetValue.IsNil() { + targetElemValue = reflect.New(targetValue.Type().Elem()) + } else { + targetElemValue = targetValue.Elem() + } targetElemType := targetElemValue.Type() if targetElemType.Kind() == reflect.Struct { diff --git a/pgtype/pgtype_test.go b/pgtype/pgtype_test.go index ff19790a..776d176c 100644 --- a/pgtype/pgtype_test.go +++ b/pgtype/pgtype_test.go @@ -175,6 +175,15 @@ func TestTypeMapScanUnregisteredOIDToCustomType(t *testing.T) { assert.Nil(t, pCt) } +func TestTypeMapScanPointerToNilStructDoesNotCrash(t *testing.T) { + m := pgtype.NewMap() + + type myStruct struct{} + var p *myStruct + err := m.Scan(0, pgx.TextFormatCode, []byte("(foo,bar)"), &p) + require.NotNil(t, err) +} + func TestTypeMapScanUnknownOIDTextFormat(t *testing.T) { m := pgtype.NewMap()