summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRucha Deodhar <rucha.deodhar@mariadb.com>2023-04-13 16:43:30 +0530
committerRucha Deodhar <rucha.deodhar@mariadb.com>2023-05-16 01:52:16 +0530
commitb7b8a9ee439f8d3c9457a6eb480001cae37307b8 (patch)
treeb3c7ef87c18ea0d445b27a33520a663d72f77095
parent996b040f9384cf03e814182053b12945d3df5732 (diff)
downloadmariadb-git-bb-10.4-MDEV-23187.tar.gz
MDEV-23187: Assorted assertion failures in json_find_path with certainbb-10.4-MDEV-23187
collations Fix by Alexey Botchkov The 'value_len' is calculated wrong for the multibyte charsets. In the read_strn() function we get the length of the string with the final ' " ' character. So have to subtract it's length from the value_len. And the length of '1' isn't correct for the ucs2 charset (must be 2).
-rw-r--r--include/json_lib.h3
-rw-r--r--mysql-test/main/func_json.result8
-rw-r--r--mysql-test/main/func_json.test11
-rw-r--r--strings/json_lib.c2
4 files changed, 14 insertions, 10 deletions
diff --git a/include/json_lib.h b/include/json_lib.h
index 2ec3e9de8f8..71e5d578855 100644
--- a/include/json_lib.h
+++ b/include/json_lib.h
@@ -35,6 +35,7 @@ typedef struct st_json_string_t
const uchar *c_str; /* Current position in JSON string */
const uchar *str_end; /* The end on the string. */
my_wc_t c_next; /* UNICODE of the last read character */
+ int c_next_len; /* character lenght of the last read character. */
int error; /* error code. */
CHARSET_INFO *cs; /* Character set of the JSON string. */
@@ -48,7 +49,7 @@ void json_string_set_cs(json_string_t *s, CHARSET_INFO *i_cs);
void json_string_set_str(json_string_t *s,
const uchar *str, const uchar *end);
#define json_next_char(j) \
- (j)->wc((j)->cs, &(j)->c_next, (j)->c_str, (j)->str_end)
+ ((j)->c_next_len= (j)->wc((j)->cs, &(j)->c_next, (j)->c_str, (j)->str_end))
#define json_eos(j) ((j)->c_str >= (j)->str_end)
/*
read_string_const_chr() reads the next character of the string constant
diff --git a/mysql-test/main/func_json.result b/mysql-test/main/func_json.result
index 415e367f455..ed719e7b453 100644
--- a/mysql-test/main/func_json.result
+++ b/mysql-test/main/func_json.result
@@ -1043,9 +1043,6 @@ SELECT JSON_EXTRACT('{"a":null, "b":10, "c":"null"}', '$.a');
JSON_EXTRACT('{"a":null, "b":10, "c":"null"}', '$.a')
null
#
-# End of 10.3 tests
-#
-#
# Start of 10.4 tests
#
#
@@ -1295,6 +1292,11 @@ SELECT JSON_LENGTH('{"a":"b"}','$','$', 'foo');
ERROR 42000: Incorrect parameter count in the call to native function 'json_length'
SELECT JSON_LENGTH();
ERROR 42000: Incorrect parameter count in the call to native function 'JSON_LENGTH'
+# MDEV-23187: Assorted assertion failures in json_find_path with certain collations
+SET COLLATION_CONNECTION= ucs2_unicode_ci;
+SELECT JSON_VALUE('["foo"]', '$**[0]') AS f;
+f
+foo
#
# End of 10.4 tests
#
diff --git a/mysql-test/main/func_json.test b/mysql-test/main/func_json.test
index 56d90e93936..9cfde5489e7 100644
--- a/mysql-test/main/func_json.test
+++ b/mysql-test/main/func_json.test
@@ -665,11 +665,6 @@ SELECT 1 + JSON_VALUE('{"nulltest": null}', '$.nulltest');
SELECT NULL;
SELECT JSON_EXTRACT('{"a":null, "b":10, "c":"null"}', '$.a');
-
---echo #
---echo # End of 10.3 tests
---echo #
-
--echo #
--echo # Start of 10.4 tests
--echo #
@@ -825,6 +820,12 @@ SELECT JSON_LENGTH('{"a":"b"}','$','$', 'foo');
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
SELECT JSON_LENGTH();
+--echo # MDEV-23187: Assorted assertion failures in json_find_path with certain collations
+
+
+SET COLLATION_CONNECTION= ucs2_unicode_ci;
+SELECT JSON_VALUE('["foo"]', '$**[0]') AS f;
+
--echo #
--echo # End of 10.4 tests
--echo #
diff --git a/strings/json_lib.c b/strings/json_lib.c
index 5c7747617e9..781172f0340 100644
--- a/strings/json_lib.c
+++ b/strings/json_lib.c
@@ -401,7 +401,7 @@ static int read_strn(json_engine_t *j)
return 1;
j->state= j->stack[j->stack_p];
- j->value_len= (int)(j->s.c_str - j->value) - 1;
+ j->value_len= (int)(j->s.c_str - j->value) - j->s.c_next_len;
return 0;
}