diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-08-10 18:40:57 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-08-10 18:40:57 +0300 |
commit | bafc5c1321a7dff5f2da292111bf98fed9d1658d (patch) | |
tree | b674bceb1f1fe8b2dc9a8fb7c1aeca6fd1b95dde /strings | |
parent | 0025eb3f963fdca88028ff14a27d9b9638079337 (diff) | |
parent | 3b6dadb5ebedab71bf1870579745ff3cd05e498a (diff) | |
download | mariadb-git-bafc5c1321a7dff5f2da292111bf98fed9d1658d.tar.gz |
Merge 10.2 into 10.3
Diffstat (limited to 'strings')
-rw-r--r-- | strings/decimal.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/strings/decimal.c b/strings/decimal.c index 59e60e0a328..9dae3d987f2 100644 --- a/strings/decimal.c +++ b/strings/decimal.c @@ -812,6 +812,24 @@ internal_str2dec(const char *from, decimal_t *to, char **end, my_bool fixed) while (s < end_of_string && my_isdigit(&my_charset_latin1, *s)) s++; intg= (int) (s-s1); + /* + If the integer part is long enough and it has multiple leading zeros, + let's trim them, so this expression can return 1 without overflowing: + CAST(CONCAT(REPEAT('0',90),'1') AS DECIMAL(10)) + */ + if (intg > DIG_PER_DEC1 && s1[0] == '0' && s1[1] == '0') + { + /* + Keep at least one digit, to avoid an empty string. + So we trim '0000' to '0' rather than to ''. + Otherwise the below code (converting digits to to->buf) + would fail on a fatal error. + */ + const char *iend= s - 1; + for ( ; s1 < iend && *s1 == '0'; s1++) + { } + intg= (int) (s-s1); + } if (s < end_of_string && *s=='.') { endp= s+1; |