List:Commits« Previous MessageNext Message »
From:<gshchepa Date:May 13 2008 5:27pm
Subject:bk commit into 5.0 tree (gshchepa:1.2623) BUG#36488
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of gshchepa.  When gshchepa does a push these changes
will be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2008-05-13 20:27:46+05:00, gshchepa@stripped +3 -0
  Fixed bug #36488: regexp returns false matches, concatenating
                    with previous rows.
  
  The WHERE clause containing expression:
    CONCAT(empty_field1, empty_field2, ..., 'literal constant', ...)
      REGEXP 'regular expression'
  may return wrong matches.
  
  Optimization of the CONCAT function has been fixed.
  

  mysql-test/r/func_concat.result@stripped, 2008-05-13 20:27:07+05:00, gshchepa@stripped +7 -0
    Added test case for bug #36488.

  mysql-test/t/func_concat.test@stripped, 2008-05-13 20:27:08+05:00, gshchepa@stripped +10 -0
    Added test case for bug #36488.

  sql/item_strfunc.cc@stripped, 2008-05-13 20:27:09+05:00, gshchepa@stripped +6 -0
    Fixed bug #36488.
    The Item_func_concat::val_str method is optimized to
    use first non-empty argument of the CONCAT function for in-place
    result accumulation. This optimization is acceptable if that
    first argument is not a constant.
    However, current implementation checks this condition only for
    the first actual argument of the CONCAT function.
    So, the Item_func_concat::val_str method can corrupt values
    of, for example, literal strings by appending random data.
    
    The Item_func_concat::val_str method has been modified to take
    into account the ability to be modified in-place for the first
    non-empty argument.

diff -Nrup a/mysql-test/r/func_concat.result b/mysql-test/r/func_concat.result
--- a/mysql-test/r/func_concat.result	2006-06-15 02:46:27 +05:00
+++ b/mysql-test/r/func_concat.result	2008-05-13 20:27:07 +05:00
@@ -82,3 +82,10 @@ a
 1234562
 x
 drop table t1;
+CREATE TABLE t1 (c1 varchar(100), c2 varchar(100));
+INSERT INTO t1 VALUES ('',''), ('','First'), ('Random','Random');
+SELECT * FROM t1 WHERE CONCAT(c1,' ',c2) REGEXP 'First.*';
+c1	c2
+	First
+DROP TABLE t1;
+# End of 5.0 tests
diff -Nrup a/mysql-test/t/func_concat.test b/mysql-test/t/func_concat.test
--- a/mysql-test/t/func_concat.test	2006-06-15 00:54:05 +05:00
+++ b/mysql-test/t/func_concat.test	2008-05-13 20:27:08 +05:00
@@ -68,3 +68,13 @@ create table t1(f1 varchar(6)) charset=u
 insert into t1 values ("123456");
 select concat(f1, 2) a from t1 union select 'x' a from t1;
 drop table t1;
+
+#
+# Bug #36488: regexp returns false matches, concatenating with previous rows
+#
+CREATE TABLE t1 (c1 varchar(100), c2 varchar(100));
+INSERT INTO t1 VALUES ('',''), ('','First'), ('Random','Random');
+SELECT * FROM t1 WHERE CONCAT(c1,' ',c2) REGEXP 'First.*';
+DROP TABLE t1;
+
+--echo # End of 5.0 tests
diff -Nrup a/sql/item_strfunc.cc b/sql/item_strfunc.cc
--- a/sql/item_strfunc.cc	2007-10-11 16:07:09 +05:00
+++ b/sql/item_strfunc.cc	2008-05-13 20:27:09 +05:00
@@ -294,6 +294,12 @@ String *Item_func_concat::val_str(String
     {
       if (!(res=args[i]->val_str(str)))
 	goto null;
+      /*
+       CONCAT accumulates its result in the result of its the first
+       non-empty argument. Because of this we need is_const to be 
+       evaluated only for it.
+      */
+      is_const= args[i]->const_item() || !args[i]->used_tables();
     }
     else
     {
Thread
bk commit into 5.0 tree (gshchepa:1.2623) BUG#36488gshchepa13 May 2008