diff --git a/mysql-test/r/check_constraint_innodb.result b/mysql-test/r/check_constraint_innodb.result new file mode 100644 index 00000000000..45af3f512b7 --- /dev/null +++ b/mysql-test/r/check_constraint_innodb.result @@ -0,0 +1,9 @@ +create table t1 (a int, b smallint) engine=innodb; +connect con1,localhost,root,,test; +alter table t1 add constraint check (b < 8); +alter table t1 modify column b int, algorithm=inplace; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY +connection default; +alter table t1 add primary key (a); +drop table t1; +disconnect con1; diff --git a/mysql-test/t/check_constraint_innodb.test b/mysql-test/t/check_constraint_innodb.test new file mode 100644 index 00000000000..d02aa320e84 --- /dev/null +++ b/mysql-test/t/check_constraint_innodb.test @@ -0,0 +1,14 @@ +--source include/have_innodb.inc + +# +# MDEV-18239 ASAN use-after-poison in process_str_arg / ... / mark_unsupported_func or unexpected ER_BAD_FIELD_ERROR upon ALTER TABLE +# +create table t1 (a int, b smallint) engine=innodb; +connect con1,localhost,root,,test; +alter table t1 add constraint check (b < 8); +error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON; +alter table t1 modify column b int, algorithm=inplace; +connection default; +alter table t1 add primary key (a); +drop table t1; +disconnect con1; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 4f9adc3338c..f27b61092d2 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -8123,7 +8123,12 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, } if (!drop) { - check->expr->walk(&Item::rename_fields_processor, 1, &column_rename_param); + if (alter_info->flags & Alter_info::ALTER_RENAME_COLUMN) + { + check->expr->walk(&Item::rename_fields_processor, 1, + &column_rename_param); + table->m_needs_reopen= 1; // because new column name is on thd->mem_root + } new_constraint_list.push_back(check, thd->mem_root); } }