summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/filesort.cc15
-rw-r--r--sql/ha_berkeley.cc6
-rw-r--r--sql/item_create.cc5
-rw-r--r--sql/item_create.h1
-rw-r--r--sql/item_strfunc.cc2
-rw-r--r--sql/lex.h2
-rw-r--r--sql/lock.cc4
-rw-r--r--sql/log.cc127
-rw-r--r--sql/mysqld.cc20
-rw-r--r--sql/sql_class.h2
-rw-r--r--sql/sql_insert.cc8
-rw-r--r--sql/sql_lex.h24
-rw-r--r--sql/sql_load.cc2
-rw-r--r--sql/sql_parse.cc33
-rw-r--r--sql/sql_select.cc11
-rw-r--r--sql/sql_yacc.yy18
-rw-r--r--sql/violite.c46
17 files changed, 189 insertions, 137 deletions
diff --git a/sql/filesort.cc b/sql/filesort.cc
index 0cee107cbb8..220ff69a3e8 100644
--- a/sql/filesort.cc
+++ b/sql/filesort.cc
@@ -38,8 +38,8 @@ if (my_b_write((file),(byte*) (from),param->ref_length)) \
typedef struct st_buffpek { /* Struktur om sorteringsbuffrarna */
my_off_t file_pos; /* Where we are in the sort file */
- ha_rows count; /* Number of rows in table */
uchar *base,*key; /* key pointers */
+ ha_rows count; /* Number of rows in table */
ulong mem_count; /* numbers of keys in memory */
ulong max_keys; /* Max keys in buffert */
} BUFFPEK;
@@ -98,7 +98,6 @@ ha_rows filesort(TABLE **table, SORT_FIELD *sortorder, uint s_length,
BUFFPEK *buffpek;
ha_rows records;
uchar **sort_keys;
- gptr save_1,save_2;
IO_CACHE tempfile,*selected_records_file,*outfile;
SORTPARAM param;
DBUG_ENTER("filesort");
@@ -109,7 +108,6 @@ ha_rows filesort(TABLE **table, SORT_FIELD *sortorder, uint s_length,
outfile= table[0]->io_cache;
my_b_clear(&tempfile);
- save_1=save_2=0;
buffpek= (BUFFPEK *) NULL; sort_keys= (uchar **) NULL; error= 1;
maxbuffer=1;
param.ref_length= table[0]->file->ref_length;
@@ -160,11 +158,6 @@ ha_rows filesort(TABLE **table, SORT_FIELD *sortorder, uint s_length,
goto err;
#endif
- /* Reserve memory for IO_CACHE files */
- if (! (save_1=my_malloc(DISK_BUFFER_SIZE,MYF(MY_WME))) ||
- ! (save_2=my_malloc(DISK_BUFFER_SIZE,MYF(MY_WME))))
- goto err;
-
memavl=sortbuff_size;
while (memavl >= MIN_SORT_MEMORY)
{
@@ -207,10 +200,6 @@ ha_rows filesort(TABLE **table, SORT_FIELD *sortorder, uint s_length,
my_error(ER_OUTOFMEMORY,MYF(ME_ERROR+ME_WAITTANG),sortbuff_size);
goto err;
}
- my_free(save_1,MYF(0)); /* Free for later use */
- my_free(save_2,MYF(0));
- save_1=save_2=0;
-
param.sort_form= table[0];
param.end=(param.local_sortorder=sortorder)+s_length;
if ((records=find_all_keys(&param,select,sort_keys,buffpek,&maxbuffer,
@@ -252,8 +241,6 @@ ha_rows filesort(TABLE **table, SORT_FIELD *sortorder, uint s_length,
#endif
x_free((gptr) sort_keys);
x_free((gptr) buffpek);
- x_free(save_1);
- x_free(save_2);
close_cached_file(&tempfile);
if (my_b_inited(outfile))
{
diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc
index 13306397fe1..80421f006cc 100644
--- a/sql/ha_berkeley.cc
+++ b/sql/ha_berkeley.cc
@@ -60,6 +60,7 @@
#define HA_BERKELEY_ROWS_IN_TABLE 10000 /* to get optimization right */
#define HA_BERKELEY_RANGE_COUNT 100
+#define HA_BERKELEY_MAX_ROWS 10000000 /* Max rows in table */
const char *ha_berkeley_ext=".db";
bool berkeley_skip=0;
@@ -1615,12 +1616,13 @@ void ha_berkeley::update_auto_primary_key()
ha_rows ha_berkeley::estimate_number_of_rows()
{
ulonglong max_ident;
+ ulonglong max_rows=table->max_rows ? table->max_rows : HA_BERKELEY_MAX_ROWS;
if (!hidden_primary_key)
- return INT_MAX32;
+ return (ha_rows) max_rows;
pthread_mutex_lock(&share->mutex);
max_ident=share->auto_ident+EXTRA_RECORDS;
pthread_mutex_unlock(&share->mutex);
- return (ha_rows) min(max_ident,(ulonglong) INT_MAX32);
+ return (ha_rows) min(max_ident,max_rows);
}
#endif /* HAVE_BERKELEY_DB */
diff --git a/sql/item_create.cc b/sql/item_create.cc
index 8c62643b35a..8e6332d4e16 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -352,11 +352,6 @@ Item *create_func_to_days(Item* a)
return new Item_func_to_days(a);
}
-Item *create_func_truncate (Item *a, Item *b)
-{
- return new Item_func_round(a,b,1);
-}
-
Item *create_func_ucase(Item* a)
{
return new Item_func_ucase(a);
diff --git a/sql/item_create.h b/sql/item_create.h
index aa617946d98..de2726b32b0 100644
--- a/sql/item_create.h
+++ b/sql/item_create.h
@@ -81,7 +81,6 @@ Item *create_func_tan(Item* a);;
Item *create_func_time_format(Item *a, Item *b);
Item *create_func_time_to_sec(Item* a);
Item *create_func_to_days(Item* a);
-Item *create_func_truncate (Item *a, Item *b);
Item *create_func_ucase(Item* a);
Item *create_func_version(void);
Item *create_func_weekday(Item* a);
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index a52b9a85857..f8b0576dab5 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -1586,7 +1586,7 @@ String *Item_load_file::val_str(String *str)
if (!(file_name= args[0]->val_str(str)) ||
!(current_thd->master_access & FILE_ACL) ||
- !my_stat(file_name->c_ptr(), &stat_info, MYF(MY_FAE)))
+ !my_stat(file_name->c_ptr(), &stat_info, MYF(MY_WME)))
goto err;
if (!(stat_info.st_mode & S_IROTH))
{
diff --git a/sql/lex.h b/sql/lex.h
index a5c1b6eb123..b759076ac6d 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -301,6 +301,7 @@ static SYMBOL symbols[] = {
{ "TINYTEXT", SYM(TINYTEXT),0,0},
{ "TINYINT", SYM(TINYINT),0,0},
{ "TRAILING", SYM(TRAILING),0,0},
+ { "TRUNCATE", SYM(TRUNCATE_SYM),0,0},
{ "TO", SYM(TO_SYM),0,0},
{ "TYPE", SYM(TYPE_SYM),0,0},
{ "UNION", SYM(UNION_SYM),0,0},
@@ -442,7 +443,6 @@ static SYMBOL sql_functions[] = {
{ "TIME_TO_SEC", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_time_to_sec)},
{ "TO_DAYS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_to_days)},
{ "TRIM", SYM(TRIM),0,0},
- { "TRUNCATE", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_truncate )},
{ "UCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
{ "UPPER", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
{ "UNIQUE_USERS", SYM(UNIQUE_USERS),0,0},
diff --git a/sql/lock.cc b/sql/lock.cc
index 4c7ae8e950b..c85983b65d6 100644
--- a/sql/lock.cc
+++ b/sql/lock.cc
@@ -70,8 +70,8 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **tables,uint count)
thd->proc_info="Waiting for table";
pthread_mutex_unlock(&thd->mysys_var->mutex);
- while (global_read_lock && ! thd->killed ||
- thd->version != refresh_version)
+ while (global_read_lock && ! thd->killed &&
+ thd->version == refresh_version)
{
(void) pthread_cond_wait(&COND_refresh,&LOCK_open);
}
diff --git a/sql/log.cc b/sql/log.cc
index d245f49bf7d..c1e38a104ca 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -24,8 +24,6 @@
#include <stdarg.h>
#include <m_ctype.h> // For test_if_number
-
-
MYSQL_LOG mysql_log,mysql_update_log,mysql_slow_log,mysql_bin_log;
extern I_List<i_string> binlog_do_db, binlog_ignore_db;
@@ -76,7 +74,7 @@ static int find_uniq_filename(char *name)
-MYSQL_LOG::MYSQL_LOG(): file(0),index_file(0),last_time(0),query_start(0),
+MYSQL_LOG::MYSQL_LOG(): file(-1),index_file(-1),last_time(0),query_start(0),
name(0), log_type(LOG_CLOSED),write_error(0),inited(0),
no_rotate(0)
{
@@ -90,10 +88,10 @@ MYSQL_LOG::MYSQL_LOG(): file(0),index_file(0),last_time(0),query_start(0),
MYSQL_LOG::~MYSQL_LOG()
{
if (inited)
- {
- (void) pthread_mutex_destroy(&LOCK_log);
- (void) pthread_mutex_destroy(&LOCK_index);
- }
+ {
+ (void) pthread_mutex_destroy(&LOCK_log);
+ (void) pthread_mutex_destroy(&LOCK_index);
+ }
}
void MYSQL_LOG::set_index_file_name(const char* index_file_name)
@@ -128,13 +126,14 @@ int MYSQL_LOG::generate_new_name(char *new_name, const char *log_name)
void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
const char *new_name)
{
-
+ MY_STAT tmp_stat;
+ char buff[512];
if (!inited)
{
inited=1;
(void) pthread_mutex_init(&LOCK_log,NULL);
(void) pthread_mutex_init(&LOCK_index, NULL);
- if(log_type_arg == LOG_BIN && *fn_ext(log_name))
+ if (log_type_arg == LOG_BIN && *fn_ext(log_name))
no_rotate = 1;
}
@@ -149,13 +148,11 @@ void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
fn_format(index_file_name, name, mysql_data_home, ".index", 6);
db[0]=0;
- MY_STAT tmp_stat;
bool do_magic = ((log_type == LOG_BIN) && !my_stat(log_file_name,
&tmp_stat, MYF(0)));
- file=my_fopen(log_file_name,O_APPEND | O_WRONLY | O_BINARY,
- MYF(MY_WME | ME_WAITTANG));
- if (!file)
+ if ((file=my_open(log_file_name,O_APPEND | O_WRONLY | O_BINARY,
+ MYF(MY_WME | ME_WAITTANG)) < 0)
{
my_free(name,MYF(0));
name=0;
@@ -165,21 +162,21 @@ void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
if (log_type == LOG_NORMAL)
{
+ char *end;
#ifdef __NT__
- fprintf(file, "%s, Version: %s, started with:\nTCP Port: %d, Named Pipe: %s\n", my_progname, server_version, mysql_port, mysql_unix_port);
+ sprintf(buff, "%s, Version: %s, started with:\nTCP Port: %d, Named Pipe: %s\n", my_progname, server_version, mysql_port, mysql_unix_port);
#else
- fprintf(file, "%s, Version: %s, started with:\nTcp port: %d Unix socket: %s\n", my_progname,server_version,mysql_port,mysql_unix_port);
+ sprintf(buff, "%s, Version: %s, started with:\nTcp port: %d Unix socket: %s\n", my_progname,server_version,mysql_port,mysql_unix_port);
#endif
- fprintf(file,"Time Id Command Argument\n");
- (void) fflush(file);
+ end=strmov(strend(buff),"Time Id Command Argument\n");
+ my_write(file,buff,(uint) (end-buff),MYF(0));
}
else if (log_type == LOG_NEW)
{
time_t skr=time(NULL);
struct tm tm_tmp;
localtime_r(&skr,&tm_tmp);
-
- fprintf(file,"# %s, Version: %s at %02d%02d%02d %2d:%02d:%02d\n",
+ sprintf(buff,"# %s, Version: %s at %02d%02d%02d %2d:%02d:%02d\n",
my_progname,server_version,
tm_tmp.tm_year % 100,
tm_tmp.tm_mon+1,
@@ -187,7 +184,7 @@ void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
tm_tmp.tm_hour,
tm_tmp.tm_min,
tm_tmp.tm_sec);
- (void) fflush(file);
+ my_write(file,buff,(uint) strlen(buff),MYF(0));
}
else if (log_type == LOG_BIN)
{
@@ -198,25 +195,26 @@ void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
// clean up if failed
// then if index_file has not been previously opened, try to open it
// clean up if failed
- if((do_magic && my_fwrite(file, (byte*)BINLOG_MAGIC, 4,
- MYF(MY_NABP|MY_WME)) ||
- (!index_file &&
- !(index_file = my_fopen(index_file_name,O_APPEND | O_BINARY | O_RDWR,
- MYF(MY_WME))))))
+
+ if ((do_magic && my_write(file, (byte*) BINLOG_MAGIC, 4,
+ MYF(MY_NABP|MY_WME)) ||
+ (index_file < 0 &&
+ (index_file = my_fopen(index_file_name,O_APPEND | O_BINARY | O_RDWR,
+ MYF(MY_WME))) < 0)))
{
- my_fclose(file,MYF(MY_WME));
+ my_close(file,MYF(MY_WME));
my_free(name,MYF(0));
name=0;
- file=0;
+ file= -1;
log_type=LOG_CLOSED;
return;
}
Start_log_event s;
s.write(file);
pthread_mutex_lock(&LOCK_index);
- my_fseek(index_file, 0L, MY_SEEK_END, MYF(MY_WME));
- fprintf(index_file, "%s\n", log_file_name);
- fflush(index_file);
+ my_seek(index_file, 0L, MY_SEEK_END, MYF(MY_WME));
+ my_write(index_file, log_file_name,strlen(log_file_name), MYF(0));
+ my_write(index_file, "\n",1, MYF(0));
pthread_mutex_unlock(&LOCK_index);
}
}
@@ -225,7 +223,7 @@ int MYSQL_LOG::get_current_log(LOG_INFO* linfo)
{
pthread_mutex_lock(&LOCK_log);
strmake(linfo->log_file_name, log_file_name, sizeof(linfo->log_file_name));
- linfo->pos = my_ftell(file, MYF(MY_WME));
+ linfo->pos = my_tell(file, MYF(MY_WME));
pthread_mutex_unlock(&LOCK_log);
return 0;
}
@@ -235,63 +233,66 @@ int MYSQL_LOG::find_first_log(LOG_INFO* linfo, const char* log_name)
{
// mutex needed because we need to make sure the file pointer does not move
// from under our feet
- if(!index_file) return LOG_INFO_INVALID;
+ if (index_file < 0) return LOG_INFO_INVALID;
int error = 0;
char* fname = linfo->log_file_name;
int log_name_len = (uint) strlen(log_name);
pthread_mutex_lock(&LOCK_index);
- if(my_fseek(index_file, 0L, MY_SEEK_SET, MYF(MY_WME) ) == MY_FILEPOS_ERROR)
+ if (my_seek(index_file, 0L, MY_SEEK_SET, MYF(MY_WME) ) == MY_FILEPOS_ERROR)
+ {
+ error = LOG_INFO_SEEK;
+ goto err;
+ }
+
+ for(;;)
+ {
+ if (!fgets(fname, FN_REFLEN, index_file))
{
- error = LOG_INFO_SEEK;
+ error = feof(index_file) ? LOG_INFO_EOF : LOG_INFO_IO;
goto err;
}
- for(;;)
+ // if the log entry matches, empty string matching anything
+ if (!log_name_len ||
+ (fname[log_name_len] == '\n' &&
+ !memcmp(fname, log_name, log_name_len)))
{
- if(!fgets(fname, FN_REFLEN, index_file))
- {
- error = feof(index_file) ? LOG_INFO_EOF : LOG_INFO_IO;
- goto err;
- }
-
- // if the log entry matches, empty string matching anything
- if(!log_name_len || (fname[log_name_len] == '\n' && !memcmp(fname, log_name, log_name_len)))
- {
- if(log_name_len)
- fname[log_name_len] = 0; // to kill \n
- else
- {
- *(strend(fname) - 1) = 0;
- }
- linfo->index_file_offset = my_ftell(index_file, MYF(MY_WME));
- break;
- }
+ if (log_name_len)
+ fname[log_name_len] = 0; // to kill \n
+ else
+ {
+ *(strend(fname) - 1) = 0;
+ }
+ linfo->index_file_offset = my_tell(index_file, MYF(MY_WME));
+ break;
}
-
+ }
error = 0;
err:
pthread_mutex_unlock(&LOCK_index);
return error;
}
+
+
int MYSQL_LOG::find_next_log(LOG_INFO* linfo)
{
// mutex needed because we need to make sure the file pointer does not move
// from under our feet
- if(!index_file) return LOG_INFO_INVALID;
+ if (!index_file) return LOG_INFO_INVALID;
int error = 0;
char* fname = linfo->log_file_name;
char* end ;
pthread_mutex_lock(&LOCK_index);
- if(my_fseek(index_file, linfo->index_file_offset, MY_SEEK_SET, MYF(MY_WME) ) == MY_FILEPOS_ERROR)
+ if (my_fseek(index_file, linfo->index_file_offset, MY_SEEK_SET, MYF(MY_WME) ) == MY_FILEPOS_ERROR)
{
error = LOG_INFO_SEEK;
goto err;
}
- if(!fgets(fname, FN_REFLEN, index_file))
+ if (!fgets(fname, FN_REFLEN, index_file))
{
error = feof(index_file) ? LOG_INFO_EOF : LOG_INFO_IO;
goto err;
@@ -310,11 +311,11 @@ err:
// we assume that buf has at least FN_REFLEN bytes alloced
void MYSQL_LOG::make_log_name(char* buf, const char* log_ident)
{
- if(inited)
+ if (inited)
{
int dir_len = dirname_length(log_file_name);
int ident_len = (uint) strlen(log_ident);
- if(dir_len + ident_len + 1 > FN_REFLEN)
+ if (dir_len + ident_len + 1 > FN_REFLEN)
{
buf[0] = 0;
return; // protection agains malicious buffer overflow
@@ -337,7 +338,7 @@ void MYSQL_LOG::new_file()
{
if (file)
{
- if(no_rotate) // do not rotate logs that are marked non-rotatable
+ if (no_rotate) // do not rotate logs that are marked non-rotatable
return; // ( for binlog with constant name)
char new_name[FN_REFLEN], *old_name=name;
@@ -469,14 +470,14 @@ void MYSQL_LOG::write(Query_log_event* event_info)
if (thd->insert_id_used)
{
Intvar_log_event e((uchar)INSERT_ID_EVENT, thd->last_insert_id);
- if(e.write(file))
+ if (e.write(file))
{
sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno);
goto err;
}
}
- if(thd->convert_set)
+ if (thd->convert_set)
{
char buf[1024] = "SET CHARACTER SET ";
char* p = strend(buf);
@@ -485,7 +486,7 @@ void MYSQL_LOG::write(Query_log_event* event_info)
// just in case somebody wants it later
thd->query_length = (uint)(p - buf);
Query_log_event e(thd, buf);
- if(e.write(file))
+ if (e.write(file))
{
sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno);
goto err;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 6cb24de17c5..c2415a3e2c1 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -130,7 +130,7 @@ extern "C" int gethostname(char *name, int namelen);
#ifndef DBUG_OFF
static const char* default_dbug_option=IF_WIN("d:t:i:O,\\mysqld.trace",
- "d:t:i:o,/tmp/mysqld.trace");
+ "d:t:i:o,/tmp/mysqld.trace");
#endif
#ifdef __NT__
@@ -156,7 +156,7 @@ static pthread_t select_thread;
static pthread_t flush_thread; // Used when debugging
static bool opt_log,opt_update_log,opt_bin_log,opt_slow_log,opt_noacl,
opt_disable_networking=0, opt_bootstrap=0,opt_skip_show_db=0,
- opt_ansi_mode=0,opt_myisam_log=0;
+ opt_ansi_mode=0,opt_myisam_log=0, opt_large_files=sizeof(my_off_t) > 4;
bool opt_sql_bin_update = 0, opt_log_slave_updates = 0;
// if sql_bin_update is true, SQL_LOG_UPDATE and SQL_LOG_BIN are kept in sync, and are
@@ -576,8 +576,8 @@ void unireg_abort(int exit_code)
{
if (exit_code)
sql_print_error("Aborting\n");
- (void) my_delete(pidfile_name,MYF(0)); // This may not always exist
clean_up(); /* purecov: inspected */
+ (void) my_delete(pidfile_name,MYF(0)); // This may not always exist
exit(exit_code); /* purecov: inspected */
}
@@ -2421,20 +2421,21 @@ struct show_var_st init_vars[]= {
#endif
{"character_set", default_charset, SHOW_CHAR},
{"character_sets", (char*) &charsets_list, SHOW_CHAR_PTR},
- {"connect_timeout", (char*) &connect_timeout, SHOW_LONG},
{"concurrent_insert", (char*) &myisam_concurrent_insert, SHOW_MY_BOOL},
+ {"connect_timeout", (char*) &connect_timeout, SHOW_LONG},
{"datadir", mysql_real_data_home, SHOW_CHAR},
{"delay_key_write", (char*) &myisam_delay_key_write, SHOW_MY_BOOL},
{"delayed_insert_limit", (char*) &delayed_insert_limit, SHOW_LONG},
{"delayed_insert_timeout", (char*) &delayed_insert_timeout, SHOW_LONG},
{"delayed_queue_size", (char*) &delayed_queue_size, SHOW_LONG},
- {"join_buffer_size", (char*) &join_buff_size, SHOW_LONG},
{"flush", (char*) &myisam_flush, SHOW_MY_BOOL},
{"flush_time", (char*) &flush_time, SHOW_LONG},
{"init_file", (char*) &opt_init_file, SHOW_CHAR_PTR},
{"interactive_timeout", (char*) &net_interactive_timeout, SHOW_LONG},
+ {"join_buffer_size", (char*) &join_buff_size, SHOW_LONG},
{"key_buffer_size", (char*) &keybuff_size, SHOW_LONG},
{"language", language, SHOW_CHAR},
+ {"large_files_support", (char*) &opt_large_files, SHOW_BOOL},
#ifdef HAVE_MLOCKALL
{"locked_in_memory", (char*) &locked_in_memory, SHOW_BOOL},
#endif
@@ -2457,12 +2458,15 @@ struct show_var_st init_vars[]= {
{"myisam_recover_options", (char*) &myisam_recover_options_str, SHOW_CHAR_PTR},
{"myisam_sort_buffer_size", (char*) &myisam_sort_buffer_size, SHOW_LONG},
{"net_buffer_length", (char*) &net_buffer_length, SHOW_LONG},
+ {"net_read_timeout", (char*) &net_read_timeout, SHOW_LONG},
{"net_retry_count", (char*) &mysqld_net_retry_count, SHOW_LONG},
+ {"net_write_timeout", (char*) &net_write_timeout, SHOW_LONG},
{"pid_file", (char*) pidfile_name, SHOW_CHAR},
{"port", (char*) &mysql_port, SHOW_INT},
{"protocol_version", (char*) &protocol_version, SHOW_INT},
{"record_buffer", (char*) &my_default_record_cache_size,SHOW_LONG},
- {"server_id", (char*) &server_id, SHOW_LONG},
+ {"query_buffer_size", (char*) &query_buff_size, SHOW_LONG},
+ {"server_id", (char*) &server_id, SHOW_LONG},
{"skip_locking", (char*) &my_disable_locking, SHOW_MY_BOOL},
{"skip_networking", (char*) &opt_disable_networking, SHOW_BOOL},
{"skip_show_database", (char*) &opt_skip_show_db, SHOW_BOOL},
@@ -2471,11 +2475,11 @@ struct show_var_st init_vars[]= {
{"sort_buffer", (char*) &sortbuff_size, SHOW_LONG},
{"table_cache", (char*) &table_cache_size, SHOW_LONG},
{"table_type", (char*) &default_table_type_name, SHOW_CHAR_PTR},
+ {"thread_cache_size", (char*) &thread_cache_size, SHOW_LONG},
#ifdef HAVE_THR_SETCONCURRENCY
{"thread_concurrency", (char*) &concurrency, SHOW_LONG},
#endif
{"thread_stack", (char*) &thread_stack, SHOW_LONG},
- {"thread_cache_size", (char*) &thread_cache_size, SHOW_LONG},
#ifdef HAVE_TZNAME
{"timezone", time_zone, SHOW_CHAR},
#endif
@@ -3394,7 +3398,7 @@ static int get_service_parameters()
else if ( lstrcmp(szKeyValueName, TEXT("ShowDatabase")) == 0 )
{
CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
- opt_disable_networking = !(*lpdwValue);
+ opt_skip_show_db = !(*lpdwValue);
}
else if ( lstrcmp(szKeyValueName, TEXT("HostnameCaching")) == 0 )
{
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 095dad09486..23e518ab790 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -85,7 +85,7 @@ class MYSQL_LOG {
public:
private:
pthread_mutex_t LOCK_log, LOCK_index;
- FILE *file, *index_file;
+ File file, index_file;
time_t last_time,query_start;
char *name;
enum_log_type log_type;
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 9fc47cd4dfc..ab580e7f2b2 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -571,7 +571,7 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list)
thread_count++;
pthread_mutex_unlock(&LOCK_thread_count);
if (!(tmp->thd.db=my_strdup(table_list->db,MYF(MY_WME))) ||
- !(tmp->thd.query=my_strdup(table_list->real_name,MYF(MY_FAE))))
+ !(tmp->thd.query=my_strdup(table_list->real_name,MYF(MY_WME))))
{
delete tmp;
thd->fatal_error=1;
@@ -1323,7 +1323,8 @@ bool select_create::send_eof()
{
VOID(pthread_mutex_lock(&LOCK_open));
mysql_unlock_tables(thd, lock);
- hash_delete(&open_cache,(byte*) table);
+ if (!table->tmp_table)
+ hash_delete(&open_cache,(byte*) table);
lock=0; table=0;
VOID(pthread_mutex_unlock(&LOCK_open));
}
@@ -1341,7 +1342,8 @@ void select_create::abort()
if (table)
{
enum db_type table_type=table->db_type;
- hash_delete(&open_cache,(byte*) table);
+ if (!table->tmp_table)
+ hash_delete(&open_cache,(byte*) table);
quick_rm_table(table_type,db,name);
table=0;
}
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index aa1a326cad7..33dc8853c13 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -34,19 +34,23 @@ class LEX_COLUMN;
#endif
enum enum_sql_command {
- SQLCOM_SELECT,SQLCOM_CREATE_TABLE,SQLCOM_CREATE_INDEX,SQLCOM_ALTER_TABLE,
- SQLCOM_UPDATE,SQLCOM_INSERT,SQLCOM_INSERT_SELECT,SQLCOM_DELETE,
- SQLCOM_DROP_TABLE,SQLCOM_DROP_INDEX,SQLCOM_SHOW_DATABASES,
- SQLCOM_SHOW_TABLES,SQLCOM_SHOW_FIELDS,SQLCOM_SHOW_KEYS,
+ SQLCOM_SELECT, SQLCOM_CREATE_TABLE, SQLCOM_CREATE_INDEX, SQLCOM_ALTER_TABLE,
+ SQLCOM_UPDATE, SQLCOM_INSERT, SQLCOM_INSERT_SELECT,
+ SQLCOM_DELETE, SQLCOM_TRUNCATE, SQLCOM_DROP_TABLE, SQLCOM_DROP_INDEX,
+
+ SQLCOM_SHOW_DATABASES, SQLCOM_SHOW_TABLES, SQLCOM_SHOW_FIELDS,
+ SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_STATUS,
+ SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT,
+ SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE,
+
SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES,
SQLCOM_GRANT, SQLCOM_CHANGE_DB, SQLCOM_CREATE_DB, SQLCOM_DROP_DB,
- SQLCOM_REPAIR, SQLCOM_REPLACE, SQLCOM_REPLACE_SELECT, SQLCOM_SHOW_VARIABLES,
- SQLCOM_SHOW_STATUS, SQLCOM_CREATE_FUNCTION, SQLCOM_DROP_FUNCTION,
- SQLCOM_SHOW_PROCESSLIST,SQLCOM_REVOKE,SQLCOM_OPTIMIZE, SQLCOM_CHECK,
- SQLCOM_FLUSH, SQLCOM_KILL, SQLCOM_SHOW_GRANTS, SQLCOM_ANALYZE,
+ SQLCOM_REPAIR, SQLCOM_REPLACE, SQLCOM_REPLACE_SELECT,
+ SQLCOM_CREATE_FUNCTION, SQLCOM_DROP_FUNCTION,
+ SQLCOM_REVOKE,SQLCOM_OPTIMIZE, SQLCOM_CHECK,
+ SQLCOM_FLUSH, SQLCOM_KILL, SQLCOM_ANALYZE,
SQLCOM_ROLLBACK, SQLCOM_COMMIT, SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,
- SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_SHOW_CREATE,
- SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT, SQLCOM_CHANGE_MASTER,
+ SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_CHANGE_MASTER,
SQLCOM_RENAME_TABLE, SQLCOM_BACKUP_TABLE, SQLCOM_RESTORE_TABLE,
SQLCOM_RESET
};
diff --git a/sql/sql_load.cc b/sql/sql_load.cc
index 633855a18fa..9bf3346e61d 100644
--- a/sql/sql_load.cc
+++ b/sql/sql_load.cc
@@ -158,7 +158,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
unpack_filename(name,ex->file_name);
#ifndef __WIN__
MY_STAT stat_info;
- if (!my_stat(name,&stat_info,MYF(MY_FAE)))
+ if (!my_stat(name,&stat_info,MYF(MY_WME)))
DBUG_RETURN(-1);
// the file must be:
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 359ed495a83..c76a6be2d26 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -71,6 +71,20 @@ static void init_signals(void)
}
#endif
+static inline bool end_active_trans(THD *thd)
+{
+ if (!(thd->options & OPTION_AUTO_COMMIT) ||
+ (thd->options & OPTION_BEGIN))
+ {
+ if (ha_commit(thd))
+ return 1;
+ thd->options&= ~OPTION_BEGIN;
+ thd->server_status&= ~SERVER_STATUS_IN_TRANS;
+ }
+ return 0;
+}
+
+
/*
** Check if user is ok
** Updates:
@@ -1143,7 +1157,7 @@ mysql_execute_command(void)
}
}
/* ALTER TABLE ends previous transaction */
- if (!(thd->options & OPTION_AUTO_COMMIT) && ha_commit(thd))
+ if (end_active_trans(thd))
res= -1;
else
res= mysql_alter_table(thd, lex->db, lex->name,
@@ -1347,6 +1361,7 @@ mysql_execute_command(void)
break;
}
case SQLCOM_DELETE:
+ case SQLCOM_TRUNCATE:
{
if (check_access(thd,DELETE_ACL,tables->db,&tables->grant.privilege))
goto error; /* purecov: inspected */
@@ -1354,11 +1369,12 @@ mysql_execute_command(void)
goto error;
// Set privilege for the WHERE clause
tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege);
- res = mysql_delete(thd,tables,lex->where,lex->select_limit,
- lex->lock_option, lex->options);
-#ifdef DELETE_ITEMS
- delete lex->where;
-#endif
+ /* TRUNCATE ends previous transaction */
+ if (lex->sql_command == SQLCOM_TRUNCATE && end_active_trans(thd))
+ res= -1;
+ else
+ res = mysql_delete(thd,tables,lex->where,lex->select_limit,
+ lex->lock_option, lex->options);
break;
}
case SQLCOM_DROP_TABLE:
@@ -1699,6 +1715,11 @@ mysql_execute_command(void)
thd->server_status|= SERVER_STATUS_IN_TRANS;
break;
case SQLCOM_COMMIT:
+ /*
+ We don't use end_active_trans() here to ensure that this works
+ even if there is a problem with the OPTION_AUTO_COMMIT flag
+ (Which of course should never happen...)
+ */
thd->options&= ~OPTION_BEGIN;
thd->server_status&= ~SERVER_STATUS_IN_TRANS;
if (!ha_commit(thd))
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index d97a59cb898..7d7eab78d3b 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -2725,7 +2725,7 @@ return_zero_rows(select_result *result,TABLE_LIST *tables,List<Item> &fields,
{
for (TABLE_LIST *table=tables; table ; table=table->next)
mark_as_null_row(table->table); // All fields are NULL
- if (having && having->val_int() == 0.0)
+ if (having && having->val_int() == 0)
send_row=0;
}
if (!tables || !(result->send_fields(fields,1)))
@@ -3204,6 +3204,7 @@ Field *create_tmp_field(TABLE *table,Item *item, Item::Type type,
case Item::REAL_ITEM:
case Item::STRING_ITEM:
case Item::REF_ITEM:
+ case Item::NULL_ITEM:
{
bool maybe_null=item->maybe_null;
Field *new_field;
@@ -4501,7 +4502,7 @@ end_send(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
if (!end_of_records)
{
int error;
- if (join->having && join->having->val_int() == 0.0)
+ if (join->having && join->having->val_int() == 0)
DBUG_RETURN(0); // Didn't match having
if (join->procedure)
error=join->procedure->send_row(*join->fields);
@@ -4541,7 +4542,7 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
int error;
if (join->procedure)
{
- if (join->having && join->having->val_int() == 0.0)
+ if (join->having && join->having->val_int() == 0)
error= -1; // Didn't satisfy having
else
error=join->procedure->send_row(*join->fields) ? 1 : 0;
@@ -4552,7 +4553,7 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
{
if (!join->first_record)
clear_tables(join);
- if (join->having && join->having->val_int() == 0.0)
+ if (join->having && join->having->val_int() == 0)
error= -1; // Didn't satisfy having
else
error=join->result->send_data(*join->fields) ? 1 : 0;
@@ -5111,7 +5112,7 @@ create_sort_index(JOIN_TAB *tab,ORDER *order,ha_rows select_limit)
goto err; /* purecov: inspected */
/* It's not fatal if the following alloc fails */
table->io_cache=(IO_CACHE*) my_malloc(sizeof(IO_CACHE),
- MYF(MY_FAE | MY_ZEROFILL));
+ MYF(MY_WME | MY_ZEROFILL));
table->status=0; // May be wrong if quick_select
// If table has a range, move it to select
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 4b404081676..42ac943e369 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -110,6 +110,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token SLAVE
%token START_SYM
%token STOP_SYM
+%token TRUNCATE_SYM
%token ROLLBACK_SYM
%token OPTIMIZE
%token SHOW
@@ -492,9 +493,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%type <NONE>
query verb_clause create change select drop insert replace insert2
- insert_values update delete show describe load alter optimize flush
+ insert_values update delete truncate rename
+ show describe load alter optimize flush
reset begin commit rollback slave master_def master_defs
- repair restore backup analyze check rename
+ repair restore backup analyze check
field_list field_list_item field_spec kill
select_item_list select_item values_list no_braces
limit_clause delete_limit_clause fields opt_values values
@@ -560,6 +562,7 @@ verb_clause:
| set
| slave
| show
+ | truncate
| unlock
| update
| use
@@ -787,7 +790,7 @@ field_list_item:
Lex->key_list.push_back(new Key($1,$2,Lex->col_list));
Lex->col_list.empty(); /* Alloced by sql_alloc */
}
- | opt_constraint FOREIGN KEY_SYM '(' key_list ')' references
+ | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references
{
Lex->col_list.empty(); /* Alloced by sql_alloc */
}
@@ -1553,7 +1556,8 @@ simple_expr:
{ $$= new Item_func_trim($6,$4); }
| TRIM '(' expr FROM expr ')'
{ $$= new Item_func_trim($5,$3); }
-
+ | TRUNCATE_SYM '(' expr ',' expr ')'
+ { $$= new Item_func_round($3,$5,1); }
| UDA_CHAR_SUM '(' udf_expr_list ')'
{
if ($3 != NULL)
@@ -2125,6 +2129,11 @@ opt_delete_option:
QUICK { Lex->options|= OPTION_QUICK; }
| LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; }
+truncate:
+ TRUNCATE_SYM TABLE_SYM table
+ { Lex->sql_command= SQLCOM_TRUNCATE; Lex->options=0;
+ Lex->lock_option= current_thd->update_lock_default; }
+
/* Show things */
show: SHOW { Lex->wild=0;} show_param
@@ -2513,6 +2522,7 @@ keyword:
| STRING_SYM {}
| TEMPORARY {}
| TEXT_SYM {}
+ | TRUNCATE_SYM {}
| TIMESTAMP {}
| TIME_SYM {}
| TYPE_SYM {}
diff --git a/sql/violite.c b/sql/violite.c
index b18de053b5a..4efda9f3b90 100644
--- a/sql/violite.c
+++ b/sql/violite.c
@@ -1,18 +1,19 @@
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
+ This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA */
/*
Note that we can't have assertion on file descriptors; The reason for
@@ -31,6 +32,9 @@
#include <my_sys.h>
#include <my_net.h>
#include <m_string.h>
+#ifdef HAVE_POLL
+#include <sys/poll.h>
+#endif
#if defined(__EMX__)
#include <sys/ioctl.h>
@@ -398,4 +402,26 @@ void vio_in_addr(Vio *vio, struct in_addr *in)
DBUG_VOID_RETURN;
}
+
+/* Return 0 if there is data to be read */
+
+my_bool vio_poll_read(Vio *vio,uint timeout)
+{
+#ifndef HAVE_POLL
+ return 0;
+#else
+ struct pollfd fds;
+ int res;
+ DBUG_ENTER("vio_poll");
+ fds.fd=vio->sd;
+ fds.events=POLLIN;
+ fds.revents=0;
+ if ((res=poll(&fds,1,(int) timeout*1000)) <= 0)
+ {
+ DBUG_RETURN(res < 0 ? 0 : 1); /* Don't return 1 on errors */
+ }
+ DBUG_RETURN(fds.revents & POLLIN ? 0 : 1);
+#endif
+}
+
#endif /* HAVE_VIO */