diff options
author | Nikita Malyavin <nikitamalyavin@gmail.com> | 2022-09-28 10:01:07 +0300 |
---|---|---|
committer | Nikita Malyavin <nikitamalyavin@gmail.com> | 2023-04-18 00:29:50 +0300 |
commit | e231f02e533baa817636bd25c0ddecd0154c9ffb (patch) | |
tree | 5fca3072a605ae9dacb4963cee45ea94310c5a8b | |
parent | a7536d2c4504c03a79f69017d00bf8d1b6234589 (diff) | |
download | mariadb-git-e231f02e533baa817636bd25c0ddecd0154c9ffb.tar.gz |
rpl: check should go after defaults and vcols update
-rw-r--r-- | mysql-test/main/alter_table_online_debug.result | 45 | ||||
-rw-r--r-- | mysql-test/main/alter_table_online_debug.test | 27 | ||||
-rw-r--r-- | sql/rpl_record.cc | 16 |
3 files changed, 75 insertions, 13 deletions
diff --git a/mysql-test/main/alter_table_online_debug.result b/mysql-test/main/alter_table_online_debug.result index 4d5992e2e99..b95ddea7b5a 100644 --- a/mysql-test/main/alter_table_online_debug.result +++ b/mysql-test/main/alter_table_online_debug.result @@ -864,9 +864,11 @@ insert t1 values (1),(2),(3),(4); set debug_sync= 'now wait_for downgraded'; connection con2; set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit'; -alter table t1 add b int default(a+10), algorithm=copy, lock=none; +alter table t1 add b int default(a), algorithm=copy, lock=none; connection default; update t1 set a=a+10 where a > 2; +insert t1 values(5); +update t1 set a=a+10 where a = 5; set debug_sync= 'now signal goforit'; connection con2; connection default; @@ -874,14 +876,45 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, - `b` int(11) DEFAULT (`a` + 10) + `b` int(11) DEFAULT `a` ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci select * from t1; a b -1 11 -2 12 -13 23 -14 24 +1 1 +2 2 +13 13 +14 14 +15 15 +drop table t1; +set debug_sync= 'reset'; +## VCOL + CHECK +create table t1 (a int) engine=innodb; +insert t1 values (1),(2),(3),(4); +set debug_sync= 'now wait_for downgraded'; +connection con2; +set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit'; +alter table t1 add b int as (a), add check(b=a), algorithm=copy, lock=none; +connection default; +update t1 set a=a+10 where a > 2; +insert t1 values(5); +update t1 set a=a+10 where a = 5; +set debug_sync= 'now signal goforit'; +connection con2; +connection default; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) GENERATED ALWAYS AS (`a`) VIRTUAL, + CONSTRAINT `CONSTRAINT_1` CHECK (`b` = `a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +select * from t1; +a b +1 1 +2 2 +13 13 +14 14 +15 15 drop table t1; set debug_sync= 'reset'; # diff --git a/mysql-test/main/alter_table_online_debug.test b/mysql-test/main/alter_table_online_debug.test index 7cc6279044c..f13954ba2b2 100644 --- a/mysql-test/main/alter_table_online_debug.test +++ b/mysql-test/main/alter_table_online_debug.test @@ -1021,10 +1021,35 @@ insert t1 values (1),(2),(3),(4); --send set debug_sync= 'now wait_for downgraded' --connection con2 set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit'; ---send alter table t1 add b int default(a+10), algorithm=copy, lock=none +--send alter table t1 add b int default(a), algorithm=copy, lock=none +--connection default +--reap +update t1 set a=a+10 where a > 2; +insert t1 values(5); +update t1 set a=a+10 where a = 5; + +set debug_sync= 'now signal goforit'; +--connection con2 +--reap +--connection default +show create table t1; +select * from t1; +drop table t1; +set debug_sync= 'reset'; + +--echo ## VCOL + CHECK +create table t1 (a int) engine=innodb; +insert t1 values (1),(2),(3),(4); +--send set debug_sync= 'now wait_for downgraded' +--connection con2 +set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit'; +--send alter table t1 add b int as (a), add check(b=a), algorithm=copy, lock=none --connection default --reap update t1 set a=a+10 where a > 2; +insert t1 values(5); +update t1 set a=a+10 where a = 5; + set debug_sync= 'now signal goforit'; --connection con2 --reap diff --git a/sql/rpl_record.cc b/sql/rpl_record.cc index 1dfb00046f3..2f9723c9b29 100644 --- a/sql/rpl_record.cc +++ b/sql/rpl_record.cc @@ -387,12 +387,6 @@ int unpack_row(rpl_group_info *rgi, TABLE *table, uint const colcnt, { copy->do_copy(copy); } - /* we only check constraints for ALTER TABLE */ - DBUG_ASSERT(table->in_use->lex->ignore == FALSE); - error= table->verify_constraints(false); - DBUG_ASSERT(error != VIEW_CHECK_SKIP); - if (error) - DBUG_RETURN(HA_ERR_GENERIC); } if (table->default_field) @@ -408,6 +402,16 @@ int unpack_row(rpl_group_info *rgi, TABLE *table, uint const colcnt, DBUG_RETURN(error); } + if (rpl_data.is_online_alter()) + { + /* we only check constraints for ALTER TABLE */ + DBUG_ASSERT(table->in_use->lex->ignore == FALSE); + error = table->verify_constraints(false); + DBUG_ASSERT(error != VIEW_CHECK_SKIP); + if (error) + DBUG_RETURN(HA_ERR_GENERIC); + } + /* throw away master's extra fields */ |