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().
78 lines
1.9 KiB
Plaintext
78 lines
1.9 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
|
|
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;
|