diff options
Diffstat (limited to 'storage/innobase/handler/handler0alter.cc')
-rw-r--r-- | storage/innobase/handler/handler0alter.cc | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index a2839d1a7ec..b96a071ee4f 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -59,6 +59,8 @@ Smart ALTER TABLE #include "span.h" using st_::span; +/** File format constraint for native ALTER TABLE */ +extern ulong innodb_file_format; static const char *MSG_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN= "INPLACE ADD or DROP of virtual columns cannot be " @@ -954,6 +956,31 @@ ha_innobase::check_if_supported_inplace_alter( const char* reason_rebuild = NULL; + switch (innodb_file_format) { + case 0: /* barracuda */ + if (!(ha_alter_info->handler_flags + & ALTER_ADD_STORED_BASE_COLUMN)) { + break; + } + reason_rebuild = "innodb_file_format=barracuda"; + innodb_file_format_rebuild_reason: + if (ha_alter_info->handler_flags & ALTER_RECREATE_TABLE) { + reason_rebuild = NULL; + } else { + ha_alter_info->handler_flags |= ALTER_RECREATE_TABLE; + ha_alter_info->unsupported_reason = reason_rebuild; + } + break; + case 1: /* strict_barracuda */ + if ((ha_alter_info->handler_flags + & ALTER_ADD_STORED_BASE_COLUMN) + || m_prebuilt->table->is_instant()) { + reason_rebuild = "innodb_file_format=strict_barracuda"; + goto innodb_file_format_rebuild_reason; + } + break; + } + switch (ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE) { case ALTER_OPTIONS: if (alter_options_need_rebuild(ha_alter_info, table)) { |