@ -1235,19 +1235,35 @@ longlong Item_func_min_max::val_int()
{
DBUG_ASSERT ( fixed = = 1 ) ;
longlong value = 0 ;
my_bool arg_unsigned_flag ;
my_bool cmp ;
null_value = 1 ;
for ( uint i = 0 ; i < arg_count ; i + + )
{
longlong tmp = args [ i ] - > val_int ( ) ;
arg_unsigned_flag = args [ i ] - > unsigned_flag ;
if ( null_value )
{
value = args [ i ] - > val_int ( ) ;
value = tmp ;
null_value = args [ i ] - > null_value ;
unsigned_flag = arg_unsigned_flag ;
}
else
{
longlong tmp = args [ i ] - > val_int ( ) ;
if ( ! args [ i ] - > null_value & & ( tmp < value ? cmp_sign : - cmp_sign ) > 0 )
value = tmp ;
if ( args [ i ] - > null_value )
continue ;
if ( unsigned_flag & & arg_unsigned_flag | |
( ! unsigned_flag & & ! arg_unsigned_flag ) )
cmp = tmp < value ;
else if ( unsigned_flag )
cmp = compare_int_signed_unsigned ( tmp , value ) < 0 ;
else
cmp = compare_int_unsigned_signed ( tmp , value ) < 0 ;
if ( ( cmp ? cmp_sign : - cmp_sign ) > 0 )
{
value = tmp ;
unsigned_flag = arg_unsigned_flag ;
}
}
}
return value ;
@ -2313,6 +2329,7 @@ static user_var_entry *get_variable(HASH *hash, LEX_STRING &name,
entry - > length = 0 ;
entry - > update_query_id = 0 ;
entry - > collation . set ( NULL , DERIVATION_IMPLICIT ) ;
entry - > unsigned_flag = 0 ;
/*
If we are here , we were called from a SET or a query which sets a
variable . Imagine it is this :
@ -2390,7 +2407,7 @@ Item_func_set_user_var::fix_length_and_dec()
bool Item_func_set_user_var : : update_hash ( void * ptr , uint length ,
Item_result type ,
CHARSET_INFO * cs ,
Derivation dv )
Derivation dv , bool unsigned_arg )
{
if ( ( null_value = args [ 0 ] - > null_value ) )
{
@ -2437,6 +2454,7 @@ bool Item_func_set_user_var::update_hash(void *ptr, uint length,
entry - > length = length ;
entry - > type = type ;
entry - > collation . set ( cs , dv ) ;
entry - > unsigned_flag = unsigned_arg ;
}
return 0 ;
@ -2507,7 +2525,10 @@ String *user_var_entry::val_str(my_bool *null_value, String *str,
str - > set ( * ( double * ) value , decimals , & my_charset_bin ) ;
break ;
case INT_RESULT :
str - > set ( * ( longlong * ) value , & my_charset_bin ) ;
if ( ! unsigned_flag )
str - > set ( * ( longlong * ) value , & my_charset_bin ) ;
else
str - > set ( * ( ulonglong * ) value , & my_charset_bin ) ;
break ;
case STRING_RESULT :
if ( str - > copy ( value , length , collation . collation ) )
@ -2548,6 +2569,7 @@ Item_func_set_user_var::check()
case INT_RESULT :
{
save_result . vint = args [ 0 ] - > val_int ( ) ;
unsigned_flag = args [ 0 ] - > unsigned_flag ;
break ;
}
case STRING_RESULT :
@ -2598,7 +2620,8 @@ Item_func_set_user_var::update()
case INT_RESULT :
{
res = update_hash ( ( void * ) & save_result . vint , sizeof ( save_result . vint ) ,
INT_RESULT , & my_charset_bin , DERIVATION_IMPLICIT ) ;
INT_RESULT , & my_charset_bin , DERIVATION_IMPLICIT ,
unsigned_flag ) ;
break ;
}
case STRING_RESULT :