summaryrefslogtreecommitdiff
path: root/sql/item_jsonfunc.cc
diff options
context:
space:
mode:
authorAlexey Botchkov <holyfoot@askmonty.org>2016-12-16 12:32:56 +0400
committerAlexey Botchkov <holyfoot@askmonty.org>2016-12-16 12:32:56 +0400
commite5377be211692e3f2a6f2add24dcb83f316f8154 (patch)
tree4e493d47467cfb3fb353c89a70098a8eecbf258a /sql/item_jsonfunc.cc
parent8938031bc7eb78d406553465341338038cfb2e1a (diff)
downloadmariadb-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.cc5
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;