Skip to content
Permalink
Browse files
MDEV-17121 JSON_ARRAY_APPEND.
Extra comma added to the result when an json array is empty.
  • Loading branch information
Alexey Botchkov committed Sep 11, 2018
1 parent 4d9ec7c commit c8bb43a
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 2 deletions.
@@ -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

/*
@@ -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"]
@@ -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');

@@ -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. */

@@ -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))

0 comments on commit c8bb43a

Please sign in to comment.