summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRucha Deodhar <rucha.deodhar@mariadb.com>2023-03-03 13:50:46 +0530
committerRucha Deodhar <rucha.deodhar@mariadb.com>2023-04-26 11:00:09 +0530
commit4b67ff3b256a78994cb23dc4aa2ba531bbb06070 (patch)
treec2657db62d2677d65689f3dc8b9b02b53817d849
parent2c4c7c8b02140ff3abb8325f6261ccf1ae18b477 (diff)
downloadmariadb-git-4b67ff3b256a78994cb23dc4aa2ba531bbb06070.tar.gz
MDEV-30705: JSON_SCHEMA_VALID: schema with multipleOf for big value
always return 1 Analysis: Implementation used double to store value. longlong is better choice Fix: Use longlong for multiple_of and the value to store it and num_flag to check for decimals.
-rw-r--r--mysql-test/main/func_json.result15
-rw-r--r--mysql-test/main/func_json.test11
-rw-r--r--sql/json_schema.cc23
-rw-r--r--sql/json_schema.h3
4 files changed, 44 insertions, 8 deletions
diff --git a/mysql-test/main/func_json.result b/mysql-test/main/func_json.result
index 11eb3a5aefb..ec70e8b47bf 100644
--- a/mysql-test/main/func_json.result
+++ b/mysql-test/main/func_json.result
@@ -4634,4 +4634,19 @@ ERROR HY000: Invalid value for keyword maxLength
SET @schema= '{ "items" : ["str1"]}';
SELECT JSON_SCHEMA_VALID(@schema, '[]');
ERROR HY000: Invalid value for keyword items
+#
+# MDEV-30705: JSON_SCHEMA_VALID: schema with multipleOf for big value always return 1
+#
+SET @schema = '{
+ "multipleOf": 2
+ }';
+SELECT JSON_SCHEMA_VALID(@schema, '9007900000000001');
+JSON_SCHEMA_VALID(@schema, '9007900000000001')
+0
+SELECT JSON_SCHEMA_VALID(@schema, '9007900000000060');
+JSON_SCHEMA_VALID(@schema, '9007900000000060')
+1
+SELECT JSON_SCHEMA_VALID(@schema, '9007900000000061');
+JSON_SCHEMA_VALID(@schema, '9007900000000061')
+0
# End of 11.1 test
diff --git a/mysql-test/main/func_json.test b/mysql-test/main/func_json.test
index 3d9a8e3116b..d5631c1578c 100644
--- a/mysql-test/main/func_json.test
+++ b/mysql-test/main/func_json.test
@@ -3533,4 +3533,15 @@ SET @schema= '{ "items" : ["str1"]}';
SELECT JSON_SCHEMA_VALID(@schema, '[]');
+--echo #
+--echo # MDEV-30705: JSON_SCHEMA_VALID: schema with multipleOf for big value always return 1
+--echo #
+SET @schema = '{
+ "multipleOf": 2
+ }';
+SELECT JSON_SCHEMA_VALID(@schema, '9007900000000001');
+SELECT JSON_SCHEMA_VALID(@schema, '9007900000000060');
+SELECT JSON_SCHEMA_VALID(@schema, '9007900000000061');
+
+
--echo # End of 11.1 test
diff --git a/sql/json_schema.cc b/sql/json_schema.cc
index 7956ae49fff..c49a11633af 100644
--- a/sql/json_schema.cc
+++ b/sql/json_schema.cc
@@ -771,13 +771,25 @@ bool Json_schema_multiple_of::validate(const json_engine_t *je,
if (je->value_type != JSON_VALUE_NUMBER)
return false;
+ if (je->num_flags & JSON_NUM_FRAC_PART)
+ return true;
+<<<<<<< HEAD
double val= je->s.cs->strntod((char *) je->value,
je->value_len, &end, &err);
double temp= val / multiple_of;
bool res= (temp - (long long int)temp) == 0;
+||||||| parent of 628ce9d4f44... MDEV-30705: JSON_SCHEMA_VALID: schema with multipleOf for big value
+ double val= je->s.cs->strntod((char *) je->value,
+ je->value_len, &end, &err);
+ double temp= val / this->value;
+ bool res= (temp - (long long int)temp) == 0;
+=======
+ longlong val= je->s.cs->strntoll((char *) je->value,
+ je->value_len, 10, &end, &err);
+>>>>>>> 628ce9d4f44... MDEV-30705: JSON_SCHEMA_VALID: schema with multipleOf for big value
- return !res;
+ return val % multiple_of;
}
bool Json_schema_multiple_of::handle_keyword(THD *thd, json_engine_t *je,
@@ -789,19 +801,16 @@ bool Json_schema_multiple_of::handle_keyword(THD *thd, json_engine_t *je,
int err= 0;
char *end;
- if (je->value_type != JSON_VALUE_NUMBER)
+ if (je->value_type != JSON_VALUE_NUMBER || (je->num_flags & JSON_NUM_FRAC_PART))
{
my_error(ER_JSON_INVALID_VALUE_FOR_KEYWORD, MYF(0), "multipleOf");
return true;
}
- double val= je->s.cs->strntod((char *) je->value,
- je->value_len, &end, &err);
+ longlong val= je->s.cs->strntoll((char *) je->value,
+ je->value_len, 10, &end, &err);
if (val <= 0)
- {
my_error(ER_JSON_INVALID_VALUE_FOR_KEYWORD, MYF(0), "multipleOf");
- return true;
- }
multiple_of= val;
return false;
diff --git a/sql/json_schema.h b/sql/json_schema.h
index 53b6aaaff9f..fd5f55f5fdc 100644
--- a/sql/json_schema.h
+++ b/sql/json_schema.h
@@ -228,7 +228,8 @@ class Json_schema_minimum : public Json_schema_keyword
class Json_schema_multiple_of : public Json_schema_keyword
{
private:
- double multiple_of;
+ longlong multiple_of;
+
public:
bool validate(const json_engine_t *je, const uchar *k_start= NULL,
const uchar *k_end= NULL) override;