From 035b06b4e1cacb0a1abe4c4272661827c2aa00ba Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 18 Jul 2007 15:39:13 +0500 Subject: [PATCH 1/2] BUG#28838 - duplicate external_lock in mysql_alter_table Removed duplicate call to handler::external_lock() when ALTER TABLE that doesn't need to copy a table (quick ALTER TABLE) was executed. Also quick ALTER TABLE doesn't hold LOCK_open anymore when it enables/disables indexes. sql/sql_table.cc: Do not call handler::external_lock() as table is already locked by open_ltable(). Also do not hold LOCK_open mutex for alter_table_manage_keys() as this function doesn't require LOCK_open (LOCK_open is required by wait_while_table_is_used() only). --- sql/sql_table.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 87f23097a66..277d6d76ead 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -3789,11 +3789,9 @@ view_err: { VOID(pthread_mutex_lock(&LOCK_open)); wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN); - table->file->external_lock(thd, F_WRLCK); + VOID(pthread_mutex_unlock(&LOCK_open)); alter_table_manage_keys(table, table->file->indexes_are_disabled(), alter_info->keys_onoff); - table->file->external_lock(thd, F_UNLCK); - VOID(pthread_mutex_unlock(&LOCK_open)); error= ha_commit_stmt(thd); if (ha_commit(thd)) error= 1; From 2486c23ca6d10b17365f8502f8bba10fe0bc2edd Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 19 Jul 2007 13:51:31 +0500 Subject: [PATCH 2/2] BUG#26325 - TEMPORARY TABLE "corrupt" after first read, according to CHECK TABLE CHECK/REPAIR TABLE reports "File not found" error when issued against temporary table. Fixed by disabling a brunch of code (in case it gets temporary table) that is responsible for updating frm version as it is not needed for temporary tables. mysql-test/r/check.result: A test case for BUG#26325. mysql-test/t/check.test: A test case for BUG#26325. sql/handler.cc: No need to update frm version in case table was created or checked by server with the same version. This also ensures that we do not update frm version for temporary tables as this code doesn't support temporary tables. --- mysql-test/r/check.result | 8 ++++++++ mysql-test/t/check.test | 9 +++++++++ sql/handler.cc | 8 +++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/check.result b/mysql-test/r/check.result index 60806e7393e..03219d0977e 100644 --- a/mysql-test/r/check.result +++ b/mysql-test/r/check.result @@ -14,3 +14,11 @@ test.v1 check status OK test.t2 check status OK drop view v1; drop table t1, t2; +CREATE TEMPORARY TABLE t1(a INT); +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair status OK +DROP TABLE t1; diff --git a/mysql-test/t/check.test b/mysql-test/t/check.test index 8d9d70bd29a..698f6538529 100644 --- a/mysql-test/t/check.test +++ b/mysql-test/t/check.test @@ -36,3 +36,12 @@ Create view v1 as Select * from t1; Check Table v1,t2; drop view v1; drop table t1, t2; + +# +# BUG#26325 - TEMPORARY TABLE "corrupt" after first read, according to CHECK +# TABLE +# +CREATE TEMPORARY TABLE t1(a INT); +CHECK TABLE t1; +REPAIR TABLE t1; +DROP TABLE t1; diff --git a/sql/handler.cc b/sql/handler.cc index f8aec72ec90..dcc9fde8b76 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1997,7 +1997,13 @@ static bool update_frm_version(TABLE *table, bool needs_lock) int result= 1; DBUG_ENTER("update_frm_version"); - if (table->s->mysql_version != MYSQL_VERSION_ID) + /* + No need to update frm version in case table was created or checked + by server with the same version. This also ensures that we do not + update frm version for temporary tables as this code doesn't support + temporary tables. + */ + if (table->s->mysql_version == MYSQL_VERSION_ID) DBUG_RETURN(0); strxnmov(path, sizeof(path)-1, mysql_data_home, "/", table->s->db, "/",