Allow scanning tid to string

query-exec-mode
Jack Christensen 2022-01-20 20:59:36 -06:00
parent 5ca29a014e
commit c8b8764401
2 changed files with 34 additions and 0 deletions

View File

@ -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 {

View File

@ -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{})},
})