mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-25202: JSON_TABLE: Early table reference leads to unexpected result set
(Also fixes MDEV-25254). Re-work Name Resolution for the argument of JSON_TABLE(json_doc, ....) function. The json_doc argument can refer to other tables, but it can only refer to the tables that precede[*] the JSON_TABLE(...) call. [*] - For queries with RIGHT JOINs, the "preceding" is determined after the query is normalized by converting RIGHT JOIN into left one. The implementation is as follows: - Table function arguments use their own Name_resolution_context. - The Name_resolution_context now has a bitmap of tables that should be ignored when searching for a field. - get_disallowed_table_deps() walks the TABLE_LIST::nested_join tree and computes a bitmap of tables that do not "precede" the given JSON_TABLE(...) invocation (according the above definition of "preceding").
This commit is contained in:
committed by
Alexey Botchkov
parent
13390a70e2
commit
84cf9c2e11
@@ -55,7 +55,7 @@ item_name item_props color
|
||||
Laptop {"color": "black", "price": 1000} black
|
||||
Jeans {"color": "blue", "price": 50} blue
|
||||
select * from t1 right join json_table(t1.item_props,'$' columns( color varchar(100) path '$.color')) as T on 1;
|
||||
ERROR 42000: Cross dependency found in OUTER JOIN; examine your ON conditions
|
||||
ERROR 42S22: Unknown column 't1.item_props' in 'JSON_TABLE argument'
|
||||
DROP TABLE t1;
|
||||
select * from JSON_TABLE( '[ {"xa": 1, "b": [11,111]}, {"a": 2, "b": [22,222]}, {"a":3}]', '$[*]' COLUMNS( a INT PATH '$.a' default '101' on empty, NESTED PATH '$.b[*]' COLUMNS (b INT PATH '$'))) as jt;
|
||||
a b
|
||||
@@ -251,8 +251,12 @@ SELECT t1.x*2 m, jt.* FROM t1,
|
||||
JSON_TABLE(m, '$[*]' COLUMNS (i INT PATH '$')) jt;
|
||||
ERROR 42S22: Unknown column 'm' in 'JSON_TABLE argument'
|
||||
DROP TABLE t1;
|
||||
select * from json_table(JS3.size, '$' columns (size INT PATH '$.size')) as JS1, json_table(JS1.size, '$' columns (size INT PATH '$.size')) as JS2, json_table(JS1.size, '$' columns (size INT PATH '$.size')) as JS3 where 1;
|
||||
ERROR 42S02: Unknown table 'JS3' in JSON_TABLE argument
|
||||
select *
|
||||
from
|
||||
json_table(JS3.size, '$' columns (size INT PATH '$.size')) as JS1,
|
||||
json_table(JS1.size, '$' columns (size INT PATH '$.size')) as JS2,
|
||||
json_table(JS1.size, '$' columns (size INT PATH '$.size')) as JS3 where 1;
|
||||
ERROR 42S22: Unknown column 'JS3.size' in 'JSON_TABLE argument'
|
||||
create table t1 (json varchar(100) character set utf8);
|
||||
insert into t1 values ('{"value":"АБВ"}');
|
||||
create table tj1 as
|
||||
@@ -279,7 +283,7 @@ test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze Warning Engine-independent statistics are not collected for column 'f1'
|
||||
test.t1 analyze status OK
|
||||
SELECT * FROM JSON_TABLE(tt3.f1, "$" COLUMNS (id FOR ORDINALITY)) AS tbl STRAIGHT_JOIN t1 AS tt3;
|
||||
ERROR 42S02: Unknown table 'tt3' in JSON_TABLE argument
|
||||
ERROR 42S22: Unknown column 'tt3.f1' in 'JSON_TABLE argument'
|
||||
SELECT * FROM t1 as jj1,
|
||||
(SELECT tt2.*
|
||||
FROM
|
||||
@@ -589,5 +593,81 @@ f
|
||||
NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-25254: JSON_TABLE: Inconsistent name resolution with right joins
|
||||
#
|
||||
CREATE TABLE t1 (a INT);
|
||||
SELECT * FROM t1 RIGHT JOIN JSON_TABLE(t1.a,'$' COLUMNS(o FOR ORDINALITY)) jt ON TRUE;
|
||||
ERROR 42S22: Unknown column 't1.a' in 'JSON_TABLE argument'
|
||||
CREATE VIEW v AS
|
||||
SELECT * FROM t1 RIGHT JOIN JSON_TABLE(t1.a,'$' COLUMNS(o FOR ORDINALITY)) jt ON TRUE;
|
||||
ERROR 42S22: Unknown column 't1.a' in 'JSON_TABLE argument'
|
||||
insert into t1 values (1),(2),(3);
|
||||
SELECT * FROM t1 RIGHT JOIN JSON_TABLE(t1.a,'$' COLUMNS(o FOR ORDINALITY)) jt ON TRUE;
|
||||
ERROR 42S22: Unknown column 't1.a' in 'JSON_TABLE argument'
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-25202: JSON_TABLE: Early table reference leads to unexpected result set, server crash
|
||||
#
|
||||
CREATE TABLE t1 (o INT);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
CREATE TABLE t2 (a INT);
|
||||
INSERT INTO t2 VALUES (3),(4);
|
||||
SELECT * FROM JSON_TABLE(a, '$' COLUMNS(o FOR ORDINALITY)) AS jt1 NATURAL JOIN t1 JOIN t2;
|
||||
ERROR 42S22: Unknown column 'a' in 'JSON_TABLE argument'
|
||||
SELECT * FROM JSON_TABLE(a, '$' COLUMNS(o FOR ORDINALITY)) AS jt1 NATURAL JOIN t1 STRAIGHT_JOIN t2;
|
||||
ERROR 42S22: Unknown column 'a' in 'JSON_TABLE argument'
|
||||
drop table t1,t2;
|
||||
# Now, try a JSON_TABLE that has a subquery that has an outside reference:
|
||||
create table t1(a int, js varchar(32));
|
||||
create table t2(a varchar(100));
|
||||
insert into t2 values('');
|
||||
explain
|
||||
select *
|
||||
from
|
||||
t1 left join
|
||||
json_table(concat('',js),
|
||||
'$' columns ( color varchar(32) path '$.color')
|
||||
) as JT on 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
explain
|
||||
select *
|
||||
from
|
||||
t1 right join
|
||||
json_table(concat('',js),
|
||||
'$' columns ( color varchar(32) path '$.color')
|
||||
) as JT on 1;
|
||||
ERROR 42S22: Unknown column 'js' in 'JSON_TABLE argument'
|
||||
explain
|
||||
select *
|
||||
from
|
||||
t1 left join
|
||||
json_table((select concat(a,js) from t2),
|
||||
'$' columns ( color varchar(32) path '$.color')
|
||||
) as JT on 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 1
|
||||
explain
|
||||
select *
|
||||
from
|
||||
t1 right join
|
||||
json_table((select concat(a,js) from t2),
|
||||
'$' columns ( color varchar(32) path '$.color')
|
||||
) as JT on 1;
|
||||
ERROR 42S22: Unknown column 'js' in 'field list'
|
||||
drop table t1,t2;
|
||||
#
|
||||
# MDEV-25256: JSON_TABLE: Error ER_VIEW_INVALID upon running query via view
|
||||
#
|
||||
SELECT * FROM
|
||||
JSON_TABLE('[]', '$' COLUMNS(a TEXT PATH '$[*]')) AS jt1
|
||||
RIGHT JOIN JSON_TABLE(jt1.a, '$' COLUMNS(o2 FOR ORDINALITY)) AS jt2
|
||||
ON(1)
|
||||
RIGHT JOIN JSON_TABLE('[]', '$' COLUMNS(o3 FOR ORDINALITY)) AS jt3
|
||||
ON(1)
|
||||
WHERE 0;
|
||||
ERROR 42S22: Unknown column 'jt1.a' in 'JSON_TABLE argument'
|
||||
#
|
||||
# End of 10.6 tests
|
||||
#
|
||||
|
Reference in New Issue
Block a user