diff options
Diffstat (limited to 'sql/sql_table.cc')
-rw-r--r-- | sql/sql_table.cc | 256 |
1 files changed, 115 insertions, 141 deletions
diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 99084152cf2..cd368da934b 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -6098,10 +6098,9 @@ drop_create_field: it.remove(); if (alter_info->create_list.is_empty()) { - alter_info->flags&= ~Alter_info::ALTER_ADD_COLUMN; + alter_info->flags&= ~ALTER_PARSER_ADD_COLUMN; if (alter_info->key_list.is_empty()) - alter_info->flags&= ~(Alter_info::ALTER_ADD_INDEX | - Alter_info::ADD_FOREIGN_KEY); + alter_info->flags&= ~(ALTER_ADD_INDEX | ALTER_ADD_FOREIGN_KEY); } } } @@ -6137,10 +6136,9 @@ drop_create_field: it.remove(); if (alter_info->create_list.is_empty()) { - alter_info->flags&= ~(Alter_info::ALTER_ADD_COLUMN | - Alter_info::ALTER_CHANGE_COLUMN); + alter_info->flags&= ~(ALTER_PARSER_ADD_COLUMN | ALTER_CHANGE_COLUMN); if (alter_info->key_list.is_empty()) - alter_info->flags&= ~Alter_info::ALTER_ADD_INDEX; + alter_info->flags&= ~ALTER_ADD_INDEX; } } } @@ -6174,7 +6172,7 @@ drop_create_field: it.remove(); if (alter_info->alter_list.is_empty()) { - alter_info->flags&= ~(Alter_info::ALTER_CHANGE_COLUMN_DEFAULT); + alter_info->flags&= ~(ALTER_CHANGE_COLUMN_DEFAULT); } } } @@ -6281,9 +6279,9 @@ drop_create_field: drop->type_name(), drop->name); drop_it.remove(); if (alter_info->drop_list.is_empty()) - alter_info->flags&= ~(Alter_info::ALTER_DROP_COLUMN | - Alter_info::ALTER_DROP_INDEX | - Alter_info::DROP_FOREIGN_KEY); + alter_info->flags&= ~(ALTER_PARSER_DROP_COLUMN | + ALTER_DROP_INDEX | + ALTER_DROP_FOREIGN_KEY); } } } @@ -6382,8 +6380,7 @@ remove_key: key_it.remove(); } if (alter_info->key_list.is_empty()) - alter_info->flags&= ~(Alter_info::ALTER_ADD_INDEX | - Alter_info::ADD_FOREIGN_KEY); + alter_info->flags&= ~(ALTER_ADD_INDEX | ALTER_ADD_FOREIGN_KEY); } else { @@ -6394,7 +6391,7 @@ remove_key: if (ad != NULL) { // Adding the index into the drop list for replacing - alter_info->flags |= Alter_info::ALTER_DROP_INDEX; + alter_info->flags |= ALTER_DROP_INDEX; alter_info->drop_list.push_back(ad, thd->mem_root); } } @@ -6407,7 +6404,7 @@ remove_key: if (tab_part_info) { /* ALTER TABLE ADD PARTITION IF NOT EXISTS */ - if ((alter_info->flags & Alter_info::ALTER_ADD_PARTITION) && + if ((alter_info->flags & ALTER_ADD_PARTITION) && thd->lex->create_info.if_not_exists()) { partition_info *alt_part_info= thd->lex->part_info; @@ -6423,7 +6420,7 @@ remove_key: ER_SAME_NAME_PARTITION, ER_THD(thd, ER_SAME_NAME_PARTITION), pe->partition_name); - alter_info->flags&= ~Alter_info::ALTER_ADD_PARTITION; + alter_info->flags&= ~ALTER_ADD_PARTITION; thd->work_part_info= NULL; break; } @@ -6431,7 +6428,7 @@ remove_key: } } /* ALTER TABLE DROP PARTITION IF EXISTS */ - if ((alter_info->flags & Alter_info::ALTER_DROP_PARTITION) && + if ((alter_info->flags & ALTER_DROP_PARTITION) && thd->lex->if_exists()) { List_iterator<const char> names_it(alter_info->partition_names); @@ -6457,7 +6454,7 @@ remove_key: } } if (alter_info->partition_names.elements == 0) - alter_info->flags&= ~Alter_info::ALTER_DROP_PARTITION; + alter_info->flags&= ~ALTER_DROP_PARTITION; } } #endif /*WITH_PARTITION_STORAGE_ENGINE*/ @@ -6487,7 +6484,7 @@ remove_key: "CHECK", check->name.str); it.remove(); if (alter_info->check_constraint_list.elements == 0) - alter_info->flags&= ~Alter_info::ALTER_ADD_CHECK_CONSTRAINT; + alter_info->flags&= ~ALTER_ADD_CHECK_CONSTRAINT; break; } @@ -6580,6 +6577,7 @@ static bool fill_alter_inplace_info(THD *thd, uint candidate_key_count= 0; Alter_info *alter_info= ha_alter_info->alter_info; DBUG_ENTER("fill_alter_inplace_info"); + DBUG_PRINT("info", ("alter_info->flags: %llu", alter_info->flags)); /* Allocate result buffers. */ if (! (ha_alter_info->index_drop_buffer= @@ -6590,61 +6588,47 @@ static bool fill_alter_inplace_info(THD *thd, DBUG_RETURN(true); /* + Copy parser flags, but remove some flags that handlers doesn't + need to care about (old engines may not ignore these parser flags). + ALTER_RENAME_COLUMN is replaced by ALTER_COLUMN_NAME. + ALTER_CHANGE_COLUMN_DEFAULT is replaced by ALTER_CHANGE_COLUMN + ALTER_PARSE_ADD_COLUMN, ALTER_PARSE_DROP_COLUMN, ALTER_ADD_INDEX and + ALTER_DROP_INDEX are replaced with versions that have higher granuality. + */ + + ha_alter_info->handler_flags|= (alter_info->flags & + ~(ALTER_ADD_INDEX | + ALTER_DROP_INDEX | + ALTER_PARSER_ADD_COLUMN | + ALTER_PARSER_DROP_COLUMN | + ALTER_COLUMN_ORDER | + ALTER_RENAME_COLUMN | + ALTER_CHANGE_COLUMN | + ALTER_ADMIN_PARTITION | + ALTER_REBUILD_PARTITION | + ALTER_EXCHANGE_PARTITION | + ALTER_TRUNCATE_PARTITION | + ALTER_COLUMN_UNVERSIONED)); + /* Comparing new and old default values of column is cumbersome. So instead of using such a comparison for detecting if default has really changed we rely on flags set by parser to get an approximate value for storage engine flag. */ - if (alter_info->flags & (Alter_info::ALTER_CHANGE_COLUMN | - Alter_info::ALTER_CHANGE_COLUMN_DEFAULT)) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_DEFAULT; - if (alter_info->flags & Alter_info::ADD_FOREIGN_KEY) - ha_alter_info->handler_flags|= Alter_inplace_info::ADD_FOREIGN_KEY; - if (alter_info->flags & Alter_info::DROP_FOREIGN_KEY) - ha_alter_info->handler_flags|= Alter_inplace_info::DROP_FOREIGN_KEY; - if (alter_info->flags & Alter_info::ALTER_OPTIONS) - ha_alter_info->handler_flags|= Alter_inplace_info::CHANGE_CREATE_OPTION; - if (alter_info->flags & Alter_info::ALTER_RENAME) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_RENAME; - /* Check partition changes */ - if (alter_info->flags & Alter_info::ALTER_ADD_PARTITION) - ha_alter_info->handler_flags|= Alter_inplace_info::ADD_PARTITION; - if (alter_info->flags & Alter_info::ALTER_DROP_PARTITION) - ha_alter_info->handler_flags|= Alter_inplace_info::DROP_PARTITION; - if (alter_info->flags & Alter_info::ALTER_PARTITION) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_PARTITION; - if (alter_info->flags & Alter_info::ALTER_COALESCE_PARTITION) - ha_alter_info->handler_flags|= Alter_inplace_info::COALESCE_PARTITION; - if (alter_info->flags & Alter_info::ALTER_REORGANIZE_PARTITION) - ha_alter_info->handler_flags|= Alter_inplace_info::REORGANIZE_PARTITION; - if (alter_info->flags & Alter_info::ALTER_TABLE_REORG) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_TABLE_REORG; - if (alter_info->flags & Alter_info::ALTER_REMOVE_PARTITIONING) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_REMOVE_PARTITIONING; - if (alter_info->flags & Alter_info::ALTER_ALL_PARTITION) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_ALL_PARTITION; - /* Check for: ALTER TABLE FORCE, ALTER TABLE ENGINE and OPTIMIZE TABLE. */ - if (alter_info->flags & Alter_info::ALTER_RECREATE) - ha_alter_info->handler_flags|= Alter_inplace_info::RECREATE_TABLE; - if (alter_info->flags & Alter_info::ALTER_ADD_CHECK_CONSTRAINT) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_ADD_CHECK_CONSTRAINT; - if (alter_info->flags & Alter_info::ALTER_DROP_CHECK_CONSTRAINT) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_DROP_CHECK_CONSTRAINT; - if (thd->variables.vers_alter_history == VERS_ALTER_HISTORY_DROP) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_DROP_HISTORICAL; - if (alter_info->flags & Alter_info::ALTER_COLUMN_UNVERSIONED) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_UNVERSIONED; - if (alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_ADD_SYSTEM_VERSIONING; - if (alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_DROP_SYSTEM_VERSIONING; + if (alter_info->flags & ALTER_CHANGE_COLUMN) + ha_alter_info->handler_flags|= ALTER_COLUMN_DEFAULT; /* If we altering table with old VARCHAR fields we will be automatically upgrading VARCHAR column types. */ if (table->s->frm_version < FRM_VER_TRUE_VARCHAR && varchar) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_STORED_COLUMN_TYPE; + ha_alter_info->handler_flags|= ALTER_STORED_COLUMN_TYPE; + + if (thd->variables.vers_alter_history == VERS_ALTER_HISTORY_DROP) + ha_alter_info->handler_flags|= ALTER_DROP_HISTORICAL; + + DBUG_PRINT("info", ("handler_flags: %llu", ha_alter_info->handler_flags)); /* Go through fields in old version of table and detect changes to them. @@ -6690,11 +6674,9 @@ static bool fill_alter_inplace_info(THD *thd, case IS_EQUAL_NO: /* New column type is incompatible with old one. */ if (field->stored_in_db()) - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_STORED_COLUMN_TYPE; + ha_alter_info->handler_flags|= ALTER_STORED_COLUMN_TYPE; else - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_VIRTUAL_COLUMN_TYPE; + ha_alter_info->handler_flags|= ALTER_VIRTUAL_COLUMN_TYPE; if (table->s->tmp_table == NO_TMP_TABLE) { delete_statistics_for_column(thd, table, field); @@ -6733,38 +6715,35 @@ static bool fill_alter_inplace_info(THD *thd, be carried out by simply updating data dictionary without changing actual data (for example, VARCHAR(300) is changed to VARCHAR(400)). */ - ha_alter_info->handler_flags|= Alter_inplace_info:: - ALTER_COLUMN_EQUAL_PACK_LENGTH; + ha_alter_info->handler_flags|= ALTER_COLUMN_EQUAL_PACK_LENGTH; break; default: DBUG_ASSERT(0); /* Safety. */ - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_STORED_COLUMN_TYPE; + ha_alter_info->handler_flags|= ALTER_STORED_COLUMN_TYPE; } if (field->vcol_info || new_field->vcol_info) { /* base <-> virtual or stored <-> virtual */ if (field->stored_in_db() != new_field->stored_in_db()) - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_STORED_COLUMN_TYPE | - Alter_inplace_info::ALTER_VIRTUAL_COLUMN_TYPE; + ha_alter_info->handler_flags|= ( ALTER_STORED_COLUMN_TYPE | + ALTER_VIRTUAL_COLUMN_TYPE); if (field->vcol_info && new_field->vcol_info) { bool value_changes= is_equal == IS_EQUAL_NO; - Alter_inplace_info::HA_ALTER_FLAGS alter_expr; + alter_table_operations alter_expr; if (field->stored_in_db()) - alter_expr= Alter_inplace_info::ALTER_STORED_GCOL_EXPR; + alter_expr= ALTER_STORED_GCOL_EXPR; else - alter_expr= Alter_inplace_info::ALTER_VIRTUAL_GCOL_EXPR; + alter_expr= ALTER_VIRTUAL_GCOL_EXPR; if (!field->vcol_info->is_equal(new_field->vcol_info)) { ha_alter_info->handler_flags|= alter_expr; value_changes= true; } - if ((ha_alter_info->handler_flags & Alter_inplace_info::ALTER_COLUMN_DEFAULT) + if ((ha_alter_info->handler_flags & ALTER_COLUMN_DEFAULT) && !(ha_alter_info->handler_flags & alter_expr)) { /* a DEFAULT value of a some column was changed. see if this vcol @@ -6783,15 +6762,13 @@ static bool fill_alter_inplace_info(THD *thd, field->flags & PART_KEY_FLAG) { if (value_changes) - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_COLUMN_VCOL; + ha_alter_info->handler_flags|= ALTER_COLUMN_VCOL; else maybe_alter_vcol= true; } } else /* base <-> stored */ - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_STORED_COLUMN_TYPE; + ha_alter_info->handler_flags|= ALTER_STORED_COLUMN_TYPE; } /* Check if field was renamed */ @@ -6799,7 +6776,7 @@ static bool fill_alter_inplace_info(THD *thd, &new_field->field_name)) { field->flags|= FIELD_IS_RENAMED; - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_NAME; + ha_alter_info->handler_flags|= ALTER_COLUMN_NAME; rename_column_in_stat_tables(thd, table, field, new_field->field_name.str); } @@ -6809,11 +6786,9 @@ static bool fill_alter_inplace_info(THD *thd, (uint) (field->flags & NOT_NULL_FLAG)) { if (new_field->flags & NOT_NULL_FLAG) - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE; + ha_alter_info->handler_flags|= ALTER_COLUMN_NOT_NULLABLE; else - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_COLUMN_NULLABLE; + ha_alter_info->handler_flags|= ALTER_COLUMN_NULLABLE; } /* @@ -6827,30 +6802,26 @@ static bool fill_alter_inplace_info(THD *thd, if (field->stored_in_db()) { if (field_stored_index != new_field_stored_index) - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_STORED_COLUMN_ORDER; + ha_alter_info->handler_flags|= ALTER_STORED_COLUMN_ORDER; } else { if (field->field_index != new_field_index) - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_VIRTUAL_COLUMN_ORDER; + ha_alter_info->handler_flags|= ALTER_VIRTUAL_COLUMN_ORDER; } /* Detect changes in storage type of column */ if (new_field->field_storage_type() != field->field_storage_type()) - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_COLUMN_STORAGE_TYPE; + ha_alter_info->handler_flags|= ALTER_COLUMN_STORAGE_TYPE; /* Detect changes in column format of column */ if (new_field->column_format() != field->column_format()) - ha_alter_info->handler_flags|= - Alter_inplace_info::ALTER_COLUMN_COLUMN_FORMAT; + ha_alter_info->handler_flags|= ALTER_COLUMN_COLUMN_FORMAT; if (engine_options_differ(field->option_struct, new_field->option_struct, table->file->ht->field_options)) { - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_OPTION; + ha_alter_info->handler_flags|= ALTER_COLUMN_OPTION; ha_alter_info->create_info->fields_option_struct[f_ptr - table->field]= new_field->option_struct; } @@ -6861,9 +6832,9 @@ static bool fill_alter_inplace_info(THD *thd, // Field is not present in new version of table and therefore was dropped. field->flags|= FIELD_IS_DROPPED; if (field->stored_in_db()) - ha_alter_info->handler_flags|= Alter_inplace_info::DROP_STORED_COLUMN; + ha_alter_info->handler_flags|= ALTER_DROP_STORED_COLUMN; else - ha_alter_info->handler_flags|= Alter_inplace_info::DROP_VIRTUAL_COLUMN; + ha_alter_info->handler_flags|= ALTER_DROP_VIRTUAL_COLUMN; } } @@ -6875,12 +6846,11 @@ static bool fill_alter_inplace_info(THD *thd, (FIXME), so let's just say that a vcol *might* be affected if any other column was altered. */ - if (ha_alter_info->handler_flags & - ( Alter_inplace_info::ALTER_STORED_COLUMN_TYPE - | Alter_inplace_info::ALTER_VIRTUAL_COLUMN_TYPE - | Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE - | Alter_inplace_info::ALTER_COLUMN_OPTION )) - ha_alter_info->handler_flags|= Alter_inplace_info::ALTER_COLUMN_VCOL; + if (ha_alter_info->handler_flags & (ALTER_STORED_COLUMN_TYPE | + ALTER_VIRTUAL_COLUMN_TYPE | + ALTER_COLUMN_NOT_NULLABLE | + ALTER_COLUMN_OPTION)) + ha_alter_info->handler_flags|= ALTER_COLUMN_VCOL; } new_field_it.init(alter_info->create_list); @@ -6890,15 +6860,14 @@ static bool fill_alter_inplace_info(THD *thd, { // Field is not present in old version of table and therefore was added. if (new_field->vcol_info) + { if (new_field->stored_in_db()) - ha_alter_info->handler_flags|= - Alter_inplace_info::ADD_STORED_GENERATED_COLUMN; + ha_alter_info->handler_flags|= ALTER_ADD_STORED_GENERATED_COLUMN; else - ha_alter_info->handler_flags|= - Alter_inplace_info::ADD_VIRTUAL_COLUMN; + ha_alter_info->handler_flags|= ALTER_ADD_VIRTUAL_COLUMN; + } else - ha_alter_info->handler_flags|= - Alter_inplace_info::ADD_STORED_BASE_COLUMN; + ha_alter_info->handler_flags|= ALTER_ADD_STORED_BASE_COLUMN; } } @@ -7080,18 +7049,18 @@ static bool fill_alter_inplace_info(THD *thd, */ if ((uint) (table_key - table->key_info) == table->s->primary_key) { - ha_alter_info->handler_flags|= Alter_inplace_info::DROP_PK_INDEX; + ha_alter_info->handler_flags|= ALTER_DROP_PK_INDEX; candidate_key_count--; } else { - ha_alter_info->handler_flags|= Alter_inplace_info::DROP_UNIQUE_INDEX; + ha_alter_info->handler_flags|= ALTER_DROP_UNIQUE_INDEX; if (is_candidate_key(table_key)) candidate_key_count--; } } else - ha_alter_info->handler_flags|= Alter_inplace_info::DROP_INDEX; + ha_alter_info->handler_flags|= ALTER_DROP_NON_UNIQUE_NON_PRIM_INDEX; } /* Now figure out what kind of indexes we are adding. */ @@ -7110,20 +7079,21 @@ static bool fill_alter_inplace_info(THD *thd, { /* Candidate key or primary key! */ if (candidate_key_count == 0 || is_pk) - ha_alter_info->handler_flags|= Alter_inplace_info::ADD_PK_INDEX; + ha_alter_info->handler_flags|= ALTER_ADD_PK_INDEX; else - ha_alter_info->handler_flags|= Alter_inplace_info::ADD_UNIQUE_INDEX; + ha_alter_info->handler_flags|= ALTER_ADD_UNIQUE_INDEX; candidate_key_count++; } else { - ha_alter_info->handler_flags|= Alter_inplace_info::ADD_UNIQUE_INDEX; + ha_alter_info->handler_flags|= ALTER_ADD_UNIQUE_INDEX; } } else - ha_alter_info->handler_flags|= Alter_inplace_info::ADD_INDEX; + ha_alter_info->handler_flags|= ALTER_ADD_NON_UNIQUE_NON_PRIM_INDEX; } + DBUG_PRINT("exit", ("handler_flags: %llu", ha_alter_info->handler_flags)); DBUG_RETURN(false); } @@ -7425,8 +7395,7 @@ static bool is_inplace_alter_impossible(TABLE *table, not supported for in-place in combination with other operations. Alone, it will be done by simple_rename_or_index_change(). */ - if (alter_info->flags & (Alter_info::ALTER_ORDER | - Alter_info::ALTER_KEYS_ONOFF)) + if (alter_info->flags & (ALTER_ORDER | ALTER_KEYS_ONOFF)) DBUG_RETURN(true); /* @@ -7527,7 +7496,7 @@ static bool mysql_inplace_alter_table(THD *thd, inplace_supported == HA_ALTER_INPLACE_NO_LOCK_AFTER_PREPARE) && (thd->locked_tables_mode == LTM_LOCK_TABLES || thd->locked_tables_mode == LTM_PRELOCKED_UNDER_LOCK_TABLES)) || - alter_info->requested_lock == Alter_info::ALTER_TABLE_LOCK_EXCLUSIVE) + alter_info->requested_lock == Alter_info::ALTER_TABLE_LOCK_EXCLUSIVE) { if (wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN)) goto cleanup; @@ -8003,7 +7972,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, */ if (drop && field->invisible < INVISIBLE_SYSTEM && !(field->flags & VERS_SYSTEM_FIELD && - !(alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING))) + !(alter_info->flags & ALTER_DROP_SYSTEM_VERSIONING))) { /* Reset auto_increment value if it was dropped */ if (MTYP_TYPENR(field->unireg_check) == Field::NEXT_NUMBER && @@ -8024,7 +7993,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, /* invisible versioning column is dropped automatically on DROP SYSTEM VERSIONING */ if (!drop && field->invisible >= INVISIBLE_SYSTEM && field->flags & VERS_SYSTEM_FIELD && - alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING) + alter_info->flags & ALTER_DROP_SYSTEM_VERSIONING) { if (table->s->tmp_table == NO_TMP_TABLE) (void) delete_statistics_for_column(thd, table, field); @@ -8035,7 +8004,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, If we are doing a rename of a column, update all references in virtual column expressions, constraints and defaults to use the new column name */ - if (alter_info->flags & Alter_info::ALTER_RENAME_COLUMN) + if (alter_info->flags & ALTER_RENAME_COLUMN) { if (field->vcol_info) field->vcol_info->expr->walk(&Item::rename_fields_processor, 1, @@ -8083,7 +8052,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, def_it.remove(); } } - else if (alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING && + else if (alter_info->flags & ALTER_DROP_SYSTEM_VERSIONING && field->flags & VERS_SYSTEM_FIELD && field->invisible < INVISIBLE_SYSTEM) { @@ -8094,12 +8063,12 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, } else if (drop && field->invisible < INVISIBLE_SYSTEM && field->flags & VERS_SYSTEM_FIELD && - !(alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING)) + !(alter_info->flags & ALTER_DROP_SYSTEM_VERSIONING)) { /* "dropping" a versioning field only hides it from the user */ def= new (thd->mem_root) Create_field(thd, field, field); def->invisible= INVISIBLE_SYSTEM; - alter_info->flags|= Alter_info::ALTER_CHANGE_COLUMN; + alter_info->flags|= ALTER_CHANGE_COLUMN; if (field->flags & VERS_SYS_START_FLAG) create_info->vers_info.as_row.start= def->field_name= Vers_parse_info::default_start; else @@ -8136,7 +8105,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, } dropped_sys_vers_fields &= VERS_SYSTEM_FIELD; if ((dropped_sys_vers_fields || - alter_info->flags & Alter_info::ALTER_DROP_PERIOD) && + alter_info->flags & ALTER_DROP_PERIOD) && dropped_sys_vers_fields != VERS_SYSTEM_FIELD) { StringBuffer<NAME_LEN*3> tmp; @@ -8147,8 +8116,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, my_error(ER_MISSING, MYF(0), table->s->table_name.str, tmp.c_ptr()); goto err; } - alter_info->flags &= - ~(Alter_info::ALTER_DROP_PERIOD | Alter_info::ALTER_ADD_PERIOD); + alter_info->flags &= ~(ALTER_DROP_PERIOD | ALTER_ADD_PERIOD); def_it.rewind(); while ((def=def_it++)) // Add new columns { @@ -8194,7 +8162,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, alter_ctx->error_if_not_empty= TRUE; } if (def->flags & VERS_SYSTEM_FIELD && - !(alter_info->flags & Alter_info::ALTER_ADD_SYSTEM_VERSIONING)) + !(alter_info->flags & ALTER_ADD_SYSTEM_VERSIONING)) { my_error(ER_VERS_NOT_VERSIONED, MYF(0), table->s->table_name.str); goto err; @@ -8545,7 +8513,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, } } - if (table->versioned() && !(alter_info->flags & Alter_info::ALTER_DROP_SYSTEM_VERSIONING) && + if (table->versioned() && !(alter_info->flags & ALTER_DROP_SYSTEM_VERSIONING) && new_create_list.elements == VERSIONING_FIELDS) { my_error(ER_VERS_TABLE_MUST_HAVE_COLUMNS, MYF(0), table->s->table_name.str); @@ -9169,7 +9137,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, const LEX_CSTRING *n } #ifdef WITH_PARTITION_STORAGE_ENGINE - if (alter_info->flags & Alter_info::ALTER_PARTITION) + if (alter_info->flags & ALTER_PARTITION) { my_error(ER_WRONG_USAGE, MYF(0), "PARTITION", "log table"); DBUG_RETURN(true); @@ -9240,7 +9208,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, const LEX_CSTRING *n if (table_list->table->versioned(VERS_TRX_ID) && alter_info->requested_algorithm == - Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT && + Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT && !table_list->table->s->partition_info_str) { // Changle default ALGORITHM to COPY for INNODB @@ -9380,7 +9348,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, const LEX_CSTRING *n } if ((create_info->db_type != table->s->db_type() || - alter_info->flags & Alter_info::ALTER_PARTITION) && + alter_info->flags & ALTER_PARTITION) && !table->file->can_switch_engines()) { my_error(ER_ROW_IS_REFERENCED, MYF(0)); @@ -9395,7 +9363,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, const LEX_CSTRING *n create_info->db_type is set here, check to parent table access is delayed till this point for the alter operation. */ - if ((alter_info->flags & Alter_info::ADD_FOREIGN_KEY) && + if ((alter_info->flags & ALTER_ADD_FOREIGN_KEY) && check_fk_parent_table_access(thd, create_info, alter_info, new_db->str)) DBUG_RETURN(true); @@ -9469,8 +9437,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, const LEX_CSTRING *n Test if we are only doing RENAME or KEYS ON/OFF. This works as we are testing if flags == 0 above. */ - if (!(alter_info->flags & ~(Alter_info::ALTER_RENAME | - Alter_info::ALTER_KEYS_ONOFF)) && + if (!(alter_info->flags & ~(ALTER_RENAME | ALTER_KEYS_ONOFF)) && alter_info->requested_algorithm != Alter_info::ALTER_TABLE_ALGORITHM_COPY) // No need to touch frm. { @@ -9608,7 +9575,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, const LEX_CSTRING *n */ if (create_info->db_type == table->s->db_type() && create_info->used_fields & HA_CREATE_USED_ENGINE) - alter_info->flags|= Alter_info::ALTER_RECREATE; + alter_info->flags|= ALTER_RECREATE; /* If the old table had partitions and we are doing ALTER TABLE ... @@ -9732,7 +9699,15 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, const LEX_CSTRING *n if (fill_alter_inplace_info(thd, table, varchar, &ha_alter_info)) goto err_new_table_cleanup; - if (ha_alter_info.handler_flags == 0) + /* + We can ignore ALTER_COLUMN_ORDER and instead check + ALTER_STORED_COLUMN_ORDER & ALTER_VIRTUAL_COLUMN_ORDER. This + is ok as ALTER_COLUMN_ORDER may be wrong if we use AFTER last_field + ALTER_COLUMN_NAME is set if field really was renamed. + */ + + if (!(ha_alter_info.handler_flags & + ~(ALTER_COLUMN_ORDER | ALTER_RENAME_COLUMN))) { /* No-op ALTER, no need to call handler API functions. @@ -10139,7 +10114,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db, const LEX_CSTRING *n { DBUG_ASSERT(alter_info && table_list); VTMD_rename vtmd(*table_list); - bool rc= alter_info->flags & Alter_info::ALTER_RENAME ? + bool rc= alter_info->flags & ALTER_RENAME ? vtmd.try_rename(thd, alter_ctx.new_db.str, alter_ctx.new_alias.str, backup_name.str) : vtmd.update(thd, backup_name.str); if (rc) @@ -10729,8 +10704,7 @@ bool mysql_recreate_table(THD *thd, TABLE_LIST *table_list, bool table_copy) create_info.row_type=ROW_TYPE_NOT_USED; create_info.default_table_charset=default_charset_info; /* Force alter table to recreate table */ - alter_info.flags= (Alter_info::ALTER_CHANGE_COLUMN | - Alter_info::ALTER_RECREATE); + alter_info.flags= (ALTER_CHANGE_COLUMN | ALTER_RECREATE); if (table_copy) alter_info.requested_algorithm= Alter_info::ALTER_TABLE_ALGORITHM_COPY; |