diff options
author | unknown <serg@serg.mylan> | 2004-11-27 13:54:51 +0100 |
---|---|---|
committer | unknown <serg@serg.mylan> | 2004-11-27 13:54:51 +0100 |
commit | df1f7cab7076d1299a61a53e366dc5b86eb85437 (patch) | |
tree | b4e00b99ad5188f38a09eb82ffbe067886c5a20e /strings | |
parent | 87347253cee1e7bad8c918988a15e70ee6e25715 (diff) | |
download | mariadb-git-df1f7cab7076d1299a61a53e366dc5b86eb85437.tar.gz |
fix decimal2longlong too
mysql-test/r/rpl_start_stop_slave.result:
results updated
Diffstat (limited to 'strings')
-rw-r--r-- | strings/decimal.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/strings/decimal.c b/strings/decimal.c index 9b418dbe550..6e607aaa173 100644 --- a/strings/decimal.c +++ b/strings/decimal.c @@ -532,7 +532,7 @@ int decimal2longlong(decimal *from, longlong *to) { dec1 *buf=from->buf; longlong x=0; - int intg; + int intg, frac; for (intg=from->intg; intg > 0; intg-=DIG_PER_DEC1) { @@ -540,11 +540,11 @@ int decimal2longlong(decimal *from, longlong *to) /* Attention: trick! we're calculating -|from| instead of |from| here - because |MIN_LONGLONG| > MAX_LONGLONG + because |LONGLONG_MIN| > LONGLONG_MAX so we can convert -9223372036854775808 correctly */ x=x*DIG_BASE - *buf++; - if (unlikely(x > y)) + if (unlikely(y < (LONGLONG_MAX/DIG_BASE) || x > y)) { *to= from->sign ? y : -y; return E_DEC_OVERFLOW; @@ -558,7 +558,10 @@ int decimal2longlong(decimal *from, longlong *to) } *to=from->sign ? x : -x; - return from->frac ? E_DEC_TRUNCATED : E_DEC_OK; + for (frac=from->frac; unlikely(frac > 0); frac-=DIG_PER_DEC1) + if (*buf++) + return E_DEC_TRUNCATED; + return E_DEC_OK; } /* |