summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRucha Deodhar <rucha.deodhar@mariadb.com>2023-04-03 13:34:51 +0530
committerRucha Deodhar <rucha.deodhar@mariadb.com>2023-05-15 12:17:30 +0530
commit3b34454c9dbc11c0090f323fe2b8ce21d12276a2 (patch)
tree1a1cb37839280477cb38c453e8f085e557b6295d
parent717e3b3cfdb167e8b930323397dc6e852ef94f17 (diff)
downloadmariadb-git-bb-10.9-MDEV-23187.tar.gz
MDEV-23187: Assorted assertion failures in json_find_path with certainbb-10.9-MDEV-2318710.9
collations Analysis: When we have negative index, the value in array_counter[] array is going to be -1 at some point ( because in case of negative index in json path, the initial value for a path with negative index is -<size_of_array>, and as we move forward in array while parsing it and finding path, this value increments). Since SKIPPED_STEP_MARK, is maximum uint value, it gets compared to some int value in the array and eventually equates to -1 and messes with path. Fix: Make SKIPPED_STEP_MARK maximum of INT32.
-rw-r--r--mysql-test/main/func_json.result24
-rw-r--r--mysql-test/main/func_json.test26
-rw-r--r--strings/json_lib.c2
3 files changed, 51 insertions, 1 deletions
diff --git a/mysql-test/main/func_json.result b/mysql-test/main/func_json.result
index 8cbc5305405..5af8e658d34 100644
--- a/mysql-test/main/func_json.result
+++ b/mysql-test/main/func_json.result
@@ -2578,5 +2578,29 @@ SELECT JSON_EXTRACT('{ "my-key": 1 }', '$.my-key');
JSON_EXTRACT('{ "my-key": 1 }', '$.my-key')
1
#
+# MDEV-23187: Assorted assertion failures in json_find_path with certain collations
+#
+SET @save_collation_connection= @@collation_connection;
+SET @json='{ "A": [ [{"k":"v"},[1]],true],"B": {"C": 1} }';
+SELECT JSON_VALUE(@json,'$.A[last-1][last-1].key1');
+JSON_VALUE(@json,'$.A[last-1][last-1].key1')
+NULL
+SET @json='{ "A": [ [{"k":"v"},[1]],true],"B": {"C": 1} }';
+SET collation_connection='ucs2_bin';
+SELECT JSON_VALUE(@json,'$.A[last-1][last-1].key1');
+JSON_VALUE(@json,'$.A[last-1][last-1].key1')
+NULL
+SET @json='{ "A": [ [{"k":"v"},[15]],true],"B": {"C": 1} }';
+SET sql_mode=0,character_set_connection=utf32;
+SELECT JSON_VALUE(@json,'$.A[last-1][last-1].key1');
+JSON_VALUE(@json,'$.A[last-1][last-1].key1')
+NULL
+SET @json='{ "A": [ [{"k":"v"},[15]],true],"B": {"C": 1} }';
+SET sql_mode=0,character_set_connection=utf32;
+SELECT JSON_VALUE(@json,'$.A[last-1][last-1].key1');
+JSON_VALUE(@json,'$.A[last-1][last-1].key1')
+NULL
+SET @@collation_connection= @save_collation_connection;
+#
# End of 10.9 Test
#
diff --git a/mysql-test/main/func_json.test b/mysql-test/main/func_json.test
index 9bf0c9bae05..23a703ca716 100644
--- a/mysql-test/main/func_json.test
+++ b/mysql-test/main/func_json.test
@@ -1773,5 +1773,31 @@ SELECT JSON_EXTRACT('{ "my-key": 1 }', '$."my-key"');
SELECT JSON_EXTRACT('{ "my-key": 1 }', '$.my-key');
--echo #
+--echo # MDEV-23187: Assorted assertion failures in json_find_path with certain collations
+--echo #
+
+
+SET @save_collation_connection= @@collation_connection;
+
+SET @json='{ "A": [ [{"k":"v"},[1]],true],"B": {"C": 1} }';
+SELECT JSON_VALUE(@json,'$.A[last-1][last-1].key1');
+
+SET @json='{ "A": [ [{"k":"v"},[1]],true],"B": {"C": 1} }';
+SET collation_connection='ucs2_bin';
+SELECT JSON_VALUE(@json,'$.A[last-1][last-1].key1');
+
+SET @json='{ "A": [ [{"k":"v"},[15]],true],"B": {"C": 1} }';
+SET sql_mode=0,character_set_connection=utf32;
+SELECT JSON_VALUE(@json,'$.A[last-1][last-1].key1');
+
+
+SET @json='{ "A": [ [{"k":"v"},[15]],true],"B": {"C": 1} }';
+SET sql_mode=0,character_set_connection=utf32;
+SELECT JSON_VALUE(@json,'$.A[last-1][last-1].key1');
+
+SET @@collation_connection= @save_collation_connection;
+
+
+--echo #
--echo # End of 10.9 Test
--echo #
diff --git a/strings/json_lib.c b/strings/json_lib.c
index 903dec978b4..920fb1d4a89 100644
--- a/strings/json_lib.c
+++ b/strings/json_lib.c
@@ -1324,7 +1324,7 @@ int json_skip_key(json_engine_t *j)
}
-#define SKIPPED_STEP_MARK ((int) ~0)
+#define SKIPPED_STEP_MARK INT_MAX32
/*
Current step of the patch matches the JSON construction.