mirror of
https://github.com/MariaDB/server.git
synced 2025-08-09 22:24:09 +03:00
To calculate its max_length the CONCAT() function is simply sums max_lengths of its arguments but when the collation of an argument differs from the collation of the CONCAT() max_length will be wrong. This may lead to a data truncation when a tmp table is used, in UNIONS for example. The Item_func_concat::fix_length_and_dec() function now recalculates the max_length of an argument when the mbmaxlen of the argument differs from the mbmaxlen of the CONCAT(). mysql-test/t/func_concat.test: Added test case for bug#15962:CONCAT() in UNION may lead to a data trucation. mysql-test/r/func_concat.result: Added test case for bug#15962:CONCAT() in UNION may lead to a data trucation. sql/item_strfunc.cc: Fixed bug#15962: CONCAT() in UNION may lead to a data trucation. The Item_func_concat::fix_length_and_dec() function now recalculates the max_length of an argument when the mbmaxlen of the argument differs from the mbmaxlen of the CONCAT().
64 lines
1.7 KiB
Plaintext
64 lines
1.7 KiB
Plaintext
#
|
|
# Test of problem with CONCAT_WS() and long separators.
|
|
#
|
|
|
|
--disable_warnings
|
|
DROP TABLE IF EXISTS t1;
|
|
--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);
|
|
|
|
# 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;
|