mirror of https://github.com/jackc/pgx.git
Remove rune to text conversion
Because rune is an alias for int32 this caused some very surprising results. e.g. inserting int32(65) into text would insert "A" instead of "65".non-blocking
parent
c1495aace0
commit
989a4835de
|
@ -28,8 +28,6 @@ func (EnumCodec) PlanEncode(m *Map, oid uint32, format int16, value any) EncodeP
|
|||
return encodePlanTextCodecString{}
|
||||
case []byte:
|
||||
return encodePlanTextCodecByteSlice{}
|
||||
case rune:
|
||||
return encodePlanTextCodecRune{}
|
||||
case TextValuer:
|
||||
return encodePlanTextCodecTextValuer{}
|
||||
}
|
||||
|
@ -48,8 +46,6 @@ func (c *EnumCodec) PlanScan(m *Map, oid uint32, format int16, target any) ScanP
|
|||
return scanPlanAnyToNewByteSlice{}
|
||||
case TextScanner:
|
||||
return &scanPlanTextAnyToEnumTextScanner{codec: c}
|
||||
case *rune:
|
||||
return scanPlanTextAnyToRune{}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,6 @@ import (
|
|||
"database/sql/driver"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
type TextScanner interface {
|
||||
|
@ -98,8 +97,6 @@ func (TextCodec) PlanEncode(m *Map, oid uint32, format int16, value any) EncodeP
|
|||
return encodePlanTextCodecString{}
|
||||
case []byte:
|
||||
return encodePlanTextCodecByteSlice{}
|
||||
case rune:
|
||||
return encodePlanTextCodecRune{}
|
||||
case TextValuer:
|
||||
return encodePlanTextCodecTextValuer{}
|
||||
}
|
||||
|
@ -124,14 +121,6 @@ func (encodePlanTextCodecByteSlice) Encode(value any, buf []byte) (newBuf []byte
|
|||
return buf, nil
|
||||
}
|
||||
|
||||
type encodePlanTextCodecRune struct{}
|
||||
|
||||
func (encodePlanTextCodecRune) Encode(value any, buf []byte) (newBuf []byte, err error) {
|
||||
r := value.(rune)
|
||||
buf = append(buf, string(r)...)
|
||||
return buf, nil
|
||||
}
|
||||
|
||||
type encodePlanTextCodecStringer struct{}
|
||||
|
||||
func (encodePlanTextCodecStringer) Encode(value any, buf []byte) (newBuf []byte, err error) {
|
||||
|
@ -169,8 +158,6 @@ func (TextCodec) PlanScan(m *Map, oid uint32, format int16, target any) ScanPlan
|
|||
return scanPlanAnyToByteScanner{}
|
||||
case TextScanner:
|
||||
return scanPlanTextAnyToTextScanner{}
|
||||
case *rune:
|
||||
return scanPlanTextAnyToRune{}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -223,24 +210,6 @@ func (scanPlanAnyToByteScanner) Scan(src []byte, dst any) error {
|
|||
return p.ScanBytes(src)
|
||||
}
|
||||
|
||||
type scanPlanTextAnyToRune struct{}
|
||||
|
||||
func (scanPlanTextAnyToRune) Scan(src []byte, dst any) error {
|
||||
if src == nil {
|
||||
return fmt.Errorf("cannot scan null into %T", dst)
|
||||
}
|
||||
|
||||
r, size := utf8.DecodeRune(src)
|
||||
if size != len(src) {
|
||||
return fmt.Errorf("cannot scan %v into %T: more than one rune received", src, dst)
|
||||
}
|
||||
|
||||
p := (dst).(*rune)
|
||||
*p = r
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
type scanPlanTextAnyToTextScanner struct{}
|
||||
|
||||
func (scanPlanTextAnyToTextScanner) Scan(src []byte, dst any) error {
|
||||
|
|
|
@ -33,11 +33,6 @@ func TestTextCodec(t *testing.T) {
|
|||
{"foo", new(string), isExpectedEq("foo")},
|
||||
{someFmtStringer{}, new(string), isExpectedEq("some fmt.Stringer")},
|
||||
})
|
||||
|
||||
// rune requires known OID because otherwise it is considered an int32.
|
||||
pgxtest.RunValueRoundTripTests(context.Background(), t, defaultConnTestRunner, pgxtest.KnownOIDQueryExecModes, pgTypeName, []pgxtest.ValueRoundTripTest{
|
||||
{rune('R'), new(rune), isExpectedEq(rune('R'))},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue