mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
BUG#41166 stored function requires "deterministic" if binlog_format is "statement"
If the log_bin_trust_function_creators option is not defined, creating a stored function requires either one of the modifiers DETERMINISTIC, NO SQL, or READS SQL DATA. Executing a stored function should also follows the same rules if in STATEMENT mode. However, this was not happening and a wrong error was being printed out: ER_BINLOG_ROW_RBR_TO_SBR. The patch makes the creation and execution compatible and prints out the correct error ER_BINLOG_UNSAFE_ROUTINE when a stored function without one of the modifiers above is executed in STATEMENT mode.
This commit is contained in:
@ -19,5 +19,50 @@ fn16456()
|
||||
timestamp
|
||||
set binlog_format=STATEMENT;
|
||||
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
|
||||
ERROR HY000: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
|
||||
drop function fn16456;
|
||||
set global log_bin_trust_function_creators=0;
|
||||
create function fn16456()
|
||||
returns int deterministic
|
||||
begin
|
||||
return unix_timestamp();
|
||||
end|
|
||||
set binlog_format=ROW;
|
||||
select fn16456();
|
||||
fn16456()
|
||||
timestamp
|
||||
set binlog_format=STATEMENT;
|
||||
select fn16456();
|
||||
fn16456()
|
||||
timestamp
|
||||
drop function fn16456;
|
||||
set global log_bin_trust_function_creators=0;
|
||||
create function fn16456()
|
||||
returns int no sql
|
||||
begin
|
||||
return unix_timestamp();
|
||||
end|
|
||||
set binlog_format=ROW;
|
||||
select fn16456();
|
||||
fn16456()
|
||||
timestamp
|
||||
set binlog_format=STATEMENT;
|
||||
select fn16456();
|
||||
fn16456()
|
||||
timestamp
|
||||
drop function fn16456;
|
||||
set global log_bin_trust_function_creators=0;
|
||||
create function fn16456()
|
||||
returns int reads sql data
|
||||
begin
|
||||
return unix_timestamp();
|
||||
end|
|
||||
set binlog_format=ROW;
|
||||
select fn16456();
|
||||
fn16456()
|
||||
timestamp
|
||||
set binlog_format=STATEMENT;
|
||||
select fn16456();
|
||||
fn16456()
|
||||
timestamp
|
||||
drop function fn16456;
|
||||
|
@ -1,6 +1,7 @@
|
||||
-- source include/have_log_bin.inc
|
||||
|
||||
# Bug#16456 RBR: rpl_sp.test expects query to fail, but passes in RBR
|
||||
# BUG#41166 stored function requires "deterministic" if binlog_format is "statement"
|
||||
|
||||
# save status
|
||||
|
||||
@ -55,15 +56,131 @@ select fn16456();
|
||||
|
||||
set binlog_format=STATEMENT;
|
||||
|
||||
--error ER_BINLOG_ROW_RBR_TO_SBR
|
||||
--error ER_BINLOG_UNSAFE_ROUTINE
|
||||
select fn16456();
|
||||
|
||||
|
||||
|
||||
# clean
|
||||
|
||||
drop function fn16456;
|
||||
|
||||
|
||||
|
||||
# success in definition with deterministic
|
||||
|
||||
set global log_bin_trust_function_creators=0;
|
||||
|
||||
delimiter |;
|
||||
create function fn16456()
|
||||
returns int deterministic
|
||||
begin
|
||||
return unix_timestamp();
|
||||
end|
|
||||
delimiter ;|
|
||||
|
||||
|
||||
|
||||
# allow funcall in RBR
|
||||
|
||||
set binlog_format=ROW;
|
||||
|
||||
--replace_column 1 timestamp
|
||||
select fn16456();
|
||||
|
||||
|
||||
|
||||
# allow funcall in SBR
|
||||
|
||||
set binlog_format=STATEMENT;
|
||||
|
||||
--replace_column 1 timestamp
|
||||
select fn16456();
|
||||
|
||||
|
||||
|
||||
# clean
|
||||
|
||||
drop function fn16456;
|
||||
|
||||
|
||||
# success in definition with NO SQL
|
||||
|
||||
set global log_bin_trust_function_creators=0;
|
||||
|
||||
delimiter |;
|
||||
create function fn16456()
|
||||
returns int no sql
|
||||
begin
|
||||
return unix_timestamp();
|
||||
end|
|
||||
delimiter ;|
|
||||
|
||||
|
||||
|
||||
# allow funcall in RBR
|
||||
|
||||
set binlog_format=ROW;
|
||||
|
||||
--replace_column 1 timestamp
|
||||
select fn16456();
|
||||
|
||||
|
||||
|
||||
# allow funcall in SBR
|
||||
|
||||
set binlog_format=STATEMENT;
|
||||
|
||||
--replace_column 1 timestamp
|
||||
select fn16456();
|
||||
|
||||
|
||||
# clean
|
||||
|
||||
drop function fn16456;
|
||||
|
||||
|
||||
|
||||
# success in definition with reads sql data
|
||||
|
||||
set global log_bin_trust_function_creators=0;
|
||||
|
||||
delimiter |;
|
||||
create function fn16456()
|
||||
returns int reads sql data
|
||||
begin
|
||||
return unix_timestamp();
|
||||
end|
|
||||
delimiter ;|
|
||||
|
||||
|
||||
|
||||
# allow funcall in RBR
|
||||
|
||||
set binlog_format=ROW;
|
||||
|
||||
--replace_column 1 timestamp
|
||||
select fn16456();
|
||||
|
||||
|
||||
|
||||
# allow funcall in SBR
|
||||
|
||||
set binlog_format=STATEMENT;
|
||||
|
||||
--replace_column 1 timestamp
|
||||
select fn16456();
|
||||
|
||||
|
||||
|
||||
# clean
|
||||
|
||||
drop function fn16456;
|
||||
|
||||
|
||||
|
||||
# restore status
|
||||
|
||||
drop function fn16456;
|
||||
|
||||
--disable_query_log
|
||||
eval set binlog_format=$oblf;
|
||||
eval set global log_bin_trust_function_creators=$otfc;
|
||||
|
Reference in New Issue
Block a user