List:Commits« Previous MessageNext Message »
From:ahristov Date:July 25 2006 12:52pm
Subject:bk commit into 5.1 tree (andrey:1.2254) BUG#16532
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of andrey. When andrey does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2006-07-25 14:52:24+02:00, andrey@lmy004. +3 -0
  Fix for bug#16532 mysql server assert in debug if table definition is removed
  
  Emit an error instead of doing ASSERT

  mysql-test/r/create_not_windows.result@stripped, 2006-07-25 14:52:20+02:00, andrey@lmy004. +17 -0
    update result

  mysql-test/t/create_not_windows.test@stripped, 2006-07-25 14:52:20+02:00, andrey@lmy004. +21 -0
    Add test case for bug #16532: mysql server assert in debug if table definition is removed

  sql/sql_table.cc@stripped, 2006-07-25 14:52:20+02:00, andrey@lmy004. +13 -1
    it could happen that an user deletes the frm file on OS level.
    In addition if the table was already opened, the file system level
    check for existance of table.frm will pass but get_cached_table_share()
    will return non-NULL value. In this case we will emit the standard
    error that the table exist. The error case is quite obscure but error
    message is better than a sigabort.

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	andrey
# Host:	lmy004.
# Root:	/work/mysql-5.1-runtime-bug16532

--- 1.358/sql/sql_table.cc	2006-07-25 14:52:35 +02:00
+++ 1.359/sql/sql_table.cc	2006-07-25 14:52:35 +02:00
@@ -3321,7 +3321,19 @@
       my_error(ER_TABLE_EXISTS_ERROR,MYF(0),table_name);
       goto unlock_and_end;
     }
-    DBUG_ASSERT(get_cached_table_share(db, alias) == 0);
+    /*
+      We don't assert here, but check the result, because the table could be
+      in the table definition cache and in the same time the .frm could be
+      missing from the disk, in case of manual intervention which deletes
+      the .frm file. The user has to use FLUSH TABLES; to clear the cache.
+      Then she could create the table. This case is pretty obscure and
+      therefore we don't introduce a new error message only for it.
+    */
+    if (get_cached_table_share(db, alias))
+    {
+      my_error(ER_TABLE_EXISTS_ERROR, MYF(0), table_name);
+      goto unlock_and_end;
+    }
   }
 
   /*

--- 1.2/mysql-test/r/create_not_windows.result	2006-07-25 14:52:35 +02:00
+++ 1.3/mysql-test/r/create_not_windows.result	2006-07-25 14:52:35 +02:00
@@ -12,3 +12,20 @@
   PRIMARY KEY (`_id`)
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
 drop table `about:text`;
+use test;
+drop table if exists t1;
+create table t1(a int) engine=myisam;
+insert into t1 values(1);
+"We get an error because the table is in the definition cache"
+create table t1(a int, b int);
+ERROR 42S01: Table 't1' already exists
+"Flush the cache and recreate the table anew to be able to drop it"
+flush tables;
+show open tables like "t%";
+Database	Table	In_use	Name_locked
+create table t1(a int, b int, c int);
+"Try to select from the table. This should not crash the server"
+select count(a) from t1;
+count(a)
+0
+drop table t1;

--- 1.1/mysql-test/t/create_not_windows.test	2006-07-25 14:52:35 +02:00
+++ 1.2/mysql-test/t/create_not_windows.test	2006-07-25 14:52:35 +02:00
@@ -18,3 +18,24 @@
 drop table `about:text`;
 
 # End of 5.0 tests
+
+#
+# Bug#16532:mysql server assert in debug if table det is removed
+#
+use test;
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+create table t1(a int) engine=myisam;
+insert into t1 values(1);
+--system rm -f $MYSQLTEST_VARDIR/master-data/test/t1.frm
+--echo "We get an error because the table is in the definition cache"
+--error ER_TABLE_EXISTS_ERROR
+create table t1(a int, b int);
+--echo "Flush the cache and recreate the table anew to be able to drop it"
+flush tables;
+show open tables like "t%";
+create table t1(a int, b int, c int);
+--echo "Try to select from the table. This should not crash the server"
+select count(a) from t1;
+drop table t1;
Thread
bk commit into 5.1 tree (andrey:1.2254) BUG#16532ahristov25 Jul