Commit b6707610 authored by unknown's avatar unknown

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.
parent 4d899772
...@@ -375,3 +375,28 @@ drop procedure foo; ...@@ -375,3 +375,28 @@ drop procedure foo;
drop function fn1; drop function fn1;
drop database mysqltest1; drop database mysqltest1;
drop user "zedjzlcsjhd"@127.0.0.1; 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;
...@@ -360,4 +360,40 @@ connection master; ...@@ -360,4 +360,40 @@ connection master;
drop function fn1; drop function fn1;
drop database mysqltest1; drop database mysqltest1;
drop user "zedjzlcsjhd"@127.0.0.1; drop user "zedjzlcsjhd"@127.0.0.1;
use test;
sync_slave_with_master; 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;
...@@ -2403,18 +2403,6 @@ mysql_execute_command(THD *thd) ...@@ -2403,18 +2403,6 @@ mysql_execute_command(THD *thd)
reset_one_shot_variables(thd); reset_one_shot_variables(thd);
DBUG_RETURN(0); 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 else
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment