diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index 84d705587e8..6f86b330251 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -5163,3 +5163,14 @@ END; $$ CALL p1('x'); DROP PROCEDURE p1; +create table t1 (b blob default ''); +prepare stmt from "alter table t1 force"; +execute stmt; +execute stmt; +execute stmt; +set names latin1; +prepare stmt from "alter table t1 modify b text character set utf8 default 'a'"; +execute stmt; +execute stmt; +execute stmt; +drop table t1; diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index 565f831efdd..e051cdce179 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -4635,3 +4635,18 @@ DELIMITER ;$$ --disable_result_log CALL p1('x'); DROP PROCEDURE p1; + +# +# MDEV-15746 ASAN heap-use-after-free in Item_change_list::rollback_item_tree_changes on ALTER executed as PS +# +create table t1 (b blob default ''); +prepare stmt from "alter table t1 force"; +execute stmt; +execute stmt; +execute stmt; +set names latin1; +prepare stmt from "alter table t1 modify b text character set utf8 default 'a'"; +execute stmt; +execute stmt; +execute stmt; +drop table t1; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 9e7973b745c..1ed2194b09a 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3378,6 +3378,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, */ if (sql_field->default_value && sql_field->default_value->expr->basic_const_item() && + (!sql_field->field || + sql_field->field->default_value != sql_field->default_value) && save_cs != sql_field->default_value->expr->collation.collation && (sql_field->sql_type == MYSQL_TYPE_VAR_STRING || sql_field->sql_type == MYSQL_TYPE_STRING ||