stop slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; reset master; reset slave; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; start slave; ==== Initialize ==== **** On Master **** CREATE TABLE t1 (a INT); CREATE TABLE logtbl (sect INT, test INT, count INT); INSERT INTO t1 VALUES (1),(2),(3); INSERT INTO t1 SELECT 2*a+3 FROM t1; INSERT INTO t1 SELECT 2*a+3 FROM t1; INSERT INTO t1 SELECT 2*a+3 FROM t1; INSERT INTO t1 SELECT 2*a+3 FROM t1; INSERT INTO t1 SELECT 2*a+3 FROM t1; INSERT INTO t1 SELECT 2*a+3 FROM t1; ==== Simple test ==== SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1; a 7 SELECT FOUND_ROWS() INTO @a; INSERT INTO logtbl VALUES(1,1,@a); SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1; a 1 SELECT FOUND_ROWS() INTO @a; INSERT INTO logtbl VALUES(1,2,@a); SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test; sect test count 1 1 183 1 2 3 **** On Slave **** SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test; sect test count 1 1 183 1 2 3 ==== Stored procedure ==== **** On Master **** CREATE PROCEDURE calc_and_log(sect INT, test INT) BEGIN DECLARE cnt INT; SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1; SELECT FOUND_ROWS() INTO cnt; INSERT INTO logtbl VALUES(sect,test,cnt); SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1; SELECT FOUND_ROWS() INTO cnt; INSERT INTO logtbl VALUES(sect,test+1,cnt); END $$ CALL calc_and_log(2,1); a 1 a 7 Warnings: Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Reason for unsafeness: Statement uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted. Note 1592 Unsafe statement binlogged in statement format since BINLOG_FORMAT = STATEMENT. Reason for unsafeness: Statement uses a system function whose value may differ on slave. CREATE PROCEDURE just_log(sect INT, test INT, found_rows INT) BEGIN INSERT INTO logtbl VALUES (sect,test,found_rows); END $$ SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1; a 7 SELECT FOUND_ROWS() INTO @found_rows; CALL just_log(2,3,@found_rows); SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test; sect test count 2 1 3 2 2 183 2 3 183 **** On Slave **** SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test; sect test count 2 1 3 2 2 183 2 3 183 ==== Stored functions ==== **** On Master **** CREATE FUNCTION log_rows(sect INT, test INT, found_rows INT) RETURNS INT BEGIN INSERT INTO logtbl VALUES(sect,test,found_rows); RETURN found_rows; END $$ SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1; a 7 SELECT FOUND_ROWS() INTO @found_rows; SELECT log_rows(3,1,@found_rows), log_rows(3,2,@found_rows); log_rows(3,1,@found_rows) log_rows(3,2,@found_rows) 183 183 SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test; sect test count 3 1 183 3 2 183 **** On Slave **** SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test; sect test count 3 1 183 3 2 183 ==== Cleanup ==== **** On Master **** DROP TABLE t1, logtbl; DROP PROCEDURE just_log; DROP PROCEDURE calc_and_log; DROP FUNCTION log_rows; **** Resetting master and slave **** include/stop_slave.inc RESET SLAVE; RESET MASTER; include/start_slave.inc