[Commits] c8bb43a: MDEV-17121 JSON_ARRAY_APPEND.
revision-id: c8bb43a9385cdb7a27f0702742a8d1e08a85befd (mariadb-10.2.16-128-gc8bb43a) parent(s): 4d9ec7cb6c83c571115bde59d72f02b494764755 committer: Alexey Botchkov timestamp: 2018-09-11 14:37:45 +0400 message: MDEV-17121 JSON_ARRAY_APPEND. Extra comma added to the result when an json array is empty. --- include/json_lib.h | 6 ++++++ mysql-test/r/func_json.result | 6 ++++++ mysql-test/t/func_json.test | 7 +++++++ sql/item_jsonfunc.cc | 6 ++++-- strings/json_lib.c | 25 +++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 2 deletions(-) diff --git a/include/json_lib.h b/include/json_lib.h index 567b04d..e9c1090 100644 --- a/include/json_lib.h +++ b/include/json_lib.h @@ -319,6 +319,12 @@ int json_skip_to_level(json_engine_t *j, int level); json_skip_to_level((json_engine), (json_engine)->stack_p) +/* + works as json_skip_level() but also counts items on the current + level skipped. +*/ +int json_skip_level_and_count(json_engine_t *j, int *n_items_skipped); + #define json_skip_array_item json_skip_key /* diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result index e8b2fac..9c7a106 100644 --- a/mysql-test/r/func_json.result +++ b/mysql-test/r/func_json.result @@ -790,3 +790,9 @@ JSON_SET('{}', '$.a', _utf8 0xC3B6, '$.b', _utf8 0xC3B6) SELECT JSON_SET('{}', '$.a', _utf8 X'C3B6', '$.x', 1, '$.b', _utf8 X'C3B6'); JSON_SET('{}', '$.a', _utf8 X'C3B6', '$.x', 1, '$.b', _utf8 X'C3B6') {"a": "�", "x": 1, "b": "�"} +# +# MDEV-17121 JSON_ARRAY_APPEND +# +select json_array_append('[ ]', '$', 'aue'); +json_array_append('[ ]', '$', 'aue') +["aue"] diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test index fd5e3d7..e27128a 100644 --- a/mysql-test/t/func_json.test +++ b/mysql-test/t/func_json.test @@ -448,3 +448,10 @@ SELECT JSON_SET('{}', '$.a', _utf8 0xC3B6); SELECT JSON_SET('{}', '$.a', _utf8 0xC3B6, '$.b', _utf8 0xC3B6); SELECT JSON_SET('{}', '$.a', _utf8 X'C3B6', '$.x', 1, '$.b', _utf8 X'C3B6'); + +--echo # +--echo # MDEV-17121 JSON_ARRAY_APPEND +--echo # + +select json_array_append('[ ]', '$', 'aue'); + diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc index 4a83764..1da5393 100644 --- a/sql/item_jsonfunc.cc +++ b/sql/item_jsonfunc.cc @@ -1621,13 +1621,15 @@ String *Item_func_json_array_append::val_str(String *str) if (je.value_type == JSON_VALUE_ARRAY) { - if (json_skip_level(&je)) + int n_items; + if (json_skip_level_and_count(&je, &n_items)) goto js_error; ar_end= je.s.c_str - je.sav_c_len; str_rest_len= js->length() - (ar_end - (const uchar *) js->ptr()); str->q_append(js->ptr(), ar_end-(const uchar *) js->ptr()); - str->append(", ", 2); + if (n_items) + str->append(", ", 2); if (append_json_value(str, args[n_arg+1], &tmp_val)) goto return_null; /* Out of memory. */ diff --git a/strings/json_lib.c b/strings/json_lib.c index f6b4f15..1c0ff4b 100644 --- a/strings/json_lib.c +++ b/strings/json_lib.c @@ -1197,6 +1197,31 @@ int json_skip_to_level(json_engine_t *j, int level) } +#define json_skip_level(json_engine) \ + json_skip_to_level((json_engine), (json_engine)->stack_p) + + +/* + works as json_skip_level() but also counts items on the current + level skipped. +*/ +int json_skip_level_and_count(json_engine_t *j, int *n_items_skipped) +{ + int level= j->stack_p; + + *n_items_skipped= 0; + while (json_scan_next(j) == 0) + { + if (j->stack_p < level) + return 0; + if (j->stack_p == level && j->state == JST_VALUE) + (*n_items_skipped)++; + } + + return 1; +} + + int json_skip_key(json_engine_t *j) { if (json_read_value(j))
participants (1)
-
holyfoot@askmonty.org