diff --git a/mysql-test/r/case.result b/mysql-test/r/case.result
index a854cf4c7b0427f569897f40a23e66bd6f2bc124..b02f85132aaf2aac19468123991b6c3396dfb41e 100644
--- a/mysql-test/r/case.result
+++ b/mysql-test/r/case.result
@@ -160,6 +160,21 @@ t1	CREATE TABLE `t1` (
   `COALESCE('a' COLLATE latin1_bin,'b')` varchar(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
 CREATE TABLE t1 (EMPNUM INT);
 INSERT INTO t1 VALUES (0), (2);
 CREATE TABLE t2 (EMPNUM DECIMAL (4, 2));
diff --git a/mysql-test/t/case.test b/mysql-test/t/case.test
index f2cfce9085d4de8783712dbcb143d5d46e1282f0..e942333d5fef70c647c012d4692286aa2fc94a78 100644
--- a/mysql-test/t/case.test
+++ b/mysql-test/t/case.test
@@ -111,6 +111,17 @@ explain extended SELECT
 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;
+
 #
 # Tests for bug #9939: conversion of the arguments for COALESCE and IFNULL
 #
diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc
index 5a2e14eef2ebbfc5ddd3564256dab1fcfbd35f16..0442865b7f90e5a858200f939abc1785cfc01bc4 100644
--- a/sql/item_cmpfunc.cc
+++ b/sql/item_cmpfunc.cc
@@ -1420,6 +1420,8 @@ Item *Item_func_case::find_item(String *str)
   my_decimal *first_expr_dec, first_expr_dec_val;
   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);
@@ -1433,7 +1435,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: