Loading Docs/manual.texi +4 −0 Original line number Diff line number Diff line Loading @@ -46929,6 +46929,10 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.53 @itemize @bullet @item Changed @code{AND/OR} to report that they can return NULL. This fixes a small problem in @code{GROUP BY} on @code{AND/OR} expression that return @code{NULL}. @item Fixed a bug that @code{OPTIMIZE} of locked and modified MyISAM table, reported table corruption. @item mysql-test/r/distinct.result +2 −1 Original line number Diff line number Diff line Loading @@ -69,7 +69,8 @@ a max(id) b 0 0 NULL NULL NULL grp count(*) 0 7 NULL 1 0 6 1 6 FACILITY NULL Loading sql/item_cmpfunc.cc +2 −0 Original line number Diff line number Diff line Loading @@ -1097,6 +1097,8 @@ Item_cond::fix_fields(THD *thd,TABLE_LIST *tables) used_tables_cache|=item->used_tables(); with_sum_func= with_sum_func || item->with_sum_func; const_item_cache&=item->const_item(); if (item->maybe_null) maybe_null=1; } if (thd) thd->cond_count+=list.elements; Loading sql/mysql_priv.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); void free_io_cache(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_temporary_tables(THD *thd); TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name); Loading sql/sql_base.cc +45 −35 Original line number Diff line number Diff line Loading @@ -428,7 +428,6 @@ void close_thread_tables(THD *thd, bool locked) DBUG_VOID_RETURN; // LOCK TABLES in use } TABLE *table,*next; bool found_old_table=0; if (thd->lock) Loading @@ -441,9 +440,35 @@ 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); thd->some_tables_deleted=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) { 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 @@ -473,22 +498,7 @@ void close_thread_tables(THD *thd, bool locked) else unused_tables=table->next=table->prev=table; } } thd->some_tables_deleted=0; 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 Loading
Docs/manual.texi +4 −0 Original line number Diff line number Diff line Loading @@ -46929,6 +46929,10 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.53 @itemize @bullet @item Changed @code{AND/OR} to report that they can return NULL. This fixes a small problem in @code{GROUP BY} on @code{AND/OR} expression that return @code{NULL}. @item Fixed a bug that @code{OPTIMIZE} of locked and modified MyISAM table, reported table corruption. @item
mysql-test/r/distinct.result +2 −1 Original line number Diff line number Diff line Loading @@ -69,7 +69,8 @@ a max(id) b 0 0 NULL NULL NULL grp count(*) 0 7 NULL 1 0 6 1 6 FACILITY NULL Loading
sql/item_cmpfunc.cc +2 −0 Original line number Diff line number Diff line Loading @@ -1097,6 +1097,8 @@ Item_cond::fix_fields(THD *thd,TABLE_LIST *tables) used_tables_cache|=item->used_tables(); with_sum_func= with_sum_func || item->with_sum_func; const_item_cache&=item->const_item(); if (item->maybe_null) maybe_null=1; } if (thd) thd->cond_count+=list.elements; Loading
sql/mysql_priv.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); void free_io_cache(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_temporary_tables(THD *thd); TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name); Loading
sql/sql_base.cc +45 −35 Original line number Diff line number Diff line Loading @@ -428,7 +428,6 @@ void close_thread_tables(THD *thd, bool locked) DBUG_VOID_RETURN; // LOCK TABLES in use } TABLE *table,*next; bool found_old_table=0; if (thd->lock) Loading @@ -441,9 +440,35 @@ 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); thd->some_tables_deleted=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) { 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 @@ -473,22 +498,7 @@ void close_thread_tables(THD *thd, bool locked) else unused_tables=table->next=table->prev=table; } } thd->some_tables_deleted=0; 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