mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
e2a546aef4
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.
151 lines
4 KiB
Text
151 lines
4 KiB
Text
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
|