merge mysql-5.5->mysql-5.5-security
This commit is contained in:
commit
2a91c8de82
@ -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 = 204800;
|
||||
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;
|
||||
|
3
mysql-test/include/show_slave_hosts.inc
Normal file
3
mysql-test/include/show_slave_hosts.inc
Normal file
@ -0,0 +1,3 @@
|
||||
--replace_result $SLAVE_MYPORT SLAVE_PORT $DEFAULT_MASTER_PORT DEFAULT_PORT
|
||||
--replace_regex /[0-9, a-f]{8}-[0-9, a-f]{4}-[0-9, a-f]{4}-[0-9, a-f]{4}-[0-9, a-f]{12}/SLAVE_UUID/
|
||||
SHOW SLAVE HOSTS;
|
@ -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);
|
||||
@ -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,7 +219,7 @@ 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;
|
||||
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
||||
BEGIN;
|
||||
|
@ -778,4 +778,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
|
||||
|
@ -915,7 +915,7 @@ relay-log-space-limit 0
|
||||
replicate-same-server-id FALSE
|
||||
report-host (No default value)
|
||||
report-password (No default value)
|
||||
report-port 3306
|
||||
report-port 0
|
||||
report-user (No default value)
|
||||
rpl-recovery-rank 0
|
||||
safe-user-create FALSE
|
||||
|
@ -923,7 +923,7 @@ relay-log-space-limit 0
|
||||
replicate-same-server-id FALSE
|
||||
report-host (No default value)
|
||||
report-password (No default value)
|
||||
report-port 3306
|
||||
report-port 0
|
||||
report-user (No default value)
|
||||
rpl-recovery-rank 0
|
||||
safe-user-create FALSE
|
||||
|
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 = 204800;
|
||||
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;
|
@ -533,3 +533,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
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -1,26 +0,0 @@
|
||||
--eval create table t1(a int not null, b int, c char(10), d varchar(20), primary key (a)) engine = innodb default charset=$charset
|
||||
insert into t1 values (1,1,'ab','ab'),(2,2,'ac','ac'),(3,2,'ad','ad'),(4,4,'afe','afe');
|
||||
commit;
|
||||
--error ER_DUP_ENTRY
|
||||
alter table t1 add unique index (b);
|
||||
insert into t1 values(8,9,'fff','fff');
|
||||
select * from t1;
|
||||
show create table t1;
|
||||
alter table t1 add index (b);
|
||||
insert into t1 values(10,10,'kkk','iii');
|
||||
select * from t1;
|
||||
select * from t1 force index(b) order by b;
|
||||
explain select * from t1 force index(b) order by b;
|
||||
show create table t1;
|
||||
alter table t1 add unique index (c), add index (d);
|
||||
insert into t1 values(11,11,'aaa','mmm');
|
||||
select * from t1;
|
||||
select * from t1 force index(b) order by b;
|
||||
select * from t1 force index(c) order by c;
|
||||
select * from t1 force index(d) order by d;
|
||||
explain select * from t1 force index(b) order by b;
|
||||
explain select * from t1 force index(c) order by c;
|
||||
explain select * from t1 force index(d) order by d;
|
||||
show create table t1;
|
||||
check table t1;
|
||||
drop table t1;
|
@ -9,6 +9,7 @@
|
||||
-- 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`;
|
||||
|
15
mysql-test/suite/rpl/r/rpl_report_port.result
Normal file
15
mysql-test/suite/rpl/r/rpl_report_port.result
Normal file
@ -0,0 +1,15 @@
|
||||
include/master-slave.inc
|
||||
[connection master]
|
||||
[The default value shown for the slave's port number is the actual port number of the slave]
|
||||
SHOW SLAVE HOSTS;
|
||||
Server_id Host Port Master_id
|
||||
2 127.0.0.1 SLAVE_PORT 1
|
||||
[The default value shown for the slave's port number is the actual port number of the slave]
|
||||
include/rpl_restart_server.inc [server_number=2 parameters: --report-port=9000]
|
||||
include/start_slave.inc
|
||||
[Slave restarted with the report-port set to some value]
|
||||
[The value shown for the slave's port number is 9000 which is the value set for report-port]
|
||||
SHOW SLAVE HOSTS;
|
||||
Server_id Host Port Master_id
|
||||
2 127.0.0.1 9000 1
|
||||
include/rpl_end.inc
|
@ -6,7 +6,7 @@ START SLAVE IO_THREAD;
|
||||
include/wait_for_slave_io_to_start.inc
|
||||
SHOW SLAVE HOSTS;
|
||||
Server_id Host Port Master_id
|
||||
3 slave2 DEFAULT_PORT 1
|
||||
3 slave2 SLAVE_PORT 1
|
||||
2 SLAVE_PORT 1
|
||||
include/stop_slave_io.inc
|
||||
SHOW SLAVE HOSTS;
|
||||
|
1
mysql-test/suite/rpl/t/rpl_report_port-slave.opt
Normal file
1
mysql-test/suite/rpl/t/rpl_report_port-slave.opt
Normal file
@ -0,0 +1 @@
|
||||
--report-port=
|
59
mysql-test/suite/rpl/t/rpl_report_port.test
Normal file
59
mysql-test/suite/rpl/t/rpl_report_port.test
Normal file
@ -0,0 +1,59 @@
|
||||
#
|
||||
#BUG#13333431 : INCORRECT DEFAULT PORT IN 'SHOW SLAVE HOSTS' OUTPUT
|
||||
#
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# The test show the default value printed for the slave's port number if the
|
||||
# --report-port= <some value> is not set on the slave. This is different from
|
||||
# the present scenario which show 3306 as the default value if the report-port
|
||||
# is not set on the slave.
|
||||
#
|
||||
#====Method====
|
||||
#
|
||||
# Start replication with report port not set.This will give the actual port
|
||||
# number of the slave (ie. SLAVE_PORT) for the on doing SHOW SLAVE HOSTS on
|
||||
# the master.
|
||||
# Restart the slave server with report port set to 9000 and start the slave.
|
||||
# In this case on doing SHOW SLAVE HOSTS on the master, we get the port number
|
||||
# of the slave to be 9000.
|
||||
|
||||
source include/master-slave.inc;
|
||||
|
||||
connection master;
|
||||
|
||||
--echo [The default value shown for the slave's port number is the actual port number of the slave]
|
||||
source include/show_slave_hosts.inc;
|
||||
|
||||
# SLAVE_PORT is the value of the port we should get.
|
||||
|
||||
let $show_statement= SHOW SLAVE HOSTS;
|
||||
let $field= Port;
|
||||
let $condition= 'SLAVE_PORT';
|
||||
source include/wait_show_condition.inc;
|
||||
--echo [The default value shown for the slave's port number is the actual port number of the slave]
|
||||
|
||||
# Start the server with some value being passed to the report_port= <option>
|
||||
# this will be used incase we have to mask the value of the slave's port
|
||||
# number in certain situations.
|
||||
|
||||
--let $rpl_server_number= 2
|
||||
--let $rpl_server_parameters= --report-port=9000
|
||||
--source include/rpl_restart_server.inc
|
||||
|
||||
connection slave;
|
||||
--source include/start_slave.inc
|
||||
|
||||
--echo [Slave restarted with the report-port set to some value]
|
||||
connection master;
|
||||
|
||||
--echo [The value shown for the slave's port number is 9000 which is the value set for report-port]
|
||||
--source include/show_slave_hosts.inc
|
||||
|
||||
# 9000 is the value of the port we should get.
|
||||
|
||||
let $show_statement= SHOW SLAVE HOSTS;
|
||||
let $field= Port;
|
||||
let $condition= '9000';
|
||||
source include/wait_show_condition.inc;
|
||||
|
||||
--source include/rpl_end.inc
|
@ -25,6 +25,7 @@ let $field= Server_id;
|
||||
# 3 is server_id of slave2.
|
||||
let $condition= ='3';
|
||||
source include/wait_show_condition.inc;
|
||||
--replace_column 3 'SLAVE_PORT'
|
||||
--replace_result $SLAVE_MYPORT SLAVE_PORT $DEFAULT_MASTER_PORT DEFAULT_PORT
|
||||
SHOW SLAVE HOSTS;
|
||||
|
||||
|
@ -2,18 +2,19 @@
|
||||
#
|
||||
# only global
|
||||
#
|
||||
--replace_result $DEFAULT_MASTER_PORT DEFAULT_MASTER_PORT
|
||||
--replace_regex s/[0-9]+/DEFAULT_MASTER_PORT/
|
||||
select @@global.report_port;
|
||||
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
|
||||
select @@session.report_port;
|
||||
--replace_result $DEFAULT_MASTER_PORT DEFAULT_MASTER_PORT
|
||||
--replace_column 2 'DEFAULT_MASTER_PORT'
|
||||
show global variables like 'report_port';
|
||||
--replace_result $DEFAULT_MASTER_PORT DEFAULT_MASTER_PORT
|
||||
--replace_column 2 'DEFAULT_MASTER_PORT'
|
||||
show session variables like 'report_port';
|
||||
--replace_result $DEFAULT_MASTER_PORT DEFAULT_MASTER_PORT
|
||||
--replace_column 2 'DEFAULT_MASTER_PORT'
|
||||
select * from information_schema.global_variables where variable_name='report_port';
|
||||
--replace_result $DEFAULT_MASTER_PORT DEFAULT_MASTER_PORT
|
||||
--replace_column 2 'DEFAULT_MASTER_PORT'
|
||||
select * from information_schema.session_variables where variable_name='report_port';
|
||||
--replace_column 2 'DEFAULT_MASTER_PORT'
|
||||
|
||||
#
|
||||
# show that it's read-only
|
||||
|
@ -1 +0,0 @@
|
||||
--query_cache_size=1M
|
@ -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
|
||||
|
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
|
@ -359,3 +359,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
|
||||
|
@ -166,7 +166,7 @@ void my_print_stacktrace(uchar* stack_bottom __attribute__((unused)),
|
||||
my_safe_printf_stderr("%s",
|
||||
"Error when traversing the stack, stack appears corrupt.\n");
|
||||
else
|
||||
my_safe_printf_stderr("%s"
|
||||
my_safe_printf_stderr("%s",
|
||||
"Please read "
|
||||
"http://dev.mysql.com/doc/refman/5.1/en/resolve-stack-dump.html\n"
|
||||
"and follow instructions on how to resolve the stack trace.\n"
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright (c) 2005, 2011, Oracle and/or its affiliates. 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
|
||||
|
@ -2,7 +2,7 @@
|
||||
#define HA_PARTITION_INCLUDED
|
||||
|
||||
/*
|
||||
Copyright (c) 2005, 2011, Oracle and/or its affiliates. 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
|
||||
@ -541,6 +541,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;
|
||||
|
@ -3291,7 +3291,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:
|
||||
@ -3329,7 +3329,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:
|
||||
@ -3462,7 +3463,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);
|
||||
}
|
||||
}
|
||||
|
@ -1948,7 +1948,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);
|
||||
|
||||
|
@ -271,7 +271,7 @@ public:
|
||||
Item_in_optimizer(Item *a, Item_in_subselect *b):
|
||||
Item_bool_func(a, 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();
|
||||
|
@ -585,7 +585,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;
|
||||
@ -600,8 +600,25 @@ append_query_string(CHARSET_INFO *csinfo,
|
||||
else
|
||||
{
|
||||
*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);
|
||||
|
@ -4082,7 +4082,7 @@ private:
|
||||
};
|
||||
#endif
|
||||
|
||||
int append_query_string(CHARSET_INFO *csinfo,
|
||||
int append_query_string(THD *thd, CHARSET_INFO *csinfo,
|
||||
String const *from, String *to);
|
||||
|
||||
/**
|
||||
|
@ -656,7 +656,7 @@ int mysqld_server_started= 0;
|
||||
File_parser_dummy_hook file_parser_dummy_hook;
|
||||
|
||||
/* replication parameters, if master_host is not NULL, we are a slave */
|
||||
uint report_port= MYSQL_PORT;
|
||||
uint report_port= 0;
|
||||
ulong master_retry_count=0;
|
||||
char *master_info_file;
|
||||
char *relay_log_info_file, *report_user, *report_password, *report_host;
|
||||
@ -1784,6 +1784,11 @@ static void network_init(void)
|
||||
|
||||
set_ports();
|
||||
|
||||
if (report_port == 0)
|
||||
{
|
||||
report_port= mysqld_port;
|
||||
}
|
||||
DBUG_ASSERT(report_port != 0);
|
||||
if (mysqld_port != 0 && !opt_disable_networking && !opt_bootstrap)
|
||||
{
|
||||
struct addrinfo *ai, *a;
|
||||
@ -2406,10 +2411,6 @@ static void check_data_home(const char *path)
|
||||
|
||||
#endif /* __WIN__ */
|
||||
|
||||
#ifdef HAVE_LINUXTHREADS
|
||||
#define UNSAFE_DEFAULT_LINUX_THREADS 200
|
||||
#endif
|
||||
|
||||
|
||||
#if BACKTRACE_DEMANGLE
|
||||
#include <cxxabi.h>
|
||||
|
@ -131,6 +131,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(
|
||||
|
@ -169,7 +169,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('\'');
|
||||
|
@ -885,7 +885,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 */
|
||||
|
||||
@ -1059,7 +1059,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 */
|
||||
|
||||
@ -1205,7 +1205,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 */
|
||||
|
@ -2768,7 +2768,7 @@ static Sys_var_uint Sys_repl_report_port(
|
||||
"port or if you have a special tunnel from the master or other clients "
|
||||
"to the slave. If not sure, leave this option unset",
|
||||
READ_ONLY GLOBAL_VAR(report_port), CMD_LINE(REQUIRED_ARG),
|
||||
VALID_RANGE(0, UINT_MAX), DEFAULT(MYSQL_PORT), BLOCK_SIZE(1));
|
||||
VALID_RANGE(0, UINT_MAX), DEFAULT(0), BLOCK_SIZE(1));
|
||||
#endif
|
||||
|
||||
static Sys_var_mybool Sys_keep_files_on_create(
|
||||
|
@ -1012,45 +1012,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
|
||||
@ -133,6 +133,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;
|
||||
|
||||
@ -325,13 +327,20 @@ 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;
|
||||
#ifdef UNIV_DEBUG
|
||||
default:
|
||||
ut_error;
|
||||
#endif /* UNIV_DEBUG */
|
||||
}
|
||||
|
||||
btr_pcur_open_with_no_init_func(index, tuple, mode, latch_mode,
|
||||
@ -340,19 +349,24 @@ 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 =
|
||||
btr_pcur_get_block(cursor);
|
||||
cursor->modify_clock =
|
||||
buf_block_get_modify_clock(
|
||||
cursor->block_when_stored);
|
||||
cursor->old_stored = BTR_PCUR_OLD_STORED;
|
||||
|
||||
@ -361,6 +375,20 @@ btr_pcur_restore_position_func(
|
||||
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);
|
||||
|
||||
/* We have to store new position information, modify_clock etc.,
|
||||
|
@ -4341,16 +4341,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);
|
||||
|
||||
size = btr_get_size(index, BTR_TOTAL_SIZE, &mtr);
|
||||
|
||||
if (size != ULINT_UNDEFINED) {
|
||||
sum_of_index_sizes += size;
|
||||
index->stat_index_size = size;
|
||||
size = btr_get_size(
|
||||
index, BTR_N_LEAF_PAGES, &mtr);
|
||||
}
|
||||
|
||||
size = btr_get_size(index, BTR_N_LEAF_PAGES);
|
||||
mtr_commit(&mtr);
|
||||
|
||||
if (size == 0) {
|
||||
switch (size) {
|
||||
case ULINT_UNDEFINED:
|
||||
goto fake_statistics;
|
||||
case 0:
|
||||
/* The root node of the tree is a leaf */
|
||||
size = 1;
|
||||
}
|
||||
@ -4367,6 +4378,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;
|
||||
|
||||
|
@ -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
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@ -1143,7 +1143,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
|
||||
@ -1262,7 +1264,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);
|
||||
}
|
||||
@ -1322,7 +1326,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;
|
||||
|
@ -567,13 +567,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!
|
||||
|
@ -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
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@ -1087,14 +1087,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
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@ -761,21 +761,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, 2010, 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
|
||||
|
||||
*****************************************************************************/
|
||||
|
||||
@ -396,7 +396,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)
|
||||
|
@ -90,7 +90,7 @@ rw_lock_set_waiter_flag(
|
||||
rw_lock_t* lock) /*!< in/out: rw-lock */
|
||||
{
|
||||
#ifdef INNODB_RW_LOCKS_USE_ATOMICS
|
||||
os_compare_and_swap_ulint(&lock->waiters, 0, 1);
|
||||
(void) os_compare_and_swap_ulint(&lock->waiters, 0, 1);
|
||||
#else /* INNODB_RW_LOCKS_USE_ATOMICS */
|
||||
lock->waiters = 1;
|
||||
#endif /* INNODB_RW_LOCKS_USE_ATOMICS */
|
||||
@ -107,7 +107,7 @@ rw_lock_reset_waiter_flag(
|
||||
rw_lock_t* lock) /*!< in/out: rw-lock */
|
||||
{
|
||||
#ifdef INNODB_RW_LOCKS_USE_ATOMICS
|
||||
os_compare_and_swap_ulint(&lock->waiters, 1, 0);
|
||||
(void) os_compare_and_swap_ulint(&lock->waiters, 1, 0);
|
||||
#else /* INNODB_RW_LOCKS_USE_ATOMICS */
|
||||
lock->waiters = 0;
|
||||
#endif /* INNODB_RW_LOCKS_USE_ATOMICS */
|
||||
|
@ -1599,22 +1599,29 @@ row_merge(
|
||||
const dict_index_t* index, /*!< in: index being created */
|
||||
merge_file_t* file, /*!< in/out: file containing
|
||||
index entries */
|
||||
ulint* half, /*!< in/out: half the file */
|
||||
row_merge_block_t* block, /*!< in/out: 3 buffers */
|
||||
int* tmpfd, /*!< in/out: temporary file handle */
|
||||
struct TABLE* table) /*!< in/out: MySQL table, for
|
||||
struct TABLE* table, /*!< in/out: MySQL table, for
|
||||
reporting erroneous key value
|
||||
if applicable */
|
||||
ulint* num_run,/*!< in/out: Number of runs remain
|
||||
to be merged */
|
||||
ulint* run_offset) /*!< in/out: Array contains the
|
||||
first offset number for each merge
|
||||
run */
|
||||
{
|
||||
ulint foffs0; /*!< first input offset */
|
||||
ulint foffs1; /*!< second input offset */
|
||||
ulint error; /*!< error code */
|
||||
merge_file_t of; /*!< output file */
|
||||
const ulint ihalf = *half;
|
||||
const ulint ihalf = run_offset[*num_run / 2];
|
||||
/*!< half the input file */
|
||||
ulint ohalf; /*!< half the output file */
|
||||
ulint n_run = 0;
|
||||
/*!< num of runs generated from this merge */
|
||||
|
||||
|
||||
UNIV_MEM_ASSERT_W(block[0], 3 * sizeof block[0]);
|
||||
|
||||
ut_ad(ihalf < file->offset);
|
||||
|
||||
of.fd = *tmpfd;
|
||||
@ -1630,17 +1637,20 @@ row_merge(
|
||||
#endif /* POSIX_FADV_SEQUENTIAL */
|
||||
|
||||
/* Merge blocks to the output file. */
|
||||
ohalf = 0;
|
||||
foffs0 = 0;
|
||||
foffs1 = ihalf;
|
||||
|
||||
UNIV_MEM_INVALID(run_offset, *num_run * sizeof *run_offset);
|
||||
|
||||
for (; foffs0 < ihalf && foffs1 < file->offset; foffs0++, foffs1++) {
|
||||
ulint ahalf; /*!< arithmetic half the input file */
|
||||
|
||||
if (UNIV_UNLIKELY(trx_is_interrupted(trx))) {
|
||||
return(DB_INTERRUPTED);
|
||||
}
|
||||
|
||||
/* Remember the offset number for this run */
|
||||
run_offset[n_run++] = of.offset;
|
||||
|
||||
error = row_merge_blocks(index, file, block,
|
||||
&foffs0, &foffs1, &of, table);
|
||||
|
||||
@ -1648,21 +1658,6 @@ row_merge(
|
||||
return(error);
|
||||
}
|
||||
|
||||
/* Record the offset of the output file when
|
||||
approximately half the output has been generated. In
|
||||
this way, the next invocation of row_merge() will
|
||||
spend most of the time in this loop. The initial
|
||||
estimate is ohalf==0. */
|
||||
ahalf = file->offset / 2;
|
||||
ut_ad(ohalf <= of.offset);
|
||||
|
||||
/* Improve the estimate until reaching half the input
|
||||
file size, or we can not get any closer to it. All
|
||||
comparands should be non-negative when !(ohalf < ahalf)
|
||||
because ohalf <= of.offset. */
|
||||
if (ohalf < ahalf || of.offset - ahalf < ohalf - ahalf) {
|
||||
ohalf = of.offset;
|
||||
}
|
||||
}
|
||||
|
||||
/* Copy the last blocks, if there are any. */
|
||||
@ -1672,6 +1667,9 @@ row_merge(
|
||||
return(DB_INTERRUPTED);
|
||||
}
|
||||
|
||||
/* Remember the offset number for this run */
|
||||
run_offset[n_run++] = of.offset;
|
||||
|
||||
if (!row_merge_blocks_copy(index, file, block, &foffs0, &of)) {
|
||||
return(DB_CORRUPTION);
|
||||
}
|
||||
@ -1684,6 +1682,9 @@ row_merge(
|
||||
return(DB_INTERRUPTED);
|
||||
}
|
||||
|
||||
/* Remember the offset number for this run */
|
||||
run_offset[n_run++] = of.offset;
|
||||
|
||||
if (!row_merge_blocks_copy(index, file, block, &foffs1, &of)) {
|
||||
return(DB_CORRUPTION);
|
||||
}
|
||||
@ -1695,10 +1696,23 @@ row_merge(
|
||||
return(DB_CORRUPTION);
|
||||
}
|
||||
|
||||
ut_ad(n_run <= *num_run);
|
||||
|
||||
*num_run = n_run;
|
||||
|
||||
/* Each run can contain one or more offsets. As merge goes on,
|
||||
the number of runs (to merge) will reduce until we have one
|
||||
single run. So the number of runs will always be smaller than
|
||||
the number of offsets in file */
|
||||
ut_ad((*num_run) <= file->offset);
|
||||
|
||||
/* The number of offsets in output file is always equal or
|
||||
smaller than input file */
|
||||
ut_ad(of.offset <= file->offset);
|
||||
|
||||
/* Swap file descriptors for the next pass. */
|
||||
*tmpfd = file->fd;
|
||||
*file = of;
|
||||
*half = ohalf;
|
||||
|
||||
UNIV_MEM_INVALID(block[0], 3 * sizeof block[0]);
|
||||
|
||||
@ -1723,27 +1737,44 @@ row_merge_sort(
|
||||
if applicable */
|
||||
{
|
||||
ulint half = file->offset / 2;
|
||||
ulint num_runs;
|
||||
ulint* run_offset;
|
||||
ulint error = DB_SUCCESS;
|
||||
|
||||
/* Record the number of merge runs we need to perform */
|
||||
num_runs = file->offset;
|
||||
|
||||
/* If num_runs are less than 1, nothing to merge */
|
||||
if (num_runs <= 1) {
|
||||
return(error);
|
||||
}
|
||||
|
||||
/* "run_offset" records each run's first offset number */
|
||||
run_offset = (ulint*) mem_alloc(file->offset * sizeof(ulint));
|
||||
|
||||
/* This tells row_merge() where to start for the first round
|
||||
of merge. */
|
||||
run_offset[half] = half;
|
||||
|
||||
/* The file should always contain at least one byte (the end
|
||||
of file marker). Thus, it must be at least one block. */
|
||||
ut_ad(file->offset > 0);
|
||||
|
||||
/* Merge the runs until we have one big run */
|
||||
do {
|
||||
ulint error;
|
||||
error = row_merge(trx, index, file, block, tmpfd,
|
||||
table, &num_runs, run_offset);
|
||||
|
||||
error = row_merge(trx, index, file, &half,
|
||||
block, tmpfd, table);
|
||||
UNIV_MEM_ASSERT_RW(run_offset, num_runs * sizeof *run_offset);
|
||||
|
||||
if (error != DB_SUCCESS) {
|
||||
return(error);
|
||||
break;
|
||||
}
|
||||
} while (num_runs > 1);
|
||||
|
||||
/* half > 0 should hold except when the file consists
|
||||
of one block. No need to merge further then. */
|
||||
ut_ad(half > 0 || file->offset == 1);
|
||||
} while (half < file->offset && half > 0);
|
||||
mem_free(run_offset);
|
||||
|
||||
return(DB_SUCCESS);
|
||||
return(error);
|
||||
}
|
||||
|
||||
/*************************************************************//**
|
||||
|
@ -3080,6 +3080,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;
|
||||
@ -3287,6 +3288,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
|
||||
@ -3452,6 +3465,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:
|
||||
|
@ -244,15 +244,11 @@ row_build(
|
||||
#ifdef UNIV_BLOB_NULL_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)));
|
||||
}
|
||||
|
@ -117,7 +117,7 @@ int mi_munmap_file(MI_INFO *info)
|
||||
{
|
||||
int ret;
|
||||
DBUG_ENTER("mi_unmap_file");
|
||||
if ((ret= my_munmap(info->s->file_map, info->s->mmaped_length)))
|
||||
if ((ret= my_munmap((void*) info->s->file_map, info->s->mmaped_length)))
|
||||
DBUG_RETURN(ret);
|
||||
info->s->file_read= mi_nommap_pread;
|
||||
info->s->file_write= mi_nommap_pwrite;
|
||||
|
Loading…
x
Reference in New Issue
Block a user