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
@@ -156,6 +156,8 @@ func (Float4Codec) PlanScan(m *Map, oid uint32, format int16, target interface{}
return scanPlanBinaryFloat4ToFloat64Scanner{}
case Int64Scanner:
return scanPlanBinaryFloat4ToInt64Scanner{}
case TextScanner:
return scanPlanBinaryFloat4ToTextScanner{}
}
case TextFormatCode:
switch target.(type) {
@@ -229,6 +231,25 @@ func (scanPlanBinaryFloat4ToInt64Scanner) Scan(src []byte, dst interface{}) erro
return s.ScanInt64(Int8{Int64: i64, Valid: true})
}
type scanPlanBinaryFloat4ToTextScanner struct{}
func (scanPlanBinaryFloat4ToTextScanner) Scan(src []byte, dst interface{}) error {
s := (dst).(TextScanner)
if src == nil {
return s.ScanText(Text{})
}
if len(src) != 4 {
return fmt.Errorf("invalid length for float4: %v", len(src))
}
ui32 := int32(binary.BigEndian.Uint32(src))
f32 := math.Float32frombits(uint32(ui32))
return s.ScanText(Text{String: strconv.FormatFloat(float64(f32), 'f', -1, 32), Valid: true})
}
type scanPlanTextAnyToFloat32 struct{}
func (scanPlanTextAnyToFloat32) Scan(src []byte, dst interface{}) error {