mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
unpack_row: set the correct fields in has_value_set for online alter
This commit is contained in:
committed by
Sergei Golubchik
parent
ecb9db4c3d
commit
af82d56a51
@ -1312,6 +1312,40 @@ insert into t select repeat('a',130000);
|
|||||||
set debug_sync= "now signal end";
|
set debug_sync= "now signal end";
|
||||||
connection default;
|
connection default;
|
||||||
drop table t;
|
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;
|
set debug_sync= reset;
|
||||||
disconnect con1;
|
disconnect con1;
|
||||||
disconnect con2;
|
disconnect con2;
|
||||||
|
@ -1498,6 +1498,35 @@ set debug_sync= "now signal end";
|
|||||||
--reap
|
--reap
|
||||||
drop table t;
|
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;
|
set debug_sync= reset;
|
||||||
--disconnect con1
|
--disconnect con1
|
||||||
|
@ -254,6 +254,7 @@ int unpack_row(const rpl_group_info *rgi, TABLE *table, uint const colcnt,
|
|||||||
*/
|
*/
|
||||||
if (bitmap_is_set(cols, (uint)(field_ptr - begin_ptr)))
|
if (bitmap_is_set(cols, (uint)(field_ptr - begin_ptr)))
|
||||||
{
|
{
|
||||||
|
if (!rpl_data.is_online_alter())
|
||||||
(*field_ptr)->set_has_explicit_value();
|
(*field_ptr)->set_has_explicit_value();
|
||||||
if ((null_mask & 0xFF) == 0)
|
if ((null_mask & 0xFF) == 0)
|
||||||
{
|
{
|
||||||
@ -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;
|
for (const auto *copy=rpl_data.copy_fields;
|
||||||
copy != rpl_data.copy_fields_end; copy++)
|
copy != rpl_data.copy_fields_end; copy++)
|
||||||
{
|
{
|
||||||
|
copy->to_field->set_has_explicit_value();
|
||||||
copy->do_copy(copy);
|
copy->do_copy(copy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user