diff options
-rw-r--r-- | mysql-test/suite/innodb/r/alter_not_null_debug.result | 24 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/alter_not_null_debug.test | 29 | ||||
-rw-r--r-- | storage/innobase/row/row0log.cc | 6 |
3 files changed, 54 insertions, 5 deletions
diff --git a/mysql-test/suite/innodb/r/alter_not_null_debug.result b/mysql-test/suite/innodb/r/alter_not_null_debug.result index c12f1fbca3d..0c1af03159d 100644 --- a/mysql-test/suite/innodb/r/alter_not_null_debug.result +++ b/mysql-test/suite/innodb/r/alter_not_null_debug.result @@ -74,5 +74,27 @@ c1 c2 c3 1 2 3 2 0 4 DROP TABLE t1; -disconnect con1; SET DEBUG_SYNC='RESET'; +# +# MDEV-21539 Assertion ...prtype... in row_log_table_apply_convert_mrec +# +CREATE TABLE t1 (f VARCHAR(8) CHARACTER SET latin1 COLLATE latin1_swedish_ci) +ENGINE=InnoDB; +connection con1; +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL scanned WAIT_FOR insert_done'; +ALTER TABLE t1 MODIFY f VARCHAR(256) COLLATE latin1_german2_ci NOT NULL; +# session default +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR scanned'; +INSERT INTO t1 VALUES('one'); +SET DEBUG_SYNC = 'now SIGNAL insert_done'; +connection con1; +disconnect con1; +connection default; +SET DEBUG_SYNC=RESET; +ALTER TABLE t1 CHANGE f eins VARCHAR(257) COLLATE latin1_german1_ci NOT NULL, +ALGORITHM=INSTANT; +SELECT * FROM t1; +eins +one +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/alter_not_null_debug.test b/mysql-test/suite/innodb/t/alter_not_null_debug.test index 058f0fc02a5..7a965fd413a 100644 --- a/mysql-test/suite/innodb/t/alter_not_null_debug.test +++ b/mysql-test/suite/innodb/t/alter_not_null_debug.test @@ -68,5 +68,32 @@ reap; --disable_info SELECT * FROM t1; DROP TABLE t1; -disconnect con1; SET DEBUG_SYNC='RESET'; + +--echo # +--echo # MDEV-21539 Assertion ...prtype... in row_log_table_apply_convert_mrec +--echo # +CREATE TABLE t1 (f VARCHAR(8) CHARACTER SET latin1 COLLATE latin1_swedish_ci) +ENGINE=InnoDB; + +connection con1; +SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL scanned WAIT_FOR insert_done'; +send ALTER TABLE t1 MODIFY f VARCHAR(256) COLLATE latin1_german2_ci NOT NULL; + +--echo # session default +connection default; +SET DEBUG_SYNC = 'now WAIT_FOR scanned'; +INSERT INTO t1 VALUES('one'); +SET DEBUG_SYNC = 'now SIGNAL insert_done'; + +connection con1; +reap; +disconnect con1; +connection default; +SET DEBUG_SYNC=RESET; + +ALTER TABLE t1 CHANGE f eins VARCHAR(257) COLLATE latin1_german1_ci NOT NULL, +ALGORITHM=INSTANT; + +SELECT * FROM t1; +DROP TABLE t1; diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc index fa50ff80e55..91879068c17 100644 --- a/storage/innobase/row/row0log.cc +++ b/storage/innobase/row/row0log.cc @@ -1648,12 +1648,12 @@ blob_done: /* See if any columns were changed to NULL or NOT NULL. */ const dict_col_t* new_col = dict_table_get_nth_col(log->table, col_no); - ut_ad(new_col->mtype == col->mtype); + ut_ad(new_col->same_format(*col)); /* Assert that prtype matches except for nullability. */ - ut_ad(!((new_col->prtype ^ col->prtype) & ~DATA_NOT_NULL)); ut_ad(!((new_col->prtype ^ dfield_get_type(dfield)->prtype) - & ~DATA_NOT_NULL)); + & ~(DATA_NOT_NULL | DATA_VERSIONED + | CHAR_COLL_MASK << 16 | DATA_LONG_TRUE_VARCHAR))); if (new_col->prtype == col->prtype) { continue; |