mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
MDEV-16620: Add JSON_ARRAYAGG function
The JSON_ARRAYAGG function extends the GROUP_CONCAT function and provides a method of aggregating JSON results. The current implementation supports DISTINCT and LIMIT but not ORDER BY (Oracle supports GROUP BY). Adding GROUP BY support is possible but it requires some extra work as the grouping appears to be done inside a temporary table that complicates matters. Added test cases that covert aggregation of all JSON types and JSON validation for the generated results.
This commit is contained in:
@ -606,6 +606,96 @@ SELECT * FROM t1 WHERE CASE WHEN JSON_OBJECT('x', (SELECT MAX(a=2) FROM t1))='{"
|
||||
SELECT * FROM t1 WHERE CASE WHEN JSON_OBJECT('x', (SELECT MAX(a=2) FROM t1))='{"x": false}' THEN a END;
|
||||
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
-- echo #
|
||||
-- echo # MDEV-16620 JSON_ARRAYAGG
|
||||
-- echo #
|
||||
|
||||
-- echo #
|
||||
-- echo # Integer aggregation
|
||||
-- echo #
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
INSERT INTO t1 VALUES (1, 1),(2, 1), (1, 1),(2, 1), (3, 2),(2, 2),(2, 2),(2, 2);
|
||||
SELECT JSON_VALID(JSON_ARRAYAGG(a)) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(a), JSON_ARRAYAGG(b) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(a), JSON_ARRAYAGG(b) FROM t1 GROUP BY b;
|
||||
DROP TABLE t1;
|
||||
|
||||
-- echo #
|
||||
-- echo # Real aggregation
|
||||
-- echo #
|
||||
CREATE TABLE t1 (a FLOAT, b DOUBLE, c DECIMAL(10, 2));
|
||||
INSERT INTO t1 VALUES (1.0, 2.0, 3.0),(1.0, 3.0, 9.0),(1.0, 4.0, 16.0),(1.0, 5.0, 25.0);
|
||||
SELECT JSON_VALID(JSON_ARRAYAGG(a)) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(a), JSON_ARRAYAGG(b), JSON_ARRAYAGG(c) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
-- echo #
|
||||
-- echo # Boolean aggregation
|
||||
-- echo #
|
||||
CREATE TABLE t1 (a BOOLEAN, b BOOLEAN);
|
||||
INSERT INTO t1 VALUES (TRUE, TRUE), (TRUE, FALSE), (FALSE, TRUE), (FALSE, FALSE);
|
||||
SELECT JSON_VALID(JSON_ARRAYAGG(a)) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(a), JSON_ARRAYAGG(b) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(a), JSON_ARRAYAGG(b) FROM t1 GROUP BY b;
|
||||
SELECT JSON_ARRAYAGG(TRUE), JSON_ARRAYAGG(FALSE) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
-- echo #
|
||||
-- echo # Aggregation of strings with quoted
|
||||
-- echo #
|
||||
CREATE TABLE t1 (a VARCHAR(80));
|
||||
INSERT INTO t1 VALUES
|
||||
('"double_quoted_value"'), ("'single_quoted_value'"),
|
||||
('"double_quoted_value"'), ("'single_quoted_value'");
|
||||
SELECT JSON_VALID(JSON_ARRAYAGG(a)) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(a) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
-- echo #
|
||||
-- echo # Strings and NULLs
|
||||
-- echo #
|
||||
CREATE TABLE t1 (a INT, b VARCHAR(80));
|
||||
INSERT INTO t1 VALUES
|
||||
(1, "Hello"),(1, "World"), (2, "This"),(2, "Will"), (2, "Work"),(2, "!"), (3, NULL),
|
||||
(1, "Hello"),(1, "World"), (2, "This"),(2, "Will"), (2, "Work"),(2, "!"), (3, NULL);
|
||||
SELECT JSON_VALID(JSON_ARRAYAGG(b)) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(a), JSON_ARRAYAGG(b) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(a), JSON_ARRAYAGG(b) FROM t1 GROUP BY a;
|
||||
|
||||
-- echo #
|
||||
-- echo # DISTINCT and LIMIT
|
||||
-- echo #
|
||||
SELECT JSON_ARRAYAGG(b LIMIT 1) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(b LIMIT 2) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(b LIMIT 1) FROM t1 GROUP BY b;
|
||||
SELECT JSON_ARRAYAGG(b LIMIT 2) FROM t1 GROUP BY a;
|
||||
SELECT JSON_ARRAYAGG(DISTINCT a) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(DISTINCT b) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(DISTINCT a LIMIT 2) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(DISTINCT b LIMIT 2) FROM t1;
|
||||
|
||||
-- echo #
|
||||
-- echo # JSON aggregation
|
||||
-- echo #
|
||||
SELECT JSON_VALID(JSON_ARRAYAGG(JSON_ARRAY(a, b))) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(JSON_ARRAY(a, b)) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(JSON_ARRAY(a, b)) FROM t1 GROUP BY a;
|
||||
|
||||
SELECT JSON_VALID(JSON_ARRAYAGG(JSON_OBJECT('a', a, 'b', b))) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(JSON_OBJECT('a', a, 'b', b)) FROM t1;
|
||||
SELECT JSON_ARRAYAGG(JSON_OBJECT('a', a, 'b', b)) FROM t1 GROUP BY a;
|
||||
|
||||
-- echo #
|
||||
-- echo # Error checks
|
||||
-- echo #
|
||||
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
|
||||
SELECT JSON_ARRAYAGG(a, b) FROM t1;
|
||||
|
||||
--error ER_INVALID_GROUP_FUNC_USE
|
||||
SELECT JSON_ARRAYAGG(JSON_ARRAYAGG(a, b)) FROM t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
|
Reference in New Issue
Block a user