diff options
author | Rucha Deodhar <rucha.deodhar@mariadb.com> | 2023-04-03 13:34:51 +0530 |
---|---|---|
committer | Rucha Deodhar <rucha.deodhar@mariadb.com> | 2023-05-15 12:17:30 +0530 |
commit | 3b34454c9dbc11c0090f323fe2b8ce21d12276a2 (patch) | |
tree | 1a1cb37839280477cb38c453e8f085e557b6295d | |
parent | 717e3b3cfdb167e8b930323397dc6e852ef94f17 (diff) | |
download | mariadb-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.result | 24 | ||||
-rw-r--r-- | mysql-test/main/func_json.test | 26 | ||||
-rw-r--r-- | strings/json_lib.c | 2 |
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. |