From 4903031baa196dfc9a75638d141b515883cd254c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 18 Mar 2021 17:05:31 +0200 Subject: [PATCH] MDEV-23497 fixup: Do not warn for ALTER TABLE conversion Our intention is to make users aware that the ROW_FORMAT=COMPRESSED format is on its way to deprecation. It is an unnecessary annoyance to users if we issue a warning when the user is converting a ROW_FORMAT=COMPRESSED table to a supported format (such as ROW_FORMAT=DYNAMIC). ha_innobase::is_read_only(): Add a parameter to specify that an ALTER TABLE to a supported format has been requested. ha_innobase::check_if_supported_inplace_alter(): Set the parameter when ALTER_OPTIONS to something else than ROW_FORMAT=COMPRESSED (and without KEY_BLOCK_SIZE) is being requested. Thanks to Elena Stepanova for suggesting this. --- .../suite/innodb/r/default_row_format_compatibility.result | 2 -- storage/innobase/handler/ha_innodb.cc | 5 ++++- storage/innobase/handler/ha_innodb.h | 2 +- storage/innobase/handler/handler0alter.cc | 6 +++++- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/mysql-test/suite/innodb/r/default_row_format_compatibility.result b/mysql-test/suite/innodb/r/default_row_format_compatibility.result index 2889e86f82e..a862881e005 100644 --- a/mysql-test/suite/innodb/r/default_row_format_compatibility.result +++ b/mysql-test/suite/innodb/r/default_row_format_compatibility.result @@ -96,8 +96,6 @@ SELECT * FROM tab; a b 1 Check with max column size ALTER TABLE tab ROW_FORMAT=Dynamic; -Warnings: -Warning 4047 InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE. SET GLOBAL innodb_read_only_compressed=@save_innodb_read_only_compressed; SHOW TABLE STATUS LIKE 'tab'; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 4727141ec7d..4701929b42d 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -7251,7 +7251,7 @@ ha_innobase::innobase_set_max_autoinc( } /** @return whether the table is read-only */ -bool ha_innobase::is_read_only() const +bool ha_innobase::is_read_only(bool altering_to_supported) const { ut_ad(m_prebuilt->trx == thd_to_trx(m_user_thd)); @@ -7261,6 +7261,9 @@ bool ha_innobase::is_read_only() const return true; } + if (altering_to_supported) + return false; + if (!DICT_TF_GET_ZIP_SSIZE(m_prebuilt->table->flags) || !innodb_read_only_compressed) return false; diff --git a/storage/innobase/handler/ha_innodb.h b/storage/innobase/handler/ha_innodb.h index 3d761691f3a..15d230b9ced 100644 --- a/storage/innobase/handler/ha_innodb.h +++ b/storage/innobase/handler/ha_innodb.h @@ -458,7 +458,7 @@ protected: void reset_template(); /** @return whether the table is read-only */ - bool is_read_only() const; + bool is_read_only(bool altering_to_supported= false) const; inline void update_thd(THD* thd); void update_thd(); diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index bbdb6a429c7..58e17cd3ead 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -1988,7 +1988,11 @@ ha_innobase::check_if_supported_inplace_alter( update_thd(); - if (is_read_only()) { + if (is_read_only(!high_level_read_only + && (ha_alter_info->handler_flags & ALTER_OPTIONS) + && ha_alter_info->create_info->key_block_size == 0 + && ha_alter_info->create_info->row_type + != ROW_TYPE_COMPRESSED)) { ha_alter_info->unsupported_reason = my_get_err_msg(ER_READ_ONLY_MODE);