diff options
author | unknown <holyfoot@hf-ibm.(none)> | 2005-05-06 19:04:58 +0500 |
---|---|---|
committer | unknown <holyfoot@hf-ibm.(none)> | 2005-05-06 19:04:58 +0500 |
commit | f1def25a89e3dc2ed191335e9d5f7843de245e0a (patch) | |
tree | 9567d00a7dd4b1a7be9aa7f2d48b28753a9c1a52 | |
parent | 0430cdb7c51155de834f7e1268a862d5dd1a0210 (diff) | |
download | mariadb-git-f1def25a89e3dc2ed191335e9d5f7843de245e0a.tar.gz |
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
-rw-r--r-- | mysql-test/r/type_newdecimal.result | 11 | ||||
-rw-r--r-- | mysql-test/t/type_newdecimal.test | 6 | ||||
-rw-r--r-- | sql/my_decimal.cc | 6 | ||||
-rw-r--r-- | strings/decimal.c | 8 |
4 files changed, 27 insertions, 4 deletions
diff --git a/mysql-test/r/type_newdecimal.result b/mysql-test/r/type_newdecimal.result index 6702676fa35..840073aed29 100644 --- a/mysql-test/r/type_newdecimal.result +++ b/mysql-test/r/type_newdecimal.result @@ -846,3 +846,14 @@ set sql_mode=''; select 0/0; 0/0 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: '' diff --git a/mysql-test/t/type_newdecimal.test b/mysql-test/t/type_newdecimal.test index 19230c02743..75f35ba0796 100644 --- a/mysql-test/t/type_newdecimal.test +++ b/mysql-test/t/type_newdecimal.test @@ -876,3 +876,9 @@ select 10.3330000000000/12.34500000; set sql_mode=''; select 0/0; + +# +# bug #9546 +# +select 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 as x; +select 9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 + 1 as x; diff --git a/sql/my_decimal.cc b/sql/my_decimal.cc index 14c15cdc4ef..f188d27ff78 100644 --- a/sql/my_decimal.cc +++ b/sql/my_decimal.cc @@ -43,9 +43,9 @@ int decimal_operation_results(int result) break; case E_DEC_OVERFLOW: push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR, - ER_WARN_DATA_OUT_OF_RANGE, - ER(ER_WARN_DATA_OUT_OF_RANGE), - "", (long)-1); + ER_TRUNCATED_WRONG_VALUE, + ER(ER_TRUNCATED_WRONG_VALUE), + "DECIMAL", ""); break; case E_DEC_DIV_ZERO: push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_ERROR, diff --git a/strings/decimal.c b/strings/decimal.c index 4b7dc8803ee..b06a50fc86b 100644 --- a/strings/decimal.c +++ b/strings/decimal.c @@ -1612,13 +1612,19 @@ static int do_add(decimal_t *from1, decimal_t *from2, decimal_t *to) x=intg1 > intg2 ? from1->buf[0] : intg2 > intg1 ? 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++; to->buf[0]=0; /* safety */ } 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; to->sign=from1->sign; |