Skip to content

Commit

Permalink
unpack_row: set the correct fields in has_value_set for online alter
Browse files Browse the repository at this point in the history
  • Loading branch information
FooBarrior authored and vuvova committed Aug 15, 2023
1 parent ecb9db4 commit af82d56
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 1 deletion.
34 changes: 34 additions & 0 deletions mysql-test/main/alter_table_online_debug.result
Expand Up @@ -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;
Expand Down
29 changes: 29 additions & 0 deletions mysql-test/main/alter_table_online_debug.test
Expand Up @@ -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
Expand Down
4 changes: 3 additions & 1 deletion sql/rpl_record.cc
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
}
}
Expand Down

0 comments on commit af82d56

Please sign in to comment.