2
0

Fix binary decoding of very large numerics.

fixes #133
This commit is contained in:
Jack Christensen
2021-10-30 10:17:58 -05:00
parent 2caf113f1b
commit a29019de9d
2 changed files with 10 additions and 3 deletions
+3 -3
View File
@@ -452,11 +452,11 @@ func (dst *Numeric) DecodeBinary(ci *ConnInfo, src []byte) error {
}
rp := 0
ndigits := int16(binary.BigEndian.Uint16(src[rp:]))
ndigits := binary.BigEndian.Uint16(src[rp:])
rp += 2
weight := int16(binary.BigEndian.Uint16(src[rp:]))
rp += 2
sign := uint16(binary.BigEndian.Uint16(src[rp:]))
sign := binary.BigEndian.Uint16(src[rp:])
rp += 2
dscale := int16(binary.BigEndian.Uint16(src[rp:]))
rp += 2
@@ -504,7 +504,7 @@ func (dst *Numeric) DecodeBinary(ci *ConnInfo, src []byte) error {
exp := (int32(weight) - int32(ndigits) + 1) * 4
if dscale > 0 {
fracNBaseDigits := ndigits - weight - 1
fracNBaseDigits := int16(int32(ndigits) - int32(weight) - 1)
fracDecimalDigits := fracNBaseDigits * 4
if dscale > fracDecimalDigits {
+7
View File
@@ -117,6 +117,10 @@ func TestNumericNormalize(t *testing.T) {
}
func TestNumericTranscode(t *testing.T) {
max := new(big.Int).Exp(big.NewInt(10), big.NewInt(147454), nil)
max.Add(max, big.NewInt(1))
longestNumeric := &pgtype.Numeric{Int: max, Exp: -16383, Status: pgtype.Present}
testutil.TestSuccessfulTranscodeEqFunc(t, "numeric", []interface{}{
&pgtype.Numeric{NaN: true, Status: pgtype.Present},
@@ -151,6 +155,9 @@ func TestNumericTranscode(t *testing.T) {
&pgtype.Numeric{Int: mustParseBigInt(t, "423409823409243892349028349023482934092340892390101"), Exp: -92, Status: pgtype.Present},
&pgtype.Numeric{Int: mustParseBigInt(t, "23409823409243892349028349023482934092340892390101"), Exp: -93, Status: pgtype.Present},
&pgtype.Numeric{Int: mustParseBigInt(t, "3409823409243892349028349023482934092340892390101"), Exp: -94, Status: pgtype.Present},
longestNumeric,
&pgtype.Numeric{Status: pgtype.Null},
}, func(aa, bb interface{}) bool {
a := aa.(pgtype.Numeric)