mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
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
This commit is contained in:
@ -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;
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user