summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <tnurnberg@salvation.intern.azundris.com>2006-11-15 01:58:11 +0100
committerunknown <tnurnberg@salvation.intern.azundris.com>2006-11-15 01:58:11 +0100
commitf3a877abbc98c3535dd9494dd4c990a34cd9ca34 (patch)
tree522abe3e314f3a08cbd8378de88ae77db565473c
parent266bf3390c80e72fecdcec3712dfad18c4bf6b5b (diff)
parentbeea1235469f3de2d703e5a413f06675d9a67c48 (diff)
downloadmariadb-git-f3a877abbc98c3535dd9494dd4c990a34cd9ca34.tar.gz
Merge tnurnberg@bk-internal.mysql.com:/home/bk/mysql-5.1-maint
into salvation.intern.azundris.com:/home/tnurnberg/work/mysql-5.1-maint-16456 mysql-test/r/func_time.result: Auto merged mysql-test/t/disabled.def: Auto merged sql/item_func.cc: Auto merged sql/sql_parse.cc: Auto merged
-rw-r--r--mysql-test/r/rpl_sp.result32
-rw-r--r--mysql-test/t/disabled.def1
-rw-r--r--mysql-test/t/rpl_sp.test33
-rw-r--r--sql/item_func.cc12
-rw-r--r--sql/sql_parse.cc12
5 files changed, 82 insertions, 8 deletions
diff --git a/mysql-test/r/rpl_sp.result b/mysql-test/r/rpl_sp.result
index 261e7cb072c..acad2975055 100644
--- a/mysql-test/r/rpl_sp.result
+++ b/mysql-test/r/rpl_sp.result
@@ -104,10 +104,10 @@ begin
insert into t2 values(20),(20);
end|
call foo4();
-ERROR 23000: Duplicate entry '20' for key 1
+ERROR 23000: Duplicate entry '20' for key 'a'
show warnings;
Level Code Message
-Error 1062 Duplicate entry '20' for key 1
+Error 1062 Duplicate entry '20' for key 'a'
select * from t2;
a
20
@@ -124,6 +124,9 @@ select * from mysql.proc where name="foo4" and db='mysqltest1';
db name type specific_name language sql_data_access is_deterministic security_type param_list returns body definer created modified sql_mode comment
select * from mysql.proc where name="foo4" and db='mysqltest1';
db name type specific_name language sql_data_access is_deterministic security_type param_list returns body definer created modified sql_mode comment
+set binlog_format=STATEMENT;
+call foo();
+ERROR HY000: Slave running with --log-slave-updates must use row-based binary logging to be able to replicate row-based binary log events
drop procedure foo;
drop procedure foo2;
drop procedure foo3;
@@ -181,7 +184,7 @@ end|
ERROR HY000: You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
set global log_bin_trust_routine_creators=1;
Warnings:
-Warning 1287 'log_bin_trust_routine_creators' is deprecated; use 'log_bin_trust_function_creators' instead
+Warning 1541 The syntax 'log_bin_trust_routine_creators' is deprecated and will be removed in MySQL 5.2. Please use 'log_bin_trust_function_creators' instead
set global log_bin_trust_function_creators=0;
set global log_bin_trust_function_creators=1;
set global log_bin_trust_function_creators=1;
@@ -241,9 +244,9 @@ return 10;
end|
do fn1(100);
Warnings:
-Error 1062 Duplicate entry '100' for key 1
+Error 1062 Duplicate entry '100' for key 'a'
select fn1(20);
-ERROR 23000: Duplicate entry '20' for key 1
+ERROR 23000: Duplicate entry '20' for key 'a'
select * from t2;
a
20
@@ -252,8 +255,17 @@ select * from t2;
a
20
100
+set binlog_format=STATEMENT;
+create function fn16456()
+returns int
+begin
+return unix_timestamp();
+end|
+select fn16456();
+ERROR HY000: Slave running with --log-slave-updates must use row-based binary logging to be able to replicate row-based binary log events
+drop function fn16456;
create trigger trg before insert on t1 for each row set new.a= 10;
-ERROR 42000: Access denied; you need the SUPER privilege for this operation
+ERROR 42000: TRIGGER command denied to user 'zedjzlcsjhd'@'localhost' for table 't1'
delete from t1;
create trigger trg before insert on t1 for each row set new.a= 10;
insert into t1 values (1);
@@ -364,6 +376,12 @@ return 10;
end
master-bin.000001 # Query 1 # use `mysqltest1`; SELECT `fn1`(100)
master-bin.000001 # Query 1 # use `mysqltest1`; SELECT `fn1`(20)
+master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function fn16456()
+returns int
+begin
+return unix_timestamp();
+end
+master-bin.000001 # Query 1 # use `mysqltest1`; drop function fn16456
master-bin.000001 # Query 1 # use `mysqltest1`; delete from t1
master-bin.000001 # Query 1 # use `mysqltest1`; CREATE DEFINER=`root`@`localhost` trigger trg before insert on t1 for each row set new.a= 10
master-bin.000001 # Query 1 # use `mysqltest1`; insert into t1 values (1)
@@ -465,3 +483,5 @@ RETURN 0
DROP PROCEDURE p1;
DROP FUNCTION f1;
drop table t1;
+End of 5.0 tests
+End of 5.1 tests
diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def
index 0d3b7cdfdeb..51f9625e239 100644
--- a/mysql-test/t/disabled.def
+++ b/mysql-test/t/disabled.def
@@ -25,7 +25,6 @@ rpl_ndb_ddl : BUG#18946 result file needs update + test needs to ch
rpl_ndb_innodb2ndb : Bug #19710 Cluster replication to partition table fails on DELETE FROM statement
rpl_ndb_myisam2ndb : Bug #19710 Cluster replication to partition table fails on DELETE FROM statement
rpl_row_blob_innodb : BUG#18980 2006-04-10 kent Test fails randomly
-rpl_sp : BUG#16456 2006-02-16 jmiller
rpl_multi_engine : BUG#22583 2006-09-23 lars
# the below testcase have been reworked to avoid the bug, test contains comment, keep bug open
diff --git a/mysql-test/t/rpl_sp.test b/mysql-test/t/rpl_sp.test
index 22ab72df104..7066a77b70e 100644
--- a/mysql-test/t/rpl_sp.test
+++ b/mysql-test/t/rpl_sp.test
@@ -8,6 +8,7 @@
# still accepted (this test also checks that the new name is
# accepted). The old name could be removed in 5.1 or 6.0.
+source include/have_binlog_format_mixed.inc;
source include/master-slave.inc;
# we need a db != test, where we don't have automatic grants
@@ -172,6 +173,15 @@ select * from mysql.proc where name="foo4" and db='mysqltest1';
sync_slave_with_master;
select * from mysql.proc where name="foo4" and db='mysqltest1';
+# fail if non-deterministic SP is called in SBR, bug#16456
+let $oblf=`select @@SESSION.BINLOG_FORMAT`;
+set binlog_format=STATEMENT;
+--error ER_BINLOG_ROW_RBR_TO_SBR
+call foo();
+--disable_query_log
+eval set binlog_format=$oblf;
+--enable_query_log
+
# ********************** PART 2 : FUNCTIONS ***************
connection master;
@@ -316,10 +326,31 @@ sync_slave_with_master;
# check that this failed-in-the-middle replicated right:
select * from t2;
+# fail if non-deterministic SF is called in SBR, bug#16456
+connection master;
+let $oblf=`select @@SESSION.BINLOG_FORMAT`;
+set binlog_format=STATEMENT;
+delimiter |;
+create function fn16456()
+ returns int
+begin
+ return unix_timestamp();
+end|
+delimiter ;|
+--error ER_BINLOG_ROW_RBR_TO_SBR
+select fn16456();
+--disable_query_log
+eval set binlog_format=$oblf;
+--enable_query_log
+drop function fn16456;
+
+
# ********************** PART 3 : TRIGGERS ***************
connection con1;
---error 1227
+# now fails due to missing trigger grant (err 1142 i/o 1227) due to new
+# check in sql_trigger.cc (v1.44) by anozdrin on 2006/02/01 --azundris
+--error ER_TABLEACCESS_DENIED_ERROR
create trigger trg before insert on t1 for each row set new.a= 10;
connection master;
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 5712ad38fa4..54f679bcf4c 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -4996,6 +4996,18 @@ Item_func_sp::execute_impl(THD *thd, Field *return_value_fld)
goto error;
/*
+ Throw an error if a non-deterministic function is called while
+ statement-based replication (SBR) is active.
+ */
+ if (!m_sp->m_chistics->detistic &&
+ (mysql_bin_log.is_open() &&
+ thd->variables.binlog_format == BINLOG_FORMAT_STMT))
+ {
+ my_error(ER_BINLOG_ROW_RBR_TO_SBR, MYF(0));
+ goto error;
+ }
+
+ /*
Disable the binlogging if this is not a SELECT statement. If this is a
SELECT, leave binlogging on, so execute_function() code writes the
function call into binlog.
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index d88478b9702..b56485b44bf 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -4576,6 +4576,18 @@ end_with_restore_list:
goto error;
}
+ /*
+ Throw an error if a non-deterministic procedure is called while
+ statement-based replication (SBR) is active.
+ */
+ if (!sp->m_chistics->detistic &&
+ (mysql_bin_log.is_open() &&
+ thd->variables.binlog_format == BINLOG_FORMAT_STMT))
+ {
+ my_error(ER_BINLOG_ROW_RBR_TO_SBR, MYF(0));
+ goto error;
+ }
+
my_bool nsok= thd->net.no_send_ok;
thd->net.no_send_ok= TRUE;
if (sp->m_flags & sp_head::MULTI_RESULTS)