mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-25 18:38:00 +03:00 
			
		
		
		
	Procedure, while DECIMAL works Selecting of the CONCAT(...<SP variable>...) result into a user variable may return wrong data. Item_func_concat::val_str contains a number of memory allocation-saving tricks. One of them concatenates strings inplace inserting the value of one string at the beginning of the other string. However, this trick didn't care about strings those points to the same data buffer: this is possible when a CONCAT() parameter is a stored procedure variable - Item_sp_variable::val_str() uses the intermediate Item_sp_variable::str_value field, where it may store a reference to an external buffer. The Item_func_concat::val_str function has been modified to take into account val_str functions (such as Item_sp_variable::val_str) that return a pointer to an internal Item member variable that may reference to a buffer provided. mysql-test/r/func_concat.result: Test case for the bug #40625. mysql-test/t/func_concat.test: Test case for the bug #40625. sql/item_strfunc.cc: Bug #40625: Concat fails on DOUBLE values in a Stored Procedure, while DECIMAL works The Item_func_concat::val_str function has been modified to take into account val_str functions (such as Item_sp_variable::val_str) that return a pointer to an internal Item member variable that may reference to a buffer provided.
		
			
				
	
	
		
			152 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| DROP TABLE IF EXISTS t1;
 | |
| DROP PROCEDURE IF EXISTS p1;
 | |
| 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
 | |
| #
 | |
| # Bug #44743: Join in combination with concat does not always work
 | |
| #
 | |
| CREATE TABLE t1 (
 | |
| a VARCHAR(100) NOT NULL DEFAULT '0',
 | |
| b VARCHAR(2) NOT NULL DEFAULT '',
 | |
| c VARCHAR(2) NOT NULL DEFAULT '',
 | |
| d TEXT NOT NULL,
 | |
| PRIMARY KEY (a, b, c),
 | |
| KEY (a)
 | |
| ) DEFAULT CHARSET=utf8;
 | |
| INSERT INTO t1 VALUES ('gui_A', 'a', 'b', 'str1'),
 | |
| ('gui_AB', 'a', 'b', 'str2'), ('gui_ABC', 'a', 'b', 'str3');
 | |
| CREATE TABLE t2 (
 | |
| a VARCHAR(100) NOT NULL DEFAULT '',
 | |
| PRIMARY KEY (a)
 | |
| ) DEFAULT CHARSET=latin1;
 | |
| INSERT INTO t2 VALUES ('A'), ('AB'), ('ABC');
 | |
| SELECT CONCAT('gui_', t2.a), t1.d FROM t2 
 | |
| LEFT JOIN t1 ON t1.a = CONCAT('gui_', t2.a) AND t1.b = 'a' AND t1.c = 'b';
 | |
| CONCAT('gui_', t2.a)	d
 | |
| gui_A	str1
 | |
| gui_AB	str2
 | |
| gui_ABC	str3
 | |
| EXPLAIN SELECT CONCAT('gui_', t2.a), t1.d FROM t2 
 | |
| LEFT JOIN t1 ON t1.a = CONCAT('gui_', t2.a) AND t1.b = 'a' AND t1.c = 'b';
 | |
| id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
 | |
| 1	SIMPLE	t2	index	NULL	PRIMARY	102	NULL	3	Using index
 | |
| 1	SIMPLE	t1	eq_ref	PRIMARY,a	PRIMARY	318	func,const,const	1	
 | |
| DROP TABLE t1, t2;
 | |
| #
 | |
| # Bug #50096: CONCAT_WS inside procedure returning wrong data
 | |
| #
 | |
| CREATE PROCEDURE p1(a varchar(255), b int, c int)
 | |
| SET @query = CONCAT_WS(",", a, b, c);
 | |
| CALL p1("abcde", "0", "1234");
 | |
| SELECT @query;
 | |
| @query
 | |
| abcde,0,1234
 | |
| DROP PROCEDURE p1;
 | |
| #
 | |
| # Bug #40625: Concat fails on DOUBLE values in a Stored Procedure,
 | |
| #             while DECIMAL works
 | |
| #
 | |
| CREATE PROCEDURE p1()
 | |
| BEGIN
 | |
| DECLARE v1 DOUBLE(10,3);
 | |
| SET v1= 100;
 | |
| SET @s = CONCAT('########################################', 40 , v1);
 | |
| SELECT @s;
 | |
| END;//
 | |
| CALL p1();
 | |
| @s
 | |
| ########################################40100.000
 | |
| CALL p1();
 | |
| @s
 | |
| ########################################40100.000
 | |
| DROP PROCEDURE p1;
 | |
| # End of 5.1 tests
 |