Commit c43646c2 authored by unknown's avatar unknown

Trimmed fix for bug #9546 (Crashing with huge decimals)


mysql-test/r/type_newdecimal.result:
  test result fixed
mysql-test/t/type_newdecimal.test:
  test case added
sql/my_decimal.cc:
  error message fixed
strings/decimal.c:
  do_add function fixed
parent 188c9bb2
...@@ -846,3 +846,14 @@ set sql_mode=''; ...@@ -846,3 +846,14 @@ set sql_mode='';
select 0/0; select 0/0;
0/0 0/0
NULL NULL
select 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 as x;
x
999999999999999999999999999999999999999999999999999999999999999999999999999999999
Warnings:
Error 1292 Truncated incorrect DECIMAL value: ''
select 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 + 1 as x;
x
NULL
Warnings:
Error 1292 Truncated incorrect DECIMAL value: ''
Error 1292 Truncated incorrect DECIMAL value: ''
...@@ -876,3 +876,9 @@ select 10.3330000000000/12.34500000; ...@@ -876,3 +876,9 @@ select 10.3330000000000/12.34500000;
set sql_mode=''; set sql_mode='';
select 0/0; select 0/0;
#
# bug #9546
#
select 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 as x;
select 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 + 1 as x;
...@@ -43,9 +43,9 @@ int decimal_operation_results(int result) ...@@ -43,9 +43,9 @@ int decimal_operation_results(int result)
break; break;
case E_DEC_OVERFLOW: case E_DEC_OVERFLOW:
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR, push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
ER_WARN_DATA_OUT_OF_RANGE, ER_TRUNCATED_WRONG_VALUE,
ER(ER_WARN_DATA_OUT_OF_RANGE), ER(ER_TRUNCATED_WRONG_VALUE),
"", (long)-1); "DECIMAL", "");
break; break;
case E_DEC_DIV_ZERO: case E_DEC_DIV_ZERO:
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR, push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR,
......
...@@ -1612,13 +1612,19 @@ static int do_add(decimal_t *from1, decimal_t *from2, decimal_t *to) ...@@ -1612,13 +1612,19 @@ static int do_add(decimal_t *from1, decimal_t *from2, decimal_t *to)
x=intg1 > intg2 ? from1->buf[0] : x=intg1 > intg2 ? from1->buf[0] :
intg2 > intg1 ? from2->buf[0] : intg2 > intg1 ? from2->buf[0] :
from1->buf[0] + from2->buf[0] ; from1->buf[0] + from2->buf[0] ;
if (unlikely(x > DIG_MASK*9)) /* yes, there is */ if (unlikely(x > DIG_MAX-1)) /* yes, there is */
{ {
intg0++; intg0++;
to->buf[0]=0; /* safety */ to->buf[0]=0; /* safety */
} }
FIX_INTG_FRAC_ERROR(to->len, intg0, frac0, error); FIX_INTG_FRAC_ERROR(to->len, intg0, frac0, error);
if (unlikely(error == E_DEC_OVERFLOW))
{
max_decimal(to->len * DIG_PER_DEC1, 0, to);
return error;
}
buf0=to->buf+intg0+frac0; buf0=to->buf+intg0+frac0;
to->sign=from1->sign; to->sign=from1->sign;
......
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