Skip to content

Commit

Permalink
types: floatStrToIntStr will failed in some case such as the… (#11376)
Browse files Browse the repository at this point in the history
  • Loading branch information
H-ZeX authored and zz-jason committed Jul 26, 2019
1 parent e09745b commit 5611acd
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 9 deletions.
26 changes: 17 additions & 9 deletions types/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -395,23 +395,30 @@ func getValidIntPrefix(sc *stmtctx.StatementContext, str string) (string, error)
return valid, nil
}

// roundIntStr is to round int string base on the number following dot.
// roundIntStr is to round a **valid int string** base on the number following dot.
func roundIntStr(numNextDot byte, intStr string) string {
if numNextDot < '5' {
return intStr
}
retStr := []byte(intStr)
for i := len(intStr) - 1; i >= 0; i-- {
if retStr[i] != '9' {
retStr[i]++
idx := len(intStr) - 1
for ; idx >= 1; idx-- {
if retStr[idx] != '9' {
retStr[idx]++
break
}
if i == 0 {
retStr[i] = '1'
retStr[idx] = '0'
}
if idx == 0 {
if intStr[0] == '9' {
retStr[0] = '1'
retStr = append(retStr, '0')
} else if isDigit(intStr[0]) {
retStr[0]++
} else {
retStr[1] = '1'
retStr = append(retStr, '0')
break
}
retStr[i] = '0'
}
return string(retStr)
}
Expand Down Expand Up @@ -458,6 +465,7 @@ func floatStrToIntStr(sc *stmtctx.StatementContext, validFloat string, oriStr st
}
return intStr, nil
}
// intCnt and digits contain the prefix `+/-` if validFloat[0] is `+/-`
var intCnt int
digits := make([]byte, 0, len(validFloat))
if dotIdx == -1 {
Expand All @@ -483,7 +491,7 @@ func floatStrToIntStr(sc *stmtctx.StatementContext, validFloat string, oriStr st
}
if intCnt <= 0 {
intStr = "0"
if intCnt == 0 && len(digits) > 0 {
if intCnt == 0 && len(digits) > 0 && isDigit(digits[0]) {
intStr = roundIntStr(digits[0], intStr)
}
return intStr, nil
Expand Down
16 changes: 16 additions & 0 deletions types/convert_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,21 @@ func (s *testTypeConvertSuite) TestConvert(c *C) {
signedAccept(c, mysql.TypeNewDecimal, dec, "-0.00123")
}

func (s *testTypeConvertSuite) TestRoundIntStr(c *C) {
cases := []struct {
a string
b byte
c string
}{
{"+999", '5', "+1000"},
{"999", '5', "1000"},
{"-999", '5', "-1000"},
}
for _, cc := range cases {
c.Assert(roundIntStr(cc.b, cc.a), Equals, cc.c)
}
}

func (s *testTypeConvertSuite) TestGetValidInt(c *C) {
tests := []struct {
origin string
Expand Down Expand Up @@ -821,6 +836,7 @@ func (s *testTypeConvertSuite) TestGetValidFloat(c *C) {
{".5", "1"},
{"123.456789e5", "12345679"},
{"123.456784e5", "12345678"},
{"+999.9999e2", "+100000"},
}
for _, t := range tests2 {
str, err := floatStrToIntStr(sc, t.origin, t.origin)
Expand Down

0 comments on commit 5611acd

Please sign in to comment.