mirror of
https://github.com/MariaDB/server.git
synced 2025-01-24 15:54:37 +01:00
2f78abd21b
Problem: Some system functions that could return different values on master and slave were not marked unsafe. In particular: GET_LOCK IS_FREE_LOCK IS_USED_LOCK MASTER_POS_WAIT RELEASE_LOCK SLEEP SYSDATE VERSION Fix: Mark these functions unsafe. mysql-test/extra/rpl_tests/rpl_stm_000001.test: - The test does not work in mixed mode any more, since it tries to simulate an error in the sql thread in a query that uses get_lock. Since get_lock now causes the query to be logged in row format, the error didn't happen. Hence, we now force statement mode. - Warnings must be disabled when the unsafe query is issued. - Replaced some save_master_pos+connection slave+sync_with_master by sync_slave_with_master. mysql-test/suite/binlog/r/binlog_stm_mix_innodb_myisam.result: updated result file mysql-test/suite/binlog/r/binlog_stm_row.result: updated result file mysql-test/suite/binlog/r/binlog_unsafe.result: updated result file mysql-test/suite/binlog/t/binlog_killed.test: binlog_killed only works in statement format now, since it switches to row mode in mixed mode. mysql-test/suite/binlog/t/binlog_stm_mix_innodb_myisam.test: suppress warnings for unsafe statements mysql-test/suite/binlog/t/binlog_stm_row.test: - Suppress warnings in test that causes warnings. - The test sets binlog format explicitly, so no need to execute it twice. mysql-test/suite/binlog/t/binlog_unsafe.test: Added test for all unsafe system functions. This test also includes system functions that were unsafe prior to BUG#47995. mysql-test/suite/rpl/r/rpl_err_ignoredtable.result: updated result file mysql-test/suite/rpl/r/rpl_get_lock.result: updated result file mysql-test/suite/rpl/r/rpl_nondeterministic_functions.result: new result file mysql-test/suite/rpl/r/rpl_stm_000001.result: updated result file mysql-test/suite/rpl/r/rpl_trigger.result: updated result file mysql-test/suite/rpl/t/rpl_err_ignoredtable.test: - suppress warnings for unsafe statement - replaced save_master_pos+connection slave+sync_with_master with sync_slave_with_master mysql-test/suite/rpl/t/rpl_get_lock.test: update test case that causes new warnings mysql-test/suite/rpl/t/rpl_nondeterministic_functions.test: Added new test case for nondeterministic functions. mysql-test/suite/rpl/t/rpl_trigger.test: update test case that causes new warnings sql/item_create.cc: Marked some system functions unsafe. sql/item_strfunc.cc: Clarified comment related to this bug. sql/sql_yacc.yy: Marked sysdate unsafe.
131 lines
3.6 KiB
Text
131 lines
3.6 KiB
Text
# Requires binlog_format=statement format since query involving
|
|
# get_lock() is logged in row format if binlog_format=mixed or row.
|
|
-- source include/have_binlog_format_statement.inc
|
|
-- source include/master-slave.inc
|
|
|
|
CALL mtr.add_suppression("Statement may not be safe to log in statement format.");
|
|
|
|
# Load some data into t1
|
|
create table t1 (word char(20) not null);
|
|
load data infile '../../std_data/words.dat' into table t1;
|
|
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
|
eval load data local infile '$MYSQL_TEST_DIR/std_data/words.dat' into table t1;
|
|
select * from t1 limit 10;
|
|
|
|
#
|
|
# Test slave with wrong password
|
|
#
|
|
sync_slave_with_master;
|
|
stop slave;
|
|
connection master;
|
|
set password for root@"localhost" = password('foo');
|
|
connection slave;
|
|
start slave;
|
|
connection master;
|
|
#
|
|
# Give slave time to do at last one failed connect retry
|
|
# This one must be short so that the slave will not stop retrying
|
|
real_sleep 2;
|
|
set password for root@"localhost" = password('');
|
|
# Give slave time to connect (will retry every second)
|
|
sleep 2;
|
|
|
|
create table t3(n int);
|
|
insert into t3 values(1),(2);
|
|
sync_slave_with_master;
|
|
select * from t3;
|
|
select sum(length(word)) from t1;
|
|
connection master;
|
|
drop table t1,t3;
|
|
sync_slave_with_master;
|
|
|
|
# Test if the slave SQL thread can be more than 16K behind the slave
|
|
# I/O thread (> IO_SIZE)
|
|
|
|
connection master;
|
|
# we'll use table-level locking to delay slave SQL thread
|
|
eval create table t1 (n int) engine=$engine_type;
|
|
sync_slave_with_master;
|
|
connection master;
|
|
reset master;
|
|
connection slave;
|
|
stop slave;
|
|
reset slave;
|
|
|
|
connection master;
|
|
let $1=5000;
|
|
# Generate 16K of relay log
|
|
disable_query_log;
|
|
while ($1)
|
|
{
|
|
eval insert into t1 values($1);
|
|
dec $1;
|
|
}
|
|
enable_query_log;
|
|
|
|
# Try to cause a large relay log lag on the slave by locking t1
|
|
connection slave;
|
|
lock tables t1 read;
|
|
start slave;
|
|
#hope this is long enough for I/O thread to fetch over 16K relay log data
|
|
sleep 3;
|
|
unlock tables;
|
|
|
|
#test handling of aborted connection in the middle of update
|
|
|
|
connection master;
|
|
create table t2(id int);
|
|
insert into t2 values(connection_id());
|
|
|
|
connection master1;
|
|
# Avoid generating result
|
|
create temporary table t3(n int);
|
|
--disable_warnings
|
|
insert into t3 select get_lock('crash_lock%20C', 1) from t2;
|
|
--enable_warnings
|
|
|
|
connection master;
|
|
send update t1 set n = n + get_lock('crash_lock%20C', 2);
|
|
connection master1;
|
|
sleep 3;
|
|
select (@id := id) - id from t2;
|
|
kill @id;
|
|
# We don't drop t3 as this is a temporary table
|
|
drop table t2;
|
|
connection master;
|
|
# The get_lock function causes warning for unsafe statement.
|
|
--disable_warnings
|
|
--error 1317,2013
|
|
reap;
|
|
--enable_warnings
|
|
connection slave;
|
|
# The SQL slave thread should now have stopped because the query was killed on
|
|
# the master (so it has a non-zero error code in the binlog).
|
|
--source include/wait_for_slave_sql_to_stop.inc
|
|
|
|
# The following test can't be done because the result of Pos will differ
|
|
# on different computers
|
|
# --replace_result $MASTER_MYPORT MASTER_PORT
|
|
# show slave status;
|
|
|
|
set global sql_slave_skip_counter=1;
|
|
start slave;
|
|
select count(*) from t1;
|
|
connection master1;
|
|
drop table t1;
|
|
create table t1 (n int);
|
|
insert into t1 values(3456);
|
|
insert into mysql.user (Host, User, Password)
|
|
VALUES ("10.10.10.%", "blafasel2", password("blafasel2"));
|
|
select select_priv,user from mysql.user where user = _binary'blafasel2';
|
|
update mysql.user set Select_priv = "Y" where User= _binary"blafasel2";
|
|
select select_priv,user from mysql.user where user = _binary'blafasel2';
|
|
sync_slave_with_master;
|
|
select n from t1;
|
|
select select_priv,user from mysql.user where user = _binary'blafasel2';
|
|
connection master1;
|
|
drop table t1;
|
|
delete from mysql.user where user="blafasel2";
|
|
sync_slave_with_master;
|
|
|
|
# End of 4.1 tests
|