Skip to content

Commit

Permalink
MDEV-11467 JSON_EXTRACT returns incorrect results.
Browse files Browse the repository at this point in the history
        Item_func_json_extract::val_str fixed.
  • Loading branch information
Alexey Botchkov committed Dec 5, 2016
1 parent 2b01461 commit 1da0865
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 37 deletions.
6 changes: 6 additions & 0 deletions mysql-test/r/func_json.result
Original file line number Diff line number Diff line change
Expand Up @@ -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]}
Expand Down
2 changes: 2 additions & 0 deletions mysql-test/t/func_json.test
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
74 changes: 37 additions & 37 deletions sql/item_jsonfunc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -461,52 +461,52 @@ 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)
if (json_read_value(&je))
goto error;

continue;
}

if (json_read_value(&je))
goto error;
value= je.value_begin;
if (json_value_scalar(&je))
v_len= je.value_end - value;
else
{
if (json_skip_level(&je))
goto error;
v_len= je.s.c_str - value;
}

value= je.value_begin;
if (json_value_scalar(&je))
v_len= je.value_end - value;
else
{
if (json_skip_level(&je))
if (json_scan_next(&je) && je.s.error)
goto error;
v_len= je.s.c_str - value;
}

if (!multiple_values_found)
{
if (first_value == NULL)
{
/*
Just remember the first value as we don't know yet
if we need to create an array out of it or not.
*/
first_value= (const char *) value;
first_len= v_len;
continue;
}
else
if (!multiple_values_found)
{
multiple_values_found= TRUE; /* We have to make an JSON array. */
if (str->append("[", 1) ||
str->append(first_value, first_len))
goto error; /* Out of memory. */
}
if (first_value == NULL)
{
/*
Just remember the first value as we don't know yet
if we need to create an array out of it or not.
*/
first_value= (const char *) value;
first_len= v_len;
continue;
}
else
{
multiple_values_found= TRUE; /* We have to make an JSON array. */
if (str->append("[", 1) ||
str->append(first_value, first_len))
goto error; /* Out of memory. */
}

}
if (str->append(", ", 2) ||
str->append((const char *) value, v_len))
goto error; /* Out of memory. */
}
if (str->append(", ", 2) ||
str->append((const char *) value, v_len))
goto error; /* Out of memory. */

if (je.s.error)
goto error;
}

if (first_value == NULL)
Expand Down

0 comments on commit 1da0865

Please sign in to comment.