List:Commits« Previous MessageNext Message »
From:lars-erik.bjork Date:October 26 2009 12:51pm
Subject:bzr commit into mysql-6.0-codebase-bugfixing branch (lars-erik.bjork:3672)
Bug#48067
View as plain text  
#At file:///home/lb200670/mysql/48067-mysql-6.0-codebase-bugfixing/ based on revid:sergey.glukhov@stripped

 3672 lars-erik.bjork@stripped	2009-10-26
      This is a patch for bug#48067
      "A temp table with the same name as an existing table, makes drop
      database fail"
            
      When dropping the database, mysql_rm_known_files() reads the contents
      of the database directory, and creates a TABLE_LIST object, for each
      .frm file encountered. Temporary tables, however, are not associated 
      with any .frm file.
            
      The list of tables to drop are passed to mysql_rm_table_part2().
      This method prefers temporary tables over regular tables, so if
      there is a temporary table with the same name as a regular, the
      temporary is removed, leaving the regular table intact.
      Regular tables are only deleted if there are no temporary tables
      with the same name.
            
      This fix ensures, that for all TABLE_LIST objects that are created
      by mysql_rm_known_files(), 'open_type' is set to 'OT_BASE_ONLY', to
      indicate that this is a regular table. In all cases in
      mysql_rm_table_part2() where we prefer a temporary table to a
      non-temporary table, we chek if 'open_type' equals 'OT_BASE_ONLY'.
     @ mysql-test/r/temp_table.result
        The expected result of the test.
     @ mysql-test/t/temp_table.test
        Test based on the bug report.
     @ sql/sql_db.cc
        For all TABLE_LIST objects that are created by mysql_rm_known_files(),
        'open_type' is set to 'OT_BASE_ONLY', to indicate that this is a
        regular table.
     @ sql/sql_table.cc
        Check if 'open_type' is set to 'OT_BASE_ONLY, every place a temporary table is
        preferred to a non-temporary table.

    modified:
      mysql-test/r/temp_table.result
      mysql-test/t/temp_table.test
      sql/sql_db.cc
      sql/sql_table.cc
=== modified file 'mysql-test/r/temp_table.result'
--- a/mysql-test/r/temp_table.result	2009-01-07 12:11:37 +0000
+++ b/mysql-test/r/temp_table.result	2009-10-26 12:51:43 +0000
@@ -210,4 +210,16 @@ UPDATE t1,t2 SET t1.a = t2.a;
 INSERT INTO t2 SELECT f1();
 DROP TABLE t1,t2,t3;
 DROP FUNCTION f1;
+#
+# Bug #48067: A temp table with the same name as an existing table, 
+#             makes drop database fail.
+#
+DROP TEMPORARY TABLE IF EXISTS bug48067.t1;
+DROP DATABASE IF EXISTS bug48067;
+CREATE DATABASE bug48067;
+CREATE TABLE bug48067.t1 (c1 int);
+INSERT INTO bug48067.t1 values (1);
+CREATE TEMPORARY TABLE bug48067.t1 (c1 int);
+DROP DATABASE bug48067;
+DROP TEMPORARY table bug48067.t1;
 End of 5.1 tests

=== modified file 'mysql-test/t/temp_table.test'
--- a/mysql-test/t/temp_table.test	2009-01-07 12:11:37 +0000
+++ b/mysql-test/t/temp_table.test	2009-10-26 12:51:43 +0000
@@ -235,4 +235,19 @@ INSERT INTO t2 SELECT f1();
 DROP TABLE t1,t2,t3;
 DROP FUNCTION f1;
 
+--echo #
+--echo # Bug #48067: A temp table with the same name as an existing table, 
+--echo #             makes drop database fail.
+--echo #
+--disable_warnings
+DROP TEMPORARY TABLE IF EXISTS bug48067.t1;
+DROP DATABASE IF EXISTS bug48067;
+--enable_warnings
+CREATE DATABASE bug48067;
+CREATE TABLE bug48067.t1 (c1 int);
+INSERT INTO bug48067.t1 values (1);
+CREATE TEMPORARY TABLE bug48067.t1 (c1 int);
+DROP DATABASE bug48067;
+DROP TEMPORARY table bug48067.t1;
+
 --echo End of 5.1 tests

=== modified file 'sql/sql_db.cc'
--- a/sql/sql_db.cc	2009-10-22 18:55:18 +0000
+++ b/sql/sql_db.cc	2009-10-26 12:51:43 +0000
@@ -1152,6 +1152,7 @@ static long mysql_rm_known_files(THD *th
       (void) filename_to_tablename(file->name, table_list->table_name,
                                  MYSQL50_TABLE_NAME_PREFIX_LENGTH +
                                  strlen(file->name) + 1);
+      table_list->open_type= OT_BASE_ONLY;
 
       /* To be able to correctly look up the table in the table cache. */
       if (lower_case_table_names)

=== modified file 'sql/sql_table.cc'
--- a/sql/sql_table.cc	2009-10-23 06:24:37 +0000
+++ b/sql/sql_table.cc	2009-10-26 12:51:43 +0000
@@ -1908,7 +1908,8 @@ int mysql_rm_table_part2(THD *thd, TABLE
     else
     {
       for (table= tables; table; table= table->next_local)
-        if (find_temporary_table(thd, table->db, table->table_name))
+        if (table->open_type != OT_BASE_ONLY && 
+	    find_temporary_table(thd, table->db, table->table_name))
         {
           /*
             A temporary table.
@@ -1953,8 +1954,11 @@ int mysql_rm_table_part2(THD *thd, TABLE
                          table->db, table->table_name, table->table,
                          table->table ? table->table->s : (TABLE_SHARE *)-1));
 
-    error= drop_temporary_table(thd, table);
-
+    if (table->open_type == OT_BASE_ONLY)
+      error= 1;
+    else
+      error= drop_temporary_table(thd, table);
+ 
     switch (error) {
     case  0:
       // removed temporary table


Attachment: [text/bzr-bundle] bzr/lars-erik.bjork@sun.com-20091026125143-5jbj89lc8hbn39t9.bundle
Thread
bzr commit into mysql-6.0-codebase-bugfixing branch (lars-erik.bjork:3672)Bug#48067lars-erik.bjork26 Oct