Loading mysql-test/r/func_math.result +6 −0 Original line number Diff line number Diff line Loading @@ -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 mysql-test/t/func_math.test +7 −0 Original line number Diff line number Diff line Loading @@ -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); strings/decimal.c +25 −4 Original line number Diff line number Diff line Loading @@ -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); 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; if (x > round_digit || (round_digit == 5 && x == 5 && (mode == HALF_UP || (frac0+intg0 > 0 && *buf0 & 1)))) do_inc= (x>5) || ((x == 5) && (mode == HALF_UP || (frac0+intg0 > 0 && *buf0 & 1))); break; }; default:; }; if (do_inc) { if (frac0+intg0>0) (*buf1)++; Loading @@ -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 Loading
mysql-test/r/func_math.result +6 −0 Original line number Diff line number Diff line Loading @@ -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
mysql-test/t/func_math.test +7 −0 Original line number Diff line number Diff line Loading @@ -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);
strings/decimal.c +25 −4 Original line number Diff line number Diff line Loading @@ -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); 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; if (x > round_digit || (round_digit == 5 && x == 5 && (mode == HALF_UP || (frac0+intg0 > 0 && *buf0 & 1)))) do_inc= (x>5) || ((x == 5) && (mode == HALF_UP || (frac0+intg0 > 0 && *buf0 & 1))); break; }; default:; }; if (do_inc) { if (frac0+intg0>0) (*buf1)++; Loading @@ -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