Commit f1fb785b authored by hf@deer.(none)'s avatar hf@deer.(none)

Fix for bug #10632 (CEILING returns wrong result)

parent dd0936ca
...@@ -146,3 +146,9 @@ drop table t1; ...@@ -146,3 +146,9 @@ drop table t1;
select round(150, 2); select round(150, 2);
round(150, 2) round(150, 2)
150.00 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; ...@@ -84,3 +84,10 @@ drop table t1;
# Bug #10083 (round doesn't increase decimals) # Bug #10083 (round doesn't increase decimals)
# #
select round(150, 2); 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, ...@@ -1490,11 +1490,31 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
buf1+=intg0+frac0-1; buf1+=intg0+frac0-1;
if (scale == frac0*DIG_PER_DEC1) if (scale == frac0*DIG_PER_DEC1)
{ {
int do_inc= FALSE;
DBUG_ASSERT(frac0+intg0 >= 0); DBUG_ASSERT(frac0+intg0 >= 0);
x=buf0[1]/DIG_MASK; switch (round_digit)
if (x > round_digit || {
(round_digit == 5 && x == 5 && (mode == HALF_UP || case 0:
(frac0+intg0 > 0 && *buf0 & 1)))) {
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) if (frac0+intg0>0)
(*buf1)++; (*buf1)++;
...@@ -1509,6 +1529,7 @@ decimal_round(decimal_t *from, decimal_t *to, int scale, ...@@ -1509,6 +1529,7 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
} }
else else
{ {
/* TODO - fix this code as it won't work for CEILING mode */
int pos=frac0*DIG_PER_DEC1-scale-1; int pos=frac0*DIG_PER_DEC1-scale-1;
DBUG_ASSERT(frac0+intg0 > 0); DBUG_ASSERT(frac0+intg0 > 0);
x=*buf1 / powers10[pos]; x=*buf1 / powers10[pos];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment