diff --git a/pgtype/tid.go b/pgtype/tid.go index 624b3c2a..450cfbc9 100644 --- a/pgtype/tid.go +++ b/pgtype/tid.go @@ -137,6 +137,8 @@ func (TIDCodec) PlanScan(ci *ConnInfo, oid uint32, format int16, target interfac switch target.(type) { case TIDScanner: return scanPlanBinaryTIDToTIDScanner{} + case TextScanner: + return scanPlanBinaryTIDToTextScanner{} } case TextFormatCode: switch target.(type) { @@ -168,6 +170,28 @@ func (scanPlanBinaryTIDToTIDScanner) Scan(ci *ConnInfo, oid uint32, formatCode i }) } +type scanPlanBinaryTIDToTextScanner struct{} + +func (scanPlanBinaryTIDToTextScanner) Scan(ci *ConnInfo, oid uint32, formatCode int16, src []byte, dst interface{}) error { + scanner := (dst).(TextScanner) + + if src == nil { + return scanner.ScanText(Text{}) + } + + if len(src) != 6 { + return fmt.Errorf("invalid length for tid: %v", len(src)) + } + + blockNumber := binary.BigEndian.Uint32(src) + offsetNumber := binary.BigEndian.Uint16(src[4:]) + + return scanner.ScanText(Text{ + String: fmt.Sprintf(`(%d,%d)`, blockNumber, offsetNumber), + Valid: true, + }) +} + type scanPlanTextAnyToTIDScanner struct{} func (scanPlanTextAnyToTIDScanner) Scan(ci *ConnInfo, oid uint32, formatCode int16, src []byte, dst interface{}) error { diff --git a/pgtype/tid_test.go b/pgtype/tid_test.go index 4203a471..0d3afe5e 100644 --- a/pgtype/tid_test.go +++ b/pgtype/tid_test.go @@ -18,6 +18,16 @@ func TestTIDCodec(t *testing.T) { new(pgtype.TID), isExpectedEq(pgtype.TID{BlockNumber: 4294967295, OffsetNumber: 65535, Valid: true}), }, + { + pgtype.TID{BlockNumber: 42, OffsetNumber: 43, Valid: true}, + new(string), + isExpectedEq("(42,43)"), + }, + { + pgtype.TID{BlockNumber: 4294967295, OffsetNumber: 65535, Valid: true}, + new(string), + isExpectedEq("(4294967295,65535)"), + }, {pgtype.TID{}, new(pgtype.TID), isExpectedEq(pgtype.TID{})}, {nil, new(pgtype.TID), isExpectedEq(pgtype.TID{})}, })