From 35115d9a509933f141ec835d5da7930233e9e3a3 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 3 Sep 2002 15:53:07 +0300 Subject: Check if AND/OR expression can be NULL Better fix for ALTER TABLE on BDB tables (Both of the above fixes are already in 4.0) Docs/manual.texi: Changelog sql/item_cmpfunc.cc: Check if AND/OR expression can be NULL sql/sql_table.cc: Better fix for ALTER TABLE on BDB tables --- Docs/manual.texi | 4 ++++ sql/item_cmpfunc.cc | 2 ++ sql/sql_table.cc | 16 +++++++++++++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 87b9a480f3f..c698f8f80c4 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -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 @code{BDB}-related @code{ALTER TABLE} bug with dropping a column and shutting down immediately thereafter. @item diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index f17c8af3519..36ecde337a7 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -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; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 534b267403c..2bb46b5c47d 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -19,6 +19,9 @@ #include "mysql_priv.h" #include +#ifdef HAVE_BERKELEY_DB +#include +#endif #include #ifdef __WIN__ @@ -1675,11 +1678,18 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, VOID(pthread_cond_broadcast(&COND_refresh)); VOID(pthread_mutex_unlock(&LOCK_open)); #ifdef HAVE_BERKELEY_DB - extern bool berkeley_flush_logs(void); if (old_db_type == DB_TYPE_BERKELEY_DB) { - (void)berkeley_flush_logs(); - table=open_ltable(thd,table_list,TL_READ); + (void) berkeley_flush_logs(); + /* + For the alter table to be properly flushed to the logs, we + have to open the new table. If not, we get a problem on server + shutdown. + */ + if (!open_tables(thd, table_list)) // Should always succeed + { + close_thread_table(thd, &table_list->table); + } } #endif -- cgit v1.2.1