Commit 4d10273b authored by Alexey Botchkov's avatar Alexey Botchkov

MDEV-11571 JSON_EXTRACT returns wrong results.

        Array counter didn't increment after an item was found.
parent bbb3fb31
...@@ -209,6 +209,9 @@ json_extract('[10, 20, [{"a":3}, 30, 40]]', '$[2][*]') ...@@ -209,6 +209,9 @@ json_extract('[10, 20, [{"a":3}, 30, 40]]', '$[2][*]')
select json_extract('1', '$'); select json_extract('1', '$');
json_extract('1', '$') json_extract('1', '$')
1 1
select json_extract('[10, 20, [30, 40], 1, 10]', '$[1]');
json_extract('[10, 20, [30, 40], 1, 10]', '$[1]')
20
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]}', '$.b.k1', 'word');
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]} {"a":1, "b":{"c":1, "k1":"word"}, "d":[1, 2]}
......
...@@ -77,6 +77,7 @@ select json_extract(json_object('foo', 'foobar'),'$'); ...@@ -77,6 +77,7 @@ select json_extract(json_object('foo', 'foobar'),'$');
select json_extract('[10, 20, [30, 40]]', '$[2][*]'); select json_extract('[10, 20, [30, 40]]', '$[2][*]');
select json_extract('[10, 20, [{"a":3}, 30, 40]]', '$[2][*]'); select json_extract('[10, 20, [{"a":3}, 30, 40]]', '$[2][*]');
select json_extract('1', '$'); select json_extract('1', '$');
select json_extract('[10, 20, [30, 40], 1, 10]', '$[1]');
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]}', '$.b.k1', 'word');
select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.d[3]', 3); select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.d[3]', 3);
......
...@@ -1270,7 +1270,7 @@ int json_find_path(json_engine_t *je, ...@@ -1270,7 +1270,7 @@ int json_find_path(json_engine_t *je,
case JST_VALUE: case JST_VALUE:
DBUG_ASSERT(cur_step->type & JSON_PATH_ARRAY); DBUG_ASSERT(cur_step->type & JSON_PATH_ARRAY);
if (cur_step->type & JSON_PATH_WILD || if (cur_step->type & JSON_PATH_WILD ||
cur_step->n_item == array_counters[cur_step - p->steps]) cur_step->n_item == array_counters[cur_step - p->steps]++)
{ {
/* Array item matches. */ /* Array item matches. */
if (cur_step == p->last_step || if (cur_step == p->last_step ||
...@@ -1278,10 +1278,7 @@ int json_find_path(json_engine_t *je, ...@@ -1278,10 +1278,7 @@ int json_find_path(json_engine_t *je,
goto exit; goto exit;
} }
else else
{
json_skip_array_item(je); json_skip_array_item(je);
array_counters[cur_step - p->steps]++;
}
break; break;
case JST_OBJ_END: case JST_OBJ_END:
case JST_ARRAY_END: case JST_ARRAY_END:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment