mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-334: Backport of UNION ALL optimization from mysql-5.7.
Although the original code of mysql-5.7 was adjusted to the current MariaDB code the main ideas of the optimization were preserved.
This commit is contained in:
@ -102,7 +102,6 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 8
|
||||
2 DERIVED t1 ALL NULL NULL NULL NULL 4
|
||||
3 UNION t1 ALL NULL NULL NULL NULL 4
|
||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
||||
CREATE TABLE t2 (a int not null);
|
||||
insert into t2 values(1);
|
||||
select * from (select * from t1 where t1.a=(select a from t2 where t2.a=t1.a)) a;
|
||||
|
@ -126,7 +126,7 @@ group by
|
||||
a.text, b.id, b.betreff
|
||||
order by
|
||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||
ERROR 42000: Table 'b' from one of the SELECTs cannot be used in field list
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
@ -142,7 +142,7 @@ where
|
||||
match(c.beitrag) against ('+abc' in boolean mode)
|
||||
order by
|
||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||
ERROR 42000: Table 'b' from one of the SELECTs cannot be used in field list
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
@ -158,7 +158,7 @@ where
|
||||
match(c.beitrag) against ('+abc' in boolean mode)
|
||||
order by
|
||||
match(betreff) against ('+abc' in boolean mode) desc;
|
||||
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||
text id betreff
|
||||
(select b.id, b.betreff from t3 b) union
|
||||
(select b.id, b.betreff from t3 b)
|
||||
order by match(betreff) against ('+abc' in boolean mode) desc;
|
||||
|
@ -3138,7 +3138,6 @@ explain partitions select 1 from t1 union all select 2;
|
||||
id select_type table partitions type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 NULL system NULL NULL NULL NULL 0 const row not found
|
||||
2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
NULL UNION RESULT <union1,2> NULL ALL NULL NULL NULL NULL NULL
|
||||
drop table t1;
|
||||
create table t1 (a bigint unsigned not null) partition by range(a) (
|
||||
partition p0 values less than (10),
|
||||
|
@ -1052,6 +1052,8 @@ create table t1 (a float);
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1 UNION SELECT 1.5);
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
select 10.5 IN (SELECT * from t1 UNION SELECT 1.5 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
drop table t1;
|
||||
create table t1 (a int, b int, c varchar(10));
|
||||
|
@ -1056,6 +1056,8 @@ create table t1 (a float);
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1 UNION SELECT 1.5);
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
select 10.5 IN (SELECT * from t1 UNION SELECT 1.5 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
drop table t1;
|
||||
create table t1 (a int, b int, c varchar(10));
|
||||
|
@ -1059,6 +1059,8 @@ create table t1 (a float);
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1 UNION SELECT 1.5);
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
select 10.5 IN (SELECT * from t1 UNION SELECT 1.5 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
drop table t1;
|
||||
create table t1 (a int, b int, c varchar(10));
|
||||
|
@ -1055,6 +1055,8 @@ create table t1 (a float);
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1 UNION SELECT 1.5);
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
select 10.5 IN (SELECT * from t1 UNION SELECT 1.5 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
drop table t1;
|
||||
create table t1 (a int, b int, c varchar(10));
|
||||
|
@ -1058,6 +1058,8 @@ create table t1 (a float);
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1 UNION SELECT 1.5);
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
select 10.5 IN (SELECT * from t1 UNION SELECT 1.5 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
drop table t1;
|
||||
create table t1 (a int, b int, c varchar(10));
|
||||
|
@ -1055,6 +1055,8 @@ create table t1 (a float);
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1 UNION SELECT 1.5);
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
select 10.5 IN (SELECT * from t1 UNION SELECT 1.5 LIMIT 1);
|
||||
ERROR 42000: This version of MariaDB doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||
drop table t1;
|
||||
create table t1 (a int, b int, c varchar(10));
|
||||
|
@ -107,7 +107,6 @@ explain select a,b from t1 union all select a,b from t2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4
|
||||
2 UNION t2 ALL NULL NULL NULL NULL 4
|
||||
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL
|
||||
explain select xx from t1 union select 1;
|
||||
ERROR 42S22: Unknown column 'xx' in 'field list'
|
||||
explain select a,b from t1 union select 1;
|
||||
@ -341,14 +340,13 @@ select found_rows();
|
||||
found_rows()
|
||||
4
|
||||
(SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1) UNION SELECT * FROM t2 LIMIT 1;
|
||||
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 '' at line 1
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION all SELECT * FROM t2 LIMIT 2;
|
||||
a
|
||||
1
|
||||
3
|
||||
select found_rows();
|
||||
found_rows()
|
||||
6
|
||||
4
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION all SELECT * FROM t2 LIMIT 2;
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION all SELECT * FROM t2 LIMIT 2;
|
||||
a
|
||||
1
|
||||
@ -362,7 +360,7 @@ a
|
||||
2
|
||||
select found_rows();
|
||||
found_rows()
|
||||
6
|
||||
5
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION SELECT * FROM t2 LIMIT 100;
|
||||
a
|
||||
1
|
||||
@ -374,31 +372,11 @@ select found_rows();
|
||||
found_rows()
|
||||
5
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 100 UNION SELECT * FROM t2;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
select found_rows();
|
||||
found_rows()
|
||||
5
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION SELECT * FROM t2;
|
||||
a
|
||||
1
|
||||
3
|
||||
4
|
||||
5
|
||||
select found_rows();
|
||||
found_rows()
|
||||
6
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION SELECT * FROM t2 LIMIT 2;
|
||||
a
|
||||
1
|
||||
3
|
||||
select found_rows();
|
||||
found_rows()
|
||||
6
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION SELECT * FROM t2 LIMIT 2,2;
|
||||
a
|
||||
3
|
||||
@ -407,13 +385,7 @@ select found_rows();
|
||||
found_rows()
|
||||
5
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 limit 2,2 UNION SELECT * FROM t2;
|
||||
a
|
||||
3
|
||||
4
|
||||
5
|
||||
select found_rows();
|
||||
found_rows()
|
||||
5
|
||||
ERROR HY000: Incorrect usage of UNION and LIMIT
|
||||
SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY a desc LIMIT 1;
|
||||
a
|
||||
5
|
||||
@ -430,7 +402,7 @@ drop temporary table t1;
|
||||
create table t1 select a from t1 union select a from t2;
|
||||
ERROR 42S01: Table 't1' already exists
|
||||
select a from t1 union select a from t2 order by t2.a;
|
||||
ERROR 42S22: Unknown column 't2.a' in 'order clause'
|
||||
ERROR 42000: Table 't2' from one of the SELECTs cannot be used in field list
|
||||
drop table t1,t2;
|
||||
select length(version()) > 1 as `*` UNION select 2;
|
||||
*
|
||||
@ -1202,32 +1174,32 @@ foo
|
||||
bar
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
a ENUM('<EFBFBD>','<EFBFBD>','<EFBFBD>') character set utf8 not null default '<EFBFBD>',
|
||||
a ENUM('ä','ö','ü') character set utf8 not null default 'ü',
|
||||
b ENUM("one", "two") character set utf8,
|
||||
c ENUM("one", "two")
|
||||
);
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` enum('<EFBFBD>','<EFBFBD>','<EFBFBD>') CHARACTER SET utf8 NOT NULL DEFAULT '<EFBFBD>',
|
||||
`a` enum('ä','ö','ü') CHARACTER SET utf8 NOT NULL DEFAULT 'ü',
|
||||
`b` enum('one','two') CHARACTER SET utf8 DEFAULT NULL,
|
||||
`c` enum('one','two') DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
insert into t1 values ('<EFBFBD>', 'one', 'one'), ('<EFBFBD>', 'two', 'one'), ('<EFBFBD>', NULL, NULL);
|
||||
insert into t1 values ('ä', 'one', 'one'), ('ö', 'two', 'one'), ('ü', NULL, NULL);
|
||||
create table t2 select NULL union select a from t1;
|
||||
show columns from t2;
|
||||
Field Type Null Key Default Extra
|
||||
NULL enum('<EFBFBD>','<EFBFBD>','<EFBFBD>') YES NULL
|
||||
NULL enum('ä','ö','ü') YES NULL
|
||||
drop table t2;
|
||||
create table t2 select a from t1 union select NULL;
|
||||
show columns from t2;
|
||||
Field Type Null Key Default Extra
|
||||
a enum('<EFBFBD>','<EFBFBD>','<EFBFBD>') YES NULL
|
||||
a enum('ä','ö','ü') YES NULL
|
||||
drop table t2;
|
||||
create table t2 select a from t1 union select a from t1;
|
||||
show columns from t2;
|
||||
Field Type Null Key Default Extra
|
||||
a varchar(1) NO
|
||||
a varchar(2) NO
|
||||
drop table t2;
|
||||
create table t2 select a from t1 union select c from t1;
|
||||
drop table t2;
|
||||
@ -1616,11 +1588,18 @@ a
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||
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 t1 ALL NULL NULL NULL NULL 2 100.00
|
||||
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` union select `test`.`t1`.`a` AS `a` from `test`.`t1` order by (match `a` against ('+abc' in boolean mode))
|
||||
# Should not crash
|
||||
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||
a
|
||||
1
|
||||
2
|
||||
# Should not crash
|
||||
(SELECT * FROM t1) UNION (SELECT * FROM t1)
|
||||
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||
@ -1638,7 +1617,7 @@ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
|
||||
3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||
Warnings:
|
||||
Note 1276 Field or reference 'a' of SELECT #3 was resolved in SELECT #-1
|
||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` union select `test`.`t1`.`a` AS `a` from `test`.`t1` order by (select `a` from `test`.`t2` where (`test`.`t2`.`b` = 12))
|
||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` union select `test`.`t1`.`a` AS `a` from `test`.`t1` order by <expr_cache><>((select `a` from `test`.`t2` where (`test`.`t2`.`b` = 12)))
|
||||
# Should not crash
|
||||
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||
ORDER BY (SELECT a FROM t2 WHERE b = 12);
|
||||
@ -1901,3 +1880,94 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
3 UNION t1 ALL NULL NULL NULL NULL 4
|
||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
||||
drop table t1;
|
||||
#
|
||||
# WL#1763 Avoid creating temporary table in UNION ALL
|
||||
#
|
||||
EXPLAIN SELECT 1 UNION ALL SELECT 1 LIMIT 1 OFFSET 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
2 UNION NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
# Bug #17579498 CHANGES IN DATATYPE OF THE RESULT QUERY IN UNION.
|
||||
CREATE TABLE t1 (a TIME);
|
||||
CREATE TABLE t2 (b DATETIME);
|
||||
CREATE TABLE t3
|
||||
SELECT a FROM t1 UNION ALL SELECT b FROM t2;
|
||||
SELECT column_name, column_type
|
||||
FROM information_schema.columns
|
||||
WHERE TABLE_NAME='t3';
|
||||
column_name column_type
|
||||
a datetime
|
||||
DROP TABLE t1, t2, t3;
|
||||
# Bug #17602922 RESULT DIFFERENCES IN UNION QUERIES WITH IN
|
||||
# (SUBQUERY-UNION ALL)
|
||||
CREATE TABLE t1 (a VARCHAR(1));
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES ('j');
|
||||
INSERT INTO t1 VALUES ('k');
|
||||
INSERT INTO t1 VALUES ('r');
|
||||
INSERT INTO t1 VALUES ('r');
|
||||
INSERT INTO t1 VALUES ('h');
|
||||
SELECT a FROM t1 WHERE a IN (SELECT 'r' FROM t1 UNION ALL SELECT 'j');
|
||||
a
|
||||
j
|
||||
r
|
||||
r
|
||||
CREATE TABLE t2
|
||||
SELECT a FROM t1 WHERE a IN (SELECT 'r' FROM t1 UNION ALL SELECT 'j');
|
||||
SELECT * FROM t2;
|
||||
a
|
||||
j
|
||||
r
|
||||
r
|
||||
DROP TABLE t1, t2;
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY);
|
||||
CREATE TABLE t2 (a INT PRIMARY KEY);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
SELECT a, SUM(a) FROM t2 UNION ALL SELECT a, MIN(a) FROM t1 ;
|
||||
a SUM(a)
|
||||
1 1
|
||||
NULL NULL
|
||||
SELECT FOUND_ROWS();
|
||||
FOUND_ROWS()
|
||||
2
|
||||
DROP TABLE t1, t2;
|
||||
# Bug #17669551 CRASH/ASSERT AT SELECT_CREATE::PREPARE2 AT
|
||||
# SQL_INSERT.CC
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TABLE t2 SELECT a, a FROM t1 UNION ALL SELECT a, a FROM t1;
|
||||
ERROR 42S21: Duplicate column name 'a'
|
||||
DROP TABLE t1;
|
||||
# Bug #17694956 RESULT DIFFERENCES IN UNION ALL QUERIES WITH LIMIT
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
(SELECT a FROM t1 ORDER BY a LIMIT 0) UNION ALL SELECT a FROM t1;
|
||||
a
|
||||
1
|
||||
DROP TABLE t1;
|
||||
# Bug #17708480 FOUND_ROWS() VALUE DO NOT MATCH WITH UNION ALL QUERIES
|
||||
CREATE TABLE t1 (a INT) ENGINE=MEMORY;
|
||||
CREATE TABLE t2 (a INT) ENGINE=MEMORY;
|
||||
INSERT INTO t2 VALUES (1);
|
||||
SELECT COUNT(*) FROM (
|
||||
SELECT * FROM t2 UNION ALL SELECT * FROM t1) q;
|
||||
COUNT(*)
|
||||
1
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t2 UNION ALL SELECT * FROM t1;
|
||||
a
|
||||
1
|
||||
SELECT FOUND_ROWS();
|
||||
FOUND_ROWS()
|
||||
1
|
||||
SELECT COUNT(*) FROM (
|
||||
SELECT * FROM t1 UNION ALL SELECT * FROM t2) q;
|
||||
COUNT(*)
|
||||
1
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION ALL SELECT * FROM t2;
|
||||
a
|
||||
1
|
||||
SELECT FOUND_ROWS();
|
||||
FOUND_ROWS()
|
||||
1
|
||||
DROP TABLE t1, t2;
|
||||
# End of WL1763 tests
|
||||
|
@ -140,16 +140,6 @@ key_len NULL
|
||||
ref NULL
|
||||
rows NULL
|
||||
Extra No tables used
|
||||
id NULL
|
||||
select_type UNION RESULT
|
||||
table <union2,3>
|
||||
type ALL
|
||||
possible_keys NULL
|
||||
key NULL
|
||||
key_len NULL
|
||||
ref NULL
|
||||
rows NULL
|
||||
Extra
|
||||
#
|
||||
# Demonstrate that the reported SELECT statement
|
||||
# no longer produces warnings.
|
||||
@ -344,16 +334,6 @@ key_len NULL
|
||||
ref NULL
|
||||
rows NULL
|
||||
Extra No tables used
|
||||
id NULL
|
||||
select_type UNION RESULT
|
||||
table <union2,3>
|
||||
type ALL
|
||||
possible_keys NULL
|
||||
key NULL
|
||||
key_len NULL
|
||||
ref NULL
|
||||
rows NULL
|
||||
Extra
|
||||
# Lock the record.
|
||||
select 1 from t1 natural join (select 3 as a, 2 as b union all
|
||||
select 3 as a, 1 as b) as t2 for update;
|
||||
|
@ -158,11 +158,18 @@ a
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||
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 t1 ALL NULL NULL NULL NULL 2 100.00
|
||||
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` union select `test`.`t1`.`a` AS `a` from `test`.`t1` order by (match `a` against ('+abc' in boolean mode))
|
||||
# Should not crash
|
||||
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||
a
|
||||
1
|
||||
2
|
||||
# Should not crash
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||
@ -174,7 +181,7 @@ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
|
||||
3 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||
Warnings:
|
||||
Note 1276 Field or reference 'a' of SELECT #3 was resolved in SELECT #-1
|
||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` union select `test`.`t1`.`a` AS `a` from `test`.`t1` order by (select `a` from `test`.`t2` where (`test`.`t2`.`b` = 12))
|
||||
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` union select `test`.`t1`.`a` AS `a` from `test`.`t1` order by <expr_cache><>((select `a` from `test`.`t2` where (`test`.`t2`.`b` = 12)))
|
||||
# Should not crash
|
||||
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||
ORDER BY (SELECT a FROM t2 WHERE b = 12);
|
||||
|
@ -129,7 +129,7 @@ group by
|
||||
a.text, b.id, b.betreff
|
||||
order by
|
||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||
ERROR 42000: Table 'b' from one of the SELECTs cannot be used in field list
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
@ -145,7 +145,7 @@ where
|
||||
match(c.beitrag) against ('+abc' in boolean mode)
|
||||
order by
|
||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||
ERROR 42000: Table 'b' from one of the SELECTs cannot be used in field list
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
@ -161,7 +161,7 @@ where
|
||||
match(c.beitrag) against ('+abc' in boolean mode)
|
||||
order by
|
||||
match(betreff) against ('+abc' in boolean mode) desc;
|
||||
ERROR 42000: Incorrect usage/placement of 'MATCH()'
|
||||
text id betreff
|
||||
(select b.id, b.betreff from t3 b) union
|
||||
(select b.id, b.betreff from t3 b)
|
||||
order by match(betreff) against ('+abc' in boolean mode) desc;
|
||||
|
@ -177,13 +177,11 @@ SELECT * FROM t1 UNION SELECT * FROM t1 ORDER BY a + 12;
|
||||
|
||||
|
||||
--echo # Should not crash
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||
|
||||
--echo # Should not crash
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||
|
||||
|
@ -93,7 +93,7 @@ CREATE TABLE t3 (
|
||||
FULLTEXT KEY betreff (betreff)
|
||||
) ENGINE = InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=996 ;
|
||||
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
--error ER_TABLENAME_NOT_ALLOWED_HERE
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
@ -113,7 +113,7 @@ group by
|
||||
order by
|
||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
--error ER_TABLENAME_NOT_ALLOWED_HERE
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
@ -130,7 +130,6 @@ where
|
||||
order by
|
||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
|
@ -80,7 +80,7 @@ CREATE TABLE t3 (
|
||||
FULLTEXT KEY betreff (betreff)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=996 ;
|
||||
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
--error ER_TABLENAME_NOT_ALLOWED_HERE
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
@ -100,7 +100,7 @@ group by
|
||||
order by
|
||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
--error ER_TABLENAME_NOT_ALLOWED_HERE
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
@ -117,7 +117,6 @@ where
|
||||
order by
|
||||
match(b.betreff) against ('+abc' in boolean mode) desc;
|
||||
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
select a.text, b.id, b.betreff
|
||||
from
|
||||
t2 a inner join t3 b on a.id = b.forum inner join
|
||||
|
@ -569,8 +569,10 @@ drop table t1, t2;
|
||||
create table t1 (a float);
|
||||
-- error ER_NOT_SUPPORTED_YET
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||
-- error ER_NOT_SUPPORTED_YET
|
||||
-- error ER_WRONG_USAGE
|
||||
select 10.5 IN (SELECT * from t1 LIMIT 1 UNION SELECT 1.5);
|
||||
-- error ER_NOT_SUPPORTED_YET
|
||||
select 10.5 IN (SELECT * from t1 UNION SELECT 1.5 LIMIT 1);
|
||||
drop table t1;
|
||||
|
||||
create table t1 (a int, b int, c varchar(10));
|
||||
|
@ -216,14 +216,12 @@ select found_rows();
|
||||
select found_rows();
|
||||
(SELECT SQL_CALC_FOUND_ROWS * FROM t1) UNION all (SELECT * FROM t2 LIMIT 1);
|
||||
select found_rows();
|
||||
# This used to work in 4.0 but not anymore in 4.1
|
||||
--error 1064
|
||||
(SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1) UNION SELECT * FROM t2 LIMIT 1;
|
||||
#select found_rows();
|
||||
select found_rows();
|
||||
|
||||
# In these case found_rows() should work
|
||||
--error ER_WRONG_USAGE
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION all SELECT * FROM t2 LIMIT 2;
|
||||
select found_rows();
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION all SELECT * FROM t2 LIMIT 2;
|
||||
select found_rows();
|
||||
|
||||
@ -232,16 +230,16 @@ SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION SELECT * FROM t2 LIMIT 2;
|
||||
select found_rows();
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION SELECT * FROM t2 LIMIT 100;
|
||||
select found_rows();
|
||||
--error ER_WRONG_USAGE
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 100 UNION SELECT * FROM t2;
|
||||
select found_rows();
|
||||
--error ER_WRONG_USAGE
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION SELECT * FROM t2;
|
||||
select found_rows();
|
||||
--error ER_WRONG_USAGE
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION SELECT * FROM t2 LIMIT 2;
|
||||
select found_rows();
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION SELECT * FROM t2 LIMIT 2,2;
|
||||
select found_rows();
|
||||
--error ER_WRONG_USAGE
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 limit 2,2 UNION SELECT * FROM t2;
|
||||
select found_rows();
|
||||
|
||||
# Test some limits with ORDER BY
|
||||
SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY a desc LIMIT 1;
|
||||
@ -255,7 +253,7 @@ create temporary table t1 select a from t1 union select a from t2;
|
||||
drop temporary table t1;
|
||||
--error ER_TABLE_EXISTS_ERROR
|
||||
create table t1 select a from t1 union select a from t2;
|
||||
--error 1054
|
||||
--error ER_TABLENAME_NOT_ALLOWED_HERE
|
||||
select a from t1 union select a from t2 order by t2.a;
|
||||
drop table t1,t2;
|
||||
|
||||
@ -723,12 +721,12 @@ drop table t1;
|
||||
# Enum merging test
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
a ENUM('<EFBFBD>','<EFBFBD>','<EFBFBD>') character set utf8 not null default '<EFBFBD>',
|
||||
a ENUM('ä','ö','ü') character set utf8 not null default 'ü',
|
||||
b ENUM("one", "two") character set utf8,
|
||||
c ENUM("one", "two")
|
||||
);
|
||||
show create table t1;
|
||||
insert into t1 values ('<EFBFBD>', 'one', 'one'), ('<EFBFBD>', 'two', 'one'), ('<EFBFBD>', NULL, NULL);
|
||||
insert into t1 values ('ä', 'one', 'one'), ('ö', 'two', 'one'), ('ü', NULL, NULL);
|
||||
create table t2 select NULL union select a from t1;
|
||||
show columns from t2;
|
||||
drop table t2;
|
||||
@ -1086,13 +1084,11 @@ SELECT * FROM t1 UNION SELECT * FROM t1 ORDER BY a + 12;
|
||||
|
||||
|
||||
--echo # Should not crash
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
EXPLAIN EXTENDED
|
||||
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||
|
||||
--echo # Should not crash
|
||||
--error ER_CANT_USE_OPTION_HERE
|
||||
SELECT * FROM t1 UNION SELECT * FROM t1
|
||||
ORDER BY MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE);
|
||||
|
||||
@ -1300,3 +1296,94 @@ create table t1 (a int);
|
||||
insert t1 values (1),(2),(3),(1);
|
||||
explain select 1 from dual where exists (select max(a) from t1 group by a union select a+2 from t1);
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # WL#1763 Avoid creating temporary table in UNION ALL
|
||||
--echo #
|
||||
|
||||
EXPLAIN SELECT 1 UNION ALL SELECT 1 LIMIT 1 OFFSET 1;
|
||||
|
||||
--echo # Bug #17579498 CHANGES IN DATATYPE OF THE RESULT QUERY IN UNION.
|
||||
|
||||
CREATE TABLE t1 (a TIME);
|
||||
CREATE TABLE t2 (b DATETIME);
|
||||
|
||||
CREATE TABLE t3
|
||||
SELECT a FROM t1 UNION ALL SELECT b FROM t2;
|
||||
|
||||
SELECT column_name, column_type
|
||||
FROM information_schema.columns
|
||||
WHERE TABLE_NAME='t3';
|
||||
|
||||
DROP TABLE t1, t2, t3;
|
||||
|
||||
--echo # Bug #17602922 RESULT DIFFERENCES IN UNION QUERIES WITH IN
|
||||
--echo # (SUBQUERY-UNION ALL)
|
||||
|
||||
CREATE TABLE t1 (a VARCHAR(1));
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES ('j');
|
||||
INSERT INTO t1 VALUES ('k');
|
||||
INSERT INTO t1 VALUES ('r');
|
||||
INSERT INTO t1 VALUES ('r');
|
||||
INSERT INTO t1 VALUES ('h');
|
||||
|
||||
SELECT a FROM t1 WHERE a IN (SELECT 'r' FROM t1 UNION ALL SELECT 'j');
|
||||
|
||||
CREATE TABLE t2
|
||||
SELECT a FROM t1 WHERE a IN (SELECT 'r' FROM t1 UNION ALL SELECT 'j');
|
||||
|
||||
SELECT * FROM t2;
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY);
|
||||
CREATE TABLE t2 (a INT PRIMARY KEY);
|
||||
INSERT INTO t2 VALUES (1);
|
||||
|
||||
SELECT a, SUM(a) FROM t2 UNION ALL SELECT a, MIN(a) FROM t1 ;
|
||||
|
||||
SELECT FOUND_ROWS();
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo # Bug #17669551 CRASH/ASSERT AT SELECT_CREATE::PREPARE2 AT
|
||||
--echo # SQL_INSERT.CC
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
|
||||
--error ER_DUP_FIELDNAME
|
||||
CREATE TABLE t2 SELECT a, a FROM t1 UNION ALL SELECT a, a FROM t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # Bug #17694956 RESULT DIFFERENCES IN UNION ALL QUERIES WITH LIMIT
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
(SELECT a FROM t1 ORDER BY a LIMIT 0) UNION ALL SELECT a FROM t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # Bug #17708480 FOUND_ROWS() VALUE DO NOT MATCH WITH UNION ALL QUERIES
|
||||
|
||||
CREATE TABLE t1 (a INT) ENGINE=MEMORY;
|
||||
CREATE TABLE t2 (a INT) ENGINE=MEMORY;
|
||||
INSERT INTO t2 VALUES (1);
|
||||
|
||||
SELECT COUNT(*) FROM (
|
||||
SELECT * FROM t2 UNION ALL SELECT * FROM t1) q;
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t2 UNION ALL SELECT * FROM t1;
|
||||
SELECT FOUND_ROWS();
|
||||
|
||||
SELECT COUNT(*) FROM (
|
||||
SELECT * FROM t1 UNION ALL SELECT * FROM t2) q;
|
||||
SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION ALL SELECT * FROM t2;
|
||||
SELECT FOUND_ROWS();
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo # End of WL1763 tests
|
||||
|
||||
|
Reference in New Issue
Block a user