summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Botchkov <holyfoot@askmonty.org>2016-12-04 14:49:06 +0400
committerAlexey Botchkov <holyfoot@askmonty.org>2016-12-05 01:03:30 +0400
commit12897a5bba8a7980a7ca20115bebfc8e5f704a31 (patch)
tree99664c8e0d134454f430c8f9599c8297f4fd9fba
parentb4cbaf0b7c8bc32b8528b2e22f2d2a89971b8dde (diff)
downloadmariadb-git-12897a5bba8a7980a7ca20115bebfc8e5f704a31.tar.gz
MDEV-11437 JSON_QUOTE function does not quote and uses wrong character set.
json_quote fixed.
-rw-r--r--mysql-test/r/func_json.result12
-rw-r--r--mysql-test/t/func_json.test4
-rw-r--r--sql/item_jsonfunc.cc13
3 files changed, 23 insertions, 6 deletions
diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result
index 2f57231b755..fd31a39934f 100644
--- a/mysql-test/r/func_json.result
+++ b/mysql-test/r/func_json.result
@@ -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]
diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test
index caa8b0bb29c..229adc67e09 100644
--- a/mysql-test/t/func_json.test
+++ b/mysql-test/t/func_json.test
@@ -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);
diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc
index cf6bae91fec..00621bbfade 100644
--- a/sql/item_jsonfunc.cc
+++ b/sql/item_jsonfunc.cc
@@ -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()
{
- 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;
}
@@ -300,13 +300,16 @@ 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;