Commit 12897a5b authored by Alexey Botchkov's avatar Alexey Botchkov

MDEV-11437 JSON_QUOTE function does not quote and uses wrong character set.

        json_quote fixed.
parent b4cbaf0b
...@@ -186,7 +186,17 @@ json_exists('{"key1":"xxxx", "key2":[1, 2, 3]}', "$.key2[10]") ...@@ -186,7 +186,17 @@ json_exists('{"key1":"xxxx", "key2":[1, 2, 3]}', "$.key2[10]")
0 0
select json_quote('"string"'); select json_quote('"string"');
json_quote('"string"') json_quote('"string"')
\"string\" "\"string\""
create table t1 as select json_quote('foo');
select * from t1;
json_quote('foo')
"foo"
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`json_quote('foo')` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
select json_merge('string', 123); select json_merge('string', 123);
json_merge('string', 123) json_merge('string', 123)
["string", 123] ["string", 123]
......
...@@ -78,6 +78,10 @@ select json_exists('{"key1":"xxxx", "key2":[1, 2, 3]}', "$.key2[1]"); ...@@ -78,6 +78,10 @@ select json_exists('{"key1":"xxxx", "key2":[1, 2, 3]}', "$.key2[1]");
select json_exists('{"key1":"xxxx", "key2":[1, 2, 3]}', "$.key2[10]"); select json_exists('{"key1":"xxxx", "key2":[1, 2, 3]}', "$.key2[10]");
select json_quote('"string"'); select json_quote('"string"');
create table t1 as select json_quote('foo');
select * from t1;
show create table t1;
drop table t1;
select json_merge('string', 123); select json_merge('string', 123);
......
...@@ -287,12 +287,12 @@ bool Item_func_json_query::check_and_get_value(json_engine_t *je, String *res, ...@@ -287,12 +287,12 @@ bool Item_func_json_query::check_and_get_value(json_engine_t *je, String *res,
void Item_func_json_quote::fix_length_and_dec() void Item_func_json_quote::fix_length_and_dec()
{ {
collation.set(args[0]->collation); collation.set(&my_charset_utf8mb4_bin);
/* /*
Odd but realistic worst case is when all characters Odd but realistic worst case is when all characters
of the argument turn into '\uXXXX\uXXXX', which is 12. of the argument turn into '\uXXXX\uXXXX', which is 12.
*/ */
max_length= args[0]->max_length * 12; max_length= args[0]->max_length * 12 + 2;
} }
...@@ -300,13 +300,16 @@ String *Item_func_json_quote::val_str(String *str) ...@@ -300,13 +300,16 @@ String *Item_func_json_quote::val_str(String *str)
{ {
String *s= args[0]->val_str(&tmp_s); String *s= args[0]->val_str(&tmp_s);
if ((null_value= args[0]->null_value)) if ((null_value= (args[0]->null_value ||
args[0]->result_type() != STRING_RESULT)))
return NULL; return NULL;
str->length(0); str->length(0);
str->set_charset(s->charset()); str->set_charset(&my_charset_utf8mb4_bin);
if (st_append_escaped(str, s)) if (str->append("\"", 1) ||
st_append_escaped(str, s) ||
str->append("\"", 1))
{ {
/* Report an error. */ /* Report an error. */
null_value= 1; null_value= 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment