summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/ha_berkeley.cc35
-rw-r--r--sql/ha_berkeley.h2
-rw-r--r--sql/log.cc2
-rw-r--r--sql/mysqld.cc11
-rw-r--r--sql/sql_select.cc6
5 files changed, 44 insertions, 12 deletions
diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc
index 1aa34052152..981526910af 100644
--- a/sql/ha_berkeley.cc
+++ b/sql/ha_berkeley.cc
@@ -78,7 +78,7 @@ const char *ha_berkeley_ext=".db";
bool berkeley_skip=0,berkeley_shared_data=0;
u_int32_t berkeley_init_flags= DB_PRIVATE | DB_RECOVER, berkeley_env_flags=0,
berkeley_lock_type=DB_LOCK_DEFAULT;
-ulong berkeley_cache_size;
+ulong berkeley_cache_size, berkeley_log_buffer_size, berkeley_log_file_size=0;
char *berkeley_home, *berkeley_tmpdir, *berkeley_logdir;
long berkeley_lock_scan_time=0;
ulong berkeley_trans_retry=1;
@@ -99,7 +99,8 @@ static void berkeley_print_error(const char *db_errpfx, char *buffer);
static byte* bdb_get_key(BDB_SHARE *share,uint *length,
my_bool not_used __attribute__((unused)));
static BDB_SHARE *get_share(const char *table_name, TABLE *table);
-static int free_share(BDB_SHARE *share, TABLE *table, uint hidden_primary_key);
+static int free_share(BDB_SHARE *share, TABLE *table, uint hidden_primary_key,
+ bool mutex_is_locked);
static int write_status(DB *status_block, char *buff, uint length);
static void update_status(BDB_SHARE *share, TABLE *table);
static void berkeley_noticecall(DB_ENV *db_env, db_notices notice);
@@ -118,6 +119,23 @@ bool berkeley_init(void)
berkeley_tmpdir=mysql_tmpdir;
if (!berkeley_home)
berkeley_home=mysql_real_data_home;
+ /*
+ If we don't set set_lg_bsize() we will get into trouble when
+ trying to use many open BDB tables.
+ If log buffer is not set, assume that the we will need 512 byte per
+ open table. This is a number that we have reached by testing.
+ */
+ if (!berkeley_log_buffer_size)
+ {
+ berkeley_log_buffer_size= max(table_cache_size*512,32*1024);
+ }
+ /*
+ Berkeley DB require that
+ berkeley_log_file_size >= berkeley_log_buffer_size*4
+ */
+ berkeley_log_file_size= berkeley_log_buffer_size*4;
+ berkeley_log_file_size= MY_ALIGN(berkeley_log_file_size,1024*1024L);
+ berkeley_log_file_size= max(berkeley_log_file_size, 10*1024*1024L);
if (db_env_create(&db_env,0))
DBUG_RETURN(1);
@@ -136,6 +154,8 @@ bool berkeley_init(void)
1);
db_env->set_cachesize(db_env, 0, berkeley_cache_size, 0);
+ db_env->set_lg_max(db_env, berkeley_log_file_size);
+ db_env->set_lg_bsize(db_env, berkeley_log_buffer_size);
db_env->set_lk_detect(db_env, berkeley_lock_type);
if (berkeley_max_lock)
db_env->set_lk_max(db_env, berkeley_max_lock);
@@ -465,7 +485,7 @@ int ha_berkeley::open(const char *name, int mode, uint test_if_locked)
{
if ((error=db_create(&file, db_env, 0)))
{
- free_share(share,table, hidden_primary_key);
+ free_share(share,table, hidden_primary_key,1);
my_free(rec_buff,MYF(0));
my_free(alloc_ptr,MYF(0));
my_errno=error;
@@ -482,7 +502,7 @@ int ha_berkeley::open(const char *name, int mode, uint test_if_locked)
2 | 4),
"main", DB_BTREE, open_mode,0))))
{
- free_share(share,table, hidden_primary_key);
+ free_share(share,table, hidden_primary_key,1);
my_free(rec_buff,MYF(0));
my_free(alloc_ptr,MYF(0));
my_errno=error;
@@ -555,7 +575,7 @@ int ha_berkeley::close(void)
my_free(rec_buff,MYF(MY_ALLOW_ZERO_PTR));
my_free(alloc_ptr,MYF(MY_ALLOW_ZERO_PTR));
- DBUG_RETURN(free_share(share,table, hidden_primary_key));
+ DBUG_RETURN(free_share(share,table, hidden_primary_key,0));
}
@@ -2077,11 +2097,14 @@ static BDB_SHARE *get_share(const char *table_name, TABLE *table)
return share;
}
-static int free_share(BDB_SHARE *share, TABLE *table, uint hidden_primary_key)
+static int free_share(BDB_SHARE *share, TABLE *table, uint hidden_primary_key,
+ bool mutex_is_locked)
{
int error, result = 0;
uint keys=table->keys + test(hidden_primary_key);
pthread_mutex_lock(&bdb_mutex);
+ if (mutex_is_locked)
+ pthread_mutex_unlock(&share->mutex);
if (!--share->use_count)
{
DB **key_file = share->key_file;
diff --git a/sql/ha_berkeley.h b/sql/ha_berkeley.h
index 8684bbb0442..12879383261 100644
--- a/sql/ha_berkeley.h
+++ b/sql/ha_berkeley.h
@@ -168,7 +168,7 @@ class ha_berkeley: public handler
extern bool berkeley_skip, berkeley_shared_data;
extern u_int32_t berkeley_init_flags,berkeley_env_flags, berkeley_lock_type,
berkeley_lock_types[];
-extern ulong berkeley_cache_size, berkeley_max_lock;
+extern ulong berkeley_cache_size, berkeley_max_lock, berkeley_log_buffer_size;
extern char *berkeley_home, *berkeley_tmpdir, *berkeley_logdir;
extern long berkeley_lock_scan_time;
extern TYPELIB berkeley_lock_typelib;
diff --git a/sql/log.cc b/sql/log.cc
index 41fb4bfb856..df3168c02cf 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -952,7 +952,7 @@ void sql_print_error(const char *format,...)
#ifndef DBUG_OFF
{
char buff[1024];
- vsprintf(buff,format,args);
+ vsnprintf(buff,sizeof(buff)-1,format,args);
DBUG_PRINT("error",("%s",buff));
}
#endif
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 1d72f21df1d..4d9b7982f48 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1190,7 +1190,11 @@ static void init_signals(void)
struct sigaction sa; sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
sigprocmask(SIG_SETMASK,&sa.sa_mask,NULL);
- sa.sa_handler=handle_segfault;
+#ifdef HAVE_DARWIN_THREADS
+ sa.sa_handler=( void (*)() ) handle_segfault;
+#else
+ sa.sa_handler=handle_segfault;
+#endif
sigaction(SIGSEGV, &sa, NULL);
(void) sigemptyset(&set);
#ifdef THREAD_SPECIFIC_SIGPIPE
@@ -2512,6 +2516,8 @@ CHANGEABLE_VAR changeable_vars[] = {
#ifdef HAVE_BERKELEY_DB
{ "bdb_cache_size", (long*) &berkeley_cache_size,
KEY_CACHE_SIZE, 20*1024, (long) ~0, 0, IO_SIZE },
+ {"bdb_log_buffer_size", (long*) &berkeley_log_buffer_size, 0, 256*1024L,
+ ~0L, 0, 1024},
{ "bdb_max_lock", (long*) &berkeley_max_lock,
10000, 0, (long) ~0, 0, 1 },
/* QQ: The following should be removed soon! */
@@ -2622,6 +2628,7 @@ struct show_var_st init_vars[]= {
{"basedir", mysql_home, SHOW_CHAR},
#ifdef HAVE_BERKELEY_DB
{"bdb_cache_size", (char*) &berkeley_cache_size, SHOW_LONG},
+ {"bdb_log_buffer_size", (char*) &berkeley_log_buffer_size, SHOW_LONG},
{"bdb_home", (char*) &berkeley_home, SHOW_CHAR_PTR},
{"bdb_max_lock", (char*) &berkeley_max_lock, SHOW_LONG},
{"bdb_logdir", (char*) &berkeley_logdir, SHOW_CHAR_PTR},
@@ -2812,7 +2819,7 @@ static void usage(void)
Don't flush key buffers between writes for any MyISAM\n\
table\n\
--enable-locking Enable system locking\n\
- -T, --exit-info Print some debug info at exit\n\
+ -T, --exit-info Used for debugging; Use at your own risk!\n\
--flush Flush tables to disk between SQL commands\n\
-?, --help Display this help and exit\n\
--init-file=file Read SQL commands from this file at startup\n\
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 8e11d60fb6e..7cbd022a7b7 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -4837,7 +4837,8 @@ end_write_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
/*****************************************************************************
** Remove calculation with tables that aren't yet read. Remove also tests
-** against fields that are read through key.
+** against fields that are read through key where the table is not a
+** outer join table.
** We can't remove tests that are made against columns which are stored
** in sorted order.
*****************************************************************************/
@@ -4853,7 +4854,8 @@ static bool test_if_ref(Item_field *left_item,Item *right_item)
if (ref_item && ref_item->eq(right_item))
{
if (right_item->type() == Item::FIELD_ITEM)
- return field->eq_def(((Item_field *) right_item)->field);
+ return (field->eq_def(((Item_field *) right_item)->field) &&
+ !field->table->maybe_null);
if (right_item->const_item())
{
// We can remove binary fields and numerical fields except float,