5.3 merge

This commit is contained in:
Sergei Golubchik 2012-02-24 14:37:00 +01:00
commit 3f28115e0e
35 changed files with 351 additions and 277 deletions

View File

@ -40,6 +40,17 @@
#ifndef _h_sys #ifndef _h_sys
#define _h_sys #define _h_sys
#ifdef __linux__
/* Apparently we need _GNU_SOURCE defined to get access to wcsdup on Linux */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#endif
#ifndef __USE_XOPEN
#define __USE_XOPEN
#endif
#ifdef HAVE_SYS_CDEFS_H #ifdef HAVE_SYS_CDEFS_H
#include <sys/cdefs.h> #include <sys/cdefs.h>
#endif #endif
@ -92,17 +103,6 @@ size_t strlcpy(char *dst, const char *src, size_t size);
char *fgetln(FILE *fp, size_t *len); char *fgetln(FILE *fp, size_t *len);
#endif #endif
#ifdef __linux__
/* Apparently we need _GNU_SOURCE defined to get access to wcsdup on Linux */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#endif
#ifndef __USE_XOPEN
#define __USE_XOPEN
#endif
#include <wchar.h> #include <wchar.h>
#include <wctype.h> #include <wctype.h>

View File

@ -862,15 +862,15 @@ CREATE TABLE t1 (
INSERT INTO t1 VALUES ('3', '3'),('4','4'),('5','5'); INSERT INTO t1 VALUES ('3', '3'),('4','4'),('5','5');
flush status; flush status;
show status like "Handler_pushed%"; show status like "Handler_icp%";
SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ; SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ;
show status like "Handler_pushed%"; show status like "Handler_icp%";
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ; SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
show status like "Handler_pushed%"; show status like "Handler_icp%";
DROP TABLE t1; DROP TABLE t1;

View File

@ -2748,7 +2748,8 @@ sub setup_vardir() {
{ {
$plugindir= $mysqld_variables{'plugin-dir'} || '.'; $plugindir= $mysqld_variables{'plugin-dir'} || '.';
# hm, what paths work for debs and for rpms ? # hm, what paths work for debs and for rpms ?
for (<$bindir/lib/mysql/plugin/*.so>, for (<$bindir/lib64/mysql/plugin/*.so>,
<$bindir/lib/mysql/plugin/*.so>,
<$bindir/lib/plugin/*.dll>) <$bindir/lib/plugin/*.dll>)
{ {
my $pname=basename($_); my $pname=basename($_);
@ -4785,7 +4786,7 @@ sub extract_warning_lines ($$) {
qr/Slave: Operation DROP USER failed for 'create_rout_db'/, qr/Slave: Operation DROP USER failed for 'create_rout_db'/,
qr|Checking table: '\..mtr.test_suppressions'|, qr|Checking table: '\..mtr.test_suppressions'|,
qr|Table \./test/bug53592 has a primary key in InnoDB data dictionary, but not in MySQL|, qr|Table \./test/bug53592 has a primary key in InnoDB data dictionary, but not in MySQL|,
qr|mysqld: Table '\..mtr.test_suppressions' is marked as crashed and should be repaired|, qr|Table '\..mtr.test_suppressions' is marked as crashed and should be repaired|,
qr|Can't open shared library.*ha_archive|, qr|Can't open shared library.*ha_archive|,
qr|InnoDB: Error: table 'test/bug39438'|, qr|InnoDB: Error: table 'test/bug39438'|,
qr| entry '.*' ignored in --skip-name-resolve mode|, qr| entry '.*' ignored in --skip-name-resolve mode|,

View File

@ -816,24 +816,24 @@ KEY (c1)
); );
INSERT INTO t1 VALUES ('3', '3'),('4','4'),('5','5'); INSERT INTO t1 VALUES ('3', '3'),('4','4'),('5','5');
flush status; flush status;
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 0 Handler_icp_attempts 0
Handler_pushed_index_cond_filtered 0 Handler_icp_match 0
SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ; SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ;
c1 c2 c1 c2
4 4 4 4
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 2 Handler_icp_attempts 2
Handler_pushed_index_cond_filtered 1 Handler_icp_match 1
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ; SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
c1 c2 c1 c2
4 4 4 4
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 2 Handler_icp_attempts 2
Handler_pushed_index_cond_filtered 1 Handler_icp_match 1
DROP TABLE t1; DROP TABLE t1;
# #
# BUG#920132: Assert trx->n_active_thrs == 1 failed at que0que.c line 1050 # BUG#920132: Assert trx->n_active_thrs == 1 failed at que0que.c line 1050

View File

@ -3520,10 +3520,10 @@ where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan 1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 20 Handler_icp_attempts 20
Handler_pushed_index_cond_filtered 16 Handler_icp_match 4
set join_cache_level=6; set join_cache_level=6;
select t2.f1, t2.f2, t2.f3 from t1,t2 select t2.f1, t2.f2, t2.f3 from t1,t2
where t1.f1=t2.f1 and t2.f2 between t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1; where t1.f1=t2.f1 and t2.f2 between t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1;
@ -3537,10 +3537,10 @@ where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan 1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 40 Handler_icp_attempts 40
Handler_pushed_index_cond_filtered 32 Handler_icp_match 8
set join_cache_level=7; set join_cache_level=7;
select t2.f1, t2.f2, t2.f3 from t1,t2 select t2.f1, t2.f2, t2.f3 from t1,t2
where t1.f1=t2.f1 and t2.f2 between t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1; where t1.f1=t2.f1 and t2.f2 between t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1;
@ -3554,10 +3554,10 @@ where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan 1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 60 Handler_icp_attempts 60
Handler_pushed_index_cond_filtered 48 Handler_icp_match 12
set join_cache_level=8; set join_cache_level=8;
select t2.f1, t2.f2, t2.f3 from t1,t2 select t2.f1, t2.f2, t2.f3 from t1,t2
where t1.f1=t2.f1 and t2.f2 between t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1; where t1.f1=t2.f1 and t2.f2 between t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1;
@ -3571,10 +3571,10 @@ where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 Using where
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan 1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 80 Handler_icp_attempts 80
Handler_pushed_index_cond_filtered 64 Handler_icp_match 16
drop table t1,t2; drop table t1,t2;
set join_cache_level=default; set join_cache_level=default;
# #

View File

@ -1,4 +1,5 @@
drop table if exists t1,t2; drop table if exists t1,t2;
drop DATABASE if exists mysqltest_1;
create table t1(n int); create table t1(n int);
insert into t1 values (1); insert into t1 values (1);
select get_lock("mysqltest_lock", 100); select get_lock("mysqltest_lock", 100);

View File

@ -822,24 +822,24 @@ KEY (c1)
); );
INSERT INTO t1 VALUES ('3', '3'),('4','4'),('5','5'); INSERT INTO t1 VALUES ('3', '3'),('4','4'),('5','5');
flush status; flush status;
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 0 Handler_icp_attempts 0
Handler_pushed_index_cond_filtered 0 Handler_icp_match 0
SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ; SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ;
c1 c2 c1 c2
4 4 4 4
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 2 Handler_icp_attempts 2
Handler_pushed_index_cond_filtered 1 Handler_icp_match 1
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ; SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
c1 c2 c1 c2
4 4 4 4
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 2 Handler_icp_attempts 2
Handler_pushed_index_cond_filtered 1 Handler_icp_match 1
DROP TABLE t1; DROP TABLE t1;
set storage_engine= @save_storage_engine; set storage_engine= @save_storage_engine;
set optimizer_switch=@maria_icp_tmp; set optimizer_switch=@maria_icp_tmp;

View File

@ -820,24 +820,24 @@ KEY (c1)
); );
INSERT INTO t1 VALUES ('3', '3'),('4','4'),('5','5'); INSERT INTO t1 VALUES ('3', '3'),('4','4'),('5','5');
flush status; flush status;
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 0 Handler_icp_attempts 0
Handler_pushed_index_cond_filtered 0 Handler_icp_match 0
SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ; SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ;
c1 c2 c1 c2
4 4 4 4
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 2 Handler_icp_attempts 2
Handler_pushed_index_cond_filtered 1 Handler_icp_match 1
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ; SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
c1 c2 c1 c2
4 4 4 4
show status like "Handler_pushed%"; show status like "Handler_icp%";
Variable_name Value Variable_name Value
Handler_pushed_index_cond_checks 2 Handler_icp_attempts 2
Handler_pushed_index_cond_filtered 1 Handler_icp_match 1
DROP TABLE t1; DROP TABLE t1;
drop table if exists t0, t1, t1i, t1m; drop table if exists t0, t1, t1i, t1m;
# #
@ -914,19 +914,4 @@ Warning 1292 Truncated incorrect DOUBLE value: 'c'
Warning 1292 Truncated incorrect DOUBLE value: 'c' Warning 1292 Truncated incorrect DOUBLE value: 'c'
SET optimizer_switch=@save_optimizer_switch; SET optimizer_switch=@save_optimizer_switch;
DROP TABLE t1,t2,t3,t4; DROP TABLE t1,t2,t3,t4;
#
# BUG#933412: Server crashes in _mi_put_key_in_record on KILL QUERY with ICP, STRAIGHT_JOIN
#
CREATE TABLE t1 (
b INT,
c VARCHAR(1) NOT NULL,
d DATETIME,
KEY (c, b)
) ENGINE=MyISAM;
# INSERT some data
CREATE TABLE t2 ( a INT ) ENGINE=MyISAM;
INSERT INTO t2 VALUES
(7),(3),(7),(3);
# Now run a number of ICP queries while trying to kill them
DROP TABLE t1,t2;
set optimizer_switch=@myisam_icp_tmp; set optimizer_switch=@myisam_icp_tmp;

View File

@ -0,0 +1,19 @@
drop table if exists t1,t2;
set @myisam_icp_notembedded_tmp=@@optimizer_switch;
set optimizer_switch='mrr=on,mrr_sort_keys=on,index_condition_pushdown=on';
#
# BUG#933412: Server crashes in _mi_put_key_in_record on KILL QUERY with ICP, STRAIGHT_JOIN
#
CREATE TABLE t1 (
b INT,
c VARCHAR(1) NOT NULL,
d DATETIME,
KEY (c, b)
) ENGINE=MyISAM;
# INSERT some data
CREATE TABLE t2 ( a INT ) ENGINE=MyISAM;
INSERT INTO t2 VALUES
(7),(3),(7),(3);
# Now run a number of ICP queries while trying to kill them
DROP TABLE t1,t2;
set optimizer_switch=@myisam_icp_notembedded_tmp;

View File

@ -563,6 +563,9 @@ drop table t1;
flush status; flush status;
show status like 'Handler_mrr%'; show status like 'Handler_mrr%';
Variable_name Value Variable_name Value
Handler_mrr_init 0
Handler_mrr_key_refills 0
Handler_mrr_rowid_refills 0
create table t0 (a int); create table t0 (a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t1 (a int, b int, filler char(200), key(a)); create table t1 (a int, b int, filler char(200), key(a));
@ -578,6 +581,9 @@ sum(b)
1230 1230
show status like 'handler_mrr%'; show status like 'handler_mrr%';
Variable_name Value Variable_name Value
Handler_mrr_init 1
Handler_mrr_key_refills 0
Handler_mrr_rowid_refills 0
set @mrr_buffer_size_save= @@mrr_buffer_size; set @mrr_buffer_size_save= @@mrr_buffer_size;
set mrr_buffer_size=128; set mrr_buffer_size=128;
explain select sum(b) from t1 where a < 1600; explain select sum(b) from t1 where a < 1600;
@ -590,6 +596,9 @@ sum(b)
196800 196800
show status like 'handler_mrr%'; show status like 'handler_mrr%';
Variable_name Value Variable_name Value
Handler_mrr_init 1
Handler_mrr_key_refills 0
Handler_mrr_rowid_refills 1
set @@mrr_buffer_size= @mrr_buffer_size_save; set @@mrr_buffer_size= @mrr_buffer_size_save;
#Now, let's check BKA: #Now, let's check BKA:
set @join_cache_level_save= @@join_cache_level; set @join_cache_level_save= @@join_cache_level;
@ -605,6 +614,9 @@ sum(t1.b)
1230 1230
show status like 'handler_mrr%'; show status like 'handler_mrr%';
Variable_name Value Variable_name Value
Handler_mrr_init 1
Handler_mrr_key_refills 0
Handler_mrr_rowid_refills 0
set join_buffer_size=10; set join_buffer_size=10;
explain select sum(t1.b) from t0,t1 where t0.a=t1.a; explain select sum(t1.b) from t0,t1 where t0.a=t1.a;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
@ -616,6 +628,9 @@ sum(t1.b)
1230 1230
show status like 'handler_mrr%'; show status like 'handler_mrr%';
Variable_name Value Variable_name Value
Handler_mrr_init 2
Handler_mrr_key_refills 3
Handler_mrr_rowid_refills 3
set join_cache_level= @join_cache_level_save; set join_cache_level= @join_cache_level_save;
set join_buffer_size= @join_buffer_size_save; set join_buffer_size= @join_buffer_size_save;
drop table t0, t1; drop table t0, t1;

View File

@ -275,9 +275,12 @@ Variable_name Value
Handler_commit 0 Handler_commit 0
Handler_delete 0 Handler_delete 0
Handler_discover 0 Handler_discover 0
Handler_icp_attempts 0
Handler_icp_match 0
Handler_mrr_init 0
Handler_mrr_key_refills 0
Handler_mrr_rowid_refills 0
Handler_prepare 0 Handler_prepare 0
Handler_pushed_index_cond_checks 0
Handler_pushed_index_cond_filtered 0
Handler_read_first 0 Handler_read_first 0
Handler_read_key 4 Handler_read_key 4
Handler_read_last 0 Handler_read_last 0
@ -300,7 +303,7 @@ Created_tmp_files 0
Created_tmp_tables 2 Created_tmp_tables 2
Handler_tmp_update 2 Handler_tmp_update 2
Handler_tmp_write 7 Handler_tmp_write 7
Rows_tmp_read 38 Rows_tmp_read 41
drop table t1; drop table t1;
CREATE TABLE t1 (i int(11) DEFAULT NULL, KEY i (i) ) ENGINE=MyISAM; CREATE TABLE t1 (i int(11) DEFAULT NULL, KEY i (i) ) ENGINE=MyISAM;
insert into t1 values (1),(2),(3),(4),(5); insert into t1 values (1),(2),(3),(4),(5);
@ -313,9 +316,12 @@ Variable_name Value
Handler_commit 0 Handler_commit 0
Handler_delete 0 Handler_delete 0
Handler_discover 0 Handler_discover 0
Handler_icp_attempts 0
Handler_icp_match 0
Handler_mrr_init 0
Handler_mrr_key_refills 0
Handler_mrr_rowid_refills 0
Handler_prepare 0 Handler_prepare 0
Handler_pushed_index_cond_checks 0
Handler_pushed_index_cond_filtered 0
Handler_read_first 0 Handler_read_first 0
Handler_read_key 2 Handler_read_key 2
Handler_read_last 0 Handler_read_last 0

View File

@ -100,9 +100,12 @@ Variable_name Value
Handler_commit 19 Handler_commit 19
Handler_delete 1 Handler_delete 1
Handler_discover 0 Handler_discover 0
Handler_icp_attempts 0
Handler_icp_match 0
Handler_mrr_init 0
Handler_mrr_key_refills 0
Handler_mrr_rowid_refills 0
Handler_prepare 18 Handler_prepare 18
Handler_pushed_index_cond_checks 0
Handler_pushed_index_cond_filtered 0
Handler_read_first 0 Handler_read_first 0
Handler_read_key 3 Handler_read_key 3
Handler_read_last 0 Handler_read_last 0

View File

@ -587,6 +587,19 @@ Variable_name Value
Handler_read_next 1 Handler_read_next 1
DROP TABLE t1, t2; DROP TABLE t1, t2;
End of 5.1 tests End of 5.1 tests
#
# lp:923429 Crash in decimal_cmp on using UNIX_TIMESTAMP with a wrongly formatted timestamp
#
SELECT UNIX_TIMESTAMP('abc') > 0;
UNIX_TIMESTAMP('abc') > 0
NULL
Warnings:
Warning 1292 Incorrect datetime value: 'abc'
SELECT UNIX_TIMESTAMP('abc');
UNIX_TIMESTAMP('abc')
NULL
Warnings:
Warning 1292 Incorrect datetime value: 'abc'
Bug#50888 valgrind warnings in Field_timestamp::val_str Bug#50888 valgrind warnings in Field_timestamp::val_str

View File

@ -1533,7 +1533,7 @@ where t1.f1=t2.f1 and t2.f2 between t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1;
explain select t2.f1, t2.f2, t2.f3 from t1,t2 explain select t2.f1, t2.f2, t2.f3 from t1,t2
where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2; where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2;
show status like "Handler_pushed%"; show status like "Handler_icp%";
set join_cache_level=6; set join_cache_level=6;
select t2.f1, t2.f2, t2.f3 from t1,t2 select t2.f1, t2.f2, t2.f3 from t1,t2
@ -1541,7 +1541,7 @@ where t1.f1=t2.f1 and t2.f2 between t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1;
explain select t2.f1, t2.f2, t2.f3 from t1,t2 explain select t2.f1, t2.f2, t2.f3 from t1,t2
where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2; where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2;
show status like "Handler_pushed%"; show status like "Handler_icp%";
set join_cache_level=7; set join_cache_level=7;
select t2.f1, t2.f2, t2.f3 from t1,t2 select t2.f1, t2.f2, t2.f3 from t1,t2
@ -1549,7 +1549,7 @@ where t1.f1=t2.f1 and t2.f2 between t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1;
explain select t2.f1, t2.f2, t2.f3 from t1,t2 explain select t2.f1, t2.f2, t2.f3 from t1,t2
where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2; where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2;
show status like "Handler_pushed%"; show status like "Handler_icp%";
set join_cache_level=8; set join_cache_level=8;
select t2.f1, t2.f2, t2.f3 from t1,t2 select t2.f1, t2.f2, t2.f3 from t1,t2
@ -1557,7 +1557,7 @@ where t1.f1=t2.f1 and t2.f2 between t1.f1 and t1.f2 and t2.f2 + 1 >= t1.f1 + 1;
explain select t2.f1, t2.f2, t2.f3 from t1,t2 explain select t2.f1, t2.f2, t2.f3 from t1,t2
where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2; where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2;
show status like "Handler_pushed%"; show status like "Handler_icp%";
drop table t1,t2; drop table t1,t2;
set join_cache_level=default; set join_cache_level=default;

View File

@ -3,6 +3,7 @@
--disable_warnings --disable_warnings
drop table if exists t1,t2; drop table if exists t1,t2;
drop DATABASE if exists mysqltest_1;
--enable_warnings --enable_warnings
# Test to see if select will get the lock ahead of low priority update # Test to see if select will get the lock ahead of low priority update

View File

@ -262,133 +262,5 @@ SET optimizer_switch=@save_optimizer_switch;
DROP TABLE t1,t2,t3,t4; DROP TABLE t1,t2,t3,t4;
--echo #
--echo # BUG#933412: Server crashes in _mi_put_key_in_record on KILL QUERY with ICP, STRAIGHT_JOIN
--echo #
CREATE TABLE t1 (
b INT,
c VARCHAR(1) NOT NULL,
d DATETIME,
KEY (c, b)
) ENGINE=MyISAM;
--echo # INSERT some data
--disable_query_log
INSERT INTO t1 ( b, d, c ) VALUES
(4,'2005-01-08 00:00:00','f'),
(1,'2004-05-20 10:45:51','c'),(2,'2006-08-11 21:33:49','e'),
(5,'2003-05-19 00:20:40','a'),(3,'2005-01-03 06:18:39','a'),
(7,'2008-11-25 18:18:14','b'),(6,'2008-11-09 15:53:46','b'),
(9,'2003-03-01 03:40:36','c'),(8,'2003-09-25 23:14:09','d'),
(0,'2007-01-17 09:18:31','f'),(9,'2008-09-08 09:52:24','c'),
(2,'2008-03-10 00:00:00','a'),(0,'2003-03-14 09:31:07','c'),
(4,'2005-04-25 00:00:00','h'),(6,'2001-08-01 05:55:55','e'),
(3,'2005-04-09 01:22:48','f'),(7,'2009-11-12 13:27:22','r'),
(0,'2009-03-28 05:05:28','h'),(15,'2005-05-16 04:35:41','f'),
(7,'2006-03-26 05:19:58','c'),(9,'2002-10-06 02:17:00','g'),
(4,'2007-01-28 03:28:20','b'),(1,'2009-04-22 10:16:40','c'),
(2,'2003-01-01 19:39:00','f'),(0,'2008-05-03 19:16:29','t'),
(2,'2005-01-28 00:00:00','j'),(8,'2004-01-10 00:00:00','w'),
(8,'2000-06-13 21:56:37','a'),(5,'2001-03-21 19:24:49','o'),
(99,'2003-12-20 21:29:06','f'),(0,'1900-01-01 00:00:00','w'),
(7,'2000-12-19 00:00:00','c'),(0,'2000-03-03 06:10:19','l'),
(3,'2000-08-11 00:00:00','q'),(0,'2007-05-25 03:46:41','e'),
(241,'2005-05-17 00:00:00','j'),(4,'2005-11-02 00:44:06','r'),
(43,'2001-07-11 00:00:00','a'),(1,'2008-12-01 18:30:27','z'),
(4,'2004-10-25 00:00:00','i'),(5,'2000-04-08 12:12:01','c'),
(0,'1900-01-01 00:00:00','f'),(9,'2002-05-13 22:47:02','p'),
(1,'2008-10-09 15:39:40','d'),(3,'2004-06-24 00:00:00','d'),
(0,'2008-03-06 00:00:00','r'),(9,'2007-04-16 18:40:03','i'),
(3,'2008-03-16 19:49:37','t'),(7,'2003-07-15 08:11:21','d'),
(8,'2005-02-11 00:04:53','r'),(0,'2002-09-21 00:00:00','y'),
(3,'2004-11-03 00:37:21','z'),(6,'2007-10-18 00:00:00','e'),
(6,'2007-01-21 10:42:56','o'),(5,'2000-03-26 21:21:04','b'),
(9,'2001-03-15 08:08:21','e'),(1,'2001-10-16 12:56:59','a'),
(6,'2004-05-01 23:45:55','o'),(4,'2000-03-04 00:00:00','f'),
(9,'2002-12-03 16:48:28','e'),(8,'2003-01-09 00:36:07','m'),
(1,'2006-06-22 04:32:41','s'),(8,'2008-09-20 05:01:48','q'),
(4,'2006-06-02 22:15:31','g'),(2,'2002-05-14 07:07:42','e'),
(7,'2005-06-05 01:30:42','r'),(127,'2004-05-11 01:56:48','a'),
(210,'2003-11-05 00:41:34','z'),(5,'1900-01-01 00:00:00','h'),
(1,'2006-04-16 00:00:00','f'),(7,'2000-12-17 00:00:00','x'),
(8,'2009-05-09 20:43:07','b'),(175,'2008-11-26 16:33:09','p'),
(0,'2002-05-09 21:18:44','v'),(8,'2002-06-01 11:32:25','k'),
(1,'2008-11-09 23:56:00','a'),(0,'2008-01-08 10:18:46','c'),
(2,'2005-04-16 00:00:00','o'),(5,'2002-08-25 00:00:00','b'),
(64,'2005-12-05 21:51:52','b'),(4,'2005-08-10 00:00:00','i'),
(6,'2006-03-23 00:00:00','d'),(9,'2007-01-27 00:00:00','i'),
(8,'2008-08-16 00:00:00','a'),(7,'2003-01-16 12:13:18','k'),
(0,'2003-06-22 00:00:00','v'),(5,'2008-06-20 05:43:56','u'),
(8,'2004-09-23 18:57:17','e'),(1,'2000-12-26 00:00:00','y'),
(4,'2009-06-01 13:00:28','e'),(1,'2009-11-18 06:28:48','m'),
(0,'2004-06-12 10:01:10','e'),(2,'2005-10-16 01:48:55','e'),
(5,'2001-12-23 09:50:21','l'),(6,'1900-01-01 00:00:00','a'),
(1,'2001-10-28 00:00:00','d'),(1,'2008-07-12 23:30:19','s'),
(0,'2002-10-11 16:51:16','r'),(4,'2007-09-18 06:27:10','x'),
(1,'2007-02-21 12:28:14','e'),(6,'2001-09-16 00:00:00','f'),
(0,'2007-09-20 02:25:45','c'),(0,'2006-08-07 03:25:56','j'),
(8,'2006-12-04 20:20:32','t'),(7,'2007-09-05 10:13:10','i'),
(9,'2006-04-12 17:59:57','t'),(2,'2009-04-28 00:06:09','b'),
(8,'2000-01-07 00:00:00','b'),(7,'2000-03-25 10:04:41','k'),
(4,'2000-07-10 00:44:55','w'),(9,'2007-09-22 14:26:26','j'),
(9,'2003-09-11 22:41:17','a'),(0,'2004-06-07 13:52:32','c'),
(8,'2008-10-09 00:00:00','p'),(1,'2007-04-01 00:00:00','c'),
(9,'2000-12-05 00:00:00','i'),(3,'1900-01-01 00:00:00','a'),
(3,'2005-12-24 21:50:54','e'),(8,'2009-07-21 19:34:55','n'),
(9,'2005-11-13 17:57:56','d'),(7,'2004-10-07 06:41:39','l'),
(1,'2004-11-20 08:05:08','u'),(3,'2005-05-25 00:00:00','r'),
(1,'2006-09-02 14:16:41','u'),(8,'2006-01-07 00:00:00','a'),
(9,'2003-04-05 00:54:20','w'),(2,'2003-12-22 00:00:00','a'),
(9,'2006-04-16 17:31:40','e'),(6,'2005-02-10 14:22:46','e'),
(7,'2004-04-27 05:54:52','p'),(1,'2005-12-07 00:00:00','t'),
(5,'2004-04-03 20:56:28','d'),(4,'2000-09-07 05:17:16','h'),
(2,'2004-08-04 16:10:42','i'),(1,'2007-03-04 00:00:00','b'),
(9,'1900-01-01 00:00:00','d'),(1,'2000-05-12 23:02:50','m'),
(2,'1900-01-01 00:00:00','l'),(1,'1900-01-01 00:00:00','k'),
(4,'2000-07-14 01:25:18','d'),(5,'2009-08-21 00:00:00','w'),
(6,'2009-05-25 13:33:54','f'),(7,'2006-06-13 00:00:00','e'),
(8,'1900-01-01 00:00:00','a'),(6,'2004-02-24 00:00:00','j'),
(0,'2003-05-21 07:03:46','k'),(9,'1900-01-01 00:00:00','e'),
(2,'1900-01-01 00:00:00','y'),(2,'2000-12-22 00:00:00','e'),
(3,'2003-09-26 00:00:00','f'),(2,'2001-01-13 08:20:19','h'),
(9,'2008-09-23 20:03:28','n'),(5,'2007-03-20 02:41:38','s'),
(1,'2009-02-14 10:27:18','a'),(0,'2001-08-10 17:44:05','s'),
(3,'2008-01-20 12:49:54','v'),(1,'2001-05-05 09:09:59','r');
--enable_query_log
CREATE TABLE t2 ( a INT ) ENGINE=MyISAM;
INSERT INTO t2 VALUES
(7),(3),(7),(3);
# 'con2' will be the connection that will run all the KILLable statements
--connect (con2,127.0.0.1,root,,test)
--let $run = 300
--let $con_id = `SELECT CONNECTION_ID()`
--echo # Now run a number of ICP queries while trying to kill them
--disable_query_log
--disable_result_log
while ($run)
{
--send
SELECT * FROM t1 AS alias1 STRAIGHT_JOIN t1 AS alias2
ON alias2.c = alias1.c
WHERE alias2.b >= 9;
--connect (con1,127.0.0.1,root,,test)
--eval KILL QUERY $con_id
--disconnect con1
--dec $run
--connection con2
--error 0,ER_QUERY_INTERRUPTED
--reap
}
--enable_result_log
--enable_query_log
--disconnect con2
--connection default
DROP TABLE t1,t2;
set optimizer_switch=@myisam_icp_tmp; set optimizer_switch=@myisam_icp_tmp;

View File

@ -0,0 +1,139 @@
-- source include/not_embedded.inc
--disable_warnings
drop table if exists t1,t2;
--enable_warnings
set @myisam_icp_notembedded_tmp=@@optimizer_switch;
set optimizer_switch='mrr=on,mrr_sort_keys=on,index_condition_pushdown=on';
--echo #
--echo # BUG#933412: Server crashes in _mi_put_key_in_record on KILL QUERY with ICP, STRAIGHT_JOIN
--echo #
CREATE TABLE t1 (
b INT,
c VARCHAR(1) NOT NULL,
d DATETIME,
KEY (c, b)
) ENGINE=MyISAM;
--echo # INSERT some data
--disable_query_log
INSERT INTO t1 ( b, d, c ) VALUES
(4,'2005-01-08 00:00:00','f'),
(1,'2004-05-20 10:45:51','c'),(2,'2006-08-11 21:33:49','e'),
(5,'2003-05-19 00:20:40','a'),(3,'2005-01-03 06:18:39','a'),
(7,'2008-11-25 18:18:14','b'),(6,'2008-11-09 15:53:46','b'),
(9,'2003-03-01 03:40:36','c'),(8,'2003-09-25 23:14:09','d'),
(0,'2007-01-17 09:18:31','f'),(9,'2008-09-08 09:52:24','c'),
(2,'2008-03-10 00:00:00','a'),(0,'2003-03-14 09:31:07','c'),
(4,'2005-04-25 00:00:00','h'),(6,'2001-08-01 05:55:55','e'),
(3,'2005-04-09 01:22:48','f'),(7,'2009-11-12 13:27:22','r'),
(0,'2009-03-28 05:05:28','h'),(15,'2005-05-16 04:35:41','f'),
(7,'2006-03-26 05:19:58','c'),(9,'2002-10-06 02:17:00','g'),
(4,'2007-01-28 03:28:20','b'),(1,'2009-04-22 10:16:40','c'),
(2,'2003-01-01 19:39:00','f'),(0,'2008-05-03 19:16:29','t'),
(2,'2005-01-28 00:00:00','j'),(8,'2004-01-10 00:00:00','w'),
(8,'2000-06-13 21:56:37','a'),(5,'2001-03-21 19:24:49','o'),
(99,'2003-12-20 21:29:06','f'),(0,'1900-01-01 00:00:00','w'),
(7,'2000-12-19 00:00:00','c'),(0,'2000-03-03 06:10:19','l'),
(3,'2000-08-11 00:00:00','q'),(0,'2007-05-25 03:46:41','e'),
(241,'2005-05-17 00:00:00','j'),(4,'2005-11-02 00:44:06','r'),
(43,'2001-07-11 00:00:00','a'),(1,'2008-12-01 18:30:27','z'),
(4,'2004-10-25 00:00:00','i'),(5,'2000-04-08 12:12:01','c'),
(0,'1900-01-01 00:00:00','f'),(9,'2002-05-13 22:47:02','p'),
(1,'2008-10-09 15:39:40','d'),(3,'2004-06-24 00:00:00','d'),
(0,'2008-03-06 00:00:00','r'),(9,'2007-04-16 18:40:03','i'),
(3,'2008-03-16 19:49:37','t'),(7,'2003-07-15 08:11:21','d'),
(8,'2005-02-11 00:04:53','r'),(0,'2002-09-21 00:00:00','y'),
(3,'2004-11-03 00:37:21','z'),(6,'2007-10-18 00:00:00','e'),
(6,'2007-01-21 10:42:56','o'),(5,'2000-03-26 21:21:04','b'),
(9,'2001-03-15 08:08:21','e'),(1,'2001-10-16 12:56:59','a'),
(6,'2004-05-01 23:45:55','o'),(4,'2000-03-04 00:00:00','f'),
(9,'2002-12-03 16:48:28','e'),(8,'2003-01-09 00:36:07','m'),
(1,'2006-06-22 04:32:41','s'),(8,'2008-09-20 05:01:48','q'),
(4,'2006-06-02 22:15:31','g'),(2,'2002-05-14 07:07:42','e'),
(7,'2005-06-05 01:30:42','r'),(127,'2004-05-11 01:56:48','a'),
(210,'2003-11-05 00:41:34','z'),(5,'1900-01-01 00:00:00','h'),
(1,'2006-04-16 00:00:00','f'),(7,'2000-12-17 00:00:00','x'),
(8,'2009-05-09 20:43:07','b'),(175,'2008-11-26 16:33:09','p'),
(0,'2002-05-09 21:18:44','v'),(8,'2002-06-01 11:32:25','k'),
(1,'2008-11-09 23:56:00','a'),(0,'2008-01-08 10:18:46','c'),
(2,'2005-04-16 00:00:00','o'),(5,'2002-08-25 00:00:00','b'),
(64,'2005-12-05 21:51:52','b'),(4,'2005-08-10 00:00:00','i'),
(6,'2006-03-23 00:00:00','d'),(9,'2007-01-27 00:00:00','i'),
(8,'2008-08-16 00:00:00','a'),(7,'2003-01-16 12:13:18','k'),
(0,'2003-06-22 00:00:00','v'),(5,'2008-06-20 05:43:56','u'),
(8,'2004-09-23 18:57:17','e'),(1,'2000-12-26 00:00:00','y'),
(4,'2009-06-01 13:00:28','e'),(1,'2009-11-18 06:28:48','m'),
(0,'2004-06-12 10:01:10','e'),(2,'2005-10-16 01:48:55','e'),
(5,'2001-12-23 09:50:21','l'),(6,'1900-01-01 00:00:00','a'),
(1,'2001-10-28 00:00:00','d'),(1,'2008-07-12 23:30:19','s'),
(0,'2002-10-11 16:51:16','r'),(4,'2007-09-18 06:27:10','x'),
(1,'2007-02-21 12:28:14','e'),(6,'2001-09-16 00:00:00','f'),
(0,'2007-09-20 02:25:45','c'),(0,'2006-08-07 03:25:56','j'),
(8,'2006-12-04 20:20:32','t'),(7,'2007-09-05 10:13:10','i'),
(9,'2006-04-12 17:59:57','t'),(2,'2009-04-28 00:06:09','b'),
(8,'2000-01-07 00:00:00','b'),(7,'2000-03-25 10:04:41','k'),
(4,'2000-07-10 00:44:55','w'),(9,'2007-09-22 14:26:26','j'),
(9,'2003-09-11 22:41:17','a'),(0,'2004-06-07 13:52:32','c'),
(8,'2008-10-09 00:00:00','p'),(1,'2007-04-01 00:00:00','c'),
(9,'2000-12-05 00:00:00','i'),(3,'1900-01-01 00:00:00','a'),
(3,'2005-12-24 21:50:54','e'),(8,'2009-07-21 19:34:55','n'),
(9,'2005-11-13 17:57:56','d'),(7,'2004-10-07 06:41:39','l'),
(1,'2004-11-20 08:05:08','u'),(3,'2005-05-25 00:00:00','r'),
(1,'2006-09-02 14:16:41','u'),(8,'2006-01-07 00:00:00','a'),
(9,'2003-04-05 00:54:20','w'),(2,'2003-12-22 00:00:00','a'),
(9,'2006-04-16 17:31:40','e'),(6,'2005-02-10 14:22:46','e'),
(7,'2004-04-27 05:54:52','p'),(1,'2005-12-07 00:00:00','t'),
(5,'2004-04-03 20:56:28','d'),(4,'2000-09-07 05:17:16','h'),
(2,'2004-08-04 16:10:42','i'),(1,'2007-03-04 00:00:00','b'),
(9,'1900-01-01 00:00:00','d'),(1,'2000-05-12 23:02:50','m'),
(2,'1900-01-01 00:00:00','l'),(1,'1900-01-01 00:00:00','k'),
(4,'2000-07-14 01:25:18','d'),(5,'2009-08-21 00:00:00','w'),
(6,'2009-05-25 13:33:54','f'),(7,'2006-06-13 00:00:00','e'),
(8,'1900-01-01 00:00:00','a'),(6,'2004-02-24 00:00:00','j'),
(0,'2003-05-21 07:03:46','k'),(9,'1900-01-01 00:00:00','e'),
(2,'1900-01-01 00:00:00','y'),(2,'2000-12-22 00:00:00','e'),
(3,'2003-09-26 00:00:00','f'),(2,'2001-01-13 08:20:19','h'),
(9,'2008-09-23 20:03:28','n'),(5,'2007-03-20 02:41:38','s'),
(1,'2009-02-14 10:27:18','a'),(0,'2001-08-10 17:44:05','s'),
(3,'2008-01-20 12:49:54','v'),(1,'2001-05-05 09:09:59','r');
--enable_query_log
CREATE TABLE t2 ( a INT ) ENGINE=MyISAM;
INSERT INTO t2 VALUES
(7),(3),(7),(3);
# 'con2' will be the connection that will run all the KILLable statements
--connect (con2,127.0.0.1,root,,test)
--let $run = 300
--let $con_id = `SELECT CONNECTION_ID()`
--echo # Now run a number of ICP queries while trying to kill them
--disable_query_log
--disable_result_log
while ($run)
{
--send
SELECT * FROM t1 AS alias1 STRAIGHT_JOIN t1 AS alias2
ON alias2.c = alias1.c
WHERE alias2.b >= 9;
--connect (con1,127.0.0.1,root,,test)
--eval KILL QUERY $con_id
--disconnect con1
--dec $run
--connection con2
--error 0,ER_QUERY_INTERRUPTED
--reap
}
--enable_result_log
--enable_query_log
--disconnect con2
--connection default
DROP TABLE t1,t2;
set optimizer_switch=@myisam_icp_notembedded_tmp;

View File

@ -313,7 +313,6 @@ set join_buffer_size=10;
explain select sum(t1.b) from t0,t1 where t0.a=t1.a; explain select sum(t1.b) from t0,t1 where t0.a=t1.a;
flush status; flush status;
select sum(t1.b) from t0,t1 where t0.a=t1.a; select sum(t1.b) from t0,t1 where t0.a=t1.a;
--replace_result 1 1or2 2 1or2
show status like 'handler_mrr%'; show status like 'handler_mrr%';
set join_cache_level= @join_cache_level_save; set join_cache_level= @join_cache_level_save;

View File

@ -411,6 +411,12 @@ DROP TABLE t1, t2;
--echo End of 5.1 tests --echo End of 5.1 tests
--echo #
--echo # lp:923429 Crash in decimal_cmp on using UNIX_TIMESTAMP with a wrongly formatted timestamp
--echo #
SELECT UNIX_TIMESTAMP('abc') > 0;
SELECT UNIX_TIMESTAMP('abc');
--echo --echo
--echo Bug#50888 valgrind warnings in Field_timestamp::val_str --echo Bug#50888 valgrind warnings in Field_timestamp::val_str
--echo --echo
@ -441,4 +447,3 @@ SELECT MAX(dt) = '2011-01-06 12:34:30' FROM t1;
DROP TABLE t1; DROP TABLE t1;
--echo End of 5.5 tests --echo End of 5.5 tests

View File

@ -1,5 +1,6 @@
/* /*
Copyright (c) 2000, 2011, Oracle and/or its affiliates Copyright (c) 2000, 2011, Oracle and/or its affiliates
Copyright (c) 2012, Monty Program Ab
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -176,7 +177,8 @@ thr_lock_owner_equal(THR_LOCK_INFO *rhs, THR_LOCK_INFO *lhs)
static uint found_errors=0; static uint found_errors=0;
static int check_lock(struct st_lock_list *list, const char* lock_type, static int check_lock(struct st_lock_list *list, const char* lock_type,
const char *where, my_bool same_owner, my_bool no_cond) const char *where, my_bool same_owner, my_bool no_cond,
my_bool read_lock)
{ {
THR_LOCK_DATA *data,**prev; THR_LOCK_DATA *data,**prev;
uint count=0; uint count=0;
@ -189,6 +191,23 @@ static int check_lock(struct st_lock_list *list, const char* lock_type,
for (data=list->data; data && count++ < MAX_LOCKS ; data=data->next) for (data=list->data; data && count++ < MAX_LOCKS ; data=data->next)
{ {
if (data->type == TL_UNLOCK)
{
fprintf(stderr,
"Warning: Found unlocked lock at %s: %s\n",
lock_type, where);
return 1;
}
if ((read_lock && data->type > TL_READ_NO_INSERT) ||
(!read_lock && data->type <= TL_READ_NO_INSERT))
{
fprintf(stderr,
"Warning: Found %s lock in %s queue at %s: %s\n",
read_lock ? "write" : "read",
read_lock ? "read" : "write",
lock_type, where);
return 1;
}
if (data->type != last_lock_type) if (data->type != last_lock_type)
last_lock_type=TL_IGNORE; last_lock_type=TL_IGNORE;
if (data->prev != prev) if (data->prev != prev)
@ -245,11 +264,14 @@ static void check_locks(THR_LOCK *lock, const char *where,
if (found_errors < MAX_FOUND_ERRORS) if (found_errors < MAX_FOUND_ERRORS)
{ {
if (check_lock(&lock->write,"write",where,1,1) | if (check_lock(&lock->write,"write",where,1,1,0) |
check_lock(&lock->write_wait,"write_wait",where,0,0) | check_lock(&lock->write_wait,"write_wait",where,0,0,0) |
check_lock(&lock->read,"read",where,0,1) | check_lock(&lock->read,"read",where,0,1,1) |
check_lock(&lock->read_wait,"read_wait",where,0,0)) check_lock(&lock->read_wait,"read_wait",where,0,0,1))
{
DBUG_ASSERT(my_assert_on_error == 0);
found_errors++; found_errors++;
}
if (found_errors < MAX_FOUND_ERRORS) if (found_errors < MAX_FOUND_ERRORS)
{ {
@ -621,17 +643,16 @@ wait_for_lock(struct st_lock_list *wait, THR_LOCK_DATA *data,
static enum enum_thr_lock_result static enum enum_thr_lock_result
thr_lock(THR_LOCK_DATA *data, THR_LOCK_INFO *owner, thr_lock(THR_LOCK_DATA *data, THR_LOCK_INFO *owner, ulong lock_wait_timeout)
enum thr_lock_type lock_type, ulong lock_wait_timeout)
{ {
THR_LOCK *lock=data->lock; THR_LOCK *lock=data->lock;
enum enum_thr_lock_result result= THR_LOCK_SUCCESS; enum enum_thr_lock_result result= THR_LOCK_SUCCESS;
struct st_lock_list *wait_queue; struct st_lock_list *wait_queue;
enum thr_lock_type lock_type= data->type;
DBUG_ENTER("thr_lock"); DBUG_ENTER("thr_lock");
data->next=0; data->next=0;
data->cond=0; /* safety */ data->cond=0; /* safety */
data->type=lock_type;
data->owner= owner; /* Must be reset ! */ data->owner= owner; /* Must be reset ! */
data->priority&= ~THR_LOCK_LATE_PRIV; data->priority&= ~THR_LOCK_LATE_PRIV;
mysql_mutex_lock(&lock->mutex); mysql_mutex_lock(&lock->mutex);
@ -964,9 +985,7 @@ void thr_unlock(THR_LOCK_DATA *data, uint unlock_flags)
if (lock_type == TL_READ_NO_INSERT) if (lock_type == TL_READ_NO_INSERT)
lock->read_no_write_count--; lock->read_no_write_count--;
data->type=TL_UNLOCK; /* Mark unlocked */ data->type=TL_UNLOCK; /* Mark unlocked */
check_locks(lock,"after releasing lock", lock_type, 1);
wake_up_waiters(lock); wake_up_waiters(lock);
check_locks(lock,"end of thr_unlock", lock_type, 1);
mysql_mutex_unlock(&lock->mutex); mysql_mutex_unlock(&lock->mutex);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
@ -986,6 +1005,7 @@ static void wake_up_waiters(THR_LOCK *lock)
enum thr_lock_type lock_type; enum thr_lock_type lock_type;
DBUG_ENTER("wake_up_waiters"); DBUG_ENTER("wake_up_waiters");
check_locks(lock, "before waking up waiters", TL_UNLOCK, 1);
if (!lock->write.data) /* If no active write locks */ if (!lock->write.data) /* If no active write locks */
{ {
data=lock->write_wait.data; data=lock->write_wait.data;
@ -1140,8 +1160,7 @@ thr_multi_lock(THR_LOCK_DATA **data, uint count, THR_LOCK_INFO *owner,
/* lock everything */ /* lock everything */
for (pos=data,end=data+count; pos < end ; pos++) for (pos=data,end=data+count; pos < end ; pos++)
{ {
enum enum_thr_lock_result result= thr_lock(*pos, owner, (*pos)->type, enum enum_thr_lock_result result= thr_lock(*pos, owner, lock_wait_timeout);
lock_wait_timeout);
if (result != THR_LOCK_SUCCESS) if (result != THR_LOCK_SUCCESS)
{ /* Aborted */ { /* Aborted */
thr_multi_unlock(data,(uint) (pos-data), 0); thr_multi_unlock(data,(uint) (pos-data), 0);

View File

@ -14,6 +14,10 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#ifndef _GNU_SOURCE
#define _GNU_SOURCE /* For strndup() */
#endif
#include <mysql/plugin_auth.h> #include <mysql/plugin_auth.h>
#include <string.h> #include <string.h>
#include <my_config.h> #include <my_config.h>

View File

@ -274,6 +274,7 @@ cd ..
# the build for the relevant directories. # the build for the relevant directories.
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
@MAKE@ DESTDIR=$BASE install \ @MAKE@ DESTDIR=$BASE install \
libexecdir=@prefix@/libexec \
pkglibdir=@pkglibdir@ \ pkglibdir=@pkglibdir@ \
pkgincludedir=@pkgincludedir@ \ pkgincludedir=@pkgincludedir@ \
pkgdatadir=@pkgdatadir@ \ pkgdatadir=@pkgdatadir@ \

View File

@ -85,7 +85,7 @@ bindir='@bindir@'
# If installed, search for the compiled in directory first (might be "lib64") # If installed, search for the compiled in directory first (might be "lib64")
pkglibdir='@pkglibdir@' pkglibdir='@pkglibdir@'
pkglibdir_rel=`echo $pkglibdir | sed -e "s;^$basedir/;;"` pkglibdir_rel=`echo $pkglibdir | sed -e "s;^$basedir/;;"`
fix_path pkglibdir $pkglibdir_rel lib/mysql lib fix_path pkglibdir $pkglibdir_rel lib64/mysql lib64 lib/mysql lib
plugindir='@pkgplugindir@' plugindir='@pkgplugindir@'
plugindir_rel=`echo $plugindir | sed -e "s;^$basedir/;;"` plugindir_rel=`echo $plugindir | sed -e "s;^$basedir/;;"`

View File

@ -4631,10 +4631,10 @@ extern "C" enum icp_result handler_index_cond_check(void* h_arg)
if (h->end_range && h->compare_key2(h->end_range) > 0) if (h->end_range && h->compare_key2(h->end_range) > 0)
return ICP_OUT_OF_RANGE; return ICP_OUT_OF_RANGE;
h->increment_statistics(&SSV::ha_pushed_index_cond_checks); h->increment_statistics(&SSV::ha_icp_attempts);
if ((res= h->pushed_idx_cond->val_int()? ICP_MATCH : ICP_NO_MATCH) == if ((res= h->pushed_idx_cond->val_int()? ICP_MATCH : ICP_NO_MATCH) ==
ICP_NO_MATCH) ICP_MATCH)
h->increment_statistics(&SSV::ha_pushed_index_cond_filtered); h->increment_statistics(&SSV::ha_icp_match);
return res; return res;
} }

View File

@ -1199,15 +1199,7 @@ bool Item_func_unix_timestamp::get_timestamp_value(my_time_t *seconds,
MYSQL_TIME ltime; MYSQL_TIME ltime;
if (get_arg0_date(&ltime, 0)) if (get_arg0_date(&ltime, 0))
{
/*
We have to set null_value again because get_arg0_date will also set it
to true if we have wrong datetime parameter (and we should return 0 in
this case).
*/
null_value= args[0]->null_value;
return 1; return 1;
}
uint error_code; uint error_code;
*seconds= TIME_to_timestamp(current_thd, &ltime, &error_code); *seconds= TIME_to_timestamp(current_thd, &ltime, &error_code);

View File

@ -436,11 +436,6 @@ public:
enum_monotonicity_info get_monotonicity_info() const; enum_monotonicity_info get_monotonicity_info() const;
longlong val_int_endpoint(bool left_endp, bool *incl_endp); longlong val_int_endpoint(bool left_endp, bool *incl_endp);
bool check_partition_func_processor(uchar *int_arg) {return FALSE;} bool check_partition_func_processor(uchar *int_arg) {return FALSE;}
void fix_num_length_and_dec()
{
maybe_null= false;
Item_func_seconds_hybrid::fix_num_length_and_dec();
}
/* /*
UNIX_TIMESTAMP() depends on the current timezone UNIX_TIMESTAMP() depends on the current timezone
(and thus may not be used as a partitioning function) (and thus may not be used as a partitioning function)

View File

@ -526,7 +526,7 @@ int Mrr_ordered_index_reader::refill_buffer(bool initial)
{ {
/* This is a non-initial buffer fill and we've got a non-empty buffer */ /* This is a non-initial buffer fill and we've got a non-empty buffer */
THD *thd= current_thd; THD *thd= current_thd;
status_var_increment(thd->status_var.ha_mrr_extra_key_sorts); status_var_increment(thd->status_var.ha_mrr_key_refills_count);
} }
key_buffer->sort((key_buffer->type() == Lifo_buffer::FORWARD)? key_buffer->sort((key_buffer->type() == Lifo_buffer::FORWARD)?
@ -626,7 +626,7 @@ int Mrr_ordered_rndpos_reader::refill_buffer(bool initial)
{ {
/* Ok, this was a successful buffer refill operation */ /* Ok, this was a successful buffer refill operation */
THD *thd= current_thd; THD *thd= current_thd;
status_var_increment(thd->status_var.ha_mrr_extra_rowid_sorts); status_var_increment(thd->status_var.ha_mrr_rowid_refills_count);
} }
DBUG_RETURN(res); DBUG_RETURN(res);
@ -861,8 +861,6 @@ int DsMrr_impl::dsmrr_init(handler *h_arg, RANGE_SEQ_IF *seq_funcs,
strategy= disk_strategy= &reader_factory.ordered_rndpos_reader; strategy= disk_strategy= &reader_factory.ordered_rndpos_reader;
} }
status_var_increment(thd->status_var.ha_multi_range_read_init_count);
full_buf= buf->buffer; full_buf= buf->buffer;
full_buf_end= buf->buffer_end; full_buf_end= buf->buffer_end;
@ -952,6 +950,12 @@ int DsMrr_impl::dsmrr_init(handler *h_arg, RANGE_SEQ_IF *seq_funcs,
goto error; goto error;
} }
} }
/*
At this point, we're sure that we're running a native MRR scan (i.e. we
didnt fall back to default implementation for some reason).
*/
status_var_increment(thd->status_var.ha_mrr_init_count);
res= strategy->refill_buffer(TRUE); res= strategy->refill_buffer(TRUE);
if (res) if (res)

View File

@ -6869,15 +6869,15 @@ SHOW_VAR status_vars[]= {
{"Handler_commit", (char*) offsetof(STATUS_VAR, ha_commit_count), SHOW_LONG_STATUS}, {"Handler_commit", (char*) offsetof(STATUS_VAR, ha_commit_count), SHOW_LONG_STATUS},
{"Handler_delete", (char*) offsetof(STATUS_VAR, ha_delete_count), SHOW_LONG_STATUS}, {"Handler_delete", (char*) offsetof(STATUS_VAR, ha_delete_count), SHOW_LONG_STATUS},
{"Handler_discover", (char*) offsetof(STATUS_VAR, ha_discover_count), SHOW_LONG_STATUS}, {"Handler_discover", (char*) offsetof(STATUS_VAR, ha_discover_count), SHOW_LONG_STATUS},
#if 0
/* Made 3 counters below temporarily invisible until we agree upon their names */ {"Handler_icp_attempts ", (char*) offsetof(STATUS_VAR, ha_icp_attempts), SHOW_LONG_STATUS},
{"Handler_mrr_extra_key_sorts", (char*) offsetof(STATUS_VAR, ha_mrr_extra_key_sorts), SHOW_LONG_STATUS}, {"Handler_icp_match", (char*) offsetof(STATUS_VAR, ha_icp_match), SHOW_LONG_STATUS},
{"Handler_mrr_extra_rowid_sorts", (char*) offsetof(STATUS_VAR, ha_mrr_extra_rowid_sorts), SHOW_LONG_STATUS},
{"Handler_mrr_init", (char*) offsetof(STATUS_VAR, ha_multi_range_read_init_count), SHOW_LONG_STATUS}, {"Handler_mrr_init", (char*) offsetof(STATUS_VAR, ha_mrr_init_count), SHOW_LONG_STATUS},
#endif {"Handler_mrr_key_refills", (char*) offsetof(STATUS_VAR, ha_mrr_key_refills_count), SHOW_LONG_STATUS},
{"Handler_mrr_rowid_refills", (char*) offsetof(STATUS_VAR, ha_mrr_rowid_refills_count), SHOW_LONG_STATUS},
{"Handler_prepare", (char*) offsetof(STATUS_VAR, ha_prepare_count), SHOW_LONG_STATUS}, {"Handler_prepare", (char*) offsetof(STATUS_VAR, ha_prepare_count), SHOW_LONG_STATUS},
{"Handler_pushed_index_cond_checks",(char*) offsetof(STATUS_VAR, ha_pushed_index_cond_checks), SHOW_LONG_STATUS},
{"Handler_pushed_index_cond_filtered",(char*) offsetof(STATUS_VAR, ha_pushed_index_cond_filtered), SHOW_LONG_STATUS},
{"Handler_read_first", (char*) offsetof(STATUS_VAR, ha_read_first_count), SHOW_LONG_STATUS}, {"Handler_read_first", (char*) offsetof(STATUS_VAR, ha_read_first_count), SHOW_LONG_STATUS},
{"Handler_read_key", (char*) offsetof(STATUS_VAR, ha_read_key_count), SHOW_LONG_STATUS}, {"Handler_read_key", (char*) offsetof(STATUS_VAR, ha_read_key_count), SHOW_LONG_STATUS},
{"Handler_read_last", (char*) offsetof(STATUS_VAR, ha_read_last_count), SHOW_LONG_STATUS}, {"Handler_read_last", (char*) offsetof(STATUS_VAR, ha_read_last_count), SHOW_LONG_STATUS},

View File

@ -591,9 +591,9 @@ typedef struct system_status_var
calls made by range access. The intent is to count only calls made by calls made by range access. The intent is to count only calls made by
BatchedKeyAccess. BatchedKeyAccess.
*/ */
ulong ha_multi_range_read_init_count; ulong ha_mrr_init_count;
ulong ha_mrr_extra_key_sorts; ulong ha_mrr_key_refills_count;
ulong ha_mrr_extra_rowid_sorts; ulong ha_mrr_rowid_refills_count;
ulong ha_rollback_count; ulong ha_rollback_count;
ulong ha_update_count; ulong ha_update_count;
@ -602,8 +602,8 @@ typedef struct system_status_var
ulong ha_tmp_update_count; ulong ha_tmp_update_count;
ulong ha_tmp_write_count; ulong ha_tmp_write_count;
ulong ha_prepare_count; ulong ha_prepare_count;
ulong ha_pushed_index_cond_checks; ulong ha_icp_attempts;
ulong ha_pushed_index_cond_filtered; ulong ha_icp_match;
ulong ha_discover_count; ulong ha_discover_count;
ulong ha_savepoint_count; ulong ha_savepoint_count;
ulong ha_savepoint_rollback_count; ulong ha_savepoint_rollback_count;

View File

@ -750,7 +750,7 @@ retry:
if (handler->lock->lock_count > 0) if (handler->lock->lock_count > 0)
{ {
bool lock_error; int lock_error;
handler->lock->locks[0]->type= handler->lock->locks[0]->org_type; handler->lock->locks[0]->type= handler->lock->locks[0]->org_type;

View File

@ -4027,9 +4027,9 @@ bool bka_skip_index_tuple(range_seq_t rseq, range_id_t range_info)
JOIN_CACHE_BKA *cache= (JOIN_CACHE_BKA *) rseq; JOIN_CACHE_BKA *cache= (JOIN_CACHE_BKA *) rseq;
THD *thd= cache->thd(); THD *thd= cache->thd();
bool res; bool res;
status_var_increment(thd->status_var.ha_pushed_index_cond_checks); status_var_increment(thd->status_var.ha_icp_attempts);
if ((res= cache->skip_index_tuple(range_info))) if (!(res= cache->skip_index_tuple(range_info)))
status_var_increment(thd->status_var.ha_pushed_index_cond_filtered); status_var_increment(thd->status_var.ha_icp_match);
DBUG_RETURN(res); DBUG_RETURN(res);
} }
@ -4506,9 +4506,9 @@ bool bkah_skip_index_tuple(range_seq_t rseq, range_id_t range_info)
JOIN_CACHE_BKAH *cache= (JOIN_CACHE_BKAH *) rseq; JOIN_CACHE_BKAH *cache= (JOIN_CACHE_BKAH *) rseq;
THD *thd= cache->thd(); THD *thd= cache->thd();
bool res; bool res;
status_var_increment(thd->status_var.ha_pushed_index_cond_checks); status_var_increment(thd->status_var.ha_icp_attempts);
if ((res= cache->skip_index_tuple(range_info))) if (!(res= cache->skip_index_tuple(range_info)))
status_var_increment(thd->status_var.ha_pushed_index_cond_filtered); status_var_increment(thd->status_var.ha_icp_match);
DBUG_RETURN(res); DBUG_RETURN(res);
} }

View File

@ -535,7 +535,7 @@ btr_search_update_hash_ref(
{ {
dict_index_t* index; dict_index_t* index;
ulint fold; ulint fold;
const rec_t* rec; rec_t* rec;
ut_ad(cursor->flag == BTR_CUR_HASH_FAIL); ut_ad(cursor->flag == BTR_CUR_HASH_FAIL);
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
@ -839,7 +839,7 @@ btr_search_guess_on_hash(
{ {
buf_pool_t* buf_pool; buf_pool_t* buf_pool;
buf_block_t* block; buf_block_t* block;
const rec_t* rec; rec_t* rec;
ulint fold; ulint fold;
index_id_t index_id; index_id_t index_id;
#ifdef notdefined #ifdef notdefined
@ -925,7 +925,7 @@ btr_search_guess_on_hash(
ut_ad(page_rec_is_user_rec(rec)); ut_ad(page_rec_is_user_rec(rec));
btr_cur_position(index, (rec_t*) rec, block, cursor); btr_cur_position(index, rec, block, cursor);
/* Check the validity of the guess within the page */ /* Check the validity of the guess within the page */

View File

@ -106,7 +106,7 @@ ha_insert_for_fold_func(
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
buf_block_t* block, /*!< in: buffer block containing the data */ buf_block_t* block, /*!< in: buffer block containing the data */
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */ #endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
const rec_t* data) /*!< in: data, must not be NULL */ rec_t* data) /*!< in: data, must not be NULL */
{ {
hash_cell_t* cell; hash_cell_t* cell;
ha_node_t* node; ha_node_t* node;
@ -238,11 +238,11 @@ ha_search_and_update_if_found_func(
/*===============================*/ /*===============================*/
hash_table_t* table, /*!< in/out: hash table */ hash_table_t* table, /*!< in/out: hash table */
ulint fold, /*!< in: folded value of the searched data */ ulint fold, /*!< in: folded value of the searched data */
const rec_t* data, /*!< in: pointer to the data */ rec_t* data, /*!< in: pointer to the data */
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
buf_block_t* new_block,/*!< in: block containing new_data */ buf_block_t* new_block,/*!< in: block containing new_data */
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */ #endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
const rec_t* new_data)/*!< in: new pointer to the data */ rec_t* new_data)/*!< in: new pointer to the data */
{ {
ha_node_t* node; ha_node_t* node;

View File

@ -38,7 +38,7 @@ Looks for an element in a hash table.
@return pointer to the data of the first hash table node in chain @return pointer to the data of the first hash table node in chain
having the fold number, NULL if not found */ having the fold number, NULL if not found */
UNIV_INLINE UNIV_INLINE
const rec_t* rec_t*
ha_search_and_get_data( ha_search_and_get_data(
/*===================*/ /*===================*/
hash_table_t* table, /*!< in: hash table */ hash_table_t* table, /*!< in: hash table */
@ -52,11 +52,11 @@ ha_search_and_update_if_found_func(
/*===============================*/ /*===============================*/
hash_table_t* table, /*!< in/out: hash table */ hash_table_t* table, /*!< in/out: hash table */
ulint fold, /*!< in: folded value of the searched data */ ulint fold, /*!< in: folded value of the searched data */
const rec_t* data, /*!< in: pointer to the data */ rec_t* data, /*!< in: pointer to the data */
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
buf_block_t* new_block,/*!< in: block containing new_data */ buf_block_t* new_block,/*!< in: block containing new_data */
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */ #endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
const rec_t* new_data);/*!< in: new pointer to the data */ rec_t* new_data);/*!< in: new pointer to the data */
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
/** Looks for an element when we know the pointer to the data and /** Looks for an element when we know the pointer to the data and
@ -131,7 +131,7 @@ ha_insert_for_fold_func(
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
buf_block_t* block, /*!< in: buffer block containing the data */ buf_block_t* block, /*!< in: buffer block containing the data */
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */ #endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
const rec_t* data); /*!< in: data, must not be NULL */ rec_t* data); /*!< in: data, must not be NULL */
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
/** /**
@ -210,7 +210,7 @@ struct ha_node_struct {
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
buf_block_t* block; /*!< buffer block containing the data, or NULL */ buf_block_t* block; /*!< buffer block containing the data, or NULL */
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */ #endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
const rec_t* data; /*!< pointer to the data */ rec_t* data; /*!< pointer to the data */
ulint fold; /*!< fold value for the data */ ulint fold; /*!< fold value for the data */
}; };

View File

@ -58,7 +58,7 @@ ha_node_set_data_func(
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
buf_block_t* block, /*!< in: buffer block containing the data */ buf_block_t* block, /*!< in: buffer block containing the data */
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */ #endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
const rec_t* data) /*!< in: pointer to the data */ rec_t* data) /*!< in: pointer to the data */
{ {
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
node->block = block; node->block = block;
@ -111,7 +111,7 @@ Looks for an element in a hash table.
@return pointer to the data of the first hash table node in chain @return pointer to the data of the first hash table node in chain
having the fold number, NULL if not found */ having the fold number, NULL if not found */
UNIV_INLINE UNIV_INLINE
const rec_t* rec_t*
ha_search_and_get_data( ha_search_and_get_data(
/*===================*/ /*===================*/
hash_table_t* table, /*!< in: hash table */ hash_table_t* table, /*!< in: hash table */