diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2021-08-02 16:50:28 +0200 |
---|---|---|
committer | Oleksandr Byelkin <sanja@mariadb.com> | 2021-08-02 16:50:28 +0200 |
commit | 4902b0fdc91cc6dc169dd2322daf966a2eeafdd8 (patch) | |
tree | 202d12a5cd5133d160151dfe1444bcad4fed1a2c /storage/innobase | |
parent | 89cc6338531d21469858325296d6ffa0c126ffd3 (diff) | |
parent | 7f264997dd21c5126350a9a5f0cc0960afdd1229 (diff) | |
download | mariadb-git-4902b0fdc91cc6dc169dd2322daf966a2eeafdd8.tar.gz |
Merge branch '10.3' into 10.4mariadb-10.4.21
Diffstat (limited to 'storage/innobase')
-rw-r--r-- | storage/innobase/handler/handler0alter.cc | 78 |
1 files changed, 31 insertions, 47 deletions
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 9a718915752..bf26caf7c05 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -7591,6 +7591,10 @@ alter_fill_stored_column( } } +static bool alter_templ_needs_rebuild(const TABLE* altered_table, + const Alter_inplace_info* ha_alter_info, + const dict_table_t* table); + /** Allows InnoDB to update internal structures with concurrent writes blocked (provided that check_if_supported_inplace_alter() @@ -7738,11 +7742,7 @@ ha_innobase::prepare_inplace_alter_table( ha_alter_info->key_count)) { err_exit_no_heap: DBUG_ASSERT(m_prebuilt->trx->dict_operation_lock_mode == 0); - if (ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE) { - - online_retry_drop_indexes( - m_prebuilt->table, m_user_thd); - } + online_retry_drop_indexes(m_prebuilt->table, m_user_thd); DBUG_RETURN(true); } @@ -8198,9 +8198,9 @@ err_exit: == ALTER_OPTIONS && !alter_options_need_rebuild(ha_alter_info, table))) { + ha_innobase_inplace_ctx *ctx = NULL; if (heap) { - ha_alter_info->handler_ctx - = new ha_innobase_inplace_ctx( + ctx = new ha_innobase_inplace_ctx( m_prebuilt, drop_index, n_drop_index, drop_fk, n_drop_fk, @@ -8212,15 +8212,11 @@ err_exit: || !thd_is_strict_mode(m_user_thd)), alt_opt.page_compressed, alt_opt.page_compression_level); + ha_alter_info->handler_ctx = ctx; } DBUG_ASSERT(m_prebuilt->trx->dict_operation_lock_mode == 0); - if (ha_alter_info->handler_flags & ~(INNOBASE_INPLACE_IGNORE)) { - - online_retry_drop_indexes( - m_prebuilt->table, m_user_thd); - - } + online_retry_drop_indexes(m_prebuilt->table, m_user_thd); if ((ha_alter_info->handler_flags & ALTER_DROP_VIRTUAL_COLUMN) @@ -8235,6 +8231,24 @@ err_exit: DBUG_RETURN(true); } + if (!(ha_alter_info->handler_flags & INNOBASE_ALTER_DATA) + && alter_templ_needs_rebuild(altered_table, ha_alter_info, + ctx->new_table) + && ctx->new_table->n_v_cols > 0) { + /* Changing maria record structure may end up here only + if virtual columns were altered. In this case, however, + vc_templ should be rebuilt. Since we don't actually + change any stored data, we can just dispose vc_templ; + it will be recreated on next ha_innobase::open(). */ + + DBUG_ASSERT(ctx->new_table == ctx->old_table); + + dict_free_vc_templ(ctx->new_table->vc_templ); + UT_DELETE(ctx->new_table->vc_templ); + + ctx->new_table->vc_templ = NULL; + } + DBUG_RETURN(false); } @@ -8346,35 +8360,6 @@ found_col: add_fts_doc_id_idx)); } -/** Check that the column is part of a virtual index(index contains -virtual column) in the table -@param[in] table Table containing column -@param[in] col column to be checked -@return true if this column is indexed with other virtual columns */ -static -bool -dict_col_in_v_indexes( - dict_table_t* table, - dict_col_t* col) -{ - for (dict_index_t* index = dict_table_get_next_index( - dict_table_get_first_index(table)); index != NULL; - index = dict_table_get_next_index(index)) { - if (!dict_index_has_virtual(index)) { - continue; - } - for (ulint k = 0; k < index->n_fields; k++) { - dict_field_t* field - = dict_index_get_nth_field(index, k); - if (field->col->ind == col->ind) { - return(true); - } - } - } - - return(false); -} - /* Check whether a columnn length change alter operation requires to rebuild the template. @param[in] altered_table TABLE object for new version of table. @@ -8386,9 +8371,9 @@ to rebuild the template. static bool alter_templ_needs_rebuild( - TABLE* altered_table, - Alter_inplace_info* ha_alter_info, - dict_table_t* table) + const TABLE* altered_table, + const Alter_inplace_info* ha_alter_info, + const dict_table_t* table) { ulint i = 0; @@ -8398,8 +8383,7 @@ alter_templ_needs_rebuild( for (ulint j=0; j < table->n_cols; j++) { dict_col_t* cols = dict_table_get_nth_col(table, j); - if (cf.length > cols->len - && dict_col_in_v_indexes(table, cols)) { + if (cf.length > cols->len) { return(true); } } |