mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 10:14:19 +01:00
Automatic merge with MWL148
This commit is contained in:
commit
8840823369
17 changed files with 494 additions and 259 deletions
|
@ -176,11 +176,15 @@ SELECT @@session.sql_mode INTO @old_sql_mode;
|
|||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||
EXPLAIN EXTENDED SELECT 1 FROM t1
|
||||
WHERE f1 > ALL( SELECT t.f1 FROM t1,t1 AS t );
|
||||
ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
2 SUBQUERY t1 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
2 SUBQUERY t system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select 1 AS `1` from `test`.`t1` where 0
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Error 1140 Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
||||
Note 1003 select 1 AS `1` from `test`.`t1` where <not>(<exists>(...))
|
||||
Note 1003 select 1 AS `1` from `test`.`t1` where 0
|
||||
SET SESSION sql_mode=@old_sql_mode;
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests.
|
||||
|
@ -272,12 +276,12 @@ PREPARE stmt FROM
|
|||
EXECUTE stmt;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 1
|
||||
2 SUBQUERY a system NULL NULL NULL NULL 1 Using filesort
|
||||
2 SUBQUERY a system NULL NULL NULL NULL 1
|
||||
2 SUBQUERY t1 fulltext f1 f1 0 1 Using where
|
||||
EXECUTE stmt;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 1
|
||||
2 SUBQUERY a system NULL NULL NULL NULL 1 Using filesort
|
||||
2 SUBQUERY a system NULL NULL NULL NULL 1
|
||||
2 SUBQUERY t1 fulltext f1 f1 0 1 Using where
|
||||
DEALLOCATE PREPARE stmt;
|
||||
PREPARE stmt FROM
|
||||
|
@ -288,12 +292,12 @@ PREPARE stmt FROM
|
|||
EXECUTE stmt;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 1
|
||||
2 SUBQUERY a system NULL NULL NULL NULL 1 Using filesort
|
||||
2 SUBQUERY a system NULL NULL NULL NULL 1
|
||||
2 SUBQUERY t1 fulltext f1 f1 0 1 Using where
|
||||
EXECUTE stmt;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 system NULL NULL NULL NULL 1
|
||||
2 SUBQUERY a system NULL NULL NULL NULL 1 Using filesort
|
||||
2 SUBQUERY a system NULL NULL NULL NULL 1
|
||||
2 SUBQUERY t1 fulltext f1 f1 0 1 Using where
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -273,7 +273,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 3 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`))))
|
||||
select * from t3 where a >= all (select b from t2);
|
||||
a
|
||||
7
|
||||
|
@ -1503,7 +1503,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < (select max(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` < (select max(NULL) from `test`.`t2`))))
|
||||
select * from t3 where a >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2);
|
||||
|
@ -1511,7 +1511,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where a >= all (select b from t2 group by 1);
|
||||
a
|
||||
6
|
||||
|
@ -1522,7 +1522,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < <max>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` < <max>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where a >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2 group by 1);
|
||||
|
@ -1530,7 +1530,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where NULL >= any (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2);
|
||||
|
@ -1538,7 +1538,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
|
@ -1546,7 +1546,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where NULL >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2);
|
||||
|
@ -1554,7 +1554,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
|
@ -1562,7 +1562,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
insert into t2 values (2,2), (2,1), (3,3), (3,1);
|
||||
select * from t3 where a > all (select max(b) from t2 group by a);
|
||||
a
|
||||
|
@ -1573,7 +1573,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 4 100.00 Using temporary
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` <= <max>(select max(`test`.`t2`.`b`) from `test`.`t2` group by `test`.`t2`.`a`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` <= <max>(select max(`test`.`t2`.`b`) from `test`.`t2` group by `test`.`t2`.`a`))))
|
||||
drop table t2, t3;
|
||||
CREATE TABLE `t1` ( `id` mediumint(9) NOT NULL auto_increment, `taskid` bigint(20) NOT NULL default '0', `dbid` int(11) NOT NULL default '0', `create_date` datetime NOT NULL default '0000-00-00 00:00:00', `last_update` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`id`)) ENGINE=MyISAM CHARSET=latin1 AUTO_INCREMENT=3 ;
|
||||
INSERT INTO `t1` (`id`, `taskid`, `dbid`, `create_date`,`last_update`) VALUES (1, 1, 15, '2003-09-29 10:31:36', '2003-09-29 10:31:36'), (2, 1, 21, now(), now());
|
||||
|
@ -1624,7 +1624,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
3 UNION t1 system NULL NULL NULL NULL 1 100.00
|
||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
|
||||
Warnings:
|
||||
Note 1003 select 'e' AS `s1` from `test`.`t1` where <nop>(('f' > <min>(select 'e' from `test`.`t1` union select 'e' from `test`.`t1`)))
|
||||
Note 1003 select 'e' AS `s1` from `test`.`t1` where <nop>(<in_optimizer>('f',('f' > <min>(select 'e' from `test`.`t1` union select 'e' from `test`.`t1`))))
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (number char(11) NOT NULL default '') ENGINE=MyISAM CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES ('69294728265'),('18621828126'),('89356874041'),('95895001874');
|
||||
|
|
|
@ -277,7 +277,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 3 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`))))
|
||||
select * from t3 where a >= all (select b from t2);
|
||||
a
|
||||
7
|
||||
|
@ -1507,7 +1507,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < (select max(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` < (select max(NULL) from `test`.`t2`))))
|
||||
select * from t3 where a >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2);
|
||||
|
@ -1515,7 +1515,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where a >= all (select b from t2 group by 1);
|
||||
a
|
||||
6
|
||||
|
@ -1526,7 +1526,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < <max>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` < <max>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where a >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2 group by 1);
|
||||
|
@ -1534,7 +1534,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where NULL >= any (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2);
|
||||
|
@ -1542,7 +1542,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
|
@ -1550,7 +1550,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where NULL >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2);
|
||||
|
@ -1558,7 +1558,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
|
@ -1566,7 +1566,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
insert into t2 values (2,2), (2,1), (3,3), (3,1);
|
||||
select * from t3 where a > all (select max(b) from t2 group by a);
|
||||
a
|
||||
|
@ -1577,7 +1577,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 4 100.00 Using temporary
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` <= <max>(select max(`test`.`t2`.`b`) from `test`.`t2` group by `test`.`t2`.`a`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` <= <max>(select max(`test`.`t2`.`b`) from `test`.`t2` group by `test`.`t2`.`a`))))
|
||||
drop table t2, t3;
|
||||
CREATE TABLE `t1` ( `id` mediumint(9) NOT NULL auto_increment, `taskid` bigint(20) NOT NULL default '0', `dbid` int(11) NOT NULL default '0', `create_date` datetime NOT NULL default '0000-00-00 00:00:00', `last_update` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`id`)) ENGINE=MyISAM CHARSET=latin1 AUTO_INCREMENT=3 ;
|
||||
INSERT INTO `t1` (`id`, `taskid`, `dbid`, `create_date`,`last_update`) VALUES (1, 1, 15, '2003-09-29 10:31:36', '2003-09-29 10:31:36'), (2, 1, 21, now(), now());
|
||||
|
@ -1628,7 +1628,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
3 UNION t1 system NULL NULL NULL NULL 1 100.00
|
||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
|
||||
Warnings:
|
||||
Note 1003 select 'e' AS `s1` from `test`.`t1` where <nop>(('f' > <min>(select 'e' from `test`.`t1` union select 'e' from `test`.`t1`)))
|
||||
Note 1003 select 'e' AS `s1` from `test`.`t1` where <nop>(<in_optimizer>('f',('f' > <min>(select 'e' from `test`.`t1` union select 'e' from `test`.`t1`))))
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (number char(11) NOT NULL default '') ENGINE=MyISAM CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES ('69294728265'),('18621828126'),('89356874041'),('95895001874');
|
||||
|
|
|
@ -274,7 +274,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 3 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`))))
|
||||
select * from t3 where a >= all (select b from t2);
|
||||
a
|
||||
7
|
||||
|
@ -1504,7 +1504,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < (select max(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` < (select max(NULL) from `test`.`t2`))))
|
||||
select * from t3 where a >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2);
|
||||
|
@ -1512,7 +1512,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where a >= all (select b from t2 group by 1);
|
||||
a
|
||||
6
|
||||
|
@ -1523,7 +1523,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < <max>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` < <max>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where a >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2 group by 1);
|
||||
|
@ -1531,7 +1531,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where NULL >= any (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2);
|
||||
|
@ -1539,7 +1539,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
|
@ -1547,7 +1547,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where NULL >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2);
|
||||
|
@ -1555,7 +1555,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
|
@ -1563,7 +1563,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
insert into t2 values (2,2), (2,1), (3,3), (3,1);
|
||||
select * from t3 where a > all (select max(b) from t2 group by a);
|
||||
a
|
||||
|
@ -1574,7 +1574,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 4 100.00 Using temporary
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` <= <max>(select max(`test`.`t2`.`b`) from `test`.`t2` group by `test`.`t2`.`a`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` <= <max>(select max(`test`.`t2`.`b`) from `test`.`t2` group by `test`.`t2`.`a`))))
|
||||
drop table t2, t3;
|
||||
CREATE TABLE `t1` ( `id` mediumint(9) NOT NULL auto_increment, `taskid` bigint(20) NOT NULL default '0', `dbid` int(11) NOT NULL default '0', `create_date` datetime NOT NULL default '0000-00-00 00:00:00', `last_update` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`id`)) ENGINE=MyISAM CHARSET=latin1 AUTO_INCREMENT=3 ;
|
||||
INSERT INTO `t1` (`id`, `taskid`, `dbid`, `create_date`,`last_update`) VALUES (1, 1, 15, '2003-09-29 10:31:36', '2003-09-29 10:31:36'), (2, 1, 21, now(), now());
|
||||
|
@ -1625,7 +1625,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
3 UNION t1 system NULL NULL NULL NULL 1 100.00
|
||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
|
||||
Warnings:
|
||||
Note 1003 select 'e' AS `s1` from `test`.`t1` where <nop>(('f' > <min>(select 'e' from `test`.`t1` union select 'e' from `test`.`t1`)))
|
||||
Note 1003 select 'e' AS `s1` from `test`.`t1` where <nop>(<in_optimizer>('f',('f' > <min>(select 'e' from `test`.`t1` union select 'e' from `test`.`t1`))))
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (number char(11) NOT NULL default '') ENGINE=MyISAM CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES ('69294728265'),('18621828126'),('89356874041'),('95895001874');
|
||||
|
|
|
@ -274,7 +274,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 3 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`))))
|
||||
select * from t3 where a >= all (select b from t2);
|
||||
a
|
||||
7
|
||||
|
@ -1504,7 +1504,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < (select max(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` < (select max(NULL) from `test`.`t2`))))
|
||||
select * from t3 where a >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2);
|
||||
|
@ -1512,7 +1512,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where a >= all (select b from t2 group by 1);
|
||||
a
|
||||
6
|
||||
|
@ -1523,7 +1523,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < <max>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` < <max>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where a >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2 group by 1);
|
||||
|
@ -1531,7 +1531,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where NULL >= any (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2);
|
||||
|
@ -1539,7 +1539,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
|
@ -1547,7 +1547,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
select * from t3 where NULL >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2);
|
||||
|
@ -1555,7 +1555,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= (select min(NULL) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= (select min(NULL) from `test`.`t2`))))
|
||||
select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
|
@ -1563,7 +1563,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= <min>(select NULL from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= <min>(select NULL from `test`.`t2` group by 1))))
|
||||
insert into t2 values (2,2), (2,1), (3,3), (3,1);
|
||||
select * from t3 where a > all (select max(b) from t2 group by a);
|
||||
a
|
||||
|
@ -1574,7 +1574,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 4 100.00 Using temporary
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` <= <max>(select max(`test`.`t2`.`b`) from `test`.`t2` group by `test`.`t2`.`a`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` <= <max>(select max(`test`.`t2`.`b`) from `test`.`t2` group by `test`.`t2`.`a`))))
|
||||
drop table t2, t3;
|
||||
CREATE TABLE `t1` ( `id` mediumint(9) NOT NULL auto_increment, `taskid` bigint(20) NOT NULL default '0', `dbid` int(11) NOT NULL default '0', `create_date` datetime NOT NULL default '0000-00-00 00:00:00', `last_update` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`id`)) ENGINE=MyISAM CHARSET=latin1 AUTO_INCREMENT=3 ;
|
||||
INSERT INTO `t1` (`id`, `taskid`, `dbid`, `create_date`,`last_update`) VALUES (1, 1, 15, '2003-09-29 10:31:36', '2003-09-29 10:31:36'), (2, 1, 21, now(), now());
|
||||
|
@ -1625,7 +1625,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
3 UNION t1 system NULL NULL NULL NULL 1 100.00
|
||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
|
||||
Warnings:
|
||||
Note 1003 select 'e' AS `s1` from `test`.`t1` where <nop>(('f' > <min>(select 'e' from `test`.`t1` union select 'e' from `test`.`t1`)))
|
||||
Note 1003 select 'e' AS `s1` from `test`.`t1` where <nop>(<in_optimizer>('f',('f' > <min>(select 'e' from `test`.`t1` union select 'e' from `test`.`t1`))))
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (number char(11) NOT NULL default '') ENGINE=MyISAM CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES ('69294728265'),('18621828126'),('89356874041'),('95895001874');
|
||||
|
|
|
@ -270,7 +270,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 3 100.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`))))
|
||||
select * from t3 where a >= all (select b from t2);
|
||||
a
|
||||
7
|
||||
|
@ -1498,7 +1498,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 0 0.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < (select max(`test`.`t2`.`b`) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` < (select max(`test`.`t2`.`b`) from `test`.`t2`))))
|
||||
select * from t3 where a >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2);
|
||||
|
@ -1506,7 +1506,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 0 0.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= (select min(`test`.`t2`.`b`) from `test`.`t2`))))
|
||||
select * from t3 where a >= all (select b from t2 group by 1);
|
||||
a
|
||||
6
|
||||
|
@ -1517,7 +1517,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 0 0.00 Using temporary
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` < <max>(select `test`.`t2`.`b` from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` < <max>(select `test`.`t2`.`b` from `test`.`t2` group by 1))))
|
||||
select * from t3 where a >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where a >= some (select b from t2 group by 1);
|
||||
|
@ -1525,7 +1525,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 0 0.00 Using temporary
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((`test`.`t3`.`a` >= <min>(select `test`.`t2`.`b` from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` >= <min>(select `test`.`t2`.`b` from `test`.`t2` group by 1))))
|
||||
select * from t3 where NULL >= any (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2);
|
||||
|
@ -1533,7 +1533,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 0 0.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= (select min(`test`.`t2`.`b`) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= (select min(`test`.`t2`.`b`) from `test`.`t2`))))
|
||||
select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= any (select b from t2 group by 1);
|
||||
|
@ -1541,7 +1541,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 0 0.00 Using temporary
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= <min>(select `test`.`t2`.`b` from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= <min>(select `test`.`t2`.`b` from `test`.`t2` group by 1))))
|
||||
select * from t3 where NULL >= some (select b from t2);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2);
|
||||
|
@ -1549,7 +1549,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 0 0.00
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= (select min(`test`.`t2`.`b`) from `test`.`t2`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= (select min(`test`.`t2`.`b`) from `test`.`t2`))))
|
||||
select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
a
|
||||
explain extended select * from t3 where NULL >= some (select b from t2 group by 1);
|
||||
|
@ -1557,7 +1557,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 0 0.00 Using temporary
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>((NULL >= <min>(select `test`.`t2`.`b` from `test`.`t2` group by 1)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <nop>(<in_optimizer>(NULL,(NULL >= <min>(select `test`.`t2`.`b` from `test`.`t2` group by 1))))
|
||||
insert into t2 values (2,2), (2,1), (3,3), (3,1);
|
||||
select * from t3 where a > all (select max(b) from t2 group by a);
|
||||
a
|
||||
|
@ -1568,7 +1568,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 4 100.00 Using temporary
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>((`test`.`t3`.`a` <= <max>(select max(`test`.`t2`.`b`) from `test`.`t2` group by `test`.`t2`.`a`)))
|
||||
Note 1003 select `test`.`t3`.`a` AS `a` from `test`.`t3` where <not>(<in_optimizer>(`test`.`t3`.`a`,(`test`.`t3`.`a` <= <max>(select max(`test`.`t2`.`b`) from `test`.`t2` group by `test`.`t2`.`a`))))
|
||||
drop table t2, t3;
|
||||
CREATE TABLE `t1` ( `id` mediumint(9) NOT NULL auto_increment, `taskid` bigint(20) NOT NULL default '0', `dbid` int(11) NOT NULL default '0', `create_date` datetime NOT NULL default '0000-00-00 00:00:00', `last_update` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`id`)) ENGINE=MyISAM CHARSET=latin1 AUTO_INCREMENT=3 ;
|
||||
INSERT INTO `t1` (`id`, `taskid`, `dbid`, `create_date`,`last_update`) VALUES (1, 1, 15, '2003-09-29 10:31:36', '2003-09-29 10:31:36'), (2, 1, 21, now(), now());
|
||||
|
@ -1619,7 +1619,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||
3 UNION t1 ALL NULL NULL NULL NULL 1 100.00
|
||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL NULL
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`s1` AS `s1` from `test`.`t1` where <nop>(('f' > <min>(select `test`.`t1`.`s1` from `test`.`t1` union select `test`.`t1`.`s1` from `test`.`t1`)))
|
||||
Note 1003 select `test`.`t1`.`s1` AS `s1` from `test`.`t1` where <nop>(<in_optimizer>('f',('f' > <min>(select `test`.`t1`.`s1` from `test`.`t1` union select `test`.`t1`.`s1` from `test`.`t1`))))
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (number char(11) NOT NULL default '') ENGINE=MyISAM CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES ('69294728265'),('18621828126'),('89356874041'),('95895001874');
|
||||
|
|
|
@ -158,7 +158,10 @@ SELECT @@session.sql_mode INTO @old_sql_mode;
|
|||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||
|
||||
# EXPLAIN EXTENDED (with subselect). used to crash. should give NOTICE.
|
||||
--error ER_MIX_OF_GROUP_FUNC_AND_FIELDS
|
||||
# Before moving max/min optimization to optimize phase this statement
|
||||
# generated error, but as far as original query do not contain aggregate
|
||||
# function user should not see error
|
||||
# --error ER_MIX_OF_GROUP_FUNC_AND_FIELDS
|
||||
EXPLAIN EXTENDED SELECT 1 FROM t1
|
||||
WHERE f1 > ALL( SELECT t.f1 FROM t1,t1 AS t );
|
||||
SHOW WARNINGS;
|
||||
|
|
|
@ -1798,6 +1798,8 @@ Item *Item_in_optimizer::expr_cache_insert_transformer(uchar *thd_arg)
|
|||
{
|
||||
THD *thd= (THD*) thd_arg;
|
||||
DBUG_ENTER("Item_in_optimizer::expr_cache_insert_transformer");
|
||||
if (args[1]->type() != Item::SUBSELECT_ITEM)
|
||||
DBUG_RETURN(this); // MAX/MIN transformed => do nothing
|
||||
List<Item*> &depends_on= ((Item_subselect *)args[1])->depends_on;
|
||||
|
||||
if (expr_cache)
|
||||
|
@ -1901,7 +1903,15 @@ longlong Item_in_optimizer::val_int()
|
|||
DBUG_ASSERT(fixed == 1);
|
||||
cache->store(args[0]);
|
||||
cache->cache_value();
|
||||
|
||||
|
||||
if (args[1]->type() != Item::SUBSELECT_ITEM)
|
||||
{
|
||||
/* MAX/MIN transformed => pass through */
|
||||
longlong res= args[1]->val_int();
|
||||
null_value= args[1]->null_value;
|
||||
return (res);
|
||||
}
|
||||
|
||||
if (cache->null_value)
|
||||
{
|
||||
/*
|
||||
|
@ -2050,24 +2060,35 @@ Item *Item_in_optimizer::transform(Item_transformer transformer, uchar *argument
|
|||
if ((*args) != new_item)
|
||||
current_thd->change_item_tree(args, new_item);
|
||||
|
||||
/*
|
||||
Transform the right IN operand which should be an Item_in_subselect or a
|
||||
subclass of it. The left operand of the IN must be the same as the left
|
||||
operand of this Item_in_optimizer, so in this case there is no further
|
||||
transformation, we only make both operands the same.
|
||||
TODO: is it the way it should be?
|
||||
*/
|
||||
DBUG_ASSERT((args[1])->type() == Item::SUBSELECT_ITEM &&
|
||||
(((Item_subselect*)(args[1]))->substype() ==
|
||||
Item_subselect::IN_SUBS ||
|
||||
((Item_subselect*)(args[1]))->substype() ==
|
||||
Item_subselect::ALL_SUBS ||
|
||||
((Item_subselect*)(args[1]))->substype() ==
|
||||
Item_subselect::ANY_SUBS));
|
||||
|
||||
Item_in_subselect *in_arg= (Item_in_subselect*)args[1];
|
||||
in_arg->left_expr= args[0];
|
||||
if (args[1]->type() != Item::SUBSELECT_ITEM)
|
||||
{
|
||||
/* MAX/MIN transformed => pass through */
|
||||
new_item= args[1]->transform(transformer, argument);
|
||||
if (!new_item)
|
||||
return 0;
|
||||
if (args[1] != new_item)
|
||||
current_thd->change_item_tree(args, new_item);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Transform the right IN operand which should be an Item_in_subselect or a
|
||||
subclass of it. The left operand of the IN must be the same as the left
|
||||
operand of this Item_in_optimizer, so in this case there is no further
|
||||
transformation, we only make both operands the same.
|
||||
TODO: is it the way it should be?
|
||||
*/
|
||||
DBUG_ASSERT((args[1])->type() == Item::SUBSELECT_ITEM &&
|
||||
(((Item_subselect*)(args[1]))->substype() ==
|
||||
Item_subselect::IN_SUBS ||
|
||||
((Item_subselect*)(args[1]))->substype() ==
|
||||
Item_subselect::ALL_SUBS ||
|
||||
((Item_subselect*)(args[1]))->substype() ==
|
||||
Item_subselect::ANY_SUBS));
|
||||
|
||||
Item_in_subselect *in_arg= (Item_in_subselect*)args[1];
|
||||
in_arg->left_expr= args[0];
|
||||
}
|
||||
return (this->*transformer)(argument);
|
||||
}
|
||||
|
||||
|
|
|
@ -33,12 +33,15 @@
|
|||
|
||||
|
||||
Item_subselect::Item_subselect():
|
||||
Item_result_field(), value_assigned(0), thd(0), substitution(0),
|
||||
Item_result_field(), value_assigned(0), own_engine(TRUE),
|
||||
thd(0), substitution(0),
|
||||
expr_cache(0), engine(0), old_engine(0), used_tables_cache(0),
|
||||
have_to_be_excluded(0), const_item_cache(1), inside_first_fix_fields(0),
|
||||
done_first_fix_fields(FALSE), forced_const(FALSE), eliminated(FALSE),
|
||||
engine_changed(0), changed(0), is_correlated(FALSE)
|
||||
{
|
||||
DBUG_ENTER("Item_subselect::Item_subselect");
|
||||
DBUG_PRINT("enter", ("this: 0x%lx", (ulong) this));
|
||||
with_subselect= 1;
|
||||
reset();
|
||||
/*
|
||||
|
@ -46,6 +49,7 @@ Item_subselect::Item_subselect():
|
|||
(i.e. some rows will be found returned)
|
||||
*/
|
||||
null_value= TRUE;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
|
@ -58,7 +62,8 @@ void Item_subselect::init(st_select_lex *select_lex,
|
|||
*/
|
||||
|
||||
DBUG_ENTER("Item_subselect::init");
|
||||
DBUG_PRINT("enter", ("select_lex: 0x%lx", (long) select_lex));
|
||||
DBUG_PRINT("enter", ("select_lex: 0x%lx this: 0x%lx",
|
||||
(ulong) select_lex, (ulong) this));
|
||||
unit= select_lex->master_unit();
|
||||
thd= unit->thd;
|
||||
|
||||
|
@ -69,10 +74,10 @@ void Item_subselect::init(st_select_lex *select_lex,
|
|||
=> we do not copy old_engine here
|
||||
*/
|
||||
engine= unit->item->engine;
|
||||
own_engine= FALSE;
|
||||
parsing_place= unit->item->parsing_place;
|
||||
unit->item->engine= 0;
|
||||
unit->item= this;
|
||||
engine->change_result(this, result);
|
||||
thd->change_item_tree((Item**)&unit->item, this);
|
||||
engine->change_result(this, result, TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -97,6 +102,7 @@ void Item_subselect::init(st_select_lex *select_lex,
|
|||
/* The subquery is an expression cache candidate */
|
||||
upper->expr_cache_may_be_used[upper->parsing_place]= TRUE;
|
||||
}
|
||||
DBUG_PRINT("info", ("engine: 0x%lx", (ulong)engine));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
@ -156,8 +162,14 @@ void Item_in_subselect::cleanup()
|
|||
|
||||
Item_subselect::~Item_subselect()
|
||||
{
|
||||
delete engine;
|
||||
DBUG_ENTER("Item_subselect::~Item_subselect");
|
||||
DBUG_PRINT("enter", ("this: 0x%lx", (ulong) this));
|
||||
if (own_engine)
|
||||
delete engine;
|
||||
else
|
||||
engine->cleanup();
|
||||
engine= NULL;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -1117,13 +1129,42 @@ Item_allany_subselect::Item_allany_subselect(Item * left_exp,
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
Initialize length and decimals for EXISTS and inherited (IN/ALL/ANY)
|
||||
subqueries
|
||||
*/
|
||||
|
||||
void Item_exists_subselect::init_length_and_dec()
|
||||
{
|
||||
decimals= 0;
|
||||
max_length= 1;
|
||||
max_columns= engine->cols();
|
||||
}
|
||||
|
||||
|
||||
void Item_exists_subselect::fix_length_and_dec()
|
||||
{
|
||||
decimals= 0;
|
||||
max_length= 1;
|
||||
max_columns= engine->cols();
|
||||
/* We need only 1 row to determine existence */
|
||||
DBUG_ENTER("Item_exists_subselect::fix_length_and_dec");
|
||||
init_length_and_dec();
|
||||
/*
|
||||
We need only 1 row to determine existence (i.e. any EXISTS that is not
|
||||
an IN always requires LIMIT 1)
|
||||
*/
|
||||
unit->global_parameters->select_limit= new Item_int((int32) 1);
|
||||
DBUG_PRINT("info", ("Set limit to 1"));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
void Item_in_subselect::fix_length_and_dec()
|
||||
{
|
||||
DBUG_ENTER("Item_in_subselect::fix_length_and_dec");
|
||||
init_length_and_dec();
|
||||
/*
|
||||
Unlike Item_exists_subselect, LIMIT 1 is set later for
|
||||
Item_in_subselect, depending on the chosen strategy.
|
||||
*/
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1343,29 +1384,19 @@ my_decimal *Item_in_subselect::val_decimal(my_decimal *decimal_value)
|
|||
|
||||
|
||||
/**
|
||||
Rewrite a single-column IN/ALL/ANY subselect.
|
||||
Prepare a single-column IN/ALL/ANY subselect for rewriting.
|
||||
|
||||
@param join Join object of the subquery (i.e. 'child' join).
|
||||
|
||||
@details
|
||||
Rewrite a single-column subquery using rule-based approach. Given the subquery
|
||||
|
||||
oe $cmp$ (SELECT ie FROM ... WHERE subq_where ... HAVING subq_having)
|
||||
Prepare a single-column subquery to be rewritten. Given the subquery.
|
||||
|
||||
First, try to convert the subquery to a scalar-result subquery in one of
|
||||
the forms:
|
||||
|
||||
- oe $cmp$ (SELECT MAX(...) ) // handled by Item_singlerow_subselect
|
||||
- oe $cmp$ <max>(SELECT ...) // handled by Item_maxmin_subselect
|
||||
If the subquery has no tables it will be turned to an expression between
|
||||
left part and SELECT list.
|
||||
|
||||
If that fails, check if the subquery is a single select without tables,
|
||||
and substitute the subquery predicate with "oe $cmp$ ie".
|
||||
|
||||
If that fails, the subquery predicate is wrapped into an Item_in_optimizer.
|
||||
Later the query optimization phase chooses whether the subquery under the
|
||||
Item_in_optimizer will be further transformed into an equivalent correlated
|
||||
EXISTS by injecting additional predicates, or will be executed via subquery
|
||||
materialization in its unmodified form.
|
||||
In other cases the subquery will be wrapped with Item_in_optimizer which
|
||||
allow later to turn it to EXISTS or MAX/MIN.
|
||||
|
||||
@retval false The subquery was transformed
|
||||
@retval true Error
|
||||
|
@ -1388,88 +1419,6 @@ Item_in_subselect::single_value_transformer(JOIN *join)
|
|||
DBUG_RETURN(true);
|
||||
}
|
||||
|
||||
/*
|
||||
If this is an ALL/ANY single-value subselect, try to rewrite it with
|
||||
a MIN/MAX subselect. We can do that if a possible NULL result of the
|
||||
subselect can be ignored.
|
||||
E.g. SELECT * FROM t1 WHERE b > ANY (SELECT a FROM t2) can be rewritten
|
||||
with SELECT * FROM t1 WHERE b > (SELECT MAX(a) FROM t2).
|
||||
We can't check that this optimization is safe if it's not a top-level
|
||||
item of the WHERE clause (e.g. because the WHERE clause can contain IS
|
||||
NULL/IS NOT NULL functions). If so, we rewrite ALL/ANY with NOT EXISTS
|
||||
later in this method.
|
||||
*/
|
||||
if ((abort_on_null || (upper_item && upper_item->top_level())) &&
|
||||
!select_lex->master_unit()->uncacheable && !func->eqne_op())
|
||||
{
|
||||
if (substitution)
|
||||
{
|
||||
/* It is second (third, ...) SELECT of UNION => All is done */
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
|
||||
Item *subs;
|
||||
if (!select_lex->group_list.elements &&
|
||||
!select_lex->having &&
|
||||
!select_lex->with_sum_func &&
|
||||
!(select_lex->next_select()) &&
|
||||
select_lex->table_list.elements)
|
||||
{
|
||||
Item_sum_hybrid *item;
|
||||
nesting_map save_allow_sum_func;
|
||||
if (func->l_op())
|
||||
{
|
||||
/*
|
||||
(ALL && (> || =>)) || (ANY && (< || =<))
|
||||
for ALL condition is inverted
|
||||
*/
|
||||
item= new Item_sum_max(*select_lex->ref_pointer_array);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
(ALL && (< || =<)) || (ANY && (> || =>))
|
||||
for ALL condition is inverted
|
||||
*/
|
||||
item= new Item_sum_min(*select_lex->ref_pointer_array);
|
||||
}
|
||||
if (upper_item)
|
||||
upper_item->set_sum_test(item);
|
||||
*select_lex->ref_pointer_array= item;
|
||||
{
|
||||
List_iterator<Item> it(select_lex->item_list);
|
||||
it++;
|
||||
it.replace(item);
|
||||
}
|
||||
|
||||
save_allow_sum_func= thd->lex->allow_sum_func;
|
||||
thd->lex->allow_sum_func|= 1 << thd->lex->current_select->nest_level;
|
||||
/*
|
||||
Item_sum_(max|min) can't substitute other item => we can use 0 as
|
||||
reference, also Item_sum_(max|min) can't be fixed after creation, so
|
||||
we do not check item->fixed
|
||||
*/
|
||||
if (item->fix_fields(thd, 0))
|
||||
DBUG_RETURN(true);
|
||||
thd->lex->allow_sum_func= save_allow_sum_func;
|
||||
/* we added aggregate function => we have to change statistic */
|
||||
count_field_types(select_lex, &join->tmp_table_param, join->all_fields,
|
||||
0);
|
||||
|
||||
subs= new Item_singlerow_subselect(select_lex);
|
||||
}
|
||||
else
|
||||
{
|
||||
Item_maxmin_subselect *item;
|
||||
subs= item= new Item_maxmin_subselect(thd, this, select_lex, func->l_op());
|
||||
if (upper_item)
|
||||
upper_item->set_sub_test(item);
|
||||
}
|
||||
/* fix fields is already called for left expression */
|
||||
substitution= func->create(left_expr, subs);
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
|
||||
Item* join_having= join->having ? join->having : join->tmp_having;
|
||||
if (!(join_having || select_lex->with_sum_func ||
|
||||
select_lex->group_list.elements) &&
|
||||
|
@ -1503,7 +1452,6 @@ Item_in_subselect::single_value_transformer(JOIN *join)
|
|||
if (!substitution)
|
||||
{
|
||||
/* We're invoked for the 1st (or the only) SELECT in the subquery UNION */
|
||||
SELECT_LEX_UNIT *master_unit= select_lex->master_unit();
|
||||
substitution= optimizer;
|
||||
|
||||
SELECT_LEX *current= thd->lex->current_select;
|
||||
|
@ -1529,21 +1477,124 @@ Item_in_subselect::single_value_transformer(JOIN *join)
|
|||
(char *)"<no matter>",
|
||||
(char *)in_left_expr_name);
|
||||
|
||||
/*
|
||||
The uncacheable property controls a number of actions, e.g. whether to
|
||||
save/restore (via init_save_join_tab/restore_tmp) the original JOIN for
|
||||
plans with a temp table where the original JOIN was overriden by
|
||||
make_simple_join. The UNCACHEABLE_EXPLAIN is ignored by EXPLAIN, thus
|
||||
non-correlated subqueries will not appear as such to EXPLAIN.
|
||||
*/
|
||||
master_unit->uncacheable|= UNCACHEABLE_EXPLAIN;
|
||||
select_lex->uncacheable|= UNCACHEABLE_EXPLAIN;
|
||||
}
|
||||
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Apply transformation max/min transwormation to ALL/ANY subquery if it is
|
||||
possible.
|
||||
|
||||
@param join Join object of the subquery (i.e. 'child' join).
|
||||
|
||||
@details
|
||||
|
||||
If this is an ALL/ANY single-value subselect, try to rewrite it with
|
||||
a MIN/MAX subselect. We can do that if a possible NULL result of the
|
||||
subselect can be ignored.
|
||||
E.g. SELECT * FROM t1 WHERE b > ANY (SELECT a FROM t2) can be rewritten
|
||||
with SELECT * FROM t1 WHERE b > (SELECT MAX(a) FROM t2).
|
||||
We can't check that this optimization is safe if it's not a top-level
|
||||
item of the WHERE clause (e.g. because the WHERE clause can contain IS
|
||||
NULL/IS NOT NULL functions). If so, we rewrite ALL/ANY with NOT EXISTS
|
||||
later in this method.
|
||||
|
||||
@retval false The subquery was transformed
|
||||
@retval true Error
|
||||
*/
|
||||
|
||||
bool Item_allany_subselect::transform_into_max_min(JOIN *join)
|
||||
{
|
||||
DBUG_ENTER("Item_allany_subselect::transform_into_max_min");
|
||||
if (!(in_strategy & SUBS_MAXMIN))
|
||||
DBUG_RETURN(false);
|
||||
Item **place= optimizer->arguments() + 1;
|
||||
THD *thd= join->thd;
|
||||
SELECT_LEX *select_lex= join->select_lex;
|
||||
Item *subs;
|
||||
|
||||
/*
|
||||
*/
|
||||
DBUG_ASSERT(!substitution);
|
||||
|
||||
if (!select_lex->group_list.elements &&
|
||||
!select_lex->having &&
|
||||
!select_lex->with_sum_func &&
|
||||
!(select_lex->next_select()) &&
|
||||
select_lex->table_list.elements)
|
||||
{
|
||||
Item_sum_hybrid *item;
|
||||
nesting_map save_allow_sum_func;
|
||||
if (func->l_op())
|
||||
{
|
||||
/*
|
||||
(ALL && (> || =>)) || (ANY && (< || =<))
|
||||
for ALL condition is inverted
|
||||
*/
|
||||
item= new Item_sum_max(*select_lex->ref_pointer_array);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
(ALL && (< || =<)) || (ANY && (> || =>))
|
||||
for ALL condition is inverted
|
||||
*/
|
||||
item= new Item_sum_min(*select_lex->ref_pointer_array);
|
||||
}
|
||||
if (upper_item)
|
||||
upper_item->set_sum_test(item);
|
||||
thd->change_item_tree(select_lex->ref_pointer_array, item);
|
||||
{
|
||||
List_iterator<Item> it(select_lex->item_list);
|
||||
it++;
|
||||
thd->change_item_tree(it.ref(), item);
|
||||
}
|
||||
|
||||
save_allow_sum_func= thd->lex->allow_sum_func;
|
||||
thd->lex->allow_sum_func|= 1 << thd->lex->current_select->nest_level;
|
||||
/*
|
||||
Item_sum_(max|min) can't substitute other item => we can use 0 as
|
||||
reference, also Item_sum_(max|min) can't be fixed after creation, so
|
||||
we do not check item->fixed
|
||||
*/
|
||||
if (item->fix_fields(thd, 0))
|
||||
DBUG_RETURN(true);
|
||||
thd->lex->allow_sum_func= save_allow_sum_func;
|
||||
/* we added aggregate function => we have to change statistic */
|
||||
count_field_types(select_lex, &join->tmp_table_param, join->all_fields,
|
||||
0);
|
||||
if (join->prepare_stage2())
|
||||
DBUG_RETURN(true);
|
||||
subs= new Item_singlerow_subselect(select_lex);
|
||||
}
|
||||
else
|
||||
{
|
||||
Item_maxmin_subselect *item;
|
||||
subs= item= new Item_maxmin_subselect(thd, this, select_lex, func->l_op());
|
||||
if (upper_item)
|
||||
upper_item->set_sub_test(item);
|
||||
}
|
||||
/* fix fields is already called for left expression */
|
||||
subs= func->create(left_expr, subs);
|
||||
thd->change_item_tree(place, subs);
|
||||
if (subs->fix_fields(thd, &subs))
|
||||
DBUG_RETURN(true);
|
||||
DBUG_ASSERT(subs == (*place)); // There was no substitutions
|
||||
|
||||
select_lex->master_unit()->uncacheable&= ~UNCACHEABLE_DEPENDENT_INJECTED;
|
||||
select_lex->uncacheable&= ~UNCACHEABLE_DEPENDENT_INJECTED;
|
||||
/*
|
||||
Remove other strategies if there was (we already changed the query and
|
||||
can't apply other strategy).
|
||||
*/
|
||||
in_strategy= SUBS_MAXMIN;
|
||||
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
|
||||
|
||||
bool Item_in_subselect::fix_having(Item *having, SELECT_LEX *select_lex)
|
||||
{
|
||||
bool fix_res= 0;
|
||||
|
@ -1556,6 +1607,16 @@ bool Item_in_subselect::fix_having(Item *having, SELECT_LEX *select_lex)
|
|||
return fix_res;
|
||||
}
|
||||
|
||||
bool Item_allany_subselect::is_maxmin_applicable(JOIN *join)
|
||||
{
|
||||
/*
|
||||
Check if max/min optimization applicable: It is top item of
|
||||
WHERE condition.
|
||||
*/
|
||||
return (abort_on_null || (upper_item && upper_item->top_level())) &&
|
||||
!join->select_lex->master_unit()->uncacheable && !func->eqne_op();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Create the predicates needed to transform a single-column IN/ALL/ANY
|
||||
|
@ -2025,10 +2086,6 @@ bool Item_in_subselect::create_in_to_exists_cond(JOIN *join_arg)
|
|||
If the dependency is removed, the call can be moved to a later phase.
|
||||
*/
|
||||
init_cond_guards();
|
||||
/*
|
||||
The IN=>EXISTS transformation makes non-correlated subqueries correlated.
|
||||
*/
|
||||
join_arg->select_lex->uncacheable|= UNCACHEABLE_DEPENDENT;
|
||||
if (left_expr->cols() == 1)
|
||||
res= create_single_in_to_exists_cond(join_arg,
|
||||
&(join_arg->in_to_exists_where),
|
||||
|
@ -2037,6 +2094,20 @@ bool Item_in_subselect::create_in_to_exists_cond(JOIN *join_arg)
|
|||
res= create_row_in_to_exists_cond(join_arg,
|
||||
&(join_arg->in_to_exists_where),
|
||||
&(join_arg->in_to_exists_having));
|
||||
|
||||
/*
|
||||
The IN=>EXISTS transformation makes non-correlated subqueries correlated.
|
||||
*/
|
||||
join_arg->select_lex->uncacheable|= UNCACHEABLE_DEPENDENT_INJECTED;
|
||||
/*
|
||||
The uncacheable property controls a number of actions, e.g. whether to
|
||||
save/restore (via init_save_join_tab/restore_tmp) the original JOIN for
|
||||
plans with a temp table where the original JOIN was overriden by
|
||||
make_simple_join. The UNCACHEABLE_EXPLAIN is ignored by EXPLAIN, thus
|
||||
non-correlated subqueries will not appear as such to EXPLAIN.
|
||||
*/
|
||||
join_arg->select_lex->master_unit()->uncacheable|= UNCACHEABLE_EXPLAIN;
|
||||
join_arg->select_lex->uncacheable|= UNCACHEABLE_EXPLAIN;
|
||||
return (res);
|
||||
}
|
||||
|
||||
|
@ -2107,6 +2178,9 @@ bool Item_in_subselect::inject_in_to_exists_cond(JOIN *join_arg)
|
|||
select_lex->having->top_level_item();
|
||||
join_arg->having= select_lex->having;
|
||||
}
|
||||
join_arg->thd->change_item_tree(&unit->global_parameters->select_limit,
|
||||
new Item_int((int32) 1));
|
||||
unit->select_limit_cnt= 1;
|
||||
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
|
@ -2407,7 +2481,8 @@ bool
|
|||
Item_allany_subselect::select_transformer(JOIN *join)
|
||||
{
|
||||
DBUG_ENTER("Item_allany_subselect::select_transformer");
|
||||
in_strategy= SUBS_IN_TO_EXISTS;
|
||||
DBUG_ASSERT((in_strategy & ~(SUBS_MAXMIN | SUBS_IN_TO_EXISTS)) == 0);
|
||||
in_strategy|= SUBS_IN_TO_EXISTS;
|
||||
if (upper_item)
|
||||
upper_item->show= 1;
|
||||
DBUG_RETURN(select_in_like_transformer(join));
|
||||
|
@ -2458,6 +2533,7 @@ void subselect_single_select_engine::cleanup()
|
|||
prepared= executed= 0;
|
||||
join= 0;
|
||||
result->cleanup();
|
||||
select_lex->uncacheable&= ~UNCACHEABLE_DEPENDENT_INJECTED;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
@ -2467,6 +2543,9 @@ void subselect_union_engine::cleanup()
|
|||
DBUG_ENTER("subselect_union_engine::cleanup");
|
||||
unit->reinit_exec_mechanism();
|
||||
result->cleanup();
|
||||
unit->uncacheable&= ~UNCACHEABLE_DEPENDENT_INJECTED;
|
||||
for (SELECT_LEX *sl= unit->first_select(); sl; sl= sl->next_select())
|
||||
sl->uncacheable&= ~UNCACHEABLE_DEPENDENT_INJECTED;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
@ -3459,6 +3538,7 @@ void subselect_indexsubquery_engine::print(String *str,
|
|||
|
||||
@param si new subselect Item
|
||||
@param res new select_result object
|
||||
@param temp temporary assignment
|
||||
|
||||
@retval
|
||||
FALSE OK
|
||||
|
@ -3466,11 +3546,23 @@ void subselect_indexsubquery_engine::print(String *str,
|
|||
TRUE error
|
||||
*/
|
||||
|
||||
bool subselect_single_select_engine::change_result(Item_subselect *si,
|
||||
select_result_interceptor *res)
|
||||
bool
|
||||
subselect_single_select_engine::change_result(Item_subselect *si,
|
||||
select_result_interceptor *res,
|
||||
bool temp)
|
||||
{
|
||||
item= si;
|
||||
result= res;
|
||||
if (temp)
|
||||
{
|
||||
/*
|
||||
Here we reuse change_item_tree to roll back assignment. It has
|
||||
nothing special about Item* pointer so it is safe conversion. We do
|
||||
not change the interface to be compatible with MySQL.
|
||||
*/
|
||||
thd->change_item_tree((Item**) &result, (Item*)res);
|
||||
}
|
||||
else
|
||||
result= res;
|
||||
return select_lex->join->change_result(result);
|
||||
}
|
||||
|
||||
|
@ -3488,11 +3580,15 @@ bool subselect_single_select_engine::change_result(Item_subselect *si,
|
|||
*/
|
||||
|
||||
bool subselect_union_engine::change_result(Item_subselect *si,
|
||||
select_result_interceptor *res)
|
||||
select_result_interceptor *res,
|
||||
bool temp)
|
||||
{
|
||||
item= si;
|
||||
int rc= unit->change_result(res, result);
|
||||
result= res;
|
||||
if (temp)
|
||||
thd->change_item_tree((Item**) &result, (Item*)res);
|
||||
else
|
||||
result= res;
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -3509,8 +3605,11 @@ bool subselect_union_engine::change_result(Item_subselect *si,
|
|||
TRUE error
|
||||
*/
|
||||
|
||||
bool subselect_uniquesubquery_engine::change_result(Item_subselect *si,
|
||||
select_result_interceptor *res)
|
||||
bool
|
||||
subselect_uniquesubquery_engine::change_result(Item_subselect *si,
|
||||
select_result_interceptor *res,
|
||||
bool temp
|
||||
__attribute__((unused)))
|
||||
{
|
||||
DBUG_ASSERT(0);
|
||||
return TRUE;
|
||||
|
@ -4301,7 +4400,8 @@ bool subselect_hash_sj_engine::no_tables()
|
|||
}
|
||||
|
||||
bool subselect_hash_sj_engine::change_result(Item_subselect *si,
|
||||
select_result_interceptor *res)
|
||||
select_result_interceptor *res,
|
||||
bool temp __attribute__((unused)))
|
||||
{
|
||||
DBUG_ASSERT(FALSE);
|
||||
return TRUE;
|
||||
|
|
|
@ -32,7 +32,8 @@ class Cached_item;
|
|||
|
||||
class Item_subselect :public Item_result_field
|
||||
{
|
||||
bool value_assigned; /* value already assigned to subselect */
|
||||
bool value_assigned; /* value already assigned to subselect */
|
||||
bool own_engine; /* the engine was not taken from other Item_subselect */
|
||||
protected:
|
||||
/* thread handler, will be assigned in fix_fields only */
|
||||
THD *thd;
|
||||
|
@ -317,6 +318,8 @@ class Item_exists_subselect :public Item_subselect
|
|||
protected:
|
||||
bool value; /* value of this item (boolean: exists/not-exists) */
|
||||
|
||||
void init_length_and_dec();
|
||||
|
||||
public:
|
||||
Item_exists_subselect(st_select_lex *select_lex);
|
||||
Item_exists_subselect(): Item_subselect() {}
|
||||
|
@ -356,6 +359,9 @@ public:
|
|||
/* Partial matching substrategies of MATERIALIZATION. */
|
||||
#define SUBS_PARTIAL_MATCH_ROWID_MERGE 8
|
||||
#define SUBS_PARTIAL_MATCH_TABLE_SCAN 16
|
||||
/* ALL/ANY will be transformed with max/min optimization */
|
||||
#define SUBS_MAXMIN 32
|
||||
|
||||
|
||||
/**
|
||||
Representation of IN subquery predicates of the form
|
||||
|
@ -486,6 +492,7 @@ public:
|
|||
bool test_limit(st_select_lex_unit *unit);
|
||||
virtual void print(String *str, enum_query_type query_type);
|
||||
bool fix_fields(THD *thd, Item **ref);
|
||||
void fix_length_and_dec();
|
||||
void fix_after_pullout(st_select_lex *new_parent, Item **ref);
|
||||
void update_used_tables();
|
||||
bool setup_mat_engine();
|
||||
|
@ -523,6 +530,8 @@ public:
|
|||
bool select_transformer(JOIN *join);
|
||||
void create_comp_func(bool invert) { func= func_creator(invert); }
|
||||
virtual void print(String *str, enum_query_type query_type);
|
||||
bool is_maxmin_applicable(JOIN *join);
|
||||
bool transform_into_max_min(JOIN *join);
|
||||
};
|
||||
|
||||
|
||||
|
@ -594,7 +603,8 @@ public:
|
|||
static table_map calc_const_tables(TABLE_LIST *);
|
||||
virtual void print(String *str, enum_query_type query_type)= 0;
|
||||
virtual bool change_result(Item_subselect *si,
|
||||
select_result_interceptor *result)= 0;
|
||||
select_result_interceptor *result,
|
||||
bool temp= FALSE)= 0;
|
||||
virtual bool no_tables()= 0;
|
||||
virtual bool is_executed() const { return FALSE; }
|
||||
/* Check if subquery produced any rows during last query execution */
|
||||
|
@ -626,7 +636,9 @@ public:
|
|||
void exclude();
|
||||
table_map upper_select_const_tables();
|
||||
virtual void print (String *str, enum_query_type query_type);
|
||||
bool change_result(Item_subselect *si, select_result_interceptor *result);
|
||||
bool change_result(Item_subselect *si,
|
||||
select_result_interceptor *result,
|
||||
bool temp);
|
||||
bool no_tables();
|
||||
bool may_be_null();
|
||||
bool is_executed() const { return executed; }
|
||||
|
@ -655,7 +667,9 @@ public:
|
|||
void exclude();
|
||||
table_map upper_select_const_tables();
|
||||
virtual void print (String *str, enum_query_type query_type);
|
||||
bool change_result(Item_subselect *si, select_result_interceptor *result);
|
||||
bool change_result(Item_subselect *si,
|
||||
select_result_interceptor *result,
|
||||
bool temp= FALSE);
|
||||
bool no_tables();
|
||||
bool is_executed() const;
|
||||
bool no_rows();
|
||||
|
@ -707,11 +721,13 @@ public:
|
|||
void fix_length_and_dec(Item_cache** row);
|
||||
int exec();
|
||||
uint cols() { return 1; }
|
||||
uint8 uncacheable() { return UNCACHEABLE_DEPENDENT; }
|
||||
uint8 uncacheable() { return UNCACHEABLE_DEPENDENT_INJECTED; }
|
||||
void exclude();
|
||||
table_map upper_select_const_tables() { return 0; }
|
||||
virtual void print (String *str, enum_query_type query_type);
|
||||
bool change_result(Item_subselect *si, select_result_interceptor *result);
|
||||
bool change_result(Item_subselect *si,
|
||||
select_result_interceptor *result,
|
||||
bool temp= FALSE);
|
||||
bool no_tables();
|
||||
int index_lookup(); /* TIMOUR: this method needs refactoring. */
|
||||
int scan_table();
|
||||
|
@ -879,7 +895,9 @@ public:
|
|||
void fix_length_and_dec(Item_cache** row);//=>base class
|
||||
void exclude(); //=>base class
|
||||
//=>base class
|
||||
bool change_result(Item_subselect *si, select_result_interceptor *result);
|
||||
bool change_result(Item_subselect *si,
|
||||
select_result_interceptor *result,
|
||||
bool temp= FALSE);
|
||||
bool no_tables();//=>base class
|
||||
};
|
||||
|
||||
|
@ -1106,7 +1124,9 @@ public:
|
|||
uint8 uncacheable() { return UNCACHEABLE_DEPENDENT; }
|
||||
void exclude() {}
|
||||
table_map upper_select_const_tables() { return 0; }
|
||||
bool change_result(Item_subselect*, select_result_interceptor*)
|
||||
bool change_result(Item_subselect*,
|
||||
select_result_interceptor*,
|
||||
bool temp= FALSE)
|
||||
{ DBUG_ASSERT(FALSE); return false; }
|
||||
bool no_tables() { return false; }
|
||||
bool no_rows()
|
||||
|
|
|
@ -678,15 +678,30 @@ enabled by default, add OPTIMIZER_SWITCH_MATERIALIZATION
|
|||
*/
|
||||
#define CONTEXT_ANALYSIS_ONLY_DERIVED 4
|
||||
|
||||
// uncachable cause
|
||||
#define UNCACHEABLE_DEPENDENT 1
|
||||
#define UNCACHEABLE_RAND 2
|
||||
#define UNCACHEABLE_SIDEEFFECT 4
|
||||
/// forcing to save JOIN for explain
|
||||
#define UNCACHEABLE_EXPLAIN 8
|
||||
/*
|
||||
Uncachable causes:
|
||||
|
||||
This subquery has fields from outer query (put by user)
|
||||
*/
|
||||
#define UNCACHEABLE_DEPENDENT_GENERATED 1
|
||||
/* This subquery contains functions with random result */
|
||||
#define UNCACHEABLE_RAND 2
|
||||
/* This subquery contains functions with side effect */
|
||||
#define UNCACHEABLE_SIDEEFFECT 4
|
||||
/* Forcing to save JOIN tables for explain */
|
||||
#define UNCACHEABLE_EXPLAIN 8
|
||||
/* For uncorrelated SELECT in an UNION with some correlated SELECTs */
|
||||
#define UNCACHEABLE_UNITED 16
|
||||
#define UNCACHEABLE_CHECKOPTION 32
|
||||
#define UNCACHEABLE_UNITED 16
|
||||
#define UNCACHEABLE_CHECKOPTION 32
|
||||
/*
|
||||
This subquery has fields from outer query injected during
|
||||
transformation process
|
||||
*/
|
||||
#define UNCACHEABLE_DEPENDENT_INJECTED 64
|
||||
|
||||
/* This subquery has fields from outer query (any nature) */
|
||||
#define UNCACHEABLE_DEPENDENT (UNCACHEABLE_DEPENDENT_GENERATED | \
|
||||
UNCACHEABLE_DEPENDENT_INJECTED)
|
||||
|
||||
/* Used to check GROUP BY list in the MODE_ONLY_FULL_GROUP_BY mode */
|
||||
#define UNDEF_POS (-1)
|
||||
|
|
|
@ -93,8 +93,19 @@ int check_and_do_in_subquery_rewrites(JOIN *join)
|
|||
(subselect= parent_unit->item)) // (2)
|
||||
{
|
||||
Item_in_subselect *in_subs= NULL;
|
||||
if (subselect->substype() == Item_subselect::IN_SUBS)
|
||||
in_subs= (Item_in_subselect*)subselect;
|
||||
Item_allany_subselect *allany_subs= NULL;
|
||||
switch (subselect->substype()) {
|
||||
case Item_subselect::IN_SUBS:
|
||||
in_subs= (Item_in_subselect *)subselect;
|
||||
break;
|
||||
case Item_subselect::ALL_SUBS:
|
||||
case Item_subselect::ANY_SUBS:
|
||||
allany_subs= (Item_allany_subselect *)subselect;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/* Resolve expressions and perform semantic analysis for IN query */
|
||||
if (in_subs != NULL)
|
||||
|
@ -257,12 +268,18 @@ int check_and_do_in_subquery_rewrites(JOIN *join)
|
|||
}
|
||||
}
|
||||
|
||||
/* Check if max/min optimization applicable */
|
||||
if (allany_subs)
|
||||
allany_subs->in_strategy|= (allany_subs->is_maxmin_applicable(join) ?
|
||||
SUBS_MAXMIN :
|
||||
SUBS_IN_TO_EXISTS);
|
||||
|
||||
/*
|
||||
Transform each subquery predicate according to its overloaded
|
||||
transformer.
|
||||
*/
|
||||
if (subselect->select_transformer(join))
|
||||
DBUG_RETURN(-11);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
|
@ -369,6 +386,22 @@ bool subquery_types_allow_materialization(Item_in_subselect *in_subs)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
Apply max min optimization of all/any subselect
|
||||
*/
|
||||
|
||||
bool JOIN::transform_max_min_subquery()
|
||||
{
|
||||
DBUG_ENTER("JOIN::transform_max_min_subquery");
|
||||
Item_subselect *subselect= unit->item;
|
||||
if (!subselect || (subselect->substype() != Item_subselect::ALL_SUBS &&
|
||||
subselect->substype() != Item_subselect::ANY_SUBS))
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(((Item_allany_subselect *) subselect)->
|
||||
transform_into_max_min(this));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Convert semi-join subquery predicates into semi-join join nests
|
||||
|
||||
|
@ -3842,9 +3875,8 @@ bool JOIN::choose_subquery_plan(table_map join_tables)
|
|||
if (reopt_result == REOPT_NEW_PLAN)
|
||||
restore_query_plan(&save_qep);
|
||||
|
||||
/* TODO: should we set/unset this flag for both select_lex and its unit? */
|
||||
in_subs->unit->uncacheable&= ~UNCACHEABLE_DEPENDENT;
|
||||
select_lex->uncacheable&= ~UNCACHEABLE_DEPENDENT;
|
||||
in_subs->unit->uncacheable&= ~UNCACHEABLE_DEPENDENT_INJECTED;
|
||||
select_lex->uncacheable&= ~UNCACHEABLE_DEPENDENT_INJECTED;
|
||||
|
||||
/*
|
||||
Reset the "LIMIT 1" set in Item_exists_subselect::fix_length_and_dec.
|
||||
|
@ -3884,6 +3916,13 @@ bool JOIN::choose_subquery_plan(table_map join_tables)
|
|||
|
||||
if (in_subs->inject_in_to_exists_cond(this))
|
||||
return TRUE;
|
||||
/*
|
||||
It is IN->EXISTS transformation so we should mark subquery as
|
||||
dependent
|
||||
*/
|
||||
in_subs->unit->uncacheable|= UNCACHEABLE_DEPENDENT_INJECTED;
|
||||
select_lex->uncacheable|= UNCACHEABLE_DEPENDENT_INJECTED;
|
||||
select_limit= 1;
|
||||
}
|
||||
else
|
||||
DBUG_ASSERT(FALSE);
|
||||
|
|
|
@ -2727,7 +2727,12 @@ public:
|
|||
class select_result_interceptor: public select_result
|
||||
{
|
||||
public:
|
||||
select_result_interceptor() {} /* Remove gcc warning */
|
||||
select_result_interceptor()
|
||||
{
|
||||
DBUG_ENTER("select_result_interceptor::select_result_interceptor");
|
||||
DBUG_PRINT("enter", ("this 0x%lx", (ulong) this));
|
||||
DBUG_VOID_RETURN;
|
||||
} /* Remove gcc warning */
|
||||
uint field_count(List<Item> &fields) const { return 0; }
|
||||
bool send_fields(List<Item> &fields, uint flag) { return FALSE; }
|
||||
};
|
||||
|
|
|
@ -1942,18 +1942,19 @@ bool st_select_lex::mark_as_dependent(THD *thd, st_select_lex *last, Item *depen
|
|||
SELECT_LEX *s= this;
|
||||
do
|
||||
{
|
||||
if (!(s->uncacheable & UNCACHEABLE_DEPENDENT))
|
||||
if (!(s->uncacheable & UNCACHEABLE_DEPENDENT_GENERATED))
|
||||
{
|
||||
// Select is dependent of outer select
|
||||
s->uncacheable= (s->uncacheable & ~UNCACHEABLE_UNITED) |
|
||||
UNCACHEABLE_DEPENDENT;
|
||||
UNCACHEABLE_DEPENDENT_GENERATED;
|
||||
SELECT_LEX_UNIT *munit= s->master_unit();
|
||||
munit->uncacheable= (munit->uncacheable & ~UNCACHEABLE_UNITED) |
|
||||
UNCACHEABLE_DEPENDENT;
|
||||
UNCACHEABLE_DEPENDENT_GENERATED;
|
||||
for (SELECT_LEX *sl= munit->first_select(); sl ; sl= sl->next_select())
|
||||
{
|
||||
if (sl != s &&
|
||||
!(sl->uncacheable & (UNCACHEABLE_DEPENDENT | UNCACHEABLE_UNITED)))
|
||||
!(sl->uncacheable & (UNCACHEABLE_DEPENDENT_GENERATED |
|
||||
UNCACHEABLE_UNITED)))
|
||||
sl->uncacheable|= UNCACHEABLE_UNITED;
|
||||
}
|
||||
}
|
||||
|
@ -2178,17 +2179,6 @@ void st_select_lex::print_limit(THD *thd,
|
|||
subs_type == Item_subselect::IN_SUBS ||
|
||||
subs_type == Item_subselect::ALL_SUBS)
|
||||
{
|
||||
DBUG_ASSERT(!item->fixed ||
|
||||
/*
|
||||
If not using materialization both:
|
||||
select_limit == 1, and there should be no offset_limit.
|
||||
*/
|
||||
(((subs_type == Item_subselect::IN_SUBS) &&
|
||||
((Item_in_subselect*)item)->in_strategy &
|
||||
SUBS_MATERIALIZATION) ?
|
||||
TRUE :
|
||||
(select_limit->val_int() == 1LL) &&
|
||||
offset_limit == 0));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -417,7 +417,8 @@ public:
|
|||
|
||||
/*
|
||||
result of this query can't be cached, bit field, can be :
|
||||
UNCACHEABLE_DEPENDENT
|
||||
UNCACHEABLE_DEPENDENT_GENERATED
|
||||
UNCACHEABLE_DEPENDENT_INJECTED
|
||||
UNCACHEABLE_RAND
|
||||
UNCACHEABLE_SIDEEFFECT
|
||||
UNCACHEABLE_EXPLAIN
|
||||
|
|
|
@ -736,11 +736,36 @@ JOIN::prepare(Item ***rref_pointer_array,
|
|||
if (!procedure && result && result->prepare(fields_list, unit_arg))
|
||||
goto err; /* purecov: inspected */
|
||||
|
||||
unit= unit_arg;
|
||||
if (prepare_stage2())
|
||||
goto err;
|
||||
|
||||
DBUG_RETURN(0); // All OK
|
||||
|
||||
err:
|
||||
delete procedure; /* purecov: inspected */
|
||||
procedure= 0;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Second phase of prepare where we collect some statistic.
|
||||
|
||||
@details
|
||||
We made this part separate to be able recalculate some statistic after
|
||||
transforming subquery on optimization phase.
|
||||
*/
|
||||
|
||||
bool JOIN::prepare_stage2()
|
||||
{
|
||||
bool res= TRUE;
|
||||
DBUG_ENTER("JOIN::prepare_stage2");
|
||||
|
||||
/* Init join struct */
|
||||
count_field_types(select_lex, &tmp_table_param, all_fields, 0);
|
||||
ref_pointer_array_size= all_fields.elements*sizeof(Item*);
|
||||
this->group= group_list != 0;
|
||||
unit= unit_arg;
|
||||
|
||||
if (tmp_table_param.sum_func_count && !group_list)
|
||||
implicit_grouping= TRUE;
|
||||
|
@ -757,12 +782,9 @@ JOIN::prepare(Item ***rref_pointer_array,
|
|||
if (alloc_func_list())
|
||||
goto err;
|
||||
|
||||
DBUG_RETURN(0); // All OK
|
||||
|
||||
res= FALSE;
|
||||
err:
|
||||
delete procedure; /* purecov: inspected */
|
||||
procedure= 0;
|
||||
DBUG_RETURN(-1); /* purecov: inspected */
|
||||
DBUG_RETURN(res); /* purecov: inspected */
|
||||
}
|
||||
|
||||
|
||||
|
@ -795,7 +817,8 @@ JOIN::optimize()
|
|||
set_allowed_join_cache_types();
|
||||
|
||||
/* dump_TABLE_LIST_graph(select_lex, select_lex->leaf_tables); */
|
||||
if (convert_join_subqueries_to_semijoins(this))
|
||||
if (transform_max_min_subquery() ||
|
||||
convert_join_subqueries_to_semijoins(this))
|
||||
DBUG_RETURN(1); /* purecov: inspected */
|
||||
/* dump_TABLE_LIST_graph(select_lex, select_lex->leaf_tables); */
|
||||
|
||||
|
@ -8599,6 +8622,10 @@ bool error_if_full_join(JOIN *join)
|
|||
|
||||
void JOIN_TAB::cleanup()
|
||||
{
|
||||
DBUG_ENTER("JOIN_TAB::cleanup");
|
||||
DBUG_PRINT("enter", ("table %s.%s",
|
||||
(table ? table->s->db.str : "?"),
|
||||
(table ? table->s->table_name.str : "?")));
|
||||
delete select;
|
||||
select= 0;
|
||||
delete quick;
|
||||
|
@ -8620,6 +8647,7 @@ void JOIN_TAB::cleanup()
|
|||
table->reginfo.join_tab= 0;
|
||||
}
|
||||
end_read_record(&read_record);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
|
@ -8740,7 +8768,8 @@ void JOIN::join_free()
|
|||
Optimization: if not EXPLAIN and we are done with the JOIN,
|
||||
free all tables.
|
||||
*/
|
||||
bool full= (!select_lex->uncacheable && !thd->lex->describe);
|
||||
bool full= (!(select_lex->uncacheable) &&
|
||||
!thd->lex->describe);
|
||||
bool can_unlock= full;
|
||||
DBUG_ENTER("JOIN::join_free");
|
||||
|
||||
|
@ -8804,6 +8833,7 @@ void JOIN::join_free()
|
|||
void JOIN::cleanup(bool full)
|
||||
{
|
||||
DBUG_ENTER("JOIN::cleanup");
|
||||
DBUG_PRINT("enter", ("full %u", (uint) full));
|
||||
|
||||
if (table)
|
||||
{
|
||||
|
@ -8829,7 +8859,11 @@ void JOIN::cleanup(bool full)
|
|||
for (tab= join_tab, end= tab+tables; tab != end; tab++)
|
||||
{
|
||||
if (tab->table)
|
||||
{
|
||||
DBUG_PRINT("info", ("close index: %s.%s", tab->table->s->db.str,
|
||||
tab->table->s->table_name.str));
|
||||
tab->table->file->ha_index_or_rnd_end();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -999,6 +999,7 @@ public:
|
|||
COND *conds, uint og_num, ORDER *order, ORDER *group,
|
||||
Item *having, ORDER *proc_param, SELECT_LEX *select,
|
||||
SELECT_LEX_UNIT *unit);
|
||||
bool prepare_stage2();
|
||||
int optimize();
|
||||
int reinit();
|
||||
int init_execution();
|
||||
|
@ -1079,6 +1080,8 @@ public:
|
|||
bool choose_subquery_plan(table_map join_tables);
|
||||
void get_partial_join_cost(uint n_tables,
|
||||
double *read_time_arg, double *record_count_arg);
|
||||
/* defined in opt_subselect.cc */
|
||||
bool transform_max_min_subquery();
|
||||
|
||||
private:
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue