Fix for bug #10632 (CEILING returns wrong result)
mysql-test/r/func_math.result: test result fixed mysql-test/t/func_math.test: test case added strings/decimal.c: handling of round_digit changed - we have to check all the digits after the point if round_digit is 0
This commit is contained in:
parent
b0502fc200
commit
df60c7ef2d
@ -146,3 +146,9 @@ drop table t1;
|
||||
select round(150, 2);
|
||||
round(150, 2)
|
||||
150.00
|
||||
select ceil(0.09);
|
||||
ceil(0.09)
|
||||
1
|
||||
select ceil(0.000000000000000009);
|
||||
ceil(0.000000000000000009)
|
||||
1
|
||||
|
@ -84,3 +84,10 @@ drop table t1;
|
||||
# Bug #10083 (round doesn't increase decimals)
|
||||
#
|
||||
select round(150, 2);
|
||||
|
||||
#
|
||||
# Bug @10632 (Ceiling function returns wrong answer)
|
||||
#
|
||||
select ceil(0.09);
|
||||
select ceil(0.000000000000000009);
|
||||
|
||||
|
@ -1490,11 +1490,31 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
|
||||
buf1+=intg0+frac0-1;
|
||||
if (scale == frac0*DIG_PER_DEC1)
|
||||
{
|
||||
int do_inc= FALSE;
|
||||
DBUG_ASSERT(frac0+intg0 >= 0);
|
||||
x=buf0[1]/DIG_MASK;
|
||||
if (x > round_digit ||
|
||||
(round_digit == 5 && x == 5 && (mode == HALF_UP ||
|
||||
(frac0+intg0 > 0 && *buf0 & 1))))
|
||||
switch (round_digit)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
dec1 *p0= buf0 + (frac1-frac0);
|
||||
for (; p0 > buf0; p0--)
|
||||
if (*p0)
|
||||
{
|
||||
do_inc= TRUE;
|
||||
break;
|
||||
};
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
{
|
||||
x= buf0[1]/DIG_MASK;
|
||||
do_inc= (x>5) || ((x == 5) &&
|
||||
(mode == HALF_UP || (frac0+intg0 > 0 && *buf0 & 1)));
|
||||
break;
|
||||
};
|
||||
default:;
|
||||
};
|
||||
if (do_inc)
|
||||
{
|
||||
if (frac0+intg0>0)
|
||||
(*buf1)++;
|
||||
@ -1509,6 +1529,7 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO - fix this code as it won't work for CEILING mode */
|
||||
int pos=frac0*DIG_PER_DEC1-scale-1;
|
||||
DBUG_ASSERT(frac0+intg0 > 0);
|
||||
x=*buf1 / powers10[pos];
|
||||
|
Loading…
x
Reference in New Issue
Block a user