@ -1950,9 +1950,14 @@ innobase_fts_check_doc_id_col(
/** Check whether the table is empty.
@ param [ in ] table table to be checked
@ param [ in ] ignore_delete_marked Ignore the delete marked
flag record
@ return true if table is empty */
static bool innobase_table_is_empty ( const dict_table_t * table )
static bool innobase_table_is_empty ( const dict_table_t * table ,
bool ignore_delete_marked = true )
{
if ( ! table - > space )
return false ;
dict_index_t * clust_index = dict_table_get_first_index ( table ) ;
mtr_t mtr ;
btr_pcur_t pcur ;
@ -1991,12 +1996,16 @@ next_page:
}
rec = page_cur_get_rec ( cur ) ;
if ( rec_get_deleted_flag ( rec , dict_table_is_comp ( table ) ) ) ;
else if ( ! page_rec_is_supremum ( rec ) )
if ( rec_get_deleted_flag ( rec , dict_table_is_comp ( table ) ) )
{
if ( ignore_delete_marked )
goto scan_leaf ;
non_empty :
mtr . commit ( ) ;
return false ;
}
else if ( ! page_rec_is_supremum ( rec ) )
goto non_empty ;
else
{
next_page = true ;
@ -6853,6 +6862,7 @@ wrong_column_name:
DBUG_ASSERT ( num_fts_index < = 1 ) ;
DBUG_ASSERT ( ! ctx - > online | | num_fts_index = = 0 ) ;
DBUG_ASSERT ( ! ctx - > online
| | ! ha_alter_info - > mdl_exclusive_after_prepare
| | ctx - > add_autoinc = = ULINT_UNDEFINED ) ;
DBUG_ASSERT ( ! ctx - > online
| | ! innobase_need_rebuild ( ha_alter_info , old_table )
@ -7666,6 +7676,20 @@ ha_innobase::prepare_inplace_alter_table(
DBUG_RETURN ( false ) ;
}
# ifdef WITH_PARTITION_STORAGE_ENGINE
if ( table - > part_info = = NULL ) {
# endif
/* Ignore the MDL downgrade when table is empty.
This optimization is disabled for partition table . */
ha_alter_info - > mdl_exclusive_after_prepare =
innobase_table_is_empty ( m_prebuilt - > table , false ) ;
if ( ha_alter_info - > online
& & ha_alter_info - > mdl_exclusive_after_prepare ) {
ha_alter_info - > online = false ;
}
# ifdef WITH_PARTITION_STORAGE_ENGINE
}
# endif
indexed_table = m_prebuilt - > table ;
/* ALTER TABLE will not implicitly move a table from a single-table
@ -8450,7 +8474,9 @@ ha_innobase::inplace_alter_table(
DEBUG_SYNC ( m_user_thd , " innodb_inplace_alter_table_enter " ) ;
if ( ! ( ha_alter_info - > handler_flags & INNOBASE_ALTER_DATA ) ) {
/* Ignore the inplace alter phase when table is empty */
if ( ! ( ha_alter_info - > handler_flags & INNOBASE_ALTER_DATA )
| | ha_alter_info - > mdl_exclusive_after_prepare ) {
ok_exit :
DEBUG_SYNC ( m_user_thd , " innodb_after_inplace_alter_table " ) ;
DBUG_RETURN ( false ) ;