summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/rpl_drop_db.result34
-rw-r--r--mysql-test/t/rpl_drop_db.test37
-rw-r--r--mysys/my_alloc.c15
-rw-r--r--sql/sql_db.cc18
-rw-r--r--sql/sql_table.cc3
-rw-r--r--sql/table.h3
6 files changed, 57 insertions, 53 deletions
diff --git a/mysql-test/r/rpl_drop_db.result b/mysql-test/r/rpl_drop_db.result
index 3d1dfba5b05..ce9d39e87f6 100644
--- a/mysql-test/r/rpl_drop_db.result
+++ b/mysql-test/r/rpl_drop_db.result
@@ -4,29 +4,29 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
-drop database if exists mysqltest;
-create database mysqltest;
-create table mysqltest.t1 (n int);
-insert into mysqltest.t1 values (1);
-select * from mysqltest.t1 into outfile 'mysqltest/f1.txt';
-create table mysqltest.t2 (n int);
-create table mysqltest.t3 (n int);
-drop database mysqltest;
-ERROR HY000: Error dropping database (can't rmdir './mysqltest/', errno: 17)
-use mysqltest;
+drop database if exists mysqltest1;
+create database mysqltest1;
+create table mysqltest1.t1 (n int);
+insert into mysqltest1.t1 values (1);
+select * from mysqltest1.t1 into outfile 'mysqltest1/f1.txt';
+create table mysqltest1.t2 (n int);
+create table mysqltest1.t3 (n int);
+drop database mysqltest1;
+ERROR HY000: Error dropping database (can't rmdir './mysqltest1/', errno: 17)
+use mysqltest1;
show tables;
-Tables_in_mysqltest
-drop database mysqltest;
-ERROR HY000: Error dropping database (can't rmdir './mysqltest/', errno: 17)
-use mysqltest;
+Tables_in_mysqltest1
+drop database mysqltest1;
+ERROR HY000: Error dropping database (can't rmdir './mysqltest1/', errno: 17)
+use mysqltest1;
show tables;
-Tables_in_mysqltest
+Tables_in_mysqltest1
use test;
create table t1 (n int);
insert into t1 values (1234);
-use mysqltest;
+use mysqltest1;
show tables;
-Tables_in_mysqltest
+Tables_in_mysqltest1
use test;
select * from t1;
n
diff --git a/mysql-test/t/rpl_drop_db.test b/mysql-test/t/rpl_drop_db.test
index 7b4a56910d6..6b72623d88f 100644
--- a/mysql-test/t/rpl_drop_db.test
+++ b/mysql-test/t/rpl_drop_db.test
@@ -5,32 +5,33 @@
connection master;
--disable_warnings
-drop database if exists mysqltest;
+drop database if exists mysqltest1;
--enable_warnings
-create database mysqltest;
-create table mysqltest.t1 (n int);
-insert into mysqltest.t1 values (1);
-select * from mysqltest.t1 into outfile 'mysqltest/f1.txt';
-create table mysqltest.t2 (n int);
-create table mysqltest.t3 (n int);
+create database mysqltest1;
+create table mysqltest1.t1 (n int);
+insert into mysqltest1.t1 values (1);
+select * from mysqltest1.t1 into outfile 'mysqltest1/f1.txt';
+create table mysqltest1.t2 (n int);
+create table mysqltest1.t3 (n int);
--error 1010
-drop database mysqltest;
-use mysqltest;
+drop database mysqltest1;
+use mysqltest1;
show tables;
# test the branch of the code that deals with the query buffer overflow
-disable_query_log;
-let $1=50;
+--disable_query_log
+let $1=1000;
while ($1)
{
- eval create table mysqltest.mysql_test_long_table_name$1 (n int);
+ eval create table mysqltest1.t$1(n int);
dec $1;
}
-enable_query_log;
+--enable_query_log
+
--error 1010
-drop database mysqltest;
-use mysqltest;
+drop database mysqltest1;
+use mysqltest1;
show tables;
use test;
create table t1 (n int);
@@ -38,7 +39,7 @@ insert into t1 values (1234);
sync_slave_with_master;
connection slave;
-use mysqltest;
+use mysqltest1;
show tables;
use test;
select * from t1;
@@ -50,7 +51,5 @@ sync_slave_with_master;
#cleanup
connection slave;
stop slave;
-system rm -rf var/master-data/mysqltest;
-
-# End of 4.1 tests
+system rm -rf var/master-data/mysqltest1;
diff --git a/mysys/my_alloc.c b/mysys/my_alloc.c
index 619d6bd5654..5a78eb17c96 100644
--- a/mysys/my_alloc.c
+++ b/mysys/my_alloc.c
@@ -206,7 +206,7 @@ gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size)
next->left= get_size-ALIGN_SIZE(sizeof(USED_MEM));
*prev=next;
}
-
+
point= (gptr) ((char*) next+ (next->size-next->left));
/*TODO: next part may be unneded due to mem_root->first_block_usage counter*/
if ((next->left-= Size) < mem_root->min_malloc)
@@ -221,6 +221,12 @@ gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size)
#endif
}
+#ifdef SAFEMALLOC
+#define TRASH(X) bfill(((char*)(X) + ((X)->size-(X)->left)), (X)->left, 0xa5)
+#else
+#define TRASH /* no-op */
+#endif
+
/* Mark all data in blocks free for reusage */
static inline void mark_blocks_free(MEM_ROOT* root)
@@ -231,14 +237,20 @@ static inline void mark_blocks_free(MEM_ROOT* root)
/* iterate through (partially) free blocks, mark them free */
last= &root->free;
for (next= root->free; next; next= *(last= &next->next))
+ {
next->left= next->size - ALIGN_SIZE(sizeof(USED_MEM));
+ TRASH(next);
+ }
/* Combine the free and the used list */
*last= next=root->used;
/* now go through the used blocks and mark them free */
for (; next; next= next->next)
+ {
next->left= next->size - ALIGN_SIZE(sizeof(USED_MEM));
+ TRASH(next);
+ }
/* Now everything is set; Indicate that nothing is used anymore */
root->used= 0;
@@ -298,6 +310,7 @@ void free_root(MEM_ROOT *root, myf MyFlags)
{
root->free=root->pre_alloc;
root->free->left=root->pre_alloc->size-ALIGN_SIZE(sizeof(USED_MEM));
+ TRASH(root->pre_alloc);
root->free->next=0;
}
root->block_num= 4;
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index 5ca3f07f0bd..a4351cfe99c 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -702,30 +702,28 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
if (!(query= thd->alloc(MAX_DROP_TABLE_Q_LEN)))
goto exit; /* not much else we can do */
- query_pos= query_data_start= strmov(query,"drop table ");
+ query_pos= query_data_start= strmov(query,"drop table ");
query_end= query + MAX_DROP_TABLE_Q_LEN;
db_len= strlen(db);
-
+
for (tbl= dropped_tables; tbl; tbl= tbl->next_local)
{
uint tbl_name_len;
- if (!tbl->was_dropped)
- continue;
-
- /* 3 for the quotes and the comma*/
- tbl_name_len= strlen(tbl->table_name) + 3;
+
+ /* 3 for the quotes and the comma*/
+ tbl_name_len= strlen(tbl->real_name) + 3;
if (query_pos + tbl_name_len + 1 >= query_end)
{
write_to_binlog(thd, query, query_pos -1 - query, db, db_len);
query_pos= query_data_start;
- }
-
+ }
+
*query_pos++ = '`';
query_pos= strmov(query_pos,tbl->table_name);
*query_pos++ = '`';
*query_pos++ = ',';
}
-
+
if (query_pos != query_data_start)
{
write_to_binlog(thd, query, query_pos -1 - query, db, db_len);
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index a7aa7f30aa0..8874a70327e 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -229,7 +229,6 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
for (table= tables; table; table= table->next_local)
{
char *db=table->db;
- table->was_dropped= 0;
mysql_ha_flush(thd, table, MYSQL_HA_CLOSE_FINAL);
if (!close_temporary_table(thd, db, table->table_name))
{
@@ -301,8 +300,6 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
wrong_tables.append(',');
wrong_tables.append(String(table->table_name,system_charset_info));
}
- else
- table->was_dropped= 1;
}
thd->tmp_table_used= tmp_table_deleted;
error= 0;
diff --git a/sql/table.h b/sql/table.h
index 6af58cfd1ca..c9095ad48f6 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -570,9 +570,6 @@ typedef struct st_table_list
st_table_list *embedding; /* nested join containing the table */
List<struct st_table_list> *join_list;/* join list the table belongs to */
bool cacheable_table; /* stop PS caching */
-
- /* used for proper partially successful DROP DATABASE binlogging */
- bool was_dropped;
/* used in multi-upd/views privilege check */
bool table_in_first_from_clause;
bool skip_temporary; /* this table shouldn't be temporary */