mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fixed bug introduces by last changeset
(Fixing of problem with ALTER TABLE on BDB tables) mysql-test/r/distinct.result: Fixed results after bug fix sql/mysql_priv.h: Split close_thread_tables() into two functions. (Needed for bug fix from 4.0) sql/sql_base.cc: Split close_thread_tables() into two functions. (Needed for bug fix from 4.0)
This commit is contained in:
@ -69,7 +69,8 @@ a max(id) b
|
|||||||
0 0
|
0 0
|
||||||
NULL NULL NULL
|
NULL NULL NULL
|
||||||
grp count(*)
|
grp count(*)
|
||||||
0 7
|
NULL 1
|
||||||
|
0 6
|
||||||
1 6
|
1 6
|
||||||
FACILITY
|
FACILITY
|
||||||
NULL
|
NULL
|
||||||
|
@ -447,6 +447,7 @@ bool rm_temporary_table(enum db_type base, char *path);
|
|||||||
bool send_fields(THD *thd,List<Item> &item,uint send_field_count);
|
bool send_fields(THD *thd,List<Item> &item,uint send_field_count);
|
||||||
void free_io_cache(TABLE *entry);
|
void free_io_cache(TABLE *entry);
|
||||||
void intern_close_table(TABLE *entry);
|
void intern_close_table(TABLE *entry);
|
||||||
|
bool close_thread_table(THD *thd, TABLE **table_ptr);
|
||||||
void close_thread_tables(THD *thd,bool locked=0);
|
void close_thread_tables(THD *thd,bool locked=0);
|
||||||
void close_temporary_tables(THD *thd);
|
void close_temporary_tables(THD *thd);
|
||||||
TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name);
|
TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name);
|
||||||
|
@ -428,7 +428,6 @@ void close_thread_tables(THD *thd, bool locked)
|
|||||||
DBUG_VOID_RETURN; // LOCK TABLES in use
|
DBUG_VOID_RETURN; // LOCK TABLES in use
|
||||||
}
|
}
|
||||||
|
|
||||||
TABLE *table,*next;
|
|
||||||
bool found_old_table=0;
|
bool found_old_table=0;
|
||||||
|
|
||||||
if (thd->lock)
|
if (thd->lock)
|
||||||
@ -441,41 +440,10 @@ void close_thread_tables(THD *thd, bool locked)
|
|||||||
|
|
||||||
DBUG_PRINT("info", ("thd->open_tables=%p", thd->open_tables));
|
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);
|
||||||
next=table->next;
|
|
||||||
if (table->version != refresh_version ||
|
|
||||||
thd->version != refresh_version || !table->db_stat)
|
|
||||||
{
|
|
||||||
VOID(hash_delete(&open_cache,(byte*) table));
|
|
||||||
found_old_table=1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (table->flush_version != flush_version)
|
|
||||||
{
|
|
||||||
table->flush_version=flush_version;
|
|
||||||
table->file->extra(HA_EXTRA_FLUSH);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Free memory and reset for next loop
|
|
||||||
table->file->extra(HA_EXTRA_RESET);
|
|
||||||
}
|
|
||||||
table->in_use=0;
|
|
||||||
if (unused_tables)
|
|
||||||
{
|
|
||||||
table->next=unused_tables; /* Link in last */
|
|
||||||
table->prev=unused_tables->prev;
|
|
||||||
unused_tables->prev=table;
|
|
||||||
table->prev->next=table;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
unused_tables=table->next=table->prev=table;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
thd->some_tables_deleted=0;
|
thd->some_tables_deleted=0;
|
||||||
thd->open_tables=0;
|
|
||||||
/* Free tables to hold down open files */
|
/* Free tables to hold down open files */
|
||||||
while (open_cache.records > table_cache_size && unused_tables)
|
while (open_cache.records > table_cache_size && unused_tables)
|
||||||
VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */
|
VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */
|
||||||
@ -491,6 +459,48 @@ void close_thread_tables(THD *thd, bool locked)
|
|||||||
DBUG_VOID_RETURN;
|
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)
|
||||||
|
{
|
||||||
|
VOID(hash_delete(&open_cache,(byte*) table));
|
||||||
|
found_old_table=1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (table->flush_version != flush_version)
|
||||||
|
{
|
||||||
|
table->flush_version=flush_version;
|
||||||
|
table->file->extra(HA_EXTRA_FLUSH);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Free memory and reset for next loop
|
||||||
|
table->file->extra(HA_EXTRA_RESET);
|
||||||
|
}
|
||||||
|
table->in_use=0;
|
||||||
|
if (unused_tables)
|
||||||
|
{
|
||||||
|
table->next=unused_tables; /* Link in last */
|
||||||
|
table->prev=unused_tables->prev;
|
||||||
|
unused_tables->prev=table;
|
||||||
|
table->prev->next=table;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
unused_tables=table->next=table->prev=table;
|
||||||
|
}
|
||||||
|
DBUG_RETURN(found_old_table);
|
||||||
|
}
|
||||||
|
|
||||||
/* Close and delete temporary tables */
|
/* Close and delete temporary tables */
|
||||||
|
|
||||||
void close_temporary(TABLE *table,bool delete_table)
|
void close_temporary(TABLE *table,bool delete_table)
|
||||||
|
Reference in New Issue
Block a user