summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnel Husakovic <anel@mariadb.org>2022-01-17 16:26:47 +0100
committerAnel Husakovic <anel@mariadb.org>2022-01-19 09:29:02 +0100
commit9cd6ecfe501bcbee04d2d203baa81c927664c9e2 (patch)
tree1a74b4c10ed107c1d8a10a71d81e3cb08bffd451
parent410c4edef30b3ac061f21aa712020a51337cff56 (diff)
downloadmariadb-git-9cd6ecfe501bcbee04d2d203baa81c927664c9e2.tar.gz
MDEV-18284: JSON casting using JSON_COMPACT doesn't always work with values from subqueries
- Cherry-pick 2fcff310d024cc2201586c568391ba8b039f0bf3 (MDEV-21902) - Closed PR #1145 Reviewed by: holyfoot@mariadb.com
-rw-r--r--mysql-test/r/func_json.result18
-rw-r--r--mysql-test/t/func_json.test15
-rw-r--r--sql/item.h1
3 files changed, 34 insertions, 0 deletions
diff --git a/mysql-test/r/func_json.result b/mysql-test/r/func_json.result
index f8e78c79f5d..b0005b13e45 100644
--- a/mysql-test/r/func_json.result
+++ b/mysql-test/r/func_json.result
@@ -940,5 +940,23 @@ SELECT JSON_REPLACE( JSON_DETAILED('["x"]'), '$.a', 'xx' );
JSON_REPLACE( JSON_DETAILED('["x"]'), '$.a', 'xx' )
["x"]
#
+# MDEV-18284 JSON casting using JSON_COMPACT doesn't always work
+# with values from subqueries
+#
+CREATE TABLE json_test(a JSON, b JSON);
+INSERT INTO json_test VALUES ("[1,2,3]", '{"a":"foo"}');
+SELECT * FROM json_test;
+a b
+[1,2,3] {"a":"foo"}
+SELECT json_object("a", json_compact(a), "b", b)
+FROM (SELECT * FROM json_test) AS json_test_values;
+json_object("a", json_compact(a), "b", b)
+{"a": [1,2,3], "b": "{\"a\":\"foo\"}"}
+SELECT json_object("a", json_compact(a), "b", json_compact(b))
+FROM (SELECT * FROM json_test) AS json_test_values;
+json_object("a", json_compact(a), "b", json_compact(b))
+{"a": [1,2,3], "b": {"a":"foo"}}
+DROP TABLE json_test;
+#
# End of 10.2 tests
#
diff --git a/mysql-test/t/func_json.test b/mysql-test/t/func_json.test
index e4e093225f8..aaba3c21315 100644
--- a/mysql-test/t/func_json.test
+++ b/mysql-test/t/func_json.test
@@ -561,5 +561,20 @@ SELECT
SELECT JSON_REPLACE( JSON_DETAILED('["x"]'), '$.a', 'xx' );
--echo #
+--echo # MDEV-18284 JSON casting using JSON_COMPACT doesn't always work
+--echo # with values from subqueries
+--echo #
+
+CREATE TABLE json_test(a JSON, b JSON);
+INSERT INTO json_test VALUES ("[1,2,3]", '{"a":"foo"}');
+SELECT * FROM json_test;
+
+SELECT json_object("a", json_compact(a), "b", b)
+ FROM (SELECT * FROM json_test) AS json_test_values;
+SELECT json_object("a", json_compact(a), "b", json_compact(b))
+ FROM (SELECT * FROM json_test) AS json_test_values;
+DROP TABLE json_test;
+
+--echo #
--echo # End of 10.2 tests
--echo #
diff --git a/sql/item.h b/sql/item.h
index 086d85e989f..290ff11a0f8 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -4564,6 +4564,7 @@ public:
{
return ref ? (*ref)->real_item() : this;
}
+ bool is_json_type() { return (*ref)->is_json_type(); }
bool walk(Item_processor processor, bool walk_subquery, void *arg)
{
if (ref && *ref)