summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Malyavin <nikitamalyavin@gmail.com>2022-09-28 10:01:07 +0300
committerNikita Malyavin <nikitamalyavin@gmail.com>2023-04-18 00:29:50 +0300
commite231f02e533baa817636bd25c0ddecd0154c9ffb (patch)
tree5fca3072a605ae9dacb4963cee45ea94310c5a8b
parenta7536d2c4504c03a79f69017d00bf8d1b6234589 (diff)
downloadmariadb-git-e231f02e533baa817636bd25c0ddecd0154c9ffb.tar.gz
rpl: check should go after defaults and vcols update
-rw-r--r--mysql-test/main/alter_table_online_debug.result45
-rw-r--r--mysql-test/main/alter_table_online_debug.test27
-rw-r--r--sql/rpl_record.cc16
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
*/