A fix and a test case for Bug#14077 "Failure to replicate a stored

function with a cursor". Enable execution of SELECT queries in SP on slave.


mysql-test/r/rpl_sp.result:
  Test results were fixed (Bug#14077).
mysql-test/t/rpl_sp.test:
  Add a test case for Bug#14077 "Failure to replicate a stored 
  function with a cursor".
sql/sql_parse.cc:
  Do not rewrite SELECTs with DOs on slave: if this SELECT was for a stored
  routine cursor, slave must be able to execute the SELECT in order to
  open a cursor.
  At the moment the bug is present only in stored functions and stored
  procedures called from stored functions, because, due to
  stored procedure unfolding for replication, top level stored procedures
  are never executed on slave.
This commit is contained in:
unknown 2005-11-17 03:15:10 +03:00
parent 4d89977269
commit b67076102b
3 changed files with 61 additions and 12 deletions

View file

@ -375,3 +375,28 @@ drop procedure foo;
drop function fn1;
drop database mysqltest1;
drop user "zedjzlcsjhd"@127.0.0.1;
use test;
use test;
drop function if exists f1;
create function f1() returns int reads sql data
begin
declare var integer;
declare c cursor for select a from v1;
open c;
fetch c into var;
close c;
return var;
end|
create view v1 as select 1 as a;
create table t1 (a int);
insert into t1 (a) values (f1());
select * from t1;
a
1
drop view v1;
drop function f1;
select * from t1;
a
1
drop table t1;
reset master;

View file

@ -360,4 +360,40 @@ connection master;
drop function fn1;
drop database mysqltest1;
drop user "zedjzlcsjhd"@127.0.0.1;
use test;
sync_slave_with_master;
use test;
#
# Bug#14077 "Failure to replicate a stored function with a cursor":
# verify that stored routines with cursors work on slave.
#
connection master;
--disable_warnings
drop function if exists f1;
--enable_warnings
delimiter |;
create function f1() returns int reads sql data
begin
declare var integer;
declare c cursor for select a from v1;
open c;
fetch c into var;
close c;
return var;
end|
delimiter ;|
create view v1 as select 1 as a;
create table t1 (a int);
insert into t1 (a) values (f1());
select * from t1;
drop view v1;
drop function f1;
sync_slave_with_master;
connection slave;
select * from t1;
# cleanup
connection master;
drop table t1;
reset master;

View file

@ -2403,18 +2403,6 @@ mysql_execute_command(THD *thd)
reset_one_shot_variables(thd);
DBUG_RETURN(0);
}
#ifndef TO_BE_DELETED
/*
This is a workaround to deal with the shortcoming in 3.23.44-3.23.46
masters in RELEASE_LOCK() logging. We re-write SELECT RELEASE_LOCK()
as DO RELEASE_LOCK()
*/
if (lex->sql_command == SQLCOM_SELECT)
{
lex->sql_command = SQLCOM_DO;
lex->insert_list = &select_lex->item_list;
}
#endif
}
else
#endif /* HAVE_REPLICATION */