summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVasil Dimov <vasil.dimov@oracle.com>2010-12-12 11:21:17 +0200
committerVasil Dimov <vasil.dimov@oracle.com>2010-12-12 11:21:17 +0200
commit8accdc996eadcaaf5932ff8c8edd23f727b59995 (patch)
treeb840a810dd26b1cdee8ba16f44d1663e204ce261
parent662fb84a42695ddf64468d7990e7bd830165d6c2 (diff)
parent608948a2d3f3d7dd7a0dfe070697b8601a19b333 (diff)
downloadmariadb-git-8accdc996eadcaaf5932ff8c8edd23f727b59995.tar.gz
Merge mysql-5.1-bugteam -> mysql-5.1-innodb
-rw-r--r--client/mysqltest.cc59
-rw-r--r--config/ac-macros/maintainer.m45
-rw-r--r--include/mysys_err.h3
-rw-r--r--mysql-test/extra/binlog_tests/binlog_failure_mixing_engines.test1
-rwxr-xr-xmysql-test/mysql-test-run.pl15
-rw-r--r--mysql-test/r/mysqltest.result2
-rw-r--r--mysql-test/suite/binlog/r/binlog_mixed_failure_mixing_engines.result1
-rw-r--r--mysql-test/suite/binlog/r/binlog_row_failure_mixing_engines.result1
-rw-r--r--mysql-test/t/mysqltest.test1
-rw-r--r--mysys/errors.c2
-rw-r--r--mysys/my_seek.c13
-rw-r--r--mysys/my_symlink.c3
-rw-r--r--sql/sql_db.cc31
-rw-r--r--storage/myisam/ha_myisam.cc12
-rw-r--r--storage/myisam/mi_check.c2
15 files changed, 113 insertions, 38 deletions
diff --git a/client/mysqltest.cc b/client/mysqltest.cc
index e0575a1d638..0764020fc92 100644
--- a/client/mysqltest.cc
+++ b/client/mysqltest.cc
@@ -73,6 +73,10 @@
#define QUERY_SEND_FLAG 1
#define QUERY_REAP_FLAG 2
+#ifndef HAVE_SETENV
+static int setenv(const char *name, const char *value, int overwrite);
+#endif
+
enum {
OPT_SKIP_SAFEMALLOC=OPT_MAX_CLIENT_OPTION,
OPT_PS_PROTOCOL, OPT_SP_PROTOCOL, OPT_CURSOR_PROTOCOL, OPT_VIEW_PROTOCOL,
@@ -219,7 +223,6 @@ typedef struct
int alloced_len;
int int_dirty; /* do not update string if int is updated until first read */
int alloced;
- char *env_s;
} VAR;
/*Perl/shell-like variable registers */
@@ -1088,8 +1091,8 @@ void handle_command_error(struct st_command *command, uint error)
int i;
if (command->abort_on_error)
- die("command \"%.*s\" failed with error %d",
- command->first_word_len, command->query, error);
+ die("command \"%.*s\" failed with error %d. my_errno=%d",
+ command->first_word_len, command->query, error, my_errno);
i= match_expected_error(command, error, NULL);
@@ -1100,8 +1103,8 @@ void handle_command_error(struct st_command *command, uint error)
DBUG_VOID_RETURN;
}
if (command->expected_errors.count > 0)
- die("command \"%.*s\" failed with wrong error: %d",
- command->first_word_len, command->query, error);
+ die("command \"%.*s\" failed with wrong error: %d. my_errno=%d",
+ command->first_word_len, command->query, error, my_errno);
}
else if (command->expected_errors.err[0].type == ERR_ERRNO &&
command->expected_errors.err[0].code.errnum != 0)
@@ -1962,7 +1965,7 @@ VAR *var_init(VAR *v, const char *name, int name_len, const char *val,
val_len = strlen(val) ;
val_alloc_len = val_len + 16; /* room to grow */
if (!(tmp_var=v) && !(tmp_var = (VAR*)my_malloc(sizeof(*tmp_var)
- + name_len+1, MYF(MY_WME))))
+ + name_len+2, MYF(MY_WME))))
die("Out of memory");
tmp_var->name = (name) ? (char*) tmp_var + sizeof(*tmp_var) : 0;
@@ -1971,7 +1974,12 @@ VAR *var_init(VAR *v, const char *name, int name_len, const char *val,
if (!(tmp_var->str_val = (char*)my_malloc(val_alloc_len+1, MYF(MY_WME))))
die("Out of memory");
- memcpy(tmp_var->name, name, name_len);
+ if (name)
+ {
+ memcpy(tmp_var->name, name, name_len);
+ tmp_var->name[name_len]= 0;
+ }
+
if (val)
{
memcpy(tmp_var->str_val, val, val_len);
@@ -1982,7 +1990,6 @@ VAR *var_init(VAR *v, const char *name, int name_len, const char *val,
tmp_var->alloced_len = val_alloc_len;
tmp_var->int_val = (val) ? atoi(val) : 0;
tmp_var->int_dirty = 0;
- tmp_var->env_s = 0;
return tmp_var;
}
@@ -2110,20 +2117,15 @@ void var_set(const char *var_name, const char *var_name_end,
if (env_var)
{
- char buf[1024], *old_env_s= v->env_s;
if (v->int_dirty)
{
sprintf(v->str_val, "%d", v->int_val);
v->int_dirty= 0;
v->str_val_len= strlen(v->str_val);
}
- my_snprintf(buf, sizeof(buf), "%.*s=%.*s",
- v->name_len, v->name,
- v->str_val_len, v->str_val);
- if (!(v->env_s= my_strdup(buf, MYF(MY_WME))))
- die("Out of memory");
- putenv(v->env_s);
- my_free(old_env_s, MYF(MY_ALLOW_ZERO_PTR));
+ /* setenv() expects \0-terminated strings */
+ DBUG_ASSERT(v->name[v->name_len] == 0);
+ setenv(v->name, v->str_val, 1);
}
DBUG_VOID_RETURN;
}
@@ -7644,6 +7646,16 @@ void init_re(void)
int match_re(my_regex_t *re, char *str)
{
+ while (my_isspace(charset_info, *str))
+ str++;
+ if (str[0] == '/' && str[1] == '*')
+ {
+ char *comm_end= strstr (str, "*/");
+ if (! comm_end)
+ die("Statement is unterminated comment");
+ str= comm_end + 2;
+ }
+
int err= my_regexec(re, str, (size_t)0, NULL, 0);
if (err == 0)
@@ -9908,3 +9920,18 @@ void dynstr_append_sorted(DYNAMIC_STRING* ds, DYNAMIC_STRING *ds_input)
delete_dynamic(&lines);
DBUG_VOID_RETURN;
}
+
+#ifndef HAVE_SETENV
+static int setenv(const char *name, const char *value, int overwrite)
+{
+ size_t buflen= strlen(name) + strlen(value) + 2;
+ char *envvar= (char *)malloc(buflen);
+ if(!envvar)
+ return ENOMEM;
+ strcpy(envvar, name);
+ strcat(envvar, "=");
+ strcat(envvar, value);
+ putenv(envvar);
+ return 0;
+}
+#endif
diff --git a/config/ac-macros/maintainer.m4 b/config/ac-macros/maintainer.m4
index b4d2f08e558..5b6ec591e60 100644
--- a/config/ac-macros/maintainer.m4
+++ b/config/ac-macros/maintainer.m4
@@ -15,8 +15,11 @@ AC_DEFUN([MY_MAINTAINER_MODE], [
# Set warning options required under maintainer mode.
AC_DEFUN([MY_MAINTAINER_MODE_WARNINGS], [
+ # Detect ICC posing as GCC.
+ AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
+ [INTEL_COMPILER=no], [INTEL_COMPILER=yes])
# Setup GCC warning options.
- AS_IF([test "$GCC" = "yes"], [
+ AS_IF([test "$GCC" = "yes" -a "$INTEL_COMPILER" = "no"], [
C_WARNINGS="-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing -Werror"
CXX_WARNINGS="${C_WARNINGS} -Wno-unused-parameter"
C_WARNINGS="${C_WARNINGS} -Wdeclaration-after-statement"
diff --git a/include/mysys_err.h b/include/mysys_err.h
index 6294b37f773..a902c178772 100644
--- a/include/mysys_err.h
+++ b/include/mysys_err.h
@@ -64,7 +64,8 @@ extern const char * NEAR globerrs[]; /* my_error_messages is here */
#define EE_FILE_NOT_CLOSED 30
#define EE_CHANGE_OWNERSHIP 31
#define EE_CHANGE_PERMISSIONS 32
-#define EE_ERROR_LAST 32 /* Copy last error nr */
+#define EE_CANT_SEEK 33
+#define EE_ERROR_LAST 33 /* Copy last error nr */
/* Add error numbers before EE_ERROR_LAST and change it accordingly. */
/* exit codes for all MySQL programs */
diff --git a/mysql-test/extra/binlog_tests/binlog_failure_mixing_engines.test b/mysql-test/extra/binlog_tests/binlog_failure_mixing_engines.test
index 54f3c538c79..d537e29c1a8 100644
--- a/mysql-test/extra/binlog_tests/binlog_failure_mixing_engines.test
+++ b/mysql-test/extra/binlog_tests/binlog_failure_mixing_engines.test
@@ -60,6 +60,7 @@
# Please, remove this test case after pushing WL#2687.
################################################################################
+RESET MASTER;
--echo ###################################################################################
--echo # CONFIGURATION
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index 2740af710a7..6e8f12ceec1 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -864,7 +864,7 @@ sub command_line_setup {
my $opt_list_options;
# Read the command line options
- # Note: Keep list, and the order, in sync with usage at end of this file
+ # Note: Keep list in sync with usage at end of this file
Getopt::Long::Configure("pass_through");
my %options=(
# Control what engine/variation to run
@@ -900,6 +900,7 @@ sub command_line_setup {
'combination=s' => \@opt_combinations,
'skip-combinations' => \&collect_option,
'experimental=s' => \@opt_experimentals,
+ # skip-im is deprecated and silently ignored
'skip-im' => \&ignore_option,
# Specify ports
@@ -992,6 +993,7 @@ sub command_line_setup {
'max-connections=i' => \$opt_max_connections,
'help|h' => \$opt_usage,
+ # list-options is internal, not listed in help
'list-options' => \$opt_list_options,
);
@@ -5467,7 +5469,7 @@ Options to control what engine/variation to run
defaults-file=<config template> Use fixed config template for all
tests
- defaults_extra_file=<config template> Extra config template to add to
+ defaults-extra-file=<config template> Extra config template to add to
all generated configs
combination=<opt> Use at least twice to run tests with specified
options to mysqld
@@ -5558,7 +5560,7 @@ Options for debugging the product
test(s)
manual-ddd Let user manually start mysqld in ddd, before running
test(s)
- strace-client=[path] Create strace output for mysqltest client, optionally
+ strace-client[=path] Create strace output for mysqltest client, optionally
specifying name and path to the trace program to use.
Example: $0 --strace-client=ktrace
max-save-core Limit the number of core files saved (to avoid filling
@@ -5591,7 +5593,7 @@ Options for valgrind
Misc options
user=USER User for connecting to mysqld(default: $opt_user)
comment=STR Write STR to the output
- notimer Don't show test case execution time
+ timer Show test case execution time.
verbose More verbose output(use multiple times for even more)
verbose-restart Write when and why servers are restarted
start Only initialize and start the servers, using the
@@ -5631,6 +5633,7 @@ Misc options
actions. Disable facility with NUM=0.
gcov Collect coverage information after the test.
The result is a gcov file per source and header file.
+ gprof Collect profiling information using gprof.
experimental=<file> Refer to list of tests considered experimental;
failures will be marked exp-fail instead of fail.
report-features First run a "test" that reports mysql features
@@ -5639,6 +5642,10 @@ Misc options
*previous* test started
max-connections=N Max number of open connection to server in mysqltest
+Some options that control enabling a feature for normal test runs,
+can be turned off by prepending 'no' to the option, e.g. --notimer.
+This applies to reorder, timer, check-testcases and warnings.
+
HERE
exit(1);
diff --git a/mysql-test/r/mysqltest.result b/mysql-test/r/mysqltest.result
index 013728ebd01..c450369aa11 100644
--- a/mysql-test/r/mysqltest.result
+++ b/mysql-test/r/mysqltest.result
@@ -591,7 +591,7 @@ if things work as expected
Some data
for cat_file command
of mysqltest
-mysqltest: At line 1: command "cat_file" failed with error 1
+mysqltest: At line 1: command "cat_file" failed with error 1. (my_errno)
mysqltest: At line 1: Missing required argument 'filename' to command 'file_exists'
mysqltest: At line 1: Missing required argument 'from_file' to command 'copy_file'
mysqltest: At line 1: Missing required argument 'to_file' to command 'copy_file'
diff --git a/mysql-test/suite/binlog/r/binlog_mixed_failure_mixing_engines.result b/mysql-test/suite/binlog/r/binlog_mixed_failure_mixing_engines.result
index dfc08d76a6a..4078103b1f7 100644
--- a/mysql-test/suite/binlog/r/binlog_mixed_failure_mixing_engines.result
+++ b/mysql-test/suite/binlog/r/binlog_mixed_failure_mixing_engines.result
@@ -1,3 +1,4 @@
+RESET MASTER;
###################################################################################
# CONFIGURATION
###################################################################################
diff --git a/mysql-test/suite/binlog/r/binlog_row_failure_mixing_engines.result b/mysql-test/suite/binlog/r/binlog_row_failure_mixing_engines.result
index 45c8640d3e3..2d493397ffd 100644
--- a/mysql-test/suite/binlog/r/binlog_row_failure_mixing_engines.result
+++ b/mysql-test/suite/binlog/r/binlog_row_failure_mixing_engines.result
@@ -1,3 +1,4 @@
+RESET MASTER;
###################################################################################
# CONFIGURATION
###################################################################################
diff --git a/mysql-test/t/mysqltest.test b/mysql-test/t/mysqltest.test
index fe04b8c19e0..b9197a7d4b9 100644
--- a/mysql-test/t/mysqltest.test
+++ b/mysql-test/t/mysqltest.test
@@ -1936,6 +1936,7 @@ EOF
cat_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
remove_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
+--replace_regex /my_errno=[0-9]*/(my_errno)/
--error 1
--exec echo "cat_file non_existing_file;" | $MYSQL_TEST 2>&1
diff --git a/mysys/errors.c b/mysys/errors.c
index a5ad4a956ab..da9f3122a19 100644
--- a/mysys/errors.c
+++ b/mysys/errors.c
@@ -52,6 +52,7 @@ const char * NEAR globerrs[GLOBERRS]=
"File '%s' (fileno: %d) was not closed",
"Can't change ownership of the file '%s' (Errcode: %d)",
"Can't change permissions of the file '%s' (Errcode: %d)",
+ "Can't seek in file '%s' (Errcode: %d)"
};
void init_glob_errs(void)
@@ -94,6 +95,7 @@ void init_glob_errs()
EE(EE_FILE_NOT_CLOSED) = "File '%s' (fileno: %d) was not closed";
EE(EE_CHANGE_OWNERSHIP) = "Can't change ownership of the file '%s' (Errcode: %d)";
EE(EE_CHANGE_PERMISSIONS) = "Can't change permissions of the file '%s' (Errcode: %d)";
+ EE(EE_CANT_SEEK) = "Can't seek in file '%s' (Errcode: %d)";
}
#endif
diff --git a/mysys/my_seek.c b/mysys/my_seek.c
index 2c661baeff7..830c2ba245d 100644
--- a/mysys/my_seek.c
+++ b/mysys/my_seek.c
@@ -14,6 +14,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include "mysys_priv.h"
+#include "mysys_err.h"
/*
Seek to a position in a file.
@@ -42,8 +43,7 @@
actual error.
*/
-my_off_t my_seek(File fd, my_off_t pos, int whence,
- myf MyFlags __attribute__((unused)))
+my_off_t my_seek(File fd, my_off_t pos, int whence, myf MyFlags)
{
reg1 os_off_t newpos= -1;
DBUG_ENTER("my_seek");
@@ -69,6 +69,8 @@ my_off_t my_seek(File fd, my_off_t pos, int whence,
if (newpos == (os_off_t) -1)
{
my_errno=errno;
+ if (MyFlags & MY_WME)
+ my_error(EE_CANT_SEEK, MYF(0), my_filename(fd), my_errno);
DBUG_PRINT("error",("lseek: %lu errno: %d", (ulong) newpos,errno));
DBUG_RETURN(MY_FILEPOS_ERROR);
}
@@ -83,7 +85,7 @@ my_off_t my_seek(File fd, my_off_t pos, int whence,
/* Tell current position of file */
/* ARGSUSED */
-my_off_t my_tell(File fd, myf MyFlags __attribute__((unused)))
+my_off_t my_tell(File fd, myf MyFlags)
{
os_off_t pos;
DBUG_ENTER("my_tell");
@@ -95,7 +97,12 @@ my_off_t my_tell(File fd, myf MyFlags __attribute__((unused)))
pos=lseek(fd, 0L, MY_SEEK_CUR);
#endif
if (pos == (os_off_t) -1)
+ {
my_errno=errno;
+ if (MyFlags & MY_WME)
+ my_error(EE_CANT_SEEK, MYF(0), my_filename(fd), my_errno);
+ DBUG_PRINT("error", ("tell: %lu errno: %d", (ulong) pos, my_errno));
+ }
DBUG_PRINT("exit",("pos: %lu", (ulong) pos));
DBUG_RETURN((my_off_t) pos);
} /* my_tell */
diff --git a/mysys/my_symlink.c b/mysys/my_symlink.c
index b57edd2179a..59d929f9a61 100644
--- a/mysys/my_symlink.c
+++ b/mysys/my_symlink.c
@@ -118,8 +118,7 @@ int my_is_symlink(const char *filename __attribute__((unused)))
'to' may be equal to 'filename'
*/
-int my_realpath(char *to, const char *filename,
- myf MyFlags __attribute__((unused)))
+int my_realpath(char *to, const char *filename, myf MyFlags)
{
#if defined(HAVE_REALPATH) && !defined(HAVE_BROKEN_REALPATH)
int result=0;
diff --git a/sql/sql_db.cc b/sql/sql_db.cc
index 2c44c1a8449..d7d7f43a7aa 100644
--- a/sql/sql_db.cc
+++ b/sql/sql_db.cc
@@ -948,9 +948,6 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
remove_db_from_cache(db);
pthread_mutex_unlock(&LOCK_open);
- Drop_table_error_handler err_handler(thd->get_internal_handler());
- thd->push_internal_handler(&err_handler);
-
error= -1;
/*
We temporarily disable the binary log while dropping the objects
@@ -983,8 +980,8 @@ bool mysql_rm_db(THD *thd,char *db,bool if_exists, bool silent)
error = 0;
reenable_binlog(thd);
}
- thd->pop_internal_handler();
}
+
if (!silent && deleted>=0)
{
const char *query;
@@ -1213,16 +1210,34 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
else
{
strxmov(filePath, org_path, "/", file->name, NullS);
- if (my_delete_with_symlink(filePath,MYF(MY_WME)))
+ /*
+ We ignore ENOENT error in order to skip files that was deleted
+ by concurrently running statement like REAPIR TABLE ...
+ */
+ if (my_delete_with_symlink(filePath, MYF(0)) &&
+ my_errno != ENOENT)
{
- goto err;
+ my_error(EE_DELETE, MYF(0), filePath, my_errno);
+ goto err;
}
}
}
- if (thd->killed ||
- (tot_list && mysql_rm_table_part2(thd, tot_list, 1, 0, 1, 1)))
+
+ if (thd->killed)
goto err;
+ if (tot_list)
+ {
+ int res= 0;
+ Drop_table_error_handler err_handler(thd->get_internal_handler());
+
+ thd->push_internal_handler(&err_handler);
+ res= mysql_rm_table_part2(thd, tot_list, 1, 0, 1, 1);
+ thd->pop_internal_handler();
+ if (res)
+ goto err;
+ }
+
/* Remove RAID directories */
{
List_iterator<String> it(raid_dirs);
diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc
index 12557b75cc1..2650cc850a8 100644
--- a/storage/myisam/ha_myisam.cc
+++ b/storage/myisam/ha_myisam.cc
@@ -590,7 +590,11 @@ int ha_myisam::net_read_dump(NET* net)
int data_fd = file->dfile;
int error = 0;
- my_seek(data_fd, 0L, MY_SEEK_SET, MYF(MY_WME));
+ if (my_seek(data_fd, 0L, MY_SEEK_SET, MYF(MY_WME)) == MY_FILEPOS_ERROR)
+ {
+ error= my_errno;
+ goto err;
+ }
for (;;)
{
ulong packet_len = my_net_read(net);
@@ -626,7 +630,11 @@ int ha_myisam::dump(THD* thd, int fd)
return ENOMEM;
int error = 0;
- my_seek(data_fd, 0L, MY_SEEK_SET, MYF(MY_WME));
+ if (my_seek(data_fd, 0L, MY_SEEK_SET, MYF(MY_WME)) == MY_FILEPOS_ERROR)
+ {
+ error= my_errno;
+ goto err;
+ }
for (; bytes_to_read > 0;)
{
size_t bytes = my_read(data_fd, buf, blocksize, MYF(MY_WME));
diff --git a/storage/myisam/mi_check.c b/storage/myisam/mi_check.c
index 8e3864d1c44..935465e7edf 100644
--- a/storage/myisam/mi_check.c
+++ b/storage/myisam/mi_check.c
@@ -1741,6 +1741,8 @@ err:
MYF(MY_REDEL_MAKE_BACKUP): MYF(0))) ||
mi_open_datafile(info,share,name,-1))
got_error=1;
+
+ param->retry_repair= 0;
}
}
if (got_error)