Skip to content

Commit 648a88c

Browse files
committed
Bug#21383497: DBUG_ABORT() IN VAL_JSON
Item_func_rollup_const does not override val_json(), and attempts to call it will end up using Item::val_json(), which always raises an error. This patch makes Item_func_rollup_const override val_json() and read the JSON value from its nested item.
1 parent 96891de commit 648a88c

File tree

4 files changed

+73
-0
lines changed

4 files changed

+73
-0
lines changed

mysql-test/r/json.result

+46
Original file line numberDiff line numberDiff line change
@@ -12740,3 +12740,49 @@ NULL
1274012740
SELECT JSON_ARRAY(CASE WHEN 1 THEN NULL ELSE NULL END);
1274112741
JSON_ARRAY(CASE WHEN 1 THEN NULL ELSE NULL END)
1274212742
[null]
12743+
#
12744+
# Bug#21383497 DBUG_ABORT() IN VAL_JSON
12745+
#
12746+
CREATE TABLE t(a INT PRIMARY KEY);
12747+
INSERT INTO t VALUES (1), (2), (3), (4), (5);
12748+
SELECT 1 FROM t GROUP BY ST_ASGEOJSON(POINT(1, 1)) WITH ROLLUP;
12749+
1
12750+
1
12751+
1
12752+
Warnings:
12753+
Warning 1235 This version of MySQL doesn't yet support 'sorting of non-scalar JSON values'
12754+
SELECT JSON_EXTRACT('{"a":1}', '$.a') AS je, COUNT(DISTINCT a)
12755+
FROM t GROUP BY je WITH ROLLUP;
12756+
je COUNT(DISTINCT a)
12757+
1 5
12758+
NULL 5
12759+
SELECT JSON_EXTRACT(NULL, '$.a') AS je, COUNT(DISTINCT a)
12760+
FROM t GROUP BY je WITH ROLLUP;
12761+
je COUNT(DISTINCT a)
12762+
NULL 5
12763+
NULL 5
12764+
SELECT JSON_EXTRACT('{"a":1}', '$.a') AS je, a, COUNT(DISTINCT a)
12765+
FROM t GROUP BY je, a WITH ROLLUP;
12766+
je a COUNT(DISTINCT a)
12767+
1 1 1
12768+
1 2 1
12769+
1 3 1
12770+
1 4 1
12771+
1 5 1
12772+
1 NULL 5
12773+
NULL NULL 5
12774+
SELECT JSON_EXTRACT('{"a":1}', '$.a') AS je, a, COUNT(DISTINCT a)
12775+
FROM t GROUP BY a, je WITH ROLLUP;
12776+
je a COUNT(DISTINCT a)
12777+
1 1 1
12778+
NULL 1 1
12779+
1 2 1
12780+
NULL 2 1
12781+
1 3 1
12782+
NULL 3 1
12783+
1 4 1
12784+
NULL 4 1
12785+
1 5 1
12786+
NULL 5 1
12787+
NULL NULL 5
12788+
DROP TABLE t;

mysql-test/t/json.test

+16
Original file line numberDiff line numberDiff line change
@@ -5721,6 +5721,22 @@ SELECT JSON_SET(CASE WHEN 1 THEN NULL ELSE NULL END, '{}', '{}');
57215721
SELECT JSON_VALID(CASE WHEN 1 THEN NULL ELSE NULL END);
57225722
SELECT JSON_ARRAY(CASE WHEN 1 THEN NULL ELSE NULL END);
57235723

5724+
--echo #
5725+
--echo # Bug#21383497 DBUG_ABORT() IN VAL_JSON
5726+
--echo #
5727+
CREATE TABLE t(a INT PRIMARY KEY);
5728+
INSERT INTO t VALUES (1), (2), (3), (4), (5);
5729+
SELECT 1 FROM t GROUP BY ST_ASGEOJSON(POINT(1, 1)) WITH ROLLUP;
5730+
SELECT JSON_EXTRACT('{"a":1}', '$.a') AS je, COUNT(DISTINCT a)
5731+
FROM t GROUP BY je WITH ROLLUP;
5732+
SELECT JSON_EXTRACT(NULL, '$.a') AS je, COUNT(DISTINCT a)
5733+
FROM t GROUP BY je WITH ROLLUP;
5734+
SELECT JSON_EXTRACT('{"a":1}', '$.a') AS je, a, COUNT(DISTINCT a)
5735+
FROM t GROUP BY je, a WITH ROLLUP;
5736+
SELECT JSON_EXTRACT('{"a":1}', '$.a') AS je, a, COUNT(DISTINCT a)
5737+
FROM t GROUP BY a, je WITH ROLLUP;
5738+
DROP TABLE t;
5739+
57245740
# Local Variables:
57255741
# mode: sql
57265742
# sql-product: mysql

sql/item_func.cc

+10
Original file line numberDiff line numberDiff line change
@@ -3880,6 +3880,16 @@ my_decimal *Item_func_rollup_const::val_decimal(my_decimal *dec)
38803880
return res;
38813881
}
38823882

3883+
3884+
bool Item_func_rollup_const::val_json(Json_wrapper *result)
3885+
{
3886+
DBUG_ASSERT(fixed == 1);
3887+
bool res= args[0]->val_json(result);
3888+
null_value= args[0]->null_value;
3889+
return res;
3890+
}
3891+
3892+
38833893
longlong Item_func_length::val_int()
38843894
{
38853895
DBUG_ASSERT(fixed == 1);

sql/item_func.h

+1
Original file line numberDiff line numberDiff line change
@@ -1393,6 +1393,7 @@ class Item_func_rollup_const :public Item_func
13931393
longlong val_int();
13941394
String *val_str(String *str);
13951395
my_decimal *val_decimal(my_decimal *dec);
1396+
bool val_json(Json_wrapper *result);
13961397
bool get_date(MYSQL_TIME *ltime, my_time_flags_t fuzzydate)
13971398
{
13981399
return (null_value= args[0]->get_date(ltime, fuzzydate));

0 commit comments

Comments
 (0)