Commit 064b8b8f authored by monty@mysql.com's avatar monty@mysql.com

Merge with 4.0 to get bug fixes

parents 949de544 801a2495
...@@ -46,6 +46,7 @@ $opt_test= undef; ...@@ -46,6 +46,7 @@ $opt_test= undef;
$opt_skip_check= undef; $opt_skip_check= undef;
$opt_skip_manual= undef; $opt_skip_manual= undef;
$opt_win_dist= undef; $opt_win_dist= undef;
$opt_quiet= undef;
$version= "unknown"; $version= "unknown";
$major=$minor=$release=0; $major=$minor=$release=0;
...@@ -67,7 +68,8 @@ GetOptions( ...@@ -67,7 +68,8 @@ GetOptions(
"suffix=s", "suffix=s",
"test|t", "test|t",
"verbose|v", "verbose|v",
"win-dist|w" "win-dist|w",
"quiet|q",
) || print_help(""); ) || print_help("");
# #
...@@ -99,8 +101,6 @@ if (defined $opt_build_command) ...@@ -99,8 +101,6 @@ if (defined $opt_build_command)
print_help("") if ($opt_help); print_help("") if ($opt_help);
defined($REPO=$ARGV[0]) || print_help("Please enter the BK repository to be used!"); defined($REPO=$ARGV[0]) || print_help("Please enter the BK repository to be used!");
$subject= "Bootstrap of $REPO failed" if $opt_mail;
&logger("Starting build"); &logger("Starting build");
&abort("The directory \"$REPO\" could not be found!") if (!-d $REPO); &abort("The directory \"$REPO\" could not be found!") if (!-d $REPO);
&logger("Using $REPO as the BK parent repository"); &logger("Using $REPO as the BK parent repository");
...@@ -306,7 +306,7 @@ if (!$opt_dry_run) ...@@ -306,7 +306,7 @@ if (!$opt_dry_run)
# #
# Now build the source distribution # Now build the source distribution
# #
&logger("Compiling"); &logger("Compiling...");
$command= $build_command; $command= $build_command;
&run_command($command, "Compilation failed!"); &run_command($command, "Compilation failed!");
...@@ -403,6 +403,7 @@ Options: ...@@ -403,6 +403,7 @@ Options:
include a log file snippet, if logging is enabled) include a log file snippet, if logging is enabled)
Note that the \@-Sign needs to be quoted! Note that the \@-Sign needs to be quoted!
Example: --mail=user\\\@domain.com Example: --mail=user\\\@domain.com
-q, --quiet Be quiet
-p, --pull Update the source BK trees before building -p, --pull Update the source BK trees before building
-r, --revision=<rev> Export the tree as of revision <rev> -r, --revision=<rev> Export the tree as of revision <rev>
(default is up to the latest revision) (default is up to the latest revision)
......
...@@ -204,6 +204,17 @@ if ($opt_stage == 0) ...@@ -204,6 +204,17 @@ if ($opt_stage == 0)
safe_cd($host); safe_cd($host);
if ($opt_stage == 0 && ! $opt_use_old_distribution) if ($opt_stage == 0 && ! $opt_use_old_distribution)
{ {
$md5_result= safe_system("./my_md5sum -c ${opt_distribution}.md5");
if ($md5_result != 0)
{
abort("MD5 failed for $opt_distribution!");
}
else
{
info("SUCCESS: MD5 checks for $opt_distribution");
}
safe_system("gunzip < $opt_distribution | $tar xf -"); safe_system("gunzip < $opt_distribution | $tar xf -");
# Fix file times; This is needed because the time for files may be # Fix file times; This is needed because the time for files may be
...@@ -331,6 +342,9 @@ if ($opt_stage <= 3) ...@@ -331,6 +342,9 @@ if ($opt_stage <= 3)
$tar_file=<$pwd/$host/mysql*.t*gz>; $tar_file=<$pwd/$host/mysql*.t*gz>;
abort ("Could not find tarball!") unless ($tar_file); abort ("Could not find tarball!") unless ($tar_file);
# Generate the MD5 for the binary distribution
safe_system("./my_md5sum $tar_file > ${tar_file}.md5}");
# #
# Unpack the binary distribution # Unpack the binary distribution
# #
...@@ -660,7 +674,10 @@ sub safe_system ...@@ -660,7 +674,10 @@ sub safe_system
my($com,$res)=@_; my($com,$res)=@_;
print LOG "$com\n"; print LOG "$com\n";
print "$host: $com\n" if ($opt_debug); print "$host: $com\n" if ($opt_debug);
system("$com >> $log 2>&1") && abort("error: Couldn't execute command, error: " . ($? / 256)); my $result= system("$com >> $log 2>&1");
abort("error: Couldn't execute command, error: " . ($? / 256)) unless $result == 0;
return $result;
} }
sub check_system sub check_system
......
...@@ -5,7 +5,10 @@ ...@@ -5,7 +5,10 @@
# #
sub logger sub logger
{ {
my $message=$_[0]; my $message= $_[0];
my $cmnd= $_[1];
print $message . "\n" if !$opt_quiet && !$opt_verbose && !$cmnd;
print timestamp() . " " . $message . "\n" if $opt_verbose; print timestamp() . " " . $message . "\n" if $opt_verbose;
if (defined $opt_log && !$opt_dry_run) if (defined $opt_log && !$opt_dry_run)
{ {
...@@ -30,9 +33,12 @@ sub run_command ...@@ -30,9 +33,12 @@ sub run_command
} }
else else
{ {
&logger($command); &logger($command, 1);
$command.= " >> $LOGFILE 2>&1" if defined $opt_log;
$command.= " > /dev/null" if (!$opt_verbose && !$opt_log); $command.= ';' unless ($command =~ m/^.*;$/);
$command =~ s/;/ >> $LOGFILE 2>&1;/g if defined $opt_log;
$command =~ s/;/ > \/dev\/null;/g if (!$opt_verbose && !$opt_log);
system($command) == 0 or &abort("$errormsg\n"); system($command) == 0 or &abort("$errormsg\n");
} }
} }
...@@ -47,6 +53,7 @@ sub abort ...@@ -47,6 +53,7 @@ sub abort
{ {
my $message= $_[0]; my $message= $_[0];
my $messagefile; my $messagefile;
my $subject= "Bootstrap of $REPO failed" if $opt_mail;
$message= "ERROR: " . $message; $message= "ERROR: " . $message;
&logger($message); &logger($message);
......
...@@ -10,10 +10,22 @@ ...@@ -10,10 +10,22 @@
# Written by Matt Wagner <matt@mysql.com> # Written by Matt Wagner <matt@mysql.com>
# #
use strict; use strict;
#
# Use local perl libraries first. 'unshift' adds to the front of @INC
# The local perl library dir hidden is $HOME/.perllibs on each build host
#
BEGIN
{
my $homedir= $ENV{HOME};
unshift (@INC, "$homedir/.perllibs");
}
use Digest::MD5; use Digest::MD5;
use Getopt::Long; use Getopt::Long;
my $VER= "1.1"; my $VER= "1.3";
my $EXIT= 0;
# #
# Strip the leading path info off the program name ($0). We want 'my_md5sum' # Strip the leading path info off the program name ($0). We want 'my_md5sum'
...@@ -67,6 +79,9 @@ if ($opt_check) ...@@ -67,6 +79,9 @@ if ($opt_check)
# Print an error message if they don't match, else print OK # Print an error message if they don't match, else print OK
print "$checkfile: FAILED\n" if $digest ne $checksum; print "$checkfile: FAILED\n" if $digest ne $checksum;
print "$checkfile: OK\n" if $digest eq $checksum; print "$checkfile: OK\n" if $digest eq $checksum;
# Set the exit() status to non-zero if FAILED
$EXIT= 1 if $digest ne $checksum;
} }
} }
# Else generate the MD5 digest to STDOUT # Else generate the MD5 digest to STDOUT
...@@ -80,6 +95,8 @@ else ...@@ -80,6 +95,8 @@ else
} }
} }
exit($EXIT);
# #
# This routine generates the MD5 digest of a file # This routine generates the MD5 digest of a file
......
...@@ -1851,12 +1851,6 @@ int read_query(struct st_query** q_ptr) ...@@ -1851,12 +1851,6 @@ int read_query(struct st_query** q_ptr)
q->record_file[0]= 0; q->record_file[0]= 0;
q->require_file= 0; q->require_file= 0;
q->first_word_len= 0; q->first_word_len= 0;
memcpy((gptr) q->expected_errno, (gptr) global_expected_errno,
sizeof(global_expected_errno));
q->expected_errors= global_expected_errors;
q->abort_on_error= global_expected_errors == 0;
bzero((gptr) global_expected_errno, sizeof(global_expected_errno));
global_expected_errors=0;
q->type = Q_UNKNOWN; q->type = Q_UNKNOWN;
q->query_buf= q->query= 0; q->query_buf= q->query= 0;
...@@ -1869,8 +1863,16 @@ int read_query(struct st_query** q_ptr) ...@@ -1869,8 +1863,16 @@ int read_query(struct st_query** q_ptr)
if (*p == '#') if (*p == '#')
{ {
q->type = Q_COMMENT; q->type = Q_COMMENT;
/* This goto is to avoid losing the "expected error" info. */
goto end;
} }
else if (p[0] == '-' && p[1] == '-') memcpy((gptr) q->expected_errno, (gptr) global_expected_errno,
sizeof(global_expected_errno));
q->expected_errors= global_expected_errors;
q->abort_on_error= global_expected_errors == 0;
bzero((gptr) global_expected_errno, sizeof(global_expected_errno));
global_expected_errors=0;
if (p[0] == '-' && p[1] == '-')
{ {
q->type= Q_COMMENT_WITH_COMMAND; q->type= Q_COMMENT_WITH_COMMAND;
p+= 2; /* To calculate first word */ p+= 2; /* To calculate first word */
...@@ -1905,6 +1907,8 @@ int read_query(struct st_query** q_ptr) ...@@ -1905,6 +1907,8 @@ int read_query(struct st_query** q_ptr)
*p1 = 0; *p1 = 0;
} }
} }
end:
while (*p && my_isspace(charset_info, *p)) while (*p && my_isspace(charset_info, *p))
p++; p++;
if (!(q->query_buf= q->query= my_strdup(p, MYF(MY_WME)))) if (!(q->query_buf= q->query= my_strdup(p, MYF(MY_WME))))
......
...@@ -16,10 +16,17 @@ ...@@ -16,10 +16,17 @@
C_MODE_START C_MODE_START
enum get_opt_var_type { GET_NO_ARG, GET_BOOL, GET_INT, GET_UINT, GET_LONG, #define GET_NO_ARG 1
GET_ULONG, GET_LL, GET_ULL, GET_STR, GET_STR_ALLOC, #define GET_BOOL 2
GET_DISABLED #define GET_INT 3
}; #define GET_UINT 4
#define GET_LONG 5
#define GET_ULONG 6
#define GET_LL 7
#define GET_ULL 8
#define GET_STR 9
#define GET_STR_ALLOC 10
#define GET_DISABLED 11
#define GET_ASK_ADDR 128 #define GET_ASK_ADDR 128
#define GET_TYPE_MASK 127 #define GET_TYPE_MASK 127
...@@ -34,7 +41,7 @@ struct my_option ...@@ -34,7 +41,7 @@ struct my_option
gptr *value; /* The variable value */ gptr *value; /* The variable value */
gptr *u_max_value; /* The user def. max variable value */ gptr *u_max_value; /* The user def. max variable value */
const char **str_values; /* Pointer to possible values */ const char **str_values; /* Pointer to possible values */
enum get_opt_var_type var_type; ulong var_type;
enum get_opt_arg_type arg_type; enum get_opt_arg_type arg_type;
longlong def_value; /* Default value */ longlong def_value; /* Default value */
longlong min_value; /* Min allowed value */ longlong min_value; /* Min allowed value */
......
...@@ -80,4 +80,3 @@ DROP TABLE help_relation; ...@@ -80,4 +80,3 @@ DROP TABLE help_relation;
DROP TABLE help_topic; DROP TABLE help_topic;
-- enable_query_log -- enable_query_log
...@@ -99,4 +99,3 @@ drop table test_func; ...@@ -99,4 +99,3 @@ drop table test_func;
drop table test_host; drop table test_host;
drop table test_user; drop table test_user;
drop table test_db; drop table test_db;
...@@ -461,6 +461,17 @@ MY_DIR *my_dir(const char *path, myf MyFlags) ...@@ -461,6 +461,17 @@ MY_DIR *my_dir(const char *path, myf MyFlags)
else else
finfo.mystat= NULL; finfo.mystat= NULL;
/*
If the directory is the root directory of the drive, Windows sometimes
creates hidden or system files there (like RECYCLER); do not show
them. We would need to see how this can be achieved with a Borland
compiler.
*/
#ifndef __BORLANDC__
if (attrib & (_A_HIDDEN | _A_SYSTEM))
continue;
#endif
if (push_dynamic(dir_entries_storage, (gptr)&finfo)) if (push_dynamic(dir_entries_storage, (gptr)&finfo))
goto error; goto error;
......
...@@ -1696,9 +1696,9 @@ void Load_log_event::set_fields(List<Item> &field_list) ...@@ -1696,9 +1696,9 @@ void Load_log_event::set_fields(List<Item> &field_list)
int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
bool use_rli_only_for_errors) bool use_rli_only_for_errors)
{ {
char *load_data_query= 0;
thd->db= (char*) rewrite_db(db); thd->db= (char*) rewrite_db(db);
DBUG_ASSERT(thd->query == 0); DBUG_ASSERT(thd->query == 0);
thd->query= 0; // Should not be needed
thd->query_length= 0; // Should not be needed thd->query_length= 0; // Should not be needed
thd->query_error= 0; thd->query_error= 0;
clear_all_errors(thd, rli); clear_all_errors(thd, rli);
...@@ -1749,6 +1749,19 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, ...@@ -1749,6 +1749,19 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
{ {
char llbuff[22]; char llbuff[22];
enum enum_duplicates handle_dup; enum enum_duplicates handle_dup;
/*
Make a simplified LOAD DATA INFILE query, for the information of the
user in SHOW PROCESSLIST. Note that db is known in the 'db' column.
*/
if ((load_data_query= (char *) my_alloca(18 + strlen(fname) + 14 +
strlen(tables.real_name) + 8)))
{
thd->query_length= (uint)(strxmov(load_data_query,
"LOAD DATA INFILE '", fname,
"' INTO TABLE `", tables.real_name,
"` <...>", NullS) - load_data_query);
thd->query= load_data_query;
}
if (sql_ex.opt_flags & REPLACE_FLAG) if (sql_ex.opt_flags & REPLACE_FLAG)
handle_dup= DUP_REPLACE; handle_dup= DUP_REPLACE;
else if (sql_ex.opt_flags & IGNORE_FLAG) else if (sql_ex.opt_flags & IGNORE_FLAG)
...@@ -1830,8 +1843,14 @@ Slave: load data infile on table '%s' at log position %s in log \ ...@@ -1830,8 +1843,14 @@ Slave: load data infile on table '%s' at log position %s in log \
} }
thd->net.vio = 0; thd->net.vio = 0;
thd->db= 0; // prevent db from being freed VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->db= 0;
thd->query= 0;
thd->query_length= 0;
VOID(pthread_mutex_unlock(&LOCK_thread_count));
close_thread_tables(thd); close_thread_tables(thd);
if (load_data_query)
my_afree(load_data_query);
if (thd->query_error) if (thd->query_error)
{ {
/* this err/sql_errno code is copy-paste from send_error() */ /* this err/sql_errno code is copy-paste from send_error() */
...@@ -2846,7 +2865,7 @@ void Create_file_log_event::pack_info(Protocol *protocol) ...@@ -2846,7 +2865,7 @@ void Create_file_log_event::pack_info(Protocol *protocol)
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) #if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
int Create_file_log_event::exec_event(struct st_relay_log_info* rli) int Create_file_log_event::exec_event(struct st_relay_log_info* rli)
{ {
char fname_buf[FN_REFLEN+10]; char proc_info[17+FN_REFLEN+10], *fname_buf= proc_info+17;
char *p; char *p;
int fd = -1; int fd = -1;
IO_CACHE file; IO_CACHE file;
...@@ -2855,6 +2874,8 @@ int Create_file_log_event::exec_event(struct st_relay_log_info* rli) ...@@ -2855,6 +2874,8 @@ int Create_file_log_event::exec_event(struct st_relay_log_info* rli)
bzero((char*)&file, sizeof(file)); bzero((char*)&file, sizeof(file));
p = slave_load_file_stem(fname_buf, file_id, server_id); p = slave_load_file_stem(fname_buf, file_id, server_id);
strmov(p, ".info"); // strmov takes less code than memcpy strmov(p, ".info"); // strmov takes less code than memcpy
strnmov(proc_info, "Making temp file ", 17); // no end 0
thd->proc_info= proc_info;
if ((fd = my_open(fname_buf, O_WRONLY|O_CREAT|O_BINARY|O_TRUNC, if ((fd = my_open(fname_buf, O_WRONLY|O_CREAT|O_BINARY|O_TRUNC,
MYF(MY_WME))) < 0 || MYF(MY_WME))) < 0 ||
init_io_cache(&file, fd, IO_SIZE, WRITE_CACHE, (my_off_t)0, 0, init_io_cache(&file, fd, IO_SIZE, WRITE_CACHE, (my_off_t)0, 0,
...@@ -2898,6 +2919,7 @@ err: ...@@ -2898,6 +2919,7 @@ err:
end_io_cache(&file); end_io_cache(&file);
if (fd >= 0) if (fd >= 0)
my_close(fd, MYF(0)); my_close(fd, MYF(0));
thd->proc_info= 0;
return error ? 1 : Log_event::exec_event(rli); return error ? 1 : Log_event::exec_event(rli);
} }
#endif /* defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) */ #endif /* defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) */
...@@ -2995,13 +3017,15 @@ void Append_block_log_event::pack_info(Protocol *protocol) ...@@ -2995,13 +3017,15 @@ void Append_block_log_event::pack_info(Protocol *protocol)
#if defined( HAVE_REPLICATION) && !defined(MYSQL_CLIENT) #if defined( HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
int Append_block_log_event::exec_event(struct st_relay_log_info* rli) int Append_block_log_event::exec_event(struct st_relay_log_info* rli)
{ {
char fname[FN_REFLEN+10]; char proc_info[17+FN_REFLEN+10], *fname= proc_info+17;
char *p= slave_load_file_stem(fname, file_id, server_id); char *p= slave_load_file_stem(fname, file_id, server_id);
int fd; int fd;
int error = 1; int error = 1;
DBUG_ENTER("Append_block_log_event::exec_event"); DBUG_ENTER("Append_block_log_event::exec_event");
memcpy(p, ".data", 6); memcpy(p, ".data", 6);
strnmov(proc_info, "Making temp file ", 17); // no end 0
thd->proc_info= proc_info;
if ((fd = my_open(fname, O_WRONLY|O_APPEND|O_BINARY, MYF(MY_WME))) < 0) if ((fd = my_open(fname, O_WRONLY|O_APPEND|O_BINARY, MYF(MY_WME))) < 0)
{ {
slave_print_error(rli,my_errno, "Error in Append_block event: could not open file '%s'", fname); slave_print_error(rli,my_errno, "Error in Append_block event: could not open file '%s'", fname);
...@@ -3017,6 +3041,7 @@ int Append_block_log_event::exec_event(struct st_relay_log_info* rli) ...@@ -3017,6 +3041,7 @@ int Append_block_log_event::exec_event(struct st_relay_log_info* rli)
err: err:
if (fd >= 0) if (fd >= 0)
my_close(fd, MYF(0)); my_close(fd, MYF(0));
thd->proc_info= 0;
DBUG_RETURN(error ? error : Log_event::exec_event(rli)); DBUG_RETURN(error ? error : Log_event::exec_event(rli));
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment