From a88c71b29405a90c0117899901bf349fa9fce0c7 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 22 Oct 2024 11:10:58 +0400 Subject: [PATCH] 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. --- mysql-test/main/ctype_binary.result | 4 +- mysql-test/main/ctype_collate.result | 10 +-- mysql-test/main/ctype_cp1251.result | 4 +- mysql-test/main/ctype_latin1.result | 4 +- mysql-test/main/ctype_latin2.result | 12 ++-- mysql-test/main/ctype_ucs.result | 16 ++--- mysql-test/main/ctype_utf16.result | 12 ++-- mysql-test/main/ctype_utf16le.result | 12 ++-- mysql-test/main/ctype_utf32.result | 12 ++-- mysql-test/main/ctype_utf8.result | 26 +++++++- mysql-test/main/ctype_utf8.test | 22 +++++++ mysql-test/main/ctype_utf8mb4.result | 2 +- mysql-test/main/ctype_utf8mb4_heap.result | 2 +- mysql-test/main/ctype_utf8mb4_innodb.result | 2 +- mysql-test/main/ctype_utf8mb4_myisam.result | 2 +- mysql-test/main/default.result | 2 +- mysql-test/main/func_json.result | 2 +- mysql-test/main/func_misc.result | 4 +- mysql-test/main/func_regexp_pcre.result | 19 ++++-- mysql-test/main/func_regexp_pcre.test | 12 +++- mysql-test/main/func_str.result | 70 ++++++++++----------- mysql-test/main/func_str.test | 2 +- mysql-test/main/func_time.result | 2 +- mysql-test/main/func_weight_string.result | 2 +- mysql-test/main/gis.result | 2 +- mysql-test/main/metadata.result | 2 +- mysql-test/main/ps.result | 10 +-- mysql-test/main/type_blob.result | 2 +- mysql-test/main/user_var.result | 6 +- sql/item_func.cc | 4 +- sql/sql_type.h | 12 ++-- 31 files changed, 178 insertions(+), 117 deletions(-) diff --git a/mysql-test/main/ctype_binary.result b/mysql-test/main/ctype_binary.result index acb68ec5a2a..a2c57528ba7 100644 --- a/mysql-test/main/ctype_binary.result +++ b/mysql-test/main/ctype_binary.result @@ -423,7 +423,7 @@ t1 CREATE TABLE `t1` ( drop table t1; select hex(concat(coercibility('a'))); hex(concat(coercibility('a'))) -35 +36 create table t1 as select concat(coercibility('a')) as c1; show create table t1; Table Create Table @@ -811,7 +811,7 @@ t1 CREATE TABLE `t1` ( drop table t1; select coercibility(uuid()), coercibility(cast('a' as char character set latin1)); coercibility(uuid()) coercibility(cast('a' as char character set latin1)) -6 4 +7 4 select charset(concat(uuid(), cast('a' as char character set latin1))); charset(concat(uuid(), cast('a' as char character set latin1))) latin1 diff --git a/mysql-test/main/ctype_collate.result b/mysql-test/main/ctype_collate.result index 1d4c5f06127..e5fc353f1db 100644 --- a/mysql-test/main/ctype_collate.result +++ b/mysql-test/main/ctype_collate.result @@ -516,7 +516,7 @@ Variable_name Value character_set_client latin1 SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; charset('a') collation('a') coercibility('a') 'a'='A' -latin1 latin1_swedish_ci 5 1 +latin1 latin1_swedish_ci 6 1 explain extended SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used @@ -527,7 +527,7 @@ SHOW VARIABLES LIKE 'collation_client'; Variable_name Value SELECT charset('a'),collation('a'),coercibility('a'),'a'='A'; charset('a') collation('a') coercibility('a') 'a'='A' -latin1 latin1_swedish_ci 5 1 +latin1 latin1_swedish_ci 6 1 SET @@collation_database=@collation_database; SET CHARACTER SET 'DEFAULT'; ERROR 42000: Unknown character set: 'DEFAULT' @@ -687,7 +687,7 @@ RETURN "Testtext"; END;// SELECT getText(), CHARSET(getText()), COLLATION(getText()), COERCIBILITY(getText()); getText() CHARSET(getText()) COLLATION(getText()) COERCIBILITY(getText()) -Testtext latin1 latin1_swedish_ci 5 +Testtext latin1 latin1_swedish_ci 6 CREATE TABLE t1 AS SELECT ' - ' AS a UNION SELECT getText(); ERROR HY000: Illegal mix of collations for operation 'UNION' DROP FUNCTION getText; @@ -700,7 +700,7 @@ RETURN "Testtext"; END;// SELECT getText(), CHARSET(getText()), COLLATION(getText()), COERCIBILITY(getText()); getText() CHARSET(getText()) COLLATION(getText()) COERCIBILITY(getText()) -Testtext latin1 latin1_german2_ci 5 +Testtext latin1 latin1_german2_ci 6 CREATE TABLE t1 AS SELECT ' - ' AS a UNION SELECT getText(); SHOW CREATE TABLE t1; Table Create Table @@ -718,7 +718,7 @@ RETURN "Testtext"; END;// SELECT getText(), CHARSET(getText()), COLLATION(getText()), COERCIBILITY(getText()); getText() CHARSET(getText()) COLLATION(getText()) COERCIBILITY(getText()) -Testtext latin1 latin1_german2_ci 5 +Testtext latin1 latin1_german2_ci 6 CREATE TABLE t1 AS SELECT ' - ' AS a UNION SELECT getText(); SHOW CREATE TABLE t1; Table Create Table diff --git a/mysql-test/main/ctype_cp1251.result b/mysql-test/main/ctype_cp1251.result index 09824435605..88acf8bf3e1 100644 --- a/mysql-test/main/ctype_cp1251.result +++ b/mysql-test/main/ctype_cp1251.result @@ -835,7 +835,7 @@ t1 CREATE TABLE `t1` ( drop table t1; select hex(concat(coercibility('a'))); hex(concat(coercibility('a'))) -35 +36 create table t1 as select concat(coercibility('a')) as c1; show create table t1; Table Create Table @@ -1223,7 +1223,7 @@ t1 CREATE TABLE `t1` ( drop table t1; select coercibility(uuid()), coercibility(cast('a' as char character set latin1)); coercibility(uuid()) coercibility(cast('a' as char character set latin1)) -6 4 +7 4 select charset(concat(uuid(), cast('a' as char character set latin1))); charset(concat(uuid(), cast('a' as char character set latin1))) latin1 diff --git a/mysql-test/main/ctype_latin1.result b/mysql-test/main/ctype_latin1.result index 60a08fe97c8..1bdb83ee086 100644 --- a/mysql-test/main/ctype_latin1.result +++ b/mysql-test/main/ctype_latin1.result @@ -1144,7 +1144,7 @@ t1 CREATE TABLE `t1` ( drop table t1; select hex(concat(coercibility('a'))); hex(concat(coercibility('a'))) -35 +36 create table t1 as select concat(coercibility('a')) as c1; show create table t1; Table Create Table @@ -1532,7 +1532,7 @@ t1 CREATE TABLE `t1` ( drop table t1; select coercibility(uuid()), coercibility(cast('a' as char character set latin1)); coercibility(uuid()) coercibility(cast('a' as char character set latin1)) -6 4 +7 4 select charset(concat(uuid(), cast('a' as char character set latin1))); charset(concat(uuid(), cast('a' as char character set latin1))) latin1 diff --git a/mysql-test/main/ctype_latin2.result b/mysql-test/main/ctype_latin2.result index 363789d9ca6..47169eb025c 100644 --- a/mysql-test/main/ctype_latin2.result +++ b/mysql-test/main/ctype_latin2.result @@ -585,31 +585,31 @@ CHARSET('2013-11-15 00:41:28' - INTERVAL 7 DAY) latin2 SELECT COERCIBILITY('2013-11-15 00:41:28' - INTERVAL 7 DAY); COERCIBILITY('2013-11-15 00:41:28' - INTERVAL 7 DAY) -5 +6 SELECT CHARSET(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY); CHARSET(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY) binary SELECT COERCIBILITY(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY); COERCIBILITY(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY) -6 +7 SELECT CHARSET(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)); CHARSET(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)) latin2 SELECT COERCIBILITY(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)) -5 +6 SELECT CHARSET(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)); CHARSET(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)) latin2 SELECT COERCIBILITY(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)) -5 +6 SELECT CHARSET(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); CHARSET(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) latin2 SELECT COERCIBILITY(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) -5 +6 SELECT HEX(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); HEX(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) 323030312D30312D30312030303A30303A3030 @@ -618,7 +618,7 @@ CHARSET(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) latin2 SELECT COERCIBILITY(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) -5 +6 SELECT HEX(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)); HEX(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) 323030312D30312D30312030303A30303A3030 diff --git a/mysql-test/main/ctype_ucs.result b/mysql-test/main/ctype_ucs.result index b0b71ee8d81..bb1d45206e6 100644 --- a/mysql-test/main/ctype_ucs.result +++ b/mysql-test/main/ctype_ucs.result @@ -2027,7 +2027,7 @@ t1 CREATE TABLE `t1` ( drop table t1; select hex(concat(coercibility('a'))); hex(concat(coercibility('a'))) -0035 +0036 create table t1 as select concat(coercibility('a')) as c1; show create table t1; Table Create Table @@ -2415,7 +2415,7 @@ t1 CREATE TABLE `t1` ( drop table t1; select coercibility(uuid()), coercibility(cast('a' as char character set latin1)); coercibility(uuid()) coercibility(cast('a' as char character set latin1)) -6 4 +7 4 select charset(concat(uuid(), cast('a' as char character set latin1))); charset(concat(uuid(), cast('a' as char character set latin1))) latin1 @@ -5194,31 +5194,31 @@ CHARSET('2013-11-15 00:41:28' - INTERVAL 7 DAY) ucs2 SELECT COERCIBILITY('2013-11-15 00:41:28' - INTERVAL 7 DAY); COERCIBILITY('2013-11-15 00:41:28' - INTERVAL 7 DAY) -5 +6 SELECT CHARSET(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY); CHARSET(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY) binary SELECT COERCIBILITY(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY); COERCIBILITY(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY) -6 +7 SELECT CHARSET(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)); CHARSET(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)) ucs2 SELECT COERCIBILITY(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)) -5 +6 SELECT CHARSET(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)); CHARSET(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)) ucs2 SELECT COERCIBILITY(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)) -5 +6 SELECT CHARSET(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); CHARSET(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) ucs2 SELECT COERCIBILITY(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) -5 +6 SELECT HEX(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); HEX(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) 0032003000300031002D00300031002D00300031002000300030003A00300030003A00300030 @@ -5227,7 +5227,7 @@ CHARSET(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) ucs2 SELECT COERCIBILITY(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) -5 +6 SELECT HEX(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)); HEX(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) 0032003000300031002D00300031002D00300031002000300030003A00300030003A00300030 diff --git a/mysql-test/main/ctype_utf16.result b/mysql-test/main/ctype_utf16.result index b7663066764..e73c3c5a6ab 100644 --- a/mysql-test/main/ctype_utf16.result +++ b/mysql-test/main/ctype_utf16.result @@ -1395,31 +1395,31 @@ CHARSET('2013-11-15 00:41:28' - INTERVAL 7 DAY) utf16 SELECT COERCIBILITY('2013-11-15 00:41:28' - INTERVAL 7 DAY); COERCIBILITY('2013-11-15 00:41:28' - INTERVAL 7 DAY) -5 +6 SELECT CHARSET(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY); CHARSET(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY) binary SELECT COERCIBILITY(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY); COERCIBILITY(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY) -6 +7 SELECT CHARSET(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)); CHARSET(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)) utf16 SELECT COERCIBILITY(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)) -5 +6 SELECT CHARSET(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)); CHARSET(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)) utf16 SELECT COERCIBILITY(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)) -5 +6 SELECT CHARSET(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); CHARSET(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) utf16 SELECT COERCIBILITY(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) -5 +6 SELECT HEX(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); HEX(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) 0032003000300031002D00300031002D00300031002000300030003A00300030003A00300030 @@ -1428,7 +1428,7 @@ CHARSET(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) utf16 SELECT COERCIBILITY(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) -5 +6 SELECT HEX(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)); HEX(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) 0032003000300031002D00300031002D00300031002000300030003A00300030003A00300030 diff --git a/mysql-test/main/ctype_utf16le.result b/mysql-test/main/ctype_utf16le.result index be9804aadc2..c83610dcafa 100644 --- a/mysql-test/main/ctype_utf16le.result +++ b/mysql-test/main/ctype_utf16le.result @@ -1666,31 +1666,31 @@ CHARSET('2013-11-15 00:41:28' - INTERVAL 7 DAY) utf16le SELECT COERCIBILITY('2013-11-15 00:41:28' - INTERVAL 7 DAY); COERCIBILITY('2013-11-15 00:41:28' - INTERVAL 7 DAY) -5 +6 SELECT CHARSET(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY); CHARSET(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY) binary SELECT COERCIBILITY(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY); COERCIBILITY(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY) -6 +7 SELECT CHARSET(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)); CHARSET(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)) utf16le SELECT COERCIBILITY(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)) -5 +6 SELECT CHARSET(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)); CHARSET(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)) utf16le SELECT COERCIBILITY(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)) -5 +6 SELECT CHARSET(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); CHARSET(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) utf16le SELECT COERCIBILITY(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) -5 +6 SELECT HEX(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); HEX(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) 32003000300031002D00300031002D00300031002000300030003A00300030003A0030003000 @@ -1699,7 +1699,7 @@ CHARSET(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) utf16le SELECT COERCIBILITY(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) -5 +6 SELECT HEX(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)); HEX(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) 32003000300031002D00300031002D00300031002000300030003A00300030003A0030003000 diff --git a/mysql-test/main/ctype_utf32.result b/mysql-test/main/ctype_utf32.result index 335dd40071e..f9729af1e75 100644 --- a/mysql-test/main/ctype_utf32.result +++ b/mysql-test/main/ctype_utf32.result @@ -1339,31 +1339,31 @@ CHARSET('2013-11-15 00:41:28' - INTERVAL 7 DAY) utf32 SELECT COERCIBILITY('2013-11-15 00:41:28' - INTERVAL 7 DAY); COERCIBILITY('2013-11-15 00:41:28' - INTERVAL 7 DAY) -5 +6 SELECT CHARSET(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY); CHARSET(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY) binary SELECT COERCIBILITY(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY); COERCIBILITY(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY) -6 +7 SELECT CHARSET(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)); CHARSET(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)) utf32 SELECT COERCIBILITY(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('2013-11-15 00:41:28' - INTERVAL 7 DAY)) -5 +6 SELECT CHARSET(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)); CHARSET(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)) utf32 SELECT COERCIBILITY(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT(TIMESTAMP'2013-11-15 00:41:28' - INTERVAL 7 DAY)) -5 +6 SELECT CHARSET(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); CHARSET(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) utf32 SELECT COERCIBILITY(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) -5 +6 SELECT HEX(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)); HEX(CONCAT('','2001-01-08 00:00:00' - INTERVAL 7 DAY)) 000000320000003000000030000000310000002D00000030000000310000002D00000030000000310000002000000030000000300000003A00000030000000300000003A0000003000000030 @@ -1372,7 +1372,7 @@ CHARSET(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) utf32 SELECT COERCIBILITY(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)); COERCIBILITY(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) -5 +6 SELECT HEX(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)); HEX(CONCAT('',TIMESTAMP'2001-01-08 00:00:00' - INTERVAL 7 DAY)) 000000320000003000000030000000310000002D00000030000000310000002D00000030000000310000002000000030000000300000003A00000030000000300000003A0000003000000030 diff --git a/mysql-test/main/ctype_utf8.result b/mysql-test/main/ctype_utf8.result index 68364b2e4bb..23ae21eb345 100644 --- a/mysql-test/main/ctype_utf8.result +++ b/mysql-test/main/ctype_utf8.result @@ -1892,7 +1892,7 @@ insert into t1 values('t1_val'); create view v1 as select 'v1_val' as col1; select coercibility(col1), collation(col1) from v1; coercibility(col1) collation(col1) -5 utf8mb3_general_ci +6 utf8mb3_general_ci create view v2 as select col1 from v1 union select col1 from t1; select coercibility(col1), collation(col1)from v2; coercibility(col1) collation(col1) @@ -2772,7 +2772,7 @@ t1 CREATE TABLE `t1` ( drop table t1; select hex(concat(coercibility('a'))); hex(concat(coercibility('a'))) -35 +36 create table t1 as select concat(coercibility('a')) as c1; show create table t1; Table Create Table @@ -3160,7 +3160,7 @@ t1 CREATE TABLE `t1` ( drop table t1; select coercibility(uuid()), coercibility(cast('a' as char character set latin1)); coercibility(uuid()) coercibility(cast('a' as char character set latin1)) -6 4 +7 4 select charset(concat(uuid(), cast('a' as char character set latin1))); charset(concat(uuid(), cast('a' as char character set latin1))) latin1 @@ -10805,3 +10805,23 @@ DROP TABLE t1; # # End of 10.9 tests # +# +# Start of 11.6 tests +# +# +# MDEV-35041 Simple comparison causes "Illegal mix of collations" even with default server settings +# +CREATE TABLE t1 (a INT); +SET NAMES utf8mb3; +SELECT COLUMN_TYPE INTO @col_type FROM INFORMATION_SCHEMA.COLUMNS +WHERE TABLE_NAME='t1'; +SELECT @col_type != 'binary(128)'; +@col_type != 'binary(128)' +1 +SELECT COERCIBILITY(@col_type), COERCIBILITY('binary(128)'); +COERCIBILITY(@col_type) COERCIBILITY('binary(128)') +5 6 +DROP TABLE t1; +# +# End of 11.6 tests +# diff --git a/mysql-test/main/ctype_utf8.test b/mysql-test/main/ctype_utf8.test index a95d98bf2ca..9f96faa02c2 100644 --- a/mysql-test/main/ctype_utf8.test +++ b/mysql-test/main/ctype_utf8.test @@ -2535,3 +2535,25 @@ DROP TABLE t1; --echo # --echo # End of 10.9 tests --echo # + + +--echo # +--echo # Start of 11.6 tests +--echo # + +--echo # +--echo # MDEV-35041 Simple comparison causes "Illegal mix of collations" even with default server settings +--echo # + +CREATE TABLE t1 (a INT); +SET NAMES utf8mb3; +SELECT COLUMN_TYPE INTO @col_type FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_NAME='t1'; +SELECT @col_type != 'binary(128)'; +SELECT COERCIBILITY(@col_type), COERCIBILITY('binary(128)'); +DROP TABLE t1; + + +--echo # +--echo # End of 11.6 tests +--echo # diff --git a/mysql-test/main/ctype_utf8mb4.result b/mysql-test/main/ctype_utf8mb4.result index fe08e0db7ba..c97ba3b6d53 100644 --- a/mysql-test/main/ctype_utf8mb4.result +++ b/mysql-test/main/ctype_utf8mb4.result @@ -1918,7 +1918,7 @@ insert into t1 values('t1_val'); create view v1 as select 'v1_val' as col1; select coercibility(col1), collation(col1) from v1; coercibility(col1) collation(col1) -5 utf8mb4_general_ci +6 utf8mb4_general_ci create view v2 as select col1 from v1 union select col1 from t1; select coercibility(col1), collation(col1)from v2; coercibility(col1) collation(col1) diff --git a/mysql-test/main/ctype_utf8mb4_heap.result b/mysql-test/main/ctype_utf8mb4_heap.result index d166d26dc70..9d630439484 100644 --- a/mysql-test/main/ctype_utf8mb4_heap.result +++ b/mysql-test/main/ctype_utf8mb4_heap.result @@ -1882,7 +1882,7 @@ insert into t1 values('t1_val'); create view v1 as select 'v1_val' as col1; select coercibility(col1), collation(col1) from v1; coercibility(col1) collation(col1) -5 utf8mb4_uca1400_ai_ci +6 utf8mb4_uca1400_ai_ci create view v2 as select col1 from v1 union select col1 from t1; select coercibility(col1), collation(col1)from v2; coercibility(col1) collation(col1) diff --git a/mysql-test/main/ctype_utf8mb4_innodb.result b/mysql-test/main/ctype_utf8mb4_innodb.result index 8697608469f..21b3c820bfc 100644 --- a/mysql-test/main/ctype_utf8mb4_innodb.result +++ b/mysql-test/main/ctype_utf8mb4_innodb.result @@ -2008,7 +2008,7 @@ insert into t1 values('t1_val'); create view v1 as select 'v1_val' as col1; select coercibility(col1), collation(col1) from v1; coercibility(col1) collation(col1) -5 utf8mb4_uca1400_ai_ci +6 utf8mb4_uca1400_ai_ci create view v2 as select col1 from v1 union select col1 from t1; select coercibility(col1), collation(col1)from v2; coercibility(col1) collation(col1) diff --git a/mysql-test/main/ctype_utf8mb4_myisam.result b/mysql-test/main/ctype_utf8mb4_myisam.result index ff9d5f26700..b388769ad49 100644 --- a/mysql-test/main/ctype_utf8mb4_myisam.result +++ b/mysql-test/main/ctype_utf8mb4_myisam.result @@ -2015,7 +2015,7 @@ insert into t1 values('t1_val'); create view v1 as select 'v1_val' as col1; select coercibility(col1), collation(col1) from v1; coercibility(col1) collation(col1) -5 utf8mb4_uca1400_ai_ci +6 utf8mb4_uca1400_ai_ci create view v2 as select col1 from v1 union select col1 from t1; select coercibility(col1), collation(col1)from v2; coercibility(col1) collation(col1) diff --git a/mysql-test/main/default.result b/mysql-test/main/default.result index 2abace02973..7234001fcf0 100644 --- a/mysql-test/main/default.result +++ b/mysql-test/main/default.result @@ -2970,7 +2970,7 @@ t1 CREATE TABLE `t1` ( INSERT INTO t1 (a) VALUES ('test'); SELECT * FROM t1; a b c -test 2 6 +test 2 7 DROP TABLE t1; # # String result metadata functions diff --git a/mysql-test/main/func_json.result b/mysql-test/main/func_json.result index 230a2b5c480..5984b3ac528 100644 --- a/mysql-test/main/func_json.result +++ b/mysql-test/main/func_json.result @@ -424,7 +424,7 @@ coercibility(json_unquote(json_object('bar', c))) as coer_json_unquote, coercibility('bar') as coer_literal from t1 limit 1; coll_json_unquote coer_json_unquote coer_literal -utf8mb3_general_ci 4 5 +utf8mb3_general_ci 4 6 create table t2 as select json_object('foo', json_unquote(json_object('bar', c)),'qux', c) as fld from t1 limit 0; show create table t2; Table Create Table diff --git a/mysql-test/main/func_misc.result b/mysql-test/main/func_misc.result index 8dc2a52d262..ecfac5d25fe 100644 --- a/mysql-test/main/func_misc.result +++ b/mysql-test/main/func_misc.result @@ -1477,10 +1477,10 @@ COERCIBILITY(NAME_CONST('name','test')) 2 SELECT COERCIBILITY(NAME_CONST('name',TIME'00:00:00')); COERCIBILITY(NAME_CONST('name',TIME'00:00:00')) -6 +7 SELECT COERCIBILITY(NAME_CONST('name',15)); COERCIBILITY(NAME_CONST('name',15)) -6 +7 SELECT CONCAT(NAME_CONST('name',15),'오'); CONCAT(NAME_CONST('name',15),'오') 15오 diff --git a/mysql-test/main/func_regexp_pcre.result b/mysql-test/main/func_regexp_pcre.result index e268d1dbafd..3085d2a31fb 100644 --- a/mysql-test/main/func_regexp_pcre.result +++ b/mysql-test/main/func_regexp_pcre.result @@ -869,12 +869,21 @@ SELECT 0xE001 REGEXP CAST(@regCheck AS CHAR); 0 Warnings: Warning 1139 Regex error 'UTF-8 error: 1 byte missing at end' -# Since 11.4 user variables have DERIVATION_COERCIBLE -# so a user variable and a literal in the pattern give equal results +# Since 11.5 (MDEV-25829) user variables have DERIVATION_COERCIBLE +# so a user variable and a literal in the pattern gave equal results +# But since 11.6 (MDEV-35041) user variables have DERIVATION_USERVAR +# so the query with a literal is performece as binary: +SELECT 0xE001 REGEXP '\\xE0\\x01' AS c1; +c1 +1 +# while the query with a user variable is performed as string +# with a warning, like in 11.4 SET @regCheck= '\\xE0\\x01'; -SELECT 0xE001 REGEXP '\\xE0\\x01' AS c1, 0xE001 REGEXP @regCheck AS c2; -c1 c2 -1 1 +SELECT 0xE001 REGEXP @regCheck AS c2; +c2 +0 +Warnings: +Warning 1139 Regex error 'UTF-8 error: 1 byte missing at end' # Testing workaround N1: This makes the pattern to be a binary string: SET NAMES latin1; SET @regCheck= X'E001'; diff --git a/mysql-test/main/func_regexp_pcre.test b/mysql-test/main/func_regexp_pcre.test index 3629b0e7f45..53280b75e9e 100644 --- a/mysql-test/main/func_regexp_pcre.test +++ b/mysql-test/main/func_regexp_pcre.test @@ -420,10 +420,16 @@ SET @regCheck= '\\xE0\\x01'; SELECT 0xE001 REGEXP @regCheck COLLATE latin1_bin; SELECT 0xE001 REGEXP CAST(@regCheck AS CHAR); ---echo # Since 11.4 user variables have DERIVATION_COERCIBLE ---echo # so a user variable and a literal in the pattern give equal results +--echo # Since 11.5 (MDEV-25829) user variables have DERIVATION_COERCIBLE +--echo # so a user variable and a literal in the pattern gave equal results +--echo # But since 11.6 (MDEV-35041) user variables have DERIVATION_USERVAR +--echo # so the query with a literal is performece as binary: +SELECT 0xE001 REGEXP '\\xE0\\x01' AS c1; + +--echo # while the query with a user variable is performed as string +--echo # with a warning, like in 11.4 SET @regCheck= '\\xE0\\x01'; -SELECT 0xE001 REGEXP '\\xE0\\x01' AS c1, 0xE001 REGEXP @regCheck AS c2; +SELECT 0xE001 REGEXP @regCheck AS c2; --echo # Testing workaround N1: This makes the pattern to be a binary string: SET NAMES latin1; diff --git a/mysql-test/main/func_str.result b/mysql-test/main/func_str.result index 7597b09ba72..3dd708fb347 100644 --- a/mysql-test/main/func_str.result +++ b/mysql-test/main/func_str.result @@ -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 diff --git a/mysql-test/main/func_str.test b/mysql-test/main/func_str.test index dcb0bb9c7a6..0ab27d9466d 100644 --- a/mysql-test/main/func_str.test +++ b/mysql-test/main/func_str.test @@ -474,7 +474,7 @@ where collation(t2.a) = _utf8'binary' order by t1.a,t2.a; select t1.*,t2.* from t1 left join t2 on (t1.b=t2.b) where charset(t2.a) = _utf8'binary' order by t1.a,t2.a; 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; DROP TABLE t1, t2; # diff --git a/mysql-test/main/func_time.result b/mysql-test/main/func_time.result index d989380b967..6c0238c085c 100644 --- a/mysql-test/main/func_time.result +++ b/mysql-test/main/func_time.result @@ -616,7 +616,7 @@ LOWER(MONTHNAME(19700101)) january SELECT COERCIBILITY(MONTHNAME('1970-01-01')),COERCIBILITY(DAYNAME('1970-01-01')); COERCIBILITY(MONTHNAME('1970-01-01')) COERCIBILITY(DAYNAME('1970-01-01')) -5 5 +6 6 CREATE TABLE t1 (datetime datetime, timestamp timestamp, date date, time time); INSERT INTO t1 values ("2001-01-02 03:04:05", "2002-01-02 03:04:05", "2003-01-02", "06:07:08"); SELECT * from t1; diff --git a/mysql-test/main/func_weight_string.result b/mysql-test/main/func_weight_string.result index fedbbf5f166..05bf1e099f1 100644 --- a/mysql-test/main/func_weight_string.result +++ b/mysql-test/main/func_weight_string.result @@ -69,7 +69,7 @@ weight_string reverse 1 2 select coercibility(weight_string('test')); coercibility(weight_string('test')) -5 +6 select coercibility(weight_string('test' collate latin1_swedish_ci)); coercibility(weight_string('test' collate latin1_swedish_ci)) 0 diff --git a/mysql-test/main/gis.result b/mysql-test/main/gis.result index 05f7386872c..3eb4f56f892 100644 --- a/mysql-test/main/gis.result +++ b/mysql-test/main/gis.result @@ -4885,7 +4885,7 @@ UNCOMPRESSED_LENGTH(POINT(1,1)) 0 SELECT COERCIBILITY(POINT(1,1)); COERCIBILITY(POINT(1,1)) -5 +6 SELECT ASCII(POINT(1,1)); ASCII(POINT(1,1)) 0 diff --git a/mysql-test/main/metadata.result b/mysql-test/main/metadata.result index 28a95b58966..86ea3745c09 100644 --- a/mysql-test/main/metadata.result +++ b/mysql-test/main/metadata.result @@ -426,7 +426,7 @@ def ORD('a') 3 7 2 N 32897 0 63 def CRC32('a') 3 10 10 N 32929 0 63 def UNCOMPRESSED_LENGTH(COMPRESS('a')) 3 10 1 Y 32896 0 63 STRCMP('a','b') OCTET_LENGTH('a') CHAR_LENGTH('a') COERCIBILITY('a') ASCII('a') ORD('a') CRC32('a') UNCOMPRESSED_LENGTH(COMPRESS('a')) --1 1 1 5 97 97 3904355907 1 +-1 1 1 6 97 97 3904355907 1 SELECT INTERVAL(2,1,2,3), REGEXP_INSTR('a','a'), diff --git a/mysql-test/main/ps.result b/mysql-test/main/ps.result index 8631dcda6f7..e3404996841 100644 --- a/mysql-test/main/ps.result +++ b/mysql-test/main/ps.result @@ -5152,19 +5152,19 @@ CHARSET(CONCAT(?,_latin1'a')) latin1 EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5; COERCIBILITY(?) -6 +7 EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5.5; COERCIBILITY(?) -6 +7 EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING 5.5e0; COERCIBILITY(?) -6 +7 EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING TIME'10:20:30'; COERCIBILITY(?) -6 +7 EXECUTE IMMEDIATE "SELECT COERCIBILITY(?)" USING TIMESTAMP'2001-01-01 10:20:30'; COERCIBILITY(?) -6 +7 # # MDEV-14435 Different UNSIGNED flag of out user variable for YEAR parameter for direct vs prepared CALL # diff --git a/mysql-test/main/type_blob.result b/mysql-test/main/type_blob.result index c66174155db..4449041ecd7 100644 --- a/mysql-test/main/type_blob.result +++ b/mysql-test/main/type_blob.result @@ -520,7 +520,7 @@ charset(load_file('../../std_data/words.dat')), collation(load_file('../../std_data/words.dat')), coercibility(load_file('../../std_data/words.dat')); charset(load_file('../../std_data/words.dat')) collation(load_file('../../std_data/words.dat')) coercibility(load_file('../../std_data/words.dat')) -binary binary 5 +binary binary 6 explain extended select charset(load_file('MYSQLTEST_VARDIR/std_data/words.dat')), collation(load_file('MYSQLTEST_VARDIR/std_data/words.dat')), diff --git a/mysql-test/main/user_var.result b/mysql-test/main/user_var.result index 0825d718ead..7837a77ed3e 100644 --- a/mysql-test/main/user_var.result +++ b/mysql-test/main/user_var.result @@ -162,13 +162,13 @@ collation(@a:=_latin2'test') latin2_general_ci select coercibility(@a:=_latin2'test'); coercibility(@a:=_latin2'test') -5 +6 select collation(@a:=_latin2'test' collate latin2_bin); collation(@a:=_latin2'test' collate latin2_bin) latin2_bin select coercibility(@a:=_latin2'test' collate latin2_bin); coercibility(@a:=_latin2'test' collate latin2_bin) -5 +6 select (@a:=_latin2'test' collate latin2_bin) = _latin2'TEST'; (@a:=_latin2'test' collate latin2_bin) = _latin2'TEST' 0 @@ -188,7 +188,7 @@ NULL 5 set @v1=null, @v2=1, @v3=1.1, @v4=now(); select coercibility(@v1),coercibility(@v2),coercibility(@v3),coercibility(@v4); coercibility(@v1) coercibility(@v2) coercibility(@v3) coercibility(@v4) -5 6 6 5 +5 7 7 5 set session @honk=99; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '@honk=99' at line 1 select @@local.max_allowed_packet; diff --git a/sql/item_func.cc b/sql/item_func.cc index 3377bc4671a..7bb608e1888 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -5694,7 +5694,7 @@ bool Item_func_get_user_var::fix_length_and_dec(THD *thd) set_handler(&type_handler_slonglong); break; case STRING_RESULT: - collation.set(m_var_entry->charset(), DERIVATION_COERCIBLE); + collation.set(m_var_entry->charset(), DERIVATION_USERVAR); max_length= MAX_BLOB_WIDTH - 1; set_handler(&type_handler_long_blob); if (m_var_entry->type_handler()->field_type() == MYSQL_TYPE_GEOMETRY) @@ -5714,7 +5714,7 @@ bool Item_func_get_user_var::fix_length_and_dec(THD *thd) } else { - collation.set(&my_charset_bin, DERIVATION_COERCIBLE); + collation.set(&my_charset_bin, DERIVATION_USERVAR); null_value= 1; set_handler(&type_handler_long_blob); max_length= MAX_BLOB_WIDTH; diff --git a/sql/sql_type.h b/sql/sql_type.h index 5d2021c0636..efbb0bcee3b 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -3018,7 +3018,7 @@ static inline my_repertoire_t &operator|=(my_repertoire_t &a, enum Derivation { - DERIVATION_IGNORABLE= 7, // Explicit NULL + DERIVATION_IGNORABLE= 8, // Explicit NULL /* Explicit or implicit conversion from numeric/temporal data to string: @@ -3026,17 +3026,20 @@ enum Derivation - Numeric user variables - CAST(numeric_or_temporal_expr AS CHAR) */ - DERIVATION_NUMERIC= 6, + DERIVATION_NUMERIC= 7, /* - String literals + */ + DERIVATION_COERCIBLE= 6, + + /* - String user variables */ - DERIVATION_COERCIBLE= 5, + DERIVATION_USERVAR= 5, /* String cast and conversion functions: - - BINARY(expr) - CAST(string_expr AS CHAR) - CONVERT(expr USING cs) */ @@ -3162,6 +3165,7 @@ public: case DERIVATION_NUMERIC: return "NUMERIC"; case DERIVATION_IGNORABLE: return "IGNORABLE"; case DERIVATION_COERCIBLE: return "COERCIBLE"; + case DERIVATION_USERVAR: return "USERVAR"; case DERIVATION_CAST: return "CAST"; case DERIVATION_IMPLICIT: return "IMPLICIT"; case DERIVATION_SYSCONST: return "SYSCONST";