mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
b44171428a
Shift-Reduce conflicts prevented parsing some queries with subqueries that used set operations when the subqueries occurred in expressions or in IN predicands. The grammar rules for query expression were transformed in order to avoid these conflicts. New grammar rules employ an idea taken from MySQL 8.0.
872 lines
30 KiB
Text
872 lines
30 KiB
Text
set @@join_buffer_size=256*1024;
|
|
set @save_optimizer_switch=@@optimizer_switch;
|
|
create table t1 (a int, b int);
|
|
create table t2 (c int, d int);
|
|
insert into t1 values (1,1),(2,2);
|
|
insert into t2 values (2,2),(3,3);
|
|
(select a,b from t1) intersect (select c,d from t2);
|
|
a b
|
|
2 2
|
|
drop tables t1,t2;
|
|
create table t1 (a int, b int) engine=MyISAM;
|
|
create table t2 (c int, d int) engine=MyISAM;
|
|
create table t3 (e int, f int) engine=MyISAM;
|
|
insert into t1 values (1,1),(2,2),(3,3);
|
|
insert into t2 values (2,2),(3,3),(4,4);
|
|
insert into t3 values (1,1),(2,2),(5,5);
|
|
(select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3);
|
|
a b
|
|
2 2
|
|
EXPLAIN (select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
|
2 INTERSECT t2 ALL NULL NULL NULL NULL 3
|
|
3 INTERSECT t3 ALL NULL NULL NULL NULL 3
|
|
NULL INTERSECT RESULT <intersect1,2,3> ALL NULL NULL NULL NULL NULL
|
|
EXPLAIN extended (select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3);
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
|
|
2 INTERSECT t2 ALL NULL NULL NULL NULL 3 100.00
|
|
3 INTERSECT t3 ALL NULL NULL NULL NULL 3 100.00
|
|
NULL INTERSECT RESULT <intersect1,2,3> ALL NULL NULL NULL NULL NULL NULL
|
|
Warnings:
|
|
Note 1003 (/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`) intersect (/* select#2 */ select `test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`) intersect (/* select#3 */ select `test`.`t3`.`e` AS `e`,`test`.`t3`.`f` AS `f` from `test`.`t3`)
|
|
EXPLAIN extended select * from ((select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3)) a;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 100.00
|
|
2 DERIVED t1 ALL NULL NULL NULL NULL 3 100.00
|
|
3 INTERSECT t2 ALL NULL NULL NULL NULL 3 100.00
|
|
4 INTERSECT t3 ALL NULL NULL NULL NULL 3 100.00
|
|
NULL INTERSECT RESULT <intersect2,3,4> ALL NULL NULL NULL NULL NULL NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `a`.`a` AS `a`,`a`.`b` AS `b` from ((/* select#2 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`) intersect (/* select#3 */ select `test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`) intersect (/* select#4 */ select `test`.`t3`.`e` AS `e`,`test`.`t3`.`f` AS `f` from `test`.`t3`)) `a`
|
|
EXPLAIN format=json (select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<intersect1,2,3>",
|
|
"access_type": "ALL",
|
|
"query_specifications": [
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows": 3,
|
|
"filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"operation": "INTERSECT",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows": 3,
|
|
"filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 3,
|
|
"operation": "INTERSECT",
|
|
"table": {
|
|
"table_name": "t3",
|
|
"access_type": "ALL",
|
|
"rows": 3,
|
|
"filtered": 100
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
ANALYZE format=json (select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3);
|
|
ANALYZE
|
|
{
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<intersect1,2,3>",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"r_rows": 1,
|
|
"query_specifications": [
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"operation": "INTERSECT",
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 3,
|
|
"operation": "INTERSECT",
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t3",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
ANALYZE format=json select * from ((select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3)) a;
|
|
ANALYZE
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "<derived2>",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100,
|
|
"materialized": {
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<intersect2,3,4>",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"r_rows": 1,
|
|
"query_specifications": [
|
|
{
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 3,
|
|
"operation": "INTERSECT",
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 4,
|
|
"operation": "INTERSECT",
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t3",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
select * from ((select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3)) a;
|
|
a b
|
|
2 2
|
|
prepare stmt from "(select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3);";
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
prepare stmt from "select * from ((select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3)) a";
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
(select a,b from t1) intersect (select c,e from t2,t3);
|
|
a b
|
|
2 2
|
|
EXPLAIN (select a,b from t1) intersect (select c,e from t2,t3);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3
|
|
2 INTERSECT t2 ALL NULL NULL NULL NULL 3
|
|
2 INTERSECT t3 ALL NULL NULL NULL NULL 3 Using join buffer (flat, BNL join)
|
|
NULL INTERSECT RESULT <intersect1,2> ALL NULL NULL NULL NULL NULL
|
|
EXPLAIN extended (select a,b from t1) intersect (select c,e from t2,t3);
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00
|
|
2 INTERSECT t2 ALL NULL NULL NULL NULL 3 100.00
|
|
2 INTERSECT t3 ALL NULL NULL NULL NULL 3 100.00 Using join buffer (flat, BNL join)
|
|
NULL INTERSECT RESULT <intersect1,2> ALL NULL NULL NULL NULL NULL NULL
|
|
Warnings:
|
|
Note 1003 (/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`) intersect (/* select#2 */ select `test`.`t2`.`c` AS `c`,`test`.`t3`.`e` AS `e` from `test`.`t2` join `test`.`t3`)
|
|
EXPLAIN extended select * from ((select a,b from t1) intersect (select c,e from t2,t3)) a;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 100.00
|
|
2 DERIVED t1 ALL NULL NULL NULL NULL 3 100.00
|
|
3 INTERSECT t2 ALL NULL NULL NULL NULL 3 100.00
|
|
3 INTERSECT t3 ALL NULL NULL NULL NULL 3 100.00 Using join buffer (flat, BNL join)
|
|
NULL INTERSECT RESULT <intersect2,3> ALL NULL NULL NULL NULL NULL NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `a`.`a` AS `a`,`a`.`b` AS `b` from ((/* select#2 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`) intersect (/* select#3 */ select `test`.`t2`.`c` AS `c`,`test`.`t3`.`e` AS `e` from `test`.`t2` join `test`.`t3`)) `a`
|
|
set @@optimizer_switch='optimize_join_buffer_size=off';
|
|
EXPLAIN format=json (select a,b from t1) intersect (select c,e from t2,t3);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<intersect1,2>",
|
|
"access_type": "ALL",
|
|
"query_specifications": [
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows": 3,
|
|
"filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"operation": "INTERSECT",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows": 3,
|
|
"filtered": 100
|
|
},
|
|
"block-nl-join": {
|
|
"table": {
|
|
"table_name": "t3",
|
|
"access_type": "ALL",
|
|
"rows": 3,
|
|
"filtered": 100
|
|
},
|
|
"buffer_type": "flat",
|
|
"buffer_size": "256Kb",
|
|
"join_type": "BNL"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
ANALYZE format=json (select a,b from t1) intersect (select c,e from t2,t3);
|
|
ANALYZE
|
|
{
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<intersect1,2>",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"r_rows": 1,
|
|
"query_specifications": [
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"operation": "INTERSECT",
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"block-nl-join": {
|
|
"table": {
|
|
"table_name": "t3",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"buffer_type": "flat",
|
|
"buffer_size": "256Kb",
|
|
"join_type": "BNL",
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
ANALYZE format=json select * from ((select a,b from t1) intersect (select c,e from t2,t3)) a;
|
|
ANALYZE
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "<derived2>",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100,
|
|
"materialized": {
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<intersect2,3>",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"r_rows": 1,
|
|
"query_specifications": [
|
|
{
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 3,
|
|
"operation": "INTERSECT",
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"block-nl-join": {
|
|
"table": {
|
|
"table_name": "t3",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 3,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"buffer_type": "flat",
|
|
"buffer_size": "256Kb",
|
|
"join_type": "BNL",
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
set @@optimizer_switch=@save_optimizer_switch;
|
|
select * from ((select a,b from t1) intersect (select c,e from t2,t3)) a;
|
|
a b
|
|
2 2
|
|
prepare stmt from "(select a,b from t1) intersect (select c,e from t2,t3);";
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
prepare stmt from "select * from ((select a,b from t1) intersect (select c,e from t2,t3)) a";
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
drop tables t1,t2,t3;
|
|
select 1 as a from dual intersect select 1 from dual;
|
|
a
|
|
1
|
|
(select 1 from dual) intersect (select 1 from dual);
|
|
1
|
|
1
|
|
(select 1 from dual into @v) intersect (select 1 from dual);
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'into @v) intersect (select 1 from dual)' at line 1
|
|
select 1 from dual ORDER BY 1 intersect select 1 from dual;
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'intersect select 1 from dual' at line 1
|
|
select 1 as a from dual union all select 1 from dual;
|
|
a
|
|
1
|
|
1
|
|
select 1 from dual intersect all select 1 from dual;
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'all select 1 from dual' at line 1
|
|
create table t1 (a int, b blob, a1 int, b1 blob);
|
|
create table t2 (c int, d blob, c1 int, d1 blob);
|
|
insert into t1 values (1,"ddd", 1, "sdfrrwwww"),(2, "fgh", 2, "dffggtt");
|
|
insert into t2 values (2, "fgh", 2, "dffggtt"),(3, "ffggddd", 3, "dfgg");
|
|
(select a,b,b1 from t1) intersect (select c,d,d1 from t2);
|
|
a b b1
|
|
2 fgh dffggtt
|
|
drop tables t1,t2;
|
|
create table t1 (a int, b blob) engine=MyISAM;
|
|
create table t2 (c int, d blob) engine=MyISAM;
|
|
create table t3 (e int, f blob) engine=MyISAM;
|
|
insert into t1 values (1,1),(2,2),(3,3);
|
|
insert into t2 values (2,2),(3,3),(4,4);
|
|
insert into t3 values (1,1),(2,2),(5,5);
|
|
(select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3);
|
|
a b
|
|
2 2
|
|
select * from ((select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3)) a;
|
|
a b
|
|
2 2
|
|
prepare stmt from "(select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3);";
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
prepare stmt from "select * from ((select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3)) a";
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
execute stmt;
|
|
a b
|
|
2 2
|
|
create table t4 (select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3);
|
|
show create table t4;
|
|
Table Create Table
|
|
t4 CREATE TABLE `t4` (
|
|
`a` int(11) DEFAULT NULL,
|
|
`b` blob DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
drop tables t1,t2,t3,t4;
|
|
create table t1 (a int, b blob) engine=MyISAM;
|
|
create table t2 (c int, d blob) engine=MyISAM;
|
|
create table t3 (e int, f blob) engine=MyISAM;
|
|
insert into t1 values (1,1),(2,2),(3,3);
|
|
insert into t2 values (2,2),(3,3);
|
|
insert into t3 values (1,1),(2,2),(3,3);
|
|
(select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3) union (select 4,4);
|
|
a b
|
|
2 2
|
|
3 3
|
|
4 4
|
|
(select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3) union (select 4,4) except (select 2,2);
|
|
a b
|
|
3 3
|
|
4 4
|
|
drop tables t1,t2,t3;
|
|
create table t1 (a int, b int);
|
|
create table t2 (c int, d int);
|
|
create table t3 (e int, f int);
|
|
insert into t1 values (1,1),(2,2),(3,3);
|
|
insert into t2 values (2,2),(3,3);
|
|
insert into t3 values (1,1),(2,2),(3,3);
|
|
(select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3) union (select 4,4);
|
|
a b
|
|
2 2
|
|
3 3
|
|
4 4
|
|
(select a,b from t1) intersect (select c,d from t2) intersect (select e,f from t3) union (select 4,4) except (select 2,2);
|
|
a b
|
|
3 3
|
|
4 4
|
|
drop tables t1,t2,t3;
|
|
#
|
|
# INTERSECT precedence
|
|
#
|
|
create table t1 (a int, b blob) engine=MyISAM;
|
|
create table t2 (c int, d blob) engine=MyISAM;
|
|
create table t3 (e int, f blob) engine=MyISAM;
|
|
insert into t1 values (5,5),(6,6);
|
|
insert into t2 values (2,2),(3,3);
|
|
insert into t3 values (1,1),(3,3);
|
|
(select a,b from t1) union (select c,d from t2) intersect (select e,f from t3) union (select 4,4);
|
|
a b
|
|
3 3
|
|
4 4
|
|
5 5
|
|
6 6
|
|
explain extended
|
|
(select a,b from t1) union (select c,d from t2) intersect (select e,f from t3) union (select 4,4);
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00
|
|
5 UNION <derived2> ALL NULL NULL NULL NULL 2 100.00
|
|
2 DERIVED t2 ALL NULL NULL NULL NULL 2 100.00
|
|
3 INTERSECT t3 ALL NULL NULL NULL NULL 2 100.00
|
|
NULL INTERSECT RESULT <intersect2,3> ALL NULL NULL NULL NULL NULL NULL
|
|
4 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
|
NULL UNION RESULT <union1,5,4> ALL NULL NULL NULL NULL NULL NULL
|
|
Warnings:
|
|
Note 1003 (/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`) union /* select#5 */ select `__5`.`c` AS `c`,`__5`.`d` AS `d` from ((/* select#2 */ select `test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`) intersect (/* select#3 */ select `test`.`t3`.`e` AS `e`,`test`.`t3`.`f` AS `f` from `test`.`t3`)) `__5` union (/* select#4 */ select 4 AS `4`,4 AS `4`)
|
|
set SQL_MODE=ORACLE;
|
|
(select a,b from t1) union (select c,d from t2) intersect (select e,f from t3) union (select 4,4);
|
|
a b
|
|
3 3
|
|
4 4
|
|
explain extended
|
|
(select a,b from t1) union (select c,d from t2) intersect (select e,f from t3) union (select 4,4);
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00
|
|
2 UNION t2 ALL NULL NULL NULL NULL 2 100.00
|
|
3 INTERSECT t3 ALL NULL NULL NULL NULL 2 100.00
|
|
4 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
|
NULL UNIT RESULT <unit1,2,3,4> ALL NULL NULL NULL NULL NULL NULL
|
|
Warnings:
|
|
Note 1003 (/* select#1 */ select "test"."t1"."a" AS "a","test"."t1"."b" AS "b" from "test"."t1") union (/* select#2 */ select "test"."t2"."c" AS "c","test"."t2"."d" AS "d" from "test"."t2") intersect (/* select#3 */ select "test"."t3"."e" AS "e","test"."t3"."f" AS "f" from "test"."t3") union (/* select#4 */ select 4 AS "4",4 AS "4")
|
|
set SQL_MODE=default;
|
|
(select e,f from t3) intersect (select c,d from t2) union (select a,b from t1) union (select 4,4);
|
|
e f
|
|
3 3
|
|
4 4
|
|
5 5
|
|
6 6
|
|
explain extended
|
|
(select e,f from t3) intersect (select c,d from t2) union (select a,b from t1) union (select 4,4);
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 100.00
|
|
2 INTERSECT t2 ALL NULL NULL NULL NULL 2 100.00
|
|
3 UNION t1 ALL NULL NULL NULL NULL 2 100.00
|
|
4 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
|
NULL UNIT RESULT <unit1,2,3,4> ALL NULL NULL NULL NULL NULL NULL
|
|
Warnings:
|
|
Note 1003 (/* select#1 */ select `test`.`t3`.`e` AS `e`,`test`.`t3`.`f` AS `f` from `test`.`t3`) intersect (/* select#2 */ select `test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`) union (/* select#3 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`) union (/* select#4 */ select 4 AS `4`,4 AS `4`)
|
|
set SQL_MODE=ORACLE;
|
|
(select e,f from t3) intersect (select c,d from t2) union (select a,b from t1) union (select 4,4);
|
|
e f
|
|
3 3
|
|
4 4
|
|
5 5
|
|
6 6
|
|
explain extended
|
|
(select e,f from t3) intersect (select c,d from t2) union (select a,b from t1) union (select 4,4);
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 100.00
|
|
2 INTERSECT t2 ALL NULL NULL NULL NULL 2 100.00
|
|
3 UNION t1 ALL NULL NULL NULL NULL 2 100.00
|
|
4 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
|
NULL UNIT RESULT <unit1,2,3,4> ALL NULL NULL NULL NULL NULL NULL
|
|
Warnings:
|
|
Note 1003 (/* select#1 */ select "test"."t3"."e" AS "e","test"."t3"."f" AS "f" from "test"."t3") intersect (/* select#2 */ select "test"."t2"."c" AS "c","test"."t2"."d" AS "d" from "test"."t2") union (/* select#3 */ select "test"."t1"."a" AS "a","test"."t1"."b" AS "b" from "test"."t1") union (/* select#4 */ select 4 AS "4",4 AS "4")
|
|
set SQL_MODE=default;
|
|
(/* select#1 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`) union /* select#3 */ select `__3`.`c` AS `c`,`__3`.`d` AS `d` from ((/* select#2 */ select `test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`) intersect (/* select#4 */ select `test`.`t3`.`e` AS `e`,`test`.`t3`.`f` AS `f` from `test`.`t3`)) `__3` union (/* select#5 */ select 4 AS `4`,4 AS `4`);
|
|
a b
|
|
3 3
|
|
4 4
|
|
5 5
|
|
6 6
|
|
prepare stmt from "(select a,b from t1) union (select c,d from t2) intersect (select e,f from t3) union (select 4,4)";
|
|
execute stmt;
|
|
a b
|
|
5 5
|
|
6 6
|
|
3 3
|
|
4 4
|
|
execute stmt;
|
|
a b
|
|
5 5
|
|
6 6
|
|
3 3
|
|
4 4
|
|
create view v1 as (select a,b from t1) union (select c,d from t2) intersect (select e,f from t3) union (select 4,4);
|
|
select b,a,b+1 from v1;
|
|
b a b+1
|
|
3 3 4
|
|
4 4 5
|
|
5 5 6
|
|
6 6 7
|
|
select b,a,b+1 from v1 where a > 3;
|
|
b a b+1
|
|
4 4 5
|
|
5 5 6
|
|
6 6 7
|
|
create procedure p1()
|
|
select * from v1;
|
|
call p1();
|
|
a b
|
|
3 3
|
|
4 4
|
|
5 5
|
|
6 6
|
|
call p1();
|
|
a b
|
|
3 3
|
|
4 4
|
|
5 5
|
|
6 6
|
|
drop procedure p1;
|
|
create procedure p1()
|
|
(select a,b from t1) union (select c,d from t2) intersect (select e,f from t3) union (select 4,4);
|
|
call p1();
|
|
a b
|
|
3 3
|
|
4 4
|
|
5 5
|
|
6 6
|
|
call p1();
|
|
a b
|
|
3 3
|
|
4 4
|
|
5 5
|
|
6 6
|
|
drop procedure p1;
|
|
show create view v1;
|
|
View Create View character_set_client collation_connection
|
|
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS (select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`) union select `__6`.`c` AS `c`,`__6`.`d` AS `d` from ((select `test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`) intersect (select `test`.`t3`.`e` AS `e`,`test`.`t3`.`f` AS `f` from `test`.`t3`)) `__6` union (select 4 AS `4`,4 AS `4`) latin1 latin1_swedish_ci
|
|
drop view v1;
|
|
drop tables t1,t2,t3;
|
|
#
|
|
# MDEV-14346:incorrect result of intersect with ANY/ALL/IN subquery
|
|
#
|
|
CREATE TABLE t (i INT);
|
|
INSERT INTO t VALUES (1),(2);
|
|
SELECT * FROM t WHERE i != ANY ( SELECT 6 INTERSECT SELECT 3 );
|
|
i
|
|
select i from t where
|
|
exists ((select 6 as r from dual having t.i <> 6)
|
|
intersect
|
|
(select 3 from dual having t.i <> 3));
|
|
i
|
|
drop table t;
|
|
#
|
|
# MDEV-13749: Server crashes in _ma_unique_hash /
|
|
# JOIN_CACHE::generate_full_extensions on INTERSECT
|
|
#
|
|
CREATE TABLE t1 (a varchar(32)) ENGINE=MyISAM;
|
|
INSERT INTO t1 VALUES
|
|
('Jakarta'),('Lisbon'),('Honolulu'),('Lusaka'),('Barcelona'),('Taipei'),
|
|
('Brussels'),('Orlando'),('Osaka'),('Quito'),('Lima'),('Tunis'),
|
|
('Unalaska'),('Rotterdam'),('Zagreb'),('Ufa'),('Ryazan'),('Xiamen'),
|
|
('London'),('Izmir'),('Samara'),('Bern'),('Zhengzhou'),('Vladivostok'),
|
|
('Yangon'),('Victoria'),('Warsaw'),('Luanda'),('Leon'),('Bangkok'),
|
|
('Wellington'),('Zibo'),('Qiqihar'),('Delhi'),('Hamburg'),('Ottawa'),
|
|
('Vaduz');
|
|
CREATE TABLE t2 (b varchar(32)) ENGINE=MyISAM;
|
|
INSERT INTO t2 VALUES
|
|
('Gaza'),('Jeddah'),('Beirut'),('Incheon'),('Tbilisi'),('Izmir'),
|
|
('Quito'),('Riga'),('Freetown'),('Zagreb'),('Caracas'),('Orlando'),
|
|
('Kingston'),('Turin'),('Xinyang'),('Osaka'),('Albany'),('Geneva'),
|
|
('Omsk'),('Kazan'),('Quezon'),('Indore'),('Odessa'),('Xiamen'),
|
|
('Winnipeg'),('Yakutsk'),('Nairobi'),('Ufa'),('Helsinki'),('Vilnius'),
|
|
('Aden'),('Liverpool'),('Honolulu'),('Frankfurt'),('Glasgow'),
|
|
('Vienna'),('Jackson'),('Jakarta'),('Sydney'),('Oslo'),('Novgorod'),
|
|
('Norilsk'),('Izhevsk'),('Istanbul'),('Nice');
|
|
CREATE TABLE t3 (c varchar(32)) ENGINE=MyISAM;
|
|
INSERT INTO t3 VALUES
|
|
('Nicosia'),('Istanbul'),('Richmond'),('Stockholm'),('Dublin'),
|
|
('Wichita'),('Warsaw'),('Glasgow'),('Winnipeg'),('Irkutsk'),('Quito'),
|
|
('Xiamen'),('Berlin'),('Rome'),('Denver'),('Dallas'),('Kabul'),
|
|
('Prague'),('Izhevsk'),('Tirana'),('Sofia'),('Detroit'),('Sorbonne');
|
|
select count(*) from (
|
|
SELECT * FROM t1 LEFT OUTER JOIN t2 LEFT OUTER JOIN t3 ON b < c ON a > b
|
|
INTERSECT
|
|
SELECT * FROM t1 LEFT OUTER JOIN t2 LEFT OUTER JOIN t3 ON b < c ON a > b
|
|
) a;
|
|
count(*)
|
|
14848
|
|
drop table t1,t2,t3;
|
|
CREATE TABLE t1 (a varchar(32) not null) ENGINE=MyISAM;
|
|
INSERT INTO t1 VALUES
|
|
('Jakarta'),('Lisbon'),('Honolulu'),('Lusaka'),('Barcelona'),('Taipei'),
|
|
('Brussels'),('Orlando'),('Osaka'),('Quito'),('Lima'),('Tunis'),
|
|
('Unalaska'),('Rotterdam'),('Zagreb'),('Ufa'),('Ryazan'),('Xiamen'),
|
|
('London'),('Izmir'),('Samara'),('Bern'),('Zhengzhou'),('Vladivostok'),
|
|
('Yangon'),('Victoria'),('Warsaw'),('Luanda'),('Leon'),('Bangkok'),
|
|
('Wellington'),('Zibo'),('Qiqihar'),('Delhi'),('Hamburg'),('Ottawa'),
|
|
('Vaduz');
|
|
CREATE TABLE t2 (b varchar(32) not null) ENGINE=MyISAM;
|
|
INSERT INTO t2 VALUES
|
|
('Gaza'),('Jeddah'),('Beirut'),('Incheon'),('Tbilisi'),('Izmir'),
|
|
('Quito'),('Riga'),('Freetown'),('Zagreb'),('Caracas'),('Orlando'),
|
|
('Kingston'),('Turin'),('Xinyang'),('Osaka'),('Albany'),('Geneva'),
|
|
('Omsk'),('Kazan'),('Quezon'),('Indore'),('Odessa'),('Xiamen'),
|
|
('Winnipeg'),('Yakutsk'),('Nairobi'),('Ufa'),('Helsinki'),('Vilnius'),
|
|
('Aden'),('Liverpool'),('Honolulu'),('Frankfurt'),('Glasgow'),
|
|
('Vienna'),('Jackson'),('Jakarta'),('Sydney'),('Oslo'),('Novgorod'),
|
|
('Norilsk'),('Izhevsk'),('Istanbul'),('Nice');
|
|
CREATE TABLE t3 (c varchar(32) not null) ENGINE=MyISAM;
|
|
INSERT INTO t3 VALUES
|
|
('Nicosia'),('Istanbul'),('Richmond'),('Stockholm'),('Dublin'),
|
|
('Wichita'),('Warsaw'),('Glasgow'),('Winnipeg'),('Irkutsk'),('Quito'),
|
|
('Xiamen'),('Berlin'),('Rome'),('Denver'),('Dallas'),('Kabul'),
|
|
('Prague'),('Izhevsk'),('Tirana'),('Sofia'),('Detroit'),('Sorbonne');
|
|
select count(*) from (
|
|
SELECT * FROM t1 LEFT OUTER JOIN t2 LEFT OUTER JOIN t3 ON b < c ON a > b
|
|
INTERSECT
|
|
SELECT * FROM t1 LEFT OUTER JOIN t2 LEFT OUTER JOIN t3 ON b < c ON a > b
|
|
) a;
|
|
count(*)
|
|
14848
|
|
drop table t1,t2,t3;
|
|
#
|
|
# MDEV-13695: INTERSECT precedence is not in line with Oracle even
|
|
# in SQL_MODE=Oracle
|
|
#
|
|
create table t12(c1 int);
|
|
insert into t12 values(1);
|
|
insert into t12 values(2);
|
|
create table t13(c1 int);
|
|
insert into t13 values(1);
|
|
insert into t13 values(3);
|
|
create table t234(c1 int);
|
|
insert into t234 values(2);
|
|
insert into t234 values(3);
|
|
insert into t234 values(4);
|
|
set SQL_MODE=oracle;
|
|
select * from t13 union select * from t234 intersect select * from t12;
|
|
c1
|
|
1
|
|
2
|
|
set SQL_MODE=default;
|
|
select * from t13 union select * from t234 intersect select * from t12;
|
|
c1
|
|
1
|
|
2
|
|
3
|
|
drop table t12,t13,t234;
|
|
# End of 10.3 tests
|
|
#
|
|
# MDEV-18701: Wrong result from query that uses INTERSECT after UNION ALL
|
|
#
|
|
create table t1 (a int);
|
|
insert into t1 values (3), (1), (7), (3), (2), (7), (4);
|
|
create table t2 (a int);
|
|
insert into t2 values (4), (5), (9), (1), (8), (9);
|
|
create table t3 (a int);
|
|
insert into t3 values (8), (1), (8), (2), (3), (7), (2);
|
|
select * from t1 where a > 4
|
|
union all
|
|
select * from t2 where a < 5
|
|
intersect
|
|
select * from t3 where a < 5;
|
|
a
|
|
7
|
|
7
|
|
1
|
|
explain extended
|
|
select * from t1 where a > 4
|
|
union all
|
|
select * from t2 where a < 5
|
|
intersect
|
|
select * from t3 where a < 5;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 7 100.00 Using where
|
|
4 UNION <derived2> ALL NULL NULL NULL NULL 6 100.00
|
|
2 DERIVED t2 ALL NULL NULL NULL NULL 6 100.00 Using where
|
|
3 INTERSECT t3 ALL NULL NULL NULL NULL 7 100.00 Using where
|
|
NULL INTERSECT RESULT <intersect2,3> ALL NULL NULL NULL NULL NULL NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 4 union all /* select#4 */ select `__4`.`a` AS `a` from (/* select#2 */ select `test`.`t2`.`a` AS `a` from `test`.`t2` where `test`.`t2`.`a` < 5 intersect /* select#3 */ select `test`.`t3`.`a` AS `a` from `test`.`t3` where `test`.`t3`.`a` < 5) `__4`
|
|
drop table t1,t2,t3;
|