mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
99a0ace460
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.
147 lines
3.7 KiB
Text
147 lines
3.7 KiB
Text
#
|
|
# Test of problem with CONCAT_WS() and long separators.
|
|
#
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
DROP PROCEDURE IF EXISTS p1;
|
|
--enable_warnings
|
|
|
|
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;
|
|
|
|
SELECT CONCAT_WS('<---->',number,alpha) AS new
|
|
FROM t1 GROUP BY new LIMIT 1;
|
|
|
|
SELECT number, alpha, CONCAT_WS('<->',number,alpha) AS new
|
|
FROM t1 GROUP BY new LIMIT 1;
|
|
|
|
SELECT number, alpha, CONCAT_WS('-',number,alpha,alpha,alpha,alpha,alpha,alpha,alpha) AS new
|
|
FROM t1 GROUP BY new LIMIT 1;
|
|
|
|
SELECT number, alpha, CONCAT_WS('<------------------>',number,alpha) AS new
|
|
FROM t1 GROUP BY new LIMIT 1;
|
|
drop table t1;
|
|
|
|
#
|
|
# Bug #5540: a problem with double type
|
|
#
|
|
|
|
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';
|
|
drop table t1;
|
|
|
|
# BUG#6825
|
|
select 'a' union select concat('a', -4);
|
|
select 'a' union select concat('a', -4.5);
|
|
|
|
select 'a' union select concat('a', -(4 + 1));
|
|
select 'a' union select concat('a', 4 - 5);
|
|
|
|
select 'a' union select concat('a', -'3');
|
|
select 'a' union select concat('a', -concat('3',4));
|
|
|
|
select 'a' union select concat('a', -0);
|
|
--replace_result a-0.0 a0.0
|
|
select 'a' union select concat('a', -0.0);
|
|
|
|
--replace_result a-0.0000 a0.0000
|
|
select 'a' union select concat('a', -0.0000);
|
|
|
|
#
|
|
# Bug#16716: subselect in concat() may lead to a wrong result
|
|
#
|
|
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;
|
|
|
|
# End of 4.1 tests
|
|
|
|
#
|
|
# Bug#15962: CONCAT() in UNION may lead to a data trucation.
|
|
#
|
|
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
|
|
|
|
|
|
--echo #
|
|
--echo # Bug #44743: Join in combination with concat does not always work
|
|
--echo #
|
|
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';
|
|
|
|
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';
|
|
|
|
DROP TABLE t1, t2;
|
|
|
|
|
|
--echo #
|
|
--echo # Bug #50096: CONCAT_WS inside procedure returning wrong data
|
|
--echo #
|
|
|
|
CREATE PROCEDURE p1(a varchar(255), b int, c int)
|
|
SET @query = CONCAT_WS(",", a, b, c);
|
|
|
|
CALL p1("abcde", "0", "1234");
|
|
SELECT @query;
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
--echo #
|
|
--echo # Bug #40625: Concat fails on DOUBLE values in a Stored Procedure,
|
|
--echo # while DECIMAL works
|
|
--echo #
|
|
|
|
DELIMITER //;
|
|
CREATE PROCEDURE p1()
|
|
BEGIN
|
|
DECLARE v1 DOUBLE(10,3);
|
|
SET v1= 100;
|
|
SET @s = CONCAT('########################################', 40 , v1);
|
|
SELECT @s;
|
|
END;//
|
|
DELIMITER ;//
|
|
|
|
CALL p1();
|
|
CALL p1();
|
|
|
|
DROP PROCEDURE p1;
|
|
|
|
--echo # End of 5.1 tests
|