diff options
author | monty@tik.mysql.com <> | 2000-11-13 23:55:10 +0200 |
---|---|---|
committer | monty@tik.mysql.com <> | 2000-11-13 23:55:10 +0200 |
commit | 7a013339f84c48ea6194a35d9c00d0d549466b1d (patch) | |
tree | 6689cb755cdb6ba0fb4cc6fbb215d75b175228d2 /sql | |
parent | cb1d81f650df9fc3ec5965cf2dfbcb1fd8559d31 (diff) | |
download | mariadb-git-7a013339f84c48ea6194a35d9c00d0d549466b1d.tar.gz |
Bug fixes, TRUNCATE, safer passwords on command line and connect timeout
Diffstat (limited to 'sql')
-rw-r--r-- | sql/filesort.cc | 15 | ||||
-rw-r--r-- | sql/ha_berkeley.cc | 6 | ||||
-rw-r--r-- | sql/item_create.cc | 5 | ||||
-rw-r--r-- | sql/item_create.h | 1 | ||||
-rw-r--r-- | sql/item_strfunc.cc | 2 | ||||
-rw-r--r-- | sql/lex.h | 2 | ||||
-rw-r--r-- | sql/lock.cc | 4 | ||||
-rw-r--r-- | sql/log.cc | 127 | ||||
-rw-r--r-- | sql/mysqld.cc | 20 | ||||
-rw-r--r-- | sql/sql_class.h | 2 | ||||
-rw-r--r-- | sql/sql_insert.cc | 8 | ||||
-rw-r--r-- | sql/sql_lex.h | 24 | ||||
-rw-r--r-- | sql/sql_load.cc | 2 | ||||
-rw-r--r-- | sql/sql_parse.cc | 33 | ||||
-rw-r--r-- | sql/sql_select.cc | 11 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 18 | ||||
-rw-r--r-- | sql/violite.c | 46 |
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(¶m,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 */ |