mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
MDEV-17001 JSON_MERGE returns nullwhen merging empty array.
Don't add the comma if nothing appended to the array.
This commit is contained in:
@ -804,3 +804,9 @@ SELECT JSON_SEARCH(@`json`, 'one', @`value`);
|
|||||||
JSON_SEARCH(@`json`, 'one', @`value`)
|
JSON_SEARCH(@`json`, 'one', @`value`)
|
||||||
"$[2].C"
|
"$[2].C"
|
||||||
SET @`json` := NULL, @`value` := NULL;
|
SET @`json` := NULL, @`value` := NULL;
|
||||||
|
#
|
||||||
|
# MDEV-17001 JSON_MERGE returns nullwhen merging empty array.
|
||||||
|
#
|
||||||
|
SELECT JSON_MERGE('[1]', '[]');
|
||||||
|
JSON_MERGE('[1]', '[]')
|
||||||
|
[1]
|
||||||
|
@ -463,3 +463,8 @@ SET @`json` := '["A", [{"B": "1"}], {"C": "AB"}, {"D": "BC"}]', @`value` := 'AB'
|
|||||||
SELECT JSON_SEARCH(@`json`, 'one', @`value`);
|
SELECT JSON_SEARCH(@`json`, 'one', @`value`);
|
||||||
SET @`json` := NULL, @`value` := NULL;
|
SET @`json` := NULL, @`value` := NULL;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-17001 JSON_MERGE returns nullwhen merging empty array.
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SELECT JSON_MERGE('[1]', '[]');
|
||||||
|
@ -2020,23 +2020,14 @@ continue_j2:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
const uchar *end1, *beg1, *end2, *beg2;
|
const uchar *end1, *beg1, *end2, *beg2;
|
||||||
int empty_array= 0;
|
int n_items1=1, n_items2= 1;
|
||||||
|
|
||||||
beg1= je1->value_begin;
|
beg1= je1->value_begin;
|
||||||
|
|
||||||
/* Merge as a single array. */
|
/* Merge as a single array. */
|
||||||
if (je1->value_type == JSON_VALUE_ARRAY)
|
if (je1->value_type == JSON_VALUE_ARRAY)
|
||||||
{
|
{
|
||||||
int cur_level= je1->stack_p;
|
if (json_skip_level_and_count(je1, &n_items1))
|
||||||
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;
|
return 1;
|
||||||
|
|
||||||
end1= je1->s.c_str - je1->sav_c_len;
|
end1= je1->s.c_str - je1->sav_c_len;
|
||||||
@ -2055,8 +2046,7 @@ continue_j2:
|
|||||||
end1= je1->value_end;
|
end1= je1->value_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str->append((const char*) beg1, end1 - beg1) ||
|
if (str->append((const char*) beg1, end1 - beg1))
|
||||||
(!empty_array && str->append(", ", 2)))
|
|
||||||
return 3;
|
return 3;
|
||||||
|
|
||||||
if (json_value_scalar(je2))
|
if (json_value_scalar(je2))
|
||||||
@ -2067,15 +2057,22 @@ continue_j2:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (je2->value_type == JSON_VALUE_OBJECT)
|
if (je2->value_type == JSON_VALUE_OBJECT)
|
||||||
|
{
|
||||||
beg2= je2->value_begin;
|
beg2= je2->value_begin;
|
||||||
else
|
|
||||||
beg2= je2->s.c_str;
|
|
||||||
if (json_skip_level(je2))
|
if (json_skip_level(je2))
|
||||||
return 2;
|
return 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
beg2= je2->s.c_str;
|
||||||
|
if (json_skip_level_and_count(je2, &n_items2))
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
end2= je2->s.c_str;
|
end2= je2->s.c_str;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str->append((const char*) beg2, end2 - beg2))
|
if ((n_items1 && n_items2 && str->append(", ", 2)) ||
|
||||||
|
str->append((const char*) beg2, end2 - beg2))
|
||||||
return 3;
|
return 3;
|
||||||
|
|
||||||
if (je2->value_type != JSON_VALUE_ARRAY &&
|
if (je2->value_type != JSON_VALUE_ARRAY &&
|
||||||
|
@ -1197,10 +1197,6 @@ 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
|
works as json_skip_level() but also counts items on the current
|
||||||
level skipped.
|
level skipped.
|
||||||
|
Reference in New Issue
Block a user