diff --git a/mysql-test/main/alter_table_online_debug.result b/mysql-test/main/alter_table_online_debug.result index 69dd07e95257e..c576714892f0d 100644 --- a/mysql-test/main/alter_table_online_debug.result +++ b/mysql-test/main/alter_table_online_debug.result @@ -1312,6 +1312,40 @@ insert into t select repeat('a',130000); set debug_sync= "now signal end"; connection default; drop table t; +# +# Test that correct fields are marked as explicit: +# Drop a, reorder b, add new column with default. +# +create table t (a int primary key, b int) engine=innodb; +insert into t values (1, 1), (2, 2), (3, 3); +set debug_sync= "alter_table_copy_end signal copy wait_for goon"; +alter table t drop primary key, drop a, +change b c bigint, +add x longblob default 123456; +connection con1; +set debug_sync= "now wait_for copy"; +update t set b = 5 where a = 1; +update t set b = NULL where a = 1; +select * from t; +a b +1 NULL +2 2 +3 3 +update t set a = 100 where a = 1; +update t set b = -10 where a = 100; +select * from t; +a b +2 2 +3 3 +100 -10 +set debug_sync= "now signal goon"; +connection default; +select * from t; +c x +-10 123456 +2 123456 +3 123456 +drop table t; set debug_sync= reset; disconnect con1; disconnect con2; diff --git a/mysql-test/main/alter_table_online_debug.test b/mysql-test/main/alter_table_online_debug.test index 43e6915540738..513770666f27c 100644 --- a/mysql-test/main/alter_table_online_debug.test +++ b/mysql-test/main/alter_table_online_debug.test @@ -1498,6 +1498,35 @@ set debug_sync= "now signal end"; --reap drop table t; +--echo # +--echo # Test that correct fields are marked as explicit: +--echo # Drop a, reorder b, add new column with default. +--echo # +create table t (a int primary key, b int) engine=innodb; +insert into t values (1, 1), (2, 2), (3, 3); + +set debug_sync= "alter_table_copy_end signal copy wait_for goon"; +send alter table t drop primary key, drop a, + change b c bigint, + add x longblob default 123456; + +--connection con1 +set debug_sync= "now wait_for copy"; + +update t set b = 5 where a = 1; +update t set b = NULL where a = 1; +select * from t; +update t set a = 100 where a = 1; +update t set b = -10 where a = 100; +select * from t; + +set debug_sync= "now signal goon"; + +--connection default +--reap +select * from t; +drop table t; + set debug_sync= reset; --disconnect con1 diff --git a/sql/rpl_record.cc b/sql/rpl_record.cc index ceb81dfa80d58..908d2c39d9736 100644 --- a/sql/rpl_record.cc +++ b/sql/rpl_record.cc @@ -254,7 +254,8 @@ int unpack_row(const rpl_group_info *rgi, TABLE *table, uint const colcnt, */ if (bitmap_is_set(cols, (uint)(field_ptr - begin_ptr))) { - (*field_ptr)->set_has_explicit_value(); + if (!rpl_data.is_online_alter()) + (*field_ptr)->set_has_explicit_value(); if ((null_mask & 0xFF) == 0) { DBUG_ASSERT(null_ptr < row_data + master_null_byte_count); @@ -376,6 +377,7 @@ int unpack_row(const rpl_group_info *rgi, TABLE *table, uint const colcnt, for (const auto *copy=rpl_data.copy_fields; copy != rpl_data.copy_fields_end; copy++) { + copy->to_field->set_has_explicit_value(); copy->do_copy(copy); } }