mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
merge with mysql-5.1.63
This commit is contained in:
commit
0a8c9b98f6
102 changed files with 2496 additions and 316 deletions
|
@ -143,7 +143,8 @@ static my_bool opt_compress= FALSE, tty_password= FALSE,
|
|||
const char *auto_generate_sql_type= "mixed";
|
||||
|
||||
static unsigned long connect_flags= CLIENT_MULTI_RESULTS |
|
||||
CLIENT_MULTI_STATEMENTS;
|
||||
CLIENT_MULTI_STATEMENTS |
|
||||
CLIENT_REMEMBER_OPTIONS;
|
||||
|
||||
static int verbose, delimiter_length;
|
||||
static uint commit_rate;
|
||||
|
|
|
@ -12,7 +12,7 @@ dnl
|
|||
dnl When changing the major version number please also check the switch
|
||||
dnl statement in mysqlbinlog::check_master_version(). You may also need
|
||||
dnl to update version.c in ndb.
|
||||
AC_INIT([MariaDB Server], [5.1.62-MariaDB], [], [mysql])
|
||||
AC_INIT([MariaDB Server], [5.1.63-MariaDB], [], [mysql])
|
||||
|
||||
AC_CONFIG_SRCDIR([sql/mysqld.cc])
|
||||
AC_CANONICAL_SYSTEM
|
||||
|
|
|
@ -454,9 +454,11 @@ enum ha_base_keytype {
|
|||
#define HA_ERR_INITIALIZATION 174 /* Error during initialization */
|
||||
#define HA_ERR_FILE_TOO_SHORT 175 /* File too short */
|
||||
#define HA_ERR_WRONG_CRC 176 /* Wrong CRC on page */
|
||||
#define HA_ERR_ROW_NOT_VISIBLE 177
|
||||
#define HA_ERR_TOO_MANY_CONCURRENT_TRXS 178 /*Too many active concurrent transactions */
|
||||
#define HA_ERR_LAST 178 /* Copy of last error nr */
|
||||
#define HA_ERR_TOO_MANY_CONCURRENT_TRXS 177 /*Too many active concurrent transactions */
|
||||
|
||||
#define HA_ERR_ROW_NOT_VISIBLE 180 /*Too many active concurrent transactions */
|
||||
#define HA_ERR_TABLE_IN_FK_CHECK 181 /* Table being used in foreign key check */
|
||||
#define HA_ERR_LAST 181 /* Copy of last error nr */
|
||||
|
||||
/* Number of different errors */
|
||||
#define HA_ERR_ERRORS (HA_ERR_LAST - HA_ERR_FIRST + 1)
|
||||
|
|
|
@ -61,6 +61,9 @@ int vio_close_pipe(Vio * vio);
|
|||
#define HANDLE void *
|
||||
#endif /* __WIN__ */
|
||||
|
||||
/* backport from 5.6 where it is part of PSI, not vio_*() */
|
||||
int mysql_socket_shutdown(my_socket mysql_socket, int how);
|
||||
|
||||
void vio_delete(Vio* vio);
|
||||
int vio_close(Vio* vio);
|
||||
void vio_reset(Vio* vio, enum enum_vio_type type,
|
||||
|
|
|
@ -344,6 +344,8 @@ static int emb_stmt_execute(MYSQL_STMT *stmt)
|
|||
set_stmt_errmsg(stmt, net);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
else if (stmt->mysql->status == MYSQL_STATUS_GET_RESULT)
|
||||
stmt->mysql->status= MYSQL_STATUS_STATEMENT_GET_RESULT;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,9 @@
|
|||
# $engine_type -- storage engine to be tested
|
||||
# $test_foreign_keys -- 0, skip foreign key tests
|
||||
# -- 1, do not skip foreign key tests
|
||||
# $partitions_a -- partition by column 'a'
|
||||
# $partitions_id -- partition by column 'id'
|
||||
# $partitions_s1 -- partition by column 's1'
|
||||
# have to be set before sourcing this script.
|
||||
#
|
||||
# Last update:
|
||||
|
@ -19,47 +22,61 @@ eval SET SESSION STORAGE_ENGINE = $engine_type;
|
|||
drop table if exists t1,t2,t3;
|
||||
--enable_warnings
|
||||
|
||||
set @save_query_cache_size = @@global.query_cache_size;
|
||||
set GLOBAL query_cache_size = 1355776;
|
||||
|
||||
#
|
||||
# Without auto_commit.
|
||||
#
|
||||
flush status;
|
||||
set autocommit=0;
|
||||
create table t1 (a int not null);
|
||||
eval create table t1 (a int not null)$partitions_a;
|
||||
insert into t1 values (1),(2),(3);
|
||||
--sorted_result
|
||||
select * from t1;
|
||||
show status like "Qcache_queries_in_cache";
|
||||
drop table t1;
|
||||
commit;
|
||||
set autocommit=1;
|
||||
begin;
|
||||
create table t1 (a int not null);
|
||||
eval create table t1 (a int not null)$partitions_a;
|
||||
insert into t1 values (1),(2),(3);
|
||||
--sorted_result
|
||||
select * from t1;
|
||||
show status like "Qcache_queries_in_cache";
|
||||
drop table t1;
|
||||
commit;
|
||||
create table t1 (a int not null);
|
||||
create table t2 (a int not null);
|
||||
create table t3 (a int not null);
|
||||
eval create table t1 (a int not null)$partitions_a;
|
||||
eval create table t2 (a int not null)$partitions_a;
|
||||
eval create table t3 (a int not null)$partitions_a;
|
||||
insert into t1 values (1),(2);
|
||||
insert into t2 values (1),(2);
|
||||
insert into t3 values (1),(2);
|
||||
--sorted_result
|
||||
select * from t1;
|
||||
--sorted_result
|
||||
select * from t2;
|
||||
--sorted_result
|
||||
select * from t3;
|
||||
show status like "Qcache_queries_in_cache";
|
||||
show status like "Qcache_hits";
|
||||
begin;
|
||||
--sorted_result
|
||||
select * from t1;
|
||||
--sorted_result
|
||||
select * from t2;
|
||||
--sorted_result
|
||||
select * from t3;
|
||||
show status like "Qcache_queries_in_cache";
|
||||
show status like "Qcache_hits";
|
||||
insert into t1 values (3);
|
||||
insert into t2 values (3);
|
||||
insert into t1 values (4);
|
||||
--sorted_result
|
||||
select * from t1;
|
||||
--sorted_result
|
||||
select * from t2;
|
||||
--sorted_result
|
||||
select * from t3;
|
||||
show status like "Qcache_queries_in_cache";
|
||||
show status like "Qcache_hits";
|
||||
|
@ -67,7 +84,7 @@ commit;
|
|||
show status like "Qcache_queries_in_cache";
|
||||
drop table t3,t2,t1;
|
||||
|
||||
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id));
|
||||
eval CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id))$partitions_id;
|
||||
select count(*) from t1;
|
||||
insert into t1 (id) values (0);
|
||||
select count(*) from t1;
|
||||
|
@ -78,8 +95,6 @@ if ($test_foreign_keys)
|
|||
#
|
||||
# one statement roll back inside transation
|
||||
#
|
||||
let $save_query_cache_size=`select @@global.query_cache_size`;
|
||||
set GLOBAL query_cache_size=1355776;
|
||||
CREATE TABLE t1 ( id int(10) NOT NULL auto_increment, a varchar(25) default NULL, PRIMARY KEY (id), UNIQUE KEY a (a));
|
||||
CREATE TABLE t2 ( id int(10) NOT NULL auto_increment, b varchar(25) default NULL, PRIMARY KEY (id), UNIQUE KEY b (b));
|
||||
CREATE TABLE t3 ( id int(10) NOT NULL auto_increment, t1_id int(10) NOT NULL default '0', t2_id int(10) NOT NULL default '0', state int(11) default NULL, PRIMARY KEY (id), UNIQUE KEY t1_id (t1_id,t2_id), KEY t2_id (t2_id,t1_id), CONSTRAINT `t3_ibfk_1` FOREIGN KEY (`t1_id`) REFERENCES `t1` (`id`), CONSTRAINT `t3_ibfk_2` FOREIGN KEY (`t2_id`) REFERENCES `t2` (`id`));
|
||||
|
@ -95,9 +110,6 @@ insert into t3 VALUES ( NULL, 1, 1, 2 );
|
|||
commit;
|
||||
select t1.* from t1, t2, t3 where t3.state & 1 = 0 and t3.t1_id = t1.id and t3.t2_id = t2.id and t1.id = 1 order by t1.a asc;
|
||||
drop table t3,t2,t1;
|
||||
--disable_query_log
|
||||
eval set GLOBAL query_cache_size=$save_query_cache_size;
|
||||
--enable_query_log
|
||||
}
|
||||
|
||||
#
|
||||
|
@ -118,7 +130,7 @@ SET GLOBAL query_cache_size = 200000;
|
|||
flush status;
|
||||
SET @@autocommit=1;
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
CREATE TABLE t2 (s1 int, s2 varchar(1000), key(s1));
|
||||
eval CREATE TABLE t2 (s1 int, s2 varchar(1000), key(s1))$partitions_s1;
|
||||
INSERT INTO t2 VALUES (1,repeat('a',10)),(2,repeat('a',10)),(3,repeat('a',10)),(4,repeat('a',10));
|
||||
COMMIT;
|
||||
START TRANSACTION;
|
||||
|
@ -176,8 +188,8 @@ show status like "Qcache_queries_in_cache";
|
|||
show status like "Qcache_hits";
|
||||
|
||||
# Final cleanup
|
||||
eval set GLOBAL query_cache_size=$save_query_cache_size;
|
||||
disconnect connection1;
|
||||
--source include/wait_until_disconnected.inc
|
||||
connection default;
|
||||
set @@global.query_cache_size = @save_query_cache_size;
|
||||
drop table t2;
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
SET SESSION STORAGE_ENGINE = InnoDB;
|
||||
drop table if exists t1,t2,t3;
|
||||
set @save_query_cache_size = @@global.query_cache_size;
|
||||
set GLOBAL query_cache_size = 1355776;
|
||||
flush status;
|
||||
set autocommit=0;
|
||||
create table t1 (a int not null);
|
||||
|
@ -100,7 +102,7 @@ show status like "Qcache_queries_in_cache";
|
|||
Variable_name Value
|
||||
Qcache_queries_in_cache 2
|
||||
drop table t3,t2,t1;
|
||||
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id));
|
||||
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id));
|
||||
select count(*) from t1;
|
||||
count(*)
|
||||
0
|
||||
|
@ -109,7 +111,6 @@ select count(*) from t1;
|
|||
count(*)
|
||||
1
|
||||
drop table t1;
|
||||
set GLOBAL query_cache_size=1355776;
|
||||
CREATE TABLE t1 ( id int(10) NOT NULL auto_increment, a varchar(25) default NULL, PRIMARY KEY (id), UNIQUE KEY a (a));
|
||||
CREATE TABLE t2 ( id int(10) NOT NULL auto_increment, b varchar(25) default NULL, PRIMARY KEY (id), UNIQUE KEY b (b));
|
||||
CREATE TABLE t3 ( id int(10) NOT NULL auto_increment, t1_id int(10) NOT NULL default '0', t2_id int(10) NOT NULL default '0', state int(11) default NULL, PRIMARY KEY (id), UNIQUE KEY t1_id (t1_id,t2_id), KEY t2_id (t2_id,t1_id), CONSTRAINT `t3_ibfk_1` FOREIGN KEY (`t1_id`) REFERENCES `t1` (`id`), CONSTRAINT `t3_ibfk_2` FOREIGN KEY (`t2_id`) REFERENCES `t2` (`id`));
|
||||
|
@ -218,5 +219,5 @@ Qcache_queries_in_cache 1
|
|||
show status like "Qcache_hits";
|
||||
Variable_name Value
|
||||
Qcache_hits 1
|
||||
set GLOBAL query_cache_size=1048576;
|
||||
set @@global.query_cache_size = @save_query_cache_size;
|
||||
drop table t2;
|
||||
|
|
|
@ -468,4 +468,13 @@ NULL
|
|||
Warnings:
|
||||
Warning 1301 Result of cast_as_char() was larger than max_allowed_packet (2048) - truncated
|
||||
SET @@GLOBAL.max_allowed_packet=default;
|
||||
#
|
||||
# Bug#13519724 63793: CRASH IN DTCOLLATION::SET(DTCOLLATION &SET)
|
||||
#
|
||||
CREATE TABLE t1 (a VARCHAR(50));
|
||||
SELECT a FROM t1
|
||||
WHERE CAST(a as BINARY)=x'62736D697468'
|
||||
AND CAST(a AS BINARY)=x'65736D697468';
|
||||
a
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
|
|
|
@ -55,3 +55,17 @@ Error 1054 Unknown column 'b' in 'field list'
|
|||
INSERT INTO t1 SELECT b FROM t1;
|
||||
ERROR 42S22: Unknown column 'b' in 'field list'
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TABLE t2(a INT PRIMARY KEY, b INT);
|
||||
SELECT '' AS b FROM t1 GROUP BY VALUES(b);
|
||||
ERROR 42S22: Unknown column '' in 'VALUES() function'
|
||||
REPLACE t2(b) SELECT '' AS b FROM t1 GROUP BY VALUES(b);
|
||||
ERROR 42S22: Unknown column '' in 'VALUES() function'
|
||||
UPDATE t2 SET a=(SELECT '' AS b FROM t1 GROUP BY VALUES(b));
|
||||
ERROR 42S22: Unknown column '' in 'VALUES() function'
|
||||
INSERT INTO t2 VALUES (1,0) ON DUPLICATE KEY UPDATE
|
||||
b=(SELECT '' AS b FROM t1 GROUP BY VALUES(b));
|
||||
ERROR 42S22: Unknown column '' in 'VALUES() function'
|
||||
INSERT INTO t2(a,b) VALUES (1,0) ON DUPLICATE KEY UPDATE
|
||||
b=(SELECT VALUES(a)+2 FROM t1);
|
||||
DROP TABLE t1, t2;
|
||||
|
|
|
@ -776,4 +776,14 @@ SELECT 1 IN (YEAR(FROM_UNIXTIME(NULL)) ,1);
|
|||
1 IN (YEAR(FROM_UNIXTIME(NULL)) ,1)
|
||||
1
|
||||
#
|
||||
#
|
||||
# Bug#13012483: EXPLAIN EXTENDED, PREPARED STATEMENT, CRASH IN CHECK_SIMPLE_EQUALITY
|
||||
#
|
||||
CREATE TABLE t1 (a INT);
|
||||
PREPARE s FROM "SELECT 1 FROM t1 WHERE 1 < ALL (SELECT @:= (1 IN (SELECT 1 FROM t1)) FROM t1)";
|
||||
EXECUTE s;
|
||||
1
|
||||
DROP TABLE t1;
|
||||
# End of test BUG#13012483
|
||||
#
|
||||
End of 5.1 tests
|
||||
|
|
|
@ -1075,4 +1075,16 @@ SPATIAL INDEX i1 (col1, col2)
|
|||
);
|
||||
ERROR HY000: Incorrect arguments to SPATIAL INDEX
|
||||
DROP TABLE t0, t1, t2;
|
||||
#
|
||||
# BUG#12414917 - ISCLOSED() CRASHES ON 64-BIT BUILDS
|
||||
#
|
||||
SELECT ISCLOSED(CONVERT(CONCAT(' ', 0x2), BINARY(20)));
|
||||
ISCLOSED(CONVERT(CONCAT(' ', 0x2), BINARY(20)))
|
||||
NULL
|
||||
#
|
||||
# BUG#12537203 - CRASH WHEN SUBSELECTING GLOBAL VARIABLES IN
|
||||
# GEOMETRY FUNCTION ARGUMENTS
|
||||
#
|
||||
SELECT GEOMETRYCOLLECTION((SELECT @@OLD));
|
||||
ERROR 22007: Illegal non geometric '' value found during parsing
|
||||
End of 5.1 tests
|
||||
|
|
|
@ -239,3 +239,13 @@ mtr
|
|||
mysql
|
||||
test
|
||||
DROP DATABASE bug58090;
|
||||
#
|
||||
# Bug #11766072 - 59107: MYSQLSLAP CRASHES IF STARTED WITH NO ARGUMENTS ON WINDOWS
|
||||
#
|
||||
Benchmark
|
||||
Average number of seconds to run all queries: TIME seconds
|
||||
Minimum number of seconds to run all queries: TIME seconds
|
||||
Maximum number of seconds to run all queries: TIME seconds
|
||||
Number of clients running queries: 1
|
||||
Average number of queries per client: 0
|
||||
|
||||
|
|
205
mysql-test/r/partition_cache.result
Normal file
205
mysql-test/r/partition_cache.result
Normal file
|
@ -0,0 +1,205 @@
|
|||
SET SESSION STORAGE_ENGINE = InnoDB;
|
||||
drop table if exists t1,t2,t3;
|
||||
set @save_query_cache_size = @@global.query_cache_size;
|
||||
set GLOBAL query_cache_size = 1355776;
|
||||
flush status;
|
||||
set autocommit=0;
|
||||
create table t1 (a int not null) PARTITION BY KEY (a) PARTITIONS 3;
|
||||
insert into t1 values (1),(2),(3);
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
drop table t1;
|
||||
commit;
|
||||
set autocommit=1;
|
||||
begin;
|
||||
create table t1 (a int not null) PARTITION BY KEY (a) PARTITIONS 3;
|
||||
insert into t1 values (1),(2),(3);
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
drop table t1;
|
||||
commit;
|
||||
create table t1 (a int not null) PARTITION BY KEY (a) PARTITIONS 3;
|
||||
create table t2 (a int not null) PARTITION BY KEY (a) PARTITIONS 3;
|
||||
create table t3 (a int not null) PARTITION BY KEY (a) PARTITIONS 3;
|
||||
insert into t1 values (1),(2);
|
||||
insert into t2 values (1),(2);
|
||||
insert into t3 values (1),(2);
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
select * from t2;
|
||||
a
|
||||
1
|
||||
2
|
||||
select * from t3;
|
||||
a
|
||||
1
|
||||
2
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
show status like "Qcache_hits";
|
||||
Variable_name Value
|
||||
Qcache_hits 0
|
||||
begin;
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
select * from t2;
|
||||
a
|
||||
1
|
||||
2
|
||||
select * from t3;
|
||||
a
|
||||
1
|
||||
2
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
show status like "Qcache_hits";
|
||||
Variable_name Value
|
||||
Qcache_hits 0
|
||||
insert into t1 values (3);
|
||||
insert into t2 values (3);
|
||||
insert into t1 values (4);
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
select * from t2;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
select * from t3;
|
||||
a
|
||||
1
|
||||
2
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
show status like "Qcache_hits";
|
||||
Variable_name Value
|
||||
Qcache_hits 0
|
||||
commit;
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
drop table t3,t2,t1;
|
||||
CREATE TABLE t1 (id int(11) NOT NULL auto_increment, PRIMARY KEY (id)) PARTITION BY HASH (id) PARTITIONS 3;
|
||||
select count(*) from t1;
|
||||
count(*)
|
||||
0
|
||||
insert into t1 (id) values (0);
|
||||
select count(*) from t1;
|
||||
count(*)
|
||||
1
|
||||
drop table t1;
|
||||
SET SESSION STORAGE_ENGINE = InnoDB;
|
||||
SET @@autocommit=1;
|
||||
connection default
|
||||
SHOW VARIABLES LIKE 'have_query_cache';
|
||||
Variable_name Value
|
||||
have_query_cache YES
|
||||
SET GLOBAL query_cache_size = 200000;
|
||||
flush status;
|
||||
SET @@autocommit=1;
|
||||
SET SESSION STORAGE_ENGINE = InnoDB;
|
||||
CREATE TABLE t2 (s1 int, s2 varchar(1000), key(s1)) PARTITION BY KEY (s1) PARTITIONS 3;
|
||||
INSERT INTO t2 VALUES (1,repeat('a',10)),(2,repeat('a',10)),(3,repeat('a',10)),(4,repeat('a',10));
|
||||
COMMIT;
|
||||
START TRANSACTION;
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
0
|
||||
UPDATE t2 SET s2 = 'w' WHERE s1 = 3;
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
1
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
connection connection1
|
||||
START TRANSACTION;
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
0
|
||||
INSERT INTO t2 VALUES (5,'w');
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
1
|
||||
COMMIT;
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
1
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
connection default
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
1
|
||||
COMMIT;
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
2
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
connection connection1
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
2
|
||||
START TRANSACTION;
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
2
|
||||
INSERT INTO t2 VALUES (6,'w');
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
3
|
||||
connection default
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
2
|
||||
START TRANSACTION;
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
2
|
||||
DELETE from t2 WHERE s1=3;
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
1
|
||||
COMMIT;
|
||||
connection connection1
|
||||
COMMIT;
|
||||
SELECT sql_cache count(*) FROM t2 WHERE s2 = 'w';
|
||||
count(*)
|
||||
2
|
||||
show status like "Qcache_queries_in_cache";
|
||||
Variable_name Value
|
||||
Qcache_queries_in_cache 0
|
||||
show status like "Qcache_hits";
|
||||
Variable_name Value
|
||||
Qcache_hits 0
|
||||
set @@global.query_cache_size = @save_query_cache_size;
|
||||
drop table t2;
|
|
@ -109,6 +109,7 @@ DROP FUNCTION db1.f1;
|
|||
DROP TABLE db1.t1;
|
||||
DROP DATABASE db1;
|
||||
DROP DATABASE db2;
|
||||
USE test;
|
||||
#
|
||||
# Bug#13105873:valgrind warning:possible crash in foreign
|
||||
# key handling on subsequent create table if not exists
|
||||
|
@ -128,4 +129,94 @@ CALL p1();
|
|||
Warnings:
|
||||
Note 1050 Table 't2' already exists
|
||||
DROP DATABASE testdb;
|
||||
USE test;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE
|
||||
#
|
||||
SET @@SQL_MODE = '';
|
||||
CREATE FUNCTION testf_bug11763507() RETURNS INT
|
||||
BEGIN
|
||||
RETURN 0;
|
||||
END
|
||||
$
|
||||
CREATE PROCEDURE testp_bug11763507()
|
||||
BEGIN
|
||||
SELECT "PROCEDURE testp_bug11763507";
|
||||
END
|
||||
$
|
||||
SELECT testf_bug11763507();
|
||||
testf_bug11763507()
|
||||
0
|
||||
SELECT TESTF_bug11763507();
|
||||
TESTF_bug11763507()
|
||||
0
|
||||
SHOW FUNCTION STATUS LIKE 'testf_bug11763507';
|
||||
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
||||
test testf_bug11763507 FUNCTION root@localhost # # DEFINER latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW FUNCTION STATUS WHERE NAME='testf_bug11763507';
|
||||
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
||||
test testf_bug11763507 FUNCTION root@localhost # # DEFINER latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW FUNCTION STATUS LIKE 'TESTF_bug11763507';
|
||||
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
||||
test testf_bug11763507 FUNCTION root@localhost # # DEFINER latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW FUNCTION STATUS WHERE NAME='TESTF_bug11763507';
|
||||
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
||||
test testf_bug11763507 FUNCTION root@localhost # # DEFINER latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW CREATE FUNCTION testf_bug11763507;
|
||||
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||
testf_bug11763507 CREATE DEFINER=`root`@`localhost` FUNCTION `testf_bug11763507`() RETURNS int(11)
|
||||
BEGIN
|
||||
RETURN 0;
|
||||
END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW CREATE FUNCTION TESTF_bug11763507;
|
||||
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||
testf_bug11763507 CREATE DEFINER=`root`@`localhost` FUNCTION `testf_bug11763507`() RETURNS int(11)
|
||||
BEGIN
|
||||
RETURN 0;
|
||||
END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
CALL testp_bug11763507();
|
||||
PROCEDURE testp_bug11763507
|
||||
PROCEDURE testp_bug11763507
|
||||
CALL TESTP_bug11763507();
|
||||
PROCEDURE testp_bug11763507
|
||||
PROCEDURE testp_bug11763507
|
||||
SHOW PROCEDURE STATUS LIKE 'testp_bug11763507';
|
||||
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
||||
test testp_bug11763507 PROCEDURE root@localhost # # DEFINER latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW PROCEDURE STATUS WHERE NAME='testp_bug11763507';
|
||||
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
||||
test testp_bug11763507 PROCEDURE root@localhost # # DEFINER latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW PROCEDURE STATUS LIKE 'TESTP_bug11763507';
|
||||
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
||||
test testp_bug11763507 PROCEDURE root@localhost # # DEFINER latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW PROCEDURE STATUS WHERE NAME='TESTP_bug11763507';
|
||||
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
||||
test testp_bug11763507 PROCEDURE root@localhost # # DEFINER latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW CREATE PROCEDURE testp_bug11763507;
|
||||
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
|
||||
testp_bug11763507 CREATE DEFINER=`root`@`localhost` PROCEDURE `testp_bug11763507`()
|
||||
BEGIN
|
||||
SELECT "PROCEDURE testp_bug11763507";
|
||||
END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW CREATE PROCEDURE TESTP_bug11763507;
|
||||
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
|
||||
testp_bug11763507 CREATE DEFINER=`root`@`localhost` PROCEDURE `testp_bug11763507`()
|
||||
BEGIN
|
||||
SELECT "PROCEDURE testp_bug11763507";
|
||||
END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name LIKE 'testf_bug11763507';
|
||||
specific_name
|
||||
testf_bug11763507
|
||||
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name LIKE 'TESTF_bug11763507';
|
||||
specific_name
|
||||
testf_bug11763507
|
||||
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name='testf_bug11763507';
|
||||
specific_name
|
||||
testf_bug11763507
|
||||
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name='TESTF_bug11763507';
|
||||
specific_name
|
||||
testf_bug11763507
|
||||
DROP PROCEDURE testp_bug11763507;
|
||||
DROP FUNCTION testf_bug11763507;
|
||||
#END OF BUG#11763507 test.
|
||||
|
|
|
@ -888,3 +888,32 @@ Pos Instruction
|
|||
4 jump 6
|
||||
5 error 1339
|
||||
DROP PROCEDURE p1;
|
||||
#
|
||||
# Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE
|
||||
#
|
||||
SET @@SQL_MODE = '';
|
||||
CREATE FUNCTION testf_bug11763507() RETURNS INT
|
||||
BEGIN
|
||||
RETURN 0;
|
||||
END
|
||||
$
|
||||
CREATE PROCEDURE testp_bug11763507()
|
||||
BEGIN
|
||||
SELECT "PROCEDURE testp_bug11763507";
|
||||
END
|
||||
$
|
||||
SHOW FUNCTION CODE testf_bug11763507;
|
||||
Pos Instruction
|
||||
0 freturn 3 0
|
||||
SHOW FUNCTION CODE TESTF_bug11763507;
|
||||
Pos Instruction
|
||||
0 freturn 3 0
|
||||
SHOW PROCEDURE CODE testp_bug11763507;
|
||||
Pos Instruction
|
||||
0 stmt 0 "SELECT "PROCEDURE testp_bug11763507""
|
||||
SHOW PROCEDURE CODE TESTP_bug11763507;
|
||||
Pos Instruction
|
||||
0 stmt 0 "SELECT "PROCEDURE testp_bug11763507""
|
||||
DROP PROCEDURE testp_bug11763507;
|
||||
DROP FUNCTION testf_bug11763507;
|
||||
#END OF BUG#11763507 test.
|
||||
|
|
|
@ -227,6 +227,26 @@ ERROR 70100: Query execution was interrupted
|
|||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
DROP FUNCTION f1;
|
||||
#
|
||||
# Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE
|
||||
#
|
||||
SET @@SQL_MODE = '';
|
||||
CREATE EVENT teste_bug11763507 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
|
||||
DO SELECT 1 $
|
||||
SHOW EVENTS LIKE 'teste_bug11763507';
|
||||
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
|
||||
test teste_bug11763507 root@localhost SYSTEM ONE TIME # # # # NULL ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW EVENTS LIKE 'TESTE_bug11763507';
|
||||
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
|
||||
test teste_bug11763507 root@localhost SYSTEM ONE TIME # # # # NULL ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW CREATE EVENT teste_bug11763507;
|
||||
Event sql_mode time_zone Create Event character_set_client collation_connection Database Collation
|
||||
teste_bug11763507 SYSTEM # latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SHOW CREATE EVENT TESTE_bug11763507;
|
||||
Event sql_mode time_zone Create Event character_set_client collation_connection Database Collation
|
||||
teste_bug11763507 SYSTEM # latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
DROP EVENT teste_bug11763507;
|
||||
#END OF BUG#11763507 test.
|
||||
# ------------------------------------------------------------------
|
||||
# -- End of 5.1 tests
|
||||
# ------------------------------------------------------------------
|
||||
|
|
|
@ -527,3 +527,207 @@ SELECT * FROM mysql.columns_priv WHERE Host = 'localhost' AND User LIKE 'user_%P
|
|||
Host Db User Table_name Column_name Timestamp Column_priv
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
||||
#
|
||||
# Test for Bug#12601974 - STORED PROCEDURE SQL_MODE=NO_BACKSLASH_ESCAPES
|
||||
# IGNORED AND BREAKS REPLICATION
|
||||
#
|
||||
DROP TABLE IF EXISTS test_table;
|
||||
DROP FUNCTION IF EXISTS test_function;
|
||||
CREATE TABLE test_table (c1 CHAR(50));
|
||||
SET @org_mode=@@sql_mode;
|
||||
SET @@sql_mode='';
|
||||
PREPARE insert_stmt FROM 'INSERT INTO test_table VALUES (?)';
|
||||
PREPARE update_stmt FROM 'UPDATE test_table SET c1= ? WHERE c1= ?';
|
||||
CREATE FUNCTION test_function(var CHAR(50)) RETURNS CHAR(50)
|
||||
BEGIN
|
||||
DECLARE char_val CHAR(50);
|
||||
SELECT c1 INTO char_val FROM test_table WHERE c1=var;
|
||||
RETURN char_val;
|
||||
END
|
||||
$
|
||||
SET @var1='abcd\'ef';
|
||||
SET @var2='abcd\"ef';
|
||||
SET @var3='abcd\bef';
|
||||
SET @var4='abcd\nef';
|
||||
SET @var5='abcd\ref';
|
||||
SET @var6='abcd\tef';
|
||||
SET @var7='abcd\\ef';
|
||||
SET @var8='abcd\%ef';
|
||||
SET @var9='abcd\_ef';
|
||||
SET @to_var1='wxyz\'ef';
|
||||
SET @to_var2='wxyz\"ef';
|
||||
SET @to_var3='wxyz\bef';
|
||||
SET @to_var4='wxyz\nef';
|
||||
SET @to_var5='wxyz\ref';
|
||||
SET @to_var6='wxyz\tef';
|
||||
SET @to_var7='wxyz\\ef';
|
||||
SET @to_var8='wxyz\%ef';
|
||||
SET @to_var9='wxyz\_ef';
|
||||
# STRING LILTERAL WITH BACKSLASH IN PREPARE STATEMENT
|
||||
EXECUTE insert_stmt USING @var1;
|
||||
EXECUTE insert_stmt USING @var2;
|
||||
EXECUTE insert_stmt USING @var3;
|
||||
EXECUTE insert_stmt USING @var4;
|
||||
EXECUTE insert_stmt USING @var5;
|
||||
EXECUTE insert_stmt USING @var6;
|
||||
EXECUTE insert_stmt USING @var7;
|
||||
EXECUTE insert_stmt USING @var8;
|
||||
EXECUTE insert_stmt USING @var9;
|
||||
SELECT * FROM test_table;
|
||||
c1
|
||||
abcd'ef
|
||||
abcd"ef
|
||||
abcdef
|
||||
abcd
|
||||
ef
|
||||
abcd
ef
|
||||
abcd ef
|
||||
abcd\ef
|
||||
abcd\%ef
|
||||
abcd\_ef
|
||||
EXECUTE update_stmt USING @to_var1, @var1;
|
||||
EXECUTE update_stmt USING @to_var2, @var2;
|
||||
EXECUTE update_stmt USING @to_var3, @var3;
|
||||
EXECUTE update_stmt USING @to_var4, @var4;
|
||||
EXECUTE update_stmt USING @to_var5, @var5;
|
||||
EXECUTE update_stmt USING @to_var6, @var6;
|
||||
EXECUTE update_stmt USING @to_var7, @var7;
|
||||
EXECUTE update_stmt USING @to_var8, @var8;
|
||||
EXECUTE update_stmt USING @to_var9, @var9;
|
||||
SELECT * FROM test_table;
|
||||
c1
|
||||
wxyz'ef
|
||||
wxyz"ef
|
||||
wxyzef
|
||||
wxyz
|
||||
ef
|
||||
wxyz
ef
|
||||
wxyz ef
|
||||
wxyz\ef
|
||||
wxyz\%ef
|
||||
wxyz\_ef
|
||||
|
||||
# END OF CASE - STRING LILTERAL WITH BACKSLASH IN PREPARE STATEMENT
|
||||
# STRING LILTERAL WITH BACKSLASH IN FUNCTION RETURNING STRING
|
||||
select test_function(@to_var1);
|
||||
test_function(@to_var1)
|
||||
wxyz'ef
|
||||
SELECT test_function(@to_var2);
|
||||
test_function(@to_var2)
|
||||
wxyz"ef
|
||||
SELECT test_function(@to_var3);
|
||||
test_function(@to_var3)
|
||||
wxyzef
|
||||
SELECT test_function(@to_var4);
|
||||
test_function(@to_var4)
|
||||
wxyz
|
||||
ef
|
||||
SELECT test_function(@to_var5);
|
||||
test_function(@to_var5)
|
||||
wxyz
ef
|
||||
SELECT test_function(@to_var6);
|
||||
test_function(@to_var6)
|
||||
wxyz ef
|
||||
SELECT test_function(@to_var7);
|
||||
test_function(@to_var7)
|
||||
wxyz\ef
|
||||
SELECT test_function(@to_var8);
|
||||
test_function(@to_var8)
|
||||
wxyz\%ef
|
||||
SELECT test_function(@to_var9);
|
||||
test_function(@to_var9)
|
||||
wxyz\_ef
|
||||
|
||||
# END OF CASE - STRING LILTERAL WITH BACKSLASH IN FUNCTION RETURNING STRING
|
||||
DELETE FROM test_table;
|
||||
DROP FUNCTION test_function;
|
||||
SET @@sql_mode='NO_BACKSLASH_ESCAPES';
|
||||
CREATE FUNCTION test_function(var CHAR(50)) RETURNS CHAR(50)
|
||||
BEGIN
|
||||
DECLARE char_val CHAR(50);
|
||||
SELECT c1 INTO char_val FROM test_table WHERE c1=var;
|
||||
RETURN char_val;
|
||||
END
|
||||
$
|
||||
# STRING LILTERAL WITH BACKSLASH IN PREPARE STATEMENT
|
||||
EXECUTE insert_stmt USING @var1;
|
||||
EXECUTE insert_stmt USING @var2;
|
||||
EXECUTE insert_stmt USING @var3;
|
||||
EXECUTE insert_stmt USING @var4;
|
||||
EXECUTE insert_stmt USING @var5;
|
||||
EXECUTE insert_stmt USING @var6;
|
||||
EXECUTE insert_stmt USING @var7;
|
||||
EXECUTE insert_stmt USING @var8;
|
||||
EXECUTE insert_stmt USING @var9;
|
||||
SELECT * FROM test_table;
|
||||
c1
|
||||
abcd'ef
|
||||
abcd"ef
|
||||
abcdef
|
||||
abcd
|
||||
ef
|
||||
abcd
ef
|
||||
abcd ef
|
||||
abcd\ef
|
||||
abcd\%ef
|
||||
abcd\_ef
|
||||
EXECUTE update_stmt USING @to_var1, @var1;
|
||||
EXECUTE update_stmt USING @to_var2, @var2;
|
||||
EXECUTE update_stmt USING @to_var3, @var3;
|
||||
EXECUTE update_stmt USING @to_var4, @var4;
|
||||
EXECUTE update_stmt USING @to_var5, @var5;
|
||||
EXECUTE update_stmt USING @to_var6, @var6;
|
||||
EXECUTE update_stmt USING @to_var7, @var7;
|
||||
EXECUTE update_stmt USING @to_var8, @var8;
|
||||
EXECUTE update_stmt USING @to_var9, @var9;
|
||||
SELECT * FROM test_table;
|
||||
c1
|
||||
wxyz'ef
|
||||
wxyz"ef
|
||||
wxyzef
|
||||
wxyz
|
||||
ef
|
||||
wxyz
ef
|
||||
wxyz ef
|
||||
wxyz\ef
|
||||
wxyz\%ef
|
||||
wxyz\_ef
|
||||
|
||||
# END OF CASE - STRING LILTERAL WITH BACKSLASH IN PREPARE STATEMENT
|
||||
# STRING LILTERAL WITH BACKSLASH IN FUNCTION RETURNING STRING
|
||||
select test_function(@to_var1);
|
||||
test_function(@to_var1)
|
||||
wxyz'ef
|
||||
SELECT test_function(@to_var2);
|
||||
test_function(@to_var2)
|
||||
wxyz"ef
|
||||
SELECT test_function(@to_var3);
|
||||
test_function(@to_var3)
|
||||
wxyzef
|
||||
SELECT test_function(@to_var4);
|
||||
test_function(@to_var4)
|
||||
wxyz
|
||||
ef
|
||||
SELECT test_function(@to_var5);
|
||||
test_function(@to_var5)
|
||||
wxyz
ef
|
||||
SELECT test_function(@to_var6);
|
||||
test_function(@to_var6)
|
||||
wxyz ef
|
||||
SELECT test_function(@to_var7);
|
||||
test_function(@to_var7)
|
||||
wxyz\ef
|
||||
SELECT test_function(@to_var8);
|
||||
test_function(@to_var8)
|
||||
wxyz\%ef
|
||||
SELECT test_function(@to_var9);
|
||||
test_function(@to_var9)
|
||||
wxyz\_ef
|
||||
|
||||
# END OF CASE - STRING LILTERAL WITH BACKSLASH IN FUNCTION RETURNING STRING
|
||||
DROP TABLE test_table;
|
||||
DROP FUNCTION test_function;
|
||||
SET @@sql_mode= @org_mode;
|
||||
|
||||
#End of Test for Bug#12601974
|
||||
|
|
|
@ -4461,6 +4461,55 @@ ERROR 21000: Subquery returns more than 1 row
|
|||
SET SESSION sql_mode=@old_sql_mode;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#12763207 - ASSERT IN SUBSELECT::SINGLE_VALUE_TRANSFORMER
|
||||
#
|
||||
CREATE TABLE t1(a1 int);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
CREATE TABLE t2(a1 int);
|
||||
INSERT INTO t2 VALUES (3);
|
||||
SELECT @@session.sql_mode INTO @old_sql_mode;
|
||||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||
SELECT 1 FROM t1 WHERE 1 < SOME (SELECT 2 FROM t2);
|
||||
1
|
||||
1
|
||||
1
|
||||
SELECT 1 FROM t1 WHERE 1 < SOME (SELECT 2.0 FROM t2);
|
||||
1
|
||||
1
|
||||
1
|
||||
SELECT 1 FROM t1 WHERE 1 < SOME (SELECT 'a' FROM t2);
|
||||
1
|
||||
SELECT 1 FROM t1 WHERE 1 < SOME (SELECT a1 FROM t2);
|
||||
1
|
||||
1
|
||||
1
|
||||
SET SESSION sql_mode=@old_sql_mode;
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# Bug#12763207 - ASSERT IN SUBSELECT::SINGLE_VALUE_TRANSFORMER
|
||||
#
|
||||
create table t2(i int);
|
||||
insert into t2 values(0);
|
||||
SELECT @@session.sql_mode INTO @old_sql_mode;
|
||||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||
CREATE VIEW v1 AS
|
||||
SELECT 'f' FROM t2 UNION SELECT 'x' FROM t2
|
||||
;
|
||||
CREATE TABLE t1 (
|
||||
pk int NOT NULL,
|
||||
col_varchar_key varchar(1) DEFAULT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_varchar_key (col_varchar_key)
|
||||
);
|
||||
SELECT t1.pk
|
||||
FROM t1
|
||||
WHERE t1.col_varchar_key < ALL ( SELECT * FROM v1 )
|
||||
;
|
||||
pk
|
||||
SET SESSION sql_mode=@old_sql_mode;
|
||||
drop table t2, t1;
|
||||
drop view v1;
|
||||
End of 5.0 tests.
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
INSERT INTO t1 VALUES (2,22),(1,11),(2,22);
|
||||
|
|
|
@ -245,3 +245,63 @@ x
|
|||
NULL
|
||||
drop procedure p1;
|
||||
drop tables t1,t2,t3;
|
||||
#
|
||||
# Bug #11766300 59387: FAILING ASSERTION: CURSOR->POS_STATE == 1997660512 (BTR_PCUR_IS_POSITIONE
|
||||
#
|
||||
CREATE TABLE t1 (a INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES (0);
|
||||
CREATE TABLE t2 (d BINARY(2), PRIMARY KEY (d(1)), UNIQUE KEY (d)) ENGINE=INNODB;
|
||||
SELECT 1 FROM t1 WHERE NOT EXISTS
|
||||
(SELECT 1 FROM t2 WHERE d = (SELECT d FROM t2 WHERE a >= 1) ORDER BY d);
|
||||
1
|
||||
1
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE NOT EXISTS
|
||||
(SELECT 1 FROM t2 WHERE d = (SELECT d FROM t2 WHERE a >= 1) ORDER BY d);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 1 Using where
|
||||
2 DEPENDENT SUBQUERY t2 eq_ref PRIMARY,d d 2 func 1 Using where
|
||||
3 DEPENDENT SUBQUERY t2 index NULL d 2 NULL 1 Using where; Using index
|
||||
DROP TABLE t2;
|
||||
CREATE TABLE t2 (b INT, c INT, UNIQUE KEY (b), UNIQUE KEY (b, c )) ENGINE=INNODB;
|
||||
INSERT INTO t2 VALUES (1, 1);
|
||||
SELECT 1 FROM t1
|
||||
WHERE a != (SELECT 1 FROM t2 WHERE a <=> b OR a > '' AND 6 = 7 ORDER BY b, c);
|
||||
1
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# Bug #13639204 64111: CRASH ON SELECT SUBQUERY WITH NON UNIQUE
|
||||
# INDEX
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
id int
|
||||
) ENGINE=InnoDB;
|
||||
INSERT INTO t1 (id) VALUES (11);
|
||||
CREATE TABLE t2 (
|
||||
t1_id int,
|
||||
position int,
|
||||
KEY t1_id (t1_id),
|
||||
KEY t1_id_position (t1_id,position)
|
||||
) ENGINE=InnoDB;
|
||||
EXPLAIN SELECT
|
||||
(SELECT position FROM t2
|
||||
WHERE t2.t1_id = t1.id
|
||||
ORDER BY t2.t1_id , t2.position
|
||||
LIMIT 10,1
|
||||
) AS maxkey
|
||||
FROM t1
|
||||
LIMIT 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 1
|
||||
2 DEPENDENT SUBQUERY t2 ref t1_id,t1_id_position t1_id_position 5 test.t1.id 1 Using where
|
||||
SELECT
|
||||
(SELECT position FROM t2
|
||||
WHERE t2.t1_id = t1.id
|
||||
ORDER BY t2.t1_id , t2.position
|
||||
LIMIT 10,1
|
||||
) AS maxkey
|
||||
FROM t1
|
||||
LIMIT 1;
|
||||
maxkey
|
||||
NULL
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.1 tests
|
||||
|
|
|
@ -38,3 +38,114 @@ DROP VIEW testView;
|
|||
DROP TABLE t1;
|
||||
SET @@global.sql_mode= @old_sql_mode;
|
||||
SET @@session.binlog_format=@old_binlog_format;
|
||||
|
||||
#
|
||||
# Test for Bug#12601974 - STORED PROCEDURE SQL_MODE=NO_BACKSLASH_ESCAPES
|
||||
# IGNORED AND BREAKS REPLICATION
|
||||
#
|
||||
DROP DATABASE IF EXISTS mysqltest_db;
|
||||
DROP TABLE IF EXISTS test_table;
|
||||
CREATE DATABASE mysqltest_db;
|
||||
USE mysqltest_db;
|
||||
CREATE TABLE test_table (c1 CHAR(50));
|
||||
SET @org_mode=@@sql_mode;
|
||||
SET @@sql_mode='';
|
||||
CREATE PROCEDURE proc_without_sql_mode (IN param1 CHAR(50), IN param2 CHAR(50))
|
||||
BEGIN
|
||||
DECLARE var1 CHAR(50) DEFAULT param1;
|
||||
DECLARE var2 CHAR(50) DEFAULT param2;
|
||||
DECLARE var3 CHAR(50) DEFAULT 'abcd\bef';
|
||||
DECLARE var4 CHAR(50) DEFAULT 'abcd\nef';
|
||||
DECLARE var5 CHAR(50) DEFAULT 'abcd\ref';
|
||||
DECLARE var6 CHAR(50) DEFAULT 'abcd\tef';
|
||||
DECLARE var7 CHAR(50) DEFAULT 'abcd\\ef';
|
||||
DECLARE var8 CHAR(50) DEFAULT 'abcd\%ef';
|
||||
DECLARE var9 CHAR(50) DEFAULT 'abcd\_ef';
|
||||
INSERT INTO test_table VALUES (var1);
|
||||
INSERT INTO test_table VALUES (var2);
|
||||
INSERT INTO test_table VALUES (var3);
|
||||
INSERT INTO test_table VALUES (var4);
|
||||
INSERT INTO test_table VALUES (var5);
|
||||
INSERT INTO test_table VALUES (var6);
|
||||
INSERT INTO test_table VALUES (var7);
|
||||
INSERT INTO test_table VALUES (var8);
|
||||
INSERT INTO test_table VALUES (var9);
|
||||
END
|
||||
$
|
||||
SET @@sql_mode='NO_BACKSLASH_ESCAPES'$
|
||||
CREATE PROCEDURE proc_with_sql_mode (IN param1 CHAR(50), IN param2 CHAR(50))
|
||||
BEGIN
|
||||
DECLARE var1 CHAR(50) DEFAULT param1;
|
||||
DECLARE var2 CHAR(50) DEFAULT param2;
|
||||
DECLARE var3 CHAR(50) DEFAULT 'wxyz\bef';
|
||||
DECLARE var4 CHAR(50) DEFAULT 'wxyz\nef';
|
||||
DECLARE var5 CHAR(50) DEFAULT 'wxyz\ref';
|
||||
DECLARE var6 CHAR(50) DEFAULT 'wxyz\tef';
|
||||
DECLARE var7 CHAR(50) DEFAULT 'wxyz\\ef';
|
||||
DECLARE var8 CHAR(50) DEFAULT 'wxyz\%ef';
|
||||
DECLARE var9 CHAR(50) DEFAULT 'wxyz\_ef';
|
||||
INSERT INTO test_table VALUES (var1);
|
||||
INSERT INTO test_table VALUES (var2);
|
||||
INSERT INTO test_table VALUES (var3);
|
||||
INSERT INTO test_table VALUES (var4);
|
||||
INSERT INTO test_table VALUES (var5);
|
||||
INSERT INTO test_table VALUES (var6);
|
||||
INSERT INTO test_table VALUES (var7);
|
||||
INSERT INTO test_table VALUES (var8);
|
||||
INSERT INTO test_table VALUES (var9);
|
||||
END
|
||||
$
|
||||
SET @@sql_mode='';
|
||||
CALL proc_without_sql_mode('abcd\'ef', 'abcd\"ef');
|
||||
CALL proc_with_sql_mode('wxyz\'ef', 'wxyz\"ef');
|
||||
SELECT * FROM test_table;
|
||||
c1
|
||||
abcd'ef
|
||||
abcd"ef
|
||||
abcdef
|
||||
abcd
|
||||
ef
|
||||
abcd
ef
|
||||
abcd ef
|
||||
abcd\ef
|
||||
abcd\%ef
|
||||
abcd\_ef
|
||||
wxyz'ef
|
||||
wxyz"ef
|
||||
wxyz\bef
|
||||
wxyz\nef
|
||||
wxyz\ref
|
||||
wxyz\tef
|
||||
wxyz\\ef
|
||||
wxyz\%ef
|
||||
wxyz\_ef
|
||||
"Dropping table test_table"
|
||||
DROP TABLE test_table;
|
||||
#"test_table" content after replaying the binlog
|
||||
SELECT * FROM test_table;
|
||||
c1
|
||||
abcd'ef
|
||||
abcd"ef
|
||||
abcdef
|
||||
abcd
|
||||
ef
|
||||
abcd
ef
|
||||
abcd ef
|
||||
abcd\ef
|
||||
abcd\%ef
|
||||
abcd\_ef
|
||||
wxyz'ef
|
||||
wxyz"ef
|
||||
wxyz\bef
|
||||
wxyz\nef
|
||||
wxyz\ref
|
||||
wxyz\tef
|
||||
wxyz\\ef
|
||||
wxyz\%ef
|
||||
wxyz\_ef
|
||||
#Clean up
|
||||
DROP DATABASE mysqltest_db;
|
||||
SET @@sql_mode= @org_mode;
|
||||
use test;
|
||||
|
||||
#End of Test for Bug#12601974
|
||||
|
|
|
@ -73,3 +73,99 @@ DROP TABLE t1;
|
|||
|
||||
SET @@global.sql_mode= @old_sql_mode;
|
||||
SET @@session.binlog_format=@old_binlog_format;
|
||||
|
||||
--echo
|
||||
--echo #
|
||||
--echo # Test for Bug#12601974 - STORED PROCEDURE SQL_MODE=NO_BACKSLASH_ESCAPES
|
||||
--echo # IGNORED AND BREAKS REPLICATION
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP DATABASE IF EXISTS mysqltest_db;
|
||||
DROP TABLE IF EXISTS test_table;
|
||||
--enable_warnings
|
||||
|
||||
CREATE DATABASE mysqltest_db;
|
||||
USE mysqltest_db;
|
||||
CREATE TABLE test_table (c1 CHAR(50));
|
||||
|
||||
SET @org_mode=@@sql_mode;
|
||||
|
||||
SET @@sql_mode='';
|
||||
DELIMITER $;
|
||||
CREATE PROCEDURE proc_without_sql_mode (IN param1 CHAR(50), IN param2 CHAR(50))
|
||||
BEGIN
|
||||
DECLARE var1 CHAR(50) DEFAULT param1;
|
||||
DECLARE var2 CHAR(50) DEFAULT param2;
|
||||
DECLARE var3 CHAR(50) DEFAULT 'abcd\bef';
|
||||
DECLARE var4 CHAR(50) DEFAULT 'abcd\nef';
|
||||
DECLARE var5 CHAR(50) DEFAULT 'abcd\ref';
|
||||
DECLARE var6 CHAR(50) DEFAULT 'abcd\tef';
|
||||
DECLARE var7 CHAR(50) DEFAULT 'abcd\\ef';
|
||||
DECLARE var8 CHAR(50) DEFAULT 'abcd\%ef';
|
||||
DECLARE var9 CHAR(50) DEFAULT 'abcd\_ef';
|
||||
|
||||
INSERT INTO test_table VALUES (var1);
|
||||
INSERT INTO test_table VALUES (var2);
|
||||
INSERT INTO test_table VALUES (var3);
|
||||
INSERT INTO test_table VALUES (var4);
|
||||
INSERT INTO test_table VALUES (var5);
|
||||
INSERT INTO test_table VALUES (var6);
|
||||
INSERT INTO test_table VALUES (var7);
|
||||
INSERT INTO test_table VALUES (var8);
|
||||
INSERT INTO test_table VALUES (var9);
|
||||
END
|
||||
$
|
||||
|
||||
SET @@sql_mode='NO_BACKSLASH_ESCAPES'$
|
||||
CREATE PROCEDURE proc_with_sql_mode (IN param1 CHAR(50), IN param2 CHAR(50))
|
||||
BEGIN
|
||||
DECLARE var1 CHAR(50) DEFAULT param1;
|
||||
DECLARE var2 CHAR(50) DEFAULT param2;
|
||||
DECLARE var3 CHAR(50) DEFAULT 'wxyz\bef';
|
||||
DECLARE var4 CHAR(50) DEFAULT 'wxyz\nef';
|
||||
DECLARE var5 CHAR(50) DEFAULT 'wxyz\ref';
|
||||
DECLARE var6 CHAR(50) DEFAULT 'wxyz\tef';
|
||||
DECLARE var7 CHAR(50) DEFAULT 'wxyz\\ef';
|
||||
DECLARE var8 CHAR(50) DEFAULT 'wxyz\%ef';
|
||||
DECLARE var9 CHAR(50) DEFAULT 'wxyz\_ef';
|
||||
|
||||
INSERT INTO test_table VALUES (var1);
|
||||
INSERT INTO test_table VALUES (var2);
|
||||
INSERT INTO test_table VALUES (var3);
|
||||
INSERT INTO test_table VALUES (var4);
|
||||
INSERT INTO test_table VALUES (var5);
|
||||
INSERT INTO test_table VALUES (var6);
|
||||
INSERT INTO test_table VALUES (var7);
|
||||
INSERT INTO test_table VALUES (var8);
|
||||
INSERT INTO test_table VALUES (var9);
|
||||
END
|
||||
$
|
||||
|
||||
DELIMITER ;$
|
||||
SET @@sql_mode='';
|
||||
CALL proc_without_sql_mode('abcd\'ef', 'abcd\"ef');
|
||||
CALL proc_with_sql_mode('wxyz\'ef', 'wxyz\"ef');
|
||||
SELECT * FROM test_table;
|
||||
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
--exec $MYSQL_BINLOG --force-if-open -d mysqltest_db $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug12601974.binlog
|
||||
|
||||
--echo "Dropping table test_table"
|
||||
DROP TABLE test_table;
|
||||
|
||||
--exec $MYSQL -e "source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug12601974.binlog"
|
||||
|
||||
--echo #"test_table" content after replaying the binlog
|
||||
SELECT * FROM test_table;
|
||||
|
||||
--echo #Clean up
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_bug12601974.binlog
|
||||
DROP DATABASE mysqltest_db;
|
||||
SET @@sql_mode= @org_mode;
|
||||
use test;
|
||||
|
||||
--echo
|
||||
--echo #End of Test for Bug#12601974
|
||||
|
||||
|
||||
|
|
6
mysql-test/suite/innodb/r/innodb_bug11766634.result
Normal file
6
mysql-test/suite/innodb/r/innodb_bug11766634.result
Normal file
|
@ -0,0 +1,6 @@
|
|||
create table t1 (f1 char(255)) engine innodb;
|
||||
ibdata1 size: 27262976 bytes
|
||||
drop table t1;
|
||||
create table t1 (f1 char(255)) engine innodb;
|
||||
ibdata1 size: 27262976 bytes
|
||||
drop table t1;
|
45
mysql-test/suite/innodb/r/innodb_bug13635833.result
Normal file
45
mysql-test/suite/innodb/r/innodb_bug13635833.result
Normal file
|
@ -0,0 +1,45 @@
|
|||
SET DEBUG_SYNC='reset';
|
||||
create table t1 (f1 integer, key k1 (f1)) engine=innodb;
|
||||
create table t2 (f1 int, f2 int, key(f1), key(f2)) engine=innodb;
|
||||
create table t3 (f2 int, key(f2)) engine=innodb;
|
||||
insert into t1 values (10);
|
||||
insert into t2 values (10, 20);
|
||||
insert into t3 values (20);
|
||||
alter table t2 add constraint c1 foreign key (f1)
|
||||
references t1(f1) on update cascade;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f1` int(11) DEFAULT NULL,
|
||||
KEY `k1` (`f1`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`f1` int(11) DEFAULT NULL,
|
||||
`f2` int(11) DEFAULT NULL,
|
||||
KEY `f1` (`f1`),
|
||||
KEY `f2` (`f2`),
|
||||
CONSTRAINT `c1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
show create table t3;
|
||||
Table Create Table
|
||||
t3 CREATE TABLE `t3` (
|
||||
`f2` int(11) DEFAULT NULL,
|
||||
KEY `f2` (`f2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
SET DEBUG_SYNC='alter_table_before_rename_result_table
|
||||
SIGNAL update_can_proceed WAIT_FOR dict_unfreeze';
|
||||
alter table t2 add constraint z1 foreign key (f2)
|
||||
references t3(f2) on update cascade;
|
||||
SET DEBUG_SYNC='innodb_row_update_for_mysql_begin
|
||||
WAIT_FOR update_can_proceed';
|
||||
SET DEBUG_SYNC='innodb_dml_cascade_dict_unfreeze SIGNAL dict_unfreeze
|
||||
WAIT_FOR foreign_free_cache';
|
||||
update ignore t1 set f1 = 20;
|
||||
ERROR HY000: Error on rename of './test/t2' to '#sql2-temporary' (errno: 181)
|
||||
SET DEBUG_SYNC='now SIGNAL foreign_free_cache';
|
||||
drop table t2;
|
||||
drop table t1;
|
||||
drop table t3;
|
||||
SET DEBUG_SYNC='reset';
|
1
mysql-test/suite/innodb/t/innodb_bug11766634.opt
Normal file
1
mysql-test/suite/innodb/t/innodb_bug11766634.opt
Normal file
|
@ -0,0 +1 @@
|
|||
--force-restart
|
55
mysql-test/suite/innodb/t/innodb_bug11766634.test
Normal file
55
mysql-test/suite/innodb/t/innodb_bug11766634.test
Normal file
|
@ -0,0 +1,55 @@
|
|||
# Bug 11766634 59783: InnoDB data grows unexpectedly when inserting,
|
||||
# truncating, inserting the same set of rows.
|
||||
#
|
||||
# Scenario:
|
||||
# create table t1. Insert $recs records. check size of ibdata1.
|
||||
# drop table t1. create table t1. Insert the same set of $recs
|
||||
# records. The size of ibdata1 must not increase.
|
||||
#
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
-- source include/have_innodb.inc
|
||||
|
||||
create table t1 (f1 char(255)) engine innodb;
|
||||
let $MYSQLD_DATADIR=`select @@datadir`;
|
||||
let IBDATA1=$MYSQLD_DATADIR/ibdata1;
|
||||
|
||||
let $recs = 36262;
|
||||
|
||||
--disable_query_log
|
||||
let $c = $recs;
|
||||
start transaction;
|
||||
while ($c)
|
||||
{
|
||||
insert into t1 values ('Hello World');
|
||||
dec $c;
|
||||
}
|
||||
commit work;
|
||||
--enable_query_log
|
||||
|
||||
perl;
|
||||
my $filesize = -s $ENV{'IBDATA1'};
|
||||
print "ibdata1 size: $filesize bytes\n";
|
||||
EOF
|
||||
|
||||
drop table t1;
|
||||
create table t1 (f1 char(255)) engine innodb;
|
||||
|
||||
--disable_query_log
|
||||
let $c = $recs;
|
||||
start transaction;
|
||||
while ($c)
|
||||
{
|
||||
insert into t1 values ('Hello World');
|
||||
dec $c;
|
||||
}
|
||||
commit work;
|
||||
--enable_query_log
|
||||
|
||||
perl;
|
||||
my $filesize = -s $ENV{'IBDATA1'};
|
||||
print "ibdata1 size: $filesize bytes\n";
|
||||
EOF
|
||||
|
||||
drop table t1;
|
||||
|
64
mysql-test/suite/innodb/t/innodb_bug13635833.test
Normal file
64
mysql-test/suite/innodb/t/innodb_bug13635833.test
Normal file
|
@ -0,0 +1,64 @@
|
|||
--source include/have_innodb.inc
|
||||
--source include/have_debug_sync.inc
|
||||
--source include/not_embedded.inc
|
||||
|
||||
SET DEBUG_SYNC='reset';
|
||||
|
||||
# Save the initial number of concurrent sessions
|
||||
--source include/count_sessions.inc
|
||||
|
||||
create table t1 (f1 integer, key k1 (f1)) engine=innodb;
|
||||
create table t2 (f1 int, f2 int, key(f1), key(f2)) engine=innodb;
|
||||
create table t3 (f2 int, key(f2)) engine=innodb;
|
||||
|
||||
insert into t1 values (10);
|
||||
insert into t2 values (10, 20);
|
||||
insert into t3 values (20);
|
||||
|
||||
alter table t2 add constraint c1 foreign key (f1)
|
||||
references t1(f1) on update cascade;
|
||||
|
||||
show create table t1;
|
||||
show create table t2;
|
||||
show create table t3;
|
||||
|
||||
SET DEBUG_SYNC='alter_table_before_rename_result_table
|
||||
SIGNAL update_can_proceed WAIT_FOR dict_unfreeze';
|
||||
|
||||
--send
|
||||
alter table t2 add constraint z1 foreign key (f2)
|
||||
references t3(f2) on update cascade;
|
||||
|
||||
connect (thr2,localhost,root,,);
|
||||
connection thr2;
|
||||
|
||||
SET DEBUG_SYNC='innodb_row_update_for_mysql_begin
|
||||
WAIT_FOR update_can_proceed';
|
||||
SET DEBUG_SYNC='innodb_dml_cascade_dict_unfreeze SIGNAL dict_unfreeze
|
||||
WAIT_FOR foreign_free_cache';
|
||||
|
||||
--send
|
||||
update ignore t1 set f1 = 20;
|
||||
|
||||
connection default;
|
||||
--replace_regex /'[^']*test\/#sql2-[0-9a-f-]*'/'#sql2-temporary'/
|
||||
--error ER_ERROR_ON_RENAME
|
||||
reap;
|
||||
|
||||
SET DEBUG_SYNC='now SIGNAL foreign_free_cache';
|
||||
|
||||
connection thr2;
|
||||
reap;
|
||||
disconnect thr2;
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
connection default;
|
||||
|
||||
drop table t2;
|
||||
drop table t1;
|
||||
drop table t3;
|
||||
|
||||
# Wait till we reached the initial number of concurrent sessions
|
||||
--source include/wait_until_count_sessions.inc
|
||||
|
||||
SET DEBUG_SYNC='reset';
|
|
@ -0,0 +1,6 @@
|
|||
create table t1 (f1 char(255)) engine innodb;
|
||||
ibdata1 size: 27262976 bytes
|
||||
drop table t1;
|
||||
create table t1 (f1 char(255)) engine innodb;
|
||||
ibdata1 size: 27262976 bytes
|
||||
drop table t1;
|
45
mysql-test/suite/innodb_plugin/r/innodb_bug13635833.result
Normal file
45
mysql-test/suite/innodb_plugin/r/innodb_bug13635833.result
Normal file
|
@ -0,0 +1,45 @@
|
|||
SET DEBUG_SYNC='reset';
|
||||
create table t1 (f1 integer, key k1 (f1)) engine=innodb;
|
||||
create table t2 (f1 int, f2 int, key(f1), key(f2)) engine=innodb;
|
||||
create table t3 (f2 int, key(f2)) engine=innodb;
|
||||
insert into t1 values (10);
|
||||
insert into t2 values (10, 20);
|
||||
insert into t3 values (20);
|
||||
alter table t2 add constraint c1 foreign key (f1)
|
||||
references t1(f1) on update cascade;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f1` int(11) DEFAULT NULL,
|
||||
KEY `k1` (`f1`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
show create table t2;
|
||||
Table Create Table
|
||||
t2 CREATE TABLE `t2` (
|
||||
`f1` int(11) DEFAULT NULL,
|
||||
`f2` int(11) DEFAULT NULL,
|
||||
KEY `f1` (`f1`),
|
||||
KEY `f2` (`f2`),
|
||||
CONSTRAINT `c1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) ON UPDATE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
show create table t3;
|
||||
Table Create Table
|
||||
t3 CREATE TABLE `t3` (
|
||||
`f2` int(11) DEFAULT NULL,
|
||||
KEY `f2` (`f2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
SET DEBUG_SYNC='alter_table_before_rename_result_table
|
||||
SIGNAL update_can_proceed WAIT_FOR dict_unfreeze';
|
||||
alter table t2 add constraint z1 foreign key (f2)
|
||||
references t3(f2) on update cascade;
|
||||
SET DEBUG_SYNC='innodb_row_update_for_mysql_begin
|
||||
WAIT_FOR update_can_proceed';
|
||||
SET DEBUG_SYNC='innodb_dml_cascade_dict_unfreeze SIGNAL dict_unfreeze
|
||||
WAIT_FOR foreign_free_cache';
|
||||
update ignore t1 set f1 = 20;
|
||||
ERROR HY000: Error on rename of './test/t2' to '#sql2-temporary' (errno: 181)
|
||||
SET DEBUG_SYNC='now SIGNAL foreign_free_cache';
|
||||
drop table t2;
|
||||
drop table t1;
|
||||
drop table t3;
|
||||
SET DEBUG_SYNC='reset';
|
1
mysql-test/suite/innodb_plugin/t/innodb_bug11766634.opt
Normal file
1
mysql-test/suite/innodb_plugin/t/innodb_bug11766634.opt
Normal file
|
@ -0,0 +1 @@
|
|||
--force-restart
|
55
mysql-test/suite/innodb_plugin/t/innodb_bug11766634.test
Normal file
55
mysql-test/suite/innodb_plugin/t/innodb_bug11766634.test
Normal file
|
@ -0,0 +1,55 @@
|
|||
# Bug 11766634 59783: InnoDB data grows unexpectedly when inserting,
|
||||
# truncating, inserting the same set of rows.
|
||||
#
|
||||
# Scenario:
|
||||
# create table t1. Insert $recs records. check size of ibdata1.
|
||||
# drop table t1. create table t1. Insert the same set of $recs
|
||||
# records. The size of ibdata1 must not increase.
|
||||
#
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
-- source include/have_innodb_plugin.inc
|
||||
|
||||
create table t1 (f1 char(255)) engine innodb;
|
||||
let $MYSQLD_DATADIR=`select @@datadir`;
|
||||
let IBDATA1=$MYSQLD_DATADIR/ibdata1;
|
||||
|
||||
let $recs = 36262;
|
||||
|
||||
--disable_query_log
|
||||
let $c = $recs;
|
||||
start transaction;
|
||||
while ($c)
|
||||
{
|
||||
insert into t1 values ('Hello World');
|
||||
dec $c;
|
||||
}
|
||||
commit work;
|
||||
--enable_query_log
|
||||
|
||||
perl;
|
||||
my $filesize = -s $ENV{'IBDATA1'};
|
||||
print "ibdata1 size: $filesize bytes\n";
|
||||
EOF
|
||||
|
||||
drop table t1;
|
||||
create table t1 (f1 char(255)) engine innodb;
|
||||
|
||||
--disable_query_log
|
||||
let $c = $recs;
|
||||
start transaction;
|
||||
while ($c)
|
||||
{
|
||||
insert into t1 values ('Hello World');
|
||||
dec $c;
|
||||
}
|
||||
commit work;
|
||||
--enable_query_log
|
||||
|
||||
perl;
|
||||
my $filesize = -s $ENV{'IBDATA1'};
|
||||
print "ibdata1 size: $filesize bytes\n";
|
||||
EOF
|
||||
|
||||
drop table t1;
|
||||
|
66
mysql-test/suite/innodb_plugin/t/innodb_bug13635833.test
Normal file
66
mysql-test/suite/innodb_plugin/t/innodb_bug13635833.test
Normal file
|
@ -0,0 +1,66 @@
|
|||
--source include/have_innodb_plugin.inc
|
||||
--source include/have_debug_sync.inc
|
||||
--source include/not_embedded.inc
|
||||
# InnoDB Plugin cannot use DEBUG_SYNC on Windows
|
||||
--source include/not_windows.inc
|
||||
|
||||
SET DEBUG_SYNC='reset';
|
||||
|
||||
# Save the initial number of concurrent sessions
|
||||
--source include/count_sessions.inc
|
||||
|
||||
create table t1 (f1 integer, key k1 (f1)) engine=innodb;
|
||||
create table t2 (f1 int, f2 int, key(f1), key(f2)) engine=innodb;
|
||||
create table t3 (f2 int, key(f2)) engine=innodb;
|
||||
|
||||
insert into t1 values (10);
|
||||
insert into t2 values (10, 20);
|
||||
insert into t3 values (20);
|
||||
|
||||
alter table t2 add constraint c1 foreign key (f1)
|
||||
references t1(f1) on update cascade;
|
||||
|
||||
show create table t1;
|
||||
show create table t2;
|
||||
show create table t3;
|
||||
|
||||
SET DEBUG_SYNC='alter_table_before_rename_result_table
|
||||
SIGNAL update_can_proceed WAIT_FOR dict_unfreeze';
|
||||
|
||||
--send
|
||||
alter table t2 add constraint z1 foreign key (f2)
|
||||
references t3(f2) on update cascade;
|
||||
|
||||
connect (thr2,localhost,root,,);
|
||||
connection thr2;
|
||||
|
||||
SET DEBUG_SYNC='innodb_row_update_for_mysql_begin
|
||||
WAIT_FOR update_can_proceed';
|
||||
SET DEBUG_SYNC='innodb_dml_cascade_dict_unfreeze SIGNAL dict_unfreeze
|
||||
WAIT_FOR foreign_free_cache';
|
||||
|
||||
--send
|
||||
update ignore t1 set f1 = 20;
|
||||
|
||||
connection default;
|
||||
--replace_regex /'[^']*test\/#sql2-[0-9a-f-]*'/'#sql2-temporary'/
|
||||
--error ER_ERROR_ON_RENAME
|
||||
reap;
|
||||
|
||||
SET DEBUG_SYNC='now SIGNAL foreign_free_cache';
|
||||
|
||||
connection thr2;
|
||||
reap;
|
||||
disconnect thr2;
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
connection default;
|
||||
|
||||
drop table t2;
|
||||
drop table t1;
|
||||
drop table t3;
|
||||
|
||||
# Wait till we reached the initial number of concurrent sessions
|
||||
--source include/wait_until_count_sessions.inc
|
||||
|
||||
SET DEBUG_SYNC='reset';
|
|
@ -8,6 +8,7 @@
|
|||
-- disable_query_log
|
||||
-- disable_result_log
|
||||
call mtr.add_suppression("InnoDB: Warning: a long semaphore wait:");
|
||||
call mtr.add_suppression("the age of the last checkpoint is");
|
||||
|
||||
# set packet size and reconnect
|
||||
let $max_packet=`select @@global.max_allowed_packet`;
|
||||
|
|
5
mysql-test/suite/rpl/r/rpl_stm_relay_ign_space.result
Normal file
5
mysql-test/suite/rpl/r/rpl_stm_relay_ign_space.result
Normal file
|
@ -0,0 +1,5 @@
|
|||
include/master-slave.inc
|
||||
[connection master]
|
||||
include/assert.inc [Assert that relay log space is close to the limit]
|
||||
include/diff_tables.inc [master:test.t1,slave:test.t1]
|
||||
include/rpl_end.inc
|
1
mysql-test/suite/rpl/t/rpl_stm_relay_ign_space-slave.opt
Normal file
1
mysql-test/suite/rpl/t/rpl_stm_relay_ign_space-slave.opt
Normal file
|
@ -0,0 +1 @@
|
|||
--relay-log-space-limit=8192 --relay-log-purge --max-relay-log-size=4096
|
101
mysql-test/suite/rpl/t/rpl_stm_relay_ign_space.test
Normal file
101
mysql-test/suite/rpl/t/rpl_stm_relay_ign_space.test
Normal file
|
@ -0,0 +1,101 @@
|
|||
#
|
||||
# BUG#12400313 / BUG#64503 test case
|
||||
#
|
||||
#
|
||||
# Description
|
||||
# -----------
|
||||
#
|
||||
# This test case starts the slave server with:
|
||||
# --relay-log-space-limit=8192 --relay-log-purge --max-relay-log-size=4096
|
||||
#
|
||||
# Then it issues some queries that will cause the slave to reach
|
||||
# relay-log-space-limit. We lock the table so that the SQL thread is
|
||||
# not able to purge the log and then we issue some more statements.
|
||||
#
|
||||
# The purpose is to show that the IO thread will honor the limits
|
||||
# while the SQL thread is not able to purge the relay logs, which did
|
||||
# not happen before this patch. In addition we assert that while
|
||||
# ignoring the limit (SQL thread needs to rotate before purging), the
|
||||
# IO thread does not do it in an uncontrolled manner.
|
||||
|
||||
--source include/have_binlog_format_statement.inc
|
||||
--source include/master-slave.inc
|
||||
--source include/have_innodb.inc
|
||||
|
||||
--disable_query_log
|
||||
CREATE TABLE t1 (c1 TEXT) engine=InnoDB;
|
||||
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
|
||||
--sync_slave_with_master
|
||||
|
||||
# wait for the SQL thread to sleep
|
||||
--let $show_statement= SHOW PROCESSLIST
|
||||
--let $field= State
|
||||
--let $condition= = 'Has read all relay log; waiting for the slave I/O thread to update it'
|
||||
--source include/wait_show_condition.inc
|
||||
|
||||
# now the io thread has set rli->ignore_space_limit
|
||||
# lets lock the table so that once the SQL thread awakes
|
||||
# it blocks there and does not set rli->ignore_space_limit
|
||||
# back to zero
|
||||
LOCK TABLE t1 WRITE;
|
||||
|
||||
# now issue more statements that will overflow the
|
||||
# rli->log_space_limit (in this case ~10K)
|
||||
--connection master
|
||||
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
INSERT INTO t1 VALUES ('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
|
||||
|
||||
--connection slave
|
||||
|
||||
# ASSERT that the IO thread waits for the SQL thread to release some
|
||||
# space before continuing
|
||||
--let $show_statement= SHOW PROCESSLIST
|
||||
--let $field= State
|
||||
--let $condition= LIKE 'Waiting for %'
|
||||
# before the patch (IO would have transfered everything)
|
||||
#--let $condition= = 'Waiting for master to send event'
|
||||
# after the patch (now it waits for space to be freed)
|
||||
#--let $condition= = 'Waiting for the slave SQL thread to free enough relay log space'
|
||||
--source include/wait_show_condition.inc
|
||||
|
||||
# without the patch we can uncomment the following two lines and
|
||||
# watch the IO thread synchronize with the master, thus writing
|
||||
# relay logs way over the space limit
|
||||
#--connection master
|
||||
#--source include/sync_slave_io_with_master.inc
|
||||
|
||||
## ASSERT that the IO thread has honored the limit+few bytes required to be able to purge
|
||||
--let $relay_log_space_while_sql_is_executing = query_get_value(SHOW SLAVE STATUS, Relay_Log_Space, 1)
|
||||
--let $relay_log_space_limit = query_get_value(SHOW VARIABLES LIKE "relay_log_space_limit", Value, 1)
|
||||
--let $assert_text= Assert that relay log space is close to the limit
|
||||
--let $assert_cond= $relay_log_space_while_sql_is_executing <= $relay_log_space_limit * 1.15
|
||||
--source include/assert.inc
|
||||
|
||||
# unlock the table and let SQL thread continue applying events
|
||||
UNLOCK TABLES;
|
||||
|
||||
--connection master
|
||||
--sync_slave_with_master
|
||||
--let $diff_tables=master:test.t1,slave:test.t1
|
||||
--source include/diff_tables.inc
|
||||
|
||||
--connection master
|
||||
DROP TABLE t1;
|
||||
--enable_query_log
|
||||
--sync_slave_with_master
|
||||
|
||||
--source include/rpl_end.inc
|
|
@ -1 +0,0 @@
|
|||
--set-variable=query_cache_size=1M
|
|
@ -297,4 +297,16 @@ connection default;
|
|||
disconnect newconn;
|
||||
SET @@GLOBAL.max_allowed_packet=default;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#13519724 63793: CRASH IN DTCOLLATION::SET(DTCOLLATION &SET)
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a VARCHAR(50));
|
||||
|
||||
SELECT a FROM t1
|
||||
WHERE CAST(a as BINARY)=x'62736D697468'
|
||||
AND CAST(a AS BINARY)=x'65736D697468';
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
|
|
@ -67,3 +67,21 @@ SHOW ERRORS;
|
|||
INSERT INTO t1 SELECT b FROM t1;
|
||||
DROP TABLE t1;
|
||||
# End of 5.0 tests
|
||||
|
||||
#
|
||||
# Bug #13031606 VALUES() IN A SELECT STATEMENT CRASHES SERVER
|
||||
#
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TABLE t2(a INT PRIMARY KEY, b INT);
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
SELECT '' AS b FROM t1 GROUP BY VALUES(b);
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
REPLACE t2(b) SELECT '' AS b FROM t1 GROUP BY VALUES(b);
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
UPDATE t2 SET a=(SELECT '' AS b FROM t1 GROUP BY VALUES(b));
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
INSERT INTO t2 VALUES (1,0) ON DUPLICATE KEY UPDATE
|
||||
b=(SELECT '' AS b FROM t1 GROUP BY VALUES(b));
|
||||
INSERT INTO t2(a,b) VALUES (1,0) ON DUPLICATE KEY UPDATE
|
||||
b=(SELECT VALUES(a)+2 FROM t1);
|
||||
DROP TABLE t1, t2;
|
||||
|
|
|
@ -562,4 +562,17 @@ SELECT 1 IN (YEAR(FROM_UNIXTIME(NULL)) ,1);
|
|||
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # Bug#13012483: EXPLAIN EXTENDED, PREPARED STATEMENT, CRASH IN CHECK_SIMPLE_EQUALITY
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
PREPARE s FROM "SELECT 1 FROM t1 WHERE 1 < ALL (SELECT @:= (1 IN (SELECT 1 FROM t1)) FROM t1)";
|
||||
EXECUTE s;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # End of test BUG#13012483
|
||||
|
||||
--echo #
|
||||
--echo End of 5.1 tests
|
||||
|
|
|
@ -812,4 +812,19 @@ CREATE TABLE t3 (
|
|||
# cleanup
|
||||
DROP TABLE t0, t1, t2;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # BUG#12414917 - ISCLOSED() CRASHES ON 64-BIT BUILDS
|
||||
--echo #
|
||||
SELECT ISCLOSED(CONVERT(CONCAT(' ', 0x2), BINARY(20)));
|
||||
|
||||
--echo #
|
||||
--echo # BUG#12537203 - CRASH WHEN SUBSELECTING GLOBAL VARIABLES IN
|
||||
--echo # GEOMETRY FUNCTION ARGUMENTS
|
||||
--echo #
|
||||
--replace_regex /non geometric .* value/non geometric '' value/
|
||||
--error ER_ILLEGAL_VALUE_FOR_TYPE
|
||||
SELECT GEOMETRYCOLLECTION((SELECT @@OLD));
|
||||
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
# Can't run test of external client with embedded server
|
||||
--source include/not_embedded.inc
|
||||
--source include/not_windows.inc
|
||||
|
||||
--exec $MYSQL_SLAP --silent --concurrency=5 --iterations=20 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql
|
||||
|
||||
|
@ -37,7 +36,7 @@
|
|||
|
||||
--exec $MYSQL_SLAP --only-print --delimiter=";" --query="select * from t1;select * from t2" --create="CREATE TABLE t1 (id int, name varchar(64)); create table t2(foo1 varchar(32), foo2 varchar(32)); INSERT INTO t1 VALUES (1, 'This is a test'); insert into t2 values ('test', 'test2')" --engine="heap,myisam" --post-query="SHOW TABLES" --pre-query="SHOW TABLES";
|
||||
|
||||
--exec $MYSQL_SLAP --only-print --delimiter=";" --query="select * from t1;select * from t2" --create="CREATE TABLE t1 (id int, name varchar(64)); create table t2(foo1 varchar(32), foo2 varchar(32)); INSERT INTO t1 VALUES (1, 'This is a test'); insert into t2 values ('test', 'test2')" --engine="heap,myisam" --post-query="SHOW TABLES" --pre-query="SHOW TABLES" --number-of-queries=6 --commit=1;
|
||||
--exec $MYSQL_SLAP --only-print --delimiter=";" --query="select * from t1;select * from t2" --create="CREATE TABLE t1 (id int, name varchar(64)); create table t2(foo1 varchar(32), foo2 varchar(32)); INSERT INTO t1 VALUES (1, 'This is a test'); insert into t2 values ('test', 'test2')" --engine="heap,myisam" --post-query="SHOW TABLES" --pre-query="SHOW TABLES" --number-of-queries=6 --commit=1
|
||||
|
||||
--exec $MYSQL_SLAP --silent --concurrency=5 --iterations=1 --number-int-cols=2 --number-char-cols=3 --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=write --detach=2
|
||||
|
||||
|
@ -68,3 +67,9 @@ SHOW DATABASES;
|
|||
SHOW DATABASES;
|
||||
DROP DATABASE bug58090;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #11766072 - 59107: MYSQLSLAP CRASHES IF STARTED WITH NO ARGUMENTS ON WINDOWS
|
||||
--echo #
|
||||
|
||||
--replace_regex /queries: [0-9]+.[0-9]+/queries: TIME/
|
||||
--exec $MYSQL_SLAP
|
||||
|
|
21
mysql-test/t/partition_cache.test
Normal file
21
mysql-test/t/partition_cache.test
Normal file
|
@ -0,0 +1,21 @@
|
|||
# t/cache_innodb.test
|
||||
#
|
||||
# Last update:
|
||||
# 2006-07-26 ML test refactored (MySQL 5.1)
|
||||
# main code t/innodb_cache.test --> include/query_cache.inc
|
||||
# new wrapper t/cache_innodb.test
|
||||
#
|
||||
|
||||
--source include/have_query_cache.inc
|
||||
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_partition.inc
|
||||
let $engine_type= InnoDB;
|
||||
# Using SELECT to get a space as first character.
|
||||
let $partitions_a= `SELECT ' PARTITION BY KEY (a) PARTITIONS 3'`;
|
||||
let $partitions_id= `SELECT ' PARTITION BY HASH (id) PARTITIONS 3'`;
|
||||
let $partitions_s1= `SELECT ' PARTITION BY KEY (s1) PARTITIONS 3'`;
|
||||
# partitioning does not support FOREIGN KEYs
|
||||
let $test_foreign_keys= 0;
|
||||
|
||||
--source include/query_cache.inc
|
|
@ -138,6 +138,7 @@ DROP FUNCTION db1.f1;
|
|||
DROP TABLE db1.t1;
|
||||
DROP DATABASE db1;
|
||||
DROP DATABASE db2;
|
||||
USE test;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#13105873:valgrind warning:possible crash in foreign
|
||||
|
@ -161,5 +162,69 @@ CALL p1();
|
|||
--echo # below stmt should not return valgrind warnings
|
||||
CALL p1();
|
||||
DROP DATABASE testdb;
|
||||
USE test;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE
|
||||
--echo #
|
||||
SET @@SQL_MODE = '';
|
||||
DELIMITER $;
|
||||
CREATE FUNCTION testf_bug11763507() RETURNS INT
|
||||
BEGIN
|
||||
RETURN 0;
|
||||
END
|
||||
$
|
||||
|
||||
CREATE PROCEDURE testp_bug11763507()
|
||||
BEGIN
|
||||
SELECT "PROCEDURE testp_bug11763507";
|
||||
END
|
||||
$
|
||||
|
||||
DELIMITER ;$
|
||||
|
||||
# STORED FUNCTIONS
|
||||
SELECT testf_bug11763507();
|
||||
SELECT TESTF_bug11763507();
|
||||
|
||||
--replace_column 5 # 6 #
|
||||
SHOW FUNCTION STATUS LIKE 'testf_bug11763507';
|
||||
--replace_column 5 # 6 #
|
||||
SHOW FUNCTION STATUS WHERE NAME='testf_bug11763507';
|
||||
--replace_column 5 # 6 #
|
||||
SHOW FUNCTION STATUS LIKE 'TESTF_bug11763507';
|
||||
--replace_column 5 # 6 #
|
||||
SHOW FUNCTION STATUS WHERE NAME='TESTF_bug11763507';
|
||||
|
||||
SHOW CREATE FUNCTION testf_bug11763507;
|
||||
SHOW CREATE FUNCTION TESTF_bug11763507;
|
||||
|
||||
# STORED PROCEDURE
|
||||
CALL testp_bug11763507();
|
||||
CALL TESTP_bug11763507();
|
||||
|
||||
--replace_column 5 # 6 #
|
||||
SHOW PROCEDURE STATUS LIKE 'testp_bug11763507';
|
||||
--replace_column 5 # 6 #
|
||||
SHOW PROCEDURE STATUS WHERE NAME='testp_bug11763507';
|
||||
--replace_column 5 # 6 #
|
||||
SHOW PROCEDURE STATUS LIKE 'TESTP_bug11763507';
|
||||
--replace_column 5 # 6 #
|
||||
SHOW PROCEDURE STATUS WHERE NAME='TESTP_bug11763507';
|
||||
|
||||
SHOW CREATE PROCEDURE testp_bug11763507;
|
||||
SHOW CREATE PROCEDURE TESTP_bug11763507;
|
||||
|
||||
# INFORMATION SCHEMA
|
||||
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name LIKE 'testf_bug11763507';
|
||||
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name LIKE 'TESTF_bug11763507';
|
||||
|
||||
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name='testf_bug11763507';
|
||||
SELECT specific_name FROM INFORMATION_SCHEMA.ROUTINES WHERE specific_name='TESTF_bug11763507';
|
||||
|
||||
DROP PROCEDURE testp_bug11763507;
|
||||
DROP FUNCTION testf_bug11763507;
|
||||
|
||||
--echo #END OF BUG#11763507 test.
|
||||
|
|
|
@ -649,3 +649,35 @@ END//
|
|||
DELIMITER ;//
|
||||
SHOW PROCEDURE CODE p1;
|
||||
DROP PROCEDURE p1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE
|
||||
--echo #
|
||||
SET @@SQL_MODE = '';
|
||||
DELIMITER $;
|
||||
CREATE FUNCTION testf_bug11763507() RETURNS INT
|
||||
BEGIN
|
||||
RETURN 0;
|
||||
END
|
||||
$
|
||||
|
||||
CREATE PROCEDURE testp_bug11763507()
|
||||
BEGIN
|
||||
SELECT "PROCEDURE testp_bug11763507";
|
||||
END
|
||||
$
|
||||
|
||||
DELIMITER ;$
|
||||
|
||||
# STORED FUNCTIONS
|
||||
SHOW FUNCTION CODE testf_bug11763507;
|
||||
SHOW FUNCTION CODE TESTF_bug11763507;
|
||||
|
||||
# STORED PROCEDURE
|
||||
SHOW PROCEDURE CODE testp_bug11763507;
|
||||
SHOW PROCEDURE CODE TESTP_bug11763507;
|
||||
|
||||
DROP PROCEDURE testp_bug11763507;
|
||||
DROP FUNCTION testf_bug11763507;
|
||||
|
||||
--echo #END OF BUG#11763507 test.
|
||||
|
|
|
@ -403,6 +403,29 @@ DROP FUNCTION f1;
|
|||
--disconnect con1
|
||||
--disconnect con2
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11763507 - 56224: FUNCTION NAME IS CASE-SENSITIVE
|
||||
--echo #
|
||||
SET @@SQL_MODE = '';
|
||||
DELIMITER $;
|
||||
|
||||
CREATE EVENT teste_bug11763507 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
|
||||
DO SELECT 1 $
|
||||
|
||||
DELIMITER ;$
|
||||
# EVENTS
|
||||
--replace_column 6 # 7 # 8 # 9 #
|
||||
SHOW EVENTS LIKE 'teste_bug11763507';
|
||||
--replace_column 6 # 7 # 8 # 9 #
|
||||
SHOW EVENTS LIKE 'TESTE_bug11763507';
|
||||
|
||||
--replace_column 4 #
|
||||
SHOW CREATE EVENT teste_bug11763507;
|
||||
--replace_column 4 #
|
||||
SHOW CREATE EVENT TESTE_bug11763507;
|
||||
|
||||
DROP EVENT teste_bug11763507;
|
||||
--echo #END OF BUG#11763507 test.
|
||||
|
||||
--echo # ------------------------------------------------------------------
|
||||
--echo # -- End of 5.1 tests
|
||||
|
|
|
@ -344,3 +344,157 @@ SELECT * FROM mysql.columns_priv WHERE Host = 'localhost' AND User LIKE 'user_%P
|
|||
# Cleanup
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
||||
|
||||
--echo
|
||||
--echo #
|
||||
--echo # Test for Bug#12601974 - STORED PROCEDURE SQL_MODE=NO_BACKSLASH_ESCAPES
|
||||
--echo # IGNORED AND BREAKS REPLICATION
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS test_table;
|
||||
DROP FUNCTION IF EXISTS test_function;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE test_table (c1 CHAR(50));
|
||||
|
||||
SET @org_mode=@@sql_mode;
|
||||
|
||||
SET @@sql_mode='';
|
||||
|
||||
PREPARE insert_stmt FROM 'INSERT INTO test_table VALUES (?)';
|
||||
PREPARE update_stmt FROM 'UPDATE test_table SET c1= ? WHERE c1= ?';
|
||||
DELIMITER $;
|
||||
CREATE FUNCTION test_function(var CHAR(50)) RETURNS CHAR(50)
|
||||
BEGIN
|
||||
DECLARE char_val CHAR(50);
|
||||
SELECT c1 INTO char_val FROM test_table WHERE c1=var;
|
||||
RETURN char_val;
|
||||
END
|
||||
$
|
||||
DELIMITER ;$
|
||||
|
||||
SET @var1='abcd\'ef';
|
||||
SET @var2='abcd\"ef';
|
||||
SET @var3='abcd\bef';
|
||||
SET @var4='abcd\nef';
|
||||
SET @var5='abcd\ref';
|
||||
SET @var6='abcd\tef';
|
||||
SET @var7='abcd\\ef';
|
||||
SET @var8='abcd\%ef';
|
||||
SET @var9='abcd\_ef';
|
||||
|
||||
SET @to_var1='wxyz\'ef';
|
||||
SET @to_var2='wxyz\"ef';
|
||||
SET @to_var3='wxyz\bef';
|
||||
SET @to_var4='wxyz\nef';
|
||||
SET @to_var5='wxyz\ref';
|
||||
SET @to_var6='wxyz\tef';
|
||||
SET @to_var7='wxyz\\ef';
|
||||
SET @to_var8='wxyz\%ef';
|
||||
SET @to_var9='wxyz\_ef';
|
||||
|
||||
--echo # STRING LILTERAL WITH BACKSLASH IN PREPARE STATEMENT
|
||||
EXECUTE insert_stmt USING @var1;
|
||||
EXECUTE insert_stmt USING @var2;
|
||||
EXECUTE insert_stmt USING @var3;
|
||||
EXECUTE insert_stmt USING @var4;
|
||||
EXECUTE insert_stmt USING @var5;
|
||||
EXECUTE insert_stmt USING @var6;
|
||||
EXECUTE insert_stmt USING @var7;
|
||||
EXECUTE insert_stmt USING @var8;
|
||||
EXECUTE insert_stmt USING @var9;
|
||||
|
||||
SELECT * FROM test_table;
|
||||
|
||||
EXECUTE update_stmt USING @to_var1, @var1;
|
||||
EXECUTE update_stmt USING @to_var2, @var2;
|
||||
EXECUTE update_stmt USING @to_var3, @var3;
|
||||
EXECUTE update_stmt USING @to_var4, @var4;
|
||||
EXECUTE update_stmt USING @to_var5, @var5;
|
||||
EXECUTE update_stmt USING @to_var6, @var6;
|
||||
EXECUTE update_stmt USING @to_var7, @var7;
|
||||
EXECUTE update_stmt USING @to_var8, @var8;
|
||||
EXECUTE update_stmt USING @to_var9, @var9;
|
||||
|
||||
SELECT * FROM test_table;
|
||||
|
||||
--echo
|
||||
--echo # END OF CASE - STRING LILTERAL WITH BACKSLASH IN PREPARE STATEMENT
|
||||
|
||||
--echo # STRING LILTERAL WITH BACKSLASH IN FUNCTION RETURNING STRING
|
||||
select test_function(@to_var1);
|
||||
SELECT test_function(@to_var2);
|
||||
SELECT test_function(@to_var3);
|
||||
SELECT test_function(@to_var4);
|
||||
SELECT test_function(@to_var5);
|
||||
SELECT test_function(@to_var6);
|
||||
SELECT test_function(@to_var7);
|
||||
SELECT test_function(@to_var8);
|
||||
SELECT test_function(@to_var9);
|
||||
|
||||
--echo
|
||||
--echo # END OF CASE - STRING LILTERAL WITH BACKSLASH IN FUNCTION RETURNING STRING
|
||||
DELETE FROM test_table;
|
||||
DROP FUNCTION test_function;
|
||||
|
||||
SET @@sql_mode='NO_BACKSLASH_ESCAPES';
|
||||
DELIMITER $;
|
||||
CREATE FUNCTION test_function(var CHAR(50)) RETURNS CHAR(50)
|
||||
BEGIN
|
||||
DECLARE char_val CHAR(50);
|
||||
SELECT c1 INTO char_val FROM test_table WHERE c1=var;
|
||||
RETURN char_val;
|
||||
END
|
||||
$
|
||||
DELIMITER ;$
|
||||
|
||||
--echo # STRING LILTERAL WITH BACKSLASH IN PREPARE STATEMENT
|
||||
EXECUTE insert_stmt USING @var1;
|
||||
EXECUTE insert_stmt USING @var2;
|
||||
EXECUTE insert_stmt USING @var3;
|
||||
EXECUTE insert_stmt USING @var4;
|
||||
EXECUTE insert_stmt USING @var5;
|
||||
EXECUTE insert_stmt USING @var6;
|
||||
EXECUTE insert_stmt USING @var7;
|
||||
EXECUTE insert_stmt USING @var8;
|
||||
EXECUTE insert_stmt USING @var9;
|
||||
|
||||
SELECT * FROM test_table;
|
||||
|
||||
EXECUTE update_stmt USING @to_var1, @var1;
|
||||
EXECUTE update_stmt USING @to_var2, @var2;
|
||||
EXECUTE update_stmt USING @to_var3, @var3;
|
||||
EXECUTE update_stmt USING @to_var4, @var4;
|
||||
EXECUTE update_stmt USING @to_var5, @var5;
|
||||
EXECUTE update_stmt USING @to_var6, @var6;
|
||||
EXECUTE update_stmt USING @to_var7, @var7;
|
||||
EXECUTE update_stmt USING @to_var8, @var8;
|
||||
EXECUTE update_stmt USING @to_var9, @var9;
|
||||
|
||||
SELECT * FROM test_table;
|
||||
|
||||
--echo
|
||||
--echo # END OF CASE - STRING LILTERAL WITH BACKSLASH IN PREPARE STATEMENT
|
||||
|
||||
--echo # STRING LILTERAL WITH BACKSLASH IN FUNCTION RETURNING STRING
|
||||
select test_function(@to_var1);
|
||||
SELECT test_function(@to_var2);
|
||||
SELECT test_function(@to_var3);
|
||||
SELECT test_function(@to_var4);
|
||||
SELECT test_function(@to_var5);
|
||||
SELECT test_function(@to_var6);
|
||||
SELECT test_function(@to_var7);
|
||||
SELECT test_function(@to_var8);
|
||||
SELECT test_function(@to_var9);
|
||||
|
||||
--echo
|
||||
--echo # END OF CASE - STRING LILTERAL WITH BACKSLASH IN FUNCTION RETURNING STRING
|
||||
|
||||
DROP TABLE test_table;
|
||||
DROP FUNCTION test_function;
|
||||
SET @@sql_mode= @org_mode;
|
||||
|
||||
--echo
|
||||
--echo #End of Test for Bug#12601974
|
||||
|
|
|
@ -3433,6 +3433,61 @@ SET SESSION sql_mode=@old_sql_mode;
|
|||
DEALLOCATE PREPARE stmt;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#12763207 - ASSERT IN SUBSELECT::SINGLE_VALUE_TRANSFORMER
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a1 int);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
|
||||
CREATE TABLE t2(a1 int);
|
||||
INSERT INTO t2 VALUES (3);
|
||||
|
||||
SELECT @@session.sql_mode INTO @old_sql_mode;
|
||||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||
|
||||
## All these are subject to the transformation
|
||||
## '1 < some (...)' => '1 < max(...)'
|
||||
SELECT 1 FROM t1 WHERE 1 < SOME (SELECT 2 FROM t2);
|
||||
SELECT 1 FROM t1 WHERE 1 < SOME (SELECT 2.0 FROM t2);
|
||||
SELECT 1 FROM t1 WHERE 1 < SOME (SELECT 'a' FROM t2);
|
||||
SELECT 1 FROM t1 WHERE 1 < SOME (SELECT a1 FROM t2);
|
||||
|
||||
SET SESSION sql_mode=@old_sql_mode;
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#12763207 - ASSERT IN SUBSELECT::SINGLE_VALUE_TRANSFORMER
|
||||
--echo #
|
||||
|
||||
create table t2(i int);
|
||||
insert into t2 values(0);
|
||||
|
||||
SELECT @@session.sql_mode INTO @old_sql_mode;
|
||||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||
|
||||
CREATE VIEW v1 AS
|
||||
SELECT 'f' FROM t2 UNION SELECT 'x' FROM t2
|
||||
;
|
||||
|
||||
CREATE TABLE t1 (
|
||||
pk int NOT NULL,
|
||||
col_varchar_key varchar(1) DEFAULT NULL,
|
||||
PRIMARY KEY (pk),
|
||||
KEY col_varchar_key (col_varchar_key)
|
||||
);
|
||||
|
||||
SELECT t1.pk
|
||||
FROM t1
|
||||
WHERE t1.col_varchar_key < ALL ( SELECT * FROM v1 )
|
||||
;
|
||||
|
||||
SET SESSION sql_mode=@old_sql_mode;
|
||||
|
||||
drop table t2, t1;
|
||||
drop view v1;
|
||||
|
||||
--echo End of 5.0 tests.
|
||||
|
||||
#
|
||||
|
|
|
@ -238,3 +238,59 @@ call p1();
|
|||
call p1();
|
||||
drop procedure p1;
|
||||
drop tables t1,t2,t3;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #11766300 59387: FAILING ASSERTION: CURSOR->POS_STATE == 1997660512 (BTR_PCUR_IS_POSITIONE
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES (0);
|
||||
CREATE TABLE t2 (d BINARY(2), PRIMARY KEY (d(1)), UNIQUE KEY (d)) ENGINE=INNODB;
|
||||
|
||||
SELECT 1 FROM t1 WHERE NOT EXISTS
|
||||
(SELECT 1 FROM t2 WHERE d = (SELECT d FROM t2 WHERE a >= 1) ORDER BY d);
|
||||
|
||||
EXPLAIN SELECT 1 FROM t1 WHERE NOT EXISTS
|
||||
(SELECT 1 FROM t2 WHERE d = (SELECT d FROM t2 WHERE a >= 1) ORDER BY d);
|
||||
|
||||
DROP TABLE t2;
|
||||
|
||||
CREATE TABLE t2 (b INT, c INT, UNIQUE KEY (b), UNIQUE KEY (b, c )) ENGINE=INNODB;
|
||||
INSERT INTO t2 VALUES (1, 1);
|
||||
|
||||
SELECT 1 FROM t1
|
||||
WHERE a != (SELECT 1 FROM t2 WHERE a <=> b OR a > '' AND 6 = 7 ORDER BY b, c);
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #13639204 64111: CRASH ON SELECT SUBQUERY WITH NON UNIQUE
|
||||
--echo # INDEX
|
||||
--echo #
|
||||
CREATE TABLE t1 (
|
||||
id int
|
||||
) ENGINE=InnoDB;
|
||||
INSERT INTO t1 (id) VALUES (11);
|
||||
|
||||
CREATE TABLE t2 (
|
||||
t1_id int,
|
||||
position int,
|
||||
KEY t1_id (t1_id),
|
||||
KEY t1_id_position (t1_id,position)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
let $query=SELECT
|
||||
(SELECT position FROM t2
|
||||
WHERE t2.t1_id = t1.id
|
||||
ORDER BY t2.t1_id , t2.position
|
||||
LIMIT 10,1
|
||||
) AS maxkey
|
||||
FROM t1
|
||||
LIMIT 1;
|
||||
|
||||
eval EXPLAIN $query;
|
||||
eval $query;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
|
|
@ -79,5 +79,8 @@ static const char *handler_error_messages[]=
|
|||
"File too short; Expected more data in file",
|
||||
"Read page with wrong checksum",
|
||||
"Too many active concurrent transactions",
|
||||
"Row is not visible by the current transaction"
|
||||
"",
|
||||
"",
|
||||
"Row is not visible by the current transaction",
|
||||
"Table is being used in foreign key check" /* HA_ERR_TABLE_IN_FK_CHECK */
|
||||
};
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (c) 2005, 2011, Oracle and/or its affiliates.
|
||||
Copyright (c) 2005, 2012, Oracle and/or its affiliates.
|
||||
|
||||
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
|
||||
|
@ -6566,20 +6566,20 @@ int ha_partition::add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys)
|
|||
return ret;
|
||||
err:
|
||||
if (file > m_file)
|
||||
{
|
||||
uint *key_numbers= (uint*) ha_thd()->alloc(sizeof(uint) * num_of_keys);
|
||||
KEY *old_key_info= table_arg->key_info;
|
||||
uint i;
|
||||
/* Use the newly added key_info as table->key_info to remove them. */
|
||||
for (i= 0; i < num_of_keys; i++)
|
||||
key_numbers[i]= i;
|
||||
table_arg->key_info= key_info;
|
||||
while (--file >= m_file)
|
||||
{
|
||||
(void) (*file)->prepare_drop_index(table_arg, key_numbers, num_of_keys);
|
||||
(void) (*file)->final_drop_index(table_arg);
|
||||
}
|
||||
table_arg->key_info= old_key_info;
|
||||
{
|
||||
uint *key_numbers= (uint*) ha_thd()->alloc(sizeof(uint) * num_of_keys);
|
||||
KEY *old_key_info= table_arg->key_info;
|
||||
uint i;
|
||||
/* Use the newly added key_info as table->key_info to remove them. */
|
||||
for (i= 0; i < num_of_keys; i++)
|
||||
key_numbers[i]= i;
|
||||
table_arg->key_info= key_info;
|
||||
while (--file >= m_file)
|
||||
{
|
||||
(void) (*file)->prepare_drop_index(table_arg, key_numbers, num_of_keys);
|
||||
(void) (*file)->final_drop_index(table_arg);
|
||||
}
|
||||
table_arg->key_info= old_key_info;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (c) 2005, 2011, Oracle and/or its affiliates.
|
||||
Copyright (c) 2005, 2012, Oracle and/or its affiliates.
|
||||
|
||||
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
|
||||
|
@ -221,9 +221,9 @@ public:
|
|||
*/
|
||||
ha_partition(handlerton *hton, TABLE_SHARE * table);
|
||||
ha_partition(handlerton *hton, partition_info * part_info);
|
||||
ha_partition(handlerton *hton, TABLE_SHARE *share,
|
||||
partition_info *part_info_arg,
|
||||
ha_partition *clone_arg,
|
||||
ha_partition(handlerton *hton, TABLE_SHARE *share,
|
||||
partition_info *part_info_arg,
|
||||
ha_partition *clone_arg,
|
||||
MEM_ROOT *clone_mem_root_arg);
|
||||
~ha_partition();
|
||||
/*
|
||||
|
@ -555,6 +555,20 @@ public:
|
|||
virtual int extra(enum ha_extra_function operation);
|
||||
virtual int extra_opt(enum ha_extra_function operation, ulong cachesize);
|
||||
virtual int reset(void);
|
||||
/*
|
||||
Do not allow caching of partitioned tables, since we cannot return
|
||||
a callback or engine_data that would work for a generic engine.
|
||||
*/
|
||||
virtual my_bool register_query_cache_table(THD *thd, char *table_key,
|
||||
uint key_length,
|
||||
qc_engine_callback
|
||||
*engine_callback,
|
||||
ulonglong *engine_data)
|
||||
{
|
||||
*engine_callback= NULL;
|
||||
*engine_data= 0;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
private:
|
||||
static const uint NO_CURRENT_PART_ID;
|
||||
|
|
|
@ -342,6 +342,7 @@ int ha_init_errors(void)
|
|||
SETMSG(HA_ERR_AUTOINC_READ_FAILED, ER(ER_AUTOINC_READ_FAILED));
|
||||
SETMSG(HA_ERR_AUTOINC_ERANGE, ER(ER_WARN_DATA_OUT_OF_RANGE));
|
||||
SETMSG(HA_ERR_TOO_MANY_CONCURRENT_TRXS, ER(ER_TOO_MANY_CONCURRENT_TRXS));
|
||||
SETMSG(HA_ERR_TABLE_IN_FK_CHECK, "Table being used in foreign key check");
|
||||
|
||||
/* Register the error messages for use with my_error(). */
|
||||
return my_error_register(errmsgs, HA_ERR_FIRST, HA_ERR_LAST);
|
||||
|
@ -2871,6 +2872,7 @@ void handler::print_error(int error, myf errflag)
|
|||
case HA_ERR_TOO_MANY_CONCURRENT_TRXS:
|
||||
textno= ER_TOO_MANY_CONCURRENT_TRXS;
|
||||
break;
|
||||
case HA_ERR_TABLE_IN_FK_CHECK:
|
||||
default:
|
||||
{
|
||||
/* The error was "unknown" to this function.
|
||||
|
|
23
sql/item.cc
23
sql/item.cc
|
@ -3098,7 +3098,7 @@ String *Item_param::val_str(String* str)
|
|||
that binary log contains wrong statement
|
||||
*/
|
||||
|
||||
const String *Item_param::query_val_str(String* str) const
|
||||
const String *Item_param::query_val_str(THD *thd, String* str) const
|
||||
{
|
||||
switch (state) {
|
||||
case INT_VALUE:
|
||||
|
@ -3136,7 +3136,8 @@ const String *Item_param::query_val_str(String* str) const
|
|||
case LONG_DATA_VALUE:
|
||||
{
|
||||
str->length(0);
|
||||
append_query_string(value.cs_info.character_set_client, &str_value, str);
|
||||
append_query_string(thd, value.cs_info.character_set_client, &str_value,
|
||||
str);
|
||||
break;
|
||||
}
|
||||
case NULL_VALUE:
|
||||
|
@ -3269,7 +3270,7 @@ void Item_param::print(String *str, enum_query_type query_type)
|
|||
char buffer[STRING_BUFFER_USUAL_SIZE];
|
||||
String tmp(buffer, sizeof(buffer), &my_charset_bin);
|
||||
const String *res;
|
||||
res= query_val_str(&tmp);
|
||||
res= query_val_str(current_thd, &tmp);
|
||||
str->append(*res);
|
||||
}
|
||||
}
|
||||
|
@ -6692,20 +6693,12 @@ bool Item_insert_value::fix_fields(THD *thd, Item **items)
|
|||
}
|
||||
|
||||
if (arg->type() == REF_ITEM)
|
||||
arg= static_cast<Item_ref *>(arg)->ref[0];
|
||||
if (arg->type() != FIELD_ITEM)
|
||||
{
|
||||
Item_ref *ref= (Item_ref *)arg;
|
||||
if (ref->ref[0]->type() != FIELD_ITEM)
|
||||
{
|
||||
my_error(ER_BAD_FIELD_ERROR, MYF(0), "", "VALUES() function");
|
||||
return TRUE;
|
||||
}
|
||||
arg= ref->ref[0];
|
||||
my_error(ER_BAD_FIELD_ERROR, MYF(0), "", "VALUES() function");
|
||||
return TRUE;
|
||||
}
|
||||
/*
|
||||
According to our SQL grammar, VALUES() function can reference
|
||||
only to a column.
|
||||
*/
|
||||
DBUG_ASSERT(arg->type() == FIELD_ITEM);
|
||||
|
||||
Item_field *field_arg= (Item_field *)arg;
|
||||
|
||||
|
|
|
@ -1760,7 +1760,7 @@ public:
|
|||
*/
|
||||
void (*set_param_func)(Item_param *param, uchar **pos, ulong len);
|
||||
|
||||
const String *query_val_str(String *str) const;
|
||||
const String *query_val_str(THD *thd, String *str) const;
|
||||
|
||||
bool convert_str_value(THD *thd);
|
||||
|
||||
|
|
|
@ -254,7 +254,7 @@ public:
|
|||
Item_in_optimizer(Item *a, Item_in_subselect *b):
|
||||
Item_bool_func(a, my_reinterpret_cast(Item *)(b)), cache(0),
|
||||
save_cache(0), result_for_null_param(UNKNOWN)
|
||||
{}
|
||||
{ with_subselect= true; }
|
||||
bool fix_fields(THD *, Item **);
|
||||
bool fix_left(THD *thd, Item **ref);
|
||||
bool is_null();
|
||||
|
|
|
@ -177,6 +177,7 @@ bool Item_subselect::fix_fields(THD *thd_param, Item **ref)
|
|||
|
||||
(*ref)= substitution;
|
||||
substitution->name= name;
|
||||
substitution->name_length= name_length;
|
||||
if (have_to_be_excluded)
|
||||
engine->exclude();
|
||||
substitution= 0;
|
||||
|
@ -1045,7 +1046,13 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
|||
print_where(item, "rewrite with MIN/MAX", QT_ORDINARY););
|
||||
if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY)
|
||||
{
|
||||
DBUG_ASSERT(select_lex->non_agg_field_used());
|
||||
/*
|
||||
If the argument is a field, we assume that fix_fields() has
|
||||
tagged the select_lex with non_agg_field_used.
|
||||
We reverse that decision after this rewrite with MIN/MAX.
|
||||
*/
|
||||
if (item->get_arg(0)->type() == Item::FIELD_ITEM)
|
||||
DBUG_ASSERT(select_lex->non_agg_field_used());
|
||||
select_lex->set_non_agg_field_used(false);
|
||||
}
|
||||
|
||||
|
|
|
@ -3233,8 +3233,6 @@ int MYSQL_BIN_LOG::purge_first_log(Relay_log_info* rli, bool included)
|
|||
pthread_mutex_lock(&rli->log_space_lock);
|
||||
rli->relay_log.purge_logs(to_purge_if_included, included,
|
||||
0, 0, &rli->log_space_total);
|
||||
// Tell the I/O thread to take the relay_log_space_limit into account
|
||||
rli->ignore_log_space_limit= 0;
|
||||
pthread_mutex_unlock(&rli->log_space_lock);
|
||||
|
||||
/*
|
||||
|
|
|
@ -572,7 +572,7 @@ char *str_to_hex(char *to, const char *from, uint len)
|
|||
*/
|
||||
|
||||
int
|
||||
append_query_string(CHARSET_INFO *csinfo,
|
||||
append_query_string(THD *thd, CHARSET_INFO *csinfo,
|
||||
String const *from, String *to)
|
||||
{
|
||||
char *beg, *ptr;
|
||||
|
@ -587,9 +587,26 @@ append_query_string(CHARSET_INFO *csinfo,
|
|||
else
|
||||
{
|
||||
*ptr++= '\'';
|
||||
ptr+= escape_string_for_mysql(csinfo, ptr, 0,
|
||||
from->ptr(), from->length());
|
||||
*ptr++='\'';
|
||||
if (!(thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES))
|
||||
{
|
||||
ptr+= escape_string_for_mysql(csinfo, ptr, 0,
|
||||
from->ptr(), from->length());
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *frm_str= from->ptr();
|
||||
|
||||
for (; frm_str < (from->ptr() + from->length()); frm_str++)
|
||||
{
|
||||
/* Using '' way to represent "'" */
|
||||
if (*frm_str == '\'')
|
||||
*ptr++= *frm_str;
|
||||
|
||||
*ptr++= *frm_str;
|
||||
}
|
||||
}
|
||||
|
||||
*ptr++= '\'';
|
||||
}
|
||||
to->length(orig_len + ptr - beg);
|
||||
return 0;
|
||||
|
|
|
@ -814,7 +814,7 @@ bool delete_precheck(THD *thd, TABLE_LIST *tables);
|
|||
bool insert_precheck(THD *thd, TABLE_LIST *tables);
|
||||
bool create_table_precheck(THD *thd, TABLE_LIST *tables,
|
||||
TABLE_LIST *create_table);
|
||||
int append_query_string(CHARSET_INFO *csinfo,
|
||||
int append_query_string(THD *thd, CHARSET_INFO *csinfo,
|
||||
String const *from, String *to);
|
||||
|
||||
void get_default_definer(THD *thd, LEX_USER *definer);
|
||||
|
|
|
@ -944,13 +944,13 @@ static void close_connections(void)
|
|||
{
|
||||
if (base_ip_sock != INVALID_SOCKET)
|
||||
{
|
||||
(void) shutdown(base_ip_sock, SHUT_RDWR);
|
||||
(void) mysql_socket_shutdown(base_ip_sock, SHUT_RDWR);
|
||||
(void) closesocket(base_ip_sock);
|
||||
base_ip_sock= INVALID_SOCKET;
|
||||
}
|
||||
if (extra_ip_sock != INVALID_SOCKET)
|
||||
{
|
||||
(void) shutdown(extra_ip_sock, SHUT_RDWR);
|
||||
(void) mysql_socket_shutdown(extra_ip_sock, SHUT_RDWR);
|
||||
(void) closesocket(extra_ip_sock);
|
||||
extra_ip_sock= INVALID_SOCKET;
|
||||
}
|
||||
|
@ -982,7 +982,7 @@ static void close_connections(void)
|
|||
#ifdef HAVE_SYS_UN_H
|
||||
if (unix_sock != INVALID_SOCKET)
|
||||
{
|
||||
(void) shutdown(unix_sock, SHUT_RDWR);
|
||||
(void) mysql_socket_shutdown(unix_sock, SHUT_RDWR);
|
||||
(void) closesocket(unix_sock);
|
||||
(void) unlink(mysqld_unix_port);
|
||||
unix_sock= INVALID_SOCKET;
|
||||
|
@ -1098,7 +1098,7 @@ static void close_socket(my_socket sock, const char *info)
|
|||
if (sock != INVALID_SOCKET)
|
||||
{
|
||||
DBUG_PRINT("info", ("calling shutdown on %s socket", info));
|
||||
(void) shutdown(sock, SHUT_RDWR);
|
||||
(void) mysql_socket_shutdown(sock, SHUT_RDWR);
|
||||
#if defined(__NETWARE__)
|
||||
/*
|
||||
The following code is disabled for normal systems as it causes MySQL
|
||||
|
@ -2551,10 +2551,6 @@ static void check_data_home(const char *path)
|
|||
|
||||
#endif /*__WIN__ || __NETWARE */
|
||||
|
||||
#ifdef HAVE_LINUXTHREADS
|
||||
#define UNSAFE_DEFAULT_LINUX_THREADS 200
|
||||
#endif
|
||||
|
||||
|
||||
#if BACKTRACE_DEMANGLE
|
||||
#include <cxxabi.h>
|
||||
|
@ -5244,7 +5240,7 @@ pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused)))
|
|||
if (req.sink)
|
||||
((void (*)(int))req.sink)(req.fd);
|
||||
|
||||
(void) shutdown(new_sock, SHUT_RDWR);
|
||||
(void) mysql_socket_shutdown(new_sock, SHUT_RDWR);
|
||||
(void) closesocket(new_sock);
|
||||
continue;
|
||||
}
|
||||
|
@ -5259,7 +5255,7 @@ pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused)))
|
|||
if (getsockname(new_sock,&dummy, &dummyLen) < 0)
|
||||
{
|
||||
sql_perror("Error on new connection socket");
|
||||
(void) shutdown(new_sock, SHUT_RDWR);
|
||||
(void) mysql_socket_shutdown(new_sock, SHUT_RDWR);
|
||||
(void) closesocket(new_sock);
|
||||
continue;
|
||||
}
|
||||
|
@ -5271,7 +5267,7 @@ pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused)))
|
|||
|
||||
if (!(thd= new THD))
|
||||
{
|
||||
(void) shutdown(new_sock, SHUT_RDWR);
|
||||
(void) mysql_socket_shutdown(new_sock, SHUT_RDWR);
|
||||
VOID(closesocket(new_sock));
|
||||
continue;
|
||||
}
|
||||
|
@ -5290,7 +5286,7 @@ pthread_handler_t handle_connections_sockets(void *arg __attribute__((unused)))
|
|||
vio_delete(vio_tmp);
|
||||
else
|
||||
{
|
||||
(void) shutdown(new_sock, SHUT_RDWR);
|
||||
(void) mysql_socket_shutdown(new_sock, SHUT_RDWR);
|
||||
(void) closesocket(new_sock);
|
||||
}
|
||||
delete thd;
|
||||
|
|
|
@ -189,6 +189,13 @@ public:
|
|||
ulonglong log_space_limit,log_space_total;
|
||||
bool ignore_log_space_limit;
|
||||
|
||||
/*
|
||||
Used by the SQL thread to instructs the IO thread to rotate
|
||||
the logs when the SQL thread needs to purge to release some
|
||||
disk space.
|
||||
*/
|
||||
bool sql_force_rotate_relay;
|
||||
|
||||
/*
|
||||
When it commits, InnoDB internally stores the master log position it has
|
||||
processed so far; the position to store is the one of the end of the
|
||||
|
|
|
@ -132,6 +132,7 @@ extern "C" sig_handler handle_fatal_signal(int sig)
|
|||
"Hope that's ok; if not, decrease some variables in the equation.\n\n");
|
||||
|
||||
#if defined(HAVE_LINUXTHREADS)
|
||||
#define UNSAFE_DEFAULT_LINUX_THREADS 200
|
||||
if (sizeof(char*) == 4 && thread_count > UNSAFE_DEFAULT_LINUX_THREADS)
|
||||
{
|
||||
my_safe_printf_stderr(
|
||||
|
|
92
sql/slave.cc
92
sql/slave.cc
|
@ -1410,6 +1410,54 @@ Waiting for the slave SQL thread to free enough relay log space");
|
|||
!(slave_killed=io_slave_killed(thd,mi)) &&
|
||||
!rli->ignore_log_space_limit)
|
||||
pthread_cond_wait(&rli->log_space_cond, &rli->log_space_lock);
|
||||
|
||||
/*
|
||||
Makes the IO thread read only one event at a time
|
||||
until the SQL thread is able to purge the relay
|
||||
logs, freeing some space.
|
||||
|
||||
Therefore, once the SQL thread processes this next
|
||||
event, it goes to sleep (no more events in the queue),
|
||||
sets ignore_log_space_limit=true and wakes the IO thread.
|
||||
However, this event may have been enough already for
|
||||
the SQL thread to purge some log files, freeing
|
||||
rli->log_space_total .
|
||||
|
||||
This guarantees that the SQL and IO thread move
|
||||
forward only one event at a time (to avoid deadlocks),
|
||||
when the relay space limit is reached. It also
|
||||
guarantees that when the SQL thread is prepared to
|
||||
rotate (to be able to purge some logs), the IO thread
|
||||
will know about it and will rotate.
|
||||
|
||||
NOTE: The ignore_log_space_limit is only set when the SQL
|
||||
thread sleeps waiting for events.
|
||||
|
||||
*/
|
||||
if (rli->ignore_log_space_limit)
|
||||
{
|
||||
#ifndef DBUG_OFF
|
||||
{
|
||||
char llbuf1[22], llbuf2[22];
|
||||
DBUG_PRINT("info", ("log_space_limit=%s "
|
||||
"log_space_total=%s "
|
||||
"ignore_log_space_limit=%d "
|
||||
"sql_force_rotate_relay=%d",
|
||||
llstr(rli->log_space_limit,llbuf1),
|
||||
llstr(rli->log_space_total,llbuf2),
|
||||
(int) rli->ignore_log_space_limit,
|
||||
(int) rli->sql_force_rotate_relay));
|
||||
}
|
||||
#endif
|
||||
if (rli->sql_force_rotate_relay)
|
||||
{
|
||||
rotate_relay_log(rli->mi);
|
||||
rli->sql_force_rotate_relay= false;
|
||||
}
|
||||
|
||||
rli->ignore_log_space_limit= false;
|
||||
}
|
||||
|
||||
thd->exit_cond(save_proc_info);
|
||||
DBUG_RETURN(slave_killed);
|
||||
}
|
||||
|
@ -4224,19 +4272,45 @@ static Log_event* next_event(Relay_log_info* rli)
|
|||
constraint, because we do not want the I/O thread to block because of
|
||||
space (it's ok if it blocks for any other reason (e.g. because the
|
||||
master does not send anything). Then the I/O thread stops waiting
|
||||
and reads more events.
|
||||
The SQL thread decides when the I/O thread should take log_space_limit
|
||||
into account again : ignore_log_space_limit is reset to 0
|
||||
in purge_first_log (when the SQL thread purges the just-read relay
|
||||
log), and also when the SQL thread starts. We should also reset
|
||||
ignore_log_space_limit to 0 when the user does RESET SLAVE, but in
|
||||
fact, no need as RESET SLAVE requires that the slave
|
||||
and reads one more event and starts honoring log_space_limit again.
|
||||
|
||||
If the SQL thread needs more events to be able to rotate the log (it
|
||||
might need to finish the current group first), then it can ask for one
|
||||
more at a time. Thus we don't outgrow the relay log indefinitely,
|
||||
but rather in a controlled manner, until the next rotate.
|
||||
|
||||
When the SQL thread starts it sets ignore_log_space_limit to false.
|
||||
We should also reset ignore_log_space_limit to 0 when the user does
|
||||
RESET SLAVE, but in fact, no need as RESET SLAVE requires that the slave
|
||||
be stopped, and the SQL thread sets ignore_log_space_limit to 0 when
|
||||
it stops.
|
||||
*/
|
||||
pthread_mutex_lock(&rli->log_space_lock);
|
||||
// prevent the I/O thread from blocking next times
|
||||
rli->ignore_log_space_limit= 1;
|
||||
|
||||
/*
|
||||
If we have reached the limit of the relay space and we
|
||||
are going to sleep, waiting for more events:
|
||||
|
||||
1. If outside a group, SQL thread asks the IO thread
|
||||
to force a rotation so that the SQL thread purges
|
||||
logs next time it processes an event (thus space is
|
||||
freed).
|
||||
|
||||
2. If in a group, SQL thread asks the IO thread to
|
||||
ignore the limit and queues yet one more event
|
||||
so that the SQL thread finishes the group and
|
||||
is are able to rotate and purge sometime soon.
|
||||
*/
|
||||
if (rli->log_space_limit &&
|
||||
rli->log_space_limit < rli->log_space_total)
|
||||
{
|
||||
/* force rotation if not in an unfinished group */
|
||||
rli->sql_force_rotate_relay= !rli->is_in_group();
|
||||
|
||||
/* ask for one more event */
|
||||
rli->ignore_log_space_limit= true;
|
||||
}
|
||||
|
||||
/*
|
||||
If the I/O thread is blocked, unblock it. Ok to broadcast
|
||||
after unlock, because the mutex is only destroyed in
|
||||
|
|
|
@ -157,7 +157,7 @@ sp_get_item_value(THD *thd, Item *item, String *str)
|
|||
buf.append(result->charset()->csname);
|
||||
if (cs->escape_with_backslash_is_dangerous)
|
||||
buf.append(' ');
|
||||
append_query_string(cs, result, &buf);
|
||||
append_query_string(thd, cs, result, &buf);
|
||||
buf.append(" COLLATE '");
|
||||
buf.append(item->collation.collation->name);
|
||||
buf.append('\'');
|
||||
|
|
|
@ -627,7 +627,8 @@ int Gis_line_string::is_closed(int *closed) const
|
|||
return 0;
|
||||
}
|
||||
data+= 4;
|
||||
if (no_data(data, SIZEOF_STORED_DOUBLE * 2 * n_points))
|
||||
if (n_points == 0 ||
|
||||
no_data(data, SIZEOF_STORED_DOUBLE * 2 * n_points))
|
||||
return 1;
|
||||
|
||||
/* Get first point */
|
||||
|
|
|
@ -1793,8 +1793,9 @@ void log_slow_statement(THD *thd)
|
|||
ulonglong end_utime_of_query= thd->current_utime();
|
||||
thd_proc_info(thd, "logging slow query");
|
||||
|
||||
if (((end_utime_of_query - thd->utime_after_lock) >
|
||||
thd->variables.long_query_time ||
|
||||
if ((((end_utime_of_query > thd->utime_after_lock) &&
|
||||
((end_utime_of_query - thd->utime_after_lock) >
|
||||
thd->variables.long_query_time)) ||
|
||||
((thd->server_status &
|
||||
(SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED)) &&
|
||||
opt_log_queries_not_using_indexes &&
|
||||
|
|
|
@ -796,7 +796,7 @@ static bool insert_params_with_log(Prepared_statement *stmt, uchar *null_array,
|
|||
*/
|
||||
else if (! is_param_long_data_type(param))
|
||||
DBUG_RETURN(1);
|
||||
res= param->query_val_str(&str);
|
||||
res= param->query_val_str(thd, &str);
|
||||
if (param->convert_str_value(thd))
|
||||
DBUG_RETURN(1); /* out of memory */
|
||||
|
||||
|
@ -970,7 +970,7 @@ static bool emb_insert_params_with_log(Prepared_statement *stmt,
|
|||
DBUG_RETURN(1);
|
||||
}
|
||||
}
|
||||
res= param->query_val_str(&str);
|
||||
res= param->query_val_str(thd, &str);
|
||||
if (param->convert_str_value(thd))
|
||||
DBUG_RETURN(1); /* out of memory */
|
||||
|
||||
|
@ -1116,7 +1116,7 @@ static bool insert_params_from_vars_with_log(Prepared_statement *stmt,
|
|||
setup_one_conversion_function(thd, param, param->param_type);
|
||||
if (param->set_from_user_var(thd, entry))
|
||||
DBUG_RETURN(1);
|
||||
val= param->query_val_str(&buf);
|
||||
val= param->query_val_str(thd, &buf);
|
||||
|
||||
if (param->convert_str_value(thd))
|
||||
DBUG_RETURN(1); /* out of memory */
|
||||
|
|
|
@ -5859,6 +5859,7 @@ static bool create_ref_for_key(JOIN *join, JOIN_TAB *j, KEYUSE *org_keyuse,
|
|||
}
|
||||
keyuse++;
|
||||
} while (keyuse->table == table && keyuse->key == key);
|
||||
DBUG_ASSERT(length > 0 && keyparts != 0);
|
||||
} /* not ftkey */
|
||||
|
||||
/* set up fieldref */
|
||||
|
@ -8631,10 +8632,10 @@ change_cond_ref_to_const(THD *thd, I_List<COND_CMP> *save_list,
|
|||
left_item->collation.collation == value->collation.collation))
|
||||
{
|
||||
Item *tmp=value->clone_item();
|
||||
tmp->collation.set(right_item->collation);
|
||||
|
||||
if (tmp)
|
||||
{
|
||||
tmp->collation.set(right_item->collation);
|
||||
thd->change_item_tree(args + 1, tmp);
|
||||
func->update_used_tables();
|
||||
if ((functype == Item_func::EQ_FUNC || functype == Item_func::EQUAL_FUNC)
|
||||
|
@ -8655,10 +8656,10 @@ change_cond_ref_to_const(THD *thd, I_List<COND_CMP> *save_list,
|
|||
right_item->collation.collation == value->collation.collation))
|
||||
{
|
||||
Item *tmp= value->clone_item();
|
||||
tmp->collation.set(left_item->collation);
|
||||
|
||||
if (tmp)
|
||||
{
|
||||
tmp->collation.set(left_item->collation);
|
||||
thd->change_item_tree(args, tmp);
|
||||
value= tmp;
|
||||
func->update_used_tables();
|
||||
|
@ -13763,6 +13764,9 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
|
|||
DBUG_ENTER("test_if_skip_sort_order");
|
||||
LINT_INIT(ref_key_parts);
|
||||
|
||||
/* Check that we are always called with first non-const table */
|
||||
DBUG_ASSERT(tab == tab->join->join_tab + tab->join->const_tables);
|
||||
|
||||
/*
|
||||
Keys disabled by ALTER TABLE ... DISABLE KEYS should have already
|
||||
been taken into account.
|
||||
|
@ -13844,7 +13848,8 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
|
|||
while (keyuse->key != new_ref_key && keyuse->table == tab->table)
|
||||
keyuse++;
|
||||
if (create_ref_for_key(tab->join, tab, keyuse,
|
||||
tab->join->const_table_map))
|
||||
(tab->join->const_table_map |
|
||||
OUTER_REF_TABLE_BIT)))
|
||||
DBUG_RETURN(0);
|
||||
|
||||
pick_table_access_method(tab);
|
||||
|
|
|
@ -4362,7 +4362,8 @@ bool store_schema_proc(THD *thd, TABLE *table, TABLE *proc_table,
|
|||
(sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND) == 0)
|
||||
{
|
||||
restore_record(table, s->default_values);
|
||||
if (!wild || !wild[0] || !wild_compare(sp_name.c_ptr_safe(), wild, 0))
|
||||
if (!wild || !wild[0] || !wild_case_compare(system_charset_info,
|
||||
sp_name.c_ptr_safe(), wild))
|
||||
{
|
||||
int enum_idx= (int) proc_table->field[5]->val_int();
|
||||
table->field[3]->store(sp_name.ptr(), sp_name.length(), cs);
|
||||
|
@ -5355,7 +5356,7 @@ copy_event_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table)
|
|||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
if (!(!wild || !wild[0] || !wild_compare(et.name.str, wild, 0)))
|
||||
if (!(!wild || !wild[0] || !wild_case_compare(scs, et.name.str, wild)))
|
||||
DBUG_RETURN(0);
|
||||
|
||||
/*
|
||||
|
|
|
@ -4005,6 +4005,7 @@ Item *Field_iterator_table::create_item(THD *thd)
|
|||
{
|
||||
select->non_agg_fields.push_back(item);
|
||||
item->marker= select->cur_pos_in_select_list;
|
||||
select->set_non_agg_field_used(true);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
|
|
@ -291,13 +291,19 @@ btr_pcur_restore_position(
|
|||
/* Save the old search mode of the cursor */
|
||||
old_mode = cursor->search_mode;
|
||||
|
||||
if (UNIV_LIKELY(cursor->rel_pos == BTR_PCUR_ON)) {
|
||||
switch (cursor->rel_pos) {
|
||||
case BTR_PCUR_ON:
|
||||
mode = PAGE_CUR_LE;
|
||||
} else if (cursor->rel_pos == BTR_PCUR_AFTER) {
|
||||
break;
|
||||
case BTR_PCUR_AFTER:
|
||||
mode = PAGE_CUR_G;
|
||||
} else {
|
||||
ut_ad(cursor->rel_pos == BTR_PCUR_BEFORE);
|
||||
break;
|
||||
case BTR_PCUR_BEFORE:
|
||||
mode = PAGE_CUR_L;
|
||||
break;
|
||||
default:
|
||||
ut_error;
|
||||
mode = 0; /* silence a warning */
|
||||
}
|
||||
|
||||
btr_pcur_open_with_no_init(index, tuple, mode, latch_mode,
|
||||
|
@ -306,26 +312,45 @@ btr_pcur_restore_position(
|
|||
/* Restore the old search mode */
|
||||
cursor->search_mode = old_mode;
|
||||
|
||||
if (cursor->rel_pos == BTR_PCUR_ON
|
||||
&& btr_pcur_is_on_user_rec(cursor, mtr)
|
||||
&& 0 == cmp_dtuple_rec(tuple, btr_pcur_get_rec(cursor),
|
||||
rec_get_offsets(
|
||||
btr_pcur_get_rec(cursor), index,
|
||||
NULL, ULINT_UNDEFINED, &heap))) {
|
||||
if (btr_pcur_is_on_user_rec(cursor, mtr)) {
|
||||
switch (cursor->rel_pos) {
|
||||
case BTR_PCUR_ON:
|
||||
if (!cmp_dtuple_rec(
|
||||
tuple, btr_pcur_get_rec(cursor),
|
||||
rec_get_offsets(btr_pcur_get_rec(cursor),
|
||||
index, NULL,
|
||||
ULINT_UNDEFINED, &heap))) {
|
||||
|
||||
/* We have to store the NEW value for the modify clock, since
|
||||
the cursor can now be on a different page! But we can retain
|
||||
the value of old_rec */
|
||||
/* We have to store the NEW value for
|
||||
the modify clock, since the cursor can
|
||||
now be on a different page! But we can
|
||||
retain the value of old_rec */
|
||||
|
||||
cursor->block_when_stored = buf_block_align(
|
||||
btr_pcur_get_page(cursor));
|
||||
cursor->modify_clock = buf_block_get_modify_clock(
|
||||
cursor->block_when_stored);
|
||||
cursor->old_stored = BTR_PCUR_OLD_STORED;
|
||||
cursor->block_when_stored =
|
||||
buf_block_align(
|
||||
btr_pcur_get_page(cursor));
|
||||
cursor->modify_clock =
|
||||
buf_block_get_modify_clock(
|
||||
cursor->block_when_stored);
|
||||
cursor->old_stored = BTR_PCUR_OLD_STORED;
|
||||
|
||||
mem_heap_free(heap);
|
||||
mem_heap_free(heap);
|
||||
|
||||
return(TRUE);
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
break;
|
||||
case BTR_PCUR_BEFORE:
|
||||
page_cur_move_to_next(btr_pcur_get_page_cur(cursor));
|
||||
break;
|
||||
case BTR_PCUR_AFTER:
|
||||
page_cur_move_to_prev(btr_pcur_get_page_cur(cursor));
|
||||
break;
|
||||
#ifdef UNIV_DEBUG
|
||||
default:
|
||||
ut_error;
|
||||
#endif /* UNIV_DEBUG */
|
||||
}
|
||||
}
|
||||
|
||||
mem_heap_free(heap);
|
||||
|
|
|
@ -26,6 +26,8 @@ Created 1/8/1996 Heikki Tuuri
|
|||
#include "pars0sym.h"
|
||||
#include "que0que.h"
|
||||
#include "rem0cmp.h"
|
||||
#include "m_string.h"
|
||||
#include "my_sys.h"
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
# include "m_ctype.h" /* my_isspace() */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
|
@ -1889,6 +1891,8 @@ dict_foreign_free(
|
|||
/*==============*/
|
||||
dict_foreign_t* foreign) /* in, own: foreign key struct */
|
||||
{
|
||||
ut_a(foreign->foreign_table->n_foreign_key_checks_running == 0);
|
||||
|
||||
mem_heap_free(foreign->heap);
|
||||
}
|
||||
|
||||
|
|
|
@ -245,13 +245,13 @@ fseg_n_reserved_pages_low(
|
|||
/************************************************************************
|
||||
Marks a page used. The page must reside within the extents of the given
|
||||
segment. */
|
||||
static
|
||||
static __attribute__((nonnull))
|
||||
void
|
||||
fseg_mark_page_used(
|
||||
/*================*/
|
||||
fseg_inode_t* seg_inode,/* in: segment inode */
|
||||
ulint space, /* in: space id */
|
||||
ulint page, /* in: page offset */
|
||||
xdes_t* descr, /* in: extent descriptor */
|
||||
mtr_t* mtr); /* in: mtr */
|
||||
/**************************************************************************
|
||||
Returns the first extent descriptor for a segment. We think of the extent
|
||||
|
@ -635,10 +635,8 @@ xdes_calc_descriptor_index(
|
|||
|
||||
/************************************************************************
|
||||
Gets pointer to a the extent descriptor of a page. The page where the extent
|
||||
descriptor resides is x-locked. If the page offset is equal to the free limit
|
||||
of the space, adds new extents from above the free limit to the space free
|
||||
list, if not free limit == space size. This adding is necessary to make the
|
||||
descriptor defined, as they are uninitialized above the free limit. */
|
||||
descriptor resides is x-locked. This function no longer extends the data
|
||||
file. */
|
||||
UNIV_INLINE
|
||||
xdes_t*
|
||||
xdes_get_descriptor_with_space_hdr(
|
||||
|
@ -666,19 +664,10 @@ xdes_get_descriptor_with_space_hdr(
|
|||
limit = mtr_read_ulint(sp_header + FSP_FREE_LIMIT, MLOG_4BYTES, mtr);
|
||||
size = mtr_read_ulint(sp_header + FSP_SIZE, MLOG_4BYTES, mtr);
|
||||
|
||||
/* If offset is >= size or > limit, return NULL */
|
||||
|
||||
if ((offset >= size) || (offset > limit)) {
|
||||
|
||||
if ((offset >= size) || (offset >= limit)) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/* If offset is == limit, fill free list of the space. */
|
||||
|
||||
if (offset == limit) {
|
||||
fsp_fill_free_list(FALSE, space, sp_header, mtr);
|
||||
}
|
||||
|
||||
descr_page_no = xdes_calc_descriptor_page(offset);
|
||||
|
||||
if (descr_page_no == 0) {
|
||||
|
@ -2552,7 +2541,7 @@ fseg_alloc_free_page_low(
|
|||
ut_ad(xdes_get_bit(ret_descr, XDES_FREE_BIT,
|
||||
ret_page % FSP_EXTENT_SIZE, mtr) == TRUE);
|
||||
|
||||
fseg_mark_page_used(seg_inode, space, ret_page, mtr);
|
||||
fseg_mark_page_used(seg_inode, ret_page, ret_descr, mtr);
|
||||
}
|
||||
|
||||
return(ret_page);
|
||||
|
@ -2946,22 +2935,17 @@ fsp_get_available_space_in_free_extents(
|
|||
/************************************************************************
|
||||
Marks a page used. The page must reside within the extents of the given
|
||||
segment. */
|
||||
static
|
||||
static __attribute__((nonnull))
|
||||
void
|
||||
fseg_mark_page_used(
|
||||
/*================*/
|
||||
fseg_inode_t* seg_inode,/* in: segment inode */
|
||||
ulint space, /* in: space id */
|
||||
ulint page, /* in: page offset */
|
||||
xdes_t* descr, /* in: extent descriptor */
|
||||
mtr_t* mtr) /* in: mtr */
|
||||
{
|
||||
xdes_t* descr;
|
||||
ulint not_full_n_used;
|
||||
|
||||
ut_ad(seg_inode && mtr);
|
||||
|
||||
descr = xdes_get_descriptor(space, page, mtr);
|
||||
|
||||
ut_ad(mtr_read_ulint(seg_inode + FSEG_ID, MLOG_4BYTES, mtr)
|
||||
== mtr_read_ulint(descr + XDES_ID, MLOG_4BYTES, mtr));
|
||||
|
||||
|
|
|
@ -746,6 +746,10 @@ convert_error_code_to_mysql(
|
|||
|
||||
return(HA_ERR_RECORD_FILE_FULL);
|
||||
|
||||
} else if (error == (int) DB_TABLE_IN_FK_CHECK) {
|
||||
|
||||
return(HA_ERR_TABLE_IN_FK_CHECK);
|
||||
|
||||
} else if (error == (int) DB_TABLE_IS_BEING_USED) {
|
||||
|
||||
return(HA_ERR_WRONG_COMMAND);
|
||||
|
@ -4867,6 +4871,7 @@ ha_innobase::index_read(
|
|||
DBUG_ENTER("index_read");
|
||||
|
||||
ut_a(prebuilt->trx == thd_to_trx(user_thd));
|
||||
ut_ad(key_len != 0 || find_flag != HA_READ_KEY_EXACT);
|
||||
|
||||
ha_statistic_increment(&SSV::ha_read_key_count);
|
||||
|
||||
|
|
|
@ -82,6 +82,8 @@ Created 5/24/1996 Heikki Tuuri
|
|||
#define DB_REFERENCING_NO_INDEX 52 /* the parent (referencing) table does
|
||||
not have an index that contains the
|
||||
foreign keys as its prefix columns */
|
||||
#define DB_TABLE_IN_FK_CHECK 53 /* table is being used in foreign
|
||||
key check */
|
||||
|
||||
/* The following are partial failure codes */
|
||||
#define DB_FAIL 1000
|
||||
|
|
|
@ -120,9 +120,9 @@ struct trx_purge_struct{
|
|||
read_view_t* view; /* The purge will not remove undo logs
|
||||
which are >= this view (purge view) */
|
||||
mutex_t mutex; /* Mutex protecting the fields below */
|
||||
ulint n_pages_handled;/* Approximate number of undo log
|
||||
ulonglong n_pages_handled;/* Approximate number of undo log
|
||||
pages processed in purge */
|
||||
ulint handle_limit; /* Target of how many pages to get
|
||||
ulonglong handle_limit; /* Target of how many pages to get
|
||||
processed in the current purge */
|
||||
/*------------------------------*/
|
||||
/* The following two fields form the 'purge pointer' which advances
|
||||
|
|
|
@ -1074,6 +1074,9 @@ row_ins_foreign_check_on_constraint(
|
|||
release the latch. */
|
||||
|
||||
row_mysql_unfreeze_data_dictionary(thr_get_trx(thr));
|
||||
|
||||
DEBUG_SYNC_C("innodb_dml_cascade_dict_unfreeze");
|
||||
|
||||
row_mysql_freeze_data_dictionary(thr_get_trx(thr));
|
||||
|
||||
mtr_start(mtr);
|
||||
|
|
|
@ -31,6 +31,8 @@ Created 9/17/2000 Heikki Tuuri
|
|||
#include "btr0sea.h"
|
||||
#include "fil0fil.h"
|
||||
#include "ibuf0ibuf.h"
|
||||
#include "m_string.h"
|
||||
#include "my_sys.h"
|
||||
|
||||
/* A dummy variable used to fool the compiler */
|
||||
ibool row_mysql_identically_false = FALSE;
|
||||
|
@ -1373,6 +1375,8 @@ row_update_for_mysql(
|
|||
return(DB_ERROR);
|
||||
}
|
||||
|
||||
DEBUG_SYNC_C("innodb_row_update_for_mysql_begin");
|
||||
|
||||
trx->op_info = "updating or deleting";
|
||||
|
||||
row_mysql_delay_if_needed();
|
||||
|
@ -3652,6 +3656,7 @@ row_rename_table_for_mysql(
|
|||
ulint n_constraints_to_drop = 0;
|
||||
ibool old_is_tmp, new_is_tmp;
|
||||
pars_info_t* info = NULL;
|
||||
ulint retry = 0;
|
||||
|
||||
ut_ad(trx->mysql_thread_id == os_thread_get_curr_id());
|
||||
ut_a(old_name != NULL);
|
||||
|
@ -3750,6 +3755,25 @@ row_rename_table_for_mysql(
|
|||
}
|
||||
}
|
||||
|
||||
/* Is a foreign key check running on this table? */
|
||||
for (retry = 0; retry < 100
|
||||
&& table->n_foreign_key_checks_running > 0; ++retry) {
|
||||
row_mysql_unlock_data_dictionary(trx);
|
||||
os_thread_yield();
|
||||
row_mysql_lock_data_dictionary(trx);
|
||||
}
|
||||
|
||||
if (table->n_foreign_key_checks_running > 0) {
|
||||
ut_print_timestamp(stderr);
|
||||
fputs(" InnoDB: Error: in ALTER TABLE ", stderr);
|
||||
ut_print_name(stderr, trx, TRUE, old_name);
|
||||
fprintf(stderr, "\n"
|
||||
"InnoDB: a FOREIGN KEY check is running.\n"
|
||||
"InnoDB: Cannot rename table.\n");
|
||||
err = DB_TABLE_IN_FK_CHECK;
|
||||
goto funct_exit;
|
||||
}
|
||||
|
||||
/* We use the private SQL parser of Innobase to generate the query
|
||||
graphs needed in deleting the dictionary data from system tables in
|
||||
Innobase. Deleting a row from SYS_INDEXES table also frees the file
|
||||
|
|
|
@ -1022,7 +1022,7 @@ trx_purge(void)
|
|||
{
|
||||
que_thr_t* thr;
|
||||
/* que_thr_t* thr2; */
|
||||
ulint old_pages_handled;
|
||||
ulonglong old_pages_handled;
|
||||
|
||||
mutex_enter(&(purge_sys->mutex));
|
||||
|
||||
|
@ -1116,7 +1116,7 @@ trx_purge(void)
|
|||
(ulong) purge_sys->n_pages_handled);
|
||||
}
|
||||
|
||||
return(purge_sys->n_pages_handled - old_pages_handled);
|
||||
return((ulint) (purge_sys->n_pages_handled - old_pages_handled));
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
|
|
|
@ -1,3 +1,35 @@
|
|||
2012-03-15 The InnoDB Team
|
||||
|
||||
* fil/fil0fil.c, ibuf/ibuf0ibuf.c, include/fil0fil.h,
|
||||
lock/lock0lock.c:
|
||||
Fix Bug#13825266 RACE IN LOCK_VALIDATE() WHEN ACCESSING PAGES
|
||||
DIRECTLY FROM BUFFER POOL
|
||||
|
||||
2012-03-15 The InnoDB Team
|
||||
|
||||
* handler/ha_innodb.cc:
|
||||
Fix Bug#13851171STRING OVERFLOW IN INNODB CODE FOUND BY STATIC
|
||||
ANALYSIS
|
||||
|
||||
2012-03-15 The InnoDB Team
|
||||
|
||||
* include/sync0rw.ic:
|
||||
Fix Bug#13537504 VALGRIND: COND. JUMP/MOVE DEPENDS ON
|
||||
UNINITIALISED VALUES IN OS_THREAD_EQ
|
||||
|
||||
2012-03-08 The InnoDB Team
|
||||
|
||||
* btr/btr0pcur.c:
|
||||
Fix Bug#13807811 BTR_PCUR_RESTORE_POSITION() CAN SKIP A RECORD
|
||||
|
||||
2012-02-28 The InnoDB Team
|
||||
|
||||
* btr/btr0btr.c, dict/dict0dict.c, include/btr0btr.h,
|
||||
include/dict0dict.h, include/dict0dict.ic, include/dict0mem.h,
|
||||
handler/handler0alter.cc, row/row0mysql.c:
|
||||
Fix Bug#12861864 RACE CONDITION IN BTR_GET_SIZE() AND
|
||||
DROP INDEX/TABLE/DATABASE
|
||||
|
||||
2012-02-15 The InnoDB Team
|
||||
|
||||
* btr/btr0btr.c, btr/btr0cur.c, fsp/fsp0fsp.c, ibuf/ibuf0ibuf.c,
|
||||
|
|
|
@ -991,45 +991,49 @@ btr_page_alloc(
|
|||
|
||||
/**************************************************************//**
|
||||
Gets the number of pages in a B-tree.
|
||||
@return number of pages */
|
||||
@return number of pages, or ULINT_UNDEFINED if the index is unavailable */
|
||||
UNIV_INTERN
|
||||
ulint
|
||||
btr_get_size(
|
||||
/*=========*/
|
||||
dict_index_t* index, /*!< in: index */
|
||||
ulint flag) /*!< in: BTR_N_LEAF_PAGES or BTR_TOTAL_SIZE */
|
||||
ulint flag, /*!< in: BTR_N_LEAF_PAGES or BTR_TOTAL_SIZE */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction where index
|
||||
is s-latched */
|
||||
{
|
||||
fseg_header_t* seg_header;
|
||||
page_t* root;
|
||||
ulint n;
|
||||
ulint dummy;
|
||||
mtr_t mtr;
|
||||
|
||||
mtr_start(&mtr);
|
||||
ut_ad(mtr_memo_contains(mtr, dict_index_get_lock(index),
|
||||
MTR_MEMO_S_LOCK));
|
||||
|
||||
mtr_s_lock(dict_index_get_lock(index), &mtr);
|
||||
if (index->page == FIL_NULL
|
||||
|| index->to_be_dropped
|
||||
|| *index->name == TEMP_INDEX_PREFIX) {
|
||||
return(ULINT_UNDEFINED);
|
||||
}
|
||||
|
||||
root = btr_root_get(index, &mtr);
|
||||
root = btr_root_get(index, mtr);
|
||||
|
||||
if (flag == BTR_N_LEAF_PAGES) {
|
||||
seg_header = root + PAGE_HEADER + PAGE_BTR_SEG_LEAF;
|
||||
|
||||
fseg_n_reserved_pages(seg_header, &n, &mtr);
|
||||
fseg_n_reserved_pages(seg_header, &n, mtr);
|
||||
|
||||
} else if (flag == BTR_TOTAL_SIZE) {
|
||||
seg_header = root + PAGE_HEADER + PAGE_BTR_SEG_TOP;
|
||||
|
||||
n = fseg_n_reserved_pages(seg_header, &dummy, &mtr);
|
||||
n = fseg_n_reserved_pages(seg_header, &dummy, mtr);
|
||||
|
||||
seg_header = root + PAGE_HEADER + PAGE_BTR_SEG_LEAF;
|
||||
|
||||
n += fseg_n_reserved_pages(seg_header, &dummy, &mtr);
|
||||
n += fseg_n_reserved_pages(seg_header, &dummy, mtr);
|
||||
} else {
|
||||
ut_error;
|
||||
}
|
||||
|
||||
mtr_commit(&mtr);
|
||||
|
||||
return(n);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
|
||||
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 the Free Software
|
||||
|
@ -121,6 +121,8 @@ btr_pcur_store_position(
|
|||
|
||||
ut_a(btr_page_get_next(page, mtr) == FIL_NULL);
|
||||
ut_a(btr_page_get_prev(page, mtr) == FIL_NULL);
|
||||
ut_ad(page_is_leaf(page));
|
||||
ut_ad(page_get_page_no(page) == index->page);
|
||||
|
||||
cursor->old_stored = BTR_PCUR_OLD_STORED;
|
||||
|
||||
|
@ -313,13 +315,19 @@ btr_pcur_restore_position_func(
|
|||
/* Save the old search mode of the cursor */
|
||||
old_mode = cursor->search_mode;
|
||||
|
||||
if (UNIV_LIKELY(cursor->rel_pos == BTR_PCUR_ON)) {
|
||||
switch (cursor->rel_pos) {
|
||||
case BTR_PCUR_ON:
|
||||
mode = PAGE_CUR_LE;
|
||||
} else if (cursor->rel_pos == BTR_PCUR_AFTER) {
|
||||
break;
|
||||
case BTR_PCUR_AFTER:
|
||||
mode = PAGE_CUR_G;
|
||||
} else {
|
||||
ut_ad(cursor->rel_pos == BTR_PCUR_BEFORE);
|
||||
break;
|
||||
case BTR_PCUR_BEFORE:
|
||||
mode = PAGE_CUR_L;
|
||||
break;
|
||||
default:
|
||||
ut_error;
|
||||
mode = 0;
|
||||
}
|
||||
|
||||
btr_pcur_open_with_no_init_func(index, tuple, mode, latch_mode,
|
||||
|
@ -328,25 +336,44 @@ btr_pcur_restore_position_func(
|
|||
/* Restore the old search mode */
|
||||
cursor->search_mode = old_mode;
|
||||
|
||||
if (cursor->rel_pos == BTR_PCUR_ON
|
||||
&& btr_pcur_is_on_user_rec(cursor)
|
||||
&& 0 == cmp_dtuple_rec(tuple, btr_pcur_get_rec(cursor),
|
||||
rec_get_offsets(
|
||||
btr_pcur_get_rec(cursor), index,
|
||||
NULL, ULINT_UNDEFINED, &heap))) {
|
||||
if (btr_pcur_is_on_user_rec(cursor)) {
|
||||
switch (cursor->rel_pos) {
|
||||
case BTR_PCUR_ON:
|
||||
if (!cmp_dtuple_rec(
|
||||
tuple, btr_pcur_get_rec(cursor),
|
||||
rec_get_offsets(btr_pcur_get_rec(cursor),
|
||||
index, NULL,
|
||||
ULINT_UNDEFINED, &heap))) {
|
||||
|
||||
/* We have to store the NEW value for the modify clock, since
|
||||
the cursor can now be on a different page! But we can retain
|
||||
the value of old_rec */
|
||||
/* We have to store the NEW value for
|
||||
the modify clock, since the cursor can
|
||||
now be on a different page! But we can
|
||||
retain the value of old_rec */
|
||||
|
||||
cursor->block_when_stored = btr_pcur_get_block(cursor);
|
||||
cursor->modify_clock = buf_block_get_modify_clock(
|
||||
cursor->block_when_stored);
|
||||
cursor->old_stored = BTR_PCUR_OLD_STORED;
|
||||
cursor->block_when_stored =
|
||||
btr_pcur_get_block(cursor);
|
||||
cursor->modify_clock =
|
||||
buf_block_get_modify_clock(
|
||||
cursor->block_when_stored);
|
||||
cursor->old_stored = BTR_PCUR_OLD_STORED;
|
||||
|
||||
mem_heap_free(heap);
|
||||
mem_heap_free(heap);
|
||||
|
||||
return(TRUE);
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
break;
|
||||
case BTR_PCUR_BEFORE:
|
||||
page_cur_move_to_next(btr_pcur_get_page_cur(cursor));
|
||||
break;
|
||||
case BTR_PCUR_AFTER:
|
||||
page_cur_move_to_prev(btr_pcur_get_page_cur(cursor));
|
||||
break;
|
||||
#ifdef UNIV_DEBUG
|
||||
default:
|
||||
ut_error;
|
||||
#endif /* UNIV_DEBUG */
|
||||
}
|
||||
}
|
||||
|
||||
mem_heap_free(heap);
|
||||
|
|
|
@ -24,6 +24,8 @@ Created 1/8/1996 Heikki Tuuri
|
|||
***********************************************************************/
|
||||
|
||||
#include "dict0dict.h"
|
||||
#include "m_string.h"
|
||||
#include "my_sys.h"
|
||||
|
||||
#ifdef UNIV_NONINL
|
||||
#include "dict0dict.ic"
|
||||
|
@ -2272,6 +2274,8 @@ dict_foreign_free(
|
|||
/*==============*/
|
||||
dict_foreign_t* foreign) /*!< in, own: foreign key struct */
|
||||
{
|
||||
ut_a(foreign->foreign_table->n_foreign_key_checks_running == 0);
|
||||
|
||||
mem_heap_free(foreign->heap);
|
||||
}
|
||||
|
||||
|
@ -4267,16 +4271,27 @@ dict_update_statistics(
|
|||
(srv_force_recovery < SRV_FORCE_NO_IBUF_MERGE
|
||||
|| (srv_force_recovery < SRV_FORCE_NO_LOG_REDO
|
||||
&& dict_index_is_clust(index)))) {
|
||||
mtr_t mtr;
|
||||
ulint size;
|
||||
size = btr_get_size(index, BTR_TOTAL_SIZE);
|
||||
|
||||
index->stat_index_size = size;
|
||||
mtr_start(&mtr);
|
||||
mtr_s_lock(dict_index_get_lock(index), &mtr);
|
||||
|
||||
sum_of_index_sizes += size;
|
||||
size = btr_get_size(index, BTR_TOTAL_SIZE, &mtr);
|
||||
|
||||
size = btr_get_size(index, BTR_N_LEAF_PAGES);
|
||||
if (size != ULINT_UNDEFINED) {
|
||||
sum_of_index_sizes += size;
|
||||
index->stat_index_size = size;
|
||||
size = btr_get_size(
|
||||
index, BTR_N_LEAF_PAGES, &mtr);
|
||||
}
|
||||
|
||||
if (size == 0) {
|
||||
mtr_commit(&mtr);
|
||||
|
||||
switch (size) {
|
||||
case ULINT_UNDEFINED:
|
||||
goto fake_statistics;
|
||||
case 0:
|
||||
/* The root node of the tree is a leaf */
|
||||
size = 1;
|
||||
}
|
||||
|
@ -4293,6 +4308,7 @@ dict_update_statistics(
|
|||
various means, also via secondary indexes. */
|
||||
ulint i;
|
||||
|
||||
fake_statistics:
|
||||
sum_of_index_sizes++;
|
||||
index->stat_index_size = index->stat_n_leaf_pages = 1;
|
||||
|
||||
|
|
|
@ -175,7 +175,7 @@ struct fil_space_struct {
|
|||
.ibd file of tablespace and want to
|
||||
stop temporarily posting of new i/o
|
||||
requests on the file */
|
||||
ibool stop_ibuf_merges;
|
||||
ibool stop_new_ops;
|
||||
/*!< we set this TRUE when we start
|
||||
deleting a single-table tablespace */
|
||||
ibool is_being_deleted;
|
||||
|
@ -200,12 +200,13 @@ struct fil_space_struct {
|
|||
ulint n_pending_flushes; /*!< this is positive when flushing
|
||||
the tablespace to disk; dropping of the
|
||||
tablespace is forbidden if this is positive */
|
||||
ulint n_pending_ibuf_merges;/*!< this is positive
|
||||
when merging insert buffer entries to
|
||||
a page so that we may need to access
|
||||
the ibuf bitmap page in the
|
||||
tablespade: dropping of the tablespace
|
||||
is forbidden if this is positive */
|
||||
ulint n_pending_ops;/*!< this is positive when we
|
||||
have pending operations against this
|
||||
tablespace. The pending operations can
|
||||
be ibuf merges or lock validation code
|
||||
trying to read a block.
|
||||
Dropping of the tablespace is forbidden
|
||||
if this is positive */
|
||||
hash_node_t hash; /*!< hash chain node */
|
||||
hash_node_t name_hash;/*!< hash chain the name_hash table */
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
|
@ -1236,7 +1237,7 @@ try_again:
|
|||
}
|
||||
|
||||
space->stop_ios = FALSE;
|
||||
space->stop_ibuf_merges = FALSE;
|
||||
space->stop_new_ops = FALSE;
|
||||
space->is_being_deleted = FALSE;
|
||||
space->purpose = purpose;
|
||||
space->size = 0;
|
||||
|
@ -1245,7 +1246,7 @@ try_again:
|
|||
space->n_reserved_extents = 0;
|
||||
|
||||
space->n_pending_flushes = 0;
|
||||
space->n_pending_ibuf_merges = 0;
|
||||
space->n_pending_ops = 0;
|
||||
|
||||
UT_LIST_INIT(space->chain);
|
||||
space->magic_n = FIL_SPACE_MAGIC_N;
|
||||
|
@ -1836,13 +1837,12 @@ fil_read_flushed_lsn_and_arch_log_no(
|
|||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
/*******************************************************************//**
|
||||
Increments the count of pending insert buffer page merges, if space is not
|
||||
being deleted.
|
||||
@return TRUE if being deleted, and ibuf merges should be skipped */
|
||||
Increments the count of pending operation, if space is not being deleted.
|
||||
@return TRUE if being deleted, and operation should be skipped */
|
||||
UNIV_INTERN
|
||||
ibool
|
||||
fil_inc_pending_ibuf_merges(
|
||||
/*========================*/
|
||||
fil_inc_pending_ops(
|
||||
/*================*/
|
||||
ulint id) /*!< in: space id */
|
||||
{
|
||||
fil_space_t* space;
|
||||
|
@ -1858,13 +1858,13 @@ fil_inc_pending_ibuf_merges(
|
|||
(ulong) id);
|
||||
}
|
||||
|
||||
if (space == NULL || space->stop_ibuf_merges) {
|
||||
if (space == NULL || space->stop_new_ops) {
|
||||
mutex_exit(&fil_system->mutex);
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
space->n_pending_ibuf_merges++;
|
||||
space->n_pending_ops++;
|
||||
|
||||
mutex_exit(&fil_system->mutex);
|
||||
|
||||
|
@ -1872,11 +1872,11 @@ fil_inc_pending_ibuf_merges(
|
|||
}
|
||||
|
||||
/*******************************************************************//**
|
||||
Decrements the count of pending insert buffer page merges. */
|
||||
Decrements the count of pending operations. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
fil_decr_pending_ibuf_merges(
|
||||
/*=========================*/
|
||||
fil_decr_pending_ops(
|
||||
/*=================*/
|
||||
ulint id) /*!< in: space id */
|
||||
{
|
||||
fil_space_t* space;
|
||||
|
@ -1887,13 +1887,13 @@ fil_decr_pending_ibuf_merges(
|
|||
|
||||
if (space == NULL) {
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: decrementing ibuf merge of a"
|
||||
" dropped tablespace %lu\n",
|
||||
"InnoDB: Error: decrementing pending operation"
|
||||
" of a dropped tablespace %lu\n",
|
||||
(ulong) id);
|
||||
}
|
||||
|
||||
if (space != NULL) {
|
||||
space->n_pending_ibuf_merges--;
|
||||
space->n_pending_ops--;
|
||||
}
|
||||
|
||||
mutex_exit(&fil_system->mutex);
|
||||
|
@ -2183,15 +2183,15 @@ fil_delete_tablespace(
|
|||
char* path;
|
||||
|
||||
ut_a(id != 0);
|
||||
stop_ibuf_merges:
|
||||
stop_new_ops:
|
||||
mutex_enter(&fil_system->mutex);
|
||||
|
||||
space = fil_space_get_by_id(id);
|
||||
|
||||
if (space != NULL) {
|
||||
space->stop_ibuf_merges = TRUE;
|
||||
space->stop_new_ops = TRUE;
|
||||
|
||||
if (space->n_pending_ibuf_merges == 0) {
|
||||
if (space->n_pending_ops == 0) {
|
||||
mutex_exit(&fil_system->mutex);
|
||||
|
||||
count = 0;
|
||||
|
@ -2205,9 +2205,10 @@ stop_ibuf_merges:
|
|||
ut_print_filename(stderr, space->name);
|
||||
fprintf(stderr, ",\n"
|
||||
"InnoDB: but there are %lu pending"
|
||||
" ibuf merges on it.\n"
|
||||
" operations (most likely ibuf merges)"
|
||||
" on it.\n"
|
||||
"InnoDB: Loop %lu.\n",
|
||||
(ulong) space->n_pending_ibuf_merges,
|
||||
(ulong) space->n_pending_ops,
|
||||
(ulong) count);
|
||||
}
|
||||
|
||||
|
@ -2216,7 +2217,7 @@ stop_ibuf_merges:
|
|||
os_thread_sleep(20000);
|
||||
count++;
|
||||
|
||||
goto stop_ibuf_merges;
|
||||
goto stop_new_ops;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2242,7 +2243,7 @@ try_again:
|
|||
}
|
||||
|
||||
ut_a(space);
|
||||
ut_a(space->n_pending_ibuf_merges == 0);
|
||||
ut_a(space->n_pending_ops == 0);
|
||||
|
||||
space->is_being_deleted = TRUE;
|
||||
|
||||
|
|
|
@ -273,15 +273,13 @@ fseg_n_reserved_pages_low(
|
|||
/********************************************************************//**
|
||||
Marks a page used. The page must reside within the extents of the given
|
||||
segment. */
|
||||
static
|
||||
static __attribute__((nonnull))
|
||||
void
|
||||
fseg_mark_page_used(
|
||||
/*================*/
|
||||
fseg_inode_t* seg_inode,/*!< in: segment inode */
|
||||
ulint space, /*!< in: space id */
|
||||
ulint zip_size,/*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
ulint page, /*!< in: page offset */
|
||||
xdes_t* descr, /* extent descriptor */
|
||||
mtr_t* mtr); /*!< in: mtr */
|
||||
/**********************************************************************//**
|
||||
Returns the first extent descriptor for a segment. We think of the extent
|
||||
|
@ -705,12 +703,10 @@ xdes_calc_descriptor_index(
|
|||
|
||||
/********************************************************************//**
|
||||
Gets pointer to a the extent descriptor of a page. The page where the extent
|
||||
descriptor resides is x-locked. If the page offset is equal to the free limit
|
||||
of the space, adds new extents from above the free limit to the space free
|
||||
list, if not free limit == space size. This adding is necessary to make the
|
||||
descriptor defined, as they are uninitialized above the free limit.
|
||||
descriptor resides is x-locked. This function no longer extends the data
|
||||
file.
|
||||
@return pointer to the extent descriptor, NULL if the page does not
|
||||
exist in the space or if the offset exceeds the free limit */
|
||||
exist in the space or if the offset is >= the free limit */
|
||||
UNIV_INLINE __attribute__((nonnull, warn_unused_result))
|
||||
xdes_t*
|
||||
xdes_get_descriptor_with_space_hdr(
|
||||
|
@ -740,19 +736,10 @@ xdes_get_descriptor_with_space_hdr(
|
|||
zip_size = dict_table_flags_to_zip_size(
|
||||
mach_read_from_4(sp_header + FSP_SPACE_FLAGS));
|
||||
|
||||
/* If offset is >= size or > limit, return NULL */
|
||||
|
||||
if ((offset >= size) || (offset > limit)) {
|
||||
|
||||
if ((offset >= size) || (offset >= limit)) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
/* If offset is == limit, fill free list of the space. */
|
||||
|
||||
if (offset == limit) {
|
||||
fsp_fill_free_list(FALSE, space, sp_header, mtr);
|
||||
}
|
||||
|
||||
descr_page_no = xdes_calc_descriptor_page(zip_size, offset);
|
||||
|
||||
if (descr_page_no == 0) {
|
||||
|
@ -2877,7 +2864,7 @@ got_hinted_page:
|
|||
ut_ad(xdes_get_bit(ret_descr, XDES_FREE_BIT,
|
||||
ret_page % FSP_EXTENT_SIZE, mtr) == TRUE);
|
||||
|
||||
fseg_mark_page_used(seg_inode, space, zip_size, ret_page, mtr);
|
||||
fseg_mark_page_used(seg_inode, ret_page, ret_descr, mtr);
|
||||
}
|
||||
|
||||
return(fsp_page_create(
|
||||
|
@ -3283,27 +3270,21 @@ fsp_get_available_space_in_free_extents(
|
|||
/********************************************************************//**
|
||||
Marks a page used. The page must reside within the extents of the given
|
||||
segment. */
|
||||
static
|
||||
static __attribute__((nonnull))
|
||||
void
|
||||
fseg_mark_page_used(
|
||||
/*================*/
|
||||
fseg_inode_t* seg_inode,/*!< in: segment inode */
|
||||
ulint space, /*!< in: space id */
|
||||
ulint zip_size,/*!< in: compressed page size in bytes
|
||||
or 0 for uncompressed pages */
|
||||
ulint page, /*!< in: page offset */
|
||||
xdes_t* descr, /* extent descriptor */
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
{
|
||||
xdes_t* descr;
|
||||
ulint not_full_n_used;
|
||||
|
||||
ut_ad(seg_inode && mtr);
|
||||
ut_ad(!((page_offset(seg_inode) - FSEG_ARR_OFFSET) % FSEG_INODE_SIZE));
|
||||
ut_ad(mach_read_from_4(seg_inode + FSEG_MAGIC_N)
|
||||
== FSEG_MAGIC_N_VALUE);
|
||||
|
||||
descr = xdes_get_descriptor(space, zip_size, page, mtr);
|
||||
|
||||
ut_ad(mtr_read_ulint(seg_inode + FSEG_ID, MLOG_4BYTES, mtr)
|
||||
== mtr_read_ulint(descr + XDES_ID, MLOG_4BYTES, mtr));
|
||||
|
||||
|
|
|
@ -868,6 +868,9 @@ convert_error_code_to_mysql(
|
|||
case DB_OUT_OF_FILE_SPACE:
|
||||
return(HA_ERR_RECORD_FILE_FULL);
|
||||
|
||||
case DB_TABLE_IN_FK_CHECK:
|
||||
return(HA_ERR_TABLE_IN_FK_CHECK);
|
||||
|
||||
case DB_TABLE_IS_BEING_USED:
|
||||
return(HA_ERR_WRONG_COMMAND);
|
||||
|
||||
|
@ -5572,6 +5575,7 @@ ha_innobase::index_read(
|
|||
DBUG_ENTER("index_read");
|
||||
|
||||
ut_a(prebuilt->trx == thd_to_trx(user_thd));
|
||||
ut_ad(key_len != 0 || find_flag != HA_READ_KEY_EXACT);
|
||||
|
||||
ha_statistic_increment(&SSV::ha_read_key_count);
|
||||
|
||||
|
@ -6719,6 +6723,8 @@ ha_innobase::create(
|
|||
DBUG_RETURN(HA_ERR_TO_BIG_ROW);
|
||||
}
|
||||
|
||||
ut_a(strlen(name) < sizeof(name2));
|
||||
|
||||
strcpy(name2, name);
|
||||
|
||||
normalize_table_name(norm_name, name2);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2005, 2010, Innobase Oy. All Rights Reserved.
|
||||
Copyright (c) 2005, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
|
||||
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 the Free Software
|
||||
|
@ -11,8 +11,8 @@ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
|
@ -1010,7 +1010,9 @@ ha_innobase::prepare_drop_index(
|
|||
goto func_exit;
|
||||
}
|
||||
|
||||
rw_lock_x_lock(dict_index_get_lock(index));
|
||||
index->to_be_dropped = TRUE;
|
||||
rw_lock_x_unlock(dict_index_get_lock(index));
|
||||
}
|
||||
|
||||
/* If FOREIGN_KEY_CHECKS = 1 you may not drop an index defined
|
||||
|
@ -1129,7 +1131,9 @@ func_exit:
|
|||
= dict_table_get_first_index(prebuilt->table);
|
||||
|
||||
do {
|
||||
rw_lock_x_lock(dict_index_get_lock(index));
|
||||
index->to_be_dropped = FALSE;
|
||||
rw_lock_x_unlock(dict_index_get_lock(index));
|
||||
index = dict_table_get_next_index(index);
|
||||
} while (index);
|
||||
}
|
||||
|
@ -1189,7 +1193,9 @@ ha_innobase::final_drop_index(
|
|||
for (index = dict_table_get_first_index(prebuilt->table);
|
||||
index; index = dict_table_get_next_index(index)) {
|
||||
|
||||
rw_lock_x_lock(dict_index_get_lock(index));
|
||||
index->to_be_dropped = FALSE;
|
||||
rw_lock_x_unlock(dict_index_get_lock(index));
|
||||
}
|
||||
|
||||
goto func_exit;
|
||||
|
|
|
@ -3281,7 +3281,7 @@ ibuf_merge_or_delete_for_page(
|
|||
function. When the counter is > 0, that prevents tablespace
|
||||
from being dropped. */
|
||||
|
||||
tablespace_being_deleted = fil_inc_pending_ibuf_merges(space);
|
||||
tablespace_being_deleted = fil_inc_pending_ops(space);
|
||||
|
||||
if (UNIV_UNLIKELY(tablespace_being_deleted)) {
|
||||
/* Do not try to read the bitmap page from space;
|
||||
|
@ -3305,7 +3305,7 @@ ibuf_merge_or_delete_for_page(
|
|||
mtr_commit(&mtr);
|
||||
|
||||
if (!tablespace_being_deleted) {
|
||||
fil_decr_pending_ibuf_merges(space);
|
||||
fil_decr_pending_ops(space);
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -3537,7 +3537,7 @@ reset_bit:
|
|||
|
||||
if (update_ibuf_bitmap && !tablespace_being_deleted) {
|
||||
|
||||
fil_decr_pending_ibuf_merges(space);
|
||||
fil_decr_pending_ops(space);
|
||||
}
|
||||
|
||||
ibuf_exit();
|
||||
|
|
|
@ -536,13 +536,16 @@ btr_parse_page_reorganize(
|
|||
#ifndef UNIV_HOTBACKUP
|
||||
/**************************************************************//**
|
||||
Gets the number of pages in a B-tree.
|
||||
@return number of pages */
|
||||
@return number of pages, or ULINT_UNDEFINED if the index is unavailable */
|
||||
UNIV_INTERN
|
||||
ulint
|
||||
btr_get_size(
|
||||
/*=========*/
|
||||
dict_index_t* index, /*!< in: index */
|
||||
ulint flag); /*!< in: BTR_N_LEAF_PAGES or BTR_TOTAL_SIZE */
|
||||
ulint flag, /*!< in: BTR_N_LEAF_PAGES or BTR_TOTAL_SIZE */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction where index
|
||||
is s-latched */
|
||||
__attribute__((nonnull, warn_unused_result));
|
||||
/**************************************************************//**
|
||||
Allocates a new file page to be used in an index tree. NOTE: we assume
|
||||
that the caller has made the reservation for free extents!
|
||||
|
|
|
@ -97,6 +97,8 @@ enum db_err {
|
|||
DB_FOREIGN_EXCEED_MAX_CASCADE, /* Foreign key constraint related
|
||||
cascading delete/update exceeds
|
||||
maximum allowed depth */
|
||||
DB_TABLE_IN_FK_CHECK, /* table is being used in foreign
|
||||
key check */
|
||||
|
||||
/* The following are partial failure codes */
|
||||
DB_FAIL = 1000,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.
|
||||
Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
|
||||
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 the Free Software
|
||||
|
@ -11,8 +11,8 @@ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
|
@ -1018,14 +1018,6 @@ dict_index_get_page(
|
|||
/*================*/
|
||||
const dict_index_t* tree); /*!< in: index */
|
||||
/*********************************************************************//**
|
||||
Sets the page number of the root of index tree. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
dict_index_set_page(
|
||||
/*================*/
|
||||
dict_index_t* index, /*!< in/out: index */
|
||||
ulint page); /*!< in: page number */
|
||||
/*********************************************************************//**
|
||||
Gets the read-write lock of the index tree.
|
||||
@return read-write lock */
|
||||
UNIV_INLINE
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.
|
||||
Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
|
||||
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 the Free Software
|
||||
|
@ -11,8 +11,8 @@ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
|
@ -722,21 +722,6 @@ dict_index_get_page(
|
|||
return(index->page);
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
Sets the page number of the root of index tree. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
dict_index_set_page(
|
||||
/*================*/
|
||||
dict_index_t* index, /*!< in/out: index */
|
||||
ulint page) /*!< in: page number */
|
||||
{
|
||||
ut_ad(index);
|
||||
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
||||
|
||||
index->page = page;
|
||||
}
|
||||
|
||||
/*********************************************************************//**
|
||||
Gets the read-write lock of the index tree.
|
||||
@return read-write lock */
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1996, 2009, Innobase Oy. All Rights Reserved.
|
||||
Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
|
||||
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 the Free Software
|
||||
|
@ -11,8 +11,8 @@ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
|
@ -305,7 +305,9 @@ struct dict_index_struct{
|
|||
unsigned to_be_dropped:1;
|
||||
/*!< TRUE if this index is marked to be
|
||||
dropped in ha_innobase::prepare_drop_index(),
|
||||
otherwise FALSE */
|
||||
otherwise FALSE. Protected by
|
||||
dict_sys->mutex, dict_operation_lock and
|
||||
index->lock.*/
|
||||
dict_field_t* fields; /*!< array of field descriptions */
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
UT_LIST_NODE_T(dict_index_t)
|
||||
|
|
|
@ -340,20 +340,19 @@ fil_read_flushed_lsn_and_arch_log_no(
|
|||
ib_uint64_t* min_flushed_lsn, /*!< in/out: */
|
||||
ib_uint64_t* max_flushed_lsn); /*!< in/out: */
|
||||
/*******************************************************************//**
|
||||
Increments the count of pending insert buffer page merges, if space is not
|
||||
being deleted.
|
||||
@return TRUE if being deleted, and ibuf merges should be skipped */
|
||||
Increments the count of pending operation, if space is not being deleted.
|
||||
@return TRUE if being deleted, and operation should be skipped */
|
||||
UNIV_INTERN
|
||||
ibool
|
||||
fil_inc_pending_ibuf_merges(
|
||||
/*========================*/
|
||||
fil_inc_pending_ops(
|
||||
/*================*/
|
||||
ulint id); /*!< in: space id */
|
||||
/*******************************************************************//**
|
||||
Decrements the count of pending insert buffer page merges. */
|
||||
Decrements the count of pending operations. */
|
||||
UNIV_INTERN
|
||||
void
|
||||
fil_decr_pending_ibuf_merges(
|
||||
/*=========================*/
|
||||
fil_decr_pending_ops(
|
||||
/*=================*/
|
||||
ulint id); /*!< in: space id */
|
||||
#endif /* !UNIV_HOTBACKUP */
|
||||
/*******************************************************************//**
|
||||
|
|
|
@ -564,8 +564,6 @@ rw_lock_x_unlock_func(
|
|||
if (lock->lock_word == 0) {
|
||||
/* Last caller in a possible recursive chain. */
|
||||
lock->recursive = FALSE;
|
||||
UNIV_MEM_INVALID(&lock->writer_thread,
|
||||
sizeof lock->writer_thread);
|
||||
}
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
|
@ -606,8 +604,6 @@ rw_lock_x_unlock_direct(
|
|||
|
||||
if (lock->lock_word == 0) {
|
||||
lock->recursive = FALSE;
|
||||
UNIV_MEM_INVALID(&lock->writer_thread,
|
||||
sizeof lock->writer_thread);
|
||||
}
|
||||
|
||||
#ifdef UNIV_SYNC_DEBUG
|
||||
|
|
|
@ -140,9 +140,9 @@ struct trx_purge_struct{
|
|||
read_view_t* view; /*!< The purge will not remove undo logs
|
||||
which are >= this view (purge view) */
|
||||
mutex_t mutex; /*!< Mutex protecting the fields below */
|
||||
ulint n_pages_handled;/*!< Approximate number of undo log
|
||||
ulonglong n_pages_handled;/*!< Approximate number of undo log
|
||||
pages processed in purge */
|
||||
ulint handle_limit; /*!< Target of how many pages to get
|
||||
ulonglong handle_limit; /*!< Target of how many pages to get
|
||||
processed in the current purge */
|
||||
/*------------------------------*/
|
||||
/* The following two fields form the 'purge pointer' which advances
|
||||
|
|
|
@ -5040,9 +5040,17 @@ lock_validate(void)
|
|||
|
||||
lock_mutex_exit_kernel();
|
||||
|
||||
lock_rec_validate_page(space,
|
||||
fil_space_get_zip_size(space),
|
||||
page_no);
|
||||
/* Make sure that the tablespace is not
|
||||
deleted while we are trying to access
|
||||
the page. */
|
||||
if (!fil_inc_pending_ops(space)) {
|
||||
lock_rec_validate_page(
|
||||
space,
|
||||
fil_space_get_zip_size(space),
|
||||
page_no);
|
||||
|
||||
fil_decr_pending_ops(space);
|
||||
}
|
||||
|
||||
lock_mutex_enter_kernel();
|
||||
|
||||
|
|
|
@ -1102,6 +1102,9 @@ row_ins_foreign_check_on_constraint(
|
|||
release the latch. */
|
||||
|
||||
row_mysql_unfreeze_data_dictionary(thr_get_trx(thr));
|
||||
|
||||
DEBUG_SYNC_C("innodb_dml_cascade_dict_unfreeze");
|
||||
|
||||
row_mysql_freeze_data_dictionary(thr_get_trx(thr));
|
||||
|
||||
mtr_start(mtr);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
||||
|
||||
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 the Free Software
|
||||
|
@ -11,8 +11,8 @@ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|||
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along with
|
||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
|
@ -52,6 +52,14 @@ Created 9/17/2000 Heikki Tuuri
|
|||
#include "fil0fil.h"
|
||||
#include "ibuf0ibuf.h"
|
||||
|
||||
#ifdef __WIN__
|
||||
/* error LNK2001: unresolved external symbol _debug_sync_C_callback_ptr */
|
||||
# define DEBUG_SYNC_C(dummy) ((void) 0)
|
||||
#else
|
||||
# include "m_string.h" /* for my_sys.h */
|
||||
# include "my_sys.h" /* DEBUG_SYNC_C */
|
||||
#endif
|
||||
|
||||
/** Provide optional 4.x backwards compatibility for 5.0 and above */
|
||||
UNIV_INTERN ibool row_rollback_on_timeout = FALSE;
|
||||
|
||||
|
@ -1350,6 +1358,8 @@ row_update_for_mysql(
|
|||
return(DB_ERROR);
|
||||
}
|
||||
|
||||
DEBUG_SYNC_C("innodb_row_update_for_mysql_begin");
|
||||
|
||||
trx->op_info = "updating or deleting";
|
||||
|
||||
row_mysql_delay_if_needed();
|
||||
|
@ -3013,6 +3023,7 @@ row_drop_table_for_mysql(
|
|||
{
|
||||
dict_foreign_t* foreign;
|
||||
dict_table_t* table;
|
||||
dict_index_t* index;
|
||||
ulint space_id;
|
||||
ulint err;
|
||||
const char* table_name;
|
||||
|
@ -3219,6 +3230,18 @@ check_next_foreign:
|
|||
trx_set_dict_operation(trx, TRX_DICT_OP_TABLE);
|
||||
trx->table_id = table->id;
|
||||
|
||||
/* Mark all indexes unavailable in the data dictionary cache
|
||||
before starting to drop the table. */
|
||||
|
||||
for (index = dict_table_get_first_index(table);
|
||||
index != NULL;
|
||||
index = dict_table_get_next_index(index)) {
|
||||
rw_lock_x_lock(dict_index_get_lock(index));
|
||||
ut_ad(!index->to_be_dropped);
|
||||
index->to_be_dropped = TRUE;
|
||||
rw_lock_x_unlock(dict_index_get_lock(index));
|
||||
}
|
||||
|
||||
/* We use the private SQL parser of Innobase to generate the
|
||||
query graphs needed in deleting the dictionary data from system
|
||||
tables in Innobase. Deleting a row from SYS_INDEXES table also
|
||||
|
@ -3384,6 +3407,17 @@ check_next_foreign:
|
|||
the undo log. We can directly exit here
|
||||
and return the DB_TOO_MANY_CONCURRENT_TRXS
|
||||
error. */
|
||||
|
||||
/* Mark all indexes available in the data dictionary
|
||||
cache again. */
|
||||
|
||||
for (index = dict_table_get_first_index(table);
|
||||
index != NULL;
|
||||
index = dict_table_get_next_index(index)) {
|
||||
rw_lock_x_lock(dict_index_get_lock(index));
|
||||
index->to_be_dropped = FALSE;
|
||||
rw_lock_x_unlock(dict_index_get_lock(index));
|
||||
}
|
||||
break;
|
||||
|
||||
case DB_OUT_OF_FILE_SPACE:
|
||||
|
@ -3741,6 +3775,7 @@ row_rename_table_for_mysql(
|
|||
ulint n_constraints_to_drop = 0;
|
||||
ibool old_is_tmp, new_is_tmp;
|
||||
pars_info_t* info = NULL;
|
||||
ulint retry = 0;
|
||||
|
||||
ut_ad(trx->mysql_thread_id == os_thread_get_curr_id());
|
||||
ut_a(old_name != NULL);
|
||||
|
@ -3824,6 +3859,25 @@ row_rename_table_for_mysql(
|
|||
}
|
||||
}
|
||||
|
||||
/* Is a foreign key check running on this table? */
|
||||
for (retry = 0; retry < 100
|
||||
&& table->n_foreign_key_checks_running > 0; ++retry) {
|
||||
row_mysql_unlock_data_dictionary(trx);
|
||||
os_thread_yield();
|
||||
row_mysql_lock_data_dictionary(trx);
|
||||
}
|
||||
|
||||
if (table->n_foreign_key_checks_running > 0) {
|
||||
ut_print_timestamp(stderr);
|
||||
fputs(" InnoDB: Error: in ALTER TABLE ", stderr);
|
||||
ut_print_name(stderr, trx, TRUE, old_name);
|
||||
fprintf(stderr, "\n"
|
||||
"InnoDB: a FOREIGN KEY check is running.\n"
|
||||
"InnoDB: Cannot rename table.\n");
|
||||
err = DB_TABLE_IN_FK_CHECK;
|
||||
goto funct_exit;
|
||||
}
|
||||
|
||||
/* We use the private SQL parser of Innobase to generate the query
|
||||
graphs needed in updating the dictionary data from system tables. */
|
||||
|
||||
|
|
|
@ -245,15 +245,11 @@ row_build(
|
|||
#if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG
|
||||
if (rec_offs_any_null_extern(rec, offsets)) {
|
||||
/* This condition can occur during crash recovery
|
||||
before trx_rollback_active() has completed execution.
|
||||
|
||||
This condition is possible if the server crashed
|
||||
during an insert or update-by-delete-and-insert before
|
||||
btr_store_big_rec_extern_fields() did mtr_commit() all
|
||||
BLOB pointers to the freshly inserted clustered index
|
||||
record. */
|
||||
ut_a(trx_assert_recovered(
|
||||
row_get_rec_trx_id(rec, index, offsets)));
|
||||
before trx_rollback_active() has completed execution,
|
||||
or when a concurrently executing
|
||||
row_ins_index_entry_low() has committed the B-tree
|
||||
mini-transaction but has not yet managed to restore
|
||||
the cursor position for writing the big_rec. */
|
||||
ut_a(trx_undo_roll_ptr_is_insert(
|
||||
row_get_rec_roll_ptr(rec, index, offsets)));
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue