diff options
-rw-r--r-- | mysql-test/r/func_json.result | 7 | ||||
-rw-r--r-- | mysql-test/t/func_json.test | 8 | ||||
-rw-r--r-- | sql/item_jsonfunc.cc | 6 |
3 files changed, 19 insertions, 2 deletions
diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result index 06c3b3fc2c3..f1b710c3a86 100644 --- a/mysql-test/r/func_json.result +++ b/mysql-test/r/func_json.result @@ -405,6 +405,13 @@ abc select json_unquote('abc'); json_unquote('abc') abc +create table t1 (c VARCHAR(8)) DEFAULT CHARSET=latin1; +insert into t1 values ('abc'),('def'); +select json_object('foo', json_unquote(json_object('bar', c)),'qux', c) as fld from t1; +fld +{"foo": "{\"bar\": \"abc\"}", "qux": "abc"} +{"foo": "{\"bar\": \"def\"}", "qux": "def"} +drop table t1; select json_object("a", json_object("b", "abcd")); json_object("a", json_object("b", "abcd")) {"a": {"b": "abcd"}} diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test index bc20a2222df..702ee0ccb9a 100644 --- a/mysql-test/t/func_json.test +++ b/mysql-test/t/func_json.test @@ -164,6 +164,14 @@ drop table t1; select json_unquote('"abc"'); select json_unquote('abc'); +# +# MDEV-13703 Illegal mix of collations for operation 'json_object' on using JSON_UNQUOTE as an argument. +# +create table t1 (c VARCHAR(8)) DEFAULT CHARSET=latin1; +insert into t1 values ('abc'),('def'); + +select json_object('foo', json_unquote(json_object('bar', c)),'qux', c) as fld from t1; +drop table t1; select json_object("a", json_object("b", "abcd")); select json_object("a", '{"b": "abcd"}'); diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc index 8561e08426b..f7be5b68892 100644 --- a/sql/item_jsonfunc.cc +++ b/sql/item_jsonfunc.cc @@ -581,7 +581,8 @@ String *Item_func_json_quote::val_str(String *str) void Item_func_json_unquote::fix_length_and_dec() { - collation.set(&my_charset_utf8_general_ci); + collation.set(&my_charset_utf8_general_ci, + DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII); max_length= args[0]->max_length; maybe_null= 1; } @@ -1458,7 +1459,8 @@ void Item_func_json_array::fix_length_and_dec() if (arg_count == 0) { - collation.set(&my_charset_utf8_general_ci); + collation.set(&my_charset_utf8_general_ci, + DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII); tmp_val.set_charset(&my_charset_utf8_general_ci); max_length= 2; return; |