aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryenlinlai <38415072+yenlinlai@users.noreply.github.com>2019-03-18 16:45:03 +0800
committerJhih-Ming Huang <jm.huang@cobinhood.com>2019-05-06 10:44:04 +0800
commit8fd1dfb4027b6550133e7f3d7a152fbae54f56f8 (patch)
treec42645fdbc028124820a28c2d5bf692ce418fa5f
parent28b9792f69bcb0863d83d0045038712f31a80db4 (diff)
downloaddexon-8fd1dfb4027b6550133e7f3d7a152fbae54f56f8.tar.gz
dexon-8fd1dfb4027b6550133e7f3d7a152fbae54f56f8.tar.zst
dexon-8fd1dfb4027b6550133e7f3d7a152fbae54f56f8.zip
core: vm: sqlvm: types: fix encode bug when exponent is negative (#270)
It is possible that the number to encode is produced by arithmetic operations and has negative exponent even when it is an integer. Properly handle this case and modify test cases to check it.
-rw-r--r--core/vm/sqlvm/ast/types.go10
-rw-r--r--core/vm/sqlvm/ast/types_test.go4
2 files changed, 10 insertions, 4 deletions
diff --git a/core/vm/sqlvm/ast/types.go b/core/vm/sqlvm/ast/types.go
index 1928d2338..c006086e9 100644
--- a/core/vm/sqlvm/ast/types.go
+++ b/core/vm/sqlvm/ast/types.go
@@ -163,8 +163,14 @@ func decimalEncode(size int, d decimal.Decimal) []byte {
return ret
}
- exp := new(big.Int).Exp(bigIntTen, big.NewInt(int64(d.Exponent())), nil)
- b := new(big.Int).Mul(d.Coefficient(), exp)
+ var b *big.Int
+ if exponent := int64(d.Exponent()); exponent >= 0 {
+ exp := new(big.Int).Exp(bigIntTen, big.NewInt(exponent), nil)
+ b = new(big.Int).Mul(d.Coefficient(), exp)
+ } else {
+ exp := new(big.Int).Exp(bigIntTen, big.NewInt(-exponent), nil)
+ b = new(big.Int).Div(d.Coefficient(), exp)
+ }
if s > 0 {
bs := b.Bytes()
diff --git a/core/vm/sqlvm/ast/types_test.go b/core/vm/sqlvm/ast/types_test.go
index 17378d2bd..fe125ba2a 100644
--- a/core/vm/sqlvm/ast/types_test.go
+++ b/core/vm/sqlvm/ast/types_test.go
@@ -93,9 +93,9 @@ func (s *TypesTestSuite) TestDecodeError() {
}
func (s *TypesTestSuite) TestEncodeAndDecodeDecimal() {
- pos := decimal.New(15, 0)
+ pos := decimal.New(15, 1)
zero := decimal.Zero
- neg := decimal.New(-15, 0)
+ neg := decimal.New(-150, -1)
s.requireEncodeAndDecodeDecimalNoError(
ComposeDataType(DataTypeMajorInt, 2),