diff --git a/mysql-test/r/case.result b/mysql-test/r/case.result index 04627a7a493..08f148f94c0 100644 --- a/mysql-test/r/case.result +++ b/mysql-test/r/case.result @@ -10,10 +10,10 @@ CASE "c" when "a" then 1 when "b" then 2 ELSE 3 END 3 select CASE BINARY "b" when "a" then 1 when "B" then 2 WHEN "b" then "ok" END; CASE BINARY "b" when "a" then 1 when "B" then 2 WHEN "b" then "ok" END -0 +ok select CASE "b" when "a" then 1 when binary "B" then 2 WHEN "b" then "ok" END; CASE "b" when "a" then 1 when binary "B" then 2 WHEN "b" then "ok" END -0 +ok select CASE concat("a","b") when concat("ab","") then "a" when "b" then "b" end; CASE concat("a","b") when concat("ab","") then "a" when "b" then "b" end a @@ -72,6 +72,48 @@ yellow green drop table t1; SET NAMES latin1; +CREATE TABLE t1 SELECT +CASE WHEN 1 THEN _latin1'a' COLLATE latin1_danish_ci ELSE _latin1'a' END AS c1, +CASE WHEN 1 THEN _latin1'a' ELSE _latin1'a' COLLATE latin1_danish_ci END AS c2, +CASE WHEN 1 THEN 'a' ELSE 1 END AS c3, +CASE WHEN 1 THEN 1 ELSE 'a' END AS c4, +CASE WHEN 1 THEN 'a' ELSE 1.0 END AS c5, +CASE WHEN 1 THEN 1.0 ELSE 'a' END AS c6, +CASE WHEN 1 THEN 1 ELSE 1.0 END AS c7, +CASE WHEN 1 THEN 1.0 ELSE 1 END AS c8 +; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` char(1) character set latin1 collate latin1_danish_ci default NULL, + `c2` char(1) character set latin1 collate latin1_danish_ci default NULL, + `c3` char(1) default NULL, + `c4` char(1) default NULL, + `c5` char(3) default NULL, + `c6` char(3) default NULL, + `c7` double(3,1) default NULL, + `c8` double(3,1) default NULL +) TYPE=MyISAM CHARSET=latin1 +DROP TABLE t1; +SELECT CASE +WHEN 1 +THEN _latin1'a' COLLATE latin1_danish_ci +ELSE _latin1'a' COLLATE latin1_swedish_ci +END; +ERROR HY000: Illegal mix of collations (latin1_danish_ci,EXPLICIT) and (latin1_swedish_ci,EXPLICIT) for operation 'case' +SELECT CASE _latin1'a' COLLATE latin1_general_ci +WHEN _latin1'a' COLLATE latin1_danish_ci THEN 1 +WHEN _latin1'a' COLLATE latin1_swedish_ci THEN 2 +END; +ERROR HY000: Illegal mix of collations (latin1_general_ci,EXPLICIT), (latin1_danish_ci,EXPLICIT), (latin1_swedish_ci,EXPLICIT) for operation 'case' +SELECT +CASE _latin1'a' COLLATE latin1_general_ci WHEN _latin1'A' THEN '1' ELSE 2 END, +CASE _latin1'a' COLLATE latin1_bin WHEN _latin1'A' THEN '1' ELSE 2 END, +CASE _latin1'a' WHEN _latin1'A' COLLATE latin1_swedish_ci THEN '1' ELSE 2 END, +CASE _latin1'a' WHEN _latin1'A' COLLATE latin1_bin THEN '1' ELSE 2 END +; +CASE _latin1'a' COLLATE latin1_general_ci WHEN _latin1'A' THEN '1' ELSE 2 END CASE _latin1'a' COLLATE latin1_bin WHEN _latin1'A' THEN '1' ELSE 2 END CASE _latin1'a' WHEN _latin1'A' COLLATE latin1_swedish_ci THEN '1' ELSE 2 END CASE _latin1'a' WHEN _latin1'A' COLLATE latin1_bin THEN '1' ELSE 2 END +1 2 1 2 CREATE TABLE t1 SELECT COALESCE(_latin1'a',_latin2'a'); ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'coalesce' CREATE TABLE t1 SELECT COALESCE('a' COLLATE latin1_swedish_ci,'b' COLLATE latin1_bin); diff --git a/mysql-test/t/case.test b/mysql-test/t/case.test index 0249a8eefba..8aa17061174 100644 --- a/mysql-test/t/case.test +++ b/mysql-test/t/case.test @@ -42,6 +42,44 @@ insert into t1 values (1,1,'orange'),(1,2,'large'),(2,1,'yellow'),(2,2,'medium') select max(case col when 1 then val else null end) as color from t1 group by row; drop table t1; +SET NAMES latin1; + +# +# CASE and argument types/collations aggregation into result +# +CREATE TABLE t1 SELECT + CASE WHEN 1 THEN _latin1'a' COLLATE latin1_danish_ci ELSE _latin1'a' END AS c1, + CASE WHEN 1 THEN _latin1'a' ELSE _latin1'a' COLLATE latin1_danish_ci END AS c2, + CASE WHEN 1 THEN 'a' ELSE 1 END AS c3, + CASE WHEN 1 THEN 1 ELSE 'a' END AS c4, + CASE WHEN 1 THEN 'a' ELSE 1.0 END AS c5, + CASE WHEN 1 THEN 1.0 ELSE 'a' END AS c6, + CASE WHEN 1 THEN 1 ELSE 1.0 END AS c7, + CASE WHEN 1 THEN 1.0 ELSE 1 END AS c8 +; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--error 1265 +SELECT CASE + WHEN 1 + THEN _latin1'a' COLLATE latin1_danish_ci + ELSE _latin1'a' COLLATE latin1_swedish_ci + END; + +--error 1268 +SELECT CASE _latin1'a' COLLATE latin1_general_ci + WHEN _latin1'a' COLLATE latin1_danish_ci THEN 1 + WHEN _latin1'a' COLLATE latin1_swedish_ci THEN 2 + END; + +SELECT +CASE _latin1'a' COLLATE latin1_general_ci WHEN _latin1'A' THEN '1' ELSE 2 END, +CASE _latin1'a' COLLATE latin1_bin WHEN _latin1'A' THEN '1' ELSE 2 END, +CASE _latin1'a' WHEN _latin1'A' COLLATE latin1_swedish_ci THEN '1' ELSE 2 END, +CASE _latin1'a' WHEN _latin1'A' COLLATE latin1_bin THEN '1' ELSE 2 END +; + # # COALESCE is a CASE abbrevation: # @@ -52,7 +90,6 @@ drop table t1; # # Check COALESCE argument types aggregation -SET NAMES latin1; --error 1265 CREATE TABLE t1 SELECT COALESCE(_latin1'a',_latin2'a'); --error 1265 diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 1f1b449e9a7..b73499942a3 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -892,7 +892,7 @@ Item *Item_func_case::find_item(String *str) } if ((tmp=args[i]->val_str(str))) // If not null { - if (sortcmp(tmp,first_expr_str,&my_charset_bin)==0) + if (sortcmp(tmp,first_expr_str,cmp_collation.collation)==0) return args[i+1]; } break; @@ -1027,7 +1027,7 @@ void Item_func_case::fix_length_and_dec() { agg[0]= args[first_expr_num]; for (nagg= 0; nagg < ncases/2 ; nagg++) - agg[nagg+1]= args[nagg]; + agg[nagg+1]= args[nagg*2]; nagg++; agg_cmp_type(&cmp_type, agg, nagg); if ((cmp_type == STRING_RESULT) && @@ -1040,7 +1040,6 @@ void Item_func_case::fix_length_and_dec() max_length=0; decimals=0; - cached_result_type = args[1]->result_type(); for (uint i=0 ; i < ncases ; i+=2) { set_if_bigger(max_length,args[i+1]->max_length);