@ -2272,11 +2272,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
{
@ -2292,8 +2292,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 ) ;
@ -2304,17 +2305,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 ;
@ -2322,7 +2320,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 ) ;