mirror of
https://github.com/MariaDB/server.git
synced 2025-01-20 05:52:27 +01:00
4dc7be62a9
Problem: When RAND() is binlogged in statement mode, the seed is binlogged too, so the replication slave generates the same sequence of random numbers. This makes replication work in many cases, but not in all cases: the order of rows is not guaranteed for, e.g., UPDATE or INSERT...SELECT statements, so the row data will be different if master and slave retrieve the rows in different orders. Fix: Mark RAND() as unsafe. It will generate a warning if binlog_format=STATEMENT and switch to row-logging if binlog_format=ROW. mysql-test/extra/rpl_tests/rpl_row_func003.test: updated test case to ignore new warnings mysql-test/suite/binlog/r/binlog_unsafe.result: updated result file mysql-test/suite/binlog/t/binlog_unsafe.test: Added test for RAND(). Also clarified some old comments. mysql-test/suite/rpl/r/rpl_misc_functions.result: updated result file mysql-test/suite/rpl/r/rpl_nondeterministic_functions.result: updated test case to ignore new warnings mysql-test/suite/rpl/r/rpl_optimize.result: updated result file mysql-test/suite/rpl/r/rpl_row_func003.result: updated result file mysql-test/suite/rpl/t/rpl_misc_functions.test: updated test case to ignore new warnings mysql-test/suite/rpl/t/rpl_nondeterministic_functions.test: updated test case to ignore new warnings mysql-test/suite/rpl/t/rpl_optimize.test: updated test case to ignore new warnings mysql-test/suite/rpl/t/rpl_trigger.test: updated test case to ignore new warnings mysql-test/suite/rpl_ndb/r/rpl_ndb_func003.result: updated result file sql/item_create.cc: Mark RAND() unsafe.
57 lines
1.5 KiB
Text
57 lines
1.5 KiB
Text
# ==== Purpose ====
|
|
#
|
|
# Test that nondeterministic system functions are correctly replicated.
|
|
#
|
|
# (Some functions are only correctly replicated if binlog_format=MIXED
|
|
# or ROW. See binlog_unsafe.test for a test that those variables are
|
|
# indeed unsafe.)
|
|
#
|
|
# ==== Implementation ====
|
|
#
|
|
# We insert the values of each unsafe function into a table. Then we
|
|
# replicate and check that the table is identical on slave.
|
|
#
|
|
# ==== Related bugs ====
|
|
#
|
|
# BUG#47995
|
|
|
|
--source include/master-slave.inc
|
|
|
|
CALL mtr.add_suppression('Statement may not be safe to log in statement format.');
|
|
|
|
CREATE TABLE t1 (a VARCHAR(1000));
|
|
|
|
# We replicate the connection_id in the query_log_event
|
|
INSERT INTO t1 VALUES (CONNECTION_ID());
|
|
--connection master1
|
|
INSERT INTO t1 VALUES (CONNECTION_ID());
|
|
|
|
# We replicate the TIMESTAMP variable, so the following functions that
|
|
# are affected by the TIMESTAMP variable should be safe to replicate.
|
|
INSERT INTO t1 VALUES
|
|
(CURDATE()),
|
|
(CURRENT_DATE()),
|
|
(CURRENT_TIME()),
|
|
(CURRENT_TIMESTAMP()),
|
|
(CURTIME()),
|
|
(LOCALTIME()),
|
|
(LOCALTIMESTAMP()),
|
|
(NOW()),
|
|
(UNIX_TIMESTAMP()),
|
|
(UTC_DATE()),
|
|
(UTC_TIME()),
|
|
(UTC_TIMESTAMP());
|
|
|
|
# We replicate the random seed in a rand_log_event
|
|
--disable_warnings
|
|
INSERT INTO t1 VALUES (RAND());
|
|
--enable_warnings
|
|
# We replicate the last_insert_id in an intvar_log_event
|
|
INSERT INTO t1 VALUES (LAST_INSERT_ID());
|
|
|
|
--sync_slave_with_master
|
|
--let $diff_table_1= master:test.t1
|
|
--let $diff_table_2= slave:test.t1
|
|
--source include/diff_tables.inc
|
|
|
|
DROP TABLE t1;
|