Skip to content

Commit

Permalink
MDEV-27151: JSON_VALUE() does not parse NULL properties properly
Browse files Browse the repository at this point in the history
Analysis: JSON_VALUE() returns "null" string instead of NULL pointer.
Fix: When the type is JSON_VALUE_NULL (which is also a scalar) set
null_value to true and return 0 instead of returning string.
  • Loading branch information
mariadb-RuchaDeodhar committed Aug 11, 2022
1 parent d7ba72e commit d48428e
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 1 deletion.
27 changes: 27 additions & 0 deletions mysql-test/main/func_json.result
Expand Up @@ -1016,5 +1016,32 @@ j
{"ID": "4", "Name": "Betty", "Age": 19}
drop table t1;
#
# MDEV-27151: JSON_VALUE() does not parse NULL properties properly
#
#
# It is correct for JSON_EXTRACT() to give null instead of "NULL" because
# it returns the json literal that is put inside json.
# Hence it should return null as in 'null' string and not SQL NULL.
# JSON_VALUE() returns the "VALUE" so it is correct for it to return SQl NULL
#
SELECT NULL;
NULL
NULL
SELECT JSON_VALUE('{"nulltest": null}', '$.nulltest');
JSON_VALUE('{"nulltest": null}', '$.nulltest')
NULL
SELECT 1 + NULL;
1 + NULL
NULL
SELECT 1 + JSON_VALUE('{"nulltest": null}', '$.nulltest');
1 + JSON_VALUE('{"nulltest": null}', '$.nulltest')
NULL
SELECT NULL;
NULL
NULL
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
#
19 changes: 19 additions & 0 deletions mysql-test/main/func_json.test
Expand Up @@ -627,6 +627,25 @@ SELECT * FROM t1 WHERE JSON_EXTRACT(j, '$.Age')=19;

drop table t1;

--echo #
--echo # MDEV-27151: JSON_VALUE() does not parse NULL properties properly
--echo #
--echo #
--echo # It is correct for JSON_EXTRACT() to give null instead of "NULL" because
--echo # it returns the json literal that is put inside json.
--echo # Hence it should return null as in 'null' string and not SQL NULL.
--echo # JSON_VALUE() returns the "VALUE" so it is correct for it to return SQl NULL
--echo #

SELECT NULL;
SELECT JSON_VALUE('{"nulltest": null}', '$.nulltest');
SELECT 1 + NULL;
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 #
7 changes: 6 additions & 1 deletion sql/item_jsonfunc.cc
Expand Up @@ -619,6 +619,12 @@ String *Item_func_json_value::val_str(String *str)
if (json_read_value(&je))
goto err_return;

if (je.value_type == JSON_VALUE_NULL)
{
null_value= 1;
return NULL;
}

if (unlikely(check_and_get_value(&je, str, &error)))
{
if (error)
Expand Down Expand Up @@ -1111,7 +1117,6 @@ my_decimal *Item_func_json_extract::val_decimal(my_decimal *to)
case JSON_VALUE_OBJECT:
case JSON_VALUE_ARRAY:
case JSON_VALUE_FALSE:
// TODO: fix: NULL should be NULL
case JSON_VALUE_NULL:
int2my_decimal(E_DEC_FATAL_ERROR, 0, false/*unsigned_flag*/, to);
return to;
Expand Down

0 comments on commit d48428e

Please sign in to comment.