Commit 84a572aa authored by holyfoot/hf@mysql.com/hfmain.(none)'s avatar holyfoot/hf@mysql.com/hfmain.(none)
Browse files

Bug #27984 Long Decimal Maths produces truncated results.

decimal_round failed to perform a correct rounding 
of a decimal number if its first nine digits were '9'.
It just sets those digits to 0.
parent bb089cea
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -1465,4 +1465,7 @@ Error 1264 Out of range value adjusted for column 'cast(a as DECIMAL(3,2))' at r
Error	1264	Out of range value adjusted for column 'cast(a as DECIMAL(3,2))' at row 1
Error	1264	Out of range value adjusted for column 'cast(a as DECIMAL(3,2))' at row 1
Error	1264	Out of range value adjusted for column 'cast(a as DECIMAL(3,2))' at row 1
SELECT 1.000000000000 * 99.999999999998 / 100 a,1.000000000000 * (99.999999999998 / 100) b;
a	b
0.9999999999999800000000000000	0.9999999999999800000000000000
End of 5.0 tests
+5 −0
Original line number Diff line number Diff line
@@ -1149,4 +1149,9 @@ select cast(a as DECIMAL(3,2)), count(*)
  UNION select 12.1234
 ) t group by 1;

#
# Bug #27984 Long Decimal Maths produces truncated results 
#

SELECT 1.000000000000 * 99.999999999998 / 100 a,1.000000000000 * (99.999999999998 / 100) b;
--echo End of 5.0 tests
+2 −1
Original line number Diff line number Diff line
@@ -1517,9 +1517,10 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
    dec1 *p0= buf0+intg0+max(frac1, frac0);
    dec1 *p1= buf1+intg1+max(frac1, frac0);

    to->buf[0]= 0;
    while (buf0 < p0)
      *(--p1) = *(--p0);
    if (unlikely(intg1 > intg0))
      to->buf[0]= 0;

    intg0= intg1;
    buf0=to->buf;