From 7678149864a225aaaa817a5eb92ad5501c39e105 Mon Sep 17 00:00:00 2001 From: "ramil@ndbmaster.mysql.com" <> Date: Sun, 6 Nov 2005 08:29:03 +0100 Subject: [PATCH] WL #528: Faster free_tmp_table --- include/heap.h | 1 + sql/ha_heap.cc | 8 ++++++++ sql/ha_heap.h | 1 + sql/handler.cc | 8 ++++++++ sql/handler.h | 1 + sql/sql_select.cc | 12 ++---------- storage/heap/hp_create.c | 26 ++++++++++++++++++++++---- 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);