Skip to content

Commit

Permalink
MDEV-11437 JSON_QUOTE function does not quote and uses wrong characte…
Browse files Browse the repository at this point in the history
…r set.

        json_quote fixed.
  • Loading branch information
Alexey Botchkov committed Dec 4, 2016
1 parent b4cbaf0 commit 12897a5
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 6 deletions.
12 changes: 11 additions & 1 deletion mysql-test/r/func_json.result
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,17 @@ json_exists('{"key1":"xxxx", "key2":[1, 2, 3]}', "$.key2[10]")
0
select 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);
json_merge('string', 123)
["string", 123]
Expand Down
4 changes: 4 additions & 0 deletions mysql-test/t/func_json.test
Original file line number Diff line number Diff line change
Expand Up @@ -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_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);

Expand Down
13 changes: 8 additions & 5 deletions sql/item_jsonfunc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -287,26 +287,29 @@ bool Item_func_json_query::check_and_get_value(json_engine_t *je, String *res,

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
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;
}


String *Item_func_json_quote::val_str(String *str)
{
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;

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. */
null_value= 1;
Expand Down

0 comments on commit 12897a5

Please sign in to comment.