1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-11467 JSON_EXTRACT returns incorrect results.

Item_func_json_extract::val_str fixed.
This commit is contained in:
Alexey Botchkov
2016-12-05 09:34:28 +04:00
parent 2b01461629
commit 1da0865058
3 changed files with 46 additions and 38 deletions

View File

@ -132,6 +132,12 @@ json_extract('{"key0":true, "key1":"qwe"}', "$.key1")
select json_extract(json_object('foo', 'foobar'),'$');
json_extract(json_object('foo', 'foobar'),'$')
{"foo": "foobar"}
select json_extract('[10, 20, [30, 40]]', '$[2][*]');
json_extract('[10, 20, [30, 40]]', '$[2][*]')
[30, 40]
select json_extract('[10, 20, [{"a":3}, 30, 40]]', '$[2][*]');
json_extract('[10, 20, [{"a":3}, 30, 40]]', '$[2][*]')
[{"a":3}, 30, 40]
select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.b.k1', 'word');
json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.b.k1', 'word')
{"a":1, "b":{"c":1, "k1":"word"}, "d":[1, 2]}

View File

@ -52,6 +52,8 @@ select json_extract('{"key1":"asd", "key2":[2,3]}', "$.key1", "$.key2");
select json_extract('{"key1":5, "key2":[2,3]}', "$.key1", "$.key2");
select json_extract('{"key0":true, "key1":"qwe"}', "$.key1");
select json_extract(json_object('foo', 'foobar'),'$');
select json_extract('[10, 20, [30, 40]]', '$[2][*]');
select json_extract('[10, 20, [{"a":3}, 30, 40]]', '$[2][*]');
select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.b.k1', 'word');
select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.d[3]', 3);

View File

@ -461,15 +461,8 @@ String *Item_func_json_extract::val_str(String *str)
c_path->cur_step= c_path->p.steps;
if (json_find_path(&je, &c_path->p, &c_path->cur_step, array_counters))
while (!json_find_path(&je, &c_path->p, &c_path->cur_step, array_counters))
{
/* Path wasn't found. */
if (je.s.error)
goto error;
continue;
}
if (json_read_value(&je))
goto error;
@ -483,6 +476,9 @@ String *Item_func_json_extract::val_str(String *str)
v_len= je.s.c_str - value;
}
if (json_scan_next(&je) && je.s.error)
goto error;
if (!multiple_values_found)
{
if (first_value == NULL)
@ -509,6 +505,10 @@ String *Item_func_json_extract::val_str(String *str)
goto error; /* Out of memory. */
}
if (je.s.error)
goto error;
}
if (first_value == NULL)
{
/* Nothing was found. */