diff options
author | Alexey Botchkov <holyfoot@askmonty.org> | 2016-12-16 12:32:56 +0400 |
---|---|---|
committer | Alexey Botchkov <holyfoot@askmonty.org> | 2016-12-16 12:32:56 +0400 |
commit | e5377be211692e3f2a6f2add24dcb83f316f8154 (patch) | |
tree | 4e493d47467cfb3fb353c89a70098a8eecbf258a /sql/item_jsonfunc.cc | |
parent | 8938031bc7eb78d406553465341338038cfb2e1a (diff) | |
download | mariadb-git-e5377be211692e3f2a6f2add24dcb83f316f8154.tar.gz |
MDEV-11562 Assertion `js->state == JST_VALUE' failed in check_contains(json_engine_t*, json_engine_t*).
check_contains() fixed. When an item of an array is a complex
structure, it can be half-read after the end of the recursive
check_contains() call. So we just manually get to it's ending.
Diffstat (limited to 'sql/item_jsonfunc.cc')
-rw-r--r-- | sql/item_jsonfunc.cc | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc index 7bf2283dd53..9535feb0d8e 100644 --- a/sql/item_jsonfunc.cc +++ b/sql/item_jsonfunc.cc @@ -796,17 +796,20 @@ static int check_contains(json_engine_t *js, json_engine_t *value) { while (json_scan_next(js) == 0 && js->state != JST_ARRAY_END) { + json_level_t c_level; DBUG_ASSERT(js->state == JST_VALUE); if (json_read_value(js)) return FALSE; + c_level= json_value_scalar(js) ? NULL : json_get_level(js); if (check_contains(js, value)) { if (json_skip_level(js)) return FALSE; return TRUE; } - if (value->s.error || js->s.error) + if (value->s.error || js->s.error || + (c_level && json_skip_to_level(js, c_level))) return FALSE; } return FALSE; |