mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
MDEV-35041 Simple comparison causes "Illegal mix of collations" even with default server settings
The task "MDEV-25829 Change default Unicode collation to uca1400_ai_ci" previously changed collation derivation for string user variables from DERIVATION_EXPLICIT to DERIVATION_COERCIBLE, to resolve illegal collation mix conflicts between table columns and user variables when they have different collations. However, DERIVATION_COERCIBLE was a wrong choice because it caused conflicts between string literals and user variables when they have different collations. Adding a new collation derivation level DERIVATION_USERVAR. This makes the collation of a user variable: - weaker than a table column (like it was intended by MDEV-25829) - but stronger than a literal (like it was in pre-MDEV-25829) Cleanup in sql_type.h: Removing the line "- BINARY(expr)" from the before-DERIVATION_CAST comment, as it was on a wrong place. It's also listed on the correct place before DERIVATION_IMPLICIT.
This commit is contained in:
@ -609,103 +609,103 @@ select _latin1'B' COLLATE latin1_general_ci in (_latin1'a',_latin1'b' COLLATE la
|
||||
ERROR HY000: Illegal mix of collations (latin1_general_ci,EXPLICIT), (latin1_swedish_ci,COERCIBLE), (latin1_bin,EXPLICIT) for operation 'in'
|
||||
select collation(bin(130)), coercibility(bin(130));
|
||||
collation(bin(130)) coercibility(bin(130))
|
||||
latin1_swedish_ci 5
|
||||
latin1_swedish_ci 6
|
||||
select collation(oct(130)), coercibility(oct(130));
|
||||
collation(oct(130)) coercibility(oct(130))
|
||||
latin1_swedish_ci 5
|
||||
latin1_swedish_ci 6
|
||||
select collation(conv(130,16,10)), coercibility(conv(130,16,10));
|
||||
collation(conv(130,16,10)) coercibility(conv(130,16,10))
|
||||
latin1_swedish_ci 5
|
||||
latin1_swedish_ci 6
|
||||
select collation(hex(130)), coercibility(hex(130));
|
||||
collation(hex(130)) coercibility(hex(130))
|
||||
latin1_swedish_ci 5
|
||||
latin1_swedish_ci 6
|
||||
select collation(char(130)), coercibility(hex(130));
|
||||
collation(char(130)) coercibility(hex(130))
|
||||
binary 5
|
||||
binary 6
|
||||
select collation(format(130,10)), coercibility(format(130,10));
|
||||
collation(format(130,10)) coercibility(format(130,10))
|
||||
latin1_swedish_ci 5
|
||||
latin1_swedish_ci 6
|
||||
select collation(lcase(_latin2'a')), coercibility(lcase(_latin2'a'));
|
||||
collation(lcase(_latin2'a')) coercibility(lcase(_latin2'a'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(ucase(_latin2'a')), coercibility(ucase(_latin2'a'));
|
||||
collation(ucase(_latin2'a')) coercibility(ucase(_latin2'a'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(left(_latin2'a',1)), coercibility(left(_latin2'a',1));
|
||||
collation(left(_latin2'a',1)) coercibility(left(_latin2'a',1))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(right(_latin2'a',1)), coercibility(right(_latin2'a',1));
|
||||
collation(right(_latin2'a',1)) coercibility(right(_latin2'a',1))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(substring(_latin2'a',1,1)), coercibility(substring(_latin2'a',1,1));
|
||||
collation(substring(_latin2'a',1,1)) coercibility(substring(_latin2'a',1,1))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(concat(_latin2'a',_latin2'b')), coercibility(concat(_latin2'a',_latin2'b'));
|
||||
collation(concat(_latin2'a',_latin2'b')) coercibility(concat(_latin2'a',_latin2'b'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(lpad(_latin2'a',4,_latin2'b')), coercibility(lpad(_latin2'a',4,_latin2'b'));
|
||||
collation(lpad(_latin2'a',4,_latin2'b')) coercibility(lpad(_latin2'a',4,_latin2'b'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(lpad(_latin2'a',4)), coercibility(lpad(_latin2'a',4));
|
||||
collation(lpad(_latin2'a',4)) coercibility(lpad(_latin2'a',4))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(rpad(_latin2'a',4,_latin2'b')), coercibility(rpad(_latin2'a',4,_latin2'b'));
|
||||
collation(rpad(_latin2'a',4,_latin2'b')) coercibility(rpad(_latin2'a',4,_latin2'b'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(rpad(_latin2'a',4)), coercibility(rpad(_latin2'a',4));
|
||||
collation(rpad(_latin2'a',4)) coercibility(rpad(_latin2'a',4))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(concat_ws(_latin2'a',_latin2'b')), coercibility(concat_ws(_latin2'a',_latin2'b'));
|
||||
collation(concat_ws(_latin2'a',_latin2'b')) coercibility(concat_ws(_latin2'a',_latin2'b'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(make_set(255,_latin2'a',_latin2'b',_latin2'c')), coercibility(make_set(255,_latin2'a',_latin2'b',_latin2'c'));
|
||||
collation(make_set(255,_latin2'a',_latin2'b',_latin2'c')) coercibility(make_set(255,_latin2'a',_latin2'b',_latin2'c'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(export_set(255,_latin2'y',_latin2'n',_latin2' ')), coercibility(export_set(255,_latin2'y',_latin2'n',_latin2' '));
|
||||
collation(export_set(255,_latin2'y',_latin2'n',_latin2' ')) coercibility(export_set(255,_latin2'y',_latin2'n',_latin2' '))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(trim(_latin2' a ')), coercibility(trim(_latin2' a '));
|
||||
collation(trim(_latin2' a ')) coercibility(trim(_latin2' a '))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(ltrim(_latin2' a ')), coercibility(ltrim(_latin2' a '));
|
||||
collation(ltrim(_latin2' a ')) coercibility(ltrim(_latin2' a '))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(rtrim(_latin2' a ')), coercibility(rtrim(_latin2' a '));
|
||||
collation(rtrim(_latin2' a ')) coercibility(rtrim(_latin2' a '))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(trim(LEADING _latin2' ' FROM _latin2'a')), coercibility(trim(LEADING _latin2'a' FROM _latin2'a'));
|
||||
collation(trim(LEADING _latin2' ' FROM _latin2'a')) coercibility(trim(LEADING _latin2'a' FROM _latin2'a'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(trim(TRAILING _latin2' ' FROM _latin2'a')), coercibility(trim(TRAILING _latin2'a' FROM _latin2'a'));
|
||||
collation(trim(TRAILING _latin2' ' FROM _latin2'a')) coercibility(trim(TRAILING _latin2'a' FROM _latin2'a'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(trim(BOTH _latin2' ' FROM _latin2'a')), coercibility(trim(BOTH _latin2'a' FROM _latin2'a'));
|
||||
collation(trim(BOTH _latin2' ' FROM _latin2'a')) coercibility(trim(BOTH _latin2'a' FROM _latin2'a'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(repeat(_latin2'a',10)), coercibility(repeat(_latin2'a',10));
|
||||
collation(repeat(_latin2'a',10)) coercibility(repeat(_latin2'a',10))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(reverse(_latin2'ab')), coercibility(reverse(_latin2'ab'));
|
||||
collation(reverse(_latin2'ab')) coercibility(reverse(_latin2'ab'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(quote(_latin2'ab')), coercibility(quote(_latin2'ab'));
|
||||
collation(quote(_latin2'ab')) coercibility(quote(_latin2'ab'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(soundex(_latin2'ab')), coercibility(soundex(_latin2'ab'));
|
||||
collation(soundex(_latin2'ab')) coercibility(soundex(_latin2'ab'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(substring(_latin2'ab',1)), coercibility(substring(_latin2'ab',1));
|
||||
collation(substring(_latin2'ab',1)) coercibility(substring(_latin2'ab',1))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(insert(_latin2'abcd',2,3,_latin2'ef')), coercibility(insert(_latin2'abcd',2,3,_latin2'ef'));
|
||||
collation(insert(_latin2'abcd',2,3,_latin2'ef')) coercibility(insert(_latin2'abcd',2,3,_latin2'ef'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(replace(_latin2'abcd',_latin2'b',_latin2'B')), coercibility(replace(_latin2'abcd',_latin2'b',_latin2'B'));
|
||||
collation(replace(_latin2'abcd',_latin2'b',_latin2'B')) coercibility(replace(_latin2'abcd',_latin2'b',_latin2'B'))
|
||||
latin2_general_ci 5
|
||||
latin2_general_ci 6
|
||||
select collation(encode('abcd','ab')), coercibility(encode('abcd','ab'));
|
||||
collation(encode('abcd','ab')) coercibility(encode('abcd','ab'))
|
||||
binary 5
|
||||
binary 6
|
||||
create table t1
|
||||
select
|
||||
bin(130),
|
||||
@ -788,7 +788,7 @@ latin2 latin2_general_ci 2
|
||||
drop table t1;
|
||||
select charset(null), collation(null), coercibility(null);
|
||||
charset(null) collation(null) coercibility(null)
|
||||
binary binary 7
|
||||
binary binary 8
|
||||
CREATE TABLE t1 (a int, b int);
|
||||
CREATE TABLE t2 (a int, b int);
|
||||
INSERT INTO t1 VALUES (1,1),(2,2);
|
||||
@ -804,7 +804,7 @@ a b a b
|
||||
1 1 NULL NULL
|
||||
2 2 2 2
|
||||
select t1.*,t2.* from t1 left join t2 on (t1.b=t2.b)
|
||||
where coercibility(t2.a) = 6 order by t1.a,t2.a;
|
||||
where coercibility(t2.a) = 7 order by t1.a,t2.a;
|
||||
a b a b
|
||||
1 1 NULL NULL
|
||||
2 2 2 2
|
||||
|
Reference in New Issue
Block a user