List:Commits« Previous MessageNext Message »
From:Sergey Glukhov Date:September 8 2009 11:12am
Subject:bzr commit into mysql-5.0-bugteam branch (Sergey.Glukhov:2810)
Bug#46815
View as plain text  
#At file:///home/gluh/MySQL/mysql-5.0-bug-46815/ based on revid:joro@stripped

 2810 Sergey Glukhov	2009-09-08
      Bug#46815 CONCAT_WS returning wrong data
      The problem is that argument buffer can be used as result buffer
      and it leads to argument value change.
      The fix is to use 'old buffer' as result buffer only
      if first argument is not constant item.
     @ mysql-test/r/func_str.result
        test result
     @ mysql-test/t/func_str.test
        test case
     @ sql/item_strfunc.cc
        The problem is that argument buffer can be used as result buffer
        and it leads to argument value change.
        The fix is to use 'old buffer' as result buffer only
        if first argument is not constant item.

    modified:
      mysql-test/r/func_str.result
      mysql-test/t/func_str.test
      sql/item_strfunc.cc
=== modified file 'mysql-test/r/func_str.result'
--- a/mysql-test/r/func_str.result	2009-05-12 08:18:27 +0000
+++ b/mysql-test/r/func_str.result	2009-09-08 11:12:28 +0000
@@ -2196,4 +2196,14 @@ SELECT LOAD_FILE(a) FROM t1;
 LOAD_FILE(a)
 NULL
 DROP TABLE t1;
+CREATE TABLE t1 (f1 INT, f2 VARCHAR(20));
+CREATE TABLE t2 (f1 INT, f2 VARCHAR(20));
+INSERT INTO t1 VALUES (4, 'MIN'),(5, 'MAX');
+INSERT INTO t2 VALUES (1, 'LOAD');
+SELECT IF(t1.f2 IS NULL, 'test',
+CONCAT_WS('_', (SELECT t2.f2 FROM t2 WHERE t2.f1 = 1), t1.f2) ) AS concat_name FROM t1;
+concat_name
+LOAD_MIN
+LOAD_MAX
+DROP TABLE t1, t2;
 End of 5.0 tests

=== modified file 'mysql-test/t/func_str.test'
--- a/mysql-test/t/func_str.test	2009-05-12 08:18:27 +0000
+++ b/mysql-test/t/func_str.test	2009-09-08 11:12:28 +0000
@@ -1177,5 +1177,19 @@ INSERT INTO t1 VALUES ('aaaaaaaa');
 SELECT LOAD_FILE(a) FROM t1;
 DROP TABLE t1;
 
+#
+# Bug#46815 CONCAT_WS returning wrong data
+#
+CREATE TABLE t1 (f1 INT, f2 VARCHAR(20));
+CREATE TABLE t2 (f1 INT, f2 VARCHAR(20));
+
+INSERT INTO t1 VALUES (4, 'MIN'),(5, 'MAX');
+INSERT INTO t2 VALUES (1, 'LOAD');
+
+SELECT IF(t1.f2 IS NULL, 'test',
+CONCAT_WS('_', (SELECT t2.f2 FROM t2 WHERE t2.f1 = 1), t1.f2) ) AS concat_name FROM t1;
+
+DROP TABLE t1, t2;
+
 
 --echo End of 5.0 tests

=== modified file 'sql/item_strfunc.cc'
--- a/sql/item_strfunc.cc	2009-06-15 15:29:26 +0000
+++ b/sql/item_strfunc.cc	2009-09-08 11:12:28 +0000
@@ -600,6 +600,7 @@ String *Item_func_concat_ws::val_str(Str
   String tmp_sep_str(tmp_str_buff, sizeof(tmp_str_buff),default_charset_info),
          *sep_str, *res, *res2,*use_as_buff;
   uint i;
+  bool is_const= 0;
 
   null_value=0;
   if (!(sep_str= args[0]->val_str(&tmp_sep_str)))
@@ -613,7 +614,11 @@ String *Item_func_concat_ws::val_str(Str
   // If not, return the empty string
   for (i=1; i < arg_count; i++)
     if ((res= args[i]->val_str(str)))
+    {
+      is_const= args[i]->const_item() || !args[i]->used_tables();
       break;
+    }
+
   if (i ==  arg_count)
     return &my_empty_string;
 
@@ -631,7 +636,7 @@ String *Item_func_concat_ws::val_str(Str
 			  current_thd->variables.max_allowed_packet);
       goto null;
     }
-    if (res->alloced_length() >=
+    if (!is_const && res->alloced_length() >=
 	res->length() + sep_str->length() + res2->length())
     {						// Use old buffer
       res->append(*sep_str);			// res->length() > 0 always


Attachment: [text/bzr-bundle] bzr/sergey.glukhov@sun.com-20090908111228-6cistxk6q80zedsv.bundle
Thread
bzr commit into mysql-5.0-bugteam branch (Sergey.Glukhov:2810)Bug#46815Sergey Glukhov8 Sep