1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

rpl: check should go after defaults and vcols update

This commit is contained in:
Nikita Malyavin
2022-09-28 10:01:07 +03:00
committed by Sergei Golubchik
parent aa1a2507f5
commit da5df33927
3 changed files with 75 additions and 13 deletions

View File

@ -864,9 +864,11 @@ insert t1 values (1),(2),(3),(4);
set debug_sync= 'now wait_for downgraded'; set debug_sync= 'now wait_for downgraded';
connection con2; connection con2;
set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit'; 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; connection default;
update t1 set a=a+10 where a > 2; 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'; set debug_sync= 'now signal goforit';
connection con2; connection con2;
connection default; connection default;
@ -874,14 +876,45 @@ show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL, `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 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
select * from t1; select * from t1;
a b a b
1 11 1 1
2 12 2 2
13 23 13 13
14 24 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; drop table t1;
set debug_sync= 'reset'; set debug_sync= 'reset';
# #

View File

@ -1021,10 +1021,35 @@ insert t1 values (1),(2),(3),(4);
--send set debug_sync= 'now wait_for downgraded' --send set debug_sync= 'now wait_for downgraded'
--connection con2 --connection con2
set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit'; 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 --connection default
--reap --reap
update t1 set a=a+10 where a > 2; 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'; set debug_sync= 'now signal goforit';
--connection con2 --connection con2
--reap --reap

View File

@ -387,12 +387,6 @@ int unpack_row(rpl_group_info *rgi, TABLE *table, uint const colcnt,
{ {
copy->do_copy(copy); 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) if (table->default_field)
@ -408,6 +402,16 @@ int unpack_row(rpl_group_info *rgi, TABLE *table, uint const colcnt,
DBUG_RETURN(error); 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 throw away master's extra fields
*/ */