Bug #79812 JSON_ARRAY and JSON_OBJECT return inproper JSON when used with GROUP_CONCAT
| Submitted: | 30 Dec 2015 18:22 | Modified: | 10 Feb 2016 13:55 |
|---|---|---|---|
| Reporter: | Bear Limvere | Email Updates: | |
| Status: | Not a Bug | Impact on me: | |
| Category: | MySQL Server: JSON | Severity: | S2 (Serious) |
| Version: | 5.7.10, 8.0.0 | OS: | Any |
| Assigned to: | CPU Architecture: | Any |
[2 Jan 2016 5:14]
MySQL Verification Team
Hello Bear Limvere, Thank you for the report and test case. Verified as described. Thanks, Umesh
[10 Feb 2016 13:55]
Knut Anders Hatlen
This is actually intentional behaviour, even though it might look a bit confusing. GROUP_CONCAT returns a string. JSON_ARRAY does not parse string arguments as JSON text, but instead converts them to JSON string scalars. Because of this, JSON_ARRAY(GROUP_CONCAT(...)) returns a JSON array with one element, which is a string. There is another request for adding JSON aggregate functions, which would provide the functionality you need. See bug#79010. For now, it should be possible to work around this lacking functionality with manual creation and parsing of JSON text. Something like this should do the trick: CAST(CONCAT('[', GROUP_CONCAT( JSON_OBJECT( 'user_id', user.user_id, 'user_name', user.user_name, 'is_active', user.is_active)), ']') AS JSON)
[18 Jun 2016 21:35]
Omer Barnir
Posted by developer: Reported version value updated to reflect release name change from 5.8 to 8.0
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.055 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: When you nest JSON_ARRAY and JSON_OBJECT in a SELECT query with a GROUP_CONCAT the resulting JSON is invalid. We have written JSON utilities internally to allow returns of complex datasets from a single query. With the new 5.7 JSON functions, the resulting JSON is corrupted due to quoting. SELECT department.department_name, JSON_ARRAY( GROUP_CONCAT( JSON_OBJECT( 'user_id', user.user_id, 'user_name', user.user_name, 'is_active', user.is_active ) ) ) AS department_users FROM temp.user JOIN temp.department ON ( department.department_id = user.department_id) WHERE department.department_name = 'IT' GROUP BY department.department_name; -- returns improper JSON [ "{\"user_id\": 1, \"is_active\": 1, \"user_name\": \"test user 1\"}, {\"user_id\": 2, \"is_active\": 0, \"user_name\": \"test user 2\"}" ] -- should return (formatted for clarity) [ {"user_id": 1, "is_active": 1, "user_name": "test user 1"}, {"user_id": 2, "is_active": 0, "user_name": "test user 2"} ] How to repeat: CREATE DATABASE temp; USE temp; CREATE TABLE temp.user ( user_id INT(11) UNSIGNED NOT NULL, department_id INT(11) UNSIGNED NOT NULL, user_name VARCHAR(32) DEFAULT NULL, is_active TINYINT(1) UNSIGNED NOT NULL DEFAULT 0 ); INSERT INTO temp.user (user_id, department_id, user_name, is_active) VALUES (1, 1, 'test user 1', TRUE), (2, 1, 'test user 2', FALSE), (3, 2, 'test user 3', TRUE); CREATE TABLE temp.department ( department_id INT(11) UNSIGNED NOT NULL, department_name VARCHAR(32) ); INSERT INTO temp.department (department_id, department_name) VALUES (1, 'IT'), (2, 'HR');