summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Olav Hauglid <jon.hauglid@sun.com>2010-06-23 13:34:40 +0200
committerJon Olav Hauglid <jon.hauglid@sun.com>2010-06-23 13:34:40 +0200
commitbe3005d9e71e853076b9ee35097ffd976d7207f1 (patch)
tree65e8c411add29a22d287df643b53cc6df44fe7f3
parent94174db16b8d20ee0d719b23877b1835e88a8838 (diff)
downloadmariadb-git-be3005d9e71e853076b9ee35097ffd976d7207f1.tar.gz
Backport from mysql-6.0-codebase of:
------------------------------------------------------------ revno: 3672 committer: lars-erik.bjork@sun.com branch nick: 48067-mysql-6.0-codebase-bugfixing timestamp: Mon 2009-10-26 13:51:43 +0100 message: 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'.
-rw-r--r--mysql-test/r/temp_table.result12
-rw-r--r--mysql-test/t/temp_table.test15
-rw-r--r--sql/sql_db.cc1
-rw-r--r--sql/sql_table.cc10
4 files changed, 35 insertions, 3 deletions
diff --git a/mysql-test/r/temp_table.result b/mysql-test/r/temp_table.result
index ba6b9f81a2d..33f5c6b5165 100644
--- a/mysql-test/r/temp_table.result
+++ b/mysql-test/r/temp_table.result
@@ -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
diff --git a/mysql-test/t/temp_table.test b/mysql-test/t/temp_table.test
index 2bfa4936c91..92c22242cdb 100644
--- a/mysql-test/t/temp_table.test
+++ b/mysql-test/t/temp_table.test
@@ -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
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index 2e48475f298..5e992d2391c 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -1196,6 +1196,7 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
(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)
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 902e7fa7b5f..e0e32b81e03 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1964,7 +1964,8 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
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.
@@ -2009,8 +2010,11 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
table->db, table->table_name, (long) table->table,
table->table ? (long) table->table->s : (long) -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