diff options
author | Alexander Barkov <bar@mariadb.com> | 2018-07-24 18:15:15 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2018-07-24 18:15:15 +0400 |
commit | a8227a154306a818685ab291f1715c3971d03099 (patch) | |
tree | 88ac9dee7c8e7df549d2d9d39c83a0d7b9e1b3f7 | |
parent | 45ab00f097be0f77d7087182244218f036c3f113 (diff) | |
download | mariadb-git-a8227a154306a818685ab291f1715c3971d03099.tar.gz |
MDEV-16814 CREATE TABLE SELECT JSON_QUOTE(multibyte_charset_expr) makes a field of a wrong length
-rw-r--r-- | mysql-test/r/func_json.result | 15 | ||||
-rw-r--r-- | mysql-test/t/func_json.test | 9 | ||||
-rw-r--r-- | sql/item_jsonfunc.cc | 2 |
3 files changed, 24 insertions, 2 deletions
diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result index 564442a2880..39bd46b7dea 100644 --- a/mysql-test/r/func_json.result +++ b/mysql-test/r/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'); @@ -747,3 +747,16 @@ INSERT INTO t1 VALUES ('foo'),('bar'); 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; diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test index 1b91061b9a3..37b18763e91 100644 --- a/mysql-test/t/func_json.test +++ b/mysql-test/t/func_json.test @@ -413,3 +413,12 @@ 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; diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc index 8103aa906ff..ac0d7e9e6b0 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; } |