mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	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:
  Added test case for bug #36488.
mysql-test/t/func_concat.test:
  Added test case for bug #36488.
sql/item_strfunc.cc:
  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.
		
	
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
DROP TABLE IF EXISTS t1;
 | 
						|
CREATE TABLE t1 ( number INT NOT NULL, alpha CHAR(6) NOT NULL );
 | 
						|
INSERT INTO t1 VALUES (1413006,'idlfmv'),
 | 
						|
(1413065,'smpsfz'),(1413127,'sljrhx'),(1413304,'qerfnd');
 | 
						|
SELECT number, alpha, CONCAT_WS('<---->',number,alpha) AS new
 | 
						|
FROM t1 GROUP BY number;
 | 
						|
number	alpha	new
 | 
						|
1413006	idlfmv	1413006<---->idlfmv
 | 
						|
1413065	smpsfz	1413065<---->smpsfz
 | 
						|
1413127	sljrhx	1413127<---->sljrhx
 | 
						|
1413304	qerfnd	1413304<---->qerfnd
 | 
						|
SELECT CONCAT_WS('<---->',number,alpha) AS new
 | 
						|
FROM t1 GROUP BY new LIMIT 1;
 | 
						|
new
 | 
						|
1413006<---->idlfmv
 | 
						|
SELECT number, alpha, CONCAT_WS('<->',number,alpha) AS new
 | 
						|
FROM t1 GROUP BY new LIMIT 1;
 | 
						|
number	alpha	new
 | 
						|
1413006	idlfmv	1413006<->idlfmv
 | 
						|
SELECT number, alpha, CONCAT_WS('-',number,alpha,alpha,alpha,alpha,alpha,alpha,alpha) AS new
 | 
						|
FROM t1 GROUP BY new LIMIT 1;
 | 
						|
number	alpha	new
 | 
						|
1413006	idlfmv	1413006-idlfmv-idlfmv-idlfmv-idlfmv-idlfmv-idlfmv-idlfmv
 | 
						|
SELECT number, alpha, CONCAT_WS('<------------------>',number,alpha) AS new
 | 
						|
FROM t1 GROUP BY new LIMIT 1;
 | 
						|
number	alpha	new
 | 
						|
1413006	idlfmv	1413006<------------------>idlfmv
 | 
						|
drop table t1;
 | 
						|
create table t1 (a char(4), b double, c date, d tinyint(4));
 | 
						|
insert into t1 values ('AAAA', 105, '2003-03-01', 1);
 | 
						|
select * from t1 where concat(A,C,B,D) = 'AAAA2003-03-011051';
 | 
						|
a	b	c	d
 | 
						|
AAAA	105	2003-03-01	1
 | 
						|
drop table t1;
 | 
						|
select 'a' union select concat('a', -4);
 | 
						|
a
 | 
						|
a
 | 
						|
a-4
 | 
						|
select 'a' union select concat('a', -4.5);
 | 
						|
a
 | 
						|
a
 | 
						|
a-4.5
 | 
						|
select 'a' union select concat('a', -(4 + 1));
 | 
						|
a
 | 
						|
a
 | 
						|
a-5
 | 
						|
select 'a' union select concat('a', 4 - 5);
 | 
						|
a
 | 
						|
a
 | 
						|
a-1
 | 
						|
select 'a' union select concat('a', -'3');
 | 
						|
a
 | 
						|
a
 | 
						|
a-3
 | 
						|
select 'a' union select concat('a', -concat('3',4));
 | 
						|
a
 | 
						|
a
 | 
						|
a-34
 | 
						|
select 'a' union select concat('a', -0);
 | 
						|
a
 | 
						|
a
 | 
						|
a0
 | 
						|
select 'a' union select concat('a', -0.0);
 | 
						|
a
 | 
						|
a
 | 
						|
a0.0
 | 
						|
select 'a' union select concat('a', -0.0000);
 | 
						|
a
 | 
						|
a
 | 
						|
a0.0000
 | 
						|
select concat((select x from (select 'a' as x) as t1 ),
 | 
						|
(select y from (select 'b' as y) as t2 )) from (select 1 union select 2 )
 | 
						|
as t3;
 | 
						|
concat((select x from (select 'a' as x) as t1 ),
 | 
						|
(select y from (select 'b' as y) as t2 ))
 | 
						|
ab
 | 
						|
ab
 | 
						|
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;
 | 
						|
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
 |