From ab939af91954c46f4e7d8b7acf1ed0ff92d28310 Mon Sep 17 00:00:00 2001
From: wmin0 <wmin0@cobinhood.com>
Date: Mon, 18 Feb 2019 18:52:06 +0800
Subject: core: vm: sqlvm: parser: toDecimal handle .0

To cover the pitfall of decimal.fromString, we need to add leading 0 at
'^\.[0-9]+' case.
---
 core/vm/sqlvm/parser/parser.go      | 3 +++
 core/vm/sqlvm/parser/parser_test.go | 1 +
 2 files changed, 4 insertions(+)

(limited to 'core/vm')

diff --git a/core/vm/sqlvm/parser/parser.go b/core/vm/sqlvm/parser/parser.go
index 76fa15cdc..2e882ea3c 100644
--- a/core/vm/sqlvm/parser/parser.go
+++ b/core/vm/sqlvm/parser/parser.go
@@ -95,6 +95,9 @@ func toUint(b []byte) (uint32, errors.ErrorCode) {
 }
 
 func toDecimal(b []byte) (decimal.Decimal, errors.ErrorCode) {
+	if len(b) > 0 && b[0] == byte('.') {
+		b = append([]byte{'0'}, b...)
+	}
 	d, err := decimal.NewFromString(string(b))
 	return d, convertDecimalError(err)
 }
diff --git a/core/vm/sqlvm/parser/parser_test.go b/core/vm/sqlvm/parser/parser_test.go
index 77c3c16ff..bed734c60 100644
--- a/core/vm/sqlvm/parser/parser_test.go
+++ b/core/vm/sqlvm/parser/parser_test.go
@@ -22,6 +22,7 @@ func (s *ParserTestSuite) TestParse() {
 
 	// Test expr.
 	s.requireParseNoError(`select 1 + 2 * 3`)
+	s.requireParseNoError(`select .0`)
 	s.requireParseNoError(`select a(1 + 1)`)
 	s.requireParseNoError(`select hEx'12'`)
 	s.requireParseNoError(`select x'12'`)
-- 
cgit v1.2.3