mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Table definition cache, part 2
The table opening process now works the following way: - Create common TABLE_SHARE object - Read the .frm file and unpack it into the TABLE_SHARE object - Create a TABLE object based on the information in the TABLE_SHARE object and open a handler to the table object Other noteworthy changes: - In TABLE_SHARE the most common strings are now LEX_STRING's - Better error message when table is not found - Variable table_cache is now renamed 'table_open_cache' - New variable 'table_definition_cache' that is the number of table defintions that will be cached - strxnmov() calls are now fixed to avoid overflows - strxnmov() will now always add one end \0 to result - engine objects are now created with a TABLE_SHARE object instead of a TABLE object. - After creating a field object one must call field->init(table) before using it - For a busy system this change will give you: - Less memory usage for table object - Faster opening of tables (if it's has been in use or is in table definition cache) - Allow you to cache many table definitions objects - Faster drop of table
This commit is contained in:
@ -814,29 +814,31 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
|
||||
{
|
||||
HA_CREATE_INFO create_info;
|
||||
char path[FN_REFLEN];
|
||||
TABLE **table_ptr;
|
||||
TABLE *table;
|
||||
bool error;
|
||||
DBUG_ENTER("mysql_truncate");
|
||||
|
||||
bzero((char*) &create_info,sizeof(create_info));
|
||||
/* If it is a temporary table, close and regenerate it */
|
||||
if (!dont_send_ok && (table_ptr=find_temporary_table(thd,table_list->db,
|
||||
table_list->table_name)))
|
||||
if (!dont_send_ok && (table= find_temporary_table(thd, table_list)))
|
||||
{
|
||||
TABLE *table= *table_ptr;
|
||||
table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
|
||||
db_type table_type= table->s->db_type;
|
||||
TABLE_SHARE *share= table->s;
|
||||
if (!ha_check_storage_engine_flag(table_type, HTON_CAN_RECREATE))
|
||||
goto trunc_by_del;
|
||||
strmov(path, table->s->path);
|
||||
*table_ptr= table->next; // Unlink table from list
|
||||
close_temporary(table,0);
|
||||
*fn_ext(path)=0; // Remove the .frm extension
|
||||
ha_create_table(path, &create_info,1);
|
||||
|
||||
table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
|
||||
|
||||
close_temporary_table(thd, table, 0, 0); // Don't free share
|
||||
ha_create_table(thd, share->normalized_path.str,
|
||||
share->db.str, share->table_name.str, &create_info, 1);
|
||||
// We don't need to call invalidate() because this table is not in cache
|
||||
if ((error= (int) !(open_temporary_table(thd, path, table_list->db,
|
||||
table_list->table_name, 1))))
|
||||
if ((error= (int) !(open_temporary_table(thd, share->path.str,
|
||||
share->db.str,
|
||||
share->table_name.str, 1))))
|
||||
(void) rm_temporary_table(table_type, path);
|
||||
free_table_share(share);
|
||||
my_free((char*) table,MYF(0));
|
||||
/*
|
||||
If we return here we will not have logged the truncation to the bin log
|
||||
and we will not send_ok() to the client.
|
||||
@ -866,7 +868,8 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
|
||||
}
|
||||
|
||||
*fn_ext(path)=0; // Remove the .frm extension
|
||||
error= ha_create_table(path,&create_info,1);
|
||||
error= ha_create_table(thd, path, table_list->db, table_list->table_name,
|
||||
&create_info, 1);
|
||||
query_cache_invalidate3(thd, table_list, 0);
|
||||
|
||||
end:
|
||||
@ -895,7 +898,7 @@ end:
|
||||
}
|
||||
DBUG_RETURN(error);
|
||||
|
||||
trunc_by_del:
|
||||
trunc_by_del:
|
||||
/* Probably InnoDB table */
|
||||
ulong save_options= thd->options;
|
||||
table_list->lock_type= TL_WRITE;
|
||||
|
Reference in New Issue
Block a user