summaryrefslogtreecommitdiff
path: root/vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go')
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go17
1 files changed, 14 insertions, 3 deletions
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go b/vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go
index ba7c9112e..08c39514b 100644
--- a/vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go
+++ b/vendor/go.mongodb.org/mongo-driver/bson/primitive/decimal.go
@@ -164,9 +164,6 @@ func (d Decimal128) BigInt() (*big.Int, int, error) {
// Would be handled by the logic below, but that's trivial and common.
if high == 0 && low == 0 && exp == 0 {
- if posSign {
- return new(big.Int), 0, nil
- }
return new(big.Int), 0, nil
}
@@ -328,6 +325,7 @@ func ParseDecimal128(s string) (Decimal128, error) {
return dErr(s)
}
+ // Parse the significand (i.e. the non-exponent part) as a big.Int.
bi, ok := new(big.Int).SetString(intPart+decPart, 10)
if !ok {
return dErr(s)
@@ -360,6 +358,19 @@ func ParseDecimal128FromBigInt(bi *big.Int, exp int) (Decimal128, bool) {
q := new(big.Int)
r := new(big.Int)
+ // If the significand is zero, the logical value will always be zero, independent of the
+ // exponent. However, the loops for handling out-of-range exponent values below may be extremely
+ // slow for zero values because the significand never changes. Limit the exponent value to the
+ // supported range here to prevent entering the loops below.
+ if bi.Cmp(zero) == 0 {
+ if exp > MaxDecimal128Exp {
+ exp = MaxDecimal128Exp
+ }
+ if exp < MinDecimal128Exp {
+ exp = MinDecimal128Exp
+ }
+ }
+
for bigIntCmpAbs(bi, maxS) == 1 {
bi, _ = q.QuoRem(bi, ten, r)
if r.Cmp(zero) != 0 {