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-03-26 17:48:22 +0800
commit063a8f6370f55404709cff25d476d1bba4b6ec48 (patch)
tree4a6715c467b6973bb795af01cb28fe90e3f1180f
parent382a5c1b3640e5a17fe1484aa8d650858a710abd (diff)
downloaddexon-063a8f6370f55404709cff25d476d1bba4b6ec48.tar.gz
dexon-063a8f6370f55404709cff25d476d1bba4b6ec48.tar.zst
dexon-063a8f6370f55404709cff25d476d1bba4b6ec48.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),