diff options
author | Chad MILLER <chad@mysql.com> | 2008-07-10 14:47:53 -0400 |
---|---|---|
committer | Chad MILLER <chad@mysql.com> | 2008-07-10 14:47:53 -0400 |
commit | 6a6e77eeffc7dbd72888ef685fdb93fc2ae7aed6 (patch) | |
tree | d78d316822f255f22093dc0cc26ea8943b5f91d4 /strings/decimal.c | |
parent | 5e0d806d276d27fef1a5dfcdca92f010836510ed (diff) | |
parent | 1aaa63aabaef8015c71fc6143b3062e197049707 (diff) | |
download | mariadb-git-6a6e77eeffc7dbd72888ef685fdb93fc2ae7aed6.tar.gz |
Merge chunk from trunk.
Diffstat (limited to 'strings/decimal.c')
-rw-r--r-- | strings/decimal.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/strings/decimal.c b/strings/decimal.c index cbea0e340c6..3176cf6afa7 100644 --- a/strings/decimal.c +++ b/strings/decimal.c @@ -1595,9 +1595,21 @@ decimal_round(decimal_t *from, decimal_t *to, int scale, x+=10; *buf1=powers10[pos]*(x-y); } - if (frac0 < 0) + /* + In case we're rounding e.g. 1.5e9 to 2.0e9, the decimal_digit_t's inside + the buffer are as follows. + + Before <1, 5e8> + After <2, 5e8> + + Hence we need to set the 2nd field to 0. + The same holds if we round 1.5e-9 to 2e-9. + */ + if (frac0 < frac1) { - dec1 *end=to->buf+intg0, *buf=buf1+1; + dec1 *buf= to->buf + ((scale == 0 && intg0 == 0) ? 1 : intg0 + frac0); + dec1 *end= to->buf + len; + while (buf < end) *buf++=0; } |