Commit b419501e authored by unknown's avatar unknown

Merge polly.local:/tmp/20924/bug20294/my41-bug20294

into  polly.local:/tmp/20924/bug20294/my50-bug20294


sql/item_cmpfunc.cc:
  Auto merged
sql/item_cmpfunc.h:
  Auto merged
sql/item_func.h:
  Auto merged
sql/log_event.cc:
  Auto merged
sql/sql_class.h:
  Auto merged
mysql-test/r/case.result:
  Manual merge
mysql-test/r/func_if.result:
  Manual merge
mysql-test/r/func_test.result:
  Manual merge
mysql-test/r/user_var.result:
  Manual merge
mysql-test/t/case.test:
  Manual merge
mysql-test/t/func_if.test:
  Manual merge
mysql-test/t/func_test.test:
  Manual merge
mysql-test/t/user_var.test:
  Manual merge
sql/item_func.cc:
  Manual merge
parents d31a3434 418ae41b
......@@ -200,10 +200,3 @@ CEMPNUM EMPMUM1 EMPNUM2
0.00 0 0.00
2.00 2 NULL
DROP TABLE t1,t2;
SELECT CASE 1 WHEN 1 THEN 18446744073709551615 ELSE 1 END;
CASE 1 WHEN 1 THEN 18446744073709551615 ELSE 1 END
18446744073709551615
SELECT COALESCE(18446744073709551615);
COALESCE(18446744073709551615)
18446744073709551615
End of 4.1 tests
......@@ -128,10 +128,3 @@ f1 f2 if(f1, 40.0, 5.00)
0 0 5.00
1 1 40.00
drop table t1;
SELECT IF(1 != 0, 18446744073709551615, 1);
IF(1 != 0, 18446744073709551615, 1)
18446744073709551615
SELECT IFNULL(NULL, 18446744073709551615);
IFNULL(NULL, 18446744073709551615)
18446744073709551615
End of 4.1 tests
......@@ -204,10 +204,3 @@ NULL
SELECT GREATEST(1.5E+2,1.3E+2,NULL) FROM DUAL;
GREATEST(1.5E+2,1.3E+2,NULL)
NULL
SELECT GREATEST(1, 18446744073709551615);
GREATEST(1, 18446744073709551615)
18446744073709551615
SELECT LEAST(1, 18446744073709551615);
LEAST(1, 18446744073709551615)
1
End of 4.1 tests
......@@ -256,8 +256,3 @@ t1 CREATE TABLE `t1` (
`@first_var` longtext
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
set @a=18446744073709551615;
select @a;
@a
18446744073709551615
End of 4.1 tests
......@@ -152,12 +152,4 @@ SELECT IFNULL(t2.EMPNUM,t1.EMPNUM) AS CEMPNUM,
FROM t1 LEFT JOIN t2 ON t1.EMPNUM=t2.EMPNUM;
DROP TABLE t1,t2;
#
# Bug #20924: CAST(expr as UNSIGNED) returns SIGNED value when used in various
# functions
# - UNSIGNED values in CASE and COALESCE are treated as SIGNED
#
SELECT CASE 1 WHEN 1 THEN 18446744073709551615 ELSE 1 END;
SELECT COALESCE(18446744073709551615);
--echo End of 4.1 tests
# End of 4.1 tests
......@@ -97,18 +97,3 @@ create table t1 (f1 int, f2 int);
insert into t1 values(1,1),(0,0);
select f1, f2, if(f1, 40.0, 5.00) from t1 group by f1 order by f2;
drop table t1;
#
# Bug #20924: CAST(expr as UNSIGNED) returns SIGNED value when used in various
# functions
# - UNSIGNED values in IF() are treated as SIGNED
#
SELECT IF(1 != 0, 18446744073709551615, 1);
#
# Bug #20924: CAST(expr as UNSIGNED) returns SIGNED value when used in various
# functions
# - UNSIGNED values in IFNULL() are treated as SIGNED
#
SELECT IFNULL(NULL, 18446744073709551615);
--echo End of 4.1 tests
......@@ -108,7 +108,6 @@ select 5.1 mod 3, 5.1 mod -3, -5.1 mod 3, -5.1 mod -3;
select 5 mod 3, 5 mod -3, -5 mod 3, -5 mod -3;
#
# Bug#6726: NOT BETWEEN parse failure
#
create table t1 (a int, b int);
......@@ -126,12 +125,4 @@ SELECT LEAST('xxx','aaa',NULL,'yyy') FROM DUAL;
SELECT LEAST(1.1,1.2,NULL,1.0) FROM DUAL;
SELECT GREATEST(1.5E+2,1.3E+2,NULL) FROM DUAL;
#
# Bug #20924: CAST(expr as UNSIGNED) returns SIGNED value when used in various
# functions
# - UNSIGNED values in GREATEST() and LEAST() are treated as SIGNED
#
SELECT GREATEST(1, 18446744073709551615);
SELECT LEAST(1, 18446744073709551615);
--echo End of 4.1 tests
# End of 4.1 tests
......@@ -144,7 +144,6 @@ select @@version;
--replace_column 1 #
select @@global.version;
#
# Bug #6598: problem with cast(NULL as signed integer);
#
......@@ -169,12 +168,5 @@ set @first_var= cast(NULL as CHAR);
create table t1 select @first_var;
show create table t1;
drop table t1;
#
# Bug #20924: CAST(expr as UNSIGNED) returns SIGNED value when used in various
# functions
# - SET on a user variable saves UNSIGNED as SIGNED
#
set @a=18446744073709551615;
select @a;
--echo End of 4.1 tests
# End of 4.1 tests
......@@ -719,7 +719,11 @@ int Arg_comparator::compare_int_signed_unsigned()
if (!(*b)->null_value)
{
owner->null_value= 0;
return ::compare_int_signed_unsigned(sval1, uval2);
if (sval1 < 0 || (ulonglong)sval1 < uval2)
return -1;
if ((ulonglong)sval1 == uval2)
return 0;
return 1;
}
}
owner->null_value= 1;
......@@ -740,7 +744,13 @@ int Arg_comparator::compare_int_unsigned_signed()
if (!(*b)->null_value)
{
owner->null_value= 0;
return ::compare_int_unsigned_signed(uval1, sval2);
if (sval2 < 0)
return 1;
if (uval1 < (ulonglong)sval2)
return -1;
if (uval1 == (ulonglong)sval2)
return 0;
return 1;
}
}
owner->null_value= 1;
......@@ -1380,13 +1390,11 @@ Item_func_ifnull::int_op()
if (!args[0]->null_value)
{
null_value=0;
unsigned_flag= args[0]->unsigned_flag;
return value;
}
value=args[1]->val_int();
if ((null_value=args[1]->null_value))
return 0;
unsigned_flag= args[1]->unsigned_flag;
return value;
}
......@@ -1537,7 +1545,6 @@ Item_func_if::val_int()
Item *arg= args[0]->val_bool() ? args[1] : args[2];
longlong value=arg->val_int();
null_value=arg->null_value;
unsigned_flag= arg->unsigned_flag;
return value;
}
......@@ -1786,7 +1793,6 @@ longlong Item_func_case::val_int()
}
res=item->val_int();
null_value=item->null_value;
unsigned_flag= item->unsigned_flag;
return res;
}
......@@ -1973,10 +1979,7 @@ longlong Item_func_coalesce::int_op()
{
longlong res=args[i]->val_int();
if (!args[i]->null_value)
{
unsigned_flag= args[i]->unsigned_flag;
return res;
}
}
null_value=1;
return 0;
......
......@@ -1394,17 +1394,3 @@ inline Item *and_conds(Item *a, Item *b)
}
Item *and_expressions(Item *a, Item *b, Item **org_item);
inline int compare_int_signed_unsigned(longlong sval, ulonglong uval)
{
if (sval < 0 || (ulonglong)sval < uval)
return -1;
if ((ulonglong)sval == uval)
return 0;
return 1;
}
inline int compare_int_unsigned_signed(ulonglong uval, longlong sval)
{
return -compare_int_signed_unsigned(sval, uval);
}
......@@ -2136,33 +2136,18 @@ longlong Item_func_min_max::val_int()
{
DBUG_ASSERT(fixed == 1);
longlong value=0;
my_bool arg_unsigned_flag;
my_bool cmp;
for (uint i=0; i < arg_count ; i++)
{
longlong tmp= args[i]->val_int();
if ((null_value= args[i]->null_value))
break;
arg_unsigned_flag= args[i]->unsigned_flag;
if (i == 0)
{
value= tmp;
unsigned_flag= arg_unsigned_flag;
}
value=args[i]->val_int();
else
{
if (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;
}
longlong tmp=args[i]->val_int();
if (!args[i]->null_value && (tmp < value ? cmp_sign : -cmp_sign) > 0)
value=tmp;
}
if ((null_value= args[i]->null_value))
break;
}
return value;
}
......@@ -3421,7 +3406,6 @@ 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:
......@@ -3565,7 +3549,6 @@ update_hash(user_var_entry *entry, bool set_null, void *ptr, uint length,
((my_decimal*)entry->value)->fix_buffer_pointer();
entry->length= length;
entry->collation.set(cs, dv);
entry->unsigned_flag= unsigned_arg;
}
entry->type=type;
return 0;
......@@ -3740,7 +3723,6 @@ 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:
......@@ -3790,26 +3772,25 @@ Item_func_set_user_var::update()
case REAL_RESULT:
{
res= update_hash((void*) &save_result.vreal,sizeof(save_result.vreal),
REAL_RESULT, &my_charset_bin, DERIVATION_IMPLICIT, 0);
REAL_RESULT, &my_charset_bin, DERIVATION_IMPLICIT);
break;
}
case INT_RESULT:
{
res= update_hash((void*) &save_result.vint, sizeof(save_result.vint),
INT_RESULT, &my_charset_bin, DERIVATION_IMPLICIT,
unsigned_flag);
INT_RESULT, &my_charset_bin, DERIVATION_IMPLICIT);
break;
}
case STRING_RESULT:
{
if (!save_result.vstr) // Null value
res= update_hash((void*) 0, 0, STRING_RESULT, &my_charset_bin,
DERIVATION_IMPLICIT, 0);
DERIVATION_IMPLICIT);
else
res= update_hash((void*) save_result.vstr->ptr(),
save_result.vstr->length(), STRING_RESULT,
save_result.vstr->charset(),
DERIVATION_IMPLICIT, 0);
DERIVATION_IMPLICIT);
break;
}
case DECIMAL_RESULT:
......
......@@ -1170,7 +1170,7 @@ class Item_func_set_user_var :public Item_func
String *val_str(String *str);
my_decimal *val_decimal(my_decimal *);
bool update_hash(void *ptr, uint length, enum Item_result type,
CHARSET_INFO *cs, Derivation dv, bool unsigned_arg);
CHARSET_INFO *cs, Derivation dv);
bool check();
bool update();
enum Item_result result_type () const { return cached_result_type; }
......
......@@ -3846,7 +3846,7 @@ int User_var_log_event::exec_event(struct st_relay_log_info* rli)
a single record and with a single column. Thus, like
a column value, it could always have IMPLICIT derivation.
*/
e.update_hash(val, val_len, type, charset, DERIVATION_IMPLICIT, 0);
e.update_hash(val, val_len, type, charset, DERIVATION_IMPLICIT);
free_root(thd->mem_root,0);
rli->inc_event_relay_log_pos();
......
......@@ -2015,7 +2015,6 @@ class user_var_entry
ulong length;
query_id_t update_query_id, used_query_id;
Item_result type;
bool unsigned_flag;
double val_real(my_bool *null_value);
longlong val_int(my_bool *null_value);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment