2
0

Better number to string handling

Avoid ambiguity of stringWrapper implementing Int64Scanner and
Float64Scanner.
This commit is contained in:
Jack Christensen
2022-04-09 09:09:46 -05:00
parent 8cf6721d66
commit 829babcea9
13 changed files with 180 additions and 41 deletions
+21
View File
@@ -194,6 +194,8 @@ func (Float8Codec) PlanScan(m *Map, oid uint32, format int16, target interface{}
return scanPlanBinaryFloat8ToFloat64Scanner{}
case Int64Scanner:
return scanPlanBinaryFloat8ToInt64Scanner{}
case TextScanner:
return scanPlanBinaryFloat8ToTextScanner{}
}
case TextFormatCode:
switch target.(type) {
@@ -267,6 +269,25 @@ func (scanPlanBinaryFloat8ToInt64Scanner) Scan(src []byte, dst interface{}) erro
return s.ScanInt64(Int8{Int64: i64, Valid: true})
}
type scanPlanBinaryFloat8ToTextScanner struct{}
func (scanPlanBinaryFloat8ToTextScanner) Scan(src []byte, dst interface{}) error {
s := (dst).(TextScanner)
if src == nil {
return s.ScanText(Text{})
}
if len(src) != 8 {
return fmt.Errorf("invalid length for float8: %v", len(src))
}
ui64 := int64(binary.BigEndian.Uint64(src))
f64 := math.Float64frombits(uint64(ui64))
return s.ScanText(Text{String: strconv.FormatFloat(f64, 'f', -1, 64), Valid: true})
}
type scanPlanTextAnyToFloat64 struct{}
func (scanPlanTextAnyToFloat64) Scan(src []byte, dst interface{}) error {