Merge of merge
This commit is contained in:
commit
429a5557d8
@ -49,7 +49,6 @@ extern int NEAR my_errno; /* Last error in mysys */
|
|||||||
#define MY_WME 16 /* Write message on error */
|
#define MY_WME 16 /* Write message on error */
|
||||||
#define MY_WAIT_IF_FULL 32 /* Wait and try again if disk full error */
|
#define MY_WAIT_IF_FULL 32 /* Wait and try again if disk full error */
|
||||||
#define MY_IGNORE_BADFD 32 /* my_sync: ignore 'bad descriptor' errors */
|
#define MY_IGNORE_BADFD 32 /* my_sync: ignore 'bad descriptor' errors */
|
||||||
#define MY_SYNC_DIR 1024 /* my_create/delete/rename: sync directory */
|
|
||||||
#define MY_RAID 64 /* Support for RAID */
|
#define MY_RAID 64 /* Support for RAID */
|
||||||
#define MY_FULL_IO 512 /* For my_read - loop intil I/O is complete */
|
#define MY_FULL_IO 512 /* For my_read - loop intil I/O is complete */
|
||||||
#define MY_DONT_CHECK_FILESIZE 128 /* Option to init_io_cache() */
|
#define MY_DONT_CHECK_FILESIZE 128 /* Option to init_io_cache() */
|
||||||
@ -70,6 +69,7 @@ extern int NEAR my_errno; /* Last error in mysys */
|
|||||||
#define MY_DONT_OVERWRITE_FILE 2048 /* my_copy: Don't overwrite file */
|
#define MY_DONT_OVERWRITE_FILE 2048 /* my_copy: Don't overwrite file */
|
||||||
#define MY_THREADSAFE 2048 /* my_seek(): lock fd mutex */
|
#define MY_THREADSAFE 2048 /* my_seek(): lock fd mutex */
|
||||||
#define MY_SYNC 4096 /* my_copy(): sync dst file */
|
#define MY_SYNC 4096 /* my_copy(): sync dst file */
|
||||||
|
#define MY_SYNC_DIR 32768 /* my_create/delete/rename: sync directory */
|
||||||
|
|
||||||
#define MY_CHECK_ERROR 1 /* Params to my_end; Check open-close */
|
#define MY_CHECK_ERROR 1 /* Params to my_end; Check open-close */
|
||||||
#define MY_GIVE_INFO 2 /* Give time info about process*/
|
#define MY_GIVE_INFO 2 /* Give time info about process*/
|
||||||
@ -255,7 +255,7 @@ extern ulong my_file_total_opened;
|
|||||||
extern ulong my_sync_count;
|
extern ulong my_sync_count;
|
||||||
extern uint mysys_usage_id;
|
extern uint mysys_usage_id;
|
||||||
extern my_bool my_init_done;
|
extern my_bool my_init_done;
|
||||||
|
extern myf my_global_flags; /* Set to MY_WME for more error messages */
|
||||||
/* Point to current my_message() */
|
/* Point to current my_message() */
|
||||||
extern void (*my_sigtstp_cleanup)(void),
|
extern void (*my_sigtstp_cleanup)(void),
|
||||||
/* Executed before jump to shell */
|
/* Executed before jump to shell */
|
||||||
|
@ -171,7 +171,7 @@ DROP TABLE t1;
|
|||||||
# Bug#48295:
|
# Bug#48295:
|
||||||
# explain extended crash with subquery and ONLY_FULL_GROUP_BY sql_mode
|
# explain extended crash with subquery and ONLY_FULL_GROUP_BY sql_mode
|
||||||
#
|
#
|
||||||
CREATE TABLE t1 (f1 INT);
|
CREATE TABLE t1 (f1 INT not null);
|
||||||
SELECT @@session.sql_mode INTO @old_sql_mode;
|
SELECT @@session.sql_mode INTO @old_sql_mode;
|
||||||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||||
EXPLAIN EXTENDED SELECT 1 FROM t1
|
EXPLAIN EXTENDED SELECT 1 FROM t1
|
||||||
|
@ -922,6 +922,131 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a`,<in_optimizer>(`test`.`t1`.`a`,<exists>(select `test`.`t2`.`a` from `test`.`t2` join `test`.`t3` where ((`test`.`t3`.`a` = `test`.`t2`.`a`) and ((<cache>(`test`.`t1`.`a`) = `test`.`t2`.`a`) or isnull(`test`.`t2`.`a`))) having <is_not_null_test>(`test`.`t2`.`a`))) AS `t1.a in (select t2.a from t2,t3 where t3.a=t2.a)` from `test`.`t1`
|
Note 1003 select `test`.`t1`.`a` AS `a`,<in_optimizer>(`test`.`t1`.`a`,<exists>(select `test`.`t2`.`a` from `test`.`t2` join `test`.`t3` where ((`test`.`t3`.`a` = `test`.`t2`.`a`) and ((<cache>(`test`.`t1`.`a`) = `test`.`t2`.`a`) or isnull(`test`.`t2`.`a`))) having <is_not_null_test>(`test`.`t2`.`a`))) AS `t1.a in (select t2.a from t2,t3 where t3.a=t2.a)` from `test`.`t1`
|
||||||
drop table t1,t2,t3;
|
drop table t1,t2,t3;
|
||||||
|
# check correct NULL Processing for normal IN/ALL/ANY
|
||||||
|
# and 2 ways of max/min optimization
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (1), (100), (NULL), (1000);
|
||||||
|
create table t2 (a int not null);
|
||||||
|
# subselect returns empty set (for NULL and non-NULL left part)
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL 0
|
||||||
|
1000 0
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL 0
|
||||||
|
1000 0
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 1
|
||||||
|
NULL 1
|
||||||
|
1000 1
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
100
|
||||||
|
NULL
|
||||||
|
1000
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
100
|
||||||
|
NULL
|
||||||
|
1000
|
||||||
|
insert into t2 values (1),(200);
|
||||||
|
# sebselect returns non-empty set without NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 0
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 1
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
1000
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1000
|
||||||
|
drop table t2;
|
||||||
|
create table t2 (a int);
|
||||||
|
insert into t2 values (1),(NULL),(200);
|
||||||
|
# sebselect returns non-empty set with NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 NULL
|
||||||
|
NULL NULL
|
||||||
|
1000 NULL
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 NULL
|
||||||
|
100 1
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 NULL
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
drop table t1, t2;
|
||||||
create table t1 (a float);
|
create table t1 (a float);
|
||||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||||
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||||
@ -1501,7 +1626,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`s1` AS `s1`,(not(<in_optimizer>(`test`.`t1`.`s1`,<exists>(<index_lookup>(<cache>(`test`.`t1`.`s1`) in t2 on s1 checking NULL where (`test`.`t2`.`s1` < 'a2') having trigcond(<is_not_null_test>(`test`.`t2`.`s1`))))))) AS `s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2')` from `test`.`t1`
|
Note 1003 select `test`.`t1`.`s1` AS `s1`,(not(<in_optimizer>(`test`.`t1`.`s1`,<exists>(<index_lookup>(<cache>(`test`.`t1`.`s1`) in t2 on s1 checking NULL where (`test`.`t2`.`s1` < 'a2') having trigcond(<is_not_null_test>(`test`.`t2`.`s1`))))))) AS `s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2')` from `test`.`t1`
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
create table t2 (a int, b int);
|
create table t2 (a int, b int not null);
|
||||||
create table t3 (a int);
|
create table t3 (a int);
|
||||||
insert into t3 values (6),(7),(3);
|
insert into t3 values (6),(7),(3);
|
||||||
select * from t3 where a >= all (select b from t2);
|
select * from t3 where a >= all (select b from t2);
|
||||||
@ -5113,6 +5238,148 @@ SELECT 1 as foo FROM t1 WHERE a < SOME
|
|||||||
);
|
);
|
||||||
foo
|
foo
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a int(11), b varchar(1));
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
delete from t1;
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
drop table t1;
|
||||||
|
End of 5.2 tests
|
||||||
#
|
#
|
||||||
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
||||||
# maria-5.3
|
# maria-5.3
|
||||||
|
@ -927,6 +927,131 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a`,<in_optimizer>(`test`.`t1`.`a`,<exists>(select `test`.`t2`.`a` from `test`.`t2` join `test`.`t3` where ((`test`.`t3`.`a` = `test`.`t2`.`a`) and ((<cache>(`test`.`t1`.`a`) = `test`.`t2`.`a`) or isnull(`test`.`t2`.`a`))) having <is_not_null_test>(`test`.`t2`.`a`))) AS `t1.a in (select t2.a from t2,t3 where t3.a=t2.a)` from `test`.`t1`
|
Note 1003 select `test`.`t1`.`a` AS `a`,<in_optimizer>(`test`.`t1`.`a`,<exists>(select `test`.`t2`.`a` from `test`.`t2` join `test`.`t3` where ((`test`.`t3`.`a` = `test`.`t2`.`a`) and ((<cache>(`test`.`t1`.`a`) = `test`.`t2`.`a`) or isnull(`test`.`t2`.`a`))) having <is_not_null_test>(`test`.`t2`.`a`))) AS `t1.a in (select t2.a from t2,t3 where t3.a=t2.a)` from `test`.`t1`
|
||||||
drop table t1,t2,t3;
|
drop table t1,t2,t3;
|
||||||
|
# check correct NULL Processing for normal IN/ALL/ANY
|
||||||
|
# and 2 ways of max/min optimization
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (1), (100), (NULL), (1000);
|
||||||
|
create table t2 (a int not null);
|
||||||
|
# subselect returns empty set (for NULL and non-NULL left part)
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL 0
|
||||||
|
1000 0
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL 0
|
||||||
|
1000 0
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 1
|
||||||
|
NULL 1
|
||||||
|
1000 1
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
100
|
||||||
|
NULL
|
||||||
|
1000
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
100
|
||||||
|
NULL
|
||||||
|
1000
|
||||||
|
insert into t2 values (1),(200);
|
||||||
|
# sebselect returns non-empty set without NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 0
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 1
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
1000
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1000
|
||||||
|
drop table t2;
|
||||||
|
create table t2 (a int);
|
||||||
|
insert into t2 values (1),(NULL),(200);
|
||||||
|
# sebselect returns non-empty set with NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 NULL
|
||||||
|
NULL NULL
|
||||||
|
1000 NULL
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 NULL
|
||||||
|
100 1
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 NULL
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
drop table t1, t2;
|
||||||
create table t1 (a float);
|
create table t1 (a float);
|
||||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||||
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||||
@ -1506,7 +1631,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`s1` AS `s1`,(not(<in_optimizer>(`test`.`t1`.`s1`,<exists>(<index_lookup>(<cache>(`test`.`t1`.`s1`) in t2 on s1 checking NULL where (`test`.`t2`.`s1` < 'a2') having trigcond(<is_not_null_test>(`test`.`t2`.`s1`))))))) AS `s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2')` from `test`.`t1`
|
Note 1003 select `test`.`t1`.`s1` AS `s1`,(not(<in_optimizer>(`test`.`t1`.`s1`,<exists>(<index_lookup>(<cache>(`test`.`t1`.`s1`) in t2 on s1 checking NULL where (`test`.`t2`.`s1` < 'a2') having trigcond(<is_not_null_test>(`test`.`t2`.`s1`))))))) AS `s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2')` from `test`.`t1`
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
create table t2 (a int, b int);
|
create table t2 (a int, b int not null);
|
||||||
create table t3 (a int);
|
create table t3 (a int);
|
||||||
insert into t3 values (6),(7),(3);
|
insert into t3 values (6),(7),(3);
|
||||||
select * from t3 where a >= all (select b from t2);
|
select * from t3 where a >= all (select b from t2);
|
||||||
@ -5118,6 +5243,148 @@ SELECT 1 as foo FROM t1 WHERE a < SOME
|
|||||||
);
|
);
|
||||||
foo
|
foo
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a int(11), b varchar(1));
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
delete from t1;
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
drop table t1;
|
||||||
|
End of 5.2 tests
|
||||||
#
|
#
|
||||||
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
||||||
# maria-5.3
|
# maria-5.3
|
||||||
|
@ -923,6 +923,131 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a`,<in_optimizer>(`test`.`t1`.`a`,<exists>(select `test`.`t2`.`a` from `test`.`t2` join `test`.`t3` where ((`test`.`t3`.`a` = `test`.`t2`.`a`) and ((<cache>(`test`.`t1`.`a`) = `test`.`t2`.`a`) or isnull(`test`.`t2`.`a`))) having <is_not_null_test>(`test`.`t2`.`a`))) AS `t1.a in (select t2.a from t2,t3 where t3.a=t2.a)` from `test`.`t1`
|
Note 1003 select `test`.`t1`.`a` AS `a`,<in_optimizer>(`test`.`t1`.`a`,<exists>(select `test`.`t2`.`a` from `test`.`t2` join `test`.`t3` where ((`test`.`t3`.`a` = `test`.`t2`.`a`) and ((<cache>(`test`.`t1`.`a`) = `test`.`t2`.`a`) or isnull(`test`.`t2`.`a`))) having <is_not_null_test>(`test`.`t2`.`a`))) AS `t1.a in (select t2.a from t2,t3 where t3.a=t2.a)` from `test`.`t1`
|
||||||
drop table t1,t2,t3;
|
drop table t1,t2,t3;
|
||||||
|
# check correct NULL Processing for normal IN/ALL/ANY
|
||||||
|
# and 2 ways of max/min optimization
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (1), (100), (NULL), (1000);
|
||||||
|
create table t2 (a int not null);
|
||||||
|
# subselect returns empty set (for NULL and non-NULL left part)
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL 0
|
||||||
|
1000 0
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL 0
|
||||||
|
1000 0
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 1
|
||||||
|
NULL 1
|
||||||
|
1000 1
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
100
|
||||||
|
NULL
|
||||||
|
1000
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
100
|
||||||
|
NULL
|
||||||
|
1000
|
||||||
|
insert into t2 values (1),(200);
|
||||||
|
# sebselect returns non-empty set without NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 0
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 1
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
1000
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1000
|
||||||
|
drop table t2;
|
||||||
|
create table t2 (a int);
|
||||||
|
insert into t2 values (1),(NULL),(200);
|
||||||
|
# sebselect returns non-empty set with NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 NULL
|
||||||
|
NULL NULL
|
||||||
|
1000 NULL
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 NULL
|
||||||
|
100 1
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 NULL
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
drop table t1, t2;
|
||||||
create table t1 (a float);
|
create table t1 (a float);
|
||||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||||
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||||
@ -1502,7 +1627,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`s1` AS `s1`,(not(<in_optimizer>(`test`.`t1`.`s1`,<exists>(<index_lookup>(<cache>(`test`.`t1`.`s1`) in t2 on s1 checking NULL where (`test`.`t2`.`s1` < 'a2') having trigcond(<is_not_null_test>(`test`.`t2`.`s1`))))))) AS `s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2')` from `test`.`t1`
|
Note 1003 select `test`.`t1`.`s1` AS `s1`,(not(<in_optimizer>(`test`.`t1`.`s1`,<exists>(<index_lookup>(<cache>(`test`.`t1`.`s1`) in t2 on s1 checking NULL where (`test`.`t2`.`s1` < 'a2') having trigcond(<is_not_null_test>(`test`.`t2`.`s1`))))))) AS `s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2')` from `test`.`t1`
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
create table t2 (a int, b int);
|
create table t2 (a int, b int not null);
|
||||||
create table t3 (a int);
|
create table t3 (a int);
|
||||||
insert into t3 values (6),(7),(3);
|
insert into t3 values (6),(7),(3);
|
||||||
select * from t3 where a >= all (select b from t2);
|
select * from t3 where a >= all (select b from t2);
|
||||||
@ -5114,6 +5239,148 @@ SELECT 1 as foo FROM t1 WHERE a < SOME
|
|||||||
);
|
);
|
||||||
foo
|
foo
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a int(11), b varchar(1));
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
delete from t1;
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
drop table t1;
|
||||||
|
End of 5.2 tests
|
||||||
#
|
#
|
||||||
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
||||||
# maria-5.3
|
# maria-5.3
|
||||||
|
@ -923,6 +923,131 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a`,<in_optimizer>(`test`.`t1`.`a`,<exists>(select `test`.`t2`.`a` from `test`.`t2` join `test`.`t3` where ((`test`.`t3`.`a` = `test`.`t2`.`a`) and ((<cache>(`test`.`t1`.`a`) = `test`.`t2`.`a`) or isnull(`test`.`t2`.`a`))) having <is_not_null_test>(`test`.`t2`.`a`))) AS `t1.a in (select t2.a from t2,t3 where t3.a=t2.a)` from `test`.`t1`
|
Note 1003 select `test`.`t1`.`a` AS `a`,<in_optimizer>(`test`.`t1`.`a`,<exists>(select `test`.`t2`.`a` from `test`.`t2` join `test`.`t3` where ((`test`.`t3`.`a` = `test`.`t2`.`a`) and ((<cache>(`test`.`t1`.`a`) = `test`.`t2`.`a`) or isnull(`test`.`t2`.`a`))) having <is_not_null_test>(`test`.`t2`.`a`))) AS `t1.a in (select t2.a from t2,t3 where t3.a=t2.a)` from `test`.`t1`
|
||||||
drop table t1,t2,t3;
|
drop table t1,t2,t3;
|
||||||
|
# check correct NULL Processing for normal IN/ALL/ANY
|
||||||
|
# and 2 ways of max/min optimization
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (1), (100), (NULL), (1000);
|
||||||
|
create table t2 (a int not null);
|
||||||
|
# subselect returns empty set (for NULL and non-NULL left part)
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL 0
|
||||||
|
1000 0
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL 0
|
||||||
|
1000 0
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 1
|
||||||
|
NULL 1
|
||||||
|
1000 1
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
100
|
||||||
|
NULL
|
||||||
|
1000
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
100
|
||||||
|
NULL
|
||||||
|
1000
|
||||||
|
insert into t2 values (1),(200);
|
||||||
|
# sebselect returns non-empty set without NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 0
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 1
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
1000
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1000
|
||||||
|
drop table t2;
|
||||||
|
create table t2 (a int);
|
||||||
|
insert into t2 values (1),(NULL),(200);
|
||||||
|
# sebselect returns non-empty set with NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 NULL
|
||||||
|
NULL NULL
|
||||||
|
1000 NULL
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 NULL
|
||||||
|
100 1
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 NULL
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
drop table t1, t2;
|
||||||
create table t1 (a float);
|
create table t1 (a float);
|
||||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||||
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||||
@ -1502,7 +1627,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`s1` AS `s1`,(not(<in_optimizer>(`test`.`t1`.`s1`,<exists>(<index_lookup>(<cache>(`test`.`t1`.`s1`) in t2 on s1 checking NULL where (`test`.`t2`.`s1` < 'a2') having trigcond(<is_not_null_test>(`test`.`t2`.`s1`))))))) AS `s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2')` from `test`.`t1`
|
Note 1003 select `test`.`t1`.`s1` AS `s1`,(not(<in_optimizer>(`test`.`t1`.`s1`,<exists>(<index_lookup>(<cache>(`test`.`t1`.`s1`) in t2 on s1 checking NULL where (`test`.`t2`.`s1` < 'a2') having trigcond(<is_not_null_test>(`test`.`t2`.`s1`))))))) AS `s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2')` from `test`.`t1`
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
create table t2 (a int, b int);
|
create table t2 (a int, b int not null);
|
||||||
create table t3 (a int);
|
create table t3 (a int);
|
||||||
insert into t3 values (6),(7),(3);
|
insert into t3 values (6),(7),(3);
|
||||||
select * from t3 where a >= all (select b from t2);
|
select * from t3 where a >= all (select b from t2);
|
||||||
@ -5114,6 +5239,148 @@ SELECT 1 as foo FROM t1 WHERE a < SOME
|
|||||||
);
|
);
|
||||||
foo
|
foo
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a int(11), b varchar(1));
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
delete from t1;
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
drop table t1;
|
||||||
|
End of 5.2 tests
|
||||||
#
|
#
|
||||||
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
||||||
# maria-5.3
|
# maria-5.3
|
||||||
|
@ -926,6 +926,131 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`a` AS `a`,<expr_cache><`test`.`t1`.`a`>(<in_optimizer>(`test`.`t1`.`a`,<exists>(select `test`.`t2`.`a` from `test`.`t2` join `test`.`t3` where ((`test`.`t3`.`a` = `test`.`t2`.`a`) and ((<cache>(`test`.`t1`.`a`) = `test`.`t2`.`a`) or isnull(`test`.`t2`.`a`))) having <is_not_null_test>(`test`.`t2`.`a`)))) AS `t1.a in (select t2.a from t2,t3 where t3.a=t2.a)` from `test`.`t1`
|
Note 1003 select `test`.`t1`.`a` AS `a`,<expr_cache><`test`.`t1`.`a`>(<in_optimizer>(`test`.`t1`.`a`,<exists>(select `test`.`t2`.`a` from `test`.`t2` join `test`.`t3` where ((`test`.`t3`.`a` = `test`.`t2`.`a`) and ((<cache>(`test`.`t1`.`a`) = `test`.`t2`.`a`) or isnull(`test`.`t2`.`a`))) having <is_not_null_test>(`test`.`t2`.`a`)))) AS `t1.a in (select t2.a from t2,t3 where t3.a=t2.a)` from `test`.`t1`
|
||||||
drop table t1,t2,t3;
|
drop table t1,t2,t3;
|
||||||
|
# check correct NULL Processing for normal IN/ALL/ANY
|
||||||
|
# and 2 ways of max/min optimization
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (1), (100), (NULL), (1000);
|
||||||
|
create table t2 (a int not null);
|
||||||
|
# subselect returns empty set (for NULL and non-NULL left part)
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL 0
|
||||||
|
1000 0
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL 0
|
||||||
|
1000 0
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 1
|
||||||
|
NULL 1
|
||||||
|
1000 1
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
100
|
||||||
|
NULL
|
||||||
|
1000
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
100
|
||||||
|
NULL
|
||||||
|
1000
|
||||||
|
insert into t2 values (1),(200);
|
||||||
|
# sebselect returns non-empty set without NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 0
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 1
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
1000
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1000
|
||||||
|
drop table t2;
|
||||||
|
create table t2 (a int);
|
||||||
|
insert into t2 values (1),(NULL),(200);
|
||||||
|
# sebselect returns non-empty set with NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
a a in (select * from t2)
|
||||||
|
1 1
|
||||||
|
100 NULL
|
||||||
|
NULL NULL
|
||||||
|
1000 NULL
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
a a > any (select * from t2)
|
||||||
|
1 NULL
|
||||||
|
100 1
|
||||||
|
NULL NULL
|
||||||
|
1000 1
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
a a > all (select * from t2)
|
||||||
|
1 0
|
||||||
|
100 0
|
||||||
|
NULL NULL
|
||||||
|
1000 NULL
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
a
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
1
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
100
|
||||||
|
1000
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
a
|
||||||
|
drop table t1, t2;
|
||||||
create table t1 (a float);
|
create table t1 (a float);
|
||||||
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
select 10.5 IN (SELECT * from t1 LIMIT 1);
|
||||||
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
ERROR 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
|
||||||
@ -1505,7 +1630,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t1`.`s1` AS `s1`,(not(<expr_cache><`test`.`t1`.`s1`>(<in_optimizer>(`test`.`t1`.`s1`,<exists>(<index_lookup>(<cache>(`test`.`t1`.`s1`) in t2 on s1 checking NULL where (`test`.`t2`.`s1` < 'a2') having trigcond(<is_not_null_test>(`test`.`t2`.`s1`)))))))) AS `s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2')` from `test`.`t1`
|
Note 1003 select `test`.`t1`.`s1` AS `s1`,(not(<expr_cache><`test`.`t1`.`s1`>(<in_optimizer>(`test`.`t1`.`s1`,<exists>(<index_lookup>(<cache>(`test`.`t1`.`s1`) in t2 on s1 checking NULL where (`test`.`t2`.`s1` < 'a2') having trigcond(<is_not_null_test>(`test`.`t2`.`s1`)))))))) AS `s1 NOT IN (SELECT s1 FROM t2 WHERE s1 < 'a2')` from `test`.`t1`
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
create table t2 (a int, b int);
|
create table t2 (a int, b int not null);
|
||||||
create table t3 (a int);
|
create table t3 (a int);
|
||||||
insert into t3 values (6),(7),(3);
|
insert into t3 values (6),(7),(3);
|
||||||
select * from t3 where a >= all (select b from t2);
|
select * from t3 where a >= all (select b from t2);
|
||||||
@ -5117,6 +5242,148 @@ SELECT 1 as foo FROM t1 WHERE a < SOME
|
|||||||
);
|
);
|
||||||
foo
|
foo
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a int(11), b varchar(1));
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
delete from t1;
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
5
|
||||||
|
7
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
a
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
a
|
||||||
|
drop table t1;
|
||||||
|
End of 5.2 tests
|
||||||
#
|
#
|
||||||
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
# BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
||||||
# maria-5.3
|
# maria-5.3
|
||||||
|
@ -305,6 +305,7 @@ select lower(variable_name) as Variable_name, Variable_value as Value from infor
|
|||||||
Variable_name Value
|
Variable_name Value
|
||||||
aria_block_size 8192
|
aria_block_size 8192
|
||||||
aria_checkpoint_interval 30
|
aria_checkpoint_interval 30
|
||||||
|
aria_checkpoint_log_activity 1048576
|
||||||
aria_force_start_after_recovery_failures 0
|
aria_force_start_after_recovery_failures 0
|
||||||
aria_group_commit none
|
aria_group_commit none
|
||||||
aria_group_commit_interval 0
|
aria_group_commit_interval 0
|
||||||
|
@ -152,7 +152,7 @@ DROP TABLE t1;
|
|||||||
--echo # explain extended crash with subquery and ONLY_FULL_GROUP_BY sql_mode
|
--echo # explain extended crash with subquery and ONLY_FULL_GROUP_BY sql_mode
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
CREATE TABLE t1 (f1 INT);
|
CREATE TABLE t1 (f1 INT not null);
|
||||||
|
|
||||||
SELECT @@session.sql_mode INTO @old_sql_mode;
|
SELECT @@session.sql_mode INTO @old_sql_mode;
|
||||||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||||
|
@ -504,6 +504,54 @@ SELECT t1.a, t1.a in (select t2.a from t2,t3 where t3.a=t2.a) FROM t1;
|
|||||||
explain extended SELECT t1.a, t1.a in (select t2.a from t2,t3 where t3.a=t2.a) FROM t1;
|
explain extended SELECT t1.a, t1.a in (select t2.a from t2,t3 where t3.a=t2.a) FROM t1;
|
||||||
drop table t1,t2,t3;
|
drop table t1,t2,t3;
|
||||||
|
|
||||||
|
--echo # check correct NULL Processing for normal IN/ALL/ANY
|
||||||
|
--echo # and 2 ways of max/min optimization
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (1), (100), (NULL), (1000);
|
||||||
|
create table t2 (a int not null);
|
||||||
|
|
||||||
|
--echo # subselect returns empty set (for NULL and non-NULL left part)
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
|
||||||
|
insert into t2 values (1),(200);
|
||||||
|
|
||||||
|
--echo # sebselect returns non-empty set without NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
|
||||||
|
drop table t2;
|
||||||
|
create table t2 (a int);
|
||||||
|
insert into t2 values (1),(NULL),(200);
|
||||||
|
|
||||||
|
--echo # sebselect returns non-empty set with NULLs
|
||||||
|
select a, a in (select * from t2) from t1;
|
||||||
|
select a, a > any (select * from t2) from t1;
|
||||||
|
select a, a > all (select * from t2) from t1;
|
||||||
|
select a from t1 where a in (select * from t2);
|
||||||
|
select a from t1 where a > any (select * from t2);
|
||||||
|
select a from t1 where a > all (select * from t2);
|
||||||
|
select a from t1 where a in (select * from t2 group by a);
|
||||||
|
select a from t1 where a > any (select * from t2 group by a);
|
||||||
|
select a from t1 where a > all (select * from t2 group by a);
|
||||||
|
|
||||||
|
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
#LIMIT is not supported now
|
#LIMIT is not supported now
|
||||||
create table t1 (a float);
|
create table t1 (a float);
|
||||||
-- error ER_NOT_SUPPORTED_YET
|
-- error ER_NOT_SUPPORTED_YET
|
||||||
@ -935,7 +983,7 @@ drop table t1,t2;
|
|||||||
#
|
#
|
||||||
# correct ALL optimisation
|
# correct ALL optimisation
|
||||||
#
|
#
|
||||||
create table t2 (a int, b int);
|
create table t2 (a int, b int not null);
|
||||||
create table t3 (a int);
|
create table t3 (a int);
|
||||||
insert into t3 values (6),(7),(3);
|
insert into t3 values (6),(7),(3);
|
||||||
select * from t3 where a >= all (select b from t2);
|
select * from t3 where a >= all (select b from t2);
|
||||||
@ -4379,6 +4427,71 @@ SELECT 1 as foo FROM t1 WHERE a < SOME
|
|||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# LP BUG#823169 NULLs with ALL/ANY and maxmin optimization
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a int(11), b varchar(1));
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
|
||||||
|
delete from t1;
|
||||||
|
INSERT INTO t1 VALUES (2,NULL),(5,'d'),(7,'g');
|
||||||
|
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b < ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b > ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b <= ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b >= ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b = ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b <> ANY ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b < ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b > ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b <= ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b >= ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b = ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 );
|
||||||
|
SELECT a FROM t1 WHERE b <> ALL ( SELECT b FROM t1 GROUP BY b );
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo End of 5.2 tests
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
--echo # BUG#779885: Crash in eliminate_item_equal with materialization=on in
|
||||||
--echo # maria-5.3
|
--echo # maria-5.3
|
||||||
|
@ -1741,7 +1741,7 @@ int my_b_flush_io_cache(IO_CACHE *info,
|
|||||||
*/
|
*/
|
||||||
if (!append_cache && info->seek_not_done)
|
if (!append_cache && info->seek_not_done)
|
||||||
{ /* File touched, do seek */
|
{ /* File touched, do seek */
|
||||||
if (my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0)) ==
|
if (my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(info->myflags & MY_WME)) ==
|
||||||
MY_FILEPOS_ERROR)
|
MY_FILEPOS_ERROR)
|
||||||
{
|
{
|
||||||
UNLOCK_APPEND_BUFFER;
|
UNLOCK_APPEND_BUFFER;
|
||||||
|
@ -77,6 +77,8 @@ my_bool my_init(void)
|
|||||||
mysys_usage_id++;
|
mysys_usage_id++;
|
||||||
my_umask= 0660; /* Default umask for new files */
|
my_umask= 0660; /* Default umask for new files */
|
||||||
my_umask_dir= 0700; /* Default umask for new directories */
|
my_umask_dir= 0700; /* Default umask for new directories */
|
||||||
|
my_global_flags= 0;
|
||||||
|
|
||||||
init_glob_errs();
|
init_glob_errs();
|
||||||
my_progname_short= "unknown";
|
my_progname_short= "unknown";
|
||||||
if (my_progname)
|
if (my_progname)
|
||||||
|
@ -31,6 +31,8 @@ void *my_malloc(size_t size, myf my_flags)
|
|||||||
void* point;
|
void* point;
|
||||||
DBUG_ENTER("my_malloc");
|
DBUG_ENTER("my_malloc");
|
||||||
DBUG_PRINT("my",("size: %lu my_flags: %d", (ulong) size, my_flags));
|
DBUG_PRINT("my",("size: %lu my_flags: %d", (ulong) size, my_flags));
|
||||||
|
if (!(my_flags & (MY_WME | MY_FAE)))
|
||||||
|
my_flags|= my_global_flags;
|
||||||
|
|
||||||
if (!size)
|
if (!size)
|
||||||
size=1; /* Safety */
|
size=1; /* Safety */
|
||||||
@ -48,7 +50,9 @@ void *my_malloc(size_t size, myf my_flags)
|
|||||||
if (my_flags & MY_FAE)
|
if (my_flags & MY_FAE)
|
||||||
error_handler_hook=fatal_error_handler_hook;
|
error_handler_hook=fatal_error_handler_hook;
|
||||||
if (my_flags & (MY_FAE+MY_WME))
|
if (my_flags & (MY_FAE+MY_WME))
|
||||||
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG+ME_NOREFRESH),size);
|
my_error(EE_OUTOFMEMORY,
|
||||||
|
MYF(ME_BELL | ME_WAITTANG | ME_NOREFRESH | (my_flags & ME_JUST_INFO)),
|
||||||
|
size);
|
||||||
DBUG_EXECUTE_IF("simulate_out_of_memory",
|
DBUG_EXECUTE_IF("simulate_out_of_memory",
|
||||||
DBUG_SET("-d,simulate_out_of_memory"););
|
DBUG_SET("-d,simulate_out_of_memory"););
|
||||||
if (my_flags & MY_FAE)
|
if (my_flags & MY_FAE)
|
||||||
|
@ -41,6 +41,8 @@ File my_open(const char *FileName, int Flags, myf MyFlags)
|
|||||||
DBUG_ENTER("my_open");
|
DBUG_ENTER("my_open");
|
||||||
DBUG_PRINT("my",("Name: '%s' Flags: %d MyFlags: %d",
|
DBUG_PRINT("my",("Name: '%s' Flags: %d MyFlags: %d",
|
||||||
FileName, Flags, MyFlags));
|
FileName, Flags, MyFlags));
|
||||||
|
if (!(MyFlags & (MY_WME | MY_FAE | MY_FFNF)))
|
||||||
|
MyFlags|= my_global_flags;
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
fd= my_win_open(FileName, Flags);
|
fd= my_win_open(FileName, Flags);
|
||||||
#elif !defined(NO_OPEN_3)
|
#elif !defined(NO_OPEN_3)
|
||||||
@ -69,6 +71,8 @@ int my_close(File fd, myf MyFlags)
|
|||||||
int err;
|
int err;
|
||||||
DBUG_ENTER("my_close");
|
DBUG_ENTER("my_close");
|
||||||
DBUG_PRINT("my",("fd: %d MyFlags: %d",fd, MyFlags));
|
DBUG_PRINT("my",("fd: %d MyFlags: %d",fd, MyFlags));
|
||||||
|
if (!(MyFlags & (MY_WME | MY_FAE)))
|
||||||
|
MyFlags|= my_global_flags;
|
||||||
|
|
||||||
pthread_mutex_lock(&THR_LOCK_open);
|
pthread_mutex_lock(&THR_LOCK_open);
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
@ -84,7 +88,8 @@ int my_close(File fd, myf MyFlags)
|
|||||||
DBUG_PRINT("error",("Got error %d on close",err));
|
DBUG_PRINT("error",("Got error %d on close",err));
|
||||||
my_errno=errno;
|
my_errno=errno;
|
||||||
if (MyFlags & (MY_FAE | MY_WME))
|
if (MyFlags & (MY_FAE | MY_WME))
|
||||||
my_error(EE_BADCLOSE, MYF(ME_BELL+ME_WAITTANG),my_filename(fd),errno);
|
my_error(EE_BADCLOSE, MYF(ME_BELL | ME_WAITTANG | (MyFlags & (ME_JUST_INFO | ME_NOREFRESH))),
|
||||||
|
my_filename(fd),errno);
|
||||||
}
|
}
|
||||||
if ((uint) fd < my_file_limit && my_file_info[fd].type != UNOPEN)
|
if ((uint) fd < my_file_limit && my_file_info[fd].type != UNOPEN)
|
||||||
{
|
{
|
||||||
@ -150,8 +155,8 @@ File my_register_filename(File fd, const char *FileName, enum file_type
|
|||||||
{
|
{
|
||||||
if (my_errno == EMFILE)
|
if (my_errno == EMFILE)
|
||||||
error_message_number= EE_OUT_OF_FILERESOURCES;
|
error_message_number= EE_OUT_OF_FILERESOURCES;
|
||||||
DBUG_PRINT("error",("print err: %d",error_message_number));
|
my_error(error_message_number,
|
||||||
my_error(error_message_number, MYF(ME_BELL+ME_WAITTANG),
|
MYF(ME_BELL | ME_WAITTANG | (MyFlags & (ME_JUST_INFO | ME_NOREFRESH))),
|
||||||
FileName, my_errno);
|
FileName, my_errno);
|
||||||
}
|
}
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(-1);
|
||||||
|
@ -56,6 +56,9 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset,
|
|||||||
Filedes, ullstr(offset, llbuf), (long) Buffer,
|
Filedes, ullstr(offset, llbuf), (long) Buffer,
|
||||||
(ulong)Count, MyFlags));
|
(ulong)Count, MyFlags));
|
||||||
#endif
|
#endif
|
||||||
|
if (!(MyFlags & (MY_WME | MY_FAE | MY_FNABP)))
|
||||||
|
MyFlags|= my_global_flags;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
errno= 0; /* Linux, Windows don't reset this on EOF/success */
|
errno= 0; /* Linux, Windows don't reset this on EOF/success */
|
||||||
@ -84,11 +87,13 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset,
|
|||||||
#endif
|
#endif
|
||||||
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
|
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
|
||||||
{
|
{
|
||||||
if (readbytes == (size_t) -1)
|
if (readbytes == (size_t) -1)
|
||||||
my_error(EE_READ, MYF(ME_BELL+ME_WAITTANG),
|
my_error(EE_READ,
|
||||||
my_filename(Filedes),my_errno);
|
MYF(ME_BELL | ME_WAITTANG | (MyFlags & (ME_JUST_INFO | ME_NOREFRESH))),
|
||||||
else if (MyFlags & (MY_NABP | MY_FNABP))
|
my_filename(Filedes),my_errno);
|
||||||
my_error(EE_EOFERR, MYF(ME_BELL+ME_WAITTANG),
|
else if (MyFlags & (MY_NABP | MY_FNABP))
|
||||||
|
my_error(EE_EOFERR,
|
||||||
|
MYF(ME_BELL | ME_WAITTANG | (MyFlags & (ME_JUST_INFO | ME_NOREFRESH))),
|
||||||
my_filename(Filedes),my_errno);
|
my_filename(Filedes),my_errno);
|
||||||
}
|
}
|
||||||
if (readbytes == (size_t) -1 || (MyFlags & (MY_FNABP | MY_NABP)))
|
if (readbytes == (size_t) -1 || (MyFlags & (MY_FNABP | MY_NABP)))
|
||||||
@ -136,6 +141,8 @@ size_t my_pwrite(int Filedes, const uchar *Buffer, size_t Count,
|
|||||||
#endif
|
#endif
|
||||||
errors= 0;
|
errors= 0;
|
||||||
written= 0;
|
written= 0;
|
||||||
|
if (!(MyFlags & (MY_WME | MY_FAE | MY_FNABP)))
|
||||||
|
MyFlags|= my_global_flags;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
@ -170,20 +177,19 @@ size_t my_pwrite(int Filedes, const uchar *Buffer, size_t Count,
|
|||||||
if ((writtenbytes && writtenbytes != (size_t) -1) || my_errno == EINTR)
|
if ((writtenbytes && writtenbytes != (size_t) -1) || my_errno == EINTR)
|
||||||
continue; /* Retry */
|
continue; /* Retry */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Don't give a warning if it's ok that we only write part of the data */
|
||||||
if (MyFlags & (MY_NABP | MY_FNABP))
|
if (MyFlags & (MY_NABP | MY_FNABP))
|
||||||
{
|
{
|
||||||
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
|
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
|
||||||
{
|
my_error(EE_WRITE, MYF(ME_BELL | ME_WAITTANG | (MyFlags & (ME_JUST_INFO | ME_NOREFRESH))),
|
||||||
my_error(EE_WRITE, MYF(ME_BELL | ME_WAITTANG),
|
|
||||||
my_filename(Filedes),my_errno);
|
my_filename(Filedes),my_errno);
|
||||||
}
|
DBUG_RETURN(MY_FILE_ERROR); /* Error on write */
|
||||||
DBUG_RETURN(MY_FILE_ERROR); /* Error on read */
|
|
||||||
}
|
}
|
||||||
else
|
break; /* Return bytes written */
|
||||||
break; /* Return bytes written */
|
|
||||||
}
|
}
|
||||||
DBUG_EXECUTE_IF("check", my_seek(Filedes, -1, SEEK_SET, MYF(0)););
|
DBUG_EXECUTE_IF("check", my_seek(Filedes, -1, SEEK_SET, MYF(0)););
|
||||||
if (MyFlags & (MY_NABP | MY_FNABP))
|
if (MyFlags & (MY_NABP | MY_FNABP))
|
||||||
DBUG_RETURN(0); /* Want only errors */
|
DBUG_RETURN(0); /* Want only errors */
|
||||||
DBUG_RETURN(writtenbytes+written); /* purecov: inspected */
|
DBUG_RETURN(writtenbytes+written); /* purecov: inspected */
|
||||||
} /* my_pwrite */
|
} /* my_pwrite */
|
||||||
|
@ -40,6 +40,8 @@ size_t my_read(File Filedes, uchar *Buffer, size_t Count, myf MyFlags)
|
|||||||
DBUG_PRINT("my",("fd: %d Buffer: 0x%lx Count: %lu MyFlags: %d",
|
DBUG_PRINT("my",("fd: %d Buffer: 0x%lx Count: %lu MyFlags: %d",
|
||||||
Filedes, (long) Buffer, (ulong) Count, MyFlags));
|
Filedes, (long) Buffer, (ulong) Count, MyFlags));
|
||||||
save_count= Count;
|
save_count= Count;
|
||||||
|
if (!(MyFlags & (MY_WME | MY_FAE | MY_FNABP)))
|
||||||
|
MyFlags|= my_global_flags;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
@ -69,10 +71,12 @@ size_t my_read(File Filedes, uchar *Buffer, size_t Count, myf MyFlags)
|
|||||||
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
|
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
|
||||||
{
|
{
|
||||||
if (readbytes == (size_t) -1)
|
if (readbytes == (size_t) -1)
|
||||||
my_error(EE_READ, MYF(ME_BELL+ME_WAITTANG),
|
my_error(EE_READ,
|
||||||
|
MYF(ME_BELL | ME_WAITTANG | (MyFlags & (ME_JUST_INFO | ME_NOREFRESH))),
|
||||||
my_filename(Filedes),my_errno);
|
my_filename(Filedes),my_errno);
|
||||||
else if (MyFlags & (MY_NABP | MY_FNABP))
|
else if (MyFlags & (MY_NABP | MY_FNABP))
|
||||||
my_error(EE_EOFERR, MYF(ME_BELL+ME_WAITTANG),
|
my_error(EE_EOFERR,
|
||||||
|
MYF(ME_BELL | ME_WAITTANG | (MyFlags & (ME_JUST_INFO | ME_NOREFRESH))),
|
||||||
my_filename(Filedes),my_errno);
|
my_filename(Filedes),my_errno);
|
||||||
}
|
}
|
||||||
if (readbytes == (size_t) -1 ||
|
if (readbytes == (size_t) -1 ||
|
||||||
|
@ -32,6 +32,7 @@ char NEAR curr_dir[FN_REFLEN]= {0},
|
|||||||
ulong my_stream_opened=0,my_file_opened=0, my_tmp_file_created=0;
|
ulong my_stream_opened=0,my_file_opened=0, my_tmp_file_created=0;
|
||||||
ulong my_file_total_opened= 0;
|
ulong my_file_total_opened= 0;
|
||||||
int NEAR my_umask=0664, NEAR my_umask_dir=0777;
|
int NEAR my_umask=0664, NEAR my_umask_dir=0777;
|
||||||
|
myf my_global_flags;
|
||||||
#ifndef THREAD
|
#ifndef THREAD
|
||||||
int NEAR my_errno=0;
|
int NEAR my_errno=0;
|
||||||
#endif
|
#endif
|
||||||
|
@ -28,6 +28,8 @@ size_t my_write(int Filedes, const uchar *Buffer, size_t Count, myf MyFlags)
|
|||||||
DBUG_PRINT("my",("fd: %d Buffer: 0x%lx Count: %lu MyFlags: %d",
|
DBUG_PRINT("my",("fd: %d Buffer: 0x%lx Count: %lu MyFlags: %d",
|
||||||
Filedes, (long) Buffer, (ulong) Count, MyFlags));
|
Filedes, (long) Buffer, (ulong) Count, MyFlags));
|
||||||
errors=0; written=0;
|
errors=0; written=0;
|
||||||
|
if (!(MyFlags & (MY_WME | MY_FAE | MY_FNABP)))
|
||||||
|
MyFlags|= my_global_flags;
|
||||||
|
|
||||||
/* The behavior of write(fd, buf, 0) is not portable */
|
/* The behavior of write(fd, buf, 0) is not portable */
|
||||||
if (unlikely(!Count))
|
if (unlikely(!Count))
|
||||||
@ -88,19 +90,20 @@ size_t my_write(int Filedes, const uchar *Buffer, size_t Count, myf MyFlags)
|
|||||||
else
|
else
|
||||||
continue; /* Retry */
|
continue; /* Retry */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Don't give a warning if it's ok that we only write part of the data */
|
||||||
if (MyFlags & (MY_NABP | MY_FNABP))
|
if (MyFlags & (MY_NABP | MY_FNABP))
|
||||||
{
|
{
|
||||||
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
|
if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
|
||||||
{
|
{
|
||||||
my_error(EE_WRITE, MYF(ME_BELL+ME_WAITTANG),
|
my_error(EE_WRITE, MYF(ME_BELL | ME_WAITTANG | (MyFlags & (ME_JUST_INFO | ME_NOREFRESH))),
|
||||||
my_filename(Filedes),my_errno);
|
my_filename(Filedes),my_errno);
|
||||||
}
|
}
|
||||||
DBUG_RETURN(MY_FILE_ERROR); /* Error on read */
|
DBUG_RETURN(MY_FILE_ERROR); /* Error on read */
|
||||||
}
|
}
|
||||||
else
|
break; /* Return bytes written */
|
||||||
break; /* Return bytes written */
|
|
||||||
}
|
}
|
||||||
if (MyFlags & (MY_NABP | MY_FNABP))
|
if (MyFlags & (MY_NABP | MY_FNABP))
|
||||||
DBUG_RETURN(0); /* Want only errors */
|
DBUG_RETURN(0); /* Want only errors */
|
||||||
DBUG_RETURN(writtenbytes+written);
|
DBUG_RETURN(writtenbytes+written);
|
||||||
} /* my_write */
|
} /* my_write */
|
||||||
|
@ -822,7 +822,10 @@ Item_maxmin_subselect::Item_maxmin_subselect(THD *thd_param,
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("Item_maxmin_subselect::Item_maxmin_subselect");
|
DBUG_ENTER("Item_maxmin_subselect::Item_maxmin_subselect");
|
||||||
max= max_arg;
|
max= max_arg;
|
||||||
init(select_lex, new select_max_min_finder_subselect(this, max_arg));
|
init(select_lex,
|
||||||
|
new select_max_min_finder_subselect(this, max_arg,
|
||||||
|
parent->substype() ==
|
||||||
|
Item_subselect::ALL_SUBS));
|
||||||
max_columns= 1;
|
max_columns= 1;
|
||||||
maybe_null= 1;
|
maybe_null= 1;
|
||||||
max_columns= 1;
|
max_columns= 1;
|
||||||
@ -1599,11 +1602,20 @@ bool Item_allany_subselect::transform_into_max_min(JOIN *join)
|
|||||||
*/
|
*/
|
||||||
DBUG_ASSERT(!substitution);
|
DBUG_ASSERT(!substitution);
|
||||||
|
|
||||||
if (!select_lex->group_list.elements &&
|
/*
|
||||||
!select_lex->having &&
|
Check if optimization with aggregate min/max possible
|
||||||
!select_lex->with_sum_func &&
|
1 There is no aggregate in the subquery
|
||||||
!(select_lex->next_select()) &&
|
2 It is not UNION
|
||||||
select_lex->table_list.elements)
|
3 There is tables
|
||||||
|
4 It is not ALL subquery with possible NULLs in the SELECT list
|
||||||
|
*/
|
||||||
|
if (!select_lex->group_list.elements && /*1*/
|
||||||
|
!select_lex->having && /*1*/
|
||||||
|
!select_lex->with_sum_func && /*1*/
|
||||||
|
!(select_lex->next_select()) && /*2*/
|
||||||
|
select_lex->table_list.elements && /*3*/
|
||||||
|
(!select_lex->ref_pointer_array[0]->maybe_null || /*4*/
|
||||||
|
substype() != Item_subselect::ALL_SUBS)) /*4*/
|
||||||
{
|
{
|
||||||
Item_sum_hybrid *item;
|
Item_sum_hybrid *item;
|
||||||
nesting_map save_allow_sum_func;
|
nesting_map save_allow_sum_func;
|
||||||
|
@ -3099,7 +3099,7 @@ int my_message_sql(uint error, const char *str, myf MyFlags)
|
|||||||
MYSQL_ERROR::enum_warning_level level;
|
MYSQL_ERROR::enum_warning_level level;
|
||||||
sql_print_message_func func;
|
sql_print_message_func func;
|
||||||
DBUG_ENTER("my_message_sql");
|
DBUG_ENTER("my_message_sql");
|
||||||
DBUG_PRINT("error", ("error: %u message: '%s'", error, str));
|
DBUG_PRINT("error", ("error: %u message: '%s' Flag: %d", error, str, MyFlags));
|
||||||
|
|
||||||
DBUG_ASSERT(str != NULL);
|
DBUG_ASSERT(str != NULL);
|
||||||
/*
|
/*
|
||||||
@ -3143,7 +3143,10 @@ int my_message_sql(uint error, const char *str, myf MyFlags)
|
|||||||
this could be improved by having a common stack of handlers.
|
this could be improved by having a common stack of handlers.
|
||||||
*/
|
*/
|
||||||
if (thd->handle_error(error, str, level))
|
if (thd->handle_error(error, str, level))
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info", ("error handled by handle_error()"));
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
if (level == MYSQL_ERROR::WARN_LEVEL_WARN)
|
if (level == MYSQL_ERROR::WARN_LEVEL_WARN)
|
||||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, error, str);
|
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, error, str);
|
||||||
@ -3222,7 +3225,7 @@ to_error_log:
|
|||||||
/* When simulating OOM, skip writing to error log to avoid mtr errors */
|
/* When simulating OOM, skip writing to error log to avoid mtr errors */
|
||||||
DBUG_EXECUTE_IF("simulate_out_of_memory", DBUG_RETURN(0););
|
DBUG_EXECUTE_IF("simulate_out_of_memory", DBUG_RETURN(0););
|
||||||
|
|
||||||
if (!thd || (MyFlags & ME_NOREFRESH))
|
if (!thd || thd->log_all_errors || (MyFlags & ME_NOREFRESH))
|
||||||
(*func)("%s: %s", my_progname_short, str); /* purecov: inspected */
|
(*func)("%s: %s", my_progname_short, str); /* purecov: inspected */
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
@ -6584,8 +6587,7 @@ each time the SQL thread starts.",
|
|||||||
"log and this option just turns on --log-bin instead.",
|
"log and this option just turns on --log-bin instead.",
|
||||||
&opt_update_logname, &opt_update_logname, 0, GET_STR,
|
&opt_update_logname, &opt_update_logname, 0, GET_STR,
|
||||||
OPT_ARG, 0, 0, 0, 0, 0, 0},
|
OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"log-warnings", 'W', "Log some not critical warnings to the general log "
|
{"log-warnings", 'W', "Log some not critical warnings to the general log file. Value can be between 0-6; The higher value, the more warnings",
|
||||||
"file.",
|
|
||||||
&global_system_variables.log_warnings,
|
&global_system_variables.log_warnings,
|
||||||
&max_system_variables.log_warnings, 0, GET_ULONG, OPT_ARG, 1, 0, 0,
|
&max_system_variables.log_warnings, 0, GET_ULONG, OPT_ARG, 1, 0, 0,
|
||||||
0, 0, 0},
|
0, 0, 0},
|
||||||
@ -9577,6 +9579,16 @@ static int get_options(int *argc,char **argv)
|
|||||||
myisam_block_size=(uint) 1 << my_bit_log2(opt_myisam_block_size);
|
myisam_block_size=(uint) 1 << my_bit_log2(opt_myisam_block_size);
|
||||||
my_crc_dbug_check= opt_my_crc_dbug_check;
|
my_crc_dbug_check= opt_my_crc_dbug_check;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Log mysys errors when we don't have a thd or thd->log_all_errors is set (recovery) to
|
||||||
|
the log. This is mainly useful for debugging strange system errors.
|
||||||
|
*/
|
||||||
|
if (global_system_variables.log_warnings >= 10)
|
||||||
|
my_global_flags= MY_WME | ME_JUST_INFO;
|
||||||
|
/* Log all errors not handled by thd->handle_error() to my_message_sql() */
|
||||||
|
if (global_system_variables.log_warnings >= 11)
|
||||||
|
my_global_flags|= ME_NOREFRESH;
|
||||||
|
|
||||||
/* long_query_time is in microseconds */
|
/* long_query_time is in microseconds */
|
||||||
global_system_variables.long_query_time= max_system_variables.long_query_time=
|
global_system_variables.long_query_time= max_system_variables.long_query_time=
|
||||||
(longlong) (long_query_time * 1000000.0);
|
(longlong) (long_query_time * 1000000.0);
|
||||||
|
@ -62,7 +62,7 @@ private:
|
|||||||
bool
|
bool
|
||||||
Prelock_error_handler::handle_error(uint sql_errno,
|
Prelock_error_handler::handle_error(uint sql_errno,
|
||||||
const char * /* message */,
|
const char * /* message */,
|
||||||
MYSQL_ERROR::enum_warning_level /* level */,
|
MYSQL_ERROR::enum_warning_level level,
|
||||||
THD * /* thd */)
|
THD * /* thd */)
|
||||||
{
|
{
|
||||||
if (sql_errno == ER_NO_SUCH_TABLE)
|
if (sql_errno == ER_NO_SUCH_TABLE)
|
||||||
@ -71,7 +71,8 @@ Prelock_error_handler::handle_error(uint sql_errno,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_unhandled_errors++;
|
if (level == MYSQL_ERROR::WARN_LEVEL_ERROR)
|
||||||
|
m_unhandled_errors++;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -664,7 +664,7 @@ THD::THD()
|
|||||||
Open_tables_state(refresh_version), rli_fake(0),
|
Open_tables_state(refresh_version), rli_fake(0),
|
||||||
lock_id(&main_lock_id),
|
lock_id(&main_lock_id),
|
||||||
in_sub_stmt(0),
|
in_sub_stmt(0),
|
||||||
sql_log_bin_toplevel(false),
|
sql_log_bin_toplevel(false), log_all_errors(0),
|
||||||
binlog_table_maps(0), binlog_flags(0UL),
|
binlog_table_maps(0), binlog_flags(0UL),
|
||||||
table_map_for_update(0),
|
table_map_for_update(0),
|
||||||
arg_of_last_insert_id_function(FALSE),
|
arg_of_last_insert_id_function(FALSE),
|
||||||
@ -2599,26 +2599,32 @@ bool select_max_min_finder_subselect::cmp_real()
|
|||||||
{
|
{
|
||||||
Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0);
|
Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0);
|
||||||
double val1= cache->val_real(), val2= maxmin->val_real();
|
double val1= cache->val_real(), val2= maxmin->val_real();
|
||||||
|
|
||||||
|
/* Ignore NULLs for ANY and keep them for ALL subqueries */
|
||||||
|
if (cache->null_value)
|
||||||
|
return (is_all && !maxmin->null_value) || (!is_all && maxmin->null_value);
|
||||||
|
if (maxmin->null_value)
|
||||||
|
return !is_all;
|
||||||
|
|
||||||
if (fmax)
|
if (fmax)
|
||||||
return (cache->null_value && !maxmin->null_value) ||
|
return(val1 > val2);
|
||||||
(!cache->null_value && !maxmin->null_value &&
|
return (val1 < val2);
|
||||||
val1 > val2);
|
|
||||||
return (maxmin->null_value && !cache->null_value) ||
|
|
||||||
(!cache->null_value && !maxmin->null_value &&
|
|
||||||
val1 < val2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool select_max_min_finder_subselect::cmp_int()
|
bool select_max_min_finder_subselect::cmp_int()
|
||||||
{
|
{
|
||||||
Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0);
|
Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0);
|
||||||
longlong val1= cache->val_int(), val2= maxmin->val_int();
|
longlong val1= cache->val_int(), val2= maxmin->val_int();
|
||||||
|
|
||||||
|
/* Ignore NULLs for ANY and keep them for ALL subqueries */
|
||||||
|
if (cache->null_value)
|
||||||
|
return (is_all && !maxmin->null_value) || (!is_all && maxmin->null_value);
|
||||||
|
if (maxmin->null_value)
|
||||||
|
return !is_all;
|
||||||
|
|
||||||
if (fmax)
|
if (fmax)
|
||||||
return (cache->null_value && !maxmin->null_value) ||
|
return(val1 > val2);
|
||||||
(!cache->null_value && !maxmin->null_value &&
|
return (val1 < val2);
|
||||||
val1 > val2);
|
|
||||||
return (maxmin->null_value && !cache->null_value) ||
|
|
||||||
(!cache->null_value && !maxmin->null_value &&
|
|
||||||
val1 < val2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool select_max_min_finder_subselect::cmp_decimal()
|
bool select_max_min_finder_subselect::cmp_decimal()
|
||||||
@ -2626,13 +2632,16 @@ bool select_max_min_finder_subselect::cmp_decimal()
|
|||||||
Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0);
|
Item *maxmin= ((Item_singlerow_subselect *)item)->element_index(0);
|
||||||
my_decimal cval, *cvalue= cache->val_decimal(&cval);
|
my_decimal cval, *cvalue= cache->val_decimal(&cval);
|
||||||
my_decimal mval, *mvalue= maxmin->val_decimal(&mval);
|
my_decimal mval, *mvalue= maxmin->val_decimal(&mval);
|
||||||
|
|
||||||
|
/* Ignore NULLs for ANY and keep them for ALL subqueries */
|
||||||
|
if (cache->null_value)
|
||||||
|
return (is_all && !maxmin->null_value) || (!is_all && maxmin->null_value);
|
||||||
|
if (maxmin->null_value)
|
||||||
|
return !is_all;
|
||||||
|
|
||||||
if (fmax)
|
if (fmax)
|
||||||
return (cache->null_value && !maxmin->null_value) ||
|
return (my_decimal_cmp(cvalue, mvalue) > 0) ;
|
||||||
(!cache->null_value && !maxmin->null_value &&
|
return (my_decimal_cmp(cvalue,mvalue) < 0);
|
||||||
my_decimal_cmp(cvalue, mvalue) > 0) ;
|
|
||||||
return (maxmin->null_value && !cache->null_value) ||
|
|
||||||
(!cache->null_value && !maxmin->null_value &&
|
|
||||||
my_decimal_cmp(cvalue,mvalue) < 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool select_max_min_finder_subselect::cmp_str()
|
bool select_max_min_finder_subselect::cmp_str()
|
||||||
@ -2645,13 +2654,16 @@ bool select_max_min_finder_subselect::cmp_str()
|
|||||||
*/
|
*/
|
||||||
val1= cache->val_str(&buf1);
|
val1= cache->val_str(&buf1);
|
||||||
val2= maxmin->val_str(&buf1);
|
val2= maxmin->val_str(&buf1);
|
||||||
|
|
||||||
|
/* Ignore NULLs for ANY and keep them for ALL subqueries */
|
||||||
|
if (cache->null_value)
|
||||||
|
return (is_all && !maxmin->null_value) || (!is_all && maxmin->null_value);
|
||||||
|
if (maxmin->null_value)
|
||||||
|
return !is_all;
|
||||||
|
|
||||||
if (fmax)
|
if (fmax)
|
||||||
return (cache->null_value && !maxmin->null_value) ||
|
return (sortcmp(val1, val2, cache->collation.collation) > 0) ;
|
||||||
(!cache->null_value && !maxmin->null_value &&
|
return (sortcmp(val1, val2, cache->collation.collation) < 0);
|
||||||
sortcmp(val1, val2, cache->collation.collation) > 0) ;
|
|
||||||
return (maxmin->null_value && !cache->null_value) ||
|
|
||||||
(!cache->null_value && !maxmin->null_value &&
|
|
||||||
sortcmp(val1, val2, cache->collation.collation) < 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int select_exists_subselect::send_data(List<Item> &items)
|
int select_exists_subselect::send_data(List<Item> &items)
|
||||||
|
@ -1596,6 +1596,8 @@ public:
|
|||||||
bool sql_log_bin_toplevel;
|
bool sql_log_bin_toplevel;
|
||||||
/* True when opt_userstat_running is set at start of query */
|
/* True when opt_userstat_running is set at start of query */
|
||||||
bool userstat_running;
|
bool userstat_running;
|
||||||
|
/* True if we want to log all errors */
|
||||||
|
bool log_all_errors;
|
||||||
|
|
||||||
/* container for handler's private per-connection data */
|
/* container for handler's private per-connection data */
|
||||||
Ha_data ha_data[MAX_HA];
|
Ha_data ha_data[MAX_HA];
|
||||||
@ -3218,9 +3220,11 @@ class select_max_min_finder_subselect :public select_subselect
|
|||||||
Item_cache *cache;
|
Item_cache *cache;
|
||||||
bool (select_max_min_finder_subselect::*op)();
|
bool (select_max_min_finder_subselect::*op)();
|
||||||
bool fmax;
|
bool fmax;
|
||||||
|
bool is_all;
|
||||||
public:
|
public:
|
||||||
select_max_min_finder_subselect(Item_subselect *item_arg, bool mx)
|
select_max_min_finder_subselect(Item_subselect *item_arg, bool mx,
|
||||||
:select_subselect(item_arg), cache(0), fmax(mx)
|
bool all)
|
||||||
|
:select_subselect(item_arg), cache(0), fmax(mx), is_all(all)
|
||||||
{}
|
{}
|
||||||
void cleanup();
|
void cleanup();
|
||||||
int send_data(List<Item> &items);
|
int send_data(List<Item> &items);
|
||||||
|
@ -989,14 +989,13 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
|
|||||||
#endif
|
#endif
|
||||||
next_chunk+= 5 + partition_info_len;
|
next_chunk+= 5 + partition_info_len;
|
||||||
}
|
}
|
||||||
if (share->mysql_version >= 50110)
|
if (share->mysql_version >= 50110 && next_chunk < buff_end)
|
||||||
{
|
{
|
||||||
/* New auto_partitioned indicator introduced in 5.1.11 */
|
/* New auto_partitioned indicator introduced in 5.1.11 */
|
||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||||
share->auto_partitioned= *next_chunk;
|
share->auto_partitioned= *next_chunk;
|
||||||
#endif
|
#endif
|
||||||
next_chunk++;
|
next_chunk++;
|
||||||
DBUG_ASSERT(next_chunk <= buff_end);
|
|
||||||
}
|
}
|
||||||
keyinfo= share->key_info;
|
keyinfo= share->key_info;
|
||||||
for (i= 0; i < keys; i++, keyinfo++)
|
for (i= 0; i < keys; i++, keyinfo++)
|
||||||
|
@ -150,10 +150,16 @@ static MYSQL_SYSVAR_ULONG(block_size, maria_block_size,
|
|||||||
|
|
||||||
static MYSQL_SYSVAR_ULONG(checkpoint_interval, checkpoint_interval,
|
static MYSQL_SYSVAR_ULONG(checkpoint_interval, checkpoint_interval,
|
||||||
PLUGIN_VAR_RQCMDARG,
|
PLUGIN_VAR_RQCMDARG,
|
||||||
"Interval between automatic checkpoints, in seconds; 0 means"
|
"Interval between tries to do an automatic checkpoints. In seconds; 0 means"
|
||||||
" 'no automatic checkpoints' which makes sense only for testing.",
|
" 'no automatic checkpoints' which makes sense only for testing.",
|
||||||
NULL, update_checkpoint_interval, 30, 0, UINT_MAX, 1);
|
NULL, update_checkpoint_interval, 30, 0, UINT_MAX, 1);
|
||||||
|
|
||||||
|
static MYSQL_SYSVAR_ULONG(checkpoint_log_activity, maria_checkpoint_min_log_activity,
|
||||||
|
PLUGIN_VAR_RQCMDARG,
|
||||||
|
"Number of bytes that the transaction log has to grow between checkpoints before a new "
|
||||||
|
"checkpoint is written to the log.",
|
||||||
|
NULL, NULL, 1024*1024, 0, UINT_MAX, 1);
|
||||||
|
|
||||||
static MYSQL_SYSVAR_ULONG(force_start_after_recovery_failures,
|
static MYSQL_SYSVAR_ULONG(force_start_after_recovery_failures,
|
||||||
force_start_after_recovery_failures,
|
force_start_after_recovery_failures,
|
||||||
/*
|
/*
|
||||||
@ -304,7 +310,7 @@ static void _ma_check_print_msg(HA_CHECK *param, const char *msg_type,
|
|||||||
|
|
||||||
if (!thd->vio_ok())
|
if (!thd->vio_ok())
|
||||||
{
|
{
|
||||||
sql_print_error(fmt, args);
|
sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,6 +318,8 @@ static void _ma_check_print_msg(HA_CHECK *param, const char *msg_type,
|
|||||||
(T_CREATE_MISSING_KEYS | T_SAFE_REPAIR | T_AUTO_REPAIR))
|
(T_CREATE_MISSING_KEYS | T_SAFE_REPAIR | T_AUTO_REPAIR))
|
||||||
{
|
{
|
||||||
my_message(ER_NOT_KEYFILE, msgbuf, MYF(MY_WME));
|
my_message(ER_NOT_KEYFILE, msgbuf, MYF(MY_WME));
|
||||||
|
if (thd->variables.log_warnings > 2)
|
||||||
|
sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
length= (uint) (strxmov(name, param->db_name, ".", param->table_name,
|
length= (uint) (strxmov(name, param->db_name, ".", param->table_name,
|
||||||
@ -330,8 +338,11 @@ static void _ma_check_print_msg(HA_CHECK *param, const char *msg_type,
|
|||||||
protocol->store(msg_type, system_charset_info);
|
protocol->store(msg_type, system_charset_info);
|
||||||
protocol->store(msgbuf, msg_length, system_charset_info);
|
protocol->store(msgbuf, msg_length, system_charset_info);
|
||||||
if (protocol->write())
|
if (protocol->write())
|
||||||
sql_print_error("Failed on my_net_write, writing to stderr instead: %s\n",
|
sql_print_error("Failed on my_net_write, writing to stderr instead: %s.%s: %s\n",
|
||||||
msgbuf);
|
param->db_name, param->table_name, msgbuf);
|
||||||
|
else if (thd->variables.log_warnings > 2)
|
||||||
|
sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2184,13 +2195,17 @@ bool ha_maria::check_and_repair(THD *thd)
|
|||||||
|
|
||||||
if (crashed)
|
if (crashed)
|
||||||
{
|
{
|
||||||
|
bool save_log_all_errors;
|
||||||
sql_print_warning("Recovering table: '%s'", table->s->path.str);
|
sql_print_warning("Recovering table: '%s'", table->s->path.str);
|
||||||
|
save_log_all_errors= thd->log_all_errors;
|
||||||
|
thd->log_all_errors|= (thd->variables.log_warnings > 2);
|
||||||
check_opt.flags=
|
check_opt.flags=
|
||||||
((maria_recover_options & HA_RECOVER_BACKUP ? T_BACKUP_DATA : 0) |
|
((maria_recover_options & HA_RECOVER_BACKUP ? T_BACKUP_DATA : 0) |
|
||||||
(maria_recover_options & HA_RECOVER_FORCE ? 0 : T_SAFE_REPAIR) |
|
(maria_recover_options & HA_RECOVER_FORCE ? 0 : T_SAFE_REPAIR) |
|
||||||
T_AUTO_REPAIR);
|
T_AUTO_REPAIR);
|
||||||
if (repair(thd, &check_opt))
|
if (repair(thd, &check_opt))
|
||||||
error= 1;
|
error= 1;
|
||||||
|
thd->log_all_errors= save_log_all_errors;
|
||||||
}
|
}
|
||||||
pthread_mutex_lock(&LOCK_thread_count);
|
pthread_mutex_lock(&LOCK_thread_count);
|
||||||
thd->query_string= old_query;
|
thd->query_string= old_query;
|
||||||
@ -3556,6 +3571,7 @@ my_bool ha_maria::register_query_cache_table(THD *thd, char *table_name,
|
|||||||
struct st_mysql_sys_var* system_variables[]= {
|
struct st_mysql_sys_var* system_variables[]= {
|
||||||
MYSQL_SYSVAR(block_size),
|
MYSQL_SYSVAR(block_size),
|
||||||
MYSQL_SYSVAR(checkpoint_interval),
|
MYSQL_SYSVAR(checkpoint_interval),
|
||||||
|
MYSQL_SYSVAR(checkpoint_log_activity),
|
||||||
MYSQL_SYSVAR(force_start_after_recovery_failures),
|
MYSQL_SYSVAR(force_start_after_recovery_failures),
|
||||||
MYSQL_SYSVAR(group_commit),
|
MYSQL_SYSVAR(group_commit),
|
||||||
MYSQL_SYSVAR(group_commit_interval),
|
MYSQL_SYSVAR(group_commit_interval),
|
||||||
@ -3589,6 +3605,7 @@ static void update_checkpoint_interval(MYSQL_THD thd,
|
|||||||
ma_checkpoint_init(*(ulong *)var_ptr= (ulong)(*(long *)save));
|
ma_checkpoint_init(*(ulong *)var_ptr= (ulong)(*(long *)save));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@brief Updates group commit mode
|
@brief Updates group commit mode
|
||||||
*/
|
*/
|
||||||
|
@ -2344,7 +2344,7 @@ static int initialize_variables_for_repair(HA_CHECK *param,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allow us to restore state and check how state changed */
|
/* Make a copy to allow us to restore state and check how state changed */
|
||||||
memcpy(org_share, share, sizeof(*share));
|
memcpy(org_share, share, sizeof(*share));
|
||||||
|
|
||||||
/* Repair code relies on share->state.state so we have to update it here */
|
/* Repair code relies on share->state.state so we have to update it here */
|
||||||
@ -2364,6 +2364,14 @@ static int initialize_variables_for_repair(HA_CHECK *param,
|
|||||||
param->testflag&= ~T_QUICK;
|
param->testflag&= ~T_QUICK;
|
||||||
param->org_key_map= share->state.key_map;
|
param->org_key_map= share->state.key_map;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Clear check variables set by repair. This is needed to allow one to run
|
||||||
|
several repair's in a row with same param
|
||||||
|
*/
|
||||||
|
param->retry_repair= 0;
|
||||||
|
param->warning_printed= 0;
|
||||||
|
param->error_printed= 0;
|
||||||
|
|
||||||
sort_param->sort_info= sort_info;
|
sort_param->sort_info= sort_info;
|
||||||
sort_param->fix_datafile= ! rep_quick;
|
sort_param->fix_datafile= ! rep_quick;
|
||||||
sort_param->calc_checksum= test(param->testflag & T_CALC_CHECKSUM);
|
sort_param->calc_checksum= test(param->testflag & T_CALC_CHECKSUM);
|
||||||
|
@ -533,8 +533,9 @@ filter_flush_file_evenly(enum pagecache_page_type type,
|
|||||||
risk could be that while a checkpoint happens no LRD flushing happens.
|
risk could be that while a checkpoint happens no LRD flushing happens.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static uint maria_checkpoint_min_activity= 2*1024*1024;
|
static ulong maria_checkpoint_min_cache_activity= 10*1024*1024;
|
||||||
|
/* Set in ha_maria.cc */
|
||||||
|
ulong maria_checkpoint_min_log_activity= 1*1024*1024;
|
||||||
|
|
||||||
pthread_handler_t ma_checkpoint_background(void *arg)
|
pthread_handler_t ma_checkpoint_background(void *arg)
|
||||||
{
|
{
|
||||||
@ -578,53 +579,61 @@ pthread_handler_t ma_checkpoint_background(void *arg)
|
|||||||
switch (sleeps % interval)
|
switch (sleeps % interval)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
|
{
|
||||||
/* If checkpoints are disabled, wait 1 second and try again */
|
/* If checkpoints are disabled, wait 1 second and try again */
|
||||||
if (maria_checkpoint_disabled)
|
if (maria_checkpoint_disabled)
|
||||||
{
|
{
|
||||||
sleep_time= 1;
|
sleep_time= 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
With background flushing evenly distributed over the time
|
|
||||||
between two checkpoints, we should have only little flushing to do
|
|
||||||
in the checkpoint.
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
No checkpoint if little work of interest for recovery was done
|
|
||||||
since last checkpoint. Such work includes log writing (lengthens
|
|
||||||
recovery, checkpoint would shorten it), page flushing (checkpoint
|
|
||||||
would decrease the amount of read pages in recovery).
|
|
||||||
In case of one short statement per minute (very low load), we don't
|
|
||||||
want to checkpoint every minute, hence the positive
|
|
||||||
maria_checkpoint_min_activity.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (((translog_get_horizon() - log_horizon_at_last_checkpoint) +
|
|
||||||
(maria_pagecache->global_cache_write -
|
|
||||||
pagecache_flushes_at_last_checkpoint) *
|
|
||||||
maria_pagecache->block_size) < maria_checkpoint_min_activity)
|
|
||||||
{
|
{
|
||||||
/* don't take checkpoint, so don't know what to flush */
|
TRANSLOG_ADDRESS horizon= translog_get_horizon();
|
||||||
pages_to_flush_before_next_checkpoint= 0;
|
|
||||||
sleep_time= interval;
|
/*
|
||||||
break;
|
With background flushing evenly distributed over the time
|
||||||
|
between two checkpoints, we should have only little flushing to do
|
||||||
|
in the checkpoint.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
No checkpoint if little work of interest for recovery was done
|
||||||
|
since last checkpoint. Such work includes log writing (lengthens
|
||||||
|
recovery, checkpoint would shorten it), page flushing (checkpoint
|
||||||
|
would decrease the amount of read pages in recovery).
|
||||||
|
In case of one short statement per minute (very low load), we don't
|
||||||
|
want to checkpoint every minute, hence the positive
|
||||||
|
maria_checkpoint_min_activity.
|
||||||
|
*/
|
||||||
|
if (horizon != log_horizon_at_last_checkpoint &&
|
||||||
|
(ulonglong) (horizon - log_horizon_at_last_checkpoint) <=
|
||||||
|
maria_checkpoint_min_log_activity &&
|
||||||
|
((ulonglong) (maria_pagecache->global_cache_write -
|
||||||
|
pagecache_flushes_at_last_checkpoint) *
|
||||||
|
maria_pagecache->block_size) <=
|
||||||
|
maria_checkpoint_min_cache_activity)
|
||||||
|
{
|
||||||
|
/* don't take checkpoint, so don't know what to flush */
|
||||||
|
pages_to_flush_before_next_checkpoint= 0;
|
||||||
|
sleep_time= interval;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sleep_time= 1;
|
||||||
|
ma_checkpoint_execute(CHECKPOINT_MEDIUM, TRUE);
|
||||||
|
/*
|
||||||
|
Snapshot this kind of "state" of the engine. Note that the value below
|
||||||
|
is possibly greater than last_checkpoint_lsn.
|
||||||
|
*/
|
||||||
|
log_horizon_at_last_checkpoint= translog_get_horizon();
|
||||||
|
pagecache_flushes_at_last_checkpoint=
|
||||||
|
maria_pagecache->global_cache_write;
|
||||||
|
/*
|
||||||
|
If the checkpoint above succeeded it has set d|kfiles and
|
||||||
|
d|kfiles_end. If is has failed, it has set
|
||||||
|
pages_to_flush_before_next_checkpoint to 0 so we will skip flushing
|
||||||
|
and sleep until the next checkpoint.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
sleep_time= 1;
|
|
||||||
ma_checkpoint_execute(CHECKPOINT_MEDIUM, TRUE);
|
|
||||||
/*
|
|
||||||
Snapshot this kind of "state" of the engine. Note that the value below
|
|
||||||
is possibly greater than last_checkpoint_lsn.
|
|
||||||
*/
|
|
||||||
log_horizon_at_last_checkpoint= translog_get_horizon();
|
|
||||||
pagecache_flushes_at_last_checkpoint=
|
|
||||||
maria_pagecache->global_cache_write;
|
|
||||||
/*
|
|
||||||
If the checkpoint above succeeded it has set d|kfiles and
|
|
||||||
d|kfiles_end. If is has failed, it has set
|
|
||||||
pages_to_flush_before_next_checkpoint to 0 so we will skip flushing
|
|
||||||
and sleep until the next checkpoint.
|
|
||||||
*/
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 1:
|
case 1:
|
||||||
/* set up parameters for background page flushing */
|
/* set up parameters for background page flushing */
|
||||||
filter_param.up_to_lsn= last_checkpoint_lsn;
|
filter_param.up_to_lsn= last_checkpoint_lsn;
|
||||||
|
@ -3215,9 +3215,11 @@ static LSN parse_checkpoint_record(LSN lsn)
|
|||||||
|
|
||||||
tprint(tracef, "Loading data from checkpoint record at LSN (%lu,0x%lx)\n",
|
tprint(tracef, "Loading data from checkpoint record at LSN (%lu,0x%lx)\n",
|
||||||
LSN_IN_PARTS(lsn));
|
LSN_IN_PARTS(lsn));
|
||||||
if ((len= translog_read_record_header(lsn, &rec)) == RECHEADER_READ_ERROR)
|
if ((len= translog_read_record_header(lsn, &rec)) == RECHEADER_READ_ERROR ||
|
||||||
|
rec.type != LOGREC_CHECKPOINT)
|
||||||
{
|
{
|
||||||
tprint(tracef, "Cannot find checkpoint record where it should be\n");
|
eprint(tracef, "Cannot find checkpoint record at LSN (%lu,0x%lx)",
|
||||||
|
LSN_IN_PARTS(lsn));
|
||||||
return LSN_ERROR;
|
return LSN_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -828,6 +828,7 @@ extern uchar maria_zero_string[];
|
|||||||
extern my_bool maria_inited, maria_in_ha_maria, maria_recovery_changed_data;
|
extern my_bool maria_inited, maria_in_ha_maria, maria_recovery_changed_data;
|
||||||
extern my_bool maria_recovery_verbose, maria_checkpoint_disabled;
|
extern my_bool maria_recovery_verbose, maria_checkpoint_disabled;
|
||||||
extern my_bool maria_assert_if_crashed_table;
|
extern my_bool maria_assert_if_crashed_table;
|
||||||
|
extern ulong maria_checkpoint_min_log_activity;
|
||||||
extern HASH maria_stored_state;
|
extern HASH maria_stored_state;
|
||||||
extern int (*maria_create_trn_hook)(MARIA_HA *);
|
extern int (*maria_create_trn_hook)(MARIA_HA *);
|
||||||
extern my_bool (*ma_killed)(MARIA_HA *);
|
extern my_bool (*ma_killed)(MARIA_HA *);
|
||||||
|
@ -179,6 +179,7 @@ int trnman_init(TrID initial_trid)
|
|||||||
trnman_allocated_transactions= 0;
|
trnman_allocated_transactions= 0;
|
||||||
/* This is needed for recovery and repair */
|
/* This is needed for recovery and repair */
|
||||||
dummy_transaction_object.min_read_from= ~(TrID) 0;
|
dummy_transaction_object.min_read_from= ~(TrID) 0;
|
||||||
|
dummy_transaction_object.first_undo_lsn= TRANSACTION_LOGGED_LONG_ID;
|
||||||
|
|
||||||
pool= 0;
|
pool= 0;
|
||||||
global_trid_generator= initial_trid;
|
global_trid_generator= initial_trid;
|
||||||
|
@ -91,14 +91,16 @@ static void mi_check_print_msg(HA_CHECK *param, const char* msg_type,
|
|||||||
|
|
||||||
if (!thd->vio_ok())
|
if (!thd->vio_ok())
|
||||||
{
|
{
|
||||||
sql_print_error("%s", msgbuf);
|
sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param->testflag & (T_CREATE_MISSING_KEYS | T_SAFE_REPAIR |
|
if (param->testflag & (T_CREATE_MISSING_KEYS | T_SAFE_REPAIR |
|
||||||
T_AUTO_REPAIR))
|
T_AUTO_REPAIR))
|
||||||
{
|
{
|
||||||
my_message(ER_NOT_KEYFILE,msgbuf,MYF(MY_WME));
|
my_message(ER_NOT_KEYFILE, msgbuf, MYF(MY_WME));
|
||||||
|
if (thd->variables.log_warnings > 2 && ! thd->log_all_errors)
|
||||||
|
sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
length=(uint) (strxmov(name, param->db_name,".",param->table_name,NullS) -
|
length=(uint) (strxmov(name, param->db_name,".",param->table_name,NullS) -
|
||||||
@ -124,7 +126,7 @@ static void mi_check_print_msg(HA_CHECK *param, const char* msg_type,
|
|||||||
sql_print_error("Failed on my_net_write, writing to stderr instead: %s\n",
|
sql_print_error("Failed on my_net_write, writing to stderr instead: %s\n",
|
||||||
msgbuf);
|
msgbuf);
|
||||||
else if (thd->variables.log_warnings > 2)
|
else if (thd->variables.log_warnings > 2)
|
||||||
sql_print_error("%s", msgbuf);
|
sql_print_error("%s.%s: %s", param->db_name, param->table_name, msgbuf);
|
||||||
|
|
||||||
#ifdef THREAD
|
#ifdef THREAD
|
||||||
if (param->need_print_msg_lock)
|
if (param->need_print_msg_lock)
|
||||||
@ -1699,7 +1701,10 @@ bool ha_myisam::check_and_repair(THD *thd)
|
|||||||
|
|
||||||
if ((marked_crashed= mi_is_crashed(file)) || check(thd, &check_opt))
|
if ((marked_crashed= mi_is_crashed(file)) || check(thd, &check_opt))
|
||||||
{
|
{
|
||||||
|
bool save_log_all_errors;
|
||||||
sql_print_warning("Recovering table: '%s'",table->s->path.str);
|
sql_print_warning("Recovering table: '%s'",table->s->path.str);
|
||||||
|
save_log_all_errors= thd->log_all_errors;
|
||||||
|
thd->log_all_errors|= (thd->variables.log_warnings > 2);
|
||||||
if (myisam_recover_options & HA_RECOVER_FULL_BACKUP)
|
if (myisam_recover_options & HA_RECOVER_FULL_BACKUP)
|
||||||
{
|
{
|
||||||
char buff[MY_BACKUP_NAME_EXTRA_LENGTH+1];
|
char buff[MY_BACKUP_NAME_EXTRA_LENGTH+1];
|
||||||
@ -1717,6 +1722,7 @@ bool ha_myisam::check_and_repair(THD *thd)
|
|||||||
T_AUTO_REPAIR);
|
T_AUTO_REPAIR);
|
||||||
if (repair(thd, &check_opt))
|
if (repair(thd, &check_opt))
|
||||||
error=1;
|
error=1;
|
||||||
|
thd->log_all_errors= save_log_all_errors;
|
||||||
}
|
}
|
||||||
thd->set_query(old_query, old_query_length);
|
thd->set_query(old_query, old_query_length);
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
|
@ -1539,6 +1539,9 @@ int mi_repair(HA_CHECK *param, register MI_INFO *info,
|
|||||||
got_error=1;
|
got_error=1;
|
||||||
new_file= -1;
|
new_file= -1;
|
||||||
sort_param.sort_info=&sort_info;
|
sort_param.sort_info=&sort_info;
|
||||||
|
param->retry_repair= 0;
|
||||||
|
param->warning_printed= 0;
|
||||||
|
param->error_printed= 0;
|
||||||
|
|
||||||
if (!(param->testflag & T_SILENT))
|
if (!(param->testflag & T_SILENT))
|
||||||
{
|
{
|
||||||
@ -1683,7 +1686,7 @@ int mi_repair(HA_CHECK *param, register MI_INFO *info,
|
|||||||
if (rep_quick && del+sort_info.dupp != info->state->del)
|
if (rep_quick && del+sort_info.dupp != info->state->del)
|
||||||
{
|
{
|
||||||
mi_check_print_error(param,"Couldn't fix table with quick recovery: Found wrong number of deleted records");
|
mi_check_print_error(param,"Couldn't fix table with quick recovery: Found wrong number of deleted records");
|
||||||
mi_check_print_error(param,"Run recovery again without -q");
|
mi_check_print_error(param,"Run recovery again without --quick");
|
||||||
got_error=1;
|
got_error=1;
|
||||||
param->retry_repair=1;
|
param->retry_repair=1;
|
||||||
param->testflag|=T_RETRY_WITHOUT_QUICK;
|
param->testflag|=T_RETRY_WITHOUT_QUICK;
|
||||||
@ -1914,7 +1917,7 @@ int flush_blocks(HA_CHECK *param, KEY_CACHE *key_cache, File file,
|
|||||||
{
|
{
|
||||||
if (flush_key_blocks(key_cache, file, dirty_part_map, FLUSH_RELEASE))
|
if (flush_key_blocks(key_cache, file, dirty_part_map, FLUSH_RELEASE))
|
||||||
{
|
{
|
||||||
mi_check_print_error(param,"%d when trying to write bufferts",my_errno);
|
mi_check_print_error(param,"%d when trying to write buffers",my_errno);
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
if (!param->using_global_keycache)
|
if (!param->using_global_keycache)
|
||||||
@ -2228,7 +2231,7 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
|
|||||||
MYISAM_SHARE *share=info->s;
|
MYISAM_SHARE *share=info->s;
|
||||||
HA_KEYSEG *keyseg;
|
HA_KEYSEG *keyseg;
|
||||||
ulong *rec_per_key_part;
|
ulong *rec_per_key_part;
|
||||||
char llbuff[22];
|
char llbuff[22], llbuff2[22];
|
||||||
MI_SORT_INFO sort_info;
|
MI_SORT_INFO sort_info;
|
||||||
ulonglong UNINIT_VAR(key_map);
|
ulonglong UNINIT_VAR(key_map);
|
||||||
DBUG_ENTER("mi_repair_by_sort");
|
DBUG_ENTER("mi_repair_by_sort");
|
||||||
@ -2244,12 +2247,16 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
|
|||||||
printf("Data records: %s\n", llstr(start_records,llbuff));
|
printf("Data records: %s\n", llstr(start_records,llbuff));
|
||||||
}
|
}
|
||||||
param->testflag|=T_REP; /* for easy checking */
|
param->testflag|=T_REP; /* for easy checking */
|
||||||
|
param->retry_repair= 0;
|
||||||
|
param->warning_printed= 0;
|
||||||
|
param->error_printed= 0;
|
||||||
|
|
||||||
if (info->s->options & (HA_OPTION_CHECKSUM | HA_OPTION_COMPRESS_RECORD))
|
if (info->s->options & (HA_OPTION_CHECKSUM | HA_OPTION_COMPRESS_RECORD))
|
||||||
param->testflag|=T_CALC_CHECKSUM;
|
param->testflag|=T_CALC_CHECKSUM;
|
||||||
|
|
||||||
bzero((char*)&sort_info,sizeof(sort_info));
|
bzero((char*)&sort_info,sizeof(sort_info));
|
||||||
bzero((char *)&sort_param, sizeof(sort_param));
|
bzero((char *)&sort_param, sizeof(sort_param));
|
||||||
|
|
||||||
if (!(sort_info.key_block=
|
if (!(sort_info.key_block=
|
||||||
alloc_key_blocks(param,
|
alloc_key_blocks(param,
|
||||||
(uint) param->sort_key_blocks,
|
(uint) param->sort_key_blocks,
|
||||||
@ -2261,7 +2268,7 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
|
|||||||
init_io_cache(&info->rec_cache,info->dfile,
|
init_io_cache(&info->rec_cache,info->dfile,
|
||||||
(uint) param->write_buffer_length,
|
(uint) param->write_buffer_length,
|
||||||
WRITE_CACHE,new_header_length,1,
|
WRITE_CACHE,new_header_length,1,
|
||||||
MYF(MY_WME | MY_WAIT_IF_FULL) & param->myf_rw)))
|
MYF((param->myf_rw & MY_WAIT_IF_FULL) | MY_WME))))
|
||||||
goto err;
|
goto err;
|
||||||
sort_info.key_block_end=sort_info.key_block+param->sort_key_blocks;
|
sort_info.key_block_end=sort_info.key_block+param->sort_key_blocks;
|
||||||
info->opt_flag|=WRITE_CACHE_USED;
|
info->opt_flag|=WRITE_CACHE_USED;
|
||||||
@ -2433,7 +2440,10 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
|
|||||||
(my_bool) (!(param->testflag & T_VERBOSE)),
|
(my_bool) (!(param->testflag & T_VERBOSE)),
|
||||||
(uint) param->sort_buffer_length))
|
(uint) param->sort_buffer_length))
|
||||||
{
|
{
|
||||||
param->retry_repair=1;
|
param->retry_repair= 1;
|
||||||
|
if (! param->error_printed)
|
||||||
|
mi_check_print_error(param, "Couldn't fix table with create_index_by_sort(). Error: %d",
|
||||||
|
my_errno);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
/* No need to calculate checksum again. */
|
/* No need to calculate checksum again. */
|
||||||
@ -2462,7 +2472,10 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
|
|||||||
/* Don't repair if we loosed more than one row */
|
/* Don't repair if we loosed more than one row */
|
||||||
if (info->state->records+1 < start_records)
|
if (info->state->records+1 < start_records)
|
||||||
{
|
{
|
||||||
info->state->records=start_records;
|
mi_check_print_error(param,
|
||||||
|
"Couldn't fix table as SAFE_REPAIR was requested and we would loose too many rows. %s -> %s",
|
||||||
|
llstr(start_records, llbuff), llstr(info->state->records, llbuff2));
|
||||||
|
info->state->records= start_records;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2492,7 +2505,7 @@ int mi_repair_by_sort(HA_CHECK *param, register MI_INFO *info,
|
|||||||
if (rep_quick && del+sort_info.dupp != info->state->del)
|
if (rep_quick && del+sort_info.dupp != info->state->del)
|
||||||
{
|
{
|
||||||
mi_check_print_error(param,"Couldn't fix table with quick recovery: Found wrong number of deleted records");
|
mi_check_print_error(param,"Couldn't fix table with quick recovery: Found wrong number of deleted records");
|
||||||
mi_check_print_error(param,"Run recovery again without -q");
|
mi_check_print_error(param,"Run recovery again without --quick");
|
||||||
got_error=1;
|
got_error=1;
|
||||||
param->retry_repair=1;
|
param->retry_repair=1;
|
||||||
param->testflag|=T_RETRY_WITHOUT_QUICK;
|
param->testflag|=T_RETRY_WITHOUT_QUICK;
|
||||||
@ -2664,6 +2677,9 @@ int mi_repair_parallel(HA_CHECK *param, register MI_INFO *info,
|
|||||||
printf("Data records: %s\n", llstr(start_records,llbuff));
|
printf("Data records: %s\n", llstr(start_records,llbuff));
|
||||||
}
|
}
|
||||||
param->testflag|=T_REP; /* for easy checking */
|
param->testflag|=T_REP; /* for easy checking */
|
||||||
|
param->retry_repair= 0;
|
||||||
|
param->warning_printed= 0;
|
||||||
|
param->error_printed= 0;
|
||||||
|
|
||||||
if (info->s->options & (HA_OPTION_CHECKSUM | HA_OPTION_COMPRESS_RECORD))
|
if (info->s->options & (HA_OPTION_CHECKSUM | HA_OPTION_COMPRESS_RECORD))
|
||||||
param->testflag|=T_CALC_CHECKSUM;
|
param->testflag|=T_CALC_CHECKSUM;
|
||||||
|
@ -151,6 +151,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
|
|||||||
{
|
{
|
||||||
mi_check_print_error(info->sort_info->param,
|
mi_check_print_error(info->sort_info->param,
|
||||||
"myisam_sort_buffer_size is too small");
|
"myisam_sort_buffer_size is too small");
|
||||||
|
my_errno= ENOMEM;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -175,7 +176,8 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
|
|||||||
if (memavl < MIN_SORT_BUFFER)
|
if (memavl < MIN_SORT_BUFFER)
|
||||||
{
|
{
|
||||||
mi_check_print_error(info->sort_info->param,"MyISAM sort buffer too small"); /* purecov: tested */
|
mi_check_print_error(info->sort_info->param,"MyISAM sort buffer too small"); /* purecov: tested */
|
||||||
goto err; /* purecov: tested */
|
my_errno= ENOMEM; /* purecov: tested */
|
||||||
|
goto err; /* purecov: tested */
|
||||||
}
|
}
|
||||||
(*info->lock_in_memory)(info->sort_info->param);/* Everything is allocated */
|
(*info->lock_in_memory)(info->sort_info->param);/* Everything is allocated */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user