diff --git a/mysql-test/main/func_json.result b/mysql-test/main/func_json.result index 5fa5d7c628c..84aee70663e 100644 --- a/mysql-test/main/func_json.result +++ b/mysql-test/main/func_json.result @@ -297,7 +297,7 @@ json_quote('foo') show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `json_quote('foo')` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL + `json_quote('foo')` varchar(38) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 drop table t1; select json_merge('string'); @@ -748,6 +748,19 @@ SELECT * FROM t1 WHERE c IN (JSON_EXTRACT('{"a":"b"}', '$.*')); c DROP TABLE t1; # +# MDEV-16814 CREATE TABLE SELECT JSON_QUOTE(multibyte_charset_expr) makes a field of a wrong length +# +CREATE TABLE t1 AS SELECT +JSON_QUOTE(_latin1'foo') AS c1, +JSON_QUOTE(_utf8'foo') AS c2; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` varchar(38) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, + `c2` varchar(38) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t1; +# # End of 10.2 tests # # diff --git a/mysql-test/main/func_json.test b/mysql-test/main/func_json.test index 4f05d4f23c4..eddf64a0052 100644 --- a/mysql-test/main/func_json.test +++ b/mysql-test/main/func_json.test @@ -412,6 +412,16 @@ INSERT INTO t1 VALUES ('foo'),('bar'); SELECT * FROM t1 WHERE c IN (JSON_EXTRACT('{"a":"b"}', '$.*')); DROP TABLE t1; +--echo # +--echo # MDEV-16814 CREATE TABLE SELECT JSON_QUOTE(multibyte_charset_expr) makes a field of a wrong length +--echo # + +CREATE TABLE t1 AS SELECT + JSON_QUOTE(_latin1'foo') AS c1, + JSON_QUOTE(_utf8'foo') AS c2; +SHOW CREATE TABLE t1; +DROP TABLE t1; + --echo # --echo # End of 10.2 tests --echo # diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc index afcba91d57f..d1c15a0126e 100644 --- a/sql/item_jsonfunc.cc +++ b/sql/item_jsonfunc.cc @@ -575,7 +575,7 @@ bool Item_func_json_quote::fix_length_and_dec() Odd but realistic worst case is when all characters of the argument turn into '\uXXXX\uXXXX', which is 12. */ - max_length= args[0]->max_length * 12 + 2; + fix_char_length_ulonglong((ulonglong) args[0]->max_char_length() * 12 + 2); return FALSE; }