summaryrefslogtreecommitdiff
path: root/storage/innobase
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2021-08-02 16:50:28 +0200
committerOleksandr Byelkin <sanja@mariadb.com>2021-08-02 16:50:28 +0200
commit4902b0fdc91cc6dc169dd2322daf966a2eeafdd8 (patch)
tree202d12a5cd5133d160151dfe1444bcad4fed1a2c /storage/innobase
parent89cc6338531d21469858325296d6ffa0c126ffd3 (diff)
parent7f264997dd21c5126350a9a5f0cc0960afdd1229 (diff)
downloadmariadb-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.cc78
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);
}
}