Merge mysql.com:/home/ram/work/b30782/b30782.5.0

into  mysql.com:/home/ram/work/b30782/b30782.5.1
parents 1d2f73eb 98a4d999
drop table if exists t1,t2; drop table if exists t1, t2;
select CASE "b" when "a" then 1 when "b" then 2 END; select CASE "b" when "a" then 1 when "b" then 2 END;
CASE "b" when "a" then 1 when "b" then 2 END CASE "b" when "a" then 1 when "b" then 2 END
2 2
...@@ -200,3 +200,21 @@ CEMPNUM EMPMUM1 EMPNUM2 ...@@ -200,3 +200,21 @@ CEMPNUM EMPMUM1 EMPNUM2
0.00 0 0.00 0.00 0 0.00
2.00 2 NULL 2.00 2 NULL
DROP TABLE t1,t2; DROP TABLE t1,t2;
End of 4.1 tests
create table t1 (a int, b bigint unsigned);
create table t2 (c int);
insert into t1 (a, b) values (1,4572794622775114594), (2,18196094287899841997),
(3,11120436154190595086);
insert into t2 (c) values (1), (2), (3);
select t1.a, (case t1.a when 0 then 0 else t1.b end) d from t1
join t2 on t1.a=t2.c order by d;
a d
1 4572794622775114594
3 11120436154190595086
2 18196094287899841997
select t1.a, (case t1.a when 0 then 0 else t1.b end) d from t1
join t2 on t1.a=t2.c where b=11120436154190595086 order by d;
a d
3 11120436154190595086
drop table t1, t2;
End of 5.0 tests
#
# Testing of CASE # Testing of CASE
# #
--disable_warnings --disable_warnings
drop table if exists t1,t2; drop table if exists t1, t2;
--enable_warnings --enable_warnings
select CASE "b" when "a" then 1 when "b" then 2 END; select CASE "b" when "a" then 1 when "b" then 2 END;
...@@ -152,4 +152,21 @@ SELECT IFNULL(t2.EMPNUM,t1.EMPNUM) AS CEMPNUM, ...@@ -152,4 +152,21 @@ SELECT IFNULL(t2.EMPNUM,t1.EMPNUM) AS CEMPNUM,
FROM t1 LEFT JOIN t2 ON t1.EMPNUM=t2.EMPNUM; FROM t1 LEFT JOIN t2 ON t1.EMPNUM=t2.EMPNUM;
DROP TABLE t1,t2; DROP TABLE t1,t2;
# End of 4.1 tests
--echo End of 4.1 tests
#
# #30782: Truncated UNSIGNED BIGINT columns
#
create table t1 (a int, b bigint unsigned);
create table t2 (c int);
insert into t1 (a, b) values (1,4572794622775114594), (2,18196094287899841997),
(3,11120436154190595086);
insert into t2 (c) values (1), (2), (3);
select t1.a, (case t1.a when 0 then 0 else t1.b end) d from t1
join t2 on t1.a=t2.c order by d;
select t1.a, (case t1.a when 0 then 0 else t1.b end) d from t1
join t2 on t1.a=t2.c where b=11120436154190595086 order by d;
drop table t1, t2;
--echo End of 5.0 tests
...@@ -2557,6 +2557,23 @@ bool Item_func_case::fix_fields(THD *thd, Item **ref) ...@@ -2557,6 +2557,23 @@ bool Item_func_case::fix_fields(THD *thd, Item **ref)
} }
void Item_func_case::agg_str_lengths(Item* arg)
{
set_if_bigger(max_length, arg->max_length);
set_if_bigger(decimals, arg->decimals);
unsigned_flag= unsigned_flag && arg->unsigned_flag;
}
void Item_func_case::agg_num_lengths(Item *arg)
{
uint len= my_decimal_length_to_precision(arg->max_length, arg->decimals,
arg->unsigned_flag) - arg->decimals;
set_if_bigger(max_length, len);
set_if_bigger(decimals, arg->decimals);
unsigned_flag= unsigned_flag && arg->unsigned_flag;
}
void Item_func_case::fix_length_and_dec() void Item_func_case::fix_length_and_dec()
{ {
...@@ -2620,15 +2637,22 @@ void Item_func_case::fix_length_and_dec() ...@@ -2620,15 +2637,22 @@ void Item_func_case::fix_length_and_dec()
max_length=0; max_length=0;
decimals=0; decimals=0;
for (uint i=0 ; i < ncases ; i+=2) unsigned_flag= TRUE;
if (cached_result_type == STRING_RESULT)
{ {
set_if_bigger(max_length,args[i+1]->max_length); for (uint i= 0; i < ncases; i+= 2)
set_if_bigger(decimals,args[i+1]->decimals); agg_str_lengths(args[i + 1]);
if (else_expr_num != -1)
agg_str_lengths(args[else_expr_num]);
} }
if (else_expr_num != -1) else
{ {
set_if_bigger(max_length,args[else_expr_num]->max_length); for (uint i= 0; i < ncases; i+= 2)
set_if_bigger(decimals,args[else_expr_num]->decimals); agg_num_lengths(args[i + 1]);
if (else_expr_num != -1)
agg_num_lengths(args[else_expr_num]);
max_length= my_decimal_precision_to_length(max_length + decimals, decimals,
unsigned_flag);
} }
} }
......
...@@ -713,6 +713,7 @@ class Item_func_nullif :public Item_bool_func2 ...@@ -713,6 +713,7 @@ class Item_func_nullif :public Item_bool_func2
bool is_null(); bool is_null();
}; };
/* Functions to handle the optimized IN */ /* Functions to handle the optimized IN */
...@@ -1139,6 +1140,8 @@ class Item_func_case :public Item_func ...@@ -1139,6 +1140,8 @@ class Item_func_case :public Item_func
Item *find_item(String *str); Item *find_item(String *str);
CHARSET_INFO *compare_collation() { return cmp_collation.collation; } CHARSET_INFO *compare_collation() { return cmp_collation.collation; }
void cleanup(); void cleanup();
void agg_str_lengths(Item *arg);
void agg_num_lengths(Item *arg);
}; };
/* /*
......
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