mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-17121 JSON_ARRAY_APPEND.
Extra comma added to the result when an json array is empty.
This commit is contained in:
@ -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)
|
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
|
#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');
|
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')
|
JSON_SET('{}', '$.a', _utf8 X'C3B6', '$.x', 1, '$.b', _utf8 X'C3B6')
|
||||||
{"a": "<22>", "x": 1, "b": "<22>"}
|
{"a": "<22>", "x": 1, "b": "<22>"}
|
||||||
|
#
|
||||||
|
# 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 0xC3B6, '$.b', _utf8 0xC3B6);
|
||||||
SELECT JSON_SET('{}', '$.a', _utf8 X'C3B6', '$.x', 1, '$.b', _utf8 X'C3B6');
|
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,12 +1621,14 @@ String *Item_func_json_array_append::val_str(String *str)
|
|||||||
|
|
||||||
if (je.value_type == JSON_VALUE_ARRAY)
|
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;
|
goto js_error;
|
||||||
|
|
||||||
ar_end= je.s.c_str - je.sav_c_len;
|
ar_end= je.s.c_str - je.sav_c_len;
|
||||||
str_rest_len= js->length() - (ar_end - (const uchar *) js->ptr());
|
str_rest_len= js->length() - (ar_end - (const uchar *) js->ptr());
|
||||||
str->q_append(js->ptr(), ar_end-(const uchar *) js->ptr());
|
str->q_append(js->ptr(), ar_end-(const uchar *) js->ptr());
|
||||||
|
if (n_items)
|
||||||
str->append(", ", 2);
|
str->append(", ", 2);
|
||||||
if (append_json_value(str, args[n_arg+1], &tmp_val))
|
if (append_json_value(str, args[n_arg+1], &tmp_val))
|
||||||
goto return_null; /* Out of memory. */
|
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)
|
int json_skip_key(json_engine_t *j)
|
||||||
{
|
{
|
||||||
if (json_read_value(j))
|
if (json_read_value(j))
|
||||||
|
Reference in New Issue
Block a user