Commit cfb0c7fe authored by Nikita Malyavin's avatar Nikita Malyavin

Do not ignore sql_mode when replicating

Division by zero is a good example. sql_mode is basically ignored by
replication, see Bug#56662.

The behavior for ONLINE should remain the same as for non-ONLINE ALTER.
parent 40eb328f
...@@ -626,6 +626,7 @@ a ...@@ -626,6 +626,7 @@ a
3 3
NULL NULL
NULL NULL
set sql_mode=default;
connection default; connection default;
drop table t1; drop table t1;
set debug_sync= reset; set debug_sync= reset;
...@@ -707,5 +708,24 @@ connection default; ...@@ -707,5 +708,24 @@ connection default;
drop table t1; drop table t1;
set debug_sync= reset; set debug_sync= reset;
# #
# Do not ignore sql_mode when replicating
#
create table t1 (a int);
insert into t1 values (1);
set debug_sync= 'now wait_for downgraded';
connection con2;
set sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO';
set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit';
alter table t1 add b int as (1/a) stored, algorithm=copy, lock=none;
connection default;
update t1 set a= 0 where a=1;
set debug_sync= 'now signal goforit';
connection con2;
ERROR 22012: Division by 0
set sql_mode= default;
connection default;
drop table t1;
set debug_sync= reset;
#
# End of 10.10 tests # End of 10.10 tests
# #
...@@ -772,6 +772,7 @@ set debug_sync= 'now signal goforit'; ...@@ -772,6 +772,7 @@ set debug_sync= 'now signal goforit';
--reap --reap
show create table t1; show create table t1;
select * from t1; select * from t1;
set sql_mode=default;
--connection default --connection default
drop table t1; drop table t1;
set debug_sync= reset; set debug_sync= reset;
...@@ -874,6 +875,33 @@ show create table t1; ...@@ -874,6 +875,33 @@ show create table t1;
drop table t1; drop table t1;
set debug_sync= reset; set debug_sync= reset;
--echo #
--echo # Do not ignore sql_mode when replicating
--echo #
create table t1 (a int);
insert into t1 values (1);
--send set debug_sync= 'now wait_for downgraded'
--connection con2
set sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO';
set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit';
--send alter table t1 add b int as (1/a) stored, algorithm=copy, lock=none
--connection default
--reap
update t1 set a= 0 where a=1;
set debug_sync= 'now signal goforit';
--connection con2
--error ER_DIVISION_BY_ZERO
--reap
set sql_mode= default;
--connection default
drop table t1;
set debug_sync= reset;
--echo # --echo #
--echo # End of 10.10 tests --echo # End of 10.10 tests
--echo # --echo #
...@@ -5099,9 +5099,12 @@ int Rows_log_event::do_apply_event(rpl_group_info *rgi) ...@@ -5099,9 +5099,12 @@ int Rows_log_event::do_apply_event(rpl_group_info *rgi)
extra columns on the slave. In that case, do not force extra columns on the slave. In that case, do not force
MODE_NO_AUTO_VALUE_ON_ZERO. MODE_NO_AUTO_VALUE_ON_ZERO.
*/ */
Rpl_table_data rpl_data{};
if (rgi) rgi->get_table_data(table, &rpl_data);
sql_mode_t saved_sql_mode= thd->variables.sql_mode; sql_mode_t saved_sql_mode= thd->variables.sql_mode;
if (!is_auto_inc_in_extra_columns()) if (!is_auto_inc_in_extra_columns())
thd->variables.sql_mode= MODE_NO_AUTO_VALUE_ON_ZERO; thd->variables.sql_mode= (rpl_data.copy_fields ? saved_sql_mode : 0)
| MODE_NO_AUTO_VALUE_ON_ZERO;
// row processing loop // row processing loop
......
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