diff --git a/pgtype/uint32.go b/pgtype/uint32.go index 098c516c1..c01341099 100644 --- a/pgtype/uint32.go +++ b/pgtype/uint32.go @@ -205,6 +205,8 @@ func (Uint32Codec) PlanScan(m *Map, oid uint32, format int16, target any) ScanPl return scanPlanBinaryUint32ToUint32{} case Uint32Scanner: return scanPlanBinaryUint32ToUint32Scanner{} + case TextScanner: + return scanPlanBinaryUint32ToTextScanner{} } case TextFormatCode: switch target.(type) { @@ -282,6 +284,22 @@ func (scanPlanBinaryUint32ToUint32Scanner) Scan(src []byte, dst any) error { return s.ScanUint32(Uint32{Uint32: n, Valid: true}) } +type scanPlanBinaryUint32ToTextScanner struct{} + +func (scanPlanBinaryUint32ToTextScanner) Scan(src []byte, dst any) error { + s, ok := (dst).(TextScanner) + if !ok { + return ErrScanTargetTypeChanged + } + + if src == nil { + return s.ScanText(Text{}) + } + + n := uint64(binary.BigEndian.Uint32(src)) + return s.ScanText(Text{String: strconv.FormatUint(n, 10), Valid: true}) +} + type scanPlanTextAnyToUint32Scanner struct{} func (scanPlanTextAnyToUint32Scanner) Scan(src []byte, dst any) error { diff --git a/pgtype/uint32_test.go b/pgtype/uint32_test.go index 842de643f..efa4e2730 100644 --- a/pgtype/uint32_test.go +++ b/pgtype/uint32_test.go @@ -17,5 +17,6 @@ func TestUint32Codec(t *testing.T) { }, {pgtype.Uint32{}, new(pgtype.Uint32), isExpectedEq(pgtype.Uint32{})}, {nil, new(pgtype.Uint32), isExpectedEq(pgtype.Uint32{})}, + {"1147", new(string), isExpectedEq("1147")}, }) }