From b67076102b62454e5560cd5a7a484366b47eb984 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 17 Nov 2005 03:15:10 +0300 Subject: [PATCH] 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. --- mysql-test/r/rpl_sp.result | 25 +++++++++++++++++++++++++ mysql-test/t/rpl_sp.test | 36 ++++++++++++++++++++++++++++++++++++ sql/sql_parse.cc | 12 ------------ 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/mysql-test/r/rpl_sp.result b/mysql-test/r/rpl_sp.result index ba840caf6c2..41bcfc7d72c 100644 --- a/mysql-test/r/rpl_sp.result +++ b/mysql-test/r/rpl_sp.result @@ -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; diff --git a/mysql-test/t/rpl_sp.test b/mysql-test/t/rpl_sp.test index e7a3afca9cb..386582f8f1b 100644 --- a/mysql-test/t/rpl_sp.test +++ b/mysql-test/t/rpl_sp.test @@ -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; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index c19d54feda5..1e6810e0036 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -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 */