diff options
-rw-r--r-- | Docs/manual.texi | 45 | ||||
-rw-r--r-- | client/mysql.cc | 27 | ||||
-rw-r--r-- | isam/_dynrec.c | 10 | ||||
-rw-r--r-- | scripts/mysqlhotcopy.sh | 142 | ||||
-rwxr-xr-x | sql-bench/test-insert.sh | 19 | ||||
-rw-r--r-- | sql/log.cc | 33 | ||||
-rw-r--r-- | sql/log_event.h | 2 | ||||
-rw-r--r-- | sql/mf_iocache.cc | 21 | ||||
-rw-r--r-- | sql/mysqlbinlog.cc | 4 | ||||
-rw-r--r-- | sql/mysqld.cc | 5 | ||||
-rw-r--r-- | sql/slave.cc | 6 | ||||
-rw-r--r-- | sql/sql_parse.cc | 2 | ||||
-rw-r--r-- | sql/sql_table.cc | 27 |
13 files changed, 244 insertions, 99 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi index 9e82897b105..488d80e5822 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -500,6 +500,7 @@ Examples of common queries * example-Maximum-row:: The row holding the maximum of a certain column * example-Maximum-column-group:: Maximum of column per group * example-Maximum-column-group-row:: The rows holding the group-wise maximum of a certain field +* example-user-variables:: * example-Foreign keys:: Using foreign keys Creating and using a database @@ -948,7 +949,7 @@ Changes in release 3.19.x MySQL and the future (The TODO) -* TODO MySQL 4.0:: +* TODO MySQL 4.0:: Things that should be in 4.0 * TODO future:: Things that must done in the very near future * TODO sometime:: Things that have to be done sometime * TODO unplanned:: Some things we don't have any plans to do @@ -22657,6 +22658,7 @@ SELECT * FROM shop * example-Maximum-row:: The row holding the maximum of a certain column * example-Maximum-column-group:: Maximum of column per group * example-Maximum-column-group-row:: The rows holding the group-wise maximum of a certain field +* example-user-variables:: * example-Foreign keys:: Using foreign keys @end menu @@ -22736,7 +22738,7 @@ GROUP BY article +---------+-------+ @end example -@node example-Maximum-column-group-row, example-Foreign keys, example-Maximum-column-group, Examples +@node example-Maximum-column-group-row, example-user-variables, example-Maximum-column-group, Examples @subsection The rows holding the group-wise maximum of a certain field ``For each article, find the dealer(s) with the most expensive price.'' @@ -22807,9 +22809,31 @@ GROUP BY article; The last example can of course be made a bit more efficient by doing the splitting of the concatenated column in the client. +@node example-user-variables, example-Foreign keys, example-Maximum-column-group-row, Examples +@subsection Using user variables + +You can use @strong{MySQL} user variables to remember results without +having to store them in a temporary variables in the client. +@xref{Variables}. + +For example to find the articles with the highest and lowest price you +can do: + +@example +select @@min_price:=min(price),@@max_price:=max(price) from shop; +select * from shop where price=@@min_price or price=@@max_price; + ++---------+--------+-------+ +| article | dealer | price | ++---------+--------+-------+ +| 0003 | D | 1.25 | +| 0004 | D | 19.95 | ++---------+--------+-------+ +@end example + @cindex foreign keys @cindex keys, foreign -@node example-Foreign keys, , example-Maximum-column-group-row, Examples +@node example-Foreign keys, , example-user-variables, Examples @subsection Using foreign keys You don't need foreign keys to join 2 tables. @@ -37609,6 +37633,8 @@ With source code. By Matthias Fichtner. A library to use @strong{MySQL} with Delphi} @item @uref{http://www.geocities.com/CapeCanaveral/2064/mysql.html, Delphi TDataset-component} +@item +@item @uref{http://www.mysql.com/Downloads/Contrib/Win32/SBMySQL50Share.exe, Delphi 5 Shareware MySQL Dataset Components} @end itemize @item @uref{http://www.mysql.com/Downloads/Contrib/mysql-ruby-2.2.0.tar.gz, mysql-ruby-2.2.0.tar.gz} @@ -37752,9 +37778,13 @@ An open source client for exploring databases and executing SQL. Supports A query tool for @strong{MySQL} and PostgreSQL. @item @uref{http://dbman.linux.cz/,dbMan} A query tool written in Perl. Uses DBI and Tk. -@item @uref{http://www.mysql.com/Downloads/Contrib/mascon1.exe, mascon1.exe} -You can get the newest one from -@uref{http://www.scibit.com/Products/Software/Utils/Mascon.asp,Mascon.asp}. +@item @uref{http://www.mysql.com/Downloads/Win32/Msc18.exe, Mascon 2000.1.8} +@item @uref{http://www.mysql.com/Downloads/Win32/FrMsc18.exe, Free Mascon 2000.1.8} +Mascon is a powerful Win32 GUI for the administering MySQL server +databases. Mascon's features include visual table design, connections to +multiple servers, data and blob editing of tables, security setting, SQL +colour coding, dump functionality and much more. +@uref{http://www.scibit.com/Products/Software/Utils/Mascon.asp,Mascon home page}. @item @uref{http://www.virtualbeer.net/dbui/,DBUI} DBUI is a Gtk graphical database editor. @end itemize @@ -38503,6 +38533,9 @@ though, so Version 3.23 is not released as a stable version yet. @item Fixed the @code{--skip-networking} works properly on NT. @item +Fixed long outstanding bug in the @code{ISAM} tables when a row with a length +of more than 65K was shortened by a single byte. +@item Fixed bug in @code{MyISAM} when running multiple updating processes on the same table. @item diff --git a/client/mysql.cc b/client/mysql.cc index fbae6c6d341..cca7b8c6ce5 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -115,9 +115,8 @@ static bool info_flag=0,ignore_errors=0,wait_flag=0,quick=0, no_rehash=0,skip_updates=0,safe_updates=0,one_database=0, opt_compress=0, vertical=0,skip_line_numbers=0,skip_column_names=0,opt_html=0, - opt_nopager=1, opt_outfile=0, - no_named_cmds=1; -static uint verbose=0,opt_silent=0,opt_mysql_port=0; + opt_nopager=1, opt_outfile=0, no_named_cmds=1; +static uint verbose=0,opt_silent=0,opt_mysql_port=0,opt_connect_timeout=0; static my_string opt_mysql_unix_port=0; static int connect_flag=CLIENT_INTERACTIVE; static char *current_host,*current_db,*current_user=0,*opt_password=0, @@ -363,8 +362,8 @@ sig_handler mysql_end(int sig) exit(status.exit_status); } -enum options {OPT_CHARSETS_DIR=256, OPT_DEFAULT_CHARSET, OPT_PAGER, - OPT_NOPAGER, OPT_TEE, OPT_NOTEE} ; +enum options {OPT_CHARSETS_DIR=256, OPT_DEFAULT_CHARSET, OPT_TIMEOUT, + OPT_PAGER, OPT_NOPAGER, OPT_TEE, OPT_NOTEE} ; static struct option long_options[] = @@ -378,7 +377,7 @@ static struct option long_options[] = #endif {"database", required_argument, 0, 'D'}, {"debug-info", no_argument, 0, 'T'}, - {"default-character-set", required_argument, 0, OPT_DEFAULT_CHARSET}, + {"default-character-set", required_argument,0, OPT_DEFAULT_CHARSET}, {"enable-named-commands", no_argument, 0, 'G'}, {"execute", required_argument, 0, 'e'}, {"force", no_argument, 0, 'f'}, @@ -412,6 +411,7 @@ static struct option long_options[] = {"socket", required_argument, 0, 'S'}, #include "sslopt-longopts.h" {"table", no_argument, 0, 't'}, + {"timeout", required_argument, 0, OPT_TIMEOUT}, #ifndef DONT_ALLOW_USER_CHANGE {"user", required_argument, 0, 'u'}, #endif @@ -425,7 +425,7 @@ static struct option long_options[] = CHANGEABLE_VAR changeable_vars[] = { - { "max_allowed_packet", (long*) &max_allowed_packet,24*1024L*1024L,4096, + { "max_allowed_packet", (long*) &max_allowed_packet,16*1024L*1024L,4096, 24*1024L*1024L, MALLOC_OVERHEAD,1024}, { "net_buffer_length",(long*) &net_buffer_length,16384,1024,24*1024*1024L, MALLOC_OVERHEAD,1024}, @@ -627,9 +627,12 @@ static int get_options(int argc, char **argv) case 'p': if (optarg) { + char *start=optarg; my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR)); opt_password=my_strdup(optarg,MYF(MY_FAE)); while (*optarg) *optarg++= 'x'; // Destroy argument + if (*start) + start[1]=0; } else tty_password=1; @@ -685,6 +688,9 @@ static int get_options(int argc, char **argv) opt_mysql_unix_port=my_strdup(MYSQL_NAMEDPIPE,MYF(0)); #endif break; + case OPT_TIMEOUT: + opt_connect_timeout=atoi(optarg); + break; case 'V': usage(1); exit(0); case 'I': case '?': @@ -2026,6 +2032,9 @@ sql_real_connect(char *host,char *database,char *user,char *password, connected= 0; } mysql_init(&mysql); + if (opt_connect_timeout) + mysql_options(&mysql,MYSQL_OPT_CONNECT_TIMEOUT, + (char*) &opt_connect_timeout); if (opt_compress) mysql_options(&mysql,MYSQL_OPT_COMPRESS,NullS); #ifdef HAVE_OPENSSL @@ -2258,9 +2267,9 @@ void tee_fprintf(FILE *file, const char *fmt, ...) va_list args; va_start(args, fmt); - VOID(vfprintf(file, fmt, args)); + (void) vfprintf(file, fmt, args); if (opt_outfile) - VOID(vfprintf(OUTFILE, fmt, args)); + (void) vfprintf(OUTFILE, fmt, args); va_end(args); } diff --git a/isam/_dynrec.c b/isam/_dynrec.c index f26e491a58c..42a596fa623 100644 --- a/isam/_dynrec.c +++ b/isam/_dynrec.c @@ -104,7 +104,8 @@ int _nisam_delete_dynamic_record(N_INFO *info) /* Write record to data-file */ -static int write_dynamic_record(N_INFO *info, const byte *record, uint reclength) +static int write_dynamic_record(N_INFO *info, const byte *record, + uint reclength) { int flag; uint length; @@ -142,8 +143,9 @@ static int _nisam_find_writepos(N_INFO *info, *filepos=info->s->state.dellink; block_info.second_read=0; info->rec_cache.seek_not_done=1; - if (!(_nisam_get_block_info(&block_info,info->dfile,info->s->state.dellink) & - BLOCK_DELETED)) + + if (!(_nisam_get_block_info(&block_info,info->dfile, + info->s->state.dellink) & BLOCK_DELETED)) { my_errno=HA_ERR_WRONG_IN_RECORD; DBUG_RETURN(-1); @@ -213,7 +215,7 @@ int _nisam_write_part_record(N_INFO *info, extra_length++; /* One empty */ } } - else if (length-long_block < *reclength+5) + else if (length-long_block*2 < *reclength+5) { /* To short block */ if (next_filepos == NI_POS_ERROR) next_filepos=info->s->state.dellink != NI_POS_ERROR ? diff --git a/scripts/mysqlhotcopy.sh b/scripts/mysqlhotcopy.sh index bb1f00671d6..fc69ab01b9f 100644 --- a/scripts/mysqlhotcopy.sh +++ b/scripts/mysqlhotcopy.sh @@ -19,13 +19,24 @@ mysqlhotcopy - fast on-line hot-backup utility for local MySQL databases mysqlhotcopy db_name_1 ... db_name_n /path/to/new_directory + mysqlhotcopy db_name./regex/ + + mysqlhotcopy db_name./^\(foo\|bar\)/ + + mysqlhotcopy db_name./~regex/ + + mysqlhotcopy db_name_1./regex_1/ db_name_1./regex_2/ ... db_name_n./regex_n/ /path/to/new_directory + + mysqlhotcopy --method='scp -Bq -i /usr/home/foo/.ssh/identity' --user=root --password=secretpassword \ + db_1./^nice_table/ user@some.system.dom:~/path/to/new_directory + WARNING: THIS IS VERY MUCH A FIRST-CUT ALPHA. Comments/patches welcome. =cut # Documentation continued at end of file -my $VERSION = "1.7"; +my $VERSION = "1.8"; my $OPTIONS = <<"_OPTIONS"; @@ -39,7 +50,7 @@ Usage: $0 db_name [new_db_name | directory] --allowold don't abort if target already exists (rename it _old) --keepold don't delete previous (now renamed) target when done - --noindices don't copy index files + --indices include index files in copy --method=# method for copy (only "cp" currently supported) -q, --quiet be silent except for errors @@ -50,6 +61,8 @@ Usage: $0 db_name [new_db_name | directory] --suffix=# suffix for names of copied databases --checkpoint=# insert checkpoint entry into specified db.table --flushlog flush logs once all tables are locked + + Try 'perldoc $0 for more complete documentation' _OPTIONS sub usage { @@ -89,23 +102,26 @@ GetOptions( \%opt, # ========== # a list of hash-refs containing: # -# 'src' - name of the db to copy -# 'target' - destination directory of the copy -# 'tables' - array-ref to list of tables in the db -# 'files' - array-ref to list of files to be copied +# 'src' - name of the db to copy +# 't_regex' - regex describing tables in src +# 'target' - destination directory of the copy +# 'tables' - array-ref to list of tables in the db +# 'files' - array-ref to list of files to be copied # my @db_desc = (); my $tgt_name = undef; - + if ( $opt{regexp} || $opt{suffix} || @ARGV > 2 ) { $tgt_name = pop @ARGV unless ( exists $opt{suffix} ); - @db_desc = map { { 'src' => $_ } } @ARGV; + @db_desc = map { s{^([^\.]+)\./(.+)/$}{$1}; { 'src' => $_, 't_regex' => ( $2 ? $2 : '.*' ) } } @ARGV; } else { usage("Database name to hotcopy not specified") unless ( @ARGV ); - @db_desc = ( { 'src' => $ARGV[0] } ); + $ARGV[0] =~ s{^([^\.]+)\./(.+)/$}{$1}; + @db_desc = ( { 'src' => $ARGV[0], 't_regex' => ( $2 ? $2 : '.*' ) } ); + if ( @ARGV == 2 ) { $tgt_name = $ARGV[1]; } @@ -195,15 +211,35 @@ foreach my $rdb ( @db_desc ) { die "Database '$db' not accessible: $@" if ( $@ ); my @dbh_tables = $dbh->func( '_ListTables' ); + ## generate regex for tables/files + my $t_regex = $rdb->{t_regex}; ## assign temporary regex + my $negated = $t_regex =~ tr/~//d; ## remove and count negation operator: we don't allow ~ in table names + $t_regex = qr/$t_regex/; ## make regex string from user regex + + ## filter (out) tables specified in t_regex + print "Filtering tables with '$t_regex'\n" if $opt{debug}; + @dbh_tables = ( $negated + ? grep { $_ !~ $t_regex } @dbh_tables + : grep { $_ =~ $t_regex } @dbh_tables ); + + ## get list of files to copy my $db_dir = "$datadir/$db"; opendir(DBDIR, $db_dir ) or die "Cannot open dir '$db_dir': $!"; - - my @db_files = grep { /.+\.\w+$/ } readdir(DBDIR) - or warn "'$db' is an empty database\n"; + my %db_files; + map { ( /(.+)\.\w+$/ ? { $db_files{$_} = $1 } : () ) } readdir(DBDIR); + unless( keys %db_files ) { + warn "'$db' is an empty database\n"; + } closedir( DBDIR ); + ## filter (out) files specified in t_regex + my @db_files = sort ( $negated + ? grep { $db_files{$_} !~ $t_regex } keys %db_files + : grep { $db_files{$_} =~ $t_regex } keys %db_files ); + + ## remove indices unless we're told to keep them unless ($opt{indices}) { @db_files = grep { not /\.(ISM|MYI)$/ } @db_files; } @@ -238,6 +274,12 @@ if (length $tgt_name ) { $rdb->{target} = "$tgt_dirname"; } } + elsif ($opt{method} =~ /^scp\b/) + { # we have to trust scp to hit the target + foreach my $rdb ( @db_desc ) { + $rdb->{target} = "$tgt_dirname/$rdb->{src}"; + } + } else { die "Last argument ($tgt_dirname) is not a directory\n" @@ -249,7 +291,7 @@ if (length $tgt_name ) { } else { die "Error: expected \$opt{suffix} to exist" unless ( exists $opt{suffix} ); - + foreach my $rdb ( @db_desc ) { $rdb->{target} = "$datadir/$rdb->{src}$opt{suffix}"; } @@ -278,6 +320,10 @@ foreach my $rdb ( @db_desc ) { if ( $opt{dryrun} ) { print "mkdir $tgt_dirpath, 0750\n"; } + elsif ($opt{method} =~ /^scp\b/) { + ## assume it's there? + ## ... + } else { mkdir($tgt_dirpath, 0750) or die "Can't create '$tgt_dirpath': $!\n"; @@ -320,26 +366,26 @@ else { printf "Flushed tables ($hc_tables) in %d seconds.\n", time-$start unless $opt{quiet}; $dbh->do( "FLUSH LOGS" ) if ( $opt{flushlog} ); } - + my @failed = (); foreach my $rdb ( @db_desc ) { my @files = map { "$datadir/$rdb->{src}/$_" } @{$rdb->{files}}; next unless @files; eval { copy_files($opt{method}, \@files, $rdb->{target} ); }; - + push @failed, "$rdb->{src} -> $rdb->{target} failed: $@" if ( $@ ); - + if ( $opt{checkpoint} ) { my $msg = ( $@ ) ? "Failed: $@" : "Succeeded"; - + eval { $dbh->do( qq{ insert into $opt{checkpoint} (src, dest, msg) VALUES ( '$rdb->{src}', '$rdb->{target}', '$msg' ) } ); }; - + if ( $@ ) { warn "Failed to update checkpoint table: $@\n"; } @@ -410,11 +456,16 @@ sub copy_files { my ($method, $files, $target) = @_; my @cmd; print "Copying ".@$files." files...\n" unless $opt{quiet}; + if ($method =~ /^s?cp\b/) { # cp or scp with optional flags @cmd = ($method); # add option to preserve mod time etc of copied files # not critical, but nice to have - push @cmd, "-p" if $^O =~ m/^(solaris|linux)$/; + push @cmd, "-p" if $^O =~ m/^(solaris|linux|freebsd)$/; + + # add recursive option for scp + push @cmd, "-r" if $^O =~ /m^(solaris|linux|freebsd)$/ && $method =~ /^scp\b/; + # add files to copy and the destination directory push @cmd, @$files, $target; } @@ -427,10 +478,13 @@ sub copy_files { next; } + ## for some reason system fails but backticks works ok for scp... print "Executing '@cmd'\n" if $opt{debug}; my $cp_status = system @cmd; if ($cp_status != 0) { - die "Error: @cmd failed ($cp_status) while copying files.\n"; + warn "Burp ('scuse me). Trying backtick execution...\n" if $opt{debug}; #' + ## try something else + `@cmd` && die "Error: @cmd failed ($cp_status) while copying files.\n"; } } @@ -520,7 +574,22 @@ locked, and before they are copied. =item --regexp pattern -Copy all databases with names matching the pattern. +Copy all databases with names matching the pattern + +=item db_name./pattern/ + +Copy only tables matching pattern. Shell metacharacters ( (, ), |, !, +etc.) have to be escaped (e.g. \). For example, to select all tables +in database db1 whose names begin with 'foo' or 'bar': + + mysqlhotcopy --indices --method=cp db1./^\(foo\|bar\)/ + +=item db_name./~pattern/ + +Copy only tables not matching pattern. For example, to copy tables +that do not begin with foo nor bar: + + mysqlhotcopy --indices --method=cp db1./~^\(foo\|bar\)/ =item -?, --help @@ -542,13 +611,25 @@ port to use when connecting to local server UNIX domain socket to use when connecting to local server -=item --noindices +=item --indices -don't copy index files +include index files in copy =item --method=# -method for copy (only "cp" currently supported) +method for copy (only "cp" currently supported). Alpha support for +"scp" was added in November 2000. Your experience with the scp method +will vary with your ability to understand how scp works. 'man scp' +and 'man ssh' are your friends. + +The destination directory _must exist_ on the target machine using +the scp method. Liberal use of the --debug option will help you figure +out what's really going on when you do an scp. + +Note that using scp will lock your tables for a _long_ time unless +your network connection is _fast_. If this is unacceptable to you, +use the 'cp' method to copy the tables to some temporary area and then +scp or rsync the files at your leisure. =item -q, --quiet @@ -575,12 +656,8 @@ Patches adding bug fixes, documentation and new features are welcome. =head1 TO DO -Allow a list of tables (or regex) to be given on the command line to -enable a logically-related subset of the tables to be hot-copied -rather than force the whole db to be copied in one go. - -Extend the above to allow multiple subsets of tables to be specified -on the command line: +Extend the individual table copy to allow multiple subsets of tables +to be specified on the command line: mysqlhotcopy db newdb t1 t2 /^foo_/ : t3 /^bar_/ : + @@ -609,5 +686,6 @@ Tim Bunce Martin Waite - added checkpoint, flushlog, regexp and dryrun options -Ralph Corderoy - Added synonyms for commands -=cut +Ralph Corderoy - added synonyms for commands + +Scott Wiersdorf - added table regex and scp support diff --git a/sql-bench/test-insert.sh b/sql-bench/test-insert.sh index 8545f449fa6..a9a95cf6710 100755 --- a/sql-bench/test-insert.sh +++ b/sql-bench/test-insert.sh @@ -371,6 +371,25 @@ for ($i=1 ; $i <= $range_loop_count ; $i++) { $start=$opt_loop_count/$range_loop_count*$i; $end=$start+$i; + $rows+=fetch_all_rows($dbh,"select dummy1 from bench1 where id>=$start and id <= $end order by id3",1); + $end_time=new Benchmark; + last if ($estimated=predict_query_time($loop_time,$end_time,\$i,$i, + $range_loop_count)); +} +if ($estimated) +{ print "Estimated time"; } +else +{ print "Time"; } +print " for order_by_range ($range_loop_count:$rows): " . + timestr(timediff($end_time, $loop_time),"all") . "\n"; + + +$loop_time=new Benchmark; +$estimated=$rows=0; +for ($i=1 ; $i <= $range_loop_count ; $i++) +{ + $start=$opt_loop_count/$range_loop_count*$i; + $end=$start+$i; $rows+=fetch_all_rows($dbh,"select dummy1 from bench1 where id>=$start and id <= $end order by id",1); $end_time=new Benchmark; last if ($estimated=predict_query_time($loop_time,$end_time,\$i,$i, diff --git a/sql/log.cc b/sql/log.cc index 4f25d758f19..3563b7b1a08 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -171,7 +171,7 @@ void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg, sprintf(buff, "%s, Version: %s, started with:\nTcp port: %d Unix socket: %s\n", my_progname,server_version,mysql_port,mysql_unix_port); #endif end=strmov(strend(buff),"Time Id Command Argument\n"); - if (my_b_write(&log_file,buff,(uint) (end-buff)) || + if (my_b_write(&log_file, (byte*) buff,(uint) (end-buff)) || flush_io_cache(&log_file)) goto err; } @@ -188,7 +188,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); - if (my_b_write(&log_file,buff,(uint) strlen(buff)) || + if (my_b_write(&log_file, (byte*) buff,(uint) strlen(buff)) || flush_io_cache(&log_file)) goto err; } @@ -212,9 +212,9 @@ void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg, s.write(&log_file); flush_io_cache(&log_file); pthread_mutex_lock(&LOCK_index); - error=(my_write(index_file, log_file_name,strlen(log_file_name), + error=(my_write(index_file, (byte*) log_file_name, strlen(log_file_name), MYF(MY_NABP | MY_WME)) || - my_write(index_file, "\n", 1, MYF(MY_NABP | MY_WME))); + my_write(index_file, (byte*) "\n", 1, MYF(MY_NABP | MY_WME))); pthread_mutex_unlock(&LOCK_index); if (error) { @@ -444,8 +444,8 @@ during log purge for write"); { char* l; get_dynamic(&logs_to_keep, (gptr)&l, i); - if (my_write(index_file, l, strlen(l), MYF(MY_WME|MY_NABP)) || - my_write(index_file, "\n", 1, MYF(MY_WME|MY_NABP))) + if (my_write(index_file, (byte*) l, strlen(l), MYF(MY_WME|MY_NABP)) || + my_write(index_file, (byte*) "\n", 1, MYF(MY_WME|MY_NABP))) { error = LOG_INFO_FATAL; goto err; @@ -571,21 +571,21 @@ void MYSQL_LOG::write(THD *thd,enum enum_server_command command, start->tm_hour, start->tm_min, start->tm_sec); - if (my_b_write(&log_file,buff,16)) + if (my_b_write(&log_file, (byte*) buff,16)) error=errno; } - else if (my_b_write(&log_file,"\t\t",2) < 0) + else if (my_b_write(&log_file, (byte*) "\t\t",2) < 0) error=errno; sprintf(buff,"%7ld %-10.10s", id,command_name[(uint) command]); - if (my_b_write(&log_file,buff,strlen(buff))) + if (my_b_write(&log_file, (byte*) buff,strlen(buff))) error=errno; if (format) { - if (my_b_write(&log_file," ",1) || + if (my_b_write(&log_file, (byte*) " ",1) || my_b_vprintf(&log_file,format,args) == (uint) -1) error=errno; } - if (my_b_write(&log_file,"\n",1) || + if (my_b_write(&log_file, (byte*) "\n",1) || flush_io_cache(&log_file)) error=errno; if (error && ! write_error) @@ -711,7 +711,6 @@ void MYSQL_LOG::write(THD *thd,const char *query, uint query_length, last_time=current_time; struct tm tm_tmp; struct tm *start; - char buff[32]; localtime_r(¤t_time,&tm_tmp); start=&tm_tmp; /* Note that my_b_write() assumes it knows the length for this */ @@ -722,7 +721,7 @@ void MYSQL_LOG::write(THD *thd,const char *query, uint query_length, start->tm_hour, start->tm_min, start->tm_sec); - if (my_b_write(&log_file,buff,24)) + if (my_b_write(&log_file, (byte*) buff,24)) error=errno; } if (my_b_printf(&log_file, "# User@Host: %s [%s] @ %s [%s]\n", @@ -778,8 +777,8 @@ void MYSQL_LOG::write(THD *thd,const char *query, uint query_length, *end++=';'; *end++='\n'; *end=0; - if (my_b_write(&log_file,"SET ",4) || - my_b_write(&log_file,buff+1,(uint) (end-buff)-1)) + if (my_b_write(&log_file, (byte*) "SET ",4) || + my_b_write(&log_file, (byte*) buff+1,(uint) (end-buff)-1)) error=errno; } if (!query) @@ -787,8 +786,8 @@ void MYSQL_LOG::write(THD *thd,const char *query, uint query_length, query="#adminstrator command"; query_length=21; } - if (my_b_write(&log_file,(byte*) query,query_length) || - my_b_write(&log_file,";\n",2) || + if (my_b_write(&log_file, (byte*) query,query_length) || + my_b_write(&log_file, (byte*) ";\n",2) || flush_io_cache(&log_file)) error=errno; if (error && ! write_error) diff --git a/sql/log_event.h b/sql/log_event.h index fb71a52a82e..c956cfde396 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -363,7 +363,7 @@ public: Stop_log_event(IO_CACHE* file, time_t when_arg, uint32 server_id): Log_event(when_arg,0,0,server_id) { - char skip[4]; + byte skip[4]; my_b_read(file, skip, sizeof(skip)); // skip the event length } Stop_log_event(const char* buf):Log_event(buf) diff --git a/sql/mf_iocache.cc b/sql/mf_iocache.cc index c1e6b37a848..f723e35ca93 100644 --- a/sql/mf_iocache.cc +++ b/sql/mf_iocache.cc @@ -37,6 +37,7 @@ #include <errno.h> static void my_aiowait(my_aio_result *result); #endif +#include <assert.h> extern "C" { @@ -233,24 +234,28 @@ my_bool reinit_io_cache(IO_CACHE *info, enum cache_type type, - /* Read buffered. Returns 1 if can't read requested characters */ - /* Returns 0 if record read */ + /* + Read buffered. Returns 1 if can't read requested characters + This function is only called from the my_b_read() macro + when there isn't enough characters in the buffer to + satisfy the request. + Returns 0 we succeeded in reading all data + */ int _my_b_read(register IO_CACHE *info, byte *Buffer, uint Count) { uint length,diff_length,left_length; my_off_t max_length, pos_in_file; - if((left_length=(uint) (info->rc_end-info->rc_pos))) + if ((left_length=(uint) (info->rc_end-info->rc_pos))) { - if(Count < left_length) - left_length = Count; - memcpy(Buffer,info->rc_pos, - (size_t) (left_length)); + dbug_assert(Count >= left_length); /* User is not using my_b_read() */ + memcpy(Buffer,info->rc_pos, (size_t) (left_length)); Buffer+=left_length; Count-=left_length; } - pos_in_file=info->pos_in_file+ left_length; + /* pos_in_file always point on where info->buffer was read */ + pos_in_file=info->pos_in_file+(uint) (info->rc_end - info->buffer); if (info->seek_not_done) { /* File touched, do seek */ VOID(my_seek(info->file,pos_in_file,MY_SEEK_SET,MYF(0))); diff --git a/sql/mysqlbinlog.cc b/sql/mysqlbinlog.cc index 12b8e71d017..dd1d6fe9765 100644 --- a/sql/mysqlbinlog.cc +++ b/sql/mysqlbinlog.cc @@ -330,12 +330,12 @@ static void dump_local_log_entries(const char* logname) if (position) { /* skip 'position' characters from stdout */ - char buff[IO_SIZE]; + byte buff[IO_SIZE]; my_off_t length,tmp; for (length=position ; length > 0 ; length-=tmp) { tmp=min(length,sizeof(buff)); - if (my_b_read(file,buff,tmp)) + if (my_b_read(file,buff, (uint) tmp)) exit(1); } } diff --git a/sql/mysqld.cc b/sql/mysqld.cc index ff0307bde1d..42221be9176 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -569,7 +569,6 @@ static sig_handler print_signal_warning(int sig) void unireg_end(int signal_number __attribute__((unused))) { - (void) my_delete(pidfile_name,MYF(0)); // This may not always exist clean_up(); pthread_exit(0); // Exit is in main thread } @@ -580,7 +579,6 @@ void unireg_abort(int exit_code) if (exit_code) sql_print_error("Aborting\n"); clean_up(); /* purecov: inspected */ - (void) my_delete(pidfile_name,MYF(0)); // This may not always exist exit(exit_code); /* purecov: inspected */ } @@ -610,6 +608,7 @@ void clean_up(void) free_defaults(defaults_argv); my_free(mysql_tmpdir,MYF(0)); x_free(opt_bin_logname); + (void) my_delete(pidfile_name,MYF(0)); // This may not always exist my_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0); /* Tell main we are ready */ @@ -1520,7 +1519,7 @@ int main(int argc, char **argv) sql_print_error("Can't init databases"); exit(1); } -#ifdef HAVE_MLOCKALL +#if defined(HAVE_MLOCKALL) && defined(MCL_CURRENT) if (locked_in_memory && !geteuid()) { ha_key_cache(); diff --git a/sql/slave.cc b/sql/slave.cc index 785d4394845..aae2e6e40cb 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -42,7 +42,7 @@ static int create_table_from_dump(THD* thd, NET* net, const char* db, static inline char* rewrite_db(char* db); static void free_table_ent(TABLE_RULE_ENT* e) { - my_free((byte*)e, MYF(0)); + my_free((gptr) e, MYF(0)); } static byte* get_table_key(TABLE_RULE_ENT* e, uint* len, @@ -74,12 +74,12 @@ int tables_ok(THD* thd, TABLE_LIST* tables) uint len = strmov(p, tables->real_name) - hash_key ; if(do_table_inited) // if there are any do's { - if(hash_search(&replicate_do_table, hash_key, len)) + if(hash_search(&replicate_do_table, (byte*) hash_key, len)) return 1; } if(ignore_table_inited) // if there are any do's { - if(hash_search(&replicate_ignore_table, hash_key, len)) + if(hash_search(&replicate_ignore_table, (byte*) hash_key, len)) return 0; } } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 467feaef6d8..79c36431cb1 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1559,7 +1559,7 @@ mysql_execute_command(void) /* Check if auto_commit mode changed */ if ((org_options ^ lex->options) & OPTION_AUTO_COMMIT) { - if (!org_options & OPTION_AUTO_COMMIT) + if (!(org_options & OPTION_AUTO_COMMIT)) { /* We changed to auto_commit mode */ thd->options&= ~(ulong) (OPTION_BEGIN); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 7ae3b525609..173511083e4 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -48,6 +48,7 @@ int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists) bool some_tables_deleted=0; uint error; db_type table_type; + TABLE_LIST *table; DBUG_ENTER("mysql_rm_table"); /* mark for close and remove all cached entries */ @@ -59,22 +60,22 @@ int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists) pthread_mutex_unlock(&thd->mysys_var->mutex); if(global_read_lock) + { + if(thd->global_read_lock) { - if(thd->global_read_lock) - { - my_error(ER_TABLE_NOT_LOCKED_FOR_WRITE,MYF(0), - tables->real_name); - error = 1; - goto err; - } - while (global_read_lock && ! thd->killed) - { - (void) pthread_cond_wait(&COND_refresh,&LOCK_open); - } - + my_error(ER_TABLE_NOT_LOCKED_FOR_WRITE,MYF(0), + tables->real_name); + error = 1; + goto err; } + while (global_read_lock && ! thd->killed) + { + (void) pthread_cond_wait(&COND_refresh,&LOCK_open); + } + + } - for (TABLE_LIST *table=tables ; table ; table=table->next) + for (table=tables ; table ; table=table->next) { char *db=table->db ? table->db : thd->db; if (!close_temporary_table(thd, db, table->real_name)) |