summaryrefslogtreecommitdiff
path: root/sql/item_func.cc
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2019-01-10 16:08:26 +0400
committerAlexander Barkov <bar@mariadb.com>2019-01-10 16:08:26 +0400
commit82490a97dbbe1dfdf88ed6b9fee8974cf58c63e3 (patch)
tree31229cf9003c2266de0652bfe3813817c72f430f /sql/item_func.cc
parent2ffa11e33e018fad58c1df4cb1bdb0642ef0f8fd (diff)
downloadmariadb-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.cc20
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);