mariadb/mysql-test/r/rpl_misc_functions.result
unknown bcba75df42 Bug #25543 Replication of wrong values if using rand() in stored procedure
When rand() is called multiple times inside a stored procedure, the server does 
not binlog the correct random seed values.

This patch corrects the problem by resetting rand_used= 0 in 
THD::cleanup_after_query() allowing the system to save the random seeds if needed
for each command in a stored procedure body.

However, rand_used is not reset if executing in a stored function or trigger 
because these operations are binlogged by call and thus only the calling statement
need detect the call to rand() made by its substatements. These substatements must 
not set rand_used to 0 because it would remove the detection of rand() by the 
calling statement.


mysql-test/r/rpl_misc_functions.result:
  Bug #25543 Replication of wrong values if using rand() in stored procedure
  
  The result file was modified to include the correct processing of the new
  additions to the test. The results from execution are written to files on 
  both the master and the slave. The files are compared to ensure the values 
  from rand() generated on the master are correctly generated on the slave.
mysql-test/t/rpl_misc_functions.test:
  Bug #25543 Replication of wrong values if using rand() in stored procedure
  
  The test was modified to include a test of a stored procedure that calls
  the rand() function multiple times. 
  
  The results from execution are written to files on both the master and the
  slave. The files are compared to ensure the values from rand() generated
  on the master are correctly generated on the slave.
sql/sql_class.cc:
  Bug #25543 Replication of wrong values if using rand() in stored procedure
  
  The code was modified to reset rand_used so that detection of calls to rand() 
  will save random seeds if needed by the slave.
2007-03-09 12:18:28 -05:00

46 lines
1.7 KiB
Text

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;
create table t1(id int, i int, r1 int, r2 int, p varchar(100));
insert into t1 values(1, connection_id(), 0, 0, "");
insert into t1 values(2, 0, rand()*1000, rand()*1000, "");
set sql_log_bin=0;
insert into t1 values(6, 0, rand(), rand(), "");
delete from t1 where id=6;
set sql_log_bin=1;
insert into t1 values(3, 0, 0, 0, password('does_this_work?'));
insert into t1 values(4, connection_id(), rand()*1000, rand()*1000, password('does_this_still_work?'));
select * into outfile 'rpl_misc_functions.outfile' from t1;
create table t2 like t1;
load data local infile 'MYSQLTEST_VARDIR/master-data/test/rpl_misc_functions.outfile' into table t2;
select * from t1, t2 where (t1.id=t2.id) and not(t1.i=t2.i and t1.r1=t2.r1 and t1.r2=t2.r2 and t1.p=t2.p);
id i r1 r2 p id i r1 r2 p
drop table t1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (col_a double default NULL);
CREATE PROCEDURE test_replication_sp1()
BEGIN
INSERT INTO t1 VALUES (rand()), (rand());
INSERT INTO t1 VALUES (rand());
END|
CREATE PROCEDURE test_replication_sp2()
BEGIN
CALL test_replication_sp1();
CALL test_replication_sp1();
END|
CREATE FUNCTION test_replication_sf() RETURNS DOUBLE DETERMINISTIC
BEGIN
RETURN (rand() + rand());
END|
CALL test_replication_sp1();
CALL test_replication_sp2();
INSERT INTO t1 VALUES (test_replication_sf());
INSERT INTO t1 VALUES (test_replication_sf());
INSERT INTO t1 VALUES (test_replication_sf());
DROP PROCEDURE IF EXISTS test_replication_sp1;
DROP PROCEDURE IF EXISTS test_replication_sp2;
DROP FUNCTION IF EXISTS test_replication_sf;
DROP TABLE IF EXISTS t1;