From 0cd731864e6e4d88b75bfea4f02454871aedb89e Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Tue, 12 Sep 2017 15:21:53 +0400 Subject: [PATCH] MDEV-13104 Json functions. An extra ',' added to the JSON_MERGE result making it invalid. --- mysql-test/r/func_json.result | 3 +++ mysql-test/t/func_json.test | 5 +++++ sql/item_jsonfunc.cc | 17 ++++++++++++++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result index 80de41ccb07..fc4eb16a067 100644 --- a/mysql-test/r/func_json.result +++ b/mysql-test/r/func_json.result @@ -683,3 +683,6 @@ JSON_OBJECT("foo", "bar`bar") SELECT JSON_SET('{}', '$.age', 87); JSON_SET('{}', '$.age', 87) {"age": 87} +SELECT JSON_MERGE('[]', '{"c":"d"}'); +JSON_MERGE('[]', '{"c":"d"}') +[{"c": "d"}] diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test index 6d640f42003..8fc1f321928 100644 --- a/mysql-test/t/func_json.test +++ b/mysql-test/t/func_json.test @@ -333,3 +333,8 @@ SELECT JSON_OBJECT("foo", "bar`bar"); # SELECT JSON_SET('{}', '$.age', 87); +# +# MDEV-13104 Json functions. +# +SELECT JSON_MERGE('[]', '{"c":"d"}'); + diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc index e5544c6265d..52b3f570844 100644 --- a/sql/item_jsonfunc.cc +++ b/sql/item_jsonfunc.cc @@ -1971,14 +1971,25 @@ continue_j2: else { const uchar *end1, *beg1, *end2, *beg2; + int empty_array= 0; beg1= je1->value_begin; /* Merge as a single array. */ if (je1->value_type == JSON_VALUE_ARRAY) { - if (json_skip_level(je1)) + int cur_level= je1->stack_p; + empty_array= 1; + while (json_scan_next(je1) == 0) + { + if (je1->stack_p < cur_level) + break; + empty_array= 0; + } + + if (je1->s.error) return 1; + end1= je1->s.c_str - je1->sav_c_len; } else @@ -1995,8 +2006,8 @@ continue_j2: end1= je1->value_end; } - if (str->append((const char*) beg1, end1 - beg1), - str->append(", ", 2)) + if (str->append((const char*) beg1, end1 - beg1) || + (!empty_array && str->append(", ", 2))) return 3; if (json_value_scalar(je2))