2
0

pgtype: Fix -0 for numeric types

Due to the special case of when the digits string was longer than 1 but
only contained the negative sign and a 0, it was incorrectly stripping
the 0 and attempting to parse "-" as a number.

The solution is to check an extra position along to make sure a trailing
0 is not immediately preceeded by a negetive sign.

Fixes #543
This commit is contained in:
David Hudson
2019-06-07 15:08:36 +01:00
parent 9be6a06c27
commit d678216f46
3 changed files with 19 additions and 1 deletions
+1 -1
View File
@@ -321,7 +321,7 @@ func parseNumericString(str string) (n *big.Int, exp int32, err error) {
if len(parts) > 1 {
exp = int32(-len(parts[1]))
} else {
for len(digits) > 1 && digits[len(digits)-1] == '0' {
for len(digits) > 1 && digits[len(digits)-1] == '0' && digits[len(digits)-2] != '-' {
digits = digits[:len(digits)-1]
exp++
}
+15
View File
@@ -1,6 +1,7 @@
package pgtype_test
import (
"math"
"math/big"
"reflect"
"testing"
@@ -65,6 +66,13 @@ func TestNumericArraySet(t *testing.T) {
Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
Status: pgtype.Present},
},
{
source: []float32{float32(math.Copysign(0, -1))},
result: pgtype.NumericArray{
Elements: []pgtype.Numeric{{Int: big.NewInt(0), Status: pgtype.Present}},
Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
Status: pgtype.Present},
},
{
source: []float64{1},
result: pgtype.NumericArray{
@@ -72,6 +80,13 @@ func TestNumericArraySet(t *testing.T) {
Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
Status: pgtype.Present},
},
{
source: []float64{math.Copysign(0, -1)},
result: pgtype.NumericArray{
Elements: []pgtype.Numeric{{Int: big.NewInt(0), Status: pgtype.Present}},
Dimensions: []pgtype.ArrayDimension{{LowerBound: 1, Length: 1}},
Status: pgtype.Present},
},
{
source: (([]float32)(nil)),
result: pgtype.NumericArray{Status: pgtype.Null},
+3
View File
@@ -1,6 +1,7 @@
package pgtype_test
import (
"math"
"math/big"
"math/rand"
"reflect"
@@ -188,7 +189,9 @@ func TestNumericSet(t *testing.T) {
result *pgtype.Numeric
}{
{source: float32(1), result: &pgtype.Numeric{Int: big.NewInt(1), Status: pgtype.Present}},
{source: float32(math.Copysign(0, -1)), result: &pgtype.Numeric{Int: big.NewInt(0), Status: pgtype.Present}},
{source: float64(1), result: &pgtype.Numeric{Int: big.NewInt(1), Status: pgtype.Present}},
{source: float64(math.Copysign(0, -1)), result: &pgtype.Numeric{Int: big.NewInt(0), Status: pgtype.Present}},
{source: int8(1), result: &pgtype.Numeric{Int: big.NewInt(1), Status: pgtype.Present}},
{source: int16(1), result: &pgtype.Numeric{Int: big.NewInt(1), Status: pgtype.Present}},
{source: int32(1), result: &pgtype.Numeric{Int: big.NewInt(1), Status: pgtype.Present}},