Skip to content

Commit 96891de

Browse files
committed
Bug#21381806: JSON: ASSERTION FAILED: ARG->NULL_VALUE
The failing assertion asserts that null_value is true if the field type of an item is MYSQL_TYPE_NULL. This happens before a val_* function has been called on the item, and null_value is not necessarily updated until one of the val_* functions is called. This patch calls update_null_value() on the item to make sure that null_value is up to date before we try to use it.
1 parent 6093255 commit 96891de

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

mysql-test/r/json.result

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12728,3 +12728,15 @@ SELECT JSON_VALID(REPEAT('{"a":[', 100000));
1272812728
ERROR 22032: The JSON document exceeds the maximum depth.
1272912729
SELECT JSON_VALID(REPEAT('[{"a":', 100000));
1273012730
ERROR 22032: The JSON document exceeds the maximum depth.
12731+
#
12732+
# Bug#21381806 JSON: ASSERTION FAILED: ARG->NULL_VALUE
12733+
#
12734+
SELECT JSON_SET(CASE WHEN 1 THEN NULL ELSE NULL END, '{}', '{}');
12735+
JSON_SET(CASE WHEN 1 THEN NULL ELSE NULL END, '{}', '{}')
12736+
NULL
12737+
SELECT JSON_VALID(CASE WHEN 1 THEN NULL ELSE NULL END);
12738+
JSON_VALID(CASE WHEN 1 THEN NULL ELSE NULL END)
12739+
NULL
12740+
SELECT JSON_ARRAY(CASE WHEN 1 THEN NULL ELSE NULL END);
12741+
JSON_ARRAY(CASE WHEN 1 THEN NULL ELSE NULL END)
12742+
[null]

mysql-test/t/json.test

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5714,6 +5714,13 @@ SELECT JSON_VALID(REPEAT('{"a":[', 100000));
57145714
--error ER_JSON_DOCUMENT_TOO_DEEP
57155715
SELECT JSON_VALID(REPEAT('[{"a":', 100000));
57165716

5717+
--echo #
5718+
--echo # Bug#21381806 JSON: ASSERTION FAILED: ARG->NULL_VALUE
5719+
--echo #
5720+
SELECT JSON_SET(CASE WHEN 1 THEN NULL ELSE NULL END, '{}', '{}');
5721+
SELECT JSON_VALID(CASE WHEN 1 THEN NULL ELSE NULL END);
5722+
SELECT JSON_ARRAY(CASE WHEN 1 THEN NULL ELSE NULL END);
5723+
57175724
# Local Variables:
57185725
# mode: sql
57195726
# sql-product: mysql

sql/item_json_func.cc

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ static bool json_is_valid(Item **args,
260260
switch (get_normalized_field_type(arg_item))
261261
{
262262
case MYSQL_TYPE_NULL:
263+
arg_item->update_null_value();
263264
DBUG_ASSERT(arg_item->null_value);
264265
return true;
265266
case MYSQL_TYPE_JSON:
@@ -1007,6 +1008,7 @@ bool json_value(Item **args, uint arg_idx, Json_wrapper *result)
10071008

10081009
if (arg->field_type() == MYSQL_TYPE_NULL)
10091010
{
1011+
arg->update_null_value();
10101012
DBUG_ASSERT(arg->null_value);
10111013
return false;
10121014
}
@@ -1533,9 +1535,16 @@ bool val_json_func_field_subselect(Item* arg,
15331535
my_error(ER_NOT_SUPPORTED_YET, MYF(0), "old decimal type");
15341536
return true;
15351537

1536-
case MYSQL_TYPE_NULL: // possible?
1538+
case MYSQL_TYPE_NULL:
1539+
/*
1540+
This shouldn't happen, since the only caller of this function
1541+
returns earlier if it sees that the type is MYSQL_TYPE_NULL.
1542+
*/
1543+
/* purecov: begin inspected */
1544+
arg->update_null_value();
15371545
DBUG_ASSERT(arg->null_value);
15381546
return false;
1547+
/* purecov: end */
15391548

15401549
case MYSQL_TYPE_JSON:
15411550
DBUG_ABORT(); /* purecov: inspected */

0 commit comments

Comments
 (0)