mirror of
https://github.com/MariaDB/server.git
synced 2025-11-06 13:10:12 +03:00
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.
49 lines
1.4 KiB
Plaintext
49 lines
1.4 KiB
Plaintext
source include/master-slave.inc;
|
|
|
|
CALL mtr.add_suppression("Statement may not be safe to log in statement format.");
|
|
|
|
create table t1(n int);
|
|
# Use of get_lock gives a warning for unsafeness if binlog_format=statement
|
|
--disable_warnings
|
|
insert into t1 values(get_lock("lock",2));
|
|
--enable_warnings
|
|
dirty_close master;
|
|
connection master1;
|
|
select get_lock("lock",2);
|
|
|
|
select release_lock("lock");
|
|
#ignore
|
|
disable_query_log;
|
|
let $1=2000;
|
|
while ($1)
|
|
{
|
|
do get_lock("lock",2);
|
|
do release_lock("lock");
|
|
dec $1;
|
|
}
|
|
enable_query_log;
|
|
save_master_pos;
|
|
connection slave;
|
|
sync_with_master;
|
|
select get_lock("lock",3);
|
|
select * from t1;
|
|
# There is no point in testing REPLICATIION of the IS_*_LOCK
|
|
# functions; slave does not run with the same concurrency context as
|
|
# master (generally in slave we can't know that on master this lock
|
|
# was already held by another connection and so that the the
|
|
# get_lock() we're replicating timed out on master hence returned 0,
|
|
# or that the is_free_lock() we're playing returned 0 etc.
|
|
# But here all we do is test these functions outside of replication.
|
|
select is_free_lock("lock"), is_used_lock("lock") = connection_id();
|
|
explain extended select is_free_lock("lock"), is_used_lock("lock");
|
|
# Check lock functions
|
|
select is_free_lock("lock2");
|
|
select is_free_lock(NULL);
|
|
connection master1;
|
|
drop table t1;
|
|
save_master_pos;
|
|
connection slave;
|
|
sync_with_master;
|
|
|
|
# End of 4.1 tests
|