diff --git a/mysql-test/main/alter_table_online_debug.result b/mysql-test/main/alter_table_online_debug.result index 12888d3ca83f3..ddc231ae7aaea 100644 --- a/mysql-test/main/alter_table_online_debug.result +++ b/mysql-test/main/alter_table_online_debug.result @@ -626,6 +626,7 @@ a 3 NULL NULL +set sql_mode=default; connection default; drop table t1; set debug_sync= reset; @@ -707,5 +708,24 @@ connection default; drop table t1; 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 11.2 tests # diff --git a/mysql-test/main/alter_table_online_debug.test b/mysql-test/main/alter_table_online_debug.test index 7515a5654a672..955f4500c8987 100644 --- a/mysql-test/main/alter_table_online_debug.test +++ b/mysql-test/main/alter_table_online_debug.test @@ -772,6 +772,7 @@ set debug_sync= 'now signal goforit'; --reap show create table t1; select * from t1; +set sql_mode=default; --connection default drop table t1; set debug_sync= reset; @@ -874,6 +875,33 @@ show create table t1; drop table t1; 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 # End of 11.2 tests --echo # diff --git a/sql/log_event_server.cc b/sql/log_event_server.cc index a744bd001cc2f..df015b5fd9da9 100644 --- a/sql/log_event_server.cc +++ b/sql/log_event_server.cc @@ -5118,9 +5118,12 @@ int Rows_log_event::do_apply_event(rpl_group_info *rgi) extra columns on the slave. In that case, do not force 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; 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