Loading sql/mysql_priv.h +1 −0 Original line number Diff line number Diff line Loading @@ -430,6 +430,7 @@ bool send_fields(THD *thd,List<Item> &item,uint send_field_count); void free_io_cache(TABLE *entry); void intern_close_table(TABLE *entry); void close_thread_tables(THD *thd,bool locked=0); bool close_thread_table(THD *thd, TABLE **table_ptr); void close_temporary_tables(THD *thd); TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name); bool close_temporary_table(THD *thd, const char *db, const char *table_name); Loading sql/sql_base.cc +45 −34 Original line number Diff line number Diff line Loading @@ -421,9 +421,34 @@ void close_thread_tables(THD *thd, bool locked) DBUG_PRINT("info", ("thd->open_tables=%p", thd->open_tables)); for (table=thd->open_tables ; table ; table=next) while (thd->open_tables) found_old_table|=close_thread_table(thd, &thd->open_tables); /* Free tables to hold down open files */ while (open_cache.records > table_cache_size && unused_tables) VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */ check_unused(); if (found_old_table) { next=table->next; /* Tell threads waiting for refresh that something has happened */ VOID(pthread_cond_broadcast(&COND_refresh)); } if (!locked) VOID(pthread_mutex_unlock(&LOCK_open)); /* VOID(pthread_sigmask(SIG_SETMASK,&thd->signals,NULL)); */ DBUG_VOID_RETURN; } /* move one table to free list */ bool close_thread_table(THD *thd, TABLE **table_ptr) { DBUG_ENTER("close_thread_table"); bool found_old_table=0; TABLE *table=*table_ptr; *table_ptr=table->next; if (table->version != refresh_version || thd->version != refresh_version || !table->db_stat) { Loading Loading @@ -453,21 +478,7 @@ void close_thread_tables(THD *thd, bool locked) else unused_tables=table->next=table->prev=table; } } thd->open_tables=0; /* Free tables to hold down open files */ while (open_cache.records > table_cache_size && unused_tables) VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */ check_unused(); if (found_old_table) { /* Tell threads waiting for refresh that something has happened */ VOID(pthread_cond_broadcast(&COND_refresh)); } if (!locked) VOID(pthread_mutex_unlock(&LOCK_open)); /* VOID(pthread_sigmask(SIG_SETMASK,&thd->signals,NULL)); */ DBUG_VOID_RETURN; DBUG_RETURN(found_old_table); } /* Close and delete temporary tables */ Loading sql/sql_handler.cc +14 −11 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ thd->open_tables=thd->handler_tables; \ thd->handler_tables=tmp; } static TABLE *find_table_by_name(THD *thd, char *db, char *table_name); static TABLE **find_table_ptr_by_name(THD *thd, char *db, char *table_name); int mysql_ha_open(THD *thd, TABLE_LIST *tables) { Loading @@ -59,11 +59,11 @@ int mysql_ha_open(THD *thd, TABLE_LIST *tables) int mysql_ha_close(THD *thd, TABLE_LIST *tables) { /* Perhaps, we should close table here. But it's not easy - *tables is a single-linked list, designed to be closed at all once. So, why bother ? All the tables will be closed at thread exit. */ TABLE **ptr=find_table_ptr_by_name(thd, tables->db, tables->name); if (*ptr) close_thread_table(thd, ptr); send_ok(&thd->net); return 0; } Loading @@ -77,7 +77,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ha_rows select_limit,ha_rows offset_limit) { int err, keyno=-1; TABLE *table=find_table_by_name(thd, tables->db, tables->name); TABLE *table=*find_table_ptr_by_name(thd, tables->db, tables->name); if (!table) { my_printf_error(ER_UNKNOWN_TABLE,ER(ER_UNKNOWN_TABLE),MYF(0), Loading Loading @@ -231,19 +231,22 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, /* Note: this function differs from find_locked_table() because we're looking here for alias, not real table name */ static TABLE *find_table_by_name(THD *thd, char *db, char *table_name) static TABLE **find_table_ptr_by_name(THD *thd, char *db, char *table_name) { int dblen; TABLE **ptr; if (!db || ! *db) db=thd->db; if (!db || ! *db) db=""; dblen=strlen(db); ptr=&(thd->handler_tables); for (TABLE *table=thd->handler_tables; table ; table=table->next) for (TABLE *table=*ptr; table ; table=*ptr) { if (!memcmp(table->table_cache_key, db, dblen) && !my_strcasecmp(table->table_name,table_name)) return table; break; ptr=&(table->next); } return(0); return ptr; } Loading
sql/mysql_priv.h +1 −0 Original line number Diff line number Diff line Loading @@ -430,6 +430,7 @@ bool send_fields(THD *thd,List<Item> &item,uint send_field_count); void free_io_cache(TABLE *entry); void intern_close_table(TABLE *entry); void close_thread_tables(THD *thd,bool locked=0); bool close_thread_table(THD *thd, TABLE **table_ptr); void close_temporary_tables(THD *thd); TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name); bool close_temporary_table(THD *thd, const char *db, const char *table_name); Loading
sql/sql_base.cc +45 −34 Original line number Diff line number Diff line Loading @@ -421,9 +421,34 @@ void close_thread_tables(THD *thd, bool locked) DBUG_PRINT("info", ("thd->open_tables=%p", thd->open_tables)); for (table=thd->open_tables ; table ; table=next) while (thd->open_tables) found_old_table|=close_thread_table(thd, &thd->open_tables); /* Free tables to hold down open files */ while (open_cache.records > table_cache_size && unused_tables) VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */ check_unused(); if (found_old_table) { next=table->next; /* Tell threads waiting for refresh that something has happened */ VOID(pthread_cond_broadcast(&COND_refresh)); } if (!locked) VOID(pthread_mutex_unlock(&LOCK_open)); /* VOID(pthread_sigmask(SIG_SETMASK,&thd->signals,NULL)); */ DBUG_VOID_RETURN; } /* move one table to free list */ bool close_thread_table(THD *thd, TABLE **table_ptr) { DBUG_ENTER("close_thread_table"); bool found_old_table=0; TABLE *table=*table_ptr; *table_ptr=table->next; if (table->version != refresh_version || thd->version != refresh_version || !table->db_stat) { Loading Loading @@ -453,21 +478,7 @@ void close_thread_tables(THD *thd, bool locked) else unused_tables=table->next=table->prev=table; } } thd->open_tables=0; /* Free tables to hold down open files */ while (open_cache.records > table_cache_size && unused_tables) VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */ check_unused(); if (found_old_table) { /* Tell threads waiting for refresh that something has happened */ VOID(pthread_cond_broadcast(&COND_refresh)); } if (!locked) VOID(pthread_mutex_unlock(&LOCK_open)); /* VOID(pthread_sigmask(SIG_SETMASK,&thd->signals,NULL)); */ DBUG_VOID_RETURN; DBUG_RETURN(found_old_table); } /* Close and delete temporary tables */ Loading
sql/sql_handler.cc +14 −11 Original line number Diff line number Diff line Loading @@ -43,7 +43,7 @@ thd->open_tables=thd->handler_tables; \ thd->handler_tables=tmp; } static TABLE *find_table_by_name(THD *thd, char *db, char *table_name); static TABLE **find_table_ptr_by_name(THD *thd, char *db, char *table_name); int mysql_ha_open(THD *thd, TABLE_LIST *tables) { Loading @@ -59,11 +59,11 @@ int mysql_ha_open(THD *thd, TABLE_LIST *tables) int mysql_ha_close(THD *thd, TABLE_LIST *tables) { /* Perhaps, we should close table here. But it's not easy - *tables is a single-linked list, designed to be closed at all once. So, why bother ? All the tables will be closed at thread exit. */ TABLE **ptr=find_table_ptr_by_name(thd, tables->db, tables->name); if (*ptr) close_thread_table(thd, ptr); send_ok(&thd->net); return 0; } Loading @@ -77,7 +77,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ha_rows select_limit,ha_rows offset_limit) { int err, keyno=-1; TABLE *table=find_table_by_name(thd, tables->db, tables->name); TABLE *table=*find_table_ptr_by_name(thd, tables->db, tables->name); if (!table) { my_printf_error(ER_UNKNOWN_TABLE,ER(ER_UNKNOWN_TABLE),MYF(0), Loading Loading @@ -231,19 +231,22 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, /* Note: this function differs from find_locked_table() because we're looking here for alias, not real table name */ static TABLE *find_table_by_name(THD *thd, char *db, char *table_name) static TABLE **find_table_ptr_by_name(THD *thd, char *db, char *table_name) { int dblen; TABLE **ptr; if (!db || ! *db) db=thd->db; if (!db || ! *db) db=""; dblen=strlen(db); ptr=&(thd->handler_tables); for (TABLE *table=thd->handler_tables; table ; table=table->next) for (TABLE *table=*ptr; table ; table=*ptr) { if (!memcmp(table->table_cache_key, db, dblen) && !my_strcasecmp(table->table_name,table_name)) return table; break; ptr=&(table->next); } return(0); return ptr; }