mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-25555 Server crashes in tree_record_pos after INPLACE-recreating index on HEAP table
Drop and add same key is considered rename (look ALTER_RENAME_INDEX in fill_alter_inplace_info()). But in this case order of keys may be changed, because mysql_prepare_alter_table() yet does not know about rename and treats 2 operations: drop and add. In that case we disable inplace algorithm for such engines as Memory, MyISAM and Aria with ALTER_INDEX_ORDER flag. These engines have no specialized check_if_supported_inplace_alter() and default handler::check_if_supported_inplace_alter() sees an unknown flag and returns HA_ALTER_INPLACE_NOT_SUPPORTED. ha_innobase::check_if_supported_inplace_alter() works differently and inplace is not disabled (with the help of modified INNOBASE_INPLACE_IGNORE). add_drop_v_cols fork was also tweaked as it wrongly failed with MSG_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN when it seen ALTER_INDEX_ORDER. No-op operation must be still no-op no matter of ALTER_INDEX_ORDER presence, so we tweek its condition as well.
This commit is contained in:
@ -10623,6 +10623,8 @@ do_continue:;
|
||||
create_info->options|=HA_CREATE_TMP_ALTER;
|
||||
if (!(alter_info->flags & ALTER_ADD_INDEX) && !alter_ctx.modified_primary_key)
|
||||
create_info->options|= HA_SKIP_KEY_SORT;
|
||||
else
|
||||
alter_info->flags|= ALTER_INDEX_ORDER;
|
||||
create_info->alias= alter_ctx.table_name;
|
||||
error= create_table_impl(thd, alter_ctx.db, alter_ctx.table_name,
|
||||
alter_ctx.new_db, alter_ctx.tmp_name,
|
||||
@ -10659,7 +10661,7 @@ do_continue:;
|
||||
*/
|
||||
|
||||
if (!(ha_alter_info.handler_flags &
|
||||
~(ALTER_COLUMN_ORDER | ALTER_RENAME_COLUMN)))
|
||||
~(ALTER_COLUMN_ORDER | ALTER_RENAME_COLUMN | ALTER_INDEX_ORDER)))
|
||||
{
|
||||
/*
|
||||
No-op ALTER, no need to call handler API functions.
|
||||
@ -10674,6 +10676,9 @@ do_continue:;
|
||||
Also note that we ignore the LOCK clause here.
|
||||
|
||||
TODO don't create partitioning metadata in the first place
|
||||
|
||||
TODO: Now case-change index name is treated as noop which is not quite
|
||||
correct.
|
||||
*/
|
||||
table->file->ha_create_partitioning_metadata(alter_ctx.get_tmp_path(),
|
||||
NULL, CHF_DELETE_FLAG);
|
||||
|
Reference in New Issue
Block a user