Commit af82d56a authored by Nikita Malyavin's avatar Nikita Malyavin Committed by Sergei Golubchik

unpack_row: set the correct fields in has_value_set for online alter

parent ecb9db4c
......@@ -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;
......
......@@ -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
......
......@@ -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);
}
}
......
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