diff options
author | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-04-25 14:27:00 +0530 |
---|---|---|
committer | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-05-04 09:35:38 +0530 |
commit | ec9908b2577758ffb3cb0d1b06400f12ff47b81c (patch) | |
tree | a18426dce230626e84f752cf5d966d8e205f530b /sql | |
parent | f98017bb6df0110aa0a359ab4378cc97f6a95473 (diff) | |
download | mariadb-git-ec9908b2577758ffb3cb0d1b06400f12ff47b81c.tar.gz |
MDEV-16288 ALTER TABLE…ALGORITHM=DEFAULT does not override alter_algorithm
- ALTER_ALGORITHM should be substituted when there is no mention of
algorithm in alter statement.
- Introduced algorithm(thd) in Alter_info. It returns the
user requested algorithm. If user doesn't specify algorithm explicitly then
it returns alter_algorithm variable.
- changed algorithm() to get_algorithm(thd) to return algorithm name for
displaying the error.
- set_requested_algorithm(algo_value) to avoid direct assignment on
requested_algorithm variable.
- Avoid direct access of requested_algorithm to encapsulate
requested_algorithm variable
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_alter.cc | 34 | ||||
-rw-r--r-- | sql/sql_alter.h | 26 | ||||
-rw-r--r-- | sql/sql_partition.cc | 2 | ||||
-rw-r--r-- | sql/sql_table.cc | 18 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 4 | ||||
-rw-r--r-- | sql/sql_yacc_ora.yy | 4 |
6 files changed, 60 insertions, 28 deletions
diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc index b3a036eda9e..a68dcb31a4c 100644 --- a/sql/sql_alter.cc +++ b/sql/sql_alter.cc @@ -69,6 +69,10 @@ bool Alter_info::set_requested_algorithm(const LEX_CSTRING *str) return false; } +void Alter_info::set_requested_algorithm(enum_alter_table_algorithm algo_val) +{ + requested_algorithm= algo_val; +} bool Alter_info::set_requested_lock(const LEX_CSTRING *str) { @@ -86,13 +90,16 @@ bool Alter_info::set_requested_lock(const LEX_CSTRING *str) return false; } -const char* Alter_info::algorithm() const +const char* Alter_info::algorithm_clause(THD *thd) const { - switch (requested_algorithm) { + switch (algorithm(thd)) { case ALTER_TABLE_ALGORITHM_INPLACE: return "ALGORITHM=INPLACE"; case ALTER_TABLE_ALGORITHM_COPY: return "ALGORITHM=COPY"; + case ALTER_TABLE_ALGORITHM_NONE: + DBUG_ASSERT(0); + /* Fall through */ case ALTER_TABLE_ALGORITHM_DEFAULT: return "ALGORITHM=DEFAULT"; case ALTER_TABLE_ALGORITHM_NOCOPY: @@ -123,9 +130,6 @@ const char* Alter_info::lock() const bool Alter_info::supports_algorithm(THD *thd, enum_alter_inplace_result result, const Alter_inplace_info *ha_alter_info) { - if (requested_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT) - requested_algorithm = (Alter_info::enum_alter_table_algorithm) thd->variables.alter_algorithm; - switch (result) { case HA_ALTER_INPLACE_EXCLUSIVE_LOCK: case HA_ALTER_INPLACE_SHARED_LOCK: @@ -134,16 +138,16 @@ bool Alter_info::supports_algorithm(THD *thd, enum_alter_inplace_result result, return false; case HA_ALTER_INPLACE_COPY_NO_LOCK: case HA_ALTER_INPLACE_COPY_LOCK: - if (requested_algorithm >= Alter_info::ALTER_TABLE_ALGORITHM_NOCOPY) + if (algorithm(thd) >= Alter_info::ALTER_TABLE_ALGORITHM_NOCOPY) { - ha_alter_info->report_unsupported_error(algorithm(), + ha_alter_info->report_unsupported_error(algorithm_clause(thd), "ALGORITHM=INPLACE"); return true; } return false; case HA_ALTER_INPLACE_NOCOPY_NO_LOCK: case HA_ALTER_INPLACE_NOCOPY_LOCK: - if (requested_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_INSTANT) + if (algorithm(thd) == Alter_info::ALTER_TABLE_ALGORITHM_INSTANT) { ha_alter_info->report_unsupported_error("ALGORITHM=INSTANT", "ALGORITHM=NOCOPY"); @@ -151,9 +155,9 @@ bool Alter_info::supports_algorithm(THD *thd, enum_alter_inplace_result result, } return false; case HA_ALTER_INPLACE_NOT_SUPPORTED: - if (requested_algorithm >= Alter_info::ALTER_TABLE_ALGORITHM_INPLACE) + if (algorithm(thd) >= Alter_info::ALTER_TABLE_ALGORITHM_INPLACE) { - ha_alter_info->report_unsupported_error(algorithm(), + ha_alter_info->report_unsupported_error(algorithm_clause(thd), "ALGORITHM=COPY"); return true; } @@ -174,7 +178,7 @@ bool Alter_info::supports_lock(THD *thd, enum_alter_inplace_result result, case HA_ALTER_INPLACE_EXCLUSIVE_LOCK: // If SHARED lock and no particular algorithm was requested, use COPY. if (requested_lock == Alter_info::ALTER_TABLE_LOCK_SHARED && - requested_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT && + algorithm(thd) == Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT && thd->variables.alter_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT) return false; @@ -237,6 +241,14 @@ bool Alter_info::vers_prohibited(THD *thd) const return false; } +Alter_info::enum_alter_table_algorithm +Alter_info::algorithm(const THD *thd) const +{ + if (requested_algorithm == ALTER_TABLE_ALGORITHM_NONE) + return (Alter_info::enum_alter_table_algorithm) thd->variables.alter_algorithm; + return requested_algorithm; +} + Alter_table_ctx::Alter_table_ctx() : datetime_field(NULL), error_if_not_empty(false), diff --git a/sql/sql_alter.h b/sql/sql_alter.h index 10aafe1ab37..53d0c8438f8 100644 --- a/sql/sql_alter.h +++ b/sql/sql_alter.h @@ -57,7 +57,10 @@ public: ALTER_TABLE_ALGORITHM_NOCOPY, // Instant should allow any operation that changes metadata only. - ALTER_TABLE_ALGORITHM_INSTANT + ALTER_TABLE_ALGORITHM_INSTANT, + + // When there is no specification of algorithm during alter table. + ALTER_TABLE_ALGORITHM_NONE }; @@ -104,8 +107,11 @@ public: List<const char> partition_names; // Number of partitions. uint num_parts; +private: // Type of ALTER TABLE algorithm. enum_alter_table_algorithm requested_algorithm; + +public: // Type of ALTER TABLE lock. enum_alter_table_lock requested_lock; @@ -114,7 +120,7 @@ public: flags(0), partition_flags(0), keys_onoff(LEAVE_AS_IS), num_parts(0), - requested_algorithm(ALTER_TABLE_ALGORITHM_DEFAULT), + requested_algorithm(ALTER_TABLE_ALGORITHM_NONE), requested_lock(ALTER_TABLE_LOCK_DEFAULT) {} @@ -130,7 +136,7 @@ public: keys_onoff= LEAVE_AS_IS; num_parts= 0; partition_names.empty(); - requested_algorithm= ALTER_TABLE_ALGORITHM_DEFAULT; + requested_algorithm= ALTER_TABLE_ALGORITHM_NONE; requested_lock= ALTER_TABLE_LOCK_DEFAULT; } @@ -178,9 +184,15 @@ public: bool set_requested_lock(const LEX_CSTRING *str); /** + Set the requested algorithm to the given algorithm value + @param algo_value algorithm to be set + */ + void set_requested_algorithm(enum_alter_table_algorithm algo_value); + + /** Returns the algorithm value in the format "algorithm=value" */ - const char* algorithm() const; + const char* algorithm_clause(THD *thd) const; /** Returns the lock value in the format "lock=value" @@ -216,6 +228,12 @@ public: bool supports_lock(THD *thd, enum_alter_inplace_result result, const Alter_inplace_info *ha_alter_info); + /** + Return user requested algorithm. If user does not specify + algorithm then return alter_algorithm variable value. + */ + enum_alter_table_algorithm algorithm(const THD *thd) const; + private: Alter_info &operator=(const Alter_info &rhs); // not implemented Alter_info(const Alter_info &rhs); // not implemented diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 5fdca153ef7..c557f438b41 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -6008,7 +6008,7 @@ the generated partition syntax in a correct manner. */ if (alter_info->partition_flags != ALTER_PARTITION_INFO || !table->part_info || - alter_info->requested_algorithm != + alter_info->algorithm(thd) != Alter_info::ALTER_TABLE_ALGORITHM_INPLACE || !table->part_info->has_same_partitioning(part_info)) { diff --git a/sql/sql_table.cc b/sql/sql_table.cc index ed1c3c401d3..e2a8cafe784 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -9558,7 +9558,7 @@ do_continue:; */ if (!(alter_info->flags & ~(ALTER_RENAME | ALTER_KEYS_ONOFF)) && alter_info->partition_flags == 0 && - alter_info->requested_algorithm != + alter_info->algorithm(thd) != Alter_info::ALTER_TABLE_ALGORITHM_COPY) // No need to touch frm. { bool res; @@ -9636,7 +9636,7 @@ do_continue:; "LOCK=DEFAULT"); DBUG_RETURN(true); } - else if (alter_info->requested_algorithm != + else if (alter_info->algorithm(thd) != Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT) { my_error(ER_ALTER_OPERATION_NOT_SUPPORTED_REASON, MYF(0), @@ -9676,20 +9676,21 @@ do_continue:; using in-place API. */ if ((thd->variables.alter_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_COPY && - alter_info->requested_algorithm != + alter_info->algorithm(thd) != Alter_info::ALTER_TABLE_ALGORITHM_INPLACE) || is_inplace_alter_impossible(table, create_info, alter_info) || IF_PARTITIONING((partition_changed && !(table->s->db_type()->partition_flags() & HA_USE_AUTO_PARTITION)), 0)) { - if (alter_info->requested_algorithm == + if (alter_info->algorithm(thd) == Alter_info::ALTER_TABLE_ALGORITHM_INPLACE) { my_error(ER_ALTER_OPERATION_NOT_SUPPORTED, MYF(0), "ALGORITHM=INPLACE", "ALGORITHM=COPY"); DBUG_RETURN(true); } - alter_info->requested_algorithm= Alter_info::ALTER_TABLE_ALGORITHM_COPY; + alter_info->set_requested_algorithm( + Alter_info::ALTER_TABLE_ALGORITHM_COPY); } /* @@ -9809,7 +9810,7 @@ do_continue:; /* Remember that we have not created table in storage engine yet. */ bool no_ha_table= true; - if (alter_info->requested_algorithm != Alter_info::ALTER_TABLE_ALGORITHM_COPY) + if (alter_info->algorithm(thd) != Alter_info::ALTER_TABLE_ALGORITHM_COPY) { Alter_inplace_info ha_alter_info(create_info, alter_info, key_info, key_count, @@ -9900,7 +9901,7 @@ do_continue:; // If SHARED lock and no particular algorithm was requested, use COPY. if (inplace_supported == HA_ALTER_INPLACE_EXCLUSIVE_LOCK && alter_info->requested_lock == Alter_info::ALTER_TABLE_LOCK_SHARED && - alter_info->requested_algorithm == + alter_info->algorithm(thd) == Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT && thd->variables.alter_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT) @@ -10743,7 +10744,8 @@ bool mysql_recreate_table(THD *thd, TABLE_LIST *table_list, bool table_copy) alter_info.flags= (ALTER_CHANGE_COLUMN | ALTER_RECREATE); if (table_copy) - alter_info.requested_algorithm= Alter_info::ALTER_TABLE_ALGORITHM_COPY; + alter_info.set_requested_algorithm( + Alter_info::ALTER_TABLE_ALGORITHM_COPY); bool res= mysql_alter_table(thd, &null_clex_str, &null_clex_str, &create_info, table_list, &alter_info, 0, diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 2a382dc7666..14d71139dad 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -8531,8 +8531,8 @@ opt_index_lock_algorithm: alter_algorithm_option: ALGORITHM_SYM opt_equal DEFAULT { - Lex->alter_info.requested_algorithm= - Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT; + Lex->alter_info.set_requested_algorithm( + Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT); } | ALGORITHM_SYM opt_equal ident { diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index c8620543d08..d174e02fc24 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -8468,8 +8468,8 @@ opt_index_lock_algorithm: alter_algorithm_option: ALGORITHM_SYM opt_equal DEFAULT { - Lex->alter_info.requested_algorithm= - Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT; + Lex->alter_info.set_requested_algorithm( + Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT); } | ALGORITHM_SYM opt_equal ident { |