diff options
author | Alexander Barkov <bar@mariadb.com> | 2019-01-10 16:08:26 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2019-01-10 16:08:26 +0400 |
commit | 82490a97dbbe1dfdf88ed6b9fee8974cf58c63e3 (patch) | |
tree | 31229cf9003c2266de0652bfe3813817c72f430f /sql/item_func.cc | |
parent | 2ffa11e33e018fad58c1df4cb1bdb0642ef0f8fd (diff) | |
download | mariadb-git-82490a97dbbe1dfdf88ed6b9fee8974cf58c63e3.tar.gz |
MDEV-18150 Assertion `decimals_to_set <= 38' failed in Item_func_round::fix_length_and_dec_decimal
Diffstat (limited to 'sql/item_func.cc')
-rw-r--r-- | sql/item_func.cc | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc index 62c40255d51..72cfd284606 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2433,11 +2433,11 @@ void Item_func_round::fix_arg_decimal() { if (args[1]->const_item()) { - uint dec= (uint) args[1]->val_uint_from_val_int(DECIMAL_MAX_SCALE); + Longlong_hybrid dec= args[1]->to_longlong_hybrid(); if (args[1]->null_value) fix_length_and_dec_double(NOT_FIXED_DEC); else - fix_length_and_dec_decimal(dec); + fix_length_and_dec_decimal(dec.to_uint(DECIMAL_MAX_SCALE)); } else { @@ -2453,8 +2453,9 @@ void Item_func_round::fix_arg_double() { if (args[1]->const_item()) { - uint dec= (uint) args[1]->val_uint_from_val_int(NOT_FIXED_DEC); - fix_length_and_dec_double(args[1]->null_value ? NOT_FIXED_DEC : dec); + Longlong_hybrid dec= args[1]->to_longlong_hybrid(); + fix_length_and_dec_double(args[1]->null_value ? NOT_FIXED_DEC : + dec.to_uint(NOT_FIXED_DEC)); } else fix_length_and_dec_double(args[0]->decimals); @@ -2465,17 +2466,14 @@ void Item_func_round::fix_arg_int() { if (args[1]->const_item()) { - longlong val1= args[1]->val_int(); - bool val1_is_negative= val1 < 0 && !args[1]->unsigned_flag; - uint decimals_to_set= val1_is_negative ? - 0 : (uint) MY_MIN(val1, DECIMAL_MAX_SCALE); + Longlong_hybrid val1= args[1]->to_longlong_hybrid(); if (args[1]->null_value) fix_length_and_dec_double(NOT_FIXED_DEC); - else if ((!decimals_to_set && truncate) || + else if ((!val1.to_uint(DECIMAL_MAX_SCALE) && truncate) || args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS) { // Length can increase in some cases: ROUND(9,-1) -> 10 - int length_can_increase= MY_TEST(!truncate && val1_is_negative); + int length_can_increase= MY_TEST(!truncate && val1.neg()); max_length= args[0]->max_length + length_can_increase; // Here we can keep INT_RESULT unsigned_flag= args[0]->unsigned_flag; @@ -2483,7 +2481,7 @@ void Item_func_round::fix_arg_int() set_handler(type_handler_long_or_longlong()); } else - fix_length_and_dec_decimal(decimals_to_set); + fix_length_and_dec_decimal(val1.to_uint(DECIMAL_MAX_SCALE)); } else fix_length_and_dec_double(args[0]->decimals); |