summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <monty@donna.mysql.com>2001-01-28 21:41:10 +0200
committerunknown <monty@donna.mysql.com>2001-01-28 21:41:10 +0200
commit0374dcdd9557002cc6e9747b28a4d01c9259ca6c (patch)
tree139475fd16658189e77529627fb94bbba4b777f1 /sql
parent184e24b2253a81b03476e3d4d8cf56d5eb9dbf18 (diff)
parent12fd55a5a65dd3d6e6f1ba883d20a86a74aa8d2d (diff)
downloadmariadb-git-0374dcdd9557002cc6e9747b28a4d01c9259ca6c.tar.gz
merge
myisam/mi_check.c: Auto merged sql/mysqld.cc: Auto merged sql/sql_repl.cc: Auto merged sql/sql_select.cc: Auto merged sql/table.h: Auto merged
Diffstat (limited to 'sql')
-rw-r--r--sql/mysql_priv.h4
-rw-r--r--sql/mysqld.cc16
-rw-r--r--sql/slave.cc9
-rw-r--r--sql/sql_base.cc1
-rw-r--r--sql/sql_parse.cc7
-rw-r--r--sql/sql_repl.cc2
-rw-r--r--sql/sql_select.cc29
-rw-r--r--sql/table.h2
8 files changed, 61 insertions, 9 deletions
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index d3f208aa6de..4c83d70abf1 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -73,6 +73,7 @@ void kill_one_thread(THD *thd, ulong id);
#ifndef MYSQLD_NET_RETRY_COUNT
#define MYSQLD_NET_RETRY_COUNT 10 // Abort read after this many int.
#endif
+#define TEMP_POOL_SIZE 128
/* The following parameters is to decide when to use an extra cache to
optimise seeks when reading a big table in sorted order */
#define MIN_FILE_LENGTH_TO_USE_ROW_CACHE (16L*1024*1024)
@@ -507,7 +508,8 @@ extern ulong ha_read_count, ha_write_count, ha_delete_count, ha_update_count,
ha_read_key_count, ha_read_next_count, ha_read_prev_count,
ha_read_first_count, ha_read_last_count,
ha_read_rnd_count, ha_read_rnd_next_count;
-
+extern uchar temp_pool[TEMP_POOL_SIZE];
+extern bool use_temp_pool;
extern char f_fyllchar;
extern uchar *days_in_month;
extern DATE_FORMAT dayord;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 22e7f4859fb..07e0bd4131a 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -287,6 +287,9 @@ I_List<THD> threads,thread_cache;
time_t start_time;
+uchar temp_pool[TEMP_POOL_SIZE];
+bool use_temp_pool;
+
pthread_key(MEM_ROOT*,THR_MALLOC);
pthread_key(THD*, THR_THD);
pthread_key(NET*, THR_NET);
@@ -1532,6 +1535,9 @@ int main(int argc, char **argv)
if (!mysql_tmpdir || !mysql_tmpdir[0])
mysql_tmpdir=(char*) P_tmpdir; /* purecov: inspected */
+ bzero(temp_pool, TEMP_POOL_SIZE);
+ use_temp_pool = 0;
+
set_options();
#ifdef __WIN__
/* service parameters can be overwritten by options */
@@ -2404,7 +2410,8 @@ enum options {
OPT_INNOBASE_LOG_GROUP_HOME_DIR,
OPT_INNOBASE_LOG_ARCH_DIR, OPT_INNOBASE_LOG_ARCHIVE,
OPT_INNOBASE_FLUSH_LOG_AT_TRX_COMMIT, OPT_SAFE_SHOW_DB,
- OPT_GEMINI_SKIP
+ OPT_GEMINI_SKIP,
+ OPT_TEMP_POOL
};
static struct option long_options[] = {
@@ -2535,6 +2542,7 @@ static struct option long_options[] = {
#ifdef __WIN__
{"standalone", no_argument, 0, (int) OPT_STANDALONE},
#endif
+ {"temp-pool", no_argument, 0, (int) OPT_TEMP_POOL},
{"tmpdir", required_argument, 0, 't'},
{"use-locking", no_argument, 0, (int) OPT_USE_LOCKING},
#ifdef USE_SYMDIR
@@ -2803,6 +2811,8 @@ struct show_var_st status_vars[]= {
{"Sort_range", (char*) &filesort_range_count, SHOW_LONG},
{"Sort_rows", (char*) &filesort_rows, SHOW_LONG},
{"Sort_scan", (char*) &filesort_scan_count, SHOW_LONG},
+ {"Table_locks_immediate", (char*) &locks_immediate, SHOW_LONG},
+ {"Table_locks_waited", (char*) &locks_waited, SHOW_LONG},
{"Threads_cached", (char*) &cached_thread_count, SHOW_LONG_CONST},
{"Threads_created", (char*) &thread_created, SHOW_LONG_CONST},
{"Threads_connected", (char*) &thread_count, SHOW_INT_CONST},
@@ -2911,6 +2921,7 @@ static void usage(void)
Don't give threads different priorities.\n\
--socket=... Socket file to use for connection\n\
-t, --tmpdir=path Path for temporary files\n\
+ --temp-pool Use a pool of temporary files\n\
-u, --user=user_name Run mysqld daemon as user\n\
-V, --version output version information and exit");
#ifdef __WIN__
@@ -3086,6 +3097,9 @@ static void get_options(int argc,char **argv)
case 't':
mysql_tmpdir=optarg;
break;
+ case OPT_TEMP_POOL:
+ use_temp_pool=1;
+ break;
case 'u':
mysqld_user=optarg;
break;
diff --git a/sql/slave.cc b/sql/slave.cc
index 22d76c54ecd..5a110b6921b 100644
--- a/sql/slave.cc
+++ b/sql/slave.cc
@@ -1055,9 +1055,12 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
break;
case STOP_EVENT:
- close_temporary_tables(thd);
- mi->inc_pos(event_len);
- flush_master_info(mi);
+ if(mi->pos > 4) // stop event should be ignored after rotate event
+ {
+ close_temporary_tables(thd);
+ mi->inc_pos(event_len);
+ flush_master_info(mi);
+ }
delete ev;
break;
case ROTATE_EVENT:
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 96d6ea660aa..d69bc905c31 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -1167,6 +1167,7 @@ bool wait_for_tables(THD *thd)
/* Now we can open all tables without any interference */
thd->proc_info="Reopen tables";
result=reopen_tables(thd,0,0);
+
}
pthread_mutex_unlock(&LOCK_open);
thd->proc_info=0;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 495b00217ef..2926f59547f 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -1886,6 +1886,13 @@ check_access(THD *thd,uint want_access,const char *db, uint *save_priv,
if (db == any_db)
return FALSE; // Allow select on anything
+
+ if (strlen(db) > NAME_LEN || check_db_name(db))
+ {
+ net_printf(&thd->net,ER_WRONG_DB_NAME, db);
+ return TRUE;
+ }
+
if (db && (!thd->db || strcmp(db,thd->db)))
db_access=acl_get(thd->host, thd->ip, (char*) &thd->remote.sin_addr,
thd->priv_user, db); /* purecov: inspected */
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc
index 590d25e3661..7730706f0d0 100644
--- a/sql/sql_repl.cc
+++ b/sql/sql_repl.cc
@@ -391,7 +391,7 @@ sweepstakes if you report the bug";
thd->mysys_var->current_mutex = log_lock;
thd->mysys_var->current_cond = &COND_binlog_update;
const char* proc_info = thd->proc_info;
- thd->proc_info = "Waiting for update";
+ thd->proc_info = "Slave connection: waiting for binlog update";
pthread_mutex_unlock(&thd->mysys_var->mutex);
bool read_packet = 0, fatal_error = 0;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 526c78e0856..a3288540562 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -30,6 +30,7 @@
#include <hash.h>
#include <ft_global.h>
#include <assert.h>
+#include <my_bitmap.h>
const char *join_type_str[]={ "UNKNOWN","system","const","eq_ref","ref",
"MAYBE_REF","ALL","range","index","fulltext" };
@@ -3287,14 +3288,28 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
KEY_PART_INFO *key_part_info;
Item_result_field **copy_func;
MI_COLUMNDEF *recinfo;
+ uint temp_pool_slot;
+
DBUG_ENTER("create_tmp_table");
DBUG_PRINT("enter",("distinct: %d save_sum_fields: %d allow_distinct_limit: %d group: %d",
(int) distinct, (int) save_sum_fields,
(int) allow_distinct_limit,test(group)));
statistic_increment(created_tmp_tables, &LOCK_status);
- sprintf(path,"%s%s%lx_%lx_%x",mysql_tmpdir,tmp_file_prefix,current_pid,
- thd->thread_id, thd->tmp_table++);
+
+ if(use_temp_pool) {
+ temp_pool_slot = bitmap_set_next(temp_pool, TEMP_POOL_SIZE);
+ if(temp_pool_slot != MY_BIT_NONE) // we got a slot
+ sprintf(path, "%s%s_%lx_%i", mysql_tmpdir, tmp_file_prefix,
+ current_pid, temp_pool_slot);
+ else // if we run out of slots in the pool, fall back to old behavior
+ sprintf(path,"%s%s%lx_%lx_%x",mysql_tmpdir,tmp_file_prefix,current_pid,
+ thd->thread_id, thd->tmp_table++);
+ } else {
+ sprintf(path,"%s%s%lx_%lx_%x",mysql_tmpdir,tmp_file_prefix,current_pid,
+ thd->thread_id, thd->tmp_table++);
+ };
+
if (group)
{
if (!param->quick_group)
@@ -3324,10 +3339,12 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
param->group_length : 0,
NullS))
{
+ bitmap_clear_bit(temp_pool, TEMP_POOL_SIZE, temp_pool_slot);
DBUG_RETURN(NULL); /* purecov: inspected */
}
if (!(param->copy_field=copy=new Copy_field[field_count]))
{
+ bitmap_clear_bit(temp_pool, TEMP_POOL_SIZE, temp_pool_slot);
my_free((gptr) table,MYF(0)); /* purecov: inspected */
DBUG_RETURN(NULL); /* purecov: inspected */
}
@@ -3347,6 +3364,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
table->map=1;
table->tmp_table=1;
table->db_low_byte_first=1; // True for HEAP and MyISAM
+ table->temp_pool_slot = temp_pool_slot;
+
/* Calculate which type of fields we will store in the temporary table */
@@ -3670,7 +3689,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
DBUG_RETURN(table);
err:
- free_tmp_table(thd,table); /* purecov: inspected */
+ free_tmp_table(thd,table); /* purecov: inspected */
+ bitmap_clear_bit(temp_pool, TEMP_POOL_SIZE, temp_pool_slot);
DBUG_RETURN(NULL); /* purecov: inspected */
}
@@ -3817,6 +3837,9 @@ free_tmp_table(THD *thd, TABLE *entry)
delete *ptr;
my_free((gptr) entry->record[0],MYF(0));
free_io_cache(entry);
+
+ bitmap_clear_bit(temp_pool, TEMP_POOL_SIZE, entry->temp_pool_slot);
+
my_free((gptr) entry,MYF(0));
thd->proc_info=save_proc_info;
diff --git a/sql/table.h b/sql/table.h
index c17a1eca830..a3b361742c5 100644
--- a/sql/table.h
+++ b/sql/table.h
@@ -120,6 +120,8 @@ struct st_table {
key_part_map const_key_parts[MAX_KEY];
ulong query_id;
+ uint temp_pool_slot;
+
THD *in_use; /* Which thread uses this */
struct st_table *next,*prev;
};