From: Date: May 12 2008 10:46am Subject: bk commit into 5.0 tree (gshchepa:1.2623) BUG#36488 List-Archive: http://lists.mysql.com/commits/46615 X-Bug: 36488 Message-Id: <20080512084808.A254840C944@localhost.localdomain> 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-12 13:46: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-12 13:40:19+05:00, gshchepa@stripped +7 -0 Added test case for bug #36488. mysql-test/t/func_concat.test@stripped, 2008-05-12 13:40:21+05:00, gshchepa@stripped +10 -0 Added test case for bug #36488. sql/item_strfunc.cc@stripped, 2008-05-12 13:40:22+05:00, gshchepa@stripped +1 -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-12 13:40:19 +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-12 13:40:21 +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-12 13:40:22 +05:00 @@ -294,6 +294,7 @@ String *Item_func_concat::val_str(String { if (!(res=args[i]->val_str(str))) goto null; + is_const= args[i]->const_item() || !args[i]->used_tables(); } else {