Commit df60c7ef authored by unknown's avatar unknown
Browse files

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
parent b0502fc2
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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
+7 −0
Original line number Diff line number Diff line
@@ -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);
+25 −4
Original line number Diff line number Diff line
@@ -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)++;
@@ -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];