mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
MDEV-27151: JSON_VALUE() does not parse NULL properties properly
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.
This commit is contained in:
@ -1016,5 +1016,32 @@ j
|
|||||||
{"ID": "4", "Name": "Betty", "Age": 19}
|
{"ID": "4", "Name": "Betty", "Age": 19}
|
||||||
drop table t1;
|
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
|
# End of 10.3 tests
|
||||||
#
|
#
|
||||||
|
@ -627,6 +627,25 @@ SELECT * FROM t1 WHERE JSON_EXTRACT(j, '$.Age')=19;
|
|||||||
|
|
||||||
drop table t1;
|
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 #
|
||||||
--echo # End of 10.3 tests
|
--echo # End of 10.3 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -619,6 +619,12 @@ continue_search:
|
|||||||
if (json_read_value(&je))
|
if (json_read_value(&je))
|
||||||
goto err_return;
|
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 (unlikely(check_and_get_value(&je, str, &error)))
|
||||||
{
|
{
|
||||||
if (error)
|
if (error)
|
||||||
@ -1111,7 +1117,6 @@ my_decimal *Item_func_json_extract::val_decimal(my_decimal *to)
|
|||||||
case JSON_VALUE_OBJECT:
|
case JSON_VALUE_OBJECT:
|
||||||
case JSON_VALUE_ARRAY:
|
case JSON_VALUE_ARRAY:
|
||||||
case JSON_VALUE_FALSE:
|
case JSON_VALUE_FALSE:
|
||||||
// TODO: fix: NULL should be NULL
|
|
||||||
case JSON_VALUE_NULL:
|
case JSON_VALUE_NULL:
|
||||||
int2my_decimal(E_DEC_FATAL_ERROR, 0, false/*unsigned_flag*/, to);
|
int2my_decimal(E_DEC_FATAL_ERROR, 0, false/*unsigned_flag*/, to);
|
||||||
return to;
|
return to;
|
||||||
|
Reference in New Issue
Block a user