diff options
author | unknown <sergefp@mysql.com> | 2005-06-20 11:43:38 +0200 |
---|---|---|
committer | unknown <sergefp@mysql.com> | 2005-06-20 11:43:38 +0200 |
commit | ef920b28793302a532b87b4babfc224bb732941e (patch) | |
tree | d7414859ad9adf0e5ac7dce1ff50a30b66e1b866 | |
parent | f35c177a2a754c0b09b01c59d1d958f124382c19 (diff) | |
download | mariadb-git-ef920b28793302a532b87b4babfc224bb732941e.tar.gz |
Fix for BUG#10151: In Item_func_case::find_item don't assume that parameter str != &(this->str_value)
mysql-test/r/case.result:
Testcase for BUG#10151
mysql-test/t/case.test:
Testcase for BUG#10151
-rw-r--r-- | mysql-test/r/case.result | 15 | ||||
-rw-r--r-- | mysql-test/t/case.test | 11 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 4 |
3 files changed, 29 insertions, 1 deletions
diff --git a/mysql-test/r/case.result b/mysql-test/r/case.result index 541560afd36..fb0bc19a67e 100644 --- a/mysql-test/r/case.result +++ b/mysql-test/r/case.result @@ -154,3 +154,18 @@ t1 CREATE TABLE `t1` ( `COALESCE('a' COLLATE latin1_bin,'b')` char(1) character set latin1 collate latin1_bin NOT NULL default '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1; +SELECT 'case+union+test' +UNION +SELECT CASE LOWER('1') WHEN LOWER('2') THEN 'BUG' ELSE 'nobug' END; +case+union+test +case+union+test +nobug +SELECT CASE LOWER('1') WHEN LOWER('2') THEN 'BUG' ELSE 'nobug' END; +CASE LOWER('1') WHEN LOWER('2') THEN 'BUG' ELSE 'nobug' END +nobug +SELECT 'case+union+test' +UNION +SELECT CASE '1' WHEN '2' THEN 'BUG' ELSE 'nobug' END; +case+union+test +case+union+test +nobug diff --git a/mysql-test/t/case.test b/mysql-test/t/case.test index 87e456baba7..ac60d7298ce 100644 --- a/mysql-test/t/case.test +++ b/mysql-test/t/case.test @@ -107,3 +107,14 @@ explain extended SELECT COALESCE('a' COLLATE latin1_bin,'b'); SHOW CREATE TABLE t1; DROP TABLE t1; + +# Test for BUG#10151 +SELECT 'case+union+test' +UNION +SELECT CASE LOWER('1') WHEN LOWER('2') THEN 'BUG' ELSE 'nobug' END; + +SELECT CASE LOWER('1') WHEN LOWER('2') THEN 'BUG' ELSE 'nobug' END; + +SELECT 'case+union+test' +UNION +SELECT CASE '1' WHEN '2' THEN 'BUG' ELSE 'nobug' END; diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 3098e5dc77e..f24638d1a93 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1174,6 +1174,8 @@ Item *Item_func_case::find_item(String *str) String *first_expr_str,*tmp; longlong first_expr_int; double first_expr_real; + char buff[MAX_FIELD_WIDTH]; + String buff_str(buff,sizeof(buff),default_charset()); /* These will be initialized later */ LINT_INIT(first_expr_str); @@ -1186,7 +1188,7 @@ Item *Item_func_case::find_item(String *str) { case STRING_RESULT: // We can't use 'str' here as this may be overwritten - if (!(first_expr_str= args[first_expr_num]->val_str(&str_value))) + if (!(first_expr_str= args[first_expr_num]->val_str(&buff_str))) return else_expr_num != -1 ? args[else_expr_num] : 0; // Impossible break; case INT_RESULT: |