Commit ba18c0bf authored by gshchepa/uchum@host.loc's avatar gshchepa/uchum@host.loc
Browse files

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.
parent 5eaa7794
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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
+10 −0
Original line number Diff line number Diff line
@@ -68,3 +68,13 @@ create table t1(f1 varchar(6)) charset=utf8;
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
+6 −0
Original line number Diff line number Diff line
@@ -294,6 +294,12 @@ String *Item_func_concat::val_str(String *str)
    {
      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
    {