summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorramil@ndbmaster.mysql.com <>2005-11-06 08:29:03 +0100
committerramil@ndbmaster.mysql.com <>2005-11-06 08:29:03 +0100
commit7678149864a225aaaa817a5eb92ad5501c39e105 (patch)
tree6f23a2bb49cbac7859890493620202b75435bc0e
parent9b532768f5d1664eb20eaa02cf4040c4627be767 (diff)
downloadmariadb-git-7678149864a225aaaa817a5eb92ad5501c39e105.tar.gz
WL #528: Faster free_tmp_table
-rw-r--r--include/heap.h1
-rw-r--r--sql/ha_heap.cc8
-rw-r--r--sql/ha_heap.h1
-rw-r--r--sql/handler.cc8
-rw-r--r--sql/handler.h1
-rw-r--r--sql/sql_select.cc12
-rw-r--r--storage/heap/hp_create.c26
7 files changed, 43 insertions, 14 deletions
diff --git a/include/heap.h b/include/heap.h
index badec9ce2ef..1f9b6f7130f 100644
--- a/include/heap.h
+++ b/include/heap.h
@@ -206,6 +206,7 @@ extern int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
uint reclength, ulong max_records, ulong min_records,
HP_CREATE_INFO *create_info);
extern int heap_delete_table(const char *name);
+extern void heap_drop_table(HP_INFO *info);
extern int heap_extra(HP_INFO *info,enum ha_extra_function function);
extern int heap_rename(const char *old_name,const char *new_name);
extern int heap_panic(enum ha_panic_function flag);
diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc
index ab13f03825d..adce6bdc102 100644
--- a/sql/ha_heap.cc
+++ b/sql/ha_heap.cc
@@ -477,6 +477,14 @@ int ha_heap::delete_table(const char *name)
return error == ENOENT ? 0 : error;
}
+
+void ha_heap::drop_table(const char *name)
+{
+ heap_drop_table(file);
+ close();
+}
+
+
int ha_heap::rename_table(const char * from, const char * to)
{
return heap_rename(from,to);
diff --git a/sql/ha_heap.h b/sql/ha_heap.h
index 4a01b3317f1..9b93936b573 100644
--- a/sql/ha_heap.h
+++ b/sql/ha_heap.h
@@ -94,6 +94,7 @@ public:
int indexes_are_disabled(void);
ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key);
int delete_table(const char *from);
+ void drop_table(const char *name);
int rename_table(const char * from, const char * to);
int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info);
void update_create_info(HA_CREATE_INFO *create_info);
diff --git a/sql/handler.cc b/sql/handler.cc
index 1b2cae7f7f2..fd1be7638b0 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -2062,6 +2062,14 @@ int handler::rename_table(const char * from, const char * to)
return error;
}
+
+void handler::drop_table(const char *name)
+{
+ close();
+ delete_table(name);
+}
+
+
/*
Tell the storage engine that it is allowed to "disable transaction" in the
handler. It is a hint that ACID is not required - it is used in NDB for
diff --git a/sql/handler.h b/sql/handler.h
index f5f0afa00d5..bb48b119e45 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -1288,6 +1288,7 @@ public:
*/
virtual int rename_table(const char *from, const char *to);
virtual int delete_table(const char *name);
+ virtual void drop_table(const char *name);
virtual int create(const char *name, TABLE *form, HA_CREATE_INFO *info)=0;
virtual int create_handler_files(const char *name) { return FALSE;}
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 360b161a78a..6552164a8e8 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -8848,16 +8848,8 @@ free_tmp_table(THD *thd, TABLE *entry)
if (entry->file)
{
if (entry->db_stat)
- {
- (void) entry->file->close();
- }
- /*
- We can't call ha_delete_table here as the table may created in mixed case
- here and we have to ensure that delete_table gets the table name in
- the original case.
- */
- if (!(test_flags & TEST_KEEP_TMP_TABLES) ||
- entry->s->db_type == DB_TYPE_HEAP)
+ entry->file->drop_table(entry->s->table_name);
+ else
entry->file->delete_table(entry->s->table_name);
delete entry->file;
}
diff --git a/storage/heap/hp_create.c b/storage/heap/hp_create.c
index 47dcb00278a..a90078cc9fb 100644
--- a/storage/heap/hp_create.c
+++ b/storage/heap/hp_create.c
@@ -234,6 +234,16 @@ static void init_block(HP_BLOCK *block, uint reclength, ulong min_records,
HP_PTRS_IN_NOD * block->level_info[i - 1].records_under_level);
}
+
+static inline void heap_try_free(HP_SHARE *share)
+{
+ if (share->open_count == 0)
+ hp_free(share);
+ else
+ share->delete_on_close= 1;
+}
+
+
int heap_delete_table(const char *name)
{
int result;
@@ -243,10 +253,7 @@ int heap_delete_table(const char *name)
pthread_mutex_lock(&THR_LOCK_heap);
if ((share= hp_find_named_heap(name)))
{
- if (share->open_count == 0)
- hp_free(share);
- else
- share->delete_on_close= 1;
+ heap_try_free(share);
result= 0;
}
else
@@ -257,6 +264,17 @@ int heap_delete_table(const char *name)
DBUG_RETURN(result);
}
+
+void heap_drop_table(HP_INFO *info)
+{
+ DBUG_ENTER("heap_drop_table");
+ pthread_mutex_lock(&THR_LOCK_heap);
+ heap_try_free(info->s);
+ pthread_mutex_unlock(&THR_LOCK_heap);
+ DBUG_VOID_RETURN;
+}
+
+
void hp_free(HP_SHARE *share)
{
heap_share_list= list_delete(heap_share_list, &share->open_list);