mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +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.
538 lines
17 KiB
Text
538 lines
17 KiB
Text
set @@join_buffer_size=256*1024;
|
|
create table t1 (a int, b int) engine=MyISAM;
|
|
create table t2 (c int, d int) engine=MyISAM;
|
|
insert into t1 values (1,1),(2,2);
|
|
insert into t2 values (2,2),(3,3);
|
|
(select a,b from t1) except (select c,d from t2);
|
|
a b
|
|
1 1
|
|
EXPLAIN (select a,b from t1) except (select c,d from t2);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
|
|
2 EXCEPT t2 ALL NULL NULL NULL NULL 2
|
|
NULL EXCEPT RESULT <except1,2> ALL NULL NULL NULL NULL NULL
|
|
EXPLAIN extended (select a,b from t1) except (select c,d from t2);
|
|
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 EXCEPT t2 ALL NULL NULL NULL NULL 2 100.00
|
|
NULL EXCEPT RESULT <except1,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`) except (/* select#2 */ select `test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`)
|
|
EXPLAIN extended select * from ((select a,b from t1) except (select c,d from t2)) a;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 2 100.00
|
|
2 DERIVED t1 ALL NULL NULL NULL NULL 2 100.00
|
|
3 EXCEPT t2 ALL NULL NULL NULL NULL 2 100.00
|
|
NULL EXCEPT RESULT <except2,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`) except (/* select#3 */ select `test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d` from `test`.`t2`)) `a`
|
|
EXPLAIN format=json (select a,b from t1) except (select c,d from t2);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<except1,2>",
|
|
"access_type": "ALL",
|
|
"query_specifications": [
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows": 2,
|
|
"filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"operation": "EXCEPT",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows": 2,
|
|
"filtered": 100
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
ANALYZE format=json (select a,b from t1) except (select c,d from t2);
|
|
ANALYZE
|
|
{
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<except1,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": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"operation": "EXCEPT",
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
ANALYZE format=json select * from ((select a,b from t1) except (select c,d from t2)) 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": 2,
|
|
"r_rows": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100,
|
|
"materialized": {
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<except2,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": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 3,
|
|
"operation": "EXCEPT",
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
select * from ((select a,b from t1) except (select c,d from t2)) a;
|
|
a b
|
|
1 1
|
|
prepare stmt from "(select a,b from t1) except (select c,d from t2)";
|
|
execute stmt;
|
|
a b
|
|
1 1
|
|
execute stmt;
|
|
a b
|
|
1 1
|
|
prepare stmt from "select * from ((select a,b from t1) except (select c,d from t2)) a";
|
|
execute stmt;
|
|
a b
|
|
1 1
|
|
execute stmt;
|
|
a b
|
|
1 1
|
|
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;
|
|
create table t4 (g int, h int) engine=MyISAM;
|
|
insert into t1 values (1,1),(2,2);
|
|
insert into t2 values (2,2),(3,3);
|
|
insert into t3 values (4,4),(5,5);
|
|
insert into t4 values (4,4),(7,7);
|
|
(select a,b,e,f from t1,t3) except (select c,d,g,h from t2,t4);
|
|
a b e f
|
|
1 1 4 4
|
|
1 1 5 5
|
|
2 2 5 5
|
|
EXPLAIN (select a,b,e,f from t1,t3) except (select c,d,g,h from t2,t4);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
|
|
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 Using join buffer (flat, BNL join)
|
|
2 EXCEPT t2 ALL NULL NULL NULL NULL 2
|
|
2 EXCEPT t4 ALL NULL NULL NULL NULL 2 Using join buffer (flat, BNL join)
|
|
NULL EXCEPT RESULT <except1,2> ALL NULL NULL NULL NULL NULL
|
|
EXPLAIN (select a,b,e,f from t1,t3) except (select c,d,g,h from t2,t4);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
|
|
1 PRIMARY t3 ALL NULL NULL NULL NULL 2 Using join buffer (flat, BNL join)
|
|
2 EXCEPT t2 ALL NULL NULL NULL NULL 2
|
|
2 EXCEPT t4 ALL NULL NULL NULL NULL 2 Using join buffer (flat, BNL join)
|
|
NULL EXCEPT RESULT <except1,2> ALL NULL NULL NULL NULL NULL
|
|
EXPLAIN extended select * from ((select a,b,e,f from t1,t3) except (select c,d,g,h from t2,t4)) a;
|
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 4 100.00
|
|
2 DERIVED t1 ALL NULL NULL NULL NULL 2 100.00
|
|
2 DERIVED t3 ALL NULL NULL NULL NULL 2 100.00 Using join buffer (flat, BNL join)
|
|
3 EXCEPT t2 ALL NULL NULL NULL NULL 2 100.00
|
|
3 EXCEPT t4 ALL NULL NULL NULL NULL 2 100.00 Using join buffer (flat, BNL join)
|
|
NULL EXCEPT RESULT <except2,3> ALL NULL NULL NULL NULL NULL NULL
|
|
Warnings:
|
|
Note 1003 /* select#1 */ select `a`.`a` AS `a`,`a`.`b` AS `b`,`a`.`e` AS `e`,`a`.`f` AS `f` from ((/* select#2 */ select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t3`.`e` AS `e`,`test`.`t3`.`f` AS `f` from `test`.`t1` join `test`.`t3`) except (/* select#3 */ select `test`.`t2`.`c` AS `c`,`test`.`t2`.`d` AS `d`,`test`.`t4`.`g` AS `g`,`test`.`t4`.`h` AS `h` from `test`.`t2` join `test`.`t4`)) `a`
|
|
EXPLAIN format=json (select a,b,e,f from t1,t3) except (select c,d,g,h from t2,t4);
|
|
EXPLAIN
|
|
{
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<except1,2>",
|
|
"access_type": "ALL",
|
|
"query_specifications": [
|
|
{
|
|
"query_block": {
|
|
"select_id": 1,
|
|
"table": {
|
|
"table_name": "t1",
|
|
"access_type": "ALL",
|
|
"rows": 2,
|
|
"filtered": 100
|
|
},
|
|
"block-nl-join": {
|
|
"table": {
|
|
"table_name": "t3",
|
|
"access_type": "ALL",
|
|
"rows": 2,
|
|
"filtered": 100
|
|
},
|
|
"buffer_type": "flat",
|
|
"buffer_size": "119",
|
|
"join_type": "BNL"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"operation": "EXCEPT",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"rows": 2,
|
|
"filtered": 100
|
|
},
|
|
"block-nl-join": {
|
|
"table": {
|
|
"table_name": "t4",
|
|
"access_type": "ALL",
|
|
"rows": 2,
|
|
"filtered": 100
|
|
},
|
|
"buffer_type": "flat",
|
|
"buffer_size": "119",
|
|
"join_type": "BNL"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
ANALYZE format=json (select a,b,e,f from t1,t3) except (select c,d,g,h from t2,t4);
|
|
ANALYZE
|
|
{
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<except1,2>",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"r_rows": 3,
|
|
"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": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"block-nl-join": {
|
|
"table": {
|
|
"table_name": "t3",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"buffer_type": "flat",
|
|
"buffer_size": "119",
|
|
"join_type": "BNL",
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 2,
|
|
"operation": "EXCEPT",
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"block-nl-join": {
|
|
"table": {
|
|
"table_name": "t4",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"buffer_type": "flat",
|
|
"buffer_size": "119",
|
|
"join_type": "BNL",
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
ANALYZE format=json select * from ((select a,b,e,f from t1,t3) except
|
|
(select c,d,g,h from t2,t4)) 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": 4,
|
|
"r_rows": 3,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100,
|
|
"materialized": {
|
|
"query_block": {
|
|
"union_result": {
|
|
"table_name": "<except2,3>",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"r_rows": 3,
|
|
"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": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"block-nl-join": {
|
|
"table": {
|
|
"table_name": "t3",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"buffer_type": "flat",
|
|
"buffer_size": "119",
|
|
"join_type": "BNL",
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"query_block": {
|
|
"select_id": 3,
|
|
"operation": "EXCEPT",
|
|
"r_loops": 1,
|
|
"r_total_time_ms": "REPLACED",
|
|
"table": {
|
|
"table_name": "t2",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"block-nl-join": {
|
|
"table": {
|
|
"table_name": "t4",
|
|
"access_type": "ALL",
|
|
"r_loops": 1,
|
|
"rows": 2,
|
|
"r_rows": 2,
|
|
"r_total_time_ms": "REPLACED",
|
|
"filtered": 100,
|
|
"r_filtered": 100
|
|
},
|
|
"buffer_type": "flat",
|
|
"buffer_size": "119",
|
|
"join_type": "BNL",
|
|
"r_filtered": 100
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
select * from ((select a,b,e,f from t1,t3) except (select c,d,g,h from t2,t4)) a;
|
|
a b e f
|
|
1 1 4 4
|
|
1 1 5 5
|
|
2 2 5 5
|
|
prepare stmt from "(select a,b,e,f from t1,t3) except (select c,d,g,h from t2,t4)";
|
|
execute stmt;
|
|
a b e f
|
|
1 1 4 4
|
|
1 1 5 5
|
|
2 2 5 5
|
|
execute stmt;
|
|
a b e f
|
|
1 1 4 4
|
|
1 1 5 5
|
|
2 2 5 5
|
|
prepare stmt from "select * from ((select a,b,e,f from t1,t3) except (select c,d,g,h from t2,t4)) a";
|
|
execute stmt;
|
|
a b e f
|
|
1 1 4 4
|
|
1 1 5 5
|
|
2 2 5 5
|
|
execute stmt;
|
|
a b e f
|
|
1 1 4 4
|
|
1 1 5 5
|
|
2 2 5 5
|
|
drop tables t1,t2,t3,t4;
|
|
select 1 as a from dual except select 1 from dual;
|
|
a
|
|
(select 1 from dual) except (select 1 from dual);
|
|
1
|
|
(select 1 from dual into @v) except (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) except (select 1 from dual)' at line 1
|
|
select 1 from dual ORDER BY 1 except 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 'except 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 except 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) engine=MyISAM;
|
|
create table t2 (c int, d blob, c1 int, d1 blob) engine=MyISAM;
|
|
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) except (select c,d,d1 from t2);
|
|
a b b1
|
|
1 ddd sdfrrwwww
|
|
create table t3 (select a,b,b1 from t1) except (select c,d,d1 from t2);
|
|
show create table t3;
|
|
Table Create Table
|
|
t3 CREATE TABLE `t3` (
|
|
`a` int(11) DEFAULT NULL,
|
|
`b` blob DEFAULT NULL,
|
|
`b1` blob DEFAULT NULL
|
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
|
drop tables t1,t2,t3;
|
|
#
|
|
# MDEV-13723: Server crashes in ha_heap::find_unique_row or
|
|
# Assertion `0' failed in st_select_lex_unit::optimize with INTERSECT
|
|
#
|
|
CREATE TABLE t (i INT);
|
|
INSERT INTO t VALUES (1),(2);
|
|
SELECT * FROM t WHERE i != ANY ( SELECT 3 EXCEPT SELECT 3 );
|
|
i
|
|
drop table t;
|
|
# End of 10.3 tests
|