From: Jon Olav Hauglid Date: December 19 2011 2:41pm Subject: bzr push into mysql-trunk-wl5534 branch (jon.hauglid:3454 to 3455) WL#5534 List-Archive: http://lists.mysql.com/commits/142185 Message-Id: <201112191441.pBJEfJ3n016147@acsmt357.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 3455 Jon Olav Hauglid 2011-12-19 WL#5534 Online ALTER, Phase 1. Patch #67: Review changes: - Make IMPORT/DISCARD tablespace a separate Sql_cmd. - Remove related code from Alter_info and mysql_alter_table(). - Remove unneeded Alter_info parameter in Alter_table_prelocking_strategy. modified: sql/sql_alter.cc sql/sql_alter.h sql/sql_base.h sql/sql_partition_admin.cc sql/sql_table.cc sql/sql_table.h sql/sql_yacc.yy 3454 Jon Olav Hauglid 2011-12-19 WL#5534 Online ALTER, Phase 1. Patch #68: Don't downgrade to MDL_SHARED_UPGRADABLE under LOCK TABLES mode as this will allow other connections to read/write the table thus breaking LOCK TABLES. It would also trigger an assert in MDL_ticket::downgrade_lock(). modified: sql/sql_table.cc === modified file 'sql/sql_alter.cc' --- a/sql/sql_alter.cc 2011-12-14 18:48:50 +0000 +++ b/sql/sql_alter.cc 2011-12-19 14:38:42 +0000 @@ -27,7 +27,6 @@ Alter_info::Alter_info(const Alter_info create_list(rhs.create_list, mem_root), flags(rhs.flags), keys_onoff(rhs.keys_onoff), - tablespace_op(rhs.tablespace_op), partition_names(rhs.partition_names, mem_root), num_parts(rhs.num_parts), datetime_field(rhs.datetime_field), @@ -212,3 +211,50 @@ bool Sql_cmd_alter_table::execute(THD *t DBUG_RETURN(result); } + + +bool Sql_cmd_discard_import_tablespace::execute(THD *thd) +{ + /* first SELECT_LEX (have special meaning for many of non-SELECTcommands) */ + SELECT_LEX *select_lex= &thd->lex->select_lex; + /* first table of first SELECT_LEX */ + TABLE_LIST *table_list= (TABLE_LIST*) select_lex->table_list.first; + + if (check_access(thd, ALTER_ACL, table_list->db, + &table_list->grant.privilege, + &table_list->grant.m_internal, + 0, 0)) + return true; + + if (check_grant(thd, ALTER_ACL, table_list, false, UINT_MAX, false)) + return true; + + thd->enable_slow_log= opt_log_slow_admin_statements; + + /* + Check if we attempt to alter mysql.slow_log or + mysql.general_log table and return an error if + it is the case. + TODO: this design is obsolete and will be removed. + */ + if (table_list && table_list->db && table_list->table_name) + { + int table_kind= check_if_log_table(table_list->db_length, table_list->db, + table_list->table_name_length, + table_list->table_name, false); + + if (table_kind) + { + /* Disable alter of enabled log tables */ + if (logger.is_log_table_enabled(table_kind)) + { + my_error(ER_BAD_LOG_STATEMENT, MYF(0), "ALTER"); + return true; + } + } + } + + return + mysql_discard_or_import_tablespace(thd, table_list, + m_tablespace_op == DISCARD_TABLESPACE); +} === modified file 'sql/sql_alter.h' --- a/sql/sql_alter.h 2011-12-14 18:48:50 +0000 +++ b/sql/sql_alter.h 2011-12-19 14:38:42 +0000 @@ -126,12 +126,6 @@ public: enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE }; - enum enum_tablespace_op_type - { - NO_TABLESPACE_OP, DISCARD_TABLESPACE, IMPORT_TABLESPACE - }; - - /** The different values of the ALGORITHM clause. Describes which algorithm to use when altering the table. @@ -174,7 +168,6 @@ public: List create_list; uint flags; enum_enable_or_disable keys_onoff; - enum_tablespace_op_type tablespace_op; List partition_names; uint num_parts; Create_field *datetime_field; @@ -186,7 +179,6 @@ public: Alter_info() : flags(0), keys_onoff(LEAVE_AS_IS), - tablespace_op(NO_TABLESPACE_OP), num_parts(0), datetime_field(NULL), error_if_not_empty(FALSE), @@ -202,7 +194,6 @@ public: create_list.empty(); flags= 0; keys_onoff= LEAVE_AS_IS; - tablespace_op= NO_TABLESPACE_OP; num_parts= 0; partition_names.empty(); datetime_field= 0; @@ -302,4 +293,27 @@ public: bool execute(THD *thd); }; + +/** + Sql_cmd_alter_table_tablespace represents ALTER TABLE + IMPORT/DISCARD TABLESPACE statements. +*/ +class Sql_cmd_discard_import_tablespace : public Sql_cmd_common_alter_table +{ +public: + enum enum_tablespace_op_type + { + DISCARD_TABLESPACE, IMPORT_TABLESPACE + }; + + Sql_cmd_discard_import_tablespace(enum_tablespace_op_type tablespace_op_arg) + : m_tablespace_op(tablespace_op_arg) + {} + + bool execute(THD *thd); + +private: + const enum_tablespace_op_type m_tablespace_op; +}; + #endif === modified file 'sql/sql_base.h' --- a/sql/sql_base.h 2011-12-07 11:40:21 +0000 +++ b/sql/sql_base.h 2011-12-19 14:38:42 +0000 @@ -430,11 +430,6 @@ class Lock_tables_prelocking_strategy : class Alter_table_prelocking_strategy : public Prelocking_strategy { public: - - Alter_table_prelocking_strategy(Alter_info *alter_info) - : m_alter_info(alter_info) - {} - virtual bool handle_routine(THD *thd, Query_tables_list *prelocking_ctx, Sroutine_hash_entry *rt, sp_head *sp, bool *need_prelocking); @@ -442,9 +437,6 @@ public: TABLE_LIST *table_list, bool *need_prelocking); virtual bool handle_view(THD *thd, Query_tables_list *prelocking_ctx, TABLE_LIST *table_list, bool *need_prelocking); - -private: - Alter_info *m_alter_info; }; === modified file 'sql/sql_partition_admin.cc' --- a/sql/sql_partition_admin.cc 2011-12-13 10:32:06 +0000 +++ b/sql/sql_partition_admin.cc 2011-12-19 14:38:42 +0000 @@ -476,7 +476,7 @@ bool Sql_cmd_alter_table_exchange_partit char temp_file_name[FN_REFLEN+1]; uint swap_part_id; uint part_file_name_len; - Alter_table_prelocking_strategy alter_prelocking_strategy(alter_info); + Alter_table_prelocking_strategy alter_prelocking_strategy; MDL_ticket *swap_table_mdl_ticket= NULL; MDL_ticket *part_table_mdl_ticket= NULL; bool error= TRUE; === modified file 'sql/sql_table.cc' --- a/sql/sql_table.cc 2011-12-19 13:19:36 +0000 +++ b/sql/sql_table.cc 2011-12-19 14:38:42 +0000 @@ -4909,13 +4909,11 @@ err: /* table_list should contain just one table */ -static int -mysql_discard_or_import_tablespace(THD *thd, - TABLE_LIST *table_list, - Alter_info *alter_info) +int mysql_discard_or_import_tablespace(THD *thd, + TABLE_LIST *table_list, + bool discard) { - Alter_table_prelocking_strategy alter_prelocking_strategy(alter_info); - my_bool discard; + Alter_table_prelocking_strategy alter_prelocking_strategy; int error; DBUG_ENTER("mysql_discard_or_import_tablespace"); @@ -4926,8 +4924,6 @@ mysql_discard_or_import_tablespace(THD * THD_STAGE_INFO(thd, stage_discard_or_import_tablespace); - discard= test(alter_info->tablespace_op == Alter_info::DISCARD_TABLESPACE); - /* We set this flag so that ha_innobase::open and ::external_lock() do not complain when we lock the table @@ -6660,19 +6656,6 @@ bool mysql_alter_table(THD *thd,char *ne } } - /* DISCARD/IMPORT TABLESPACE is always alone in an ALTER TABLE */ - if (alter_info->tablespace_op != Alter_info::NO_TABLESPACE_OP) - { - // ALGORITHM and LOCK clauses are not allowed in the parser. - DBUG_ASSERT(alter_info->requested_lock == - Alter_info::ALTER_TABLE_LOCK_DEFAULT && - alter_info->requested_algorithm == - Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT); - /* Conditionally writes to binlog. */ - DBUG_RETURN(mysql_discard_or_import_tablespace(thd,table_list, - alter_info)); - } - THD_STAGE_INFO(thd, stage_init); /* @@ -6682,7 +6665,7 @@ bool mysql_alter_table(THD *thd,char *ne */ table_list->required_type= FRMTYPE_TABLE; - Alter_table_prelocking_strategy alter_prelocking_strategy(alter_info); + Alter_table_prelocking_strategy alter_prelocking_strategy; DEBUG_SYNC(thd, "alter_table_before_open_tables"); uint tables_opened; === modified file 'sql/sql_table.h' --- a/sql/sql_table.h 2011-12-13 10:32:06 +0000 +++ b/sql/sql_table.h 2011-12-19 14:38:42 +0000 @@ -157,6 +157,9 @@ bool mysql_create_table_no_lock(THD *thd bool tmp_table, uint select_field_count, bool *is_trans, bool no_ha_table); +int mysql_discard_or_import_tablespace(THD *thd, + TABLE_LIST *table_list, + bool discard); bool mysql_prepare_alter_table(THD *thd, TABLE *table, HA_CREATE_INFO *create_info, Alter_info *alter_info); === modified file 'sql/sql_yacc.yy' --- a/sql/sql_yacc.yy 2011-12-16 16:40:15 +0000 +++ b/sql/sql_yacc.yy 2011-12-19 14:38:42 +0000 @@ -6765,9 +6765,21 @@ ident_or_empty: alter_commands: /* empty */ | DISCARD TABLESPACE - { Lex->alter_info.tablespace_op= Alter_info::DISCARD_TABLESPACE; } + { + Lex->m_sql_cmd= new (YYTHD->mem_root) + Sql_cmd_discard_import_tablespace( + Sql_cmd_discard_import_tablespace::DISCARD_TABLESPACE); + if (Lex->m_sql_cmd == NULL) + MYSQL_YYABORT; + } | IMPORT TABLESPACE - { Lex->alter_info.tablespace_op= Alter_info::IMPORT_TABLESPACE; } + { + Lex->m_sql_cmd= new (YYTHD->mem_root) + Sql_cmd_discard_import_tablespace( + Sql_cmd_discard_import_tablespace::IMPORT_TABLESPACE); + if (Lex->m_sql_cmd == NULL) + MYSQL_YYABORT; + } | alter_list opt_partitioning | alter_list No bundle (reason: useless for push emails).