merge
This commit is contained in:
commit
c8853ae5e5
@ -1449,8 +1449,8 @@ static struct my_option my_long_options[] =
|
||||
&opt_sigint_ignore, &opt_sigint_ignore, 0, GET_BOOL,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"one-database", 'o',
|
||||
"Only update the default database. This is useful for skipping updates "
|
||||
"to other database in the update log.",
|
||||
"Ignore statements except those that occur while the default "
|
||||
"database is the one named at the command line.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef USE_POPEN
|
||||
{"pager", OPT_PAGER,
|
||||
@ -2736,6 +2736,10 @@ static void get_current_db()
|
||||
{
|
||||
MYSQL_RES *res;
|
||||
|
||||
/* If one_database is set, current_db is not supposed to change. */
|
||||
if (one_database)
|
||||
return;
|
||||
|
||||
my_free(current_db, MYF(MY_ALLOW_ZERO_PTR));
|
||||
current_db= NULL;
|
||||
/* In case of error below current_db will be NULL */
|
||||
|
@ -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;
|
||||
}
|
||||
@ -7646,6 +7648,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)
|
||||
@ -7784,13 +7796,16 @@ static void dump_backtrace(void)
|
||||
{
|
||||
struct st_connection *conn= cur_con;
|
||||
|
||||
my_safe_print_str("read_command_buf", read_command_buf,
|
||||
sizeof(read_command_buf));
|
||||
fprintf(stderr, "read_command_buf (%p): ", read_command_buf);
|
||||
my_safe_print_str(read_command_buf, sizeof(read_command_buf));
|
||||
|
||||
if (conn)
|
||||
{
|
||||
my_safe_print_str("conn->name", conn->name, conn->name_len);
|
||||
fprintf(stderr, "conn->name (%p): ", conn->name);
|
||||
my_safe_print_str(conn->name, conn->name_len);
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
my_safe_print_str("conn->cur_query", conn->cur_query, conn->cur_query_len);
|
||||
fprintf(stderr, "conn->cur_query (%p): ", conn->cur_query);
|
||||
my_safe_print_str(conn->cur_query, conn->cur_query_len);
|
||||
#endif
|
||||
}
|
||||
fputs("Attempting backtrace...\n", stderr);
|
||||
@ -9907,3 +9922,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
|
||||
|
@ -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"
|
||||
|
19
dbug/dbug.c
19
dbug/dbug.c
@ -2276,6 +2276,25 @@ void _db_flush_()
|
||||
}
|
||||
|
||||
|
||||
#ifndef __WIN__
|
||||
void _db_suicide_()
|
||||
{
|
||||
int retval;
|
||||
sigset_t new_mask;
|
||||
sigfillset(&new_mask);
|
||||
|
||||
fprintf(stderr, "SIGKILL myself\n");
|
||||
fflush(stderr);
|
||||
|
||||
retval= kill(getpid(), SIGKILL);
|
||||
assert(retval == 0);
|
||||
retval= sigsuspend(&new_mask);
|
||||
fprintf(stderr, "sigsuspend returned %d errno %d \n", retval, errno);
|
||||
assert(FALSE); /* With full signal mask, we should never return here. */
|
||||
}
|
||||
#endif /* ! __WIN__ */
|
||||
|
||||
|
||||
void _db_lock_file_()
|
||||
{
|
||||
CODE_STATE *cs=0;
|
||||
|
@ -122,6 +122,7 @@ extern "C" {
|
||||
#define CANT_DELETE_OPEN_FILES 1
|
||||
|
||||
#define FN_LIBCHAR '\\'
|
||||
#define FN_DIRSEP "/\\" /* Valid directory separators */
|
||||
#define FN_ROOTDIR "\\"
|
||||
#define FN_DEVCHAR ':'
|
||||
|
||||
|
@ -332,6 +332,7 @@ inline ulonglong double2ulonglong(double d)
|
||||
/* File name handling */
|
||||
|
||||
#define FN_LIBCHAR '\\'
|
||||
#define FN_DIRSEP "/\\" /* Valid directory separators */
|
||||
#define FN_ROOTDIR "\\"
|
||||
#define FN_DEVCHAR ':'
|
||||
#define FN_NETWORK_DRIVES /* Uses \\ to indicate network drives */
|
||||
|
@ -464,6 +464,8 @@ extern my_bool my_parse_charset_xml(const char *bug, size_t len,
|
||||
int (*add)(CHARSET_INFO *cs));
|
||||
extern char *my_strchr(CHARSET_INFO *cs, const char *str, const char *end,
|
||||
pchar c);
|
||||
extern size_t my_strcspn(CHARSET_INFO *cs, const char *str, const char *end,
|
||||
const char *accept);
|
||||
|
||||
my_bool my_propagate_simple(CHARSET_INFO *cs, const uchar *str, size_t len);
|
||||
my_bool my_propagate_complex(CHARSET_INFO *cs, const uchar *str, size_t len);
|
||||
|
@ -160,7 +160,8 @@ extern void _db_flush_();
|
||||
#ifdef __WIN__
|
||||
#define DBUG_SUICIDE() DBUG_ABORT()
|
||||
#else
|
||||
#define DBUG_SUICIDE() (_db_flush_(), kill(getpid(), SIGKILL), pause())
|
||||
extern void _db_suicide_();
|
||||
#define DBUG_SUICIDE() (_db_flush_(), _db_suicide_())
|
||||
#endif
|
||||
|
||||
#else /* No debugger */
|
||||
|
@ -758,6 +758,7 @@ typedef SOCKET_SIZE_TYPE size_socket;
|
||||
|
||||
#ifndef FN_LIBCHAR
|
||||
#define FN_LIBCHAR '/'
|
||||
#define FN_DIRSEP "/" /* Valid directory separators */
|
||||
#define FN_ROOTDIR "/"
|
||||
#endif
|
||||
#define MY_NFILE 64 /* This is only used to save filenames */
|
||||
|
@ -47,7 +47,7 @@ C_MODE_START
|
||||
#if defined(HAVE_STACKTRACE) || defined(HAVE_BACKTRACE)
|
||||
void my_init_stacktrace();
|
||||
void my_print_stacktrace(uchar* stack_bottom, ulong thread_stack);
|
||||
void my_safe_print_str(const char* name, const char* val, int max_len);
|
||||
void my_safe_print_str(const char* val, int max_len);
|
||||
void my_write_core(int sig);
|
||||
#if BACKTRACE_DEMANGLE
|
||||
char *my_demangle(const char *mangled_name, int *status);
|
||||
|
@ -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 */
|
||||
|
@ -1,2 +1,2 @@
|
||||
perl mysql-test-run.pl --timer --force --comment=1st --experimental=collections/default.experimental 1st
|
||||
perl mysql-test-run.pl --timer --force --comment=big-tests --experimental=collections/default.experimental --vardir=var-big-tests --big-test --testcase-timeout=60 --suite-timeout=600 parts.partition_alter1_2_ndb parts.part_supported_sql_func_innodb parts.partition_alter1_2_innodb parts.partition_alter4_innodb parts.partition_alter1_1_2_ndb parts.partition_alter1_1_2_innodb parts.partition_alter1_1_ndb large_tests.alter_table rpl_ndb.rpl_truncate_7ndb_2 main.archive-big main.sum_distinct-big main.mysqlbinlog_row_big main.alter_table-big main.variables-big main.type_newdecimal-big main.read_many_rows_innodb main.log_tables-big main.count_distinct3 main.events_time_zone main.merge-big main.create-big main.events_stress main.ssl-big
|
||||
perl mysql-test-run.pl --timer --force --comment=big-tests --experimental=collections/default.experimental --vardir=var-big-tests --big-test --testcase-timeout=60 --suite-timeout=600 parts.partition_alter1_2_ndb parts.part_supported_sql_func_innodb parts.partition_alter1_2_innodb parts.partition_alter4_innodb parts.partition_alter1_1_2_ndb parts.partition_alter1_1_2_innodb parts.partition_alter1_1_ndb rpl_ndb.rpl_truncate_7ndb_2 main.archive-big main.sum_distinct-big main.mysqlbinlog_row_big main.alter_table-big main.variables-big main.type_newdecimal-big main.read_many_rows_innodb main.log_tables-big main.count_distinct3 main.events_time_zone main.merge-big main.create-big main.events_stress main.ssl-big
|
||||
|
@ -302,5 +302,58 @@ BINLOG '
|
||||
SHOW BINLOG EVENTS;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo
|
||||
--echo # BUG#54903 BINLOG statement toggles session variables
|
||||
--echo # ----------------------------------------------------------------------
|
||||
--echo # This test verify that BINLOG statement doesn't change current session's
|
||||
--echo # variables foreign_key_checks and unique_checks.
|
||||
--echo
|
||||
CREATE TABLE t1 (c1 INT KEY);
|
||||
|
||||
SET @@SESSION.foreign_key_checks= ON;
|
||||
SET @@SESSION.unique_checks= ON;
|
||||
|
||||
--echo # INSERT INTO t1 VALUES (1)
|
||||
--echo # foreign_key_checks=0 and unique_checks=0
|
||||
BINLOG '
|
||||
dfLtTBMBAAAAKQAAANcAAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE=
|
||||
dfLtTBcBAAAAIgAAAPkAAAAAABcAAAAAAAcAAf/+AQAAAA==
|
||||
';
|
||||
|
||||
SELECT * FROM t1;
|
||||
--echo # Their values should be ON
|
||||
SHOW SESSION VARIABLES LIKE "%_checks";
|
||||
|
||||
--echo
|
||||
SET @@SESSION.foreign_key_checks= OFF;
|
||||
SET @@SESSION.unique_checks= OFF;
|
||||
|
||||
--echo # INSERT INTO t1 VALUES(2)
|
||||
--echo # foreign_key_checks=1 and unique_checks=1
|
||||
BINLOG '
|
||||
dfLtTBMBAAAAKQAAAKsBAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE=
|
||||
dfLtTBcBAAAAIgAAAM0BAAAAABcAAAAAAAEAAf/+AgAAAA==
|
||||
';
|
||||
|
||||
SELECT * FROM t1;
|
||||
--echo # Their values should be OFF
|
||||
SHOW SESSION VARIABLES LIKE "%_checks";
|
||||
|
||||
--echo # INSERT INTO t1 VALUES(2)
|
||||
--echo # foreign_key_checks=1 and unique_checks=1
|
||||
--echo # It should not change current session's variables, even error happens
|
||||
--error 1062
|
||||
BINLOG '
|
||||
dfLtTBMBAAAAKQAAAKsBAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE=
|
||||
dfLtTBcBAAAAIgAAAM0BAAAAABcAAAAAAAEAAf/+AgAAAA==
|
||||
';
|
||||
|
||||
SELECT * FROM t1;
|
||||
--echo # Their values should be OFF
|
||||
SHOW SESSION VARIABLES LIKE "%_checks";
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
disconnect fresh;
|
||||
|
||||
|
@ -60,6 +60,7 @@
|
||||
# Please, remove this test case after pushing WL#2687.
|
||||
################################################################################
|
||||
|
||||
RESET MASTER;
|
||||
|
||||
--echo ###################################################################################
|
||||
--echo # CONFIGURATION
|
||||
|
@ -53,9 +53,7 @@ source include/wait_for_slave_to_start.inc;
|
||||
connection master;
|
||||
# Write file to make mysql-test-run.pl expect the "crash", but don't start
|
||||
# it until it's told to
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
wait
|
||||
EOF
|
||||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
|
||||
# Send shutdown to the connected server and give
|
||||
# it 10 seconds to die before zapping it
|
||||
@ -85,9 +83,7 @@ source include/wait_for_slave_io_error.inc;
|
||||
eval set @@global.debug = "-d,$dbug_sync_point";
|
||||
|
||||
# Write file to make mysql-test-run.pl start up the server again
|
||||
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
restart
|
||||
EOF
|
||||
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
|
||||
connection master;
|
||||
# Turn on reconnect
|
||||
|
46
mysql-test/include/ctype_8bit.inc
Normal file
46
mysql-test/include/ctype_8bit.inc
Normal file
@ -0,0 +1,46 @@
|
||||
#
|
||||
# Test Unicode conversion, upper, lower
|
||||
#
|
||||
SELECT @@collation_connection;
|
||||
CREATE TABLE t1 AS SELECT ' ' AS a LIMIT 0;
|
||||
INSERT INTO t1 VALUES (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07);
|
||||
INSERT INTO t1 VALUES (0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
|
||||
INSERT INTO t1 VALUES (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17);
|
||||
INSERT INTO t1 VALUES (0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
|
||||
INSERT INTO t1 VALUES (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27);
|
||||
INSERT INTO t1 VALUES (0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
|
||||
INSERT INTO t1 VALUES (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37);
|
||||
INSERT INTO t1 VALUES (0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
|
||||
INSERT INTO t1 VALUES (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47);
|
||||
INSERT INTO t1 VALUES (0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
|
||||
INSERT INTO t1 VALUES (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57);
|
||||
INSERT INTO t1 VALUES (0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
|
||||
INSERT INTO t1 VALUES (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67);
|
||||
INSERT INTO t1 VALUES (0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
|
||||
INSERT INTO t1 VALUES (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77);
|
||||
INSERT INTO t1 VALUES (0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
|
||||
INSERT INTO t1 VALUES (0x80),(0x81),(0x82),(0x83),(0x84),(0x85),(0x86),(0x87);
|
||||
INSERT INTO t1 VALUES (0x88),(0x89),(0x8A),(0x8B),(0x8C),(0x8D),(0x8E),(0x8F);
|
||||
INSERT INTO t1 VALUES (0x90),(0x91),(0x92),(0x93),(0x94),(0x95),(0x96),(0x97);
|
||||
INSERT INTO t1 VALUES (0x98),(0x99),(0x9A),(0x9B),(0x9C),(0x9D),(0x9E),(0x9F);
|
||||
INSERT INTO t1 VALUES (0xA0),(0xA1),(0xA2),(0xA3),(0xA4),(0xA5),(0xA6),(0xA7);
|
||||
INSERT INTO t1 VALUES (0xA8),(0xA9),(0xAA),(0xAB),(0xAC),(0xAD),(0xAE),(0xAF);
|
||||
INSERT INTO t1 VALUES (0xB0),(0xB1),(0xB2),(0xB3),(0xB4),(0xB5),(0xB6),(0xB7);
|
||||
INSERT INTO t1 VALUES (0xB8),(0xB9),(0xBA),(0xBB),(0xBC),(0xBD),(0xBE),(0xBF);
|
||||
INSERT INTO t1 VALUES (0xC0),(0xC1),(0xC2),(0xC3),(0xC4),(0xC5),(0xC6),(0xC7);
|
||||
INSERT INTO t1 VALUES (0xC8),(0xC9),(0xCA),(0xCB),(0xCC),(0xCD),(0xCE),(0xCF);
|
||||
INSERT INTO t1 VALUES (0xD0),(0xD1),(0xD2),(0xD3),(0xD4),(0xD5),(0xD6),(0xD7);
|
||||
INSERT INTO t1 VALUES (0xD8),(0xD9),(0xDA),(0xDB),(0xDC),(0xDD),(0xDE),(0xDF);
|
||||
INSERT INTO t1 VALUES (0xE0),(0xE1),(0xE2),(0xE3),(0xE4),(0xE5),(0xE6),(0xE7);
|
||||
INSERT INTO t1 VALUES (0xE8),(0xE9),(0xEA),(0xEB),(0xEC),(0xED),(0xEE),(0xEF);
|
||||
INSERT INTO t1 VALUES (0xF0),(0xF1),(0xF2),(0xF3),(0xF4),(0xF5),(0xF6),(0xF7);
|
||||
INSERT INTO t1 VALUES (0xF8),(0xF9),(0xFA),(0xFB),(0xFC),(0xFD),(0xFE),(0xFF);
|
||||
SELECT
|
||||
HEX(a) AS chr,
|
||||
HEX(LOWER(a)) AS upper,
|
||||
HEX(LOWER(a)) AS lower,
|
||||
HEX(@utf8:=CONVERT(a USING utf8)) AS utf8,
|
||||
HEX(@roundtrip:=CAST(@utf8 AS CHAR)) AS roundtrip,
|
||||
if(a=BINARY @roundtrip,'','Round trip unsafe') AS issafe
|
||||
FROM t1 ORDER BY chr;
|
||||
DROP TABLE t1;
|
21
mysql-test/include/io_thd_fault_injection.inc
Normal file
21
mysql-test/include/io_thd_fault_injection.inc
Normal file
@ -0,0 +1,21 @@
|
||||
#
|
||||
# Takes the flag as an argument:
|
||||
# -- let $io_thd_injection_fault_flag=+d,fault_injection_new_file_rotate_event
|
||||
# -- source include/io_thd_fault_injection.inc
|
||||
#
|
||||
|
||||
SET @old_debug=@@global.debug;
|
||||
-- disable_warnings
|
||||
-- source include/stop_slave.inc
|
||||
-- enable_warnings
|
||||
-- eval SET GLOBAL debug="+d,$io_thd_injection_fault_flag"
|
||||
|
||||
START SLAVE io_thread;
|
||||
-- source include/wait_for_slave_io_to_stop.inc
|
||||
-- source include/wait_for_slave_io_error.inc
|
||||
|
||||
-- eval SET GLOBAL debug="-d,$io_thd_injection_fault_flag"
|
||||
SET GLOBAL debug=@old_debug;
|
||||
|
||||
# restart because slave is in bad shape
|
||||
-- source include/restart_mysqld.inc
|
@ -1,18 +1,16 @@
|
||||
|
||||
# Write file to make mysql-test-run.pl expect the "crash", but don't start
|
||||
# it until it's told to
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
wait
|
||||
EOF
|
||||
--let $_server_id= `SELECT @@server_id`
|
||||
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect
|
||||
--exec echo "wait" > $_expect_file_name
|
||||
|
||||
# Send shutdown to the connected server and give
|
||||
# it 10 seconds to die before zapping it
|
||||
shutdown_server 10;
|
||||
|
||||
# Write file to make mysql-test-run.pl start up the server again
|
||||
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
restart
|
||||
EOF
|
||||
--exec echo "restart" > $_expect_file_name
|
||||
|
||||
# Turn on reconnect
|
||||
--enable_reconnect
|
||||
|
@ -143,7 +143,7 @@ sub collect_test_cases ($$$) {
|
||||
{
|
||||
last unless $opt_reorder;
|
||||
# test->{name} is always in suite.name format
|
||||
if ( $test->{name} =~ /.*\.$tname/ )
|
||||
if ( $test->{name} =~ /^$sname.*\.$tname$/ )
|
||||
{
|
||||
$found= 1;
|
||||
last;
|
||||
|
@ -569,7 +569,10 @@ sub run_test_server ($$$) {
|
||||
if ( !$opt_force ) {
|
||||
# Test has failed, force is off
|
||||
push(@$completed, $result);
|
||||
return $completed;
|
||||
return $completed unless $result->{'dont_kill_server'};
|
||||
# Prevent kill of server, to get valgrind report
|
||||
print $sock "BYE\n";
|
||||
next;
|
||||
}
|
||||
elsif ($opt_max_test_fail > 0 and
|
||||
$num_failed_test >= $opt_max_test_fail) {
|
||||
@ -809,13 +812,14 @@ sub run_worker ($) {
|
||||
elsif ($line eq 'BYE'){
|
||||
mtr_report("Server said BYE");
|
||||
stop_all_servers($opt_shutdown_timeout);
|
||||
my $valgrind_reports= 0;
|
||||
if ($opt_valgrind_mysqld) {
|
||||
valgrind_exit_reports();
|
||||
$valgrind_reports= valgrind_exit_reports();
|
||||
}
|
||||
if ( $opt_gprof ) {
|
||||
gprof_collect (find_mysqld($basedir), keys %gprof_dirs);
|
||||
}
|
||||
exit(0);
|
||||
exit($valgrind_reports);
|
||||
}
|
||||
else {
|
||||
mtr_error("Could not understand server, '$line'");
|
||||
@ -860,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
|
||||
@ -896,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
|
||||
@ -988,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,
|
||||
);
|
||||
|
||||
@ -3690,7 +3696,6 @@ sub run_testcase ($) {
|
||||
# ----------------------------------------------------
|
||||
# Check if it was an expected crash
|
||||
# ----------------------------------------------------
|
||||
SRVDIED:
|
||||
my $check_crash = check_expected_crash_and_restart($proc);
|
||||
if ($check_crash)
|
||||
{
|
||||
@ -3700,6 +3705,7 @@ sub run_testcase ($) {
|
||||
next;
|
||||
}
|
||||
|
||||
SRVDIED:
|
||||
# ----------------------------------------------------
|
||||
# Stop the test case timer
|
||||
# ----------------------------------------------------
|
||||
@ -4249,7 +4255,12 @@ sub after_failure ($) {
|
||||
sub report_failure_and_restart ($) {
|
||||
my $tinfo= shift;
|
||||
|
||||
stop_all_servers();
|
||||
if ($opt_valgrind_mysqld && ($tinfo->{'warnings'} || $tinfo->{'timeout'})) {
|
||||
# In these cases we may want valgrind report from normal termination
|
||||
$tinfo->{'dont_kill_server'}= 1;
|
||||
}
|
||||
# Shotdown properly if not to be killed (for valgrind)
|
||||
stop_all_servers($tinfo->{'dont_kill_server'} ? $opt_shutdown_timeout : 0);
|
||||
|
||||
$tinfo->{'result'}= 'MTR_RES_FAILED';
|
||||
|
||||
@ -5376,6 +5387,8 @@ sub valgrind_arguments {
|
||||
#
|
||||
|
||||
sub valgrind_exit_reports() {
|
||||
my $found_err= 0;
|
||||
|
||||
foreach my $log_file (keys %mysqld_logs)
|
||||
{
|
||||
my @culprits= ();
|
||||
@ -5411,7 +5424,7 @@ sub valgrind_exit_reports() {
|
||||
next;
|
||||
}
|
||||
# This line marks the start of a valgrind report
|
||||
$found_report= 1 if $line =~ /ERROR SUMMARY:/;
|
||||
$found_report= 1 if $line =~ /^==\d+== .* SUMMARY:/;
|
||||
|
||||
if ($found_report) {
|
||||
$line=~ s/^==\d+== //;
|
||||
@ -5428,8 +5441,11 @@ sub valgrind_exit_reports() {
|
||||
mtr_print ("Valgrind report from $log_file after tests:\n", @culprits);
|
||||
mtr_print_line();
|
||||
print ("$valgrind_rep\n");
|
||||
$found_err= 1;
|
||||
}
|
||||
}
|
||||
|
||||
return $found_err;
|
||||
}
|
||||
|
||||
#
|
||||
@ -5463,7 +5479,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
|
||||
@ -5554,7 +5570,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
|
||||
@ -5587,7 +5603,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
|
||||
@ -5627,6 +5643,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
|
||||
@ -5635,6 +5652,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);
|
||||
|
||||
|
@ -476,3 +476,24 @@ SELECT a FROM t2;
|
||||
a
|
||||
2
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# Bug#39828 autoinc wraps around when offset and increment > 1
|
||||
#
|
||||
CREATE TABLE t1 (c1 BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(c1)) engine=MyISAM;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
INSERT INTO t1 VALUES (18446744073709551601);
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=10;
|
||||
SELECT @@SESSION.AUTO_INCREMENT_OFFSET;
|
||||
@@SESSION.AUTO_INCREMENT_OFFSET
|
||||
1
|
||||
INSERT INTO t1 VALUES (NULL), (NULL), (NULL);
|
||||
ERROR 22003: Out of range value for column 't1' at row 167
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
18446744073709551601
|
||||
18446744073709551611
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=default;
|
||||
SET @@SESSION.AUTO_INCREMENT_OFFSET=default;
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
|
@ -18,7 +18,7 @@ change_user
|
||||
SELECT @@session.sql_big_selects;
|
||||
@@session.sql_big_selects
|
||||
0
|
||||
SET @@global.max_join_size = -1;
|
||||
SET @@global.max_join_size = 18446744073709551615;
|
||||
SET @@session.max_join_size = default;
|
||||
change_user
|
||||
SELECT @@session.sql_big_selects;
|
||||
|
@ -215,6 +215,17 @@ SET GLOBAL event_scheduler = OFF;
|
||||
|
||||
# -- End of Bug#35074.
|
||||
|
||||
#
|
||||
# -- Bug#49752: 2469.126.2 unintentionally breaks authentication
|
||||
# against MySQL 5.1 server
|
||||
#
|
||||
GRANT ALL ON test.* TO 'Azundris12345678'@'localhost' IDENTIFIED BY 'test123';
|
||||
FLUSH PRIVILEGES;
|
||||
DROP USER 'Azundris12345678'@'localhost';
|
||||
FLUSH PRIVILEGES;
|
||||
#
|
||||
# -- End of Bug#49752
|
||||
#
|
||||
# ------------------------------------------------------------------
|
||||
# -- End of 5.1 tests
|
||||
# ------------------------------------------------------------------
|
||||
|
@ -70,3 +70,311 @@ we_ivo NULL
|
||||
we_martin NULL
|
||||
we_toshko NULL
|
||||
drop table t1;
|
||||
#
|
||||
# Start of 5.1 tests
|
||||
#
|
||||
SELECT @@collation_connection;
|
||||
@@collation_connection
|
||||
cp1251_general_ci
|
||||
CREATE TABLE t1 AS SELECT ' ' AS a LIMIT 0;
|
||||
INSERT INTO t1 VALUES (0x00),(0x01),(0x02),(0x03),(0x04),(0x05),(0x06),(0x07);
|
||||
INSERT INTO t1 VALUES (0x08),(0x09),(0x0A),(0x0B),(0x0C),(0x0D),(0x0E),(0x0F);
|
||||
INSERT INTO t1 VALUES (0x10),(0x11),(0x12),(0x13),(0x14),(0x15),(0x16),(0x17);
|
||||
INSERT INTO t1 VALUES (0x18),(0x19),(0x1A),(0x1B),(0x1C),(0x1D),(0x1E),(0x1F);
|
||||
INSERT INTO t1 VALUES (0x20),(0x21),(0x22),(0x23),(0x24),(0x25),(0x26),(0x27);
|
||||
INSERT INTO t1 VALUES (0x28),(0x29),(0x2A),(0x2B),(0x2C),(0x2D),(0x2E),(0x2F);
|
||||
INSERT INTO t1 VALUES (0x30),(0x31),(0x32),(0x33),(0x34),(0x35),(0x36),(0x37);
|
||||
INSERT INTO t1 VALUES (0x38),(0x39),(0x3A),(0x3B),(0x3C),(0x3D),(0x3E),(0x3F);
|
||||
INSERT INTO t1 VALUES (0x40),(0x41),(0x42),(0x43),(0x44),(0x45),(0x46),(0x47);
|
||||
INSERT INTO t1 VALUES (0x48),(0x49),(0x4A),(0x4B),(0x4C),(0x4D),(0x4E),(0x4F);
|
||||
INSERT INTO t1 VALUES (0x50),(0x51),(0x52),(0x53),(0x54),(0x55),(0x56),(0x57);
|
||||
INSERT INTO t1 VALUES (0x58),(0x59),(0x5A),(0x5B),(0x5C),(0x5D),(0x5E),(0x5F);
|
||||
INSERT INTO t1 VALUES (0x60),(0x61),(0x62),(0x63),(0x64),(0x65),(0x66),(0x67);
|
||||
INSERT INTO t1 VALUES (0x68),(0x69),(0x6A),(0x6B),(0x6C),(0x6D),(0x6E),(0x6F);
|
||||
INSERT INTO t1 VALUES (0x70),(0x71),(0x72),(0x73),(0x74),(0x75),(0x76),(0x77);
|
||||
INSERT INTO t1 VALUES (0x78),(0x79),(0x7A),(0x7B),(0x7C),(0x7D),(0x7E),(0x7F);
|
||||
INSERT INTO t1 VALUES (0x80),(0x81),(0x82),(0x83),(0x84),(0x85),(0x86),(0x87);
|
||||
INSERT INTO t1 VALUES (0x88),(0x89),(0x8A),(0x8B),(0x8C),(0x8D),(0x8E),(0x8F);
|
||||
INSERT INTO t1 VALUES (0x90),(0x91),(0x92),(0x93),(0x94),(0x95),(0x96),(0x97);
|
||||
INSERT INTO t1 VALUES (0x98),(0x99),(0x9A),(0x9B),(0x9C),(0x9D),(0x9E),(0x9F);
|
||||
INSERT INTO t1 VALUES (0xA0),(0xA1),(0xA2),(0xA3),(0xA4),(0xA5),(0xA6),(0xA7);
|
||||
INSERT INTO t1 VALUES (0xA8),(0xA9),(0xAA),(0xAB),(0xAC),(0xAD),(0xAE),(0xAF);
|
||||
INSERT INTO t1 VALUES (0xB0),(0xB1),(0xB2),(0xB3),(0xB4),(0xB5),(0xB6),(0xB7);
|
||||
INSERT INTO t1 VALUES (0xB8),(0xB9),(0xBA),(0xBB),(0xBC),(0xBD),(0xBE),(0xBF);
|
||||
INSERT INTO t1 VALUES (0xC0),(0xC1),(0xC2),(0xC3),(0xC4),(0xC5),(0xC6),(0xC7);
|
||||
INSERT INTO t1 VALUES (0xC8),(0xC9),(0xCA),(0xCB),(0xCC),(0xCD),(0xCE),(0xCF);
|
||||
INSERT INTO t1 VALUES (0xD0),(0xD1),(0xD2),(0xD3),(0xD4),(0xD5),(0xD6),(0xD7);
|
||||
INSERT INTO t1 VALUES (0xD8),(0xD9),(0xDA),(0xDB),(0xDC),(0xDD),(0xDE),(0xDF);
|
||||
INSERT INTO t1 VALUES (0xE0),(0xE1),(0xE2),(0xE3),(0xE4),(0xE5),(0xE6),(0xE7);
|
||||
INSERT INTO t1 VALUES (0xE8),(0xE9),(0xEA),(0xEB),(0xEC),(0xED),(0xEE),(0xEF);
|
||||
INSERT INTO t1 VALUES (0xF0),(0xF1),(0xF2),(0xF3),(0xF4),(0xF5),(0xF6),(0xF7);
|
||||
INSERT INTO t1 VALUES (0xF8),(0xF9),(0xFA),(0xFB),(0xFC),(0xFD),(0xFE),(0xFF);
|
||||
SELECT
|
||||
HEX(a) AS chr,
|
||||
HEX(LOWER(a)) AS upper,
|
||||
HEX(LOWER(a)) AS lower,
|
||||
HEX(@utf8:=CONVERT(a USING utf8)) AS utf8,
|
||||
HEX(@roundtrip:=CAST(@utf8 AS CHAR)) AS roundtrip,
|
||||
if(a=BINARY @roundtrip,'','Round trip unsafe') AS issafe
|
||||
FROM t1 ORDER BY chr;
|
||||
chr upper lower utf8 roundtrip issafe
|
||||
00 00 00 00 00
|
||||
01 01 01 01 01
|
||||
02 02 02 02 02
|
||||
03 03 03 03 03
|
||||
04 04 04 04 04
|
||||
05 05 05 05 05
|
||||
06 06 06 06 06
|
||||
07 07 07 07 07
|
||||
08 08 08 08 08
|
||||
09 09 09 09 09
|
||||
0A 0A 0A 0A 0A
|
||||
0B 0B 0B 0B 0B
|
||||
0C 0C 0C 0C 0C
|
||||
0D 0D 0D 0D 0D
|
||||
0E 0E 0E 0E 0E
|
||||
0F 0F 0F 0F 0F
|
||||
10 10 10 10 10
|
||||
11 11 11 11 11
|
||||
12 12 12 12 12
|
||||
13 13 13 13 13
|
||||
14 14 14 14 14
|
||||
15 15 15 15 15
|
||||
16 16 16 16 16
|
||||
17 17 17 17 17
|
||||
18 18 18 18 18
|
||||
19 19 19 19 19
|
||||
1A 1A 1A 1A 1A
|
||||
1B 1B 1B 1B 1B
|
||||
1C 1C 1C 1C 1C
|
||||
1D 1D 1D 1D 1D
|
||||
1E 1E 1E 1E 1E
|
||||
1F 1F 1F 1F 1F
|
||||
20 20 20 20 20
|
||||
21 21 21 21 21
|
||||
22 22 22 22 22
|
||||
23 23 23 23 23
|
||||
24 24 24 24 24
|
||||
25 25 25 25 25
|
||||
26 26 26 26 26
|
||||
27 27 27 27 27
|
||||
28 28 28 28 28
|
||||
29 29 29 29 29
|
||||
2A 2A 2A 2A 2A
|
||||
2B 2B 2B 2B 2B
|
||||
2C 2C 2C 2C 2C
|
||||
2D 2D 2D 2D 2D
|
||||
2E 2E 2E 2E 2E
|
||||
2F 2F 2F 2F 2F
|
||||
30 30 30 30 30
|
||||
31 31 31 31 31
|
||||
32 32 32 32 32
|
||||
33 33 33 33 33
|
||||
34 34 34 34 34
|
||||
35 35 35 35 35
|
||||
36 36 36 36 36
|
||||
37 37 37 37 37
|
||||
38 38 38 38 38
|
||||
39 39 39 39 39
|
||||
3A 3A 3A 3A 3A
|
||||
3B 3B 3B 3B 3B
|
||||
3C 3C 3C 3C 3C
|
||||
3D 3D 3D 3D 3D
|
||||
3E 3E 3E 3E 3E
|
||||
3F 3F 3F 3F 3F
|
||||
40 40 40 40 40
|
||||
41 61 61 41 41
|
||||
42 62 62 42 42
|
||||
43 63 63 43 43
|
||||
44 64 64 44 44
|
||||
45 65 65 45 45
|
||||
46 66 66 46 46
|
||||
47 67 67 47 47
|
||||
48 68 68 48 48
|
||||
49 69 69 49 49
|
||||
4A 6A 6A 4A 4A
|
||||
4B 6B 6B 4B 4B
|
||||
4C 6C 6C 4C 4C
|
||||
4D 6D 6D 4D 4D
|
||||
4E 6E 6E 4E 4E
|
||||
4F 6F 6F 4F 4F
|
||||
50 70 70 50 50
|
||||
51 71 71 51 51
|
||||
52 72 72 52 52
|
||||
53 73 73 53 53
|
||||
54 74 74 54 54
|
||||
55 75 75 55 55
|
||||
56 76 76 56 56
|
||||
57 77 77 57 57
|
||||
58 78 78 58 58
|
||||
59 79 79 59 59
|
||||
5A 7A 7A 5A 5A
|
||||
5B 5B 5B 5B 5B
|
||||
5C 5C 5C 5C 5C
|
||||
5D 5D 5D 5D 5D
|
||||
5E 5E 5E 5E 5E
|
||||
5F 5F 5F 5F 5F
|
||||
60 60 60 60 60
|
||||
61 61 61 61 61
|
||||
62 62 62 62 62
|
||||
63 63 63 63 63
|
||||
64 64 64 64 64
|
||||
65 65 65 65 65
|
||||
66 66 66 66 66
|
||||
67 67 67 67 67
|
||||
68 68 68 68 68
|
||||
69 69 69 69 69
|
||||
6A 6A 6A 6A 6A
|
||||
6B 6B 6B 6B 6B
|
||||
6C 6C 6C 6C 6C
|
||||
6D 6D 6D 6D 6D
|
||||
6E 6E 6E 6E 6E
|
||||
6F 6F 6F 6F 6F
|
||||
70 70 70 70 70
|
||||
71 71 71 71 71
|
||||
72 72 72 72 72
|
||||
73 73 73 73 73
|
||||
74 74 74 74 74
|
||||
75 75 75 75 75
|
||||
76 76 76 76 76
|
||||
77 77 77 77 77
|
||||
78 78 78 78 78
|
||||
79 79 79 79 79
|
||||
7A 7A 7A 7A 7A
|
||||
7B 7B 7B 7B 7B
|
||||
7C 7C 7C 7C 7C
|
||||
7D 7D 7D 7D 7D
|
||||
7E 7E 7E 7E 7E
|
||||
7F 7F 7F 7F 7F
|
||||
80 90 90 D082 80
|
||||
81 83 83 D083 81
|
||||
82 82 82 E2809A 82
|
||||
83 83 83 D193 83
|
||||
84 84 84 E2809E 84
|
||||
85 85 85 E280A6 85
|
||||
86 86 86 E280A0 86
|
||||
87 87 87 E280A1 87
|
||||
88 88 88 E282AC 88
|
||||
89 89 89 E280B0 89
|
||||
8A 9A 9A D089 8A
|
||||
8B 8B 8B E280B9 8B
|
||||
8C 9C 9C D08A 8C
|
||||
8D 9D 9D D08C 8D
|
||||
8E 9E 9E D08B 8E
|
||||
8F 9F 9F D08F 8F
|
||||
90 90 90 D192 90
|
||||
91 91 91 E28098 91
|
||||
92 92 92 E28099 92
|
||||
93 93 93 E2809C 93
|
||||
94 94 94 E2809D 94
|
||||
95 95 95 E280A2 95
|
||||
96 96 96 E28093 96
|
||||
97 97 97 E28094 97
|
||||
98 98 98 3F 3F Round trip unsafe
|
||||
99 99 99 E284A2 99
|
||||
9A 9A 9A D199 9A
|
||||
9B 9B 9B E280BA 9B
|
||||
9C 9C 9C D19A 9C
|
||||
9D 9D 9D D19C 9D
|
||||
9E 9E 9E D19B 9E
|
||||
9F 9F 9F D19F 9F
|
||||
A0 A0 A0 C2A0 A0
|
||||
A1 A2 A2 D08E A1
|
||||
A2 A2 A2 D19E A2
|
||||
A3 BC BC D088 A3
|
||||
A4 A4 A4 C2A4 A4
|
||||
A5 B4 B4 D290 A5
|
||||
A6 A6 A6 C2A6 A6
|
||||
A7 A7 A7 C2A7 A7
|
||||
A8 B8 B8 D081 A8
|
||||
A9 A9 A9 C2A9 A9
|
||||
AA BA BA D084 AA
|
||||
AB AB AB C2AB AB
|
||||
AC AC AC C2AC AC
|
||||
AD AD AD C2AD AD
|
||||
AE AE AE C2AE AE
|
||||
AF BF BF D087 AF
|
||||
B0 B0 B0 C2B0 B0
|
||||
B1 B1 B1 C2B1 B1
|
||||
B2 B3 B3 D086 B2
|
||||
B3 B3 B3 D196 B3
|
||||
B4 B4 B4 D291 B4
|
||||
B5 B5 B5 C2B5 B5
|
||||
B6 B6 B6 C2B6 B6
|
||||
B7 B7 B7 C2B7 B7
|
||||
B8 B8 B8 D191 B8
|
||||
B9 B9 B9 E28496 B9
|
||||
BA BA BA D194 BA
|
||||
BB BB BB C2BB BB
|
||||
BC BC BC D198 BC
|
||||
BD BE BE D085 BD
|
||||
BE BE BE D195 BE
|
||||
BF BF BF D197 BF
|
||||
C0 E0 E0 D090 C0
|
||||
C1 E1 E1 D091 C1
|
||||
C2 E2 E2 D092 C2
|
||||
C3 E3 E3 D093 C3
|
||||
C4 E4 E4 D094 C4
|
||||
C5 E5 E5 D095 C5
|
||||
C6 E6 E6 D096 C6
|
||||
C7 E7 E7 D097 C7
|
||||
C8 E8 E8 D098 C8
|
||||
C9 E9 E9 D099 C9
|
||||
CA EA EA D09A CA
|
||||
CB EB EB D09B CB
|
||||
CC EC EC D09C CC
|
||||
CD ED ED D09D CD
|
||||
CE EE EE D09E CE
|
||||
CF EF EF D09F CF
|
||||
D0 F0 F0 D0A0 D0
|
||||
D1 F1 F1 D0A1 D1
|
||||
D2 F2 F2 D0A2 D2
|
||||
D3 F3 F3 D0A3 D3
|
||||
D4 F4 F4 D0A4 D4
|
||||
D5 F5 F5 D0A5 D5
|
||||
D6 F6 F6 D0A6 D6
|
||||
D7 F7 F7 D0A7 D7
|
||||
D8 F8 F8 D0A8 D8
|
||||
D9 F9 F9 D0A9 D9
|
||||
DA FA FA D0AA DA
|
||||
DB FB FB D0AB DB
|
||||
DC FC FC D0AC DC
|
||||
DD FD FD D0AD DD
|
||||
DE FE FE D0AE DE
|
||||
DF FF FF D0AF DF
|
||||
E0 E0 E0 D0B0 E0
|
||||
E1 E1 E1 D0B1 E1
|
||||
E2 E2 E2 D0B2 E2
|
||||
E3 E3 E3 D0B3 E3
|
||||
E4 E4 E4 D0B4 E4
|
||||
E5 E5 E5 D0B5 E5
|
||||
E6 E6 E6 D0B6 E6
|
||||
E7 E7 E7 D0B7 E7
|
||||
E8 E8 E8 D0B8 E8
|
||||
E9 E9 E9 D0B9 E9
|
||||
EA EA EA D0BA EA
|
||||
EB EB EB D0BB EB
|
||||
EC EC EC D0BC EC
|
||||
ED ED ED D0BD ED
|
||||
EE EE EE D0BE EE
|
||||
EF EF EF D0BF EF
|
||||
F0 F0 F0 D180 F0
|
||||
F1 F1 F1 D181 F1
|
||||
F2 F2 F2 D182 F2
|
||||
F3 F3 F3 D183 F3
|
||||
F4 F4 F4 D184 F4
|
||||
F5 F5 F5 D185 F5
|
||||
F6 F6 F6 D186 F6
|
||||
F7 F7 F7 D187 F7
|
||||
F8 F8 F8 D188 F8
|
||||
F9 F9 F9 D189 F9
|
||||
FA FA FA D18A FA
|
||||
FB FB FB D18B FB
|
||||
FC FC FC D18C FC
|
||||
FD FD FD D18D FD
|
||||
FE FE FE D18E FE
|
||||
FF FF FF D18F FF
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 5.1 tests
|
||||
#
|
||||
|
@ -400,4 +400,15 @@ SELECT 0 FROM
|
||||
(SELECT 0) t61;
|
||||
0
|
||||
0
|
||||
#
|
||||
# A nested materialized derived table is used before being populated.
|
||||
# (addon for bug#19077)
|
||||
#
|
||||
CREATE TABLE t1 (i INT, j BIGINT);
|
||||
INSERT INTO t1 VALUES (1, 2), (2, 2), (3, 2);
|
||||
SELECT * FROM (SELECT MIN(i) FROM t1
|
||||
WHERE j = SUBSTRING('12', (SELECT * FROM (SELECT MIN(j) FROM t1) t2))) t3;
|
||||
MIN(i)
|
||||
1
|
||||
DROP TABLE t1;
|
||||
# End of 5.0 tests
|
||||
|
@ -1037,4 +1037,16 @@ INSERT INTO t1 values (0),(0);
|
||||
SELECT POLYGON((SELECT 1 FROM (SELECT 1 IN (GROUP_CONCAT(t1.f1)) FROM t1, t1 t GROUP BY t.f1 ) d));
|
||||
ERROR 22007: Illegal non geometric '(select 1 from (select (1 = group_concat(`test`.`t1`.`f1` separator ',')) AS `1 IN (GROUP_CONCAT(t1.f1))` from `test`.`t1` join `test`.`t1` `t` group by `t`.`f1`) `d`)' value found during parsing
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#58396 group_concat and explain extended are still crashy
|
||||
#
|
||||
CREATE TABLE t1(a INT);
|
||||
EXPLAIN EXTENDED SELECT UPDATEXML('1', a, '1')
|
||||
FROM t1 ORDER BY (SELECT GROUP_CONCAT(1) FROM t1);
|
||||
ERROR HY000: Only constant XPATH queries are supported
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Error 1105 Only constant XPATH queries are supported
|
||||
Note 1003 select updatexml('1',`test`.`t1`.`a`,'1') AS `UPDATEXML('1', a, '1')` from `test`.`t1` order by (select group_concat(1 separator ',') from `test`.`t1`)
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
|
@ -2600,4 +2600,16 @@ ORDER BY QUOTE(t1.a);
|
||||
1
|
||||
1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#57913 large negative number to string conversion functions crash
|
||||
# Bug#57810 case/when/then : Assertion failed: length || !scale
|
||||
#
|
||||
SELECT '1' IN ('1', SUBSTRING(-9223372036854775809, 1));
|
||||
'1' IN ('1', SUBSTRING(-9223372036854775809, 1))
|
||||
1
|
||||
SELECT CONVERT(('' IN (REVERSE(CAST(('') AS DECIMAL)), '')), CHAR(3));
|
||||
CONVERT(('' IN (REVERSE(CAST(('') AS DECIMAL)), '')), CHAR(3))
|
||||
1
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||
End of 5.1 tests
|
||||
|
@ -334,8 +334,7 @@ test.t1 check status OK
|
||||
DROP TABLE t1,t2;
|
||||
set global key_cache_block_size= @my_key_cache_block_size;
|
||||
set @@global.key_buffer_size=0;
|
||||
Warnings:
|
||||
Warning 1438 Cannot drop default keycache
|
||||
ERROR HY000: Cannot drop default keycache
|
||||
select @@global.key_buffer_size;
|
||||
@@global.key_buffer_size
|
||||
2097152
|
||||
|
@ -2024,6 +2024,8 @@ SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE
|
||||
TABLE_SCHEMA = 'test' and TABLE_NAME='tm1';
|
||||
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
|
||||
NULL test tm1 BASE TABLE NULL NULL NULL # # # # # # # # # # NULL # # Unable to open underlying table which is differently defined or of non-MyISAM ty
|
||||
Warnings:
|
||||
Warning 1168 Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
|
||||
DROP TABLE tm1;
|
||||
CREATE TABLE t1(C1 INT, C2 INT, KEY C1(C1), KEY C2(C2)) ENGINE=MYISAM;
|
||||
CREATE TABLE t2(C1 INT, C2 INT, KEY C1(C1), KEY C2(C2)) ENGINE=MYISAM;
|
||||
|
@ -659,4 +659,15 @@ Error 1242 Subquery returns more than 1 row
|
||||
Error 1242 Subquery returns more than 1 row
|
||||
DROP TABLE t1, t2, t3;
|
||||
SET SESSION sql_safe_updates = DEFAULT;
|
||||
#
|
||||
# Bug#52157 various crashes and assertions with multi-table update, stored function
|
||||
#
|
||||
CREATE FUNCTION f1 () RETURNS BLOB RETURN 1;
|
||||
CREATE TABLE t1 (f1 DATE);
|
||||
INSERT INTO t1 VALUES('2001-01-01');
|
||||
UPDATE (SELECT 1 FROM t1 WHERE f1 = (SELECT f1() FROM t1)) x, t1 SET f1 = 1;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect datetime value: '1'
|
||||
DROP FUNCTION f1;
|
||||
DROP TABLE t1;
|
||||
end of tests
|
||||
|
@ -235,4 +235,73 @@ Bug #47147: mysql client option --skip-column-names does not apply to vertical o
|
||||
*************************** 1. row ***************************
|
||||
1
|
||||
|
||||
#
|
||||
# Bug #54899: --one-database option cannot handle DROP/CREATE DATABASE
|
||||
# commands.
|
||||
#
|
||||
CREATE DATABASE connected_db;
|
||||
USE connected_db;
|
||||
SHOW TABLES;
|
||||
Tables_in_connected_db
|
||||
table_in_connected_db
|
||||
DROP DATABASE connected_db;
|
||||
|
||||
#
|
||||
# Testing --one-database option
|
||||
#
|
||||
CREATE DATABASE connected_db;
|
||||
SHOW TABLES IN connected_db;
|
||||
Tables_in_connected_db
|
||||
t1
|
||||
SHOW TABLES IN test;
|
||||
Tables_in_test
|
||||
t1
|
||||
USE test;
|
||||
DROP TABLE t1;
|
||||
DROP DATABASE connected_db;
|
||||
|
||||
SHOW TABLES IN test;
|
||||
Tables_in_test
|
||||
SHOW TABLES IN test1;
|
||||
Tables_in_test1
|
||||
DROP DATABASE test1;
|
||||
|
||||
#
|
||||
# Checking --one-database option followed by the execution of
|
||||
# connect command.
|
||||
#
|
||||
CREATE DATABASE connected_db;
|
||||
SHOW TABLES IN connected_db;
|
||||
Tables_in_connected_db
|
||||
t1
|
||||
t2
|
||||
SHOW TABLES IN test;
|
||||
Tables_in_test
|
||||
t1
|
||||
t2
|
||||
DROP TABLE test.t1;
|
||||
DROP TABLE test.t2;
|
||||
DROP DATABASE connected_db;
|
||||
|
||||
#
|
||||
# Checking --one-database option with no database specified
|
||||
# at command-line.
|
||||
#
|
||||
SHOW TABLES IN test;
|
||||
Tables_in_test
|
||||
|
||||
#
|
||||
# Checking --one-database option with non_existent_db
|
||||
# specified with USE command
|
||||
#
|
||||
CREATE DATABASE connected_db;
|
||||
SHOW TABLES IN connected_db;
|
||||
Tables_in_connected_db
|
||||
table_in_connected_db
|
||||
|
||||
SHOW TABLES IN connected_db;
|
||||
Tables_in_connected_db
|
||||
table_in_connected_db
|
||||
DROP DATABASE connected_db;
|
||||
|
||||
End of tests
|
||||
|
@ -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'
|
||||
|
@ -8,3 +8,5 @@ ERROR 42000: DELETE command denied to user 'bug51770'@'localhost' for table 'plu
|
||||
GRANT DELETE ON mysql.plugin TO bug51770@localhost;
|
||||
UNINSTALL PLUGIN example;
|
||||
DROP USER bug51770@localhost;
|
||||
INSTALL PLUGIN example SONAME '../ha_example.so';
|
||||
ERROR HY000: No paths allowed for shared library
|
||||
|
@ -660,6 +660,8 @@ flush tables;
|
||||
SHOW TABLE STATUS like 't1';
|
||||
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
|
||||
t1 NULL NULL NULL NULL # # # # NULL NULL NULL NULL NULL NULL NULL NULL Incorrect information in file: './test/t1.frm'
|
||||
Warnings:
|
||||
Warning 1033 Incorrect information in file: './test/t1.frm'
|
||||
show create table t1;
|
||||
ERROR HY000: Incorrect information in file: './test/t1.frm'
|
||||
drop table if exists t1;
|
||||
|
@ -1511,4 +1511,37 @@ SELECT @@skip_name_resolve;
|
||||
SHOW VARIABLES LIKE 'skip_name_resolve';
|
||||
Variable_name Value
|
||||
skip_name_resolve OFF
|
||||
#
|
||||
# Bug #43233 : Some server variables are clipped during "update,"
|
||||
# not "check" stage
|
||||
#
|
||||
SET @kbs=@@global.key_buffer_size;
|
||||
SET @kcbs=@@global.key_cache_block_size;
|
||||
throw errors in STRICT mode
|
||||
SET SQL_MODE=STRICT_ALL_TABLES;
|
||||
SET @@global.max_binlog_cache_size=-1;
|
||||
ERROR 42000: Variable 'max_binlog_cache_size' can't be set to the value of '-1'
|
||||
SET @@global.max_join_size=0;
|
||||
ERROR 42000: Variable 'max_join_size' can't be set to the value of '0'
|
||||
SET @@global.key_buffer_size=0;
|
||||
ERROR HY000: Cannot drop default keycache
|
||||
SET @@global.key_cache_block_size=0;
|
||||
ERROR 42000: Variable 'key_cache_block_size' can't be set to the value of '0'
|
||||
throw warnings in default mode
|
||||
SET SQL_MODE=DEFAULT;
|
||||
SET @@global.max_binlog_cache_size=-1;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect max_binlog_cache_size value: '-1'
|
||||
SET @@global.max_join_size=0;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect max_join_size value: '0'
|
||||
SET @@global.key_buffer_size=0;
|
||||
ERROR HY000: Cannot drop default keycache
|
||||
SET @@global.key_cache_block_size=0;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect key_cache_block_size value: '0'
|
||||
SET @@global.max_binlog_cache_size=DEFAULT;
|
||||
SET @@global.max_join_size=DEFAULT;
|
||||
SET @@global.key_buffer_size=@kbs;
|
||||
SET @@global.key_cache_block_size=@kcbs;
|
||||
End of 5.1 tests
|
||||
|
@ -840,6 +840,8 @@ show table status;
|
||||
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
|
||||
t1 MyISAM 10 Fixed 0 0 0 # 1024 0 NULL # # NULL latin1_swedish_ci NULL
|
||||
v1 NULL NULL NULL NULL NULL NULL # NULL NULL NULL # # NULL NULL NULL NULL View 'test.v1' references invalid table(s) or column(s) or function(s) or define
|
||||
Warnings:
|
||||
Warning 1356 View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
create view v1 as select 99999999999999999999999999999999999999999999999999999 as col1;
|
||||
@ -3882,6 +3884,19 @@ CREATE VIEW v1 AS SELECT 1 from t1
|
||||
WHERE t1.b <=> (SELECT a FROM t1 WHERE a < SOME(SELECT '1'));
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#57703 create view cause Assertion failed: 0, file .\item_subselect.cc, line 846
|
||||
#
|
||||
CREATE TABLE t1(a int);
|
||||
CREATE VIEW v1 AS SELECT 1 FROM t1 GROUP BY
|
||||
SUBSTRING(1 FROM (SELECT 3 FROM t1 WHERE a >= ANY(SELECT 1)));
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#57352 valgrind warnings when creating view
|
||||
#
|
||||
CREATE VIEW v1 AS SELECT 1 IN (1 LIKE 2,0) AS f;
|
||||
DROP VIEW v1;
|
||||
# -----------------------------------------------------------------
|
||||
# -- End of 5.1 tests.
|
||||
# -----------------------------------------------------------------
|
||||
|
@ -2,7 +2,9 @@ call mtr.add_suppression('Attempting backtrace');
|
||||
call mtr.add_suppression('MSYQL_BIN_LOG::purge_logs failed to process registered files that would be purged.');
|
||||
call mtr.add_suppression('MSYQL_BIN_LOG::open failed to sync the index file');
|
||||
call mtr.add_suppression('Turning logging off for the whole duration of the MySQL server process.');
|
||||
call mtr.add_suppression('Could not open .*');
|
||||
call mtr.add_suppression('MSYQL_BIN_LOG::purge_logs failed to clean registers before purging logs.');
|
||||
RESET MASTER;
|
||||
flush logs;
|
||||
flush logs;
|
||||
flush logs;
|
||||
@ -116,11 +118,31 @@ master-bin.000011
|
||||
# This should put the server in unsafe state and stop
|
||||
# accepting any command. If we inject a fault at this
|
||||
# point and continue the execution the server crashes.
|
||||
# Besides the flush command does not report an error.
|
||||
#
|
||||
SET @index=LOAD_FILE('MYSQLTEST_VARDIR/mysqld.1/data//master-bin.index');
|
||||
SELECT @index;
|
||||
@index
|
||||
master-bin.000006
|
||||
master-bin.000007
|
||||
master-bin.000008
|
||||
master-bin.000009
|
||||
master-bin.000010
|
||||
master-bin.000011
|
||||
|
||||
# fault_injection_registering_index
|
||||
SET SESSION debug="+d,fault_injection_registering_index";
|
||||
flush logs;
|
||||
ERROR HY000: Can't open file: 'master-bin.000012' (errno: 1)
|
||||
SET @index=LOAD_FILE('MYSQLTEST_VARDIR/mysqld.1/data//master-bin.index');
|
||||
SELECT @index;
|
||||
@index
|
||||
master-bin.000006
|
||||
master-bin.000007
|
||||
master-bin.000008
|
||||
master-bin.000009
|
||||
master-bin.000010
|
||||
master-bin.000011
|
||||
|
||||
SET @index=LOAD_FILE('MYSQLTEST_VARDIR/mysqld.1/data//master-bin.index');
|
||||
SELECT @index;
|
||||
@index
|
||||
@ -135,6 +157,18 @@ master-bin.000012
|
||||
# fault_injection_updating_index
|
||||
SET SESSION debug="+d,fault_injection_updating_index";
|
||||
flush logs;
|
||||
ERROR HY000: Can't open file: 'master-bin.000013' (errno: 1)
|
||||
SET @index=LOAD_FILE('MYSQLTEST_VARDIR/mysqld.1/data//master-bin.index');
|
||||
SELECT @index;
|
||||
@index
|
||||
master-bin.000006
|
||||
master-bin.000007
|
||||
master-bin.000008
|
||||
master-bin.000009
|
||||
master-bin.000010
|
||||
master-bin.000011
|
||||
master-bin.000012
|
||||
|
||||
SET @index=LOAD_FILE('MYSQLTEST_VARDIR/mysqld.1/data//master-bin.index');
|
||||
SELECT @index;
|
||||
@index
|
||||
|
@ -1,3 +1,4 @@
|
||||
RESET MASTER;
|
||||
###################################################################################
|
||||
# CONFIGURATION
|
||||
###################################################################################
|
||||
|
@ -1330,3 +1330,62 @@ Log_name Pos Event_type Server_id End_log_pos Info
|
||||
# # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
# # Query 1 # COMMIT
|
||||
DROP TABLE t1;
|
||||
|
||||
# BUG#54903 BINLOG statement toggles session variables
|
||||
# ----------------------------------------------------------------------
|
||||
# This test verify that BINLOG statement doesn't change current session's
|
||||
# variables foreign_key_checks and unique_checks.
|
||||
|
||||
CREATE TABLE t1 (c1 INT KEY);
|
||||
SET @@SESSION.foreign_key_checks= ON;
|
||||
SET @@SESSION.unique_checks= ON;
|
||||
# INSERT INTO t1 VALUES (1)
|
||||
# foreign_key_checks=0 and unique_checks=0
|
||||
BINLOG '
|
||||
dfLtTBMBAAAAKQAAANcAAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE=
|
||||
dfLtTBcBAAAAIgAAAPkAAAAAABcAAAAAAAcAAf/+AQAAAA==
|
||||
';
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
# Their values should be ON
|
||||
SHOW SESSION VARIABLES LIKE "%_checks";
|
||||
Variable_name Value
|
||||
foreign_key_checks ON
|
||||
unique_checks ON
|
||||
|
||||
SET @@SESSION.foreign_key_checks= OFF;
|
||||
SET @@SESSION.unique_checks= OFF;
|
||||
# INSERT INTO t1 VALUES(2)
|
||||
# foreign_key_checks=1 and unique_checks=1
|
||||
BINLOG '
|
||||
dfLtTBMBAAAAKQAAAKsBAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE=
|
||||
dfLtTBcBAAAAIgAAAM0BAAAAABcAAAAAAAEAAf/+AgAAAA==
|
||||
';
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
2
|
||||
# Their values should be OFF
|
||||
SHOW SESSION VARIABLES LIKE "%_checks";
|
||||
Variable_name Value
|
||||
foreign_key_checks OFF
|
||||
unique_checks OFF
|
||||
# INSERT INTO t1 VALUES(2)
|
||||
# foreign_key_checks=1 and unique_checks=1
|
||||
# It should not change current session's variables, even error happens
|
||||
BINLOG '
|
||||
dfLtTBMBAAAAKQAAAKsBAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE=
|
||||
dfLtTBcBAAAAIgAAAM0BAAAAABcAAAAAAAEAAf/+AgAAAA==
|
||||
';
|
||||
ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
2
|
||||
# Their values should be OFF
|
||||
SHOW SESSION VARIABLES LIKE "%_checks";
|
||||
Variable_name Value
|
||||
foreign_key_checks OFF
|
||||
unique_checks OFF
|
||||
DROP TABLE t1;
|
||||
|
@ -1,3 +1,4 @@
|
||||
RESET MASTER;
|
||||
###################################################################################
|
||||
# CONFIGURATION
|
||||
###################################################################################
|
||||
|
@ -801,3 +801,62 @@ Log_name Pos Event_type Server_id End_log_pos Info
|
||||
# # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||
# # Query 1 # COMMIT
|
||||
DROP TABLE t1;
|
||||
|
||||
# BUG#54903 BINLOG statement toggles session variables
|
||||
# ----------------------------------------------------------------------
|
||||
# This test verify that BINLOG statement doesn't change current session's
|
||||
# variables foreign_key_checks and unique_checks.
|
||||
|
||||
CREATE TABLE t1 (c1 INT KEY);
|
||||
SET @@SESSION.foreign_key_checks= ON;
|
||||
SET @@SESSION.unique_checks= ON;
|
||||
# INSERT INTO t1 VALUES (1)
|
||||
# foreign_key_checks=0 and unique_checks=0
|
||||
BINLOG '
|
||||
dfLtTBMBAAAAKQAAANcAAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE=
|
||||
dfLtTBcBAAAAIgAAAPkAAAAAABcAAAAAAAcAAf/+AQAAAA==
|
||||
';
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
# Their values should be ON
|
||||
SHOW SESSION VARIABLES LIKE "%_checks";
|
||||
Variable_name Value
|
||||
foreign_key_checks ON
|
||||
unique_checks ON
|
||||
|
||||
SET @@SESSION.foreign_key_checks= OFF;
|
||||
SET @@SESSION.unique_checks= OFF;
|
||||
# INSERT INTO t1 VALUES(2)
|
||||
# foreign_key_checks=1 and unique_checks=1
|
||||
BINLOG '
|
||||
dfLtTBMBAAAAKQAAAKsBAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE=
|
||||
dfLtTBcBAAAAIgAAAM0BAAAAABcAAAAAAAEAAf/+AgAAAA==
|
||||
';
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
2
|
||||
# Their values should be OFF
|
||||
SHOW SESSION VARIABLES LIKE "%_checks";
|
||||
Variable_name Value
|
||||
foreign_key_checks OFF
|
||||
unique_checks OFF
|
||||
# INSERT INTO t1 VALUES(2)
|
||||
# foreign_key_checks=1 and unique_checks=1
|
||||
# It should not change current session's variables, even error happens
|
||||
BINLOG '
|
||||
dfLtTBMBAAAAKQAAAKsBAAAAABcAAAAAAAEABHRlc3QAAnQxAAEDAAE=
|
||||
dfLtTBcBAAAAIgAAAM0BAAAAABcAAAAAAAEAAf/+AgAAAA==
|
||||
';
|
||||
ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
2
|
||||
# Their values should be OFF
|
||||
SHOW SESSION VARIABLES LIKE "%_checks";
|
||||
Variable_name Value
|
||||
foreign_key_checks OFF
|
||||
unique_checks OFF
|
||||
DROP TABLE t1;
|
||||
|
@ -28,6 +28,7 @@ Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
INSERT INTO t2 VALUES (@@hostname);
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'a' at row 1
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
---- Insert from stored procedure ----
|
||||
CREATE PROCEDURE proc()
|
||||
@ -48,6 +49,7 @@ Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Warning 1265 Data truncated for column 'a' at row 6
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
---- Insert from stored function ----
|
||||
CREATE FUNCTION func()
|
||||
@ -72,6 +74,7 @@ Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Warning 1265 Data truncated for column 'a' at row 6
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
---- Insert from trigger ----
|
||||
CREATE TRIGGER trig
|
||||
@ -94,6 +97,7 @@ Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Warning 1265 Data truncated for column 'a' at row 6
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
---- Insert from prepared statement ----
|
||||
@ -124,6 +128,7 @@ Warnings:
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
EXECUTE p7;
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'a' at row 1
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
---- Insert from nested call of triggers / functions / procedures ----
|
||||
CREATE PROCEDURE proc1()
|
||||
@ -160,6 +165,7 @@ Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
Warning 1265 Data truncated for column 'a' at row 6
|
||||
Note 1592 Statement may not be safe to log in statement format.
|
||||
==== Variables that should *not* be unsafe ====
|
||||
INSERT INTO t1 VALUES (@@session.pseudo_thread_id);
|
||||
@ -303,6 +309,8 @@ INSERT INTO t2 VALUES (@@global.init_slave);
|
||||
INSERT INTO t2 VALUES (@@hostname);
|
||||
END|
|
||||
INSERT INTO trigger_table VALUES ('bye.');
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'a' at row 6
|
||||
DROP FUNCTION fun_check_log_bin;
|
||||
DROP FUNCTION func6;
|
||||
DROP FUNCTION func7;
|
||||
|
@ -10,9 +10,12 @@ call mtr.add_suppression('Attempting backtrace');
|
||||
call mtr.add_suppression('MSYQL_BIN_LOG::purge_logs failed to process registered files that would be purged.');
|
||||
call mtr.add_suppression('MSYQL_BIN_LOG::open failed to sync the index file');
|
||||
call mtr.add_suppression('Turning logging off for the whole duration of the MySQL server process.');
|
||||
call mtr.add_suppression('Could not open .*');
|
||||
call mtr.add_suppression('MSYQL_BIN_LOG::purge_logs failed to clean registers before purging logs.');
|
||||
let $old=`select @@debug`;
|
||||
|
||||
RESET MASTER;
|
||||
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
let $INDEX=$MYSQLD_DATADIR/master-bin.index;
|
||||
|
||||
@ -205,12 +208,26 @@ SELECT @index;
|
||||
--echo # This should put the server in unsafe state and stop
|
||||
--echo # accepting any command. If we inject a fault at this
|
||||
--echo # point and continue the execution the server crashes.
|
||||
--echo # Besides the flush command does not report an error.
|
||||
--echo #
|
||||
|
||||
--chmod 0644 $INDEX
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval SET @index=LOAD_FILE('$index')
|
||||
-- replace_regex /\.[\\\/]master/master/
|
||||
SELECT @index;
|
||||
|
||||
--echo # fault_injection_registering_index
|
||||
SET SESSION debug="+d,fault_injection_registering_index";
|
||||
-- replace_regex /\.[\\\/]master/master/
|
||||
-- error ER_CANT_OPEN_FILE
|
||||
flush logs;
|
||||
|
||||
--chmod 0644 $INDEX
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval SET @index=LOAD_FILE('$index')
|
||||
-- replace_regex /\.[\\\/]master/master/
|
||||
SELECT @index;
|
||||
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
--chmod 0644 $INDEX
|
||||
@ -221,7 +238,16 @@ SELECT @index;
|
||||
|
||||
--echo # fault_injection_updating_index
|
||||
SET SESSION debug="+d,fault_injection_updating_index";
|
||||
-- replace_regex /\.[\\\/]master/master/
|
||||
-- error ER_CANT_OPEN_FILE
|
||||
flush logs;
|
||||
|
||||
--chmod 0644 $INDEX
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval SET @index=LOAD_FILE('$index')
|
||||
-- replace_regex /\.[\\\/]master/master/
|
||||
SELECT @index;
|
||||
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
--chmod 0644 $INDEX
|
||||
|
67
mysql-test/suite/federated/federated_bug_35333.result
Normal file
67
mysql-test/suite/federated/federated_bug_35333.result
Normal file
@ -0,0 +1,67 @@
|
||||
#
|
||||
# Bug 35333 "If a Federated table can't connect to the remote hose, can't retrieve metadata"
|
||||
#
|
||||
# Queries such as SHOW TABLE STATUS and SELECT * FROM INFORMATION_SCHEMA.TABLES fail
|
||||
# when encountering a federated table that cannot connect to its remote table.
|
||||
#
|
||||
# The fix is to store the error text in the TABLE COMMENTS column of I_S.TABLES, clear
|
||||
# the remote connection error and push a warning instead. This allows the SELECT operation
|
||||
# to complete while still indicating a problem. This fix applies to any non-fatal system
|
||||
# error that occurs during a query against I_S.TABLES.de
|
||||
CREATE DATABASE federated;
|
||||
CREATE DATABASE federated;
|
||||
CREATE DATABASE IF NOT EXISTS realdb;
|
||||
DROP TABLE IF EXISTS realdb.t0;
|
||||
DROP TABLE IF EXISTS federated.t0;
|
||||
#
|
||||
# Create the base table to be referenced
|
||||
#
|
||||
CREATE TABLE realdb.t0 (a text, b text) ENGINE=MYISAM;
|
||||
#
|
||||
# Create a federated table with a bogus port number
|
||||
#
|
||||
CREATE TABLE federated.t0 (a text, b text) ENGINE=FEDERATED
|
||||
CONNECTION='mysql://root@127.0.0.1:63333/realdb/t0';
|
||||
#
|
||||
# Trigger a federated system error during a INFORMATION_SCHEMA.TABLES query
|
||||
#
|
||||
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE, ROW_FORMAT, TABLE_ROWS, DATA_LENGTH, TABLE_COMMENT
|
||||
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'realdb' or TABLE_SCHEMA = 'federated';
|
||||
TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE ROW_FORMAT TABLE_ROWS DATA_LENGTH TABLE_COMMENT
|
||||
federated t0 BASE TABLE FEDERATED NULL 0 Unable to connect to foreign data source: Can't connect to MySQL server on '127.
|
||||
realdb t0 BASE TABLE MyISAM Dynamic 0 0
|
||||
Warnings:
|
||||
Warning 1429 Unable to connect to foreign data source: Can't connect to MySQL server on '127.0.0.1' (socket errno)
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Warning 1429 Unable to connect to foreign data source: Can't connect to MySQL server on '127.0.0.1' (socket errno)
|
||||
#
|
||||
# Create a MyISAM table then corrupt the file
|
||||
#
|
||||
USE realdb;
|
||||
CREATE TABLE t1 (c1 int) ENGINE=MYISAM;
|
||||
#
|
||||
# Corrupt the MyISAM table by deleting the base file
|
||||
#
|
||||
#
|
||||
# Trigger a MyISAM system error during an INFORMATION_SCHEMA.TABLES query
|
||||
#
|
||||
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE, ROW_FORMAT, TABLE_ROWS, DATA_LENGTH, TABLE_COMMENT
|
||||
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
|
||||
TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE ROW_FORMAT TABLE_ROWS DATA_LENGTH TABLE_COMMENT
|
||||
realdb t1 BASE TABLE NULL NULL NULL NULL Can't find file: 't1' (errno: 2)
|
||||
Warnings:
|
||||
Warning 1017 Can't find file: 't1' (errno: 2)
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Warning 1017 Can't find file: 't1' (errno: 2)
|
||||
#
|
||||
# Cleanup
|
||||
#
|
||||
DROP TABLE IF EXISTS realdb.t0;
|
||||
DROP TABLE IF EXISTS federated.t0;
|
||||
DROP DATABASE realdb;
|
||||
DROP TABLE IF EXISTS federated.t1;
|
||||
DROP DATABASE federated;
|
||||
DROP TABLE IF EXISTS federated.t1;
|
||||
DROP DATABASE federated;
|
74
mysql-test/suite/federated/federated_bug_35333.test
Normal file
74
mysql-test/suite/federated/federated_bug_35333.test
Normal file
@ -0,0 +1,74 @@
|
||||
--echo #
|
||||
--echo # Bug 35333 "If a Federated table can't connect to the remote hose, can't retrieve metadata"
|
||||
--echo #
|
||||
--echo # Queries such as SHOW TABLE STATUS and SELECT * FROM INFORMATION_SCHEMA.TABLES fail
|
||||
--echo # when encountering a federated table that cannot connect to its remote table.
|
||||
--echo #
|
||||
--echo # The fix is to store the error text in the TABLE COMMENTS column of I_S.TABLES, clear
|
||||
--echo # the remote connection error and push a warning instead. This allows the SELECT operation
|
||||
--echo # to complete while still indicating a problem. This fix applies to any non-fatal system
|
||||
--echo # error that occurs during a query against I_S.TABLES.de
|
||||
|
||||
--source federated.inc
|
||||
|
||||
--disable_warnings
|
||||
CREATE DATABASE IF NOT EXISTS realdb;
|
||||
# Federated database exists
|
||||
DROP TABLE IF EXISTS realdb.t0;
|
||||
DROP TABLE IF EXISTS federated.t0;
|
||||
--enable_warnings
|
||||
|
||||
--echo #
|
||||
--echo # Create the base table to be referenced
|
||||
--echo #
|
||||
CREATE TABLE realdb.t0 (a text, b text) ENGINE=MYISAM;
|
||||
|
||||
--echo #
|
||||
--echo # Create a federated table with a bogus port number
|
||||
--echo #
|
||||
CREATE TABLE federated.t0 (a text, b text) ENGINE=FEDERATED
|
||||
CONNECTION='mysql://root@127.0.0.1:63333/realdb/t0';
|
||||
|
||||
#--warning ER_CONNECT_TO_FOREIGN_DATA_SOURCE
|
||||
|
||||
--echo #
|
||||
--echo # Trigger a federated system error during a INFORMATION_SCHEMA.TABLES query
|
||||
--echo #
|
||||
# Remove O/S-specific socket error
|
||||
--replace_regex /\(.*\)/(socket errno)/
|
||||
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE, ROW_FORMAT, TABLE_ROWS, DATA_LENGTH, TABLE_COMMENT
|
||||
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'realdb' or TABLE_SCHEMA = 'federated';
|
||||
|
||||
# Remove O/S-specific socket error
|
||||
--replace_regex /\(.*\)/(socket errno)/
|
||||
SHOW WARNINGS;
|
||||
|
||||
--echo #
|
||||
--echo # Create a MyISAM table then corrupt the file
|
||||
--echo #
|
||||
USE realdb;
|
||||
CREATE TABLE t1 (c1 int) ENGINE=MYISAM;
|
||||
--echo #
|
||||
--echo # Corrupt the MyISAM table by deleting the base file
|
||||
--echo #
|
||||
let $MYSQLD_DATADIR= `SELECT @@datadir`;
|
||||
--remove_file $MYSQLD_DATADIR/realdb/t1.MYD
|
||||
--remove_file $MYSQLD_DATADIR/realdb/t1.MYI
|
||||
|
||||
--echo #
|
||||
--echo # Trigger a MyISAM system error during an INFORMATION_SCHEMA.TABLES query
|
||||
--echo #
|
||||
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE, ROW_FORMAT, TABLE_ROWS, DATA_LENGTH, TABLE_COMMENT
|
||||
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
|
||||
|
||||
SHOW WARNINGS;
|
||||
--echo #
|
||||
--echo # Cleanup
|
||||
--echo #
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS realdb.t0;
|
||||
DROP TABLE IF EXISTS federated.t0;
|
||||
DROP DATABASE realdb;
|
||||
--enable_warnings
|
||||
|
||||
--source federated_cleanup.inc
|
@ -471,17 +471,12 @@ SHOW VARIABLES LIKE "%auto_inc%";
|
||||
Variable_name Value
|
||||
auto_increment_increment 2
|
||||
auto_increment_offset 10
|
||||
INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
ERROR HY000: Failed to read auto-increment value from storage engine
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
18446744073709551603
|
||||
18446744073709551604
|
||||
18446744073709551606
|
||||
18446744073709551608
|
||||
18446744073709551610
|
||||
18446744073709551612
|
||||
18446744073709551614
|
||||
DROP TABLE t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
|
||||
SET @@INSERT_ID=1;
|
||||
@ -504,13 +499,12 @@ SHOW VARIABLES LIKE "%auto_inc%";
|
||||
Variable_name Value
|
||||
auto_increment_increment 5
|
||||
auto_increment_offset 7
|
||||
INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
INSERT INTO t1 VALUES (NULL),(NULL), (NULL);
|
||||
ERROR HY000: Failed to read auto-increment value from storage engine
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
18446744073709551603
|
||||
18446744073709551607
|
||||
18446744073709551612
|
||||
DROP TABLE t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
|
||||
SET @@INSERT_ID=1;
|
||||
@ -572,12 +566,12 @@ SHOW VARIABLES LIKE "%auto_inc%";
|
||||
Variable_name Value
|
||||
auto_increment_increment 65535
|
||||
auto_increment_offset 65535
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
ERROR 22003: Out of range value for column 't1' at row 167
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
18446744073709551610
|
||||
18446744073709551615
|
||||
DROP TABLE t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
|
||||
SET @@INSERT_ID=1;
|
||||
|
@ -74,3 +74,11 @@ a b
|
||||
4 14
|
||||
5 15
|
||||
drop table bug38999_1,bug38999_2;
|
||||
#
|
||||
# Bug#54475 improper error handling causes cascading crashing failures in innodb/ndb
|
||||
#
|
||||
CREATE TABLE t1(f1 INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
UPDATE (SELECT ((SELECT 1 FROM t1), 1) FROM t1 WHERE (SELECT 1 FROM t1)) x, (SELECT 1) AS d SET d.f1 = 1;
|
||||
ERROR 21000: Operand should contain 1 column(s)
|
||||
DROP TABLE t1;
|
||||
|
@ -291,21 +291,8 @@ INSERT INTO t1 VALUES (18446744073709551603); #-- 2^64 - 13
|
||||
SELECT * FROM t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=2, @@SESSION.AUTO_INCREMENT_OFFSET=10;
|
||||
SHOW VARIABLES LIKE "%auto_inc%";
|
||||
# This should fail because of overflow but it doesn't, it seems to be
|
||||
# a MySQL server bug. It wraps around to 0 for the last value.
|
||||
# See MySQL Bug# 39828
|
||||
#
|
||||
# Instead of wrapping around, it asserts when MySQL is compiled --with-debug
|
||||
# (see sql/handler.cc:handler::update_auto_increment()). Don't test for
|
||||
# overflow until Bug #39828 is fixed.
|
||||
#
|
||||
# Since this asserts when compiled --with-debug, we can't properly test this
|
||||
# until Bug #39828 is fixed. For now, this test is meaningless.
|
||||
#if Bug #39828 is fixed
|
||||
#INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
#else
|
||||
INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
#endif
|
||||
--error ER_AUTOINC_READ_FAILED
|
||||
INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
@ -323,20 +310,8 @@ INSERT INTO t1 VALUES (18446744073709551603); #-- 2^64 - 13
|
||||
SELECT * FROM t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=5, @@SESSION.AUTO_INCREMENT_OFFSET=7;
|
||||
SHOW VARIABLES LIKE "%auto_inc%";
|
||||
# This should fail because of overflow but it doesn't. It fails with
|
||||
# a duplicate entry message because of a MySQL server bug, it wraps
|
||||
# around. See MySQL Bug# 39828, once MySQL fix the bug we can replace
|
||||
# the ER_DUP_ENTRY, 1062 below with the appropriate error message
|
||||
#
|
||||
# Since this asserts when compiled --with-debug, we can't properly test this
|
||||
# until Bug #39828 is fixed. For now, this test is meaningless.
|
||||
#if Bug #39828 is fixed
|
||||
# Still need to fix this error code, error should mention overflow
|
||||
#-- error ER_DUP_ENTRY,1062
|
||||
#INSERT INTO t1 VALUES (NULL),(NULL), (NULL);
|
||||
#else
|
||||
INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
#endif
|
||||
--error ER_AUTOINC_READ_FAILED
|
||||
INSERT INTO t1 VALUES (NULL),(NULL), (NULL);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
@ -374,20 +349,8 @@ INSERT INTO t1 VALUES (18446744073709551610); #-- 2^64 - 2
|
||||
SELECT * FROM t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1152921504606846976, @@SESSION.AUTO_INCREMENT_OFFSET=1152921504606846976;
|
||||
SHOW VARIABLES LIKE "%auto_inc%";
|
||||
# This should fail because of overflow but it doesn't. It wraps around
|
||||
# and the autoinc values look bogus too.
|
||||
# See MySQL Bug# 39828, once MySQL fix the bug we can enable the error
|
||||
# code expected test.
|
||||
# -- error ER_AUTOINC_READ_FAILED,1467
|
||||
#
|
||||
# Since this asserts when compiled --with-debug, we can't properly test this
|
||||
# until Bug #39828 is fixed. For now, this test is meaningless.
|
||||
#if Bug #39828 is fixed
|
||||
#-- error ER_AUTOINC_READ_FAILED,1467
|
||||
#INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
#else
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
#endif
|
||||
--error ER_WARN_DATA_OUT_OF_RANGE
|
||||
INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
@ -27,3 +27,14 @@ select * from bug38999_1;
|
||||
select * from bug38999_2;
|
||||
|
||||
drop table bug38999_1,bug38999_2;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#54475 improper error handling causes cascading crashing failures in innodb/ndb
|
||||
--echo #
|
||||
CREATE TABLE t1(f1 INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
--error ER_OPERAND_COLUMNS
|
||||
UPDATE (SELECT ((SELECT 1 FROM t1), 1) FROM t1 WHERE (SELECT 1 FROM t1)) x, (SELECT 1) AS d SET d.f1 = 1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
@ -471,17 +471,12 @@ SHOW VARIABLES LIKE "%auto_inc%";
|
||||
Variable_name Value
|
||||
auto_increment_increment 2
|
||||
auto_increment_offset 10
|
||||
INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
ERROR HY000: Failed to read auto-increment value from storage engine
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
18446744073709551603
|
||||
18446744073709551604
|
||||
18446744073709551606
|
||||
18446744073709551608
|
||||
18446744073709551610
|
||||
18446744073709551612
|
||||
18446744073709551614
|
||||
DROP TABLE t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
|
||||
SET @@INSERT_ID=1;
|
||||
@ -504,13 +499,12 @@ SHOW VARIABLES LIKE "%auto_inc%";
|
||||
Variable_name Value
|
||||
auto_increment_increment 5
|
||||
auto_increment_offset 7
|
||||
INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
INSERT INTO t1 VALUES (NULL),(NULL), (NULL);
|
||||
ERROR HY000: Failed to read auto-increment value from storage engine
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
18446744073709551603
|
||||
18446744073709551607
|
||||
18446744073709551612
|
||||
DROP TABLE t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
|
||||
SET @@INSERT_ID=1;
|
||||
@ -572,12 +566,12 @@ SHOW VARIABLES LIKE "%auto_inc%";
|
||||
Variable_name Value
|
||||
auto_increment_increment 65535
|
||||
auto_increment_offset 65535
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
ERROR 22003: Out of range value for column 't1' at row 167
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
1
|
||||
18446744073709551610
|
||||
18446744073709551615
|
||||
DROP TABLE t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1, @@SESSION.AUTO_INCREMENT_OFFSET=1;
|
||||
SET @@INSERT_ID=1;
|
||||
|
@ -74,3 +74,11 @@ a b
|
||||
4 14
|
||||
5 15
|
||||
drop table bug38999_1,bug38999_2;
|
||||
#
|
||||
# Bug#54475 improper error handling causes cascading crashing failures in innodb/ndb
|
||||
#
|
||||
CREATE TABLE t1(f1 INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
UPDATE (SELECT ((SELECT 1 FROM t1), 1) FROM t1 WHERE (SELECT 1 FROM t1)) x, (SELECT 1) AS d SET d.f1 = 1;
|
||||
ERROR 21000: Operand should contain 1 column(s)
|
||||
DROP TABLE t1;
|
||||
|
@ -293,21 +293,8 @@ INSERT INTO t1 VALUES (18446744073709551603); #-- 2^64 - 13
|
||||
SELECT * FROM t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=2, @@SESSION.AUTO_INCREMENT_OFFSET=10;
|
||||
SHOW VARIABLES LIKE "%auto_inc%";
|
||||
# This should fail because of overflow but it doesn't, it seems to be
|
||||
# a MySQL server bug. It wraps around to 0 for the last value.
|
||||
# See MySQL Bug# 39828
|
||||
#
|
||||
# Instead of wrapping around, it asserts when MySQL is compiled --with-debug
|
||||
# (see sql/handler.cc:handler::update_auto_increment()). Don't test for
|
||||
# overflow until Bug #39828 is fixed.
|
||||
#
|
||||
# Since this asserts when compiled --with-debug, we can't properly test this
|
||||
# until Bug #39828 is fixed. For now, this test is meaningless.
|
||||
#if Bug #39828 is fixed
|
||||
#INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
#else
|
||||
INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
#endif
|
||||
--error ER_AUTOINC_READ_FAILED
|
||||
INSERT INTO t1 VALUES (NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
@ -325,20 +312,8 @@ INSERT INTO t1 VALUES (18446744073709551603); #-- 2^64 - 13
|
||||
SELECT * FROM t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=5, @@SESSION.AUTO_INCREMENT_OFFSET=7;
|
||||
SHOW VARIABLES LIKE "%auto_inc%";
|
||||
# This should fail because of overflow but it doesn't. It fails with
|
||||
# a duplicate entry message because of a MySQL server bug, it wraps
|
||||
# around. See MySQL Bug# 39828, once MySQL fix the bug we can replace
|
||||
# the ER_DUP_ENTRY, 1062 below with the appropriate error message
|
||||
#
|
||||
# Since this asserts when compiled --with-debug, we can't properly test this
|
||||
# until Bug #39828 is fixed. For now, this test is meaningless.
|
||||
#if Bug #39828 is fixed
|
||||
# Still need to fix this error code, error should mention overflow
|
||||
#-- error ER_DUP_ENTRY,1062
|
||||
#INSERT INTO t1 VALUES (NULL),(NULL), (NULL);
|
||||
#else
|
||||
INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
#endif
|
||||
--error ER_AUTOINC_READ_FAILED
|
||||
INSERT INTO t1 VALUES (NULL),(NULL), (NULL);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
@ -376,20 +351,8 @@ INSERT INTO t1 VALUES (18446744073709551610); #-- 2^64 - 2
|
||||
SELECT * FROM t1;
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=1152921504606846976, @@SESSION.AUTO_INCREMENT_OFFSET=1152921504606846976;
|
||||
SHOW VARIABLES LIKE "%auto_inc%";
|
||||
# This should fail because of overflow but it doesn't. It wraps around
|
||||
# and the autoinc values look bogus too.
|
||||
# See MySQL Bug# 39828, once MySQL fix the bug we can enable the error
|
||||
# code expected test.
|
||||
# -- error ER_AUTOINC_READ_FAILED,1467
|
||||
#
|
||||
# Since this asserts when compiled --with-debug, we can't properly test this
|
||||
# until Bug #39828 is fixed. For now, this test is meaningless.
|
||||
#if Bug #39828 is fixed
|
||||
#-- error ER_AUTOINC_READ_FAILED,1467
|
||||
#INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
#else
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
#endif
|
||||
--error ER_WARN_DATA_OUT_OF_RANGE
|
||||
INSERT INTO t1 VALUES (NULL),(NULL);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
@ -27,3 +27,14 @@ select * from bug38999_1;
|
||||
select * from bug38999_2;
|
||||
|
||||
drop table bug38999_1,bug38999_2;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#54475 improper error handling causes cascading crashing failures in innodb/ndb
|
||||
--echo #
|
||||
CREATE TABLE t1(f1 INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
--error ER_OPERAND_COLUMNS
|
||||
UPDATE (SELECT ((SELECT 1 FROM t1), 1) FROM t1 WHERE (SELECT 1 FROM t1)) x, (SELECT 1) AS d SET d.f1 = 1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
@ -39,29 +39,6 @@ let $val3 = 17 ;
|
||||
let $val4 = 15 ;
|
||||
--source suite/parts/inc/partition_supported_sql_funcs.inc
|
||||
|
||||
|
||||
let $sqlfunc = ceiling(col1);
|
||||
let $valsqlfunc = ceiling(15);
|
||||
let $coltype = float(7,4);
|
||||
let $infile = part_supported_sql_funcs_int_float.inc;
|
||||
let $val1 = 5.1230;
|
||||
let $val2 = 13.345;
|
||||
let $val3 = 17.987;
|
||||
let $val4 = 15.654 ;
|
||||
# DISABLED due to bug 30577
|
||||
#--source suite/parts/inc/partition_supported_sql_funcs.inc
|
||||
|
||||
let $sqlfunc = floor(col1);
|
||||
let $valsqlfunc = floor(15.123);
|
||||
let $coltype = float(7,4);
|
||||
let $infile = part_supported_sql_funcs_int_float.inc;
|
||||
let $val1 = 5.1230;
|
||||
let $val2 = 13.345;
|
||||
let $val3 = 17.987;
|
||||
let $val4 = 15.654 ;
|
||||
# DISABLED due to bug 30577
|
||||
#--source suite/parts/inc/partition_supported_sql_funcs.inc
|
||||
|
||||
let $sqlfunc = mod(col1,10);
|
||||
let $valsqlfunc = mod(15,10);
|
||||
let $coltype = int;
|
||||
|
@ -37,10 +37,8 @@ drop table t2;
|
||||
|
||||
# Bug 30577: FLOOR() and CEILING() not usable as partition functions
|
||||
# Partition functions are required to return INT_RESULT; FLOOR() and
|
||||
# CEILING() do not, unless they have an INT argument. Disable this
|
||||
# portion of the test until bug 30577 is fixed.
|
||||
# CEILING() do not, unless they have an INT or DECIMAL argument.
|
||||
|
||||
--disable_parsing
|
||||
|
||||
eval create table t3 (a decimal(18,9) not null, primary key(a)) engine=$engine
|
||||
partition by range (floor(a)) subpartition by key (a) subpartitions 2 (
|
||||
@ -65,7 +63,7 @@ select count(*) from t3;
|
||||
drop table t3;
|
||||
|
||||
eval create table t4 (a decimal(18,9) not null, primary key(a)) engine=$engine
|
||||
partition by list (floor(a)) subpartition by key (a) subpartitions 2 (
|
||||
partition by list (ceiling(a)) subpartition by key (a) subpartitions 2 (
|
||||
partition pa2 values in (1,2),
|
||||
partition pa4 values in (3,4),
|
||||
partition pa6 values in (5,6),
|
||||
@ -85,6 +83,3 @@ dec $count;
|
||||
--enable_query_log
|
||||
select count(*) from t4;
|
||||
drop table t4;
|
||||
|
||||
# Disabled due to Bug 30577
|
||||
--enable_parsing
|
||||
|
@ -34,54 +34,3 @@ dec $count;
|
||||
--enable_query_log
|
||||
select count(*) from t2;
|
||||
drop table t2;
|
||||
|
||||
|
||||
# Bug 30577: FLOOR() and CEILING() not usable as partition functions
|
||||
# Partition functions are required to return INT_RESULT; FLOOR() and
|
||||
# CEILING() do not, unless they have an INT argument. Disable this
|
||||
# portion of the test until bug 30577 is fixed.
|
||||
|
||||
--disable_parsing
|
||||
|
||||
eval create table t3 (a double not null, primary key(a)) engine=$engine
|
||||
partition by range (floor(a)) subpartition by key (a) subpartitions 3 (
|
||||
partition pa1 values less than (3),
|
||||
partition pa3 values less than (6),
|
||||
partition pa10 values less than (10)
|
||||
);
|
||||
show create table t3;
|
||||
let $count=9;
|
||||
--echo $count*3 inserts;
|
||||
while ($count)
|
||||
{
|
||||
eval insert into t3 values ($count);
|
||||
eval insert into t3 values ($count+0.33);
|
||||
eval insert into t3 values ($count+0.75);
|
||||
dec $count;
|
||||
}
|
||||
select count(*) from t3;
|
||||
select * from t3;
|
||||
drop table t3;
|
||||
|
||||
eval create table t4 (a double not null, primary key(a)) engine=$engine
|
||||
partition by list (floor(a)) subpartition by key (a) subpartitions 3 (
|
||||
partition pa1 values in (1,2,3),
|
||||
partition pa3 values in (4,5,6),
|
||||
partition pa10 values in (7,8,9,10)
|
||||
);
|
||||
show create table t4;
|
||||
let $count=9;
|
||||
--echo $count*3 inserts;
|
||||
while ($count)
|
||||
{
|
||||
eval insert into t4 values ($count);
|
||||
eval insert into t4 values ($count+0.33);
|
||||
eval insert into t4 values ($count+0.75);
|
||||
dec $count;
|
||||
}
|
||||
select count(*) from t4;
|
||||
select * from t4;
|
||||
drop table t4;
|
||||
|
||||
# Disabled due to Bug 30577
|
||||
--enable_parsing
|
||||
|
@ -38,53 +38,3 @@ dec $count;
|
||||
--enable_query_log
|
||||
select count(*) from t2;
|
||||
drop table t2;
|
||||
|
||||
# Bug 30577: FLOOR() and CEILING() not usable as partition functions
|
||||
# Partition functions are required to return INT_RESULT; FLOOR() and
|
||||
# CEILING() do not, unless they have an INT argument. Disable this
|
||||
# portion of the test until bug 30577 is fixed.
|
||||
|
||||
--disable_parsing
|
||||
|
||||
eval create table t3 (a float not null, primary key(a)) engine=$engine
|
||||
partition by range (floor(a)) subpartition by key (a) subpartitions 3 (
|
||||
partition pa1 values less than (3),
|
||||
partition pa3 values less than (6),
|
||||
partition pa10 values less than (10)
|
||||
);
|
||||
show create table t3;
|
||||
let $count=9;
|
||||
--echo $count*3 inserts;
|
||||
while ($count)
|
||||
{
|
||||
eval insert into t3 values ($count);
|
||||
eval insert into t3 values ($count+0.33);
|
||||
eval insert into t3 values ($count+0.75);
|
||||
dec $count;
|
||||
}
|
||||
select count(*) from t3;
|
||||
select * from t3;
|
||||
drop table t3;
|
||||
|
||||
eval create table t4 (a float not null, primary key(a)) engine=$engine
|
||||
partition by list (floor(a)) subpartition by key (a) subpartitions 3 (
|
||||
partition pa1 values in (1,2,3),
|
||||
partition pa3 values in (4,5,6),
|
||||
partition pa10 values in (7,8,9,10)
|
||||
);
|
||||
show create table t4;
|
||||
let $count=9;
|
||||
--echo $count*3 inserts;
|
||||
while ($count)
|
||||
{
|
||||
eval insert into t4 values ($count);
|
||||
eval insert into t4 values ($count+0.33);
|
||||
eval insert into t4 values ($count+0.75);
|
||||
dec $count;
|
||||
}
|
||||
select count(*) from t4;
|
||||
select * from t4;
|
||||
drop table t4;
|
||||
|
||||
# Disabled due to Bug 30577
|
||||
--enable_parsing
|
||||
|
@ -86,3 +86,111 @@ select count(*) from t2;
|
||||
count(*)
|
||||
3072
|
||||
drop table t2;
|
||||
create table t3 (a decimal(18,9) not null, primary key(a)) engine='InnoDB'
|
||||
partition by range (floor(a)) subpartition by key (a) subpartitions 2 (
|
||||
partition pa2 values less than (2),
|
||||
partition pa4 values less than (4),
|
||||
partition pa6 values less than (6),
|
||||
partition pa8 values less than (8),
|
||||
partition pa10 values less than (10)
|
||||
);
|
||||
show create table t3;
|
||||
Table Create Table
|
||||
t3 CREATE TABLE `t3` (
|
||||
`a` decimal(18,9) NOT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY RANGE (floor(a))
|
||||
SUBPARTITION BY KEY (a)
|
||||
SUBPARTITIONS 2
|
||||
(PARTITION pa2 VALUES LESS THAN (2) ENGINE = InnoDB,
|
||||
PARTITION pa4 VALUES LESS THAN (4) ENGINE = InnoDB,
|
||||
PARTITION pa6 VALUES LESS THAN (6) ENGINE = InnoDB,
|
||||
PARTITION pa8 VALUES LESS THAN (8) ENGINE = InnoDB,
|
||||
PARTITION pa10 VALUES LESS THAN (10) ENGINE = InnoDB) */
|
||||
9*3 inserts;
|
||||
insert into t3 values (9);
|
||||
insert into t3 values (9+0.333333333);
|
||||
insert into t3 values (9+0.755555555);
|
||||
insert into t3 values (8);
|
||||
insert into t3 values (8+0.333333333);
|
||||
insert into t3 values (8+0.755555555);
|
||||
insert into t3 values (7);
|
||||
insert into t3 values (7+0.333333333);
|
||||
insert into t3 values (7+0.755555555);
|
||||
insert into t3 values (6);
|
||||
insert into t3 values (6+0.333333333);
|
||||
insert into t3 values (6+0.755555555);
|
||||
insert into t3 values (5);
|
||||
insert into t3 values (5+0.333333333);
|
||||
insert into t3 values (5+0.755555555);
|
||||
insert into t3 values (4);
|
||||
insert into t3 values (4+0.333333333);
|
||||
insert into t3 values (4+0.755555555);
|
||||
insert into t3 values (3);
|
||||
insert into t3 values (3+0.333333333);
|
||||
insert into t3 values (3+0.755555555);
|
||||
insert into t3 values (2);
|
||||
insert into t3 values (2+0.333333333);
|
||||
insert into t3 values (2+0.755555555);
|
||||
insert into t3 values (1);
|
||||
insert into t3 values (1+0.333333333);
|
||||
insert into t3 values (1+0.755555555);
|
||||
select count(*) from t3;
|
||||
count(*)
|
||||
27
|
||||
drop table t3;
|
||||
create table t4 (a decimal(18,9) not null, primary key(a)) engine='InnoDB'
|
||||
partition by list (ceiling(a)) subpartition by key (a) subpartitions 2 (
|
||||
partition pa2 values in (1,2),
|
||||
partition pa4 values in (3,4),
|
||||
partition pa6 values in (5,6),
|
||||
partition pa8 values in (7,8),
|
||||
partition pa10 values in (9,10)
|
||||
);
|
||||
show create table t4;
|
||||
Table Create Table
|
||||
t4 CREATE TABLE `t4` (
|
||||
`a` decimal(18,9) NOT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY LIST (ceiling(a))
|
||||
SUBPARTITION BY KEY (a)
|
||||
SUBPARTITIONS 2
|
||||
(PARTITION pa2 VALUES IN (1,2) ENGINE = InnoDB,
|
||||
PARTITION pa4 VALUES IN (3,4) ENGINE = InnoDB,
|
||||
PARTITION pa6 VALUES IN (5,6) ENGINE = InnoDB,
|
||||
PARTITION pa8 VALUES IN (7,8) ENGINE = InnoDB,
|
||||
PARTITION pa10 VALUES IN (9,10) ENGINE = InnoDB) */
|
||||
9*3 inserts;
|
||||
insert into t4 values (9);
|
||||
insert into t4 values (9+0.333333333);
|
||||
insert into t4 values (9+0.755555555);
|
||||
insert into t4 values (8);
|
||||
insert into t4 values (8+0.333333333);
|
||||
insert into t4 values (8+0.755555555);
|
||||
insert into t4 values (7);
|
||||
insert into t4 values (7+0.333333333);
|
||||
insert into t4 values (7+0.755555555);
|
||||
insert into t4 values (6);
|
||||
insert into t4 values (6+0.333333333);
|
||||
insert into t4 values (6+0.755555555);
|
||||
insert into t4 values (5);
|
||||
insert into t4 values (5+0.333333333);
|
||||
insert into t4 values (5+0.755555555);
|
||||
insert into t4 values (4);
|
||||
insert into t4 values (4+0.333333333);
|
||||
insert into t4 values (4+0.755555555);
|
||||
insert into t4 values (3);
|
||||
insert into t4 values (3+0.333333333);
|
||||
insert into t4 values (3+0.755555555);
|
||||
insert into t4 values (2);
|
||||
insert into t4 values (2+0.333333333);
|
||||
insert into t4 values (2+0.755555555);
|
||||
insert into t4 values (1);
|
||||
insert into t4 values (1+0.333333333);
|
||||
insert into t4 values (1+0.755555555);
|
||||
select count(*) from t4;
|
||||
count(*)
|
||||
27
|
||||
drop table t4;
|
||||
|
@ -86,3 +86,111 @@ select count(*) from t2;
|
||||
count(*)
|
||||
196605
|
||||
drop table t2;
|
||||
create table t3 (a decimal(18,9) not null, primary key(a)) engine='MYISAM'
|
||||
partition by range (floor(a)) subpartition by key (a) subpartitions 2 (
|
||||
partition pa2 values less than (2),
|
||||
partition pa4 values less than (4),
|
||||
partition pa6 values less than (6),
|
||||
partition pa8 values less than (8),
|
||||
partition pa10 values less than (10)
|
||||
);
|
||||
show create table t3;
|
||||
Table Create Table
|
||||
t3 CREATE TABLE `t3` (
|
||||
`a` decimal(18,9) NOT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY RANGE (floor(a))
|
||||
SUBPARTITION BY KEY (a)
|
||||
SUBPARTITIONS 2
|
||||
(PARTITION pa2 VALUES LESS THAN (2) ENGINE = MyISAM,
|
||||
PARTITION pa4 VALUES LESS THAN (4) ENGINE = MyISAM,
|
||||
PARTITION pa6 VALUES LESS THAN (6) ENGINE = MyISAM,
|
||||
PARTITION pa8 VALUES LESS THAN (8) ENGINE = MyISAM,
|
||||
PARTITION pa10 VALUES LESS THAN (10) ENGINE = MyISAM) */
|
||||
9*3 inserts;
|
||||
insert into t3 values (9);
|
||||
insert into t3 values (9+0.333333333);
|
||||
insert into t3 values (9+0.755555555);
|
||||
insert into t3 values (8);
|
||||
insert into t3 values (8+0.333333333);
|
||||
insert into t3 values (8+0.755555555);
|
||||
insert into t3 values (7);
|
||||
insert into t3 values (7+0.333333333);
|
||||
insert into t3 values (7+0.755555555);
|
||||
insert into t3 values (6);
|
||||
insert into t3 values (6+0.333333333);
|
||||
insert into t3 values (6+0.755555555);
|
||||
insert into t3 values (5);
|
||||
insert into t3 values (5+0.333333333);
|
||||
insert into t3 values (5+0.755555555);
|
||||
insert into t3 values (4);
|
||||
insert into t3 values (4+0.333333333);
|
||||
insert into t3 values (4+0.755555555);
|
||||
insert into t3 values (3);
|
||||
insert into t3 values (3+0.333333333);
|
||||
insert into t3 values (3+0.755555555);
|
||||
insert into t3 values (2);
|
||||
insert into t3 values (2+0.333333333);
|
||||
insert into t3 values (2+0.755555555);
|
||||
insert into t3 values (1);
|
||||
insert into t3 values (1+0.333333333);
|
||||
insert into t3 values (1+0.755555555);
|
||||
select count(*) from t3;
|
||||
count(*)
|
||||
27
|
||||
drop table t3;
|
||||
create table t4 (a decimal(18,9) not null, primary key(a)) engine='MYISAM'
|
||||
partition by list (ceiling(a)) subpartition by key (a) subpartitions 2 (
|
||||
partition pa2 values in (1,2),
|
||||
partition pa4 values in (3,4),
|
||||
partition pa6 values in (5,6),
|
||||
partition pa8 values in (7,8),
|
||||
partition pa10 values in (9,10)
|
||||
);
|
||||
show create table t4;
|
||||
Table Create Table
|
||||
t4 CREATE TABLE `t4` (
|
||||
`a` decimal(18,9) NOT NULL,
|
||||
PRIMARY KEY (`a`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY LIST (ceiling(a))
|
||||
SUBPARTITION BY KEY (a)
|
||||
SUBPARTITIONS 2
|
||||
(PARTITION pa2 VALUES IN (1,2) ENGINE = MyISAM,
|
||||
PARTITION pa4 VALUES IN (3,4) ENGINE = MyISAM,
|
||||
PARTITION pa6 VALUES IN (5,6) ENGINE = MyISAM,
|
||||
PARTITION pa8 VALUES IN (7,8) ENGINE = MyISAM,
|
||||
PARTITION pa10 VALUES IN (9,10) ENGINE = MyISAM) */
|
||||
9*3 inserts;
|
||||
insert into t4 values (9);
|
||||
insert into t4 values (9+0.333333333);
|
||||
insert into t4 values (9+0.755555555);
|
||||
insert into t4 values (8);
|
||||
insert into t4 values (8+0.333333333);
|
||||
insert into t4 values (8+0.755555555);
|
||||
insert into t4 values (7);
|
||||
insert into t4 values (7+0.333333333);
|
||||
insert into t4 values (7+0.755555555);
|
||||
insert into t4 values (6);
|
||||
insert into t4 values (6+0.333333333);
|
||||
insert into t4 values (6+0.755555555);
|
||||
insert into t4 values (5);
|
||||
insert into t4 values (5+0.333333333);
|
||||
insert into t4 values (5+0.755555555);
|
||||
insert into t4 values (4);
|
||||
insert into t4 values (4+0.333333333);
|
||||
insert into t4 values (4+0.755555555);
|
||||
insert into t4 values (3);
|
||||
insert into t4 values (3+0.333333333);
|
||||
insert into t4 values (3+0.755555555);
|
||||
insert into t4 values (2);
|
||||
insert into t4 values (2+0.333333333);
|
||||
insert into t4 values (2+0.755555555);
|
||||
insert into t4 values (1);
|
||||
insert into t4 values (1+0.333333333);
|
||||
insert into t4 values (1+0.755555555);
|
||||
select count(*) from t4;
|
||||
count(*)
|
||||
27
|
||||
drop table t4;
|
||||
|
274
mysql-test/suite/rpl/r/rpl_binlog_errors.result
Normal file
274
mysql-test/suite/rpl/r/rpl_binlog_errors.result
Normal file
@ -0,0 +1,274 @@
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
#######################################################################
|
||||
####################### PART 1: MASTER TESTS ##########################
|
||||
#######################################################################
|
||||
include/stop_slave.inc
|
||||
call mtr.add_suppression("Can't generate a unique log-filename");
|
||||
call mtr.add_suppression("Writing one row to the row-based binary log failed.*");
|
||||
call mtr.add_suppression("Error writing file .*");
|
||||
SET @old_debug= @@global.debug;
|
||||
SELECT repeat('x',8192) INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data';
|
||||
SELECT repeat('x',10) INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/bug_46166-2.data';
|
||||
RESET MASTER;
|
||||
###################### TEST #1
|
||||
FLUSH LOGS;
|
||||
# assert: must show two binlogs
|
||||
show binary logs;
|
||||
Log_name File_size
|
||||
master-bin.000001 #
|
||||
master-bin.000002 #
|
||||
###################### TEST #2
|
||||
RESET MASTER;
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
FLUSH LOGS;
|
||||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999)
|
||||
|
||||
# assert: must show one binlog
|
||||
show binary logs;
|
||||
Log_name File_size
|
||||
master-bin.000001 #
|
||||
SET GLOBAL debug="";
|
||||
RESET MASTER;
|
||||
###################### TEST #3
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TABLE t2 (a VARCHAR(16384)) Engine=InnoDB;
|
||||
CREATE TABLE t4 (a VARCHAR(16384));
|
||||
INSERT INTO t1 VALUES (1);
|
||||
RESET MASTER;
|
||||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t2;
|
||||
# assert: must show two binlog
|
||||
show binary logs;
|
||||
Log_name File_size
|
||||
master-bin.000001 #
|
||||
master-bin.000002 #
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
DELETE FROM t2;
|
||||
RESET MASTER;
|
||||
###################### TEST #4
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t2;
|
||||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999)
|
||||
|
||||
# assert: must show one entry
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
1
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
DELETE FROM t2;
|
||||
RESET MASTER;
|
||||
###################### TEST #5
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166-2.data' INTO TABLE t2;
|
||||
# assert: must show one entry
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
1
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
DELETE FROM t2;
|
||||
RESET MASTER;
|
||||
###################### TEST #6
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
SET AUTOCOMMIT=0;
|
||||
INSERT INTO t2 VALUES ('muse');
|
||||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t2;
|
||||
INSERT INTO t2 VALUES ('muse');
|
||||
COMMIT;
|
||||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999)
|
||||
|
||||
# assert: must show three entries
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
3
|
||||
SET AUTOCOMMIT= 1;
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
DELETE FROM t2;
|
||||
RESET MASTER;
|
||||
###################### TEST #7
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
SELECT count(*) FROM t4;
|
||||
count(*)
|
||||
0
|
||||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t4;
|
||||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999)
|
||||
|
||||
# assert: must show 1 entry
|
||||
SELECT count(*) FROM t4;
|
||||
count(*)
|
||||
1
|
||||
### check that the incident event is written to the current log
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
FLUSH LOGS;
|
||||
SHOW BINLOG EVENTS IN 'BINLOG_FILE' FROM <binlog_start> LIMIT 1;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
BINLOG_FILE # Incident # # #1 (LOST_EVENTS)
|
||||
DELETE FROM t4;
|
||||
RESET MASTER;
|
||||
###################### TEST #8
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
# must show 0 entries
|
||||
SELECT count(*) FROM t4;
|
||||
count(*)
|
||||
0
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
0
|
||||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t4;
|
||||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999)
|
||||
|
||||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug_46166.data' INTO TABLE t2;
|
||||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999)
|
||||
|
||||
INSERT INTO t2 VALUES ('aaa'), ('bbb'), ('ccc');
|
||||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999)
|
||||
|
||||
# INFO: Count(*) Before Offending DELETEs
|
||||
# assert: must show 1 entry
|
||||
SELECT count(*) FROM t4;
|
||||
count(*)
|
||||
1
|
||||
# assert: must show 4 entries
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
4
|
||||
DELETE FROM t4;
|
||||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999)
|
||||
|
||||
DELETE FROM t2;
|
||||
ERROR HY000: Can't generate a unique log-filename master-bin.(1-999)
|
||||
|
||||
# INFO: Count(*) After Offending DELETEs
|
||||
# assert: must show zero entries
|
||||
SELECT count(*) FROM t4;
|
||||
count(*)
|
||||
0
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
0
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
###################### TEST #9
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
SET SQL_LOG_BIN=0;
|
||||
INSERT INTO t2 VALUES ('aaa'), ('bbb'), ('ccc'), ('ddd');
|
||||
INSERT INTO t4 VALUES ('eee'), ('fff'), ('ggg'), ('hhh');
|
||||
# assert: must show four entries
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
4
|
||||
SELECT count(*) FROM t4;
|
||||
count(*)
|
||||
4
|
||||
DELETE FROM t2;
|
||||
DELETE FROM t4;
|
||||
# assert: must show zero entries
|
||||
SELECT count(*) FROM t2;
|
||||
count(*)
|
||||
0
|
||||
SELECT count(*) FROM t4;
|
||||
count(*)
|
||||
0
|
||||
SET SQL_LOG_BIN=1;
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
###################### TEST #10
|
||||
call mtr.add_suppression("MSYQL_BIN_LOG::open failed to sync the index file.");
|
||||
call mtr.add_suppression("Could not open .*");
|
||||
RESET MASTER;
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
SET GLOBAL debug="+d,fault_injection_registering_index";
|
||||
FLUSH LOGS;
|
||||
ERROR HY000: Can't open file: 'master-bin.000002' (errno: 1)
|
||||
SET GLOBAL debug="-d,fault_injection_registering_index";
|
||||
SHOW BINARY LOGS;
|
||||
ERROR HY000: You are not using binary logging
|
||||
CREATE TABLE t5 (a INT);
|
||||
INSERT INTO t4 VALUES ('bbbbb');
|
||||
INSERT INTO t2 VALUES ('aaaaa');
|
||||
DELETE FROM t4;
|
||||
DELETE FROM t2;
|
||||
DROP TABLE t5;
|
||||
###################### TEST #11
|
||||
SET GLOBAL debug="+d,fault_injection_openning_index";
|
||||
FLUSH LOGS;
|
||||
ERROR HY000: Can't open file: 'master-bin.index' (errno: 1)
|
||||
SET GLOBAL debug="-d,fault_injection_openning_index";
|
||||
RESET MASTER;
|
||||
ERROR HY000: Binlog closed, cannot RESET MASTER
|
||||
CREATE TABLE t5 (a INT);
|
||||
INSERT INTO t4 VALUES ('bbbbb');
|
||||
INSERT INTO t2 VALUES ('aaaaa');
|
||||
DELETE FROM t4;
|
||||
DELETE FROM t2;
|
||||
DROP TABLE t5;
|
||||
###################### TEST #12
|
||||
SET GLOBAL debug="+d,fault_injection_new_file_rotate_event";
|
||||
FLUSH LOGS;
|
||||
ERROR HY000: Can't open file: 'master-bin' (errno: 2)
|
||||
SET GLOBAL debug="-d,fault_injection_new_file_rotate_event";
|
||||
RESET MASTER;
|
||||
ERROR HY000: Binlog closed, cannot RESET MASTER
|
||||
CREATE TABLE t5 (a INT);
|
||||
INSERT INTO t4 VALUES ('bbbbb');
|
||||
INSERT INTO t2 VALUES ('aaaaa');
|
||||
DELETE FROM t4;
|
||||
DELETE FROM t2;
|
||||
DROP TABLE t5;
|
||||
SET GLOBAL debug= @old_debug;
|
||||
DROP TABLE t1, t2, t4;
|
||||
RESET MASTER;
|
||||
include/start_slave.inc
|
||||
#######################################################################
|
||||
####################### PART 2: SLAVE TESTS ###########################
|
||||
#######################################################################
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
call mtr.add_suppression("Slave I/O: Relay log write failure: could not queue event from master.*");
|
||||
call mtr.add_suppression("Error writing file .*");
|
||||
call mtr.add_suppression("Could not open .*");
|
||||
call mtr.add_suppression("MSYQL_BIN_LOG::open failed to sync the index file.");
|
||||
call mtr.add_suppression("Can't generate a unique log-filename .*");
|
||||
###################### TEST #13
|
||||
SET @old_debug=@@global.debug;
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
START SLAVE io_thread;
|
||||
Last_IO_Error = Relay log write failure: could not queue event from master
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
SET GLOBAL debug=@old_debug;
|
||||
###################### TEST #14
|
||||
SET @old_debug=@@global.debug;
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL debug="+d,fault_injection_new_file_rotate_event";
|
||||
START SLAVE io_thread;
|
||||
Last_IO_Error = Relay log write failure: could not queue event from master
|
||||
SET GLOBAL debug="-d,fault_injection_new_file_rotate_event";
|
||||
SET GLOBAL debug=@old_debug;
|
||||
###################### TEST #15
|
||||
SET @old_debug=@@global.debug;
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL debug="+d,fault_injection_registering_index";
|
||||
START SLAVE io_thread;
|
||||
Last_IO_Error = Relay log write failure: could not queue event from master
|
||||
SET GLOBAL debug="-d,fault_injection_registering_index";
|
||||
SET GLOBAL debug=@old_debug;
|
||||
###################### TEST #16
|
||||
SET @old_debug=@@global.debug;
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL debug="+d,fault_injection_openning_index";
|
||||
START SLAVE io_thread;
|
||||
Last_IO_Error = Relay log write failure: could not queue event from master
|
||||
SET GLOBAL debug="-d,fault_injection_openning_index";
|
||||
SET GLOBAL debug=@old_debug;
|
||||
include/stop_slave.inc
|
||||
SET GLOBAL debug=@old_debug;
|
||||
RESET SLAVE;
|
||||
RESET MASTER;
|
||||
include/start_slave.inc
|
@ -11,6 +11,6 @@ set sql_log_bin=1;
|
||||
insert into t1 values(1),(2);
|
||||
ERROR 23000: Duplicate entry '2' for key 'a'
|
||||
drop table t1;
|
||||
Error: "Query caused different errors on master and slave. Error on master: 'Duplicate entry '%-.192s' for key %d' (1062), Error on slave: 'no error' (0). Default database: 'test'. Query: 'insert into t1 values(1),(2)'" (expected different error codes on master and slave)
|
||||
Error: "Query caused different errors on master and slave. Error on master: message (format)='Duplicate entry '%-.192s' for key %d' error code=1062 ; Error on slave: actual message='no error', error code=0. Default database: 'test'. Query: 'insert into t1 values(1),(2)'" (expected different error codes on master and slave)
|
||||
Errno: "0" (expected 0)
|
||||
drop table t1;
|
||||
|
1
mysql-test/suite/rpl/t/rpl_binlog_errors-master.opt
Normal file
1
mysql-test/suite/rpl/t/rpl_binlog_errors-master.opt
Normal file
@ -0,0 +1 @@
|
||||
--max_binlog_size=4096
|
415
mysql-test/suite/rpl/t/rpl_binlog_errors.test
Normal file
415
mysql-test/suite/rpl/t/rpl_binlog_errors.test
Normal file
@ -0,0 +1,415 @@
|
||||
# BUG#46166: MYSQL_BIN_LOG::new_file_impl is not propagating error
|
||||
# when generating new name.
|
||||
#
|
||||
# WHY
|
||||
# ===
|
||||
#
|
||||
# We want to check whether error is reported or not when
|
||||
# new_file_impl fails (this may happen when rotation is not
|
||||
# possible because there is some problem finding an
|
||||
# unique filename).
|
||||
#
|
||||
# HOW
|
||||
# ===
|
||||
#
|
||||
# Test cases are documented inline.
|
||||
|
||||
-- source include/master-slave.inc
|
||||
-- source include/have_innodb.inc
|
||||
-- source include/have_debug.inc
|
||||
|
||||
-- echo #######################################################################
|
||||
-- echo ####################### PART 1: MASTER TESTS ##########################
|
||||
-- echo #######################################################################
|
||||
|
||||
|
||||
### ACTION: stopping slave as it is not needed for the first part of
|
||||
### the test
|
||||
|
||||
-- connection slave
|
||||
-- source include/stop_slave.inc
|
||||
-- connection master
|
||||
|
||||
call mtr.add_suppression("Can't generate a unique log-filename");
|
||||
call mtr.add_suppression("Writing one row to the row-based binary log failed.*");
|
||||
call mtr.add_suppression("Error writing file .*");
|
||||
|
||||
SET @old_debug= @@global.debug;
|
||||
|
||||
### ACTION: create a large file (> 4096 bytes) that will be later used
|
||||
### in LOAD DATA INFILE to check binlog errors in its vacinity
|
||||
-- let $load_file= $MYSQLTEST_VARDIR/tmp/bug_46166.data
|
||||
-- let $MYSQLD_DATADIR= `select @@datadir`
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval SELECT repeat('x',8192) INTO OUTFILE '$load_file'
|
||||
|
||||
### ACTION: create a small file (< 4096 bytes) that will be later used
|
||||
### in LOAD DATA INFILE to check for absence of binlog errors
|
||||
### when file loading this file does not force flushing and
|
||||
### rotating the binary log
|
||||
-- let $load_file2= $MYSQLTEST_VARDIR/tmp/bug_46166-2.data
|
||||
-- let $MYSQLD_DATADIR= `select @@datadir`
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval SELECT repeat('x',10) INTO OUTFILE '$load_file2'
|
||||
|
||||
RESET MASTER;
|
||||
|
||||
-- echo ###################### TEST #1
|
||||
|
||||
### ASSERTION: no problem flushing logs (should show two binlogs)
|
||||
FLUSH LOGS;
|
||||
-- echo # assert: must show two binlogs
|
||||
-- source include/show_binary_logs.inc
|
||||
|
||||
-- echo ###################### TEST #2
|
||||
|
||||
### ASSERTION: check that FLUSH LOGS actually fails and reports
|
||||
### failure back to the user if find_uniq_filename fails
|
||||
### (should show just one binlog)
|
||||
|
||||
RESET MASTER;
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
-- error ER_NO_UNIQUE_LOGFILE
|
||||
FLUSH LOGS;
|
||||
-- echo # assert: must show one binlog
|
||||
-- source include/show_binary_logs.inc
|
||||
|
||||
### ACTION: clean up and move to next test
|
||||
SET GLOBAL debug="";
|
||||
RESET MASTER;
|
||||
|
||||
-- echo ###################### TEST #3
|
||||
|
||||
### ACTION: create some tables (t1, t2, t4) and insert some values in
|
||||
### table t1
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TABLE t2 (a VARCHAR(16384)) Engine=InnoDB;
|
||||
CREATE TABLE t4 (a VARCHAR(16384));
|
||||
INSERT INTO t1 VALUES (1);
|
||||
RESET MASTER;
|
||||
|
||||
### ASSERTION: we force rotation of the binary log because it exceeds
|
||||
### the max_binlog_size option (should show two binary
|
||||
### logs)
|
||||
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t2
|
||||
|
||||
# shows two binary logs
|
||||
-- echo # assert: must show two binlog
|
||||
-- source include/show_binary_logs.inc
|
||||
|
||||
# clean up the table and the binlog to be used in next part of test
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
DELETE FROM t2;
|
||||
RESET MASTER;
|
||||
|
||||
-- echo ###################### TEST #4
|
||||
|
||||
### ASSERTION: load the big file into a transactional table and check
|
||||
### that it reports error. The table will contain the
|
||||
### changes performed despite the fact that it reported an
|
||||
### error.
|
||||
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- error ER_NO_UNIQUE_LOGFILE
|
||||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t2
|
||||
|
||||
# show table
|
||||
-- echo # assert: must show one entry
|
||||
SELECT count(*) FROM t2;
|
||||
|
||||
# clean up the table and the binlog to be used in next part of test
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
DELETE FROM t2;
|
||||
RESET MASTER;
|
||||
|
||||
-- echo ###################### TEST #5
|
||||
|
||||
### ASSERTION: load the small file into a transactional table and
|
||||
### check that it succeeds
|
||||
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval LOAD DATA INFILE '$load_file2' INTO TABLE t2
|
||||
|
||||
# show table
|
||||
-- echo # assert: must show one entry
|
||||
SELECT count(*) FROM t2;
|
||||
|
||||
# clean up the table and the binlog to be used in next part of test
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
DELETE FROM t2;
|
||||
RESET MASTER;
|
||||
|
||||
-- echo ###################### TEST #6
|
||||
|
||||
### ASSERTION: check that even if one is using a transactional table
|
||||
### and explicit transactions (no autocommit) if rotation
|
||||
### fails we get the error. Transaction is not rolledback
|
||||
### because rotation happens after the commit.
|
||||
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
SET AUTOCOMMIT=0;
|
||||
INSERT INTO t2 VALUES ('muse');
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t2
|
||||
INSERT INTO t2 VALUES ('muse');
|
||||
-- error ER_NO_UNIQUE_LOGFILE
|
||||
COMMIT;
|
||||
|
||||
### ACTION: Show the contents of the table after the test
|
||||
-- echo # assert: must show three entries
|
||||
SELECT count(*) FROM t2;
|
||||
|
||||
### ACTION: clean up and move to the next test
|
||||
SET AUTOCOMMIT= 1;
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
DELETE FROM t2;
|
||||
RESET MASTER;
|
||||
|
||||
-- echo ###################### TEST #7
|
||||
|
||||
### ASSERTION: check that on a non-transactional table, if rotation
|
||||
### fails then an error is reported and an incident event
|
||||
### is written to the current binary log.
|
||||
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
SELECT count(*) FROM t4;
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- error ER_NO_UNIQUE_LOGFILE
|
||||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t4
|
||||
|
||||
-- echo # assert: must show 1 entry
|
||||
SELECT count(*) FROM t4;
|
||||
|
||||
-- echo ### check that the incident event is written to the current log
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
-- let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1)
|
||||
-- let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1)
|
||||
|
||||
# 53 is the size of the incident event, so we start from 22 bytes before the
|
||||
# current position
|
||||
-- let $binlog_start = `SELECT $binlog_start - 53`
|
||||
FLUSH LOGS;
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR $binlog_start <binlog_start> $binlog_file BINLOG_FILE
|
||||
-- replace_column 2 # 4 # 5 #
|
||||
-- eval SHOW BINLOG EVENTS IN '$binlog_file' FROM $binlog_start LIMIT 1
|
||||
|
||||
# clean up and move to next test
|
||||
DELETE FROM t4;
|
||||
RESET MASTER;
|
||||
|
||||
-- echo ###################### TEST #8
|
||||
|
||||
### ASSERTION: check that statements end up in error but they succeed
|
||||
### on changing the data.
|
||||
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
-- echo # must show 0 entries
|
||||
SELECT count(*) FROM t4;
|
||||
SELECT count(*) FROM t2;
|
||||
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- error ER_NO_UNIQUE_LOGFILE
|
||||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t4
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- error ER_NO_UNIQUE_LOGFILE
|
||||
-- eval LOAD DATA INFILE '$load_file' INTO TABLE t2
|
||||
-- error ER_NO_UNIQUE_LOGFILE
|
||||
INSERT INTO t2 VALUES ('aaa'), ('bbb'), ('ccc');
|
||||
|
||||
-- echo # INFO: Count(*) Before Offending DELETEs
|
||||
-- echo # assert: must show 1 entry
|
||||
SELECT count(*) FROM t4;
|
||||
-- echo # assert: must show 4 entries
|
||||
SELECT count(*) FROM t2;
|
||||
|
||||
-- error ER_NO_UNIQUE_LOGFILE
|
||||
DELETE FROM t4;
|
||||
-- error ER_NO_UNIQUE_LOGFILE
|
||||
DELETE FROM t2;
|
||||
|
||||
-- echo # INFO: Count(*) After Offending DELETEs
|
||||
-- echo # assert: must show zero entries
|
||||
SELECT count(*) FROM t4;
|
||||
SELECT count(*) FROM t2;
|
||||
|
||||
# remove fault injection
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
|
||||
-- echo ###################### TEST #9
|
||||
|
||||
### ASSERTION: check that if we disable binlogging, then statements
|
||||
### succeed.
|
||||
SET GLOBAL debug="+d,error_unique_log_filename";
|
||||
SET SQL_LOG_BIN=0;
|
||||
INSERT INTO t2 VALUES ('aaa'), ('bbb'), ('ccc'), ('ddd');
|
||||
INSERT INTO t4 VALUES ('eee'), ('fff'), ('ggg'), ('hhh');
|
||||
-- echo # assert: must show four entries
|
||||
SELECT count(*) FROM t2;
|
||||
SELECT count(*) FROM t4;
|
||||
DELETE FROM t2;
|
||||
DELETE FROM t4;
|
||||
-- echo # assert: must show zero entries
|
||||
SELECT count(*) FROM t2;
|
||||
SELECT count(*) FROM t4;
|
||||
SET SQL_LOG_BIN=1;
|
||||
SET GLOBAL debug="-d,error_unique_log_filename";
|
||||
|
||||
-- echo ###################### TEST #10
|
||||
|
||||
### ASSERTION: check that error is reported if there is a failure
|
||||
### while registering the index file and the binary log
|
||||
### file or failure to write the rotate event.
|
||||
|
||||
call mtr.add_suppression("MSYQL_BIN_LOG::open failed to sync the index file.");
|
||||
call mtr.add_suppression("Could not open .*");
|
||||
|
||||
RESET MASTER;
|
||||
SHOW WARNINGS;
|
||||
|
||||
# +d,fault_injection_registering_index => injects fault on MYSQL_BIN_LOG::open
|
||||
SET GLOBAL debug="+d,fault_injection_registering_index";
|
||||
-- replace_regex /\.[\\\/]master/master/
|
||||
-- error ER_CANT_OPEN_FILE
|
||||
FLUSH LOGS;
|
||||
SET GLOBAL debug="-d,fault_injection_registering_index";
|
||||
|
||||
-- error ER_NO_BINARY_LOGGING
|
||||
SHOW BINARY LOGS;
|
||||
|
||||
# issue some statements and check that they don't fail
|
||||
CREATE TABLE t5 (a INT);
|
||||
INSERT INTO t4 VALUES ('bbbbb');
|
||||
INSERT INTO t2 VALUES ('aaaaa');
|
||||
DELETE FROM t4;
|
||||
DELETE FROM t2;
|
||||
DROP TABLE t5;
|
||||
|
||||
-- echo ###################### TEST #11
|
||||
|
||||
### ASSERTION: check that error is reported if there is a failure
|
||||
### while opening the index file and the binary log file or
|
||||
### failure to write the rotate event.
|
||||
|
||||
# restart the server so that we have binlog again
|
||||
--source include/restart_mysqld.inc
|
||||
|
||||
# +d,fault_injection_openning_index => injects fault on MYSQL_BIN_LOG::open_index_file
|
||||
SET GLOBAL debug="+d,fault_injection_openning_index";
|
||||
-- replace_regex /\.[\\\/]master/master/
|
||||
-- error ER_CANT_OPEN_FILE
|
||||
FLUSH LOGS;
|
||||
SET GLOBAL debug="-d,fault_injection_openning_index";
|
||||
|
||||
-- error ER_FLUSH_MASTER_BINLOG_CLOSED
|
||||
RESET MASTER;
|
||||
|
||||
# issue some statements and check that they don't fail
|
||||
CREATE TABLE t5 (a INT);
|
||||
INSERT INTO t4 VALUES ('bbbbb');
|
||||
INSERT INTO t2 VALUES ('aaaaa');
|
||||
DELETE FROM t4;
|
||||
DELETE FROM t2;
|
||||
DROP TABLE t5;
|
||||
|
||||
# restart the server so that we have binlog again
|
||||
-- source include/restart_mysqld.inc
|
||||
|
||||
-- echo ###################### TEST #12
|
||||
|
||||
### ASSERTION: check that error is reported if there is a failure
|
||||
### while writing the rotate event when creating a new log
|
||||
### file.
|
||||
|
||||
# +d,fault_injection_new_file_rotate_event => injects fault on MYSQL_BIN_LOG::MYSQL_BIN_LOG::new_file_impl
|
||||
SET GLOBAL debug="+d,fault_injection_new_file_rotate_event";
|
||||
-- error ER_ERROR_ON_WRITE
|
||||
FLUSH LOGS;
|
||||
SET GLOBAL debug="-d,fault_injection_new_file_rotate_event";
|
||||
|
||||
-- error ER_FLUSH_MASTER_BINLOG_CLOSED
|
||||
RESET MASTER;
|
||||
|
||||
# issue some statements and check that they don't fail
|
||||
CREATE TABLE t5 (a INT);
|
||||
INSERT INTO t4 VALUES ('bbbbb');
|
||||
INSERT INTO t2 VALUES ('aaaaa');
|
||||
DELETE FROM t4;
|
||||
DELETE FROM t2;
|
||||
DROP TABLE t5;
|
||||
|
||||
# restart the server so that we have binlog again
|
||||
-- source include/restart_mysqld.inc
|
||||
|
||||
## clean up
|
||||
SET GLOBAL debug= @old_debug;
|
||||
DROP TABLE t1, t2, t4;
|
||||
RESET MASTER;
|
||||
|
||||
# restart slave again
|
||||
-- connection slave
|
||||
-- source include/start_slave.inc
|
||||
-- connection master
|
||||
|
||||
-- echo #######################################################################
|
||||
-- echo ####################### PART 2: SLAVE TESTS ###########################
|
||||
-- echo #######################################################################
|
||||
|
||||
### setup
|
||||
-- connection master
|
||||
# master-slave-reset starts the slave automatically
|
||||
-- source include/master-slave-reset.inc
|
||||
-- connection slave
|
||||
|
||||
# slave suppressions
|
||||
|
||||
call mtr.add_suppression("Slave I/O: Relay log write failure: could not queue event from master.*");
|
||||
call mtr.add_suppression("Error writing file .*");
|
||||
call mtr.add_suppression("Could not open .*");
|
||||
call mtr.add_suppression("MSYQL_BIN_LOG::open failed to sync the index file.");
|
||||
call mtr.add_suppression("Can't generate a unique log-filename .*");
|
||||
-- echo ###################### TEST #13
|
||||
|
||||
#### ASSERTION: check against unique log filename error
|
||||
-- let $io_thd_injection_fault_flag= error_unique_log_filename
|
||||
-- let $slave_io_errno= 1595
|
||||
-- let $show_slave_io_error= 1
|
||||
-- source include/io_thd_fault_injection.inc
|
||||
|
||||
-- echo ###################### TEST #14
|
||||
|
||||
#### ASSERTION: check against rotate failing
|
||||
-- let $io_thd_injection_fault_flag= fault_injection_new_file_rotate_event
|
||||
-- let $slave_io_errno= 1595
|
||||
-- let $show_slave_io_error= 1
|
||||
-- source include/io_thd_fault_injection.inc
|
||||
|
||||
-- echo ###################### TEST #15
|
||||
|
||||
#### ASSERTION: check against relay log open failure
|
||||
-- let $io_thd_injection_fault_flag= fault_injection_registering_index
|
||||
-- let $slave_io_errno= 1595
|
||||
-- let $show_slave_io_error= 1
|
||||
-- source include/io_thd_fault_injection.inc
|
||||
|
||||
-- echo ###################### TEST #16
|
||||
|
||||
#### ASSERTION: check against relay log index open failure
|
||||
-- let $io_thd_injection_fault_flag= fault_injection_openning_index
|
||||
-- let $slave_io_errno= 1595
|
||||
-- let $show_slave_io_error= 1
|
||||
-- source include/io_thd_fault_injection.inc
|
||||
|
||||
### clean up
|
||||
-- disable_warnings
|
||||
-- source include/stop_slave.inc
|
||||
-- enable_warnings
|
||||
SET GLOBAL debug=@old_debug;
|
||||
RESET SLAVE;
|
||||
RESET MASTER;
|
||||
-- source include/start_slave.inc
|
||||
-- connection master
|
||||
-- source include/master-slave-end.inc
|
@ -313,9 +313,7 @@ FLUSH LOGS;
|
||||
|
||||
# Stop master server
|
||||
--echo --> Stop master server
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
wait
|
||||
EOF
|
||||
--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
--shutdown_server 10
|
||||
--source include/wait_until_disconnected.inc
|
||||
# Replace binlog
|
||||
@ -323,9 +321,7 @@ remove_file $MYSQLD_DATADIR/master-bin.000001;
|
||||
copy_file $MYSQL_TEST_DIR/std_data/bug16266.000001 $MYSQLD_DATADIR/master-bin.000001;
|
||||
|
||||
--echo --> Start master server
|
||||
--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
restart
|
||||
EOF
|
||||
--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
--enable_reconnect
|
||||
--source include/wait_until_connected_again.inc
|
||||
let $binlog_version= query_get_value(SHOW BINLOG EVENTS, Info, 1);
|
||||
|
@ -342,3 +342,24 @@ SELECT a FROM t2;
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#39828 autoinc wraps around when offset and increment > 1
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (c1 BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(c1)) engine=MyISAM;
|
||||
INSERT INTO t1 VALUES(1);
|
||||
INSERT INTO t1 VALUES (18446744073709551601);
|
||||
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=10;
|
||||
|
||||
SELECT @@SESSION.AUTO_INCREMENT_OFFSET;
|
||||
--error ER_WARN_DATA_OUT_OF_RANGE
|
||||
INSERT INTO t1 VALUES (NULL), (NULL), (NULL);
|
||||
SELECT * FROM t1;
|
||||
|
||||
SET @@SESSION.AUTO_INCREMENT_INCREMENT=default;
|
||||
SET @@SESSION.AUTO_INCREMENT_OFFSET=default;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -20,7 +20,7 @@ SET @@session.max_join_size = default;
|
||||
SELECT @@session.sql_big_selects;
|
||||
# On some machines the following will result into a warning
|
||||
--disable_warnings
|
||||
SET @@global.max_join_size = -1;
|
||||
SET @@global.max_join_size = 18446744073709551615;
|
||||
--enable_warnings
|
||||
SET @@session.max_join_size = default;
|
||||
--echo change_user
|
||||
|
@ -293,6 +293,34 @@ SET GLOBAL event_scheduler = OFF;
|
||||
--echo # -- End of Bug#35074.
|
||||
--echo
|
||||
|
||||
|
||||
###########################################################################
|
||||
|
||||
--echo #
|
||||
--echo # -- Bug#49752: 2469.126.2 unintentionally breaks authentication
|
||||
--echo # against MySQL 5.1 server
|
||||
--echo #
|
||||
|
||||
GRANT ALL ON test.* TO 'Azundris12345678'@'localhost' IDENTIFIED BY 'test123';
|
||||
|
||||
FLUSH PRIVILEGES;
|
||||
|
||||
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
|
||||
connect (con1,localhost,Azundris123456789,test123,test);
|
||||
disconnect con1;
|
||||
|
||||
connection default;
|
||||
|
||||
DROP USER 'Azundris12345678'@'localhost';
|
||||
|
||||
FLUSH PRIVILEGES;
|
||||
|
||||
--echo #
|
||||
--echo # -- End of Bug#49752
|
||||
--echo #
|
||||
|
||||
|
||||
|
||||
--echo # ------------------------------------------------------------------
|
||||
--echo # -- End of 5.1 tests
|
||||
--echo # ------------------------------------------------------------------
|
||||
|
@ -48,3 +48,13 @@ select * from t1 where a like 'we_%';
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
--echo #
|
||||
--echo # Start of 5.1 tests
|
||||
--echo #
|
||||
|
||||
--source include/ctype_8bit.inc
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.1 tests
|
||||
--echo #
|
||||
|
@ -301,4 +301,15 @@ SELECT 0 FROM
|
||||
(SELECT 0) t56, (SELECT 0) t57, (SELECT 0) t58, (SELECT 0) t59, (SELECT 0) t60,
|
||||
(SELECT 0) t61; # 61 == MAX_TABLES
|
||||
|
||||
--echo #
|
||||
--echo # A nested materialized derived table is used before being populated.
|
||||
--echo # (addon for bug#19077)
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (i INT, j BIGINT);
|
||||
INSERT INTO t1 VALUES (1, 2), (2, 2), (3, 2);
|
||||
SELECT * FROM (SELECT MIN(i) FROM t1
|
||||
WHERE j = SUBSTRING('12', (SELECT * FROM (SELECT MIN(j) FROM t1) t2))) t3;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # End of 5.0 tests
|
||||
|
@ -746,4 +746,15 @@ SELECT POLYGON((SELECT 1 FROM (SELECT 1 IN (GROUP_CONCAT(t1.f1)) FROM t1, t1 t G
|
||||
--enable_ps_protocol
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#58396 group_concat and explain extended are still crashy
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a INT);
|
||||
--error ER_UNKNOWN_ERROR
|
||||
EXPLAIN EXTENDED SELECT UPDATEXML('1', a, '1')
|
||||
FROM t1 ORDER BY (SELECT GROUP_CONCAT(1) FROM t1);
|
||||
SHOW WARNINGS;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -1362,4 +1362,11 @@ SELECT 1 FROM t1, t1 t2
|
||||
ORDER BY QUOTE(t1.a);
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#57913 large negative number to string conversion functions crash
|
||||
--echo # Bug#57810 case/when/then : Assertion failed: length || !scale
|
||||
--echo #
|
||||
SELECT '1' IN ('1', SUBSTRING(-9223372036854775809, 1));
|
||||
SELECT CONVERT(('' IN (REVERSE(CAST(('') AS DECIMAL)), '')), CHAR(3));
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -216,6 +216,7 @@ set global key_cache_block_size= @my_key_cache_block_size;
|
||||
# Bug#10473 - Can't set 'key_buffer_size' system variable to ZERO
|
||||
# (One cannot drop the default key cache.)
|
||||
#
|
||||
--error ER_WARN_CANT_DROP_DEFAULT_KEYCACHE
|
||||
set @@global.key_buffer_size=0;
|
||||
select @@global.key_buffer_size;
|
||||
|
||||
|
@ -673,4 +673,15 @@ SET t3.a = 0;
|
||||
DROP TABLE t1, t2, t3;
|
||||
SET SESSION sql_safe_updates = DEFAULT;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#52157 various crashes and assertions with multi-table update, stored function
|
||||
--echo #
|
||||
|
||||
CREATE FUNCTION f1 () RETURNS BLOB RETURN 1;
|
||||
CREATE TABLE t1 (f1 DATE);
|
||||
INSERT INTO t1 VALUES('2001-01-01');
|
||||
UPDATE (SELECT 1 FROM t1 WHERE f1 = (SELECT f1() FROM t1)) x, t1 SET f1 = 1;
|
||||
DROP FUNCTION f1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo end of tests
|
||||
|
@ -412,5 +412,148 @@ drop table t1;
|
||||
--echo
|
||||
--exec $MYSQL --skip-column-names --vertical test -e "select 1 as a"
|
||||
|
||||
--echo
|
||||
|
||||
--echo #
|
||||
--echo # Bug #54899: --one-database option cannot handle DROP/CREATE DATABASE
|
||||
--echo # commands.
|
||||
--echo #
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/bug54899.sql
|
||||
DROP DATABASE connected_db;
|
||||
CREATE DATABASE connected_db;
|
||||
USE connected_db;
|
||||
CREATE TABLE `table_in_connected_db`(a INT);
|
||||
EOF
|
||||
|
||||
CREATE DATABASE connected_db;
|
||||
--exec $MYSQL --one-database connected_db < $MYSQLTEST_VARDIR/tmp/bug54899.sql
|
||||
USE connected_db;
|
||||
SHOW TABLES;
|
||||
DROP DATABASE connected_db;
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/bug54899.sql
|
||||
|
||||
--echo
|
||||
|
||||
--echo #
|
||||
--echo # Testing --one-database option
|
||||
--echo #
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
CREATE TABLE t1 (i INT);
|
||||
CREATE TABLE test.t1 (i INT);
|
||||
USE test;
|
||||
# Following statements should be filtered.
|
||||
CREATE TABLE connected_db.t2 (i INT);
|
||||
CREATE TABLE t2 (i INT);
|
||||
EOF
|
||||
|
||||
CREATE DATABASE connected_db;
|
||||
--exec $MYSQL --one-database connected_db < $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
SHOW TABLES IN connected_db;
|
||||
SHOW TABLES IN test;
|
||||
USE test;
|
||||
DROP TABLE t1;
|
||||
DROP DATABASE connected_db;
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
|
||||
--echo
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
CREATE DATABASE test1;
|
||||
USE test1;
|
||||
USE test1;
|
||||
# Following statements should be filtered.
|
||||
CREATE TABLE connected_db.t1 (i INT);
|
||||
EOF
|
||||
|
||||
--exec $MYSQL --one-database test < $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
SHOW TABLES IN test;
|
||||
SHOW TABLES IN test1;
|
||||
DROP DATABASE test1;
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
|
||||
--echo
|
||||
|
||||
--echo #
|
||||
--echo # Checking --one-database option followed by the execution of
|
||||
--echo # connect command.
|
||||
--echo #
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
CREATE TABLE t1 (i INT);
|
||||
CREATE TABLE test.t1 (i INT);
|
||||
CONNECT test;
|
||||
CREATE TABLE connected_db.t2 (i INT);
|
||||
CREATE TABLE t2 (i INT);
|
||||
USE connected_db;
|
||||
# Following statements should be filtered.
|
||||
CREATE TABLE connected_db.t3 (i INT);
|
||||
CREATE TABLE t3 (i INT);
|
||||
EOF
|
||||
|
||||
CREATE DATABASE connected_db;
|
||||
--exec $MYSQL --one-database connected_db < $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
SHOW TABLES IN connected_db;
|
||||
SHOW TABLES IN test;
|
||||
DROP TABLE test.t1;
|
||||
DROP TABLE test.t2;
|
||||
DROP DATABASE connected_db;
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
|
||||
--echo
|
||||
|
||||
--echo #
|
||||
--echo # Checking --one-database option with no database specified
|
||||
--echo # at command-line.
|
||||
--echo #
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
# All following statements should be filtered.
|
||||
CREATE TABLE t1 (i INT);
|
||||
CREATE TABLE test.t1 (i INT);
|
||||
USE test;
|
||||
CREATE TABLE test.t2 (i INT);
|
||||
CREATE TABLE t2 (i INT);
|
||||
EOF
|
||||
|
||||
--exec $MYSQL --one-database < $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
SHOW TABLES IN test;
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/one_db.sql
|
||||
|
||||
--echo
|
||||
|
||||
--echo #
|
||||
--echo # Checking --one-database option with non_existent_db
|
||||
--echo # specified with USE command
|
||||
--echo #
|
||||
|
||||
# CASE 1 : When 'connected_db' database exists and passed at commandline.
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/one_db_1.sql
|
||||
CREATE TABLE `table_in_connected_db`(i INT);
|
||||
USE non_existent_db;
|
||||
# Following statement should be filtered out.
|
||||
CREATE TABLE `table_in_non_existent_db`(i INT);
|
||||
EOF
|
||||
|
||||
# CASE 2 : When 'connected_db' database exists but dropped and recreated in
|
||||
# load file.
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/one_db_2.sql
|
||||
DROP DATABASE connected_db;
|
||||
CREATE DATABASE connected_db;
|
||||
USE non_existent_db;
|
||||
# Following statements should be filtered out.
|
||||
CREATE TABLE `table_in_non_existent_db`(i INT);
|
||||
USE connected_db;
|
||||
# Following statements should not be filtered out.
|
||||
CREATE TABLE `table_in_connected_db`(i INT);
|
||||
EOF
|
||||
|
||||
CREATE DATABASE connected_db;
|
||||
--exec $MYSQL --one-database connected_db < $MYSQLTEST_VARDIR/tmp/one_db_1.sql
|
||||
SHOW TABLES IN connected_db;
|
||||
--echo
|
||||
--exec $MYSQL --one-database connected_db < $MYSQLTEST_VARDIR/tmp/one_db_2.sql
|
||||
SHOW TABLES IN connected_db;
|
||||
DROP DATABASE connected_db;
|
||||
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/one_db_1.sql
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/one_db_2.sql
|
||||
|
||||
--echo
|
||||
--echo End of tests
|
||||
|
@ -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
|
||||
|
||||
|
@ -18,3 +18,15 @@ UNINSTALL PLUGIN example;
|
||||
disconnect con1;
|
||||
connection default;
|
||||
DROP USER bug51770@localhost;
|
||||
|
||||
#
|
||||
# BUG#58246: INSTALL PLUGIN not secure & crashable
|
||||
#
|
||||
# The bug consisted of not recognizing / on Windows, so checking / on
|
||||
# all platforms should cover this case.
|
||||
|
||||
let $path = `select CONCAT_WS('/', '..', $HA_EXAMPLE_SO)`;
|
||||
--replace_regex /\.dll/.so/
|
||||
--error ER_UDF_NO_PATHS
|
||||
eval INSTALL PLUGIN example SONAME '$path';
|
||||
|
||||
|
@ -1255,4 +1255,48 @@ SET GLOBAL max_binlog_cache_size = @old_max_binlog_cache_size;
|
||||
SELECT @@skip_name_resolve;
|
||||
SHOW VARIABLES LIKE 'skip_name_resolve';
|
||||
|
||||
--echo #
|
||||
--echo # Bug #43233 : Some server variables are clipped during "update,"
|
||||
--echo # not "check" stage
|
||||
--echo #
|
||||
|
||||
SET @kbs=@@global.key_buffer_size;
|
||||
SET @kcbs=@@global.key_cache_block_size;
|
||||
|
||||
--echo throw errors in STRICT mode
|
||||
SET SQL_MODE=STRICT_ALL_TABLES;
|
||||
|
||||
# sys_var_ulonglong_ptr: sys_max_binlog_cache_size
|
||||
--error ER_WRONG_VALUE_FOR_VAR
|
||||
SET @@global.max_binlog_cache_size=-1;
|
||||
|
||||
# sys_var_thd_ha_rows: "max_join_size" et al.
|
||||
--error ER_WRONG_VALUE_FOR_VAR
|
||||
SET @@global.max_join_size=0;
|
||||
|
||||
# sys_var_key_buffer_size: "key_buffer_size"
|
||||
--error ER_WARN_CANT_DROP_DEFAULT_KEYCACHE
|
||||
SET @@global.key_buffer_size=0;
|
||||
|
||||
# sys_var_key_cache_long: "key_cache_block_size" et al.
|
||||
--error ER_WRONG_VALUE_FOR_VAR
|
||||
SET @@global.key_cache_block_size=0;
|
||||
|
||||
--echo throw warnings in default mode
|
||||
SET SQL_MODE=DEFAULT;
|
||||
|
||||
SET @@global.max_binlog_cache_size=-1;
|
||||
SET @@global.max_join_size=0;
|
||||
# this is an exception. since this is a new error/warning, let's stay
|
||||
# compatible with the upcoming 5.6.
|
||||
--error ER_WARN_CANT_DROP_DEFAULT_KEYCACHE
|
||||
SET @@global.key_buffer_size=0;
|
||||
SET @@global.key_cache_block_size=0;
|
||||
|
||||
# cleanup
|
||||
SET @@global.max_binlog_cache_size=DEFAULT;
|
||||
SET @@global.max_join_size=DEFAULT;
|
||||
SET @@global.key_buffer_size=@kbs;
|
||||
SET @@global.key_cache_block_size=@kcbs;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -3925,6 +3925,22 @@ WHERE t1.b <=> (SELECT a FROM t1 WHERE a < SOME(SELECT '1'));
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#57703 create view cause Assertion failed: 0, file .\item_subselect.cc, line 846
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a int);
|
||||
CREATE VIEW v1 AS SELECT 1 FROM t1 GROUP BY
|
||||
SUBSTRING(1 FROM (SELECT 3 FROM t1 WHERE a >= ANY(SELECT 1)));
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#57352 valgrind warnings when creating view
|
||||
--echo #
|
||||
CREATE VIEW v1 AS SELECT 1 IN (1 LIKE 2,0) AS f;
|
||||
DROP VIEW v1;
|
||||
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo # -- End of 5.1 tests.
|
||||
--echo # -----------------------------------------------------------------
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
@ -27,6 +27,11 @@
|
||||
#include <unistd.h>
|
||||
#include <strings.h>
|
||||
|
||||
#ifdef __linux__
|
||||
#include <ctype.h> /* isprint */
|
||||
#include <sys/syscall.h> /* SYS_gettid */
|
||||
#endif
|
||||
|
||||
#if HAVE_EXECINFO_H
|
||||
#include <execinfo.h>
|
||||
#endif
|
||||
@ -46,10 +51,99 @@ void my_init_stacktrace()
|
||||
#endif
|
||||
}
|
||||
|
||||
void my_safe_print_str(const char* name, const char* val, int max_len)
|
||||
#ifdef __linux__
|
||||
|
||||
static void print_buffer(char *buffer, size_t count)
|
||||
{
|
||||
char *heap_end= (char*) sbrk(0);
|
||||
fprintf(stderr, "%s at %p ", name, val);
|
||||
for (; count && *buffer; --count)
|
||||
{
|
||||
int c= (int) *buffer++;
|
||||
fputc(isprint(c) ? c : ' ', stderr);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Access the pages of this process through /proc/self/task/<tid>/mem
|
||||
in order to safely print the contents of a memory address range.
|
||||
|
||||
@param addr The address at the start of the memory region.
|
||||
@param max_len The length of the memory region.
|
||||
|
||||
@return Zero on success.
|
||||
*/
|
||||
static int safe_print_str(const char *addr, int max_len)
|
||||
{
|
||||
int fd;
|
||||
pid_t tid;
|
||||
off_t offset;
|
||||
ssize_t nbytes= 0;
|
||||
size_t total, count;
|
||||
char buf[256];
|
||||
|
||||
tid= (pid_t) syscall(SYS_gettid);
|
||||
|
||||
sprintf(buf, "/proc/self/task/%d/mem", tid);
|
||||
|
||||
if ((fd= open(buf, O_RDONLY)) < 0)
|
||||
return -1;
|
||||
|
||||
/* Ensure that off_t can hold a pointer. */
|
||||
compile_time_assert(sizeof(off_t) >= sizeof(intptr));
|
||||
|
||||
total= max_len;
|
||||
offset= (intptr) addr;
|
||||
|
||||
/* Read up to the maximum number of bytes. */
|
||||
while (total)
|
||||
{
|
||||
count= min(sizeof(buf), total);
|
||||
|
||||
if ((nbytes= pread(fd, buf, count, offset)) < 0)
|
||||
{
|
||||
/* Just in case... */
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
/* Advance offset into memory. */
|
||||
total-= nbytes;
|
||||
offset+= nbytes;
|
||||
addr+= nbytes;
|
||||
|
||||
/* Output the printable characters. */
|
||||
print_buffer(buf, nbytes);
|
||||
|
||||
/* Break if less than requested... */
|
||||
if ((count - nbytes))
|
||||
break;
|
||||
}
|
||||
|
||||
/* Output a new line if something was printed. */
|
||||
if (total != (size_t) max_len)
|
||||
fputc('\n', stderr);
|
||||
|
||||
if (nbytes == -1)
|
||||
fprintf(stderr, "Can't read from address %p: %m.\n", addr);
|
||||
|
||||
close(fd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void my_safe_print_str(const char* val, int max_len)
|
||||
{
|
||||
char *heap_end;
|
||||
|
||||
#ifdef __linux__
|
||||
if (!safe_print_str(val, max_len))
|
||||
return;
|
||||
#endif
|
||||
|
||||
heap_end= (char*) sbrk(0);
|
||||
|
||||
if (!PTR_SANE(val))
|
||||
{
|
||||
@ -57,7 +151,6 @@ void my_safe_print_str(const char* name, const char* val, int max_len)
|
||||
return;
|
||||
}
|
||||
|
||||
fprintf(stderr, "= ");
|
||||
for (; max_len && PTR_SANE(val) && *val; --max_len)
|
||||
fputc(*val++, stderr);
|
||||
fputc('\n', stderr);
|
||||
@ -657,10 +750,9 @@ void my_write_core(int unused)
|
||||
}
|
||||
|
||||
|
||||
void my_safe_print_str(const char *name, const char *val, int len)
|
||||
void my_safe_print_str(const char *val, int len)
|
||||
{
|
||||
fprintf(stderr,"%s at %p", name, val);
|
||||
__try
|
||||
__try
|
||||
{
|
||||
fprintf(stderr,"=%.*s\n", len, val);
|
||||
}
|
||||
|
@ -1192,7 +1192,11 @@ int ha_commit_trans(THD *thd, bool all)
|
||||
error=ha_commit_one_phase(thd, all) ? (cookie ? 2 : 1) : 0;
|
||||
DBUG_EXECUTE_IF("crash_commit_before_unlog", DBUG_SUICIDE(););
|
||||
if (cookie)
|
||||
tc_log->unlog(cookie, xid);
|
||||
if(tc_log->unlog(cookie, xid))
|
||||
{
|
||||
error= 2;
|
||||
goto end;
|
||||
}
|
||||
DBUG_EXECUTE_IF("crash_commit_after", DBUG_SUICIDE(););
|
||||
end:
|
||||
if (rw_trans)
|
||||
@ -2166,7 +2170,8 @@ int handler::read_first_row(uchar * buf, uint primary_key)
|
||||
computes the lowest number
|
||||
- strictly greater than "nr"
|
||||
- of the form: auto_increment_offset + N * auto_increment_increment
|
||||
|
||||
If overflow happened then return MAX_ULONGLONG value as an
|
||||
indication of overflow.
|
||||
In most cases increment= offset= 1, in which case we get:
|
||||
@verbatim 1,2,3,4,5,... @endverbatim
|
||||
If increment=10 and offset=5 and previous number is 1, we get:
|
||||
@ -2175,13 +2180,23 @@ int handler::read_first_row(uchar * buf, uint primary_key)
|
||||
inline ulonglong
|
||||
compute_next_insert_id(ulonglong nr,struct system_variables *variables)
|
||||
{
|
||||
const ulonglong save_nr= nr;
|
||||
|
||||
if (variables->auto_increment_increment == 1)
|
||||
return (nr+1); // optimization of the formula below
|
||||
nr= (((nr+ variables->auto_increment_increment -
|
||||
variables->auto_increment_offset)) /
|
||||
(ulonglong) variables->auto_increment_increment);
|
||||
return (nr* (ulonglong) variables->auto_increment_increment +
|
||||
variables->auto_increment_offset);
|
||||
nr= nr + 1; // optimization of the formula below
|
||||
else
|
||||
{
|
||||
nr= (((nr+ variables->auto_increment_increment -
|
||||
variables->auto_increment_offset)) /
|
||||
(ulonglong) variables->auto_increment_increment);
|
||||
nr= (nr* (ulonglong) variables->auto_increment_increment +
|
||||
variables->auto_increment_offset);
|
||||
}
|
||||
|
||||
if (unlikely(nr <= save_nr))
|
||||
return ULONGLONG_MAX;
|
||||
|
||||
return nr;
|
||||
}
|
||||
|
||||
|
||||
@ -2392,7 +2407,7 @@ int handler::update_auto_increment()
|
||||
variables->auto_increment_increment,
|
||||
nb_desired_values, &nr,
|
||||
&nb_reserved_values);
|
||||
if (nr == ~(ulonglong) 0)
|
||||
if (nr == ULONGLONG_MAX)
|
||||
DBUG_RETURN(HA_ERR_AUTOINC_READ_FAILED); // Mark failure
|
||||
|
||||
/*
|
||||
@ -2423,6 +2438,9 @@ int handler::update_auto_increment()
|
||||
}
|
||||
}
|
||||
|
||||
if (unlikely(nr == ULONGLONG_MAX))
|
||||
DBUG_RETURN(HA_ERR_AUTOINC_ERANGE);
|
||||
|
||||
DBUG_PRINT("info",("auto_increment: %lu", (ulong) nr));
|
||||
|
||||
if (unlikely(table->next_number_field->store((longlong) nr, TRUE)))
|
||||
|
11
sql/item.cc
11
sql/item.cc
@ -1712,16 +1712,7 @@ bool agg_item_set_converter(DTCollation &coll, const char *fname,
|
||||
|
||||
if (!(conv= (*arg)->safe_charset_converter(coll.collation)) &&
|
||||
((*arg)->collation.repertoire == MY_REPERTOIRE_ASCII))
|
||||
{
|
||||
/*
|
||||
We should disable const subselect item evaluation because
|
||||
subselect transformation does not happen in view_prepare_mode
|
||||
and thus val_...() methods can not be called for const items.
|
||||
*/
|
||||
bool resolve_const= ((*arg)->type() == Item::SUBSELECT_ITEM &&
|
||||
thd->lex->view_prepare_mode) ? FALSE : TRUE;
|
||||
conv= new Item_func_conv_charset(*arg, coll.collation, resolve_const);
|
||||
}
|
||||
conv= new Item_func_conv_charset(*arg, coll.collation, 1);
|
||||
|
||||
if (!conv)
|
||||
{
|
||||
|
@ -401,7 +401,7 @@ static bool convert_constant_item(THD *thd, Item_field *field_item,
|
||||
Field *field= field_item->field;
|
||||
int result= 0;
|
||||
|
||||
if (!(*item)->with_subselect && (*item)->const_item())
|
||||
if ((*item)->const_item())
|
||||
{
|
||||
TABLE *table= field->table;
|
||||
ulong orig_sql_mode= thd->variables.sql_mode;
|
||||
@ -497,7 +497,7 @@ void Item_bool_func2::fix_length_and_dec()
|
||||
}
|
||||
|
||||
thd= current_thd;
|
||||
if (!thd->is_context_analysis_only())
|
||||
if (!thd->lex->is_ps_or_view_context_analysis())
|
||||
{
|
||||
if (args[0]->real_item()->type() == FIELD_ITEM)
|
||||
{
|
||||
@ -801,7 +801,7 @@ Arg_comparator::can_compare_as_dates(Item *a, Item *b, ulonglong *const_value)
|
||||
confuse storage engines since in context analysis mode tables
|
||||
aren't locked.
|
||||
*/
|
||||
if (!thd->is_context_analysis_only() &&
|
||||
if (!thd->lex->is_ps_or_view_context_analysis() &&
|
||||
cmp_type != CMP_DATE_WITH_DATE && str_arg->const_item() &&
|
||||
(str_arg->type() != Item::FUNC_ITEM ||
|
||||
((Item_func*)str_arg)->functype() != Item_func::GUSERVAR_FUNC))
|
||||
@ -1027,7 +1027,7 @@ Item** Arg_comparator::cache_converted_constant(THD *thd_arg, Item **value,
|
||||
Item_result type)
|
||||
{
|
||||
/* Don't need cache if doing context analysis only. */
|
||||
if (!thd_arg->is_context_analysis_only() &&
|
||||
if (!thd->lex->is_ps_or_view_context_analysis() &&
|
||||
(*value)->const_item() && type != (*value)->result_type())
|
||||
{
|
||||
Item_cache *cache= Item_cache::get_cache(*value, type);
|
||||
@ -4686,7 +4686,7 @@ bool Item_func_like::fix_fields(THD *thd, Item **ref)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (escape_item->const_item() && !thd->lex->view_prepare_mode)
|
||||
if (escape_item->const_item())
|
||||
{
|
||||
/* If we are on execution stage */
|
||||
String *escape_str= escape_item->val_str(&cmp.value1);
|
||||
|
@ -4876,7 +4876,7 @@ void Item_func_get_system_var::fix_length_and_dec()
|
||||
decimals=0;
|
||||
break;
|
||||
case SHOW_LONGLONG:
|
||||
unsigned_flag= FALSE;
|
||||
unsigned_flag= TRUE;
|
||||
max_length= MY_INT64_NUM_DECIMAL_DIGITS;
|
||||
decimals=0;
|
||||
break;
|
||||
@ -5017,7 +5017,7 @@ longlong Item_func_get_system_var::val_int()
|
||||
{
|
||||
case SHOW_INT: get_sys_var_safe (uint);
|
||||
case SHOW_LONG: get_sys_var_safe (ulong);
|
||||
case SHOW_LONGLONG: get_sys_var_safe (longlong);
|
||||
case SHOW_LONGLONG: get_sys_var_safe (ulonglong);
|
||||
case SHOW_HA_ROWS: get_sys_var_safe (ha_rows);
|
||||
case SHOW_BOOL: get_sys_var_safe (bool);
|
||||
case SHOW_MY_BOOL: get_sys_var_safe (my_bool);
|
||||
@ -6066,7 +6066,7 @@ Item_func_sp::fix_fields(THD *thd, Item **ref)
|
||||
if (res)
|
||||
DBUG_RETURN(res);
|
||||
|
||||
if (thd->lex->view_prepare_mode)
|
||||
if (thd->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW)
|
||||
{
|
||||
/*
|
||||
Here we check privileges of the stored routine only during view
|
||||
|
@ -73,12 +73,8 @@ bool Item_row::fix_fields(THD *thd, Item **ref)
|
||||
used_tables_cache |= item->used_tables();
|
||||
const_item_cache&= item->const_item() && !with_null;
|
||||
not_null_tables_cache|= item->not_null_tables();
|
||||
/*
|
||||
Some subqueries transformations aren't done in the view_prepare_mode thus
|
||||
is_null() will fail. So we skip is_null() calculation for CREATE VIEW as
|
||||
not necessary.
|
||||
*/
|
||||
if (const_item_cache && !thd->lex->view_prepare_mode)
|
||||
|
||||
if (const_item_cache)
|
||||
{
|
||||
if (item->cols() > 1)
|
||||
with_null|= item->null_inside();
|
||||
|
@ -123,20 +123,6 @@ void Item_subselect::cleanup()
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
We cannot use generic Item::safe_charset_converter() because
|
||||
Subselect transformation does not happen in view_prepare_mode
|
||||
and thus we can not evaluate val_...() for const items.
|
||||
*/
|
||||
|
||||
Item *Item_subselect::safe_charset_converter(CHARSET_INFO *tocs)
|
||||
{
|
||||
Item_func_conv_charset *conv=
|
||||
new Item_func_conv_charset(this, tocs, thd->lex->view_prepare_mode ? 0 : 1);
|
||||
return conv->safe ? conv : NULL;
|
||||
}
|
||||
|
||||
|
||||
void Item_singlerow_subselect::cleanup()
|
||||
{
|
||||
DBUG_ENTER("Item_singlerow_subselect::cleanup");
|
||||
@ -271,6 +257,7 @@ bool Item_subselect::exec()
|
||||
if (thd->is_error() || thd->killed)
|
||||
return 1;
|
||||
|
||||
DBUG_ASSERT(!thd->lex->context_analysis_only);
|
||||
/*
|
||||
Simulate a failure in sub-query execution. Used to test e.g.
|
||||
out of memory or query being killed conditions.
|
||||
@ -307,7 +294,7 @@ table_map Item_subselect::used_tables() const
|
||||
|
||||
bool Item_subselect::const_item() const
|
||||
{
|
||||
return const_item_cache;
|
||||
return thd->lex->context_analysis_only ? FALSE : const_item_cache;
|
||||
}
|
||||
|
||||
Item *Item_subselect::get_tmp_table_item(THD *thd_arg)
|
||||
@ -1638,7 +1625,8 @@ bool Item_in_subselect::fix_fields(THD *thd_arg, Item **ref)
|
||||
{
|
||||
bool result = 0;
|
||||
|
||||
if (thd_arg->lex->view_prepare_mode && left_expr && !left_expr->fixed)
|
||||
if ((thd_arg->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW) &&
|
||||
left_expr && !left_expr->fixed)
|
||||
result = left_expr->fix_fields(thd_arg, &left_expr);
|
||||
|
||||
return result || Item_subselect::fix_fields(thd_arg, ref);
|
||||
|
@ -126,7 +126,6 @@ public:
|
||||
virtual void reset_value_registration() {}
|
||||
enum_parsing_place place() { return parsing_place; }
|
||||
bool walk(Item_processor processor, bool walk_subquery, uchar *arg);
|
||||
Item *safe_charset_converter(CHARSET_INFO *tocs);
|
||||
|
||||
/**
|
||||
Get the SELECT_LEX structure associated with this Item.
|
||||
|
@ -3003,6 +3003,7 @@ Item_func_group_concat(Name_resolution_context *context_arg,
|
||||
order_item->item= arg_ptr++;
|
||||
}
|
||||
}
|
||||
memcpy(orig_args, args, sizeof(Item*) * arg_count);
|
||||
}
|
||||
|
||||
|
||||
@ -3233,7 +3234,6 @@ Item_func_group_concat::fix_fields(THD *thd, Item **ref)
|
||||
if (check_sum_func(thd, ref))
|
||||
return TRUE;
|
||||
|
||||
memcpy (orig_args, args, sizeof (Item *) * arg_count);
|
||||
fixed= 1;
|
||||
return FALSE;
|
||||
}
|
||||
|
176
sql/log.cc
176
sql/log.cc
@ -1871,10 +1871,11 @@ static int find_uniq_filename(char *name)
|
||||
*end='.';
|
||||
length= (size_t) (end-start+1);
|
||||
|
||||
if (!(dir_info = my_dir(buff,MYF(MY_DONT_SORT))))
|
||||
if ((DBUG_EVALUATE_IF("error_unique_log_filename", 1,
|
||||
!(dir_info = my_dir(buff,MYF(MY_DONT_SORT))))))
|
||||
{ // This shouldn't happen
|
||||
strmov(end,".1"); // use name+1
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
file_info= dir_info->dir_entry;
|
||||
for (i=dir_info->number_off_files ; i-- ; file_info++)
|
||||
@ -1888,8 +1889,7 @@ static int find_uniq_filename(char *name)
|
||||
my_dirend(dir_info);
|
||||
|
||||
*end++='.';
|
||||
sprintf(end,"%06ld",max_found+1);
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN((sprintf(end,"%06ld",max_found+1) < 0));
|
||||
}
|
||||
|
||||
|
||||
@ -2101,6 +2101,8 @@ int MYSQL_LOG::generate_new_name(char *new_name, const char *log_name)
|
||||
{
|
||||
if (find_uniq_filename(new_name))
|
||||
{
|
||||
my_printf_error(ER_NO_UNIQUE_LOGFILE, ER(ER_NO_UNIQUE_LOGFILE),
|
||||
MYF(ME_FATALERROR), log_name);
|
||||
sql_print_error(ER(ER_NO_UNIQUE_LOGFILE), log_name);
|
||||
return 1;
|
||||
}
|
||||
@ -2597,6 +2599,23 @@ bool MYSQL_BIN_LOG::open(const char *log_name,
|
||||
sync_purge_index_file() ||
|
||||
DBUG_EVALUATE_IF("fault_injection_registering_index", 1, 0))
|
||||
{
|
||||
/**
|
||||
TODO: although this was introduced to appease valgrind
|
||||
when injecting emulated faults using fault_injection_registering_index
|
||||
it may be good to consider what actually happens when
|
||||
open_purge_index_file succeeds but register or sync fails.
|
||||
|
||||
Perhaps we might need the code below in MYSQL_LOG_BIN::cleanup
|
||||
for "real life" purposes as well?
|
||||
*/
|
||||
DBUG_EXECUTE_IF("fault_injection_registering_index", {
|
||||
if (my_b_inited(&purge_index_file))
|
||||
{
|
||||
end_io_cache(&purge_index_file);
|
||||
my_close(purge_index_file.file, MYF(0));
|
||||
}
|
||||
});
|
||||
|
||||
sql_print_error("MSYQL_BIN_LOG::open failed to sync the index file.");
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
@ -3037,7 +3056,7 @@ bool MYSQL_BIN_LOG::reset_logs(THD* thd)
|
||||
}
|
||||
|
||||
/* Start logging with a new file */
|
||||
close(LOG_CLOSE_INDEX);
|
||||
close(LOG_CLOSE_INDEX | LOG_CLOSE_TO_BE_OPENED);
|
||||
if ((error= my_delete_allow_opened(index_file_name, MYF(0)))) // Reset (open will update)
|
||||
{
|
||||
if (my_errno == ENOENT)
|
||||
@ -3066,7 +3085,8 @@ bool MYSQL_BIN_LOG::reset_logs(THD* thd)
|
||||
if (!thd->slave_thread)
|
||||
need_start_event=1;
|
||||
if (!open_index_file(index_file_name, 0, FALSE))
|
||||
open(save_name, log_type, 0, io_cache_type, no_auto_events, max_size, 0, FALSE);
|
||||
if ((error= open(save_name, log_type, 0, io_cache_type, no_auto_events, max_size, 0, FALSE)))
|
||||
goto err;
|
||||
my_free((uchar*) save_name, MYF(0));
|
||||
|
||||
err:
|
||||
@ -3728,17 +3748,23 @@ bool MYSQL_BIN_LOG::is_active(const char *log_file_name_arg)
|
||||
incapsulation 3) allows external access to the class without
|
||||
a lock (which is not possible with private new_file_without_locking
|
||||
method).
|
||||
|
||||
@retval
|
||||
nonzero - error
|
||||
*/
|
||||
|
||||
void MYSQL_BIN_LOG::new_file()
|
||||
int MYSQL_BIN_LOG::new_file()
|
||||
{
|
||||
new_file_impl(1);
|
||||
return new_file_impl(1);
|
||||
}
|
||||
|
||||
|
||||
void MYSQL_BIN_LOG::new_file_without_locking()
|
||||
/*
|
||||
@retval
|
||||
nonzero - error
|
||||
*/
|
||||
int MYSQL_BIN_LOG::new_file_without_locking()
|
||||
{
|
||||
new_file_impl(0);
|
||||
return new_file_impl(0);
|
||||
}
|
||||
|
||||
|
||||
@ -3747,19 +3773,23 @@ void MYSQL_BIN_LOG::new_file_without_locking()
|
||||
|
||||
@param need_lock Set to 1 if caller has not locked LOCK_log
|
||||
|
||||
@retval
|
||||
nonzero - error
|
||||
|
||||
@note
|
||||
The new file name is stored last in the index file
|
||||
*/
|
||||
|
||||
void MYSQL_BIN_LOG::new_file_impl(bool need_lock)
|
||||
int MYSQL_BIN_LOG::new_file_impl(bool need_lock)
|
||||
{
|
||||
char new_name[FN_REFLEN], *new_name_ptr, *old_name;
|
||||
int error= 0, close_on_error= FALSE;
|
||||
char new_name[FN_REFLEN], *new_name_ptr, *old_name, *file_to_open;
|
||||
|
||||
DBUG_ENTER("MYSQL_BIN_LOG::new_file_impl");
|
||||
if (!is_open())
|
||||
{
|
||||
DBUG_PRINT("info",("log is closed"));
|
||||
DBUG_VOID_RETURN;
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
if (need_lock)
|
||||
@ -3797,7 +3827,7 @@ void MYSQL_BIN_LOG::new_file_impl(bool need_lock)
|
||||
We have to do this here and not in open as we want to store the
|
||||
new file name in the current binary log file.
|
||||
*/
|
||||
if (generate_new_name(new_name, name))
|
||||
if ((error= generate_new_name(new_name, name)))
|
||||
goto end;
|
||||
new_name_ptr=new_name;
|
||||
|
||||
@ -3811,7 +3841,14 @@ void MYSQL_BIN_LOG::new_file_impl(bool need_lock)
|
||||
*/
|
||||
Rotate_log_event r(new_name+dirname_length(new_name),
|
||||
0, LOG_EVENT_OFFSET, is_relay_log ? Rotate_log_event::RELAY_LOG : 0);
|
||||
r.write(&log_file);
|
||||
if(DBUG_EVALUATE_IF("fault_injection_new_file_rotate_event", (error=close_on_error=TRUE), FALSE) ||
|
||||
(error= r.write(&log_file)))
|
||||
{
|
||||
DBUG_EXECUTE_IF("fault_injection_new_file_rotate_event", errno=2;);
|
||||
close_on_error= TRUE;
|
||||
my_printf_error(ER_ERROR_ON_WRITE, ER(ER_CANT_OPEN_FILE), MYF(ME_FATALERROR), name, errno);
|
||||
goto end;
|
||||
}
|
||||
bytes_written += r.data_written;
|
||||
}
|
||||
/*
|
||||
@ -3839,17 +3876,56 @@ void MYSQL_BIN_LOG::new_file_impl(bool need_lock)
|
||||
*/
|
||||
|
||||
/* reopen index binlog file, BUG#34582 */
|
||||
if (!open_index_file(index_file_name, 0, FALSE))
|
||||
open(old_name, log_type, new_name_ptr,
|
||||
io_cache_type, no_auto_events, max_size, 1, FALSE);
|
||||
file_to_open= index_file_name;
|
||||
error= open_index_file(index_file_name, 0, FALSE);
|
||||
if (!error)
|
||||
{
|
||||
/* reopen the binary log file. */
|
||||
file_to_open= new_name_ptr;
|
||||
error= open(old_name, log_type, new_name_ptr, io_cache_type,
|
||||
no_auto_events, max_size, 1, FALSE);
|
||||
}
|
||||
|
||||
/* handle reopening errors */
|
||||
if (error)
|
||||
{
|
||||
my_printf_error(ER_CANT_OPEN_FILE, ER(ER_CANT_OPEN_FILE),
|
||||
MYF(ME_FATALERROR), file_to_open, error);
|
||||
close_on_error= TRUE;
|
||||
}
|
||||
|
||||
my_free(old_name,MYF(0));
|
||||
|
||||
end:
|
||||
|
||||
if (error && close_on_error /* rotate or reopen failed */)
|
||||
{
|
||||
/*
|
||||
Close whatever was left opened.
|
||||
|
||||
We are keeping the behavior as it exists today, ie,
|
||||
we disable logging and move on (see: BUG#51014).
|
||||
|
||||
TODO: as part of WL#1790 consider other approaches:
|
||||
- kill mysql (safety);
|
||||
- try multiple locations for opening a log file;
|
||||
- switch server to protected/readonly mode
|
||||
- ...
|
||||
*/
|
||||
close(LOG_CLOSE_INDEX);
|
||||
sql_print_error("Could not open %s for logging (error %d). "
|
||||
"Turning logging off for the whole duration "
|
||||
"of the MySQL server process. To turn it on "
|
||||
"again: fix the cause, shutdown the MySQL "
|
||||
"server and restart it.",
|
||||
new_name_ptr, errno);
|
||||
}
|
||||
|
||||
if (need_lock)
|
||||
pthread_mutex_unlock(&LOCK_log);
|
||||
pthread_mutex_unlock(&LOCK_index);
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
||||
@ -3872,8 +3948,7 @@ bool MYSQL_BIN_LOG::append(Log_event* ev)
|
||||
bytes_written+= ev->data_written;
|
||||
DBUG_PRINT("info",("max_size: %lu",max_size));
|
||||
if ((uint) my_b_append_tell(&log_file) > max_size)
|
||||
new_file_without_locking();
|
||||
|
||||
error= new_file_without_locking();
|
||||
err:
|
||||
pthread_mutex_unlock(&LOCK_log);
|
||||
signal_update(); // Safe as we don't call close
|
||||
@ -3902,8 +3977,7 @@ bool MYSQL_BIN_LOG::appendv(const char* buf, uint len,...)
|
||||
} while ((buf=va_arg(args,const char*)) && (len=va_arg(args,uint)));
|
||||
DBUG_PRINT("info",("max_size: %lu",max_size));
|
||||
if ((uint) my_b_append_tell(&log_file) > max_size)
|
||||
new_file_without_locking();
|
||||
|
||||
error= new_file_without_locking();
|
||||
err:
|
||||
if (!error)
|
||||
signal_update();
|
||||
@ -4252,7 +4326,7 @@ MYSQL_BIN_LOG::flush_and_set_pending_rows_event(THD *thd,
|
||||
if (!error)
|
||||
{
|
||||
signal_update();
|
||||
rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED);
|
||||
error= rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4448,7 +4522,9 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info)
|
||||
if (flush_and_sync())
|
||||
goto err;
|
||||
signal_update();
|
||||
rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED);
|
||||
if ((error= rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED)))
|
||||
goto err;
|
||||
|
||||
}
|
||||
error=0;
|
||||
|
||||
@ -4531,8 +4607,19 @@ bool general_log_write(THD *thd, enum enum_server_command command,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void MYSQL_BIN_LOG::rotate_and_purge(uint flags)
|
||||
/**
|
||||
@note
|
||||
If rotation fails, for instance the server was unable
|
||||
to create a new log file, we still try to write an
|
||||
incident event to the current log.
|
||||
|
||||
@retval
|
||||
nonzero - error
|
||||
*/
|
||||
int MYSQL_BIN_LOG::rotate_and_purge(uint flags)
|
||||
{
|
||||
int error= 0;
|
||||
DBUG_ENTER("MYSQL_BIN_LOG::rotate_and_purge");
|
||||
#ifdef HAVE_REPLICATION
|
||||
bool check_purge= false;
|
||||
#endif
|
||||
@ -4541,26 +4628,38 @@ void MYSQL_BIN_LOG::rotate_and_purge(uint flags)
|
||||
if ((flags & RP_FORCE_ROTATE) ||
|
||||
(my_b_tell(&log_file) >= (my_off_t) max_size))
|
||||
{
|
||||
new_file_without_locking();
|
||||
if ((error= new_file_without_locking()))
|
||||
/**
|
||||
Be conservative... There are possible lost events (eg,
|
||||
failing to log the Execute_load_query_log_event
|
||||
on a LOAD DATA while using a non-transactional
|
||||
table)!
|
||||
|
||||
We give it a shot and try to write an incident event anyway
|
||||
to the current log.
|
||||
*/
|
||||
if (!write_incident(current_thd, FALSE))
|
||||
flush_and_sync();
|
||||
|
||||
#ifdef HAVE_REPLICATION
|
||||
check_purge= true;
|
||||
#endif
|
||||
}
|
||||
if (!(flags & RP_LOCK_LOG_IS_ALREADY_LOCKED))
|
||||
pthread_mutex_unlock(&LOCK_log);
|
||||
|
||||
#ifdef HAVE_REPLICATION
|
||||
/*
|
||||
NOTE: Run purge_logs wo/ holding LOCK_log
|
||||
as it otherwise will deadlock in ndbcluster_binlog_index_purge_file
|
||||
*/
|
||||
if (check_purge && expire_logs_days)
|
||||
if (!error && check_purge && expire_logs_days)
|
||||
{
|
||||
time_t purge_time= my_time(0) - expire_logs_days*24*60*60;
|
||||
if (purge_time >= 0)
|
||||
purge_logs_before_date(purge_time);
|
||||
}
|
||||
#endif
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
uint MYSQL_BIN_LOG::next_file_id()
|
||||
@ -4747,6 +4846,10 @@ bool MYSQL_BIN_LOG::write_incident(THD *thd, bool lock)
|
||||
{
|
||||
uint error= 0;
|
||||
DBUG_ENTER("MYSQL_BIN_LOG::write_incident");
|
||||
|
||||
if (!is_open())
|
||||
DBUG_RETURN(error);
|
||||
|
||||
LEX_STRING const write_error_msg=
|
||||
{ C_STRING_WITH_LEN("error writing to the binary log") };
|
||||
Incident incident= INCIDENT_LOST_EVENTS;
|
||||
@ -4759,7 +4862,7 @@ bool MYSQL_BIN_LOG::write_incident(THD *thd, bool lock)
|
||||
if (!error && !(error= flush_and_sync()))
|
||||
{
|
||||
signal_update();
|
||||
rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED);
|
||||
error= rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED);
|
||||
}
|
||||
pthread_mutex_unlock(&LOCK_log);
|
||||
}
|
||||
@ -4871,7 +4974,8 @@ bool MYSQL_BIN_LOG::write(THD *thd, IO_CACHE *cache, Log_event *commit_event,
|
||||
pthread_mutex_unlock(&LOCK_prep_xids);
|
||||
}
|
||||
else
|
||||
rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED);
|
||||
if (rotate_and_purge(RP_LOCK_LOG_IS_ALREADY_LOCKED))
|
||||
goto err;
|
||||
}
|
||||
VOID(pthread_mutex_unlock(&LOCK_log));
|
||||
|
||||
@ -5676,7 +5780,7 @@ int TC_LOG_MMAP::sync()
|
||||
cookie points directly to the memory where xid was logged.
|
||||
*/
|
||||
|
||||
void TC_LOG_MMAP::unlog(ulong cookie, my_xid xid)
|
||||
int TC_LOG_MMAP::unlog(ulong cookie, my_xid xid)
|
||||
{
|
||||
PAGE *p=pages+(cookie/tc_log_page_size);
|
||||
my_xid *x=(my_xid *)(data+cookie);
|
||||
@ -5694,6 +5798,7 @@ void TC_LOG_MMAP::unlog(ulong cookie, my_xid xid)
|
||||
if (p->waiters == 0) // the page is in pool and ready to rock
|
||||
pthread_cond_signal(&COND_pool); // ping ... for overflow()
|
||||
pthread_mutex_unlock(&p->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void TC_LOG_MMAP::close()
|
||||
@ -5935,8 +6040,9 @@ int TC_LOG_BINLOG::log_xid(THD *thd, my_xid xid)
|
||||
DBUG_RETURN(!binlog_end_trans(thd, trx_data, &xle, TRUE));
|
||||
}
|
||||
|
||||
void TC_LOG_BINLOG::unlog(ulong cookie, my_xid xid)
|
||||
int TC_LOG_BINLOG::unlog(ulong cookie, my_xid xid)
|
||||
{
|
||||
DBUG_ENTER("TC_LOG_BINLOG::unlog");
|
||||
pthread_mutex_lock(&LOCK_prep_xids);
|
||||
DBUG_ASSERT(prepared_xids > 0);
|
||||
if (--prepared_xids == 0) {
|
||||
@ -5944,7 +6050,7 @@ void TC_LOG_BINLOG::unlog(ulong cookie, my_xid xid)
|
||||
pthread_cond_signal(&COND_prep_xids);
|
||||
}
|
||||
pthread_mutex_unlock(&LOCK_prep_xids);
|
||||
rotate_and_purge(0); // as ::write() did not rotate
|
||||
DBUG_RETURN(rotate_and_purge(0)); // as ::write() did not rotate
|
||||
}
|
||||
|
||||
int TC_LOG_BINLOG::recover(IO_CACHE *log, Format_description_log_event *fdle)
|
||||
|
16
sql/log.h
16
sql/log.h
@ -39,7 +39,7 @@ class TC_LOG
|
||||
virtual int open(const char *opt_name)=0;
|
||||
virtual void close()=0;
|
||||
virtual int log_xid(THD *thd, my_xid xid)=0;
|
||||
virtual void unlog(ulong cookie, my_xid xid)=0;
|
||||
virtual int unlog(ulong cookie, my_xid xid)=0;
|
||||
};
|
||||
|
||||
class TC_LOG_DUMMY: public TC_LOG // use it to disable the logging
|
||||
@ -49,7 +49,7 @@ public:
|
||||
int open(const char *opt_name) { return 0; }
|
||||
void close() { }
|
||||
int log_xid(THD *thd, my_xid xid) { return 1; }
|
||||
void unlog(ulong cookie, my_xid xid) { }
|
||||
int unlog(ulong cookie, my_xid xid) { return 0; }
|
||||
};
|
||||
|
||||
#ifdef HAVE_MMAP
|
||||
@ -94,7 +94,7 @@ class TC_LOG_MMAP: public TC_LOG
|
||||
int open(const char *opt_name);
|
||||
void close();
|
||||
int log_xid(THD *thd, my_xid xid);
|
||||
void unlog(ulong cookie, my_xid xid);
|
||||
int unlog(ulong cookie, my_xid xid);
|
||||
int recover();
|
||||
|
||||
private:
|
||||
@ -283,8 +283,8 @@ class MYSQL_BIN_LOG: public TC_LOG, private MYSQL_LOG
|
||||
new_file() is locking. new_file_without_locking() does not acquire
|
||||
LOCK_log.
|
||||
*/
|
||||
void new_file_without_locking();
|
||||
void new_file_impl(bool need_lock);
|
||||
int new_file_without_locking();
|
||||
int new_file_impl(bool need_lock);
|
||||
|
||||
public:
|
||||
MYSQL_LOG::generate_name;
|
||||
@ -314,7 +314,7 @@ public:
|
||||
int open(const char *opt_name);
|
||||
void close();
|
||||
int log_xid(THD *thd, my_xid xid);
|
||||
void unlog(ulong cookie, my_xid xid);
|
||||
int unlog(ulong cookie, my_xid xid);
|
||||
int recover(IO_CACHE *log, Format_description_log_event *fdle);
|
||||
#if !defined(MYSQL_CLIENT)
|
||||
int flush_and_set_pending_rows_event(THD *thd, Rows_log_event* event);
|
||||
@ -354,7 +354,7 @@ public:
|
||||
bool open_index_file(const char *index_file_name_arg,
|
||||
const char *log_name, bool need_mutex);
|
||||
/* Use this to start writing a new log file */
|
||||
void new_file();
|
||||
int new_file();
|
||||
|
||||
void reset_gathered_updates(THD *thd);
|
||||
bool write(Log_event* event_info); // binary log write
|
||||
@ -379,7 +379,7 @@ public:
|
||||
void make_log_name(char* buf, const char* log_ident);
|
||||
bool is_active(const char* log_file_name);
|
||||
int update_log_index(LOG_INFO* linfo, bool need_update_threads);
|
||||
void rotate_and_purge(uint flags);
|
||||
int rotate_and_purge(uint flags);
|
||||
bool flush_and_sync();
|
||||
int purge_logs(const char *to_log, bool included,
|
||||
bool need_mutex, bool need_update_threads,
|
||||
|
@ -3337,7 +3337,8 @@ compare_errors:
|
||||
rli->report(ERROR_LEVEL, 0,
|
||||
"\
|
||||
Query caused different errors on master and slave. \
|
||||
Error on master: '%s' (%d), Error on slave: '%s' (%d). \
|
||||
Error on master: message (format)='%s' error code=%d ; \
|
||||
Error on slave: actual message='%s', error code=%d. \
|
||||
Default database: '%s'. Query: '%s'",
|
||||
ER_SAFE(expected_error),
|
||||
expected_error,
|
||||
|
@ -109,6 +109,7 @@ int my_decimal2string(uint mask, const my_decimal *d,
|
||||
result= decimal2string((decimal_t*) d, (char*) str->ptr(),
|
||||
&length, (int)fixed_prec, fixed_dec,
|
||||
filler);
|
||||
str->set_charset(&my_charset_bin);
|
||||
str->length(length);
|
||||
return check_result(mask, result);
|
||||
}
|
||||
|
@ -566,17 +566,42 @@ protected:
|
||||
|
||||
#define MY_CHARSET_BIN_MB_MAXLEN 1
|
||||
|
||||
/*
|
||||
Flags below are set when we perform
|
||||
context analysis of the statement and make
|
||||
subqueries non-const. It prevents subquery
|
||||
evaluation at context analysis stage.
|
||||
*/
|
||||
|
||||
/*
|
||||
Don't evaluate this subquery during statement prepare even if
|
||||
it's a constant one. The flag is switched off in the end of
|
||||
mysqld_stmt_prepare.
|
||||
*/
|
||||
#define CONTEXT_ANALYSIS_ONLY_PREPARE 1
|
||||
/*
|
||||
Special JOIN::prepare mode: changing of query is prohibited.
|
||||
When creating a view, we need to just check its syntax omitting
|
||||
any optimizations: afterwards definition of the view will be
|
||||
reconstructed by means of ::print() methods and written to
|
||||
to an .frm file. We need this definition to stay untouched.
|
||||
*/
|
||||
#define CONTEXT_ANALYSIS_ONLY_VIEW 2
|
||||
/*
|
||||
Don't evaluate this subquery during derived table prepare even if
|
||||
it's a constant one.
|
||||
*/
|
||||
#define CONTEXT_ANALYSIS_ONLY_DERIVED 4
|
||||
|
||||
// uncachable cause
|
||||
#define UNCACHEABLE_DEPENDENT 1
|
||||
#define UNCACHEABLE_RAND 2
|
||||
#define UNCACHEABLE_SIDEEFFECT 4
|
||||
/// forcing to save JOIN for explain
|
||||
#define UNCACHEABLE_EXPLAIN 8
|
||||
/** Don't evaluate subqueries in prepare even if they're not correlated */
|
||||
#define UNCACHEABLE_PREPARE 16
|
||||
/* For uncorrelated SELECT in an UNION with some correlated SELECTs */
|
||||
#define UNCACHEABLE_UNITED 32
|
||||
#define UNCACHEABLE_CHECKOPTION 64
|
||||
#define UNCACHEABLE_UNITED 16
|
||||
#define UNCACHEABLE_CHECKOPTION 32
|
||||
|
||||
/* Used to check GROUP BY list in the MODE_ONLY_FULL_GROUP_BY mode */
|
||||
#define UNDEF_POS (-1)
|
||||
@ -1063,7 +1088,7 @@ uint cached_table_definitions(void);
|
||||
void kill_mysql(void);
|
||||
void close_connection(THD *thd, uint errcode, bool lock);
|
||||
bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
|
||||
bool *write_to_binlog);
|
||||
int *write_to_binlog);
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
bool check_access(THD *thd, ulong access, const char *db, ulong *save_priv,
|
||||
bool no_grant, bool no_errors, bool schema_db);
|
||||
|
@ -2527,7 +2527,7 @@ the thread stack. Please read http://dev.mysql.com/doc/mysql/en/linux.html\n\n",
|
||||
|
||||
if (!(test_flags & TEST_NO_STACKTRACE))
|
||||
{
|
||||
fprintf(stderr, "thd: 0x%lx\n",(long) thd);
|
||||
fprintf(stderr, "Thread pointer: 0x%lx\n", (long) thd);
|
||||
fprintf(stderr, "Attempting backtrace. You can use the following "
|
||||
"information to find out\nwhere mysqld died. If "
|
||||
"you see no messages after this, something went\n"
|
||||
@ -2555,11 +2555,13 @@ the thread stack. Please read http://dev.mysql.com/doc/mysql/en/linux.html\n\n",
|
||||
kreason= "KILLED_NO_VALUE";
|
||||
break;
|
||||
}
|
||||
fprintf(stderr, "Trying to get some variables.\n\
|
||||
Some pointers may be invalid and cause the dump to abort...\n");
|
||||
my_safe_print_str("thd->query", thd->query(), 1024);
|
||||
fprintf(stderr, "thd->thread_id=%lu\n", (ulong) thd->thread_id);
|
||||
fprintf(stderr, "thd->killed=%s\n", kreason);
|
||||
fprintf(stderr, "\nTrying to get some variables.\n"
|
||||
"Some pointers may be invalid and cause the dump to abort.\n");
|
||||
fprintf(stderr, "Query (%p): ", thd->query());
|
||||
my_safe_print_str(thd->query(), min(1024, thd->query_length()));
|
||||
fprintf(stderr, "Connection ID (thread ID): %lu\n", (ulong) thd->thread_id);
|
||||
fprintf(stderr, "Status: %s\n", kreason);
|
||||
fputc('\n', stderr);
|
||||
}
|
||||
fprintf(stderr, "\
|
||||
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains\n\
|
||||
@ -2837,7 +2839,7 @@ pthread_handler_t signal_hand(void *arg __attribute__((unused)))
|
||||
case SIGHUP:
|
||||
if (!abort_loop)
|
||||
{
|
||||
bool not_used;
|
||||
int not_used;
|
||||
mysql_print_status(); // Print some debug info
|
||||
reload_acl_and_cache((THD*) 0,
|
||||
(REFRESH_LOG | REFRESH_TABLES | REFRESH_FAST |
|
||||
@ -6774,7 +6776,7 @@ thread is in the relay logs.",
|
||||
"as much as you can afford; 1GB on a 4GB machine that mainly runs MySQL is "
|
||||
"quite common.",
|
||||
&dflt_key_cache_var.param_buff_size, NULL, NULL, (GET_ULL | GET_ASK_ADDR),
|
||||
REQUIRED_ARG, KEY_CACHE_SIZE, MALLOC_OVERHEAD, SIZE_T_MAX, MALLOC_OVERHEAD,
|
||||
REQUIRED_ARG, KEY_CACHE_SIZE, 0, SIZE_T_MAX, MALLOC_OVERHEAD,
|
||||
IO_SIZE, 0},
|
||||
{"key_cache_age_threshold", OPT_KEY_CACHE_AGE_THRESHOLD,
|
||||
"This characterizes the number of hits a hot block has to be untouched "
|
||||
|
@ -229,8 +229,7 @@ int injector::record_incident(THD *thd, Incident incident)
|
||||
Incident_log_event ev(thd, incident);
|
||||
if (int error= mysql_bin_log.write(&ev))
|
||||
return error;
|
||||
mysql_bin_log.rotate_and_purge(RP_FORCE_ROTATE);
|
||||
return 0;
|
||||
return mysql_bin_log.rotate_and_purge(RP_FORCE_ROTATE);
|
||||
}
|
||||
|
||||
int injector::record_incident(THD *thd, Incident incident, LEX_STRING const message)
|
||||
@ -238,6 +237,5 @@ int injector::record_incident(THD *thd, Incident incident, LEX_STRING const mess
|
||||
Incident_log_event ev(thd, incident, message);
|
||||
if (int error= mysql_bin_log.write(&ev))
|
||||
return error;
|
||||
mysql_bin_log.rotate_and_purge(RP_FORCE_ROTATE);
|
||||
return 0;
|
||||
return mysql_bin_log.rotate_and_purge(RP_FORCE_ROTATE);
|
||||
}
|
||||
|
102
sql/set_var.cc
102
sql/set_var.cc
@ -1423,44 +1423,6 @@ bool throw_bounds_warning(THD *thd, bool fixed, bool unsignd,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
check an unsigned user-supplied value for a systemvariable against bounds.
|
||||
|
||||
TODO: This is a wrapper function to call clipping from within an update()
|
||||
function. Calling bounds from within update() is fair game in theory,
|
||||
but we can only send warnings from in there, not errors, and besides,
|
||||
it violates our model of separating check from update phase.
|
||||
To avoid breaking out of the server with an ASSERT() in strict mode,
|
||||
we pretend we're not in strict mode when we go through here. Bug#43233
|
||||
was opened to remind us to replace this kludge with The Right Thing,
|
||||
which of course is to do the check in the actual check phase, and then
|
||||
throw an error or warning accordingly.
|
||||
|
||||
@param thd thread handle
|
||||
@param num the value to limit
|
||||
@param option_limits the bounds-record, or NULL if none
|
||||
*/
|
||||
static void bound_unsigned(THD *thd, ulonglong *num,
|
||||
const struct my_option *option_limits)
|
||||
{
|
||||
if (option_limits)
|
||||
{
|
||||
my_bool fixed = FALSE;
|
||||
ulonglong unadjusted= *num;
|
||||
|
||||
*num= getopt_ull_limit_value(unadjusted, option_limits, &fixed);
|
||||
|
||||
if (fixed)
|
||||
{
|
||||
ulong ssm= thd->variables.sql_mode;
|
||||
thd->variables.sql_mode&= ~MODE_STRICT_ALL_TABLES;
|
||||
throw_bounds_warning(thd, fixed, TRUE, option_limits->name, unadjusted);
|
||||
thd->variables.sql_mode= ssm;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Get unsigned system-variable.
|
||||
Negative value does not wrap around, but becomes zero.
|
||||
@ -1579,11 +1541,16 @@ void sys_var_long_ptr_global::set_default(THD *thd, enum_var_type type)
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_ulonglong_ptr::check(THD *thd, set_var *var)
|
||||
{
|
||||
return get_unsigned(thd, var, 0, GET_ULL);
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_ulonglong_ptr::update(THD *thd, set_var *var)
|
||||
{
|
||||
ulonglong tmp= var->save_result.ulonglong_value;
|
||||
pthread_mutex_lock(&LOCK_global_system_variables);
|
||||
bound_unsigned(thd, &tmp, option_limits);
|
||||
*value= (ulonglong) tmp;
|
||||
pthread_mutex_unlock(&LOCK_global_system_variables);
|
||||
return 0;
|
||||
@ -1675,25 +1642,30 @@ uchar *sys_var_thd_ulong::value_ptr(THD *thd, enum_var_type type,
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_thd_ha_rows::check(THD *thd, set_var *var)
|
||||
{
|
||||
return get_unsigned(thd, var, max_system_variables.*offset,
|
||||
#ifdef BIG_TABLES
|
||||
GET_ULL
|
||||
#else
|
||||
GET_ULONG
|
||||
#endif
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_thd_ha_rows::update(THD *thd, set_var *var)
|
||||
{
|
||||
ulonglong tmp= var->save_result.ulonglong_value;
|
||||
|
||||
/* Don't use bigger value than given with --maximum-variable-name=.. */
|
||||
if ((ha_rows) tmp > max_system_variables.*offset)
|
||||
tmp= max_system_variables.*offset;
|
||||
|
||||
bound_unsigned(thd, &tmp, option_limits);
|
||||
|
||||
if (var->type == OPT_GLOBAL)
|
||||
{
|
||||
/* Lock is needed to make things safe on 32 bit systems */
|
||||
pthread_mutex_lock(&LOCK_global_system_variables);
|
||||
global_system_variables.*offset= (ha_rows) tmp;
|
||||
pthread_mutex_lock(&LOCK_global_system_variables);
|
||||
global_system_variables.*offset= (ha_rows)
|
||||
var->save_result.ulonglong_value;
|
||||
pthread_mutex_unlock(&LOCK_global_system_variables);
|
||||
}
|
||||
else
|
||||
thd->variables.*offset= (ha_rows) tmp;
|
||||
thd->variables.*offset= (ha_rows) var->save_result.ulonglong_value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2305,6 +2277,12 @@ uchar *sys_var_key_cache_param::value_ptr(THD *thd, enum_var_type type,
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_key_buffer_size::check(THD *thd, set_var *var)
|
||||
{
|
||||
return get_unsigned(thd, var, 0, GET_ULL);
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
|
||||
{
|
||||
ulonglong tmp= var->save_result.ulonglong_value;
|
||||
@ -2318,10 +2296,10 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
|
||||
|
||||
pthread_mutex_lock(&LOCK_global_system_variables);
|
||||
key_cache= get_key_cache(base_name);
|
||||
|
||||
|
||||
if (!key_cache)
|
||||
{
|
||||
/* Key cache didn't exists */
|
||||
/* Key cache didn't exist */
|
||||
if (!tmp) // Tried to delete cache
|
||||
goto end; // Ok, nothing to do
|
||||
if (!(key_cache= create_key_cache(base_name->str, base_name->length)))
|
||||
@ -2343,9 +2321,8 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
|
||||
{
|
||||
if (key_cache == dflt_key_cache)
|
||||
{
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_CANT_DROP_DEFAULT_KEYCACHE,
|
||||
ER(ER_WARN_CANT_DROP_DEFAULT_KEYCACHE));
|
||||
error= 1;
|
||||
my_error(ER_WARN_CANT_DROP_DEFAULT_KEYCACHE, MYF(0));
|
||||
goto end; // Ignore default key cache
|
||||
}
|
||||
|
||||
@ -2371,7 +2348,6 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
|
||||
goto end;
|
||||
}
|
||||
|
||||
bound_unsigned(thd, &tmp, option_limits);
|
||||
key_cache->param_buff_size= (ulonglong) tmp;
|
||||
|
||||
/* If key cache didn't exist initialize it, else resize it */
|
||||
@ -2388,10 +2364,19 @@ bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
|
||||
|
||||
end:
|
||||
pthread_mutex_unlock(&LOCK_global_system_variables);
|
||||
|
||||
var->save_result.ulonglong_value = SIZE_T_MAX;
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_key_cache_long::check(THD *thd, set_var *var)
|
||||
{
|
||||
return get_unsigned(thd, var, 0, GET_ULONG);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@todo
|
||||
Abort if some other thread is changing the key cache.
|
||||
@ -2400,7 +2385,6 @@ end:
|
||||
*/
|
||||
bool sys_var_key_cache_long::update(THD *thd, set_var *var)
|
||||
{
|
||||
ulonglong tmp= var->value->val_int();
|
||||
LEX_STRING *base_name= &var->base;
|
||||
bool error= 0;
|
||||
|
||||
@ -2425,8 +2409,8 @@ bool sys_var_key_cache_long::update(THD *thd, set_var *var)
|
||||
if (key_cache->in_init)
|
||||
goto end;
|
||||
|
||||
bound_unsigned(thd, &tmp, option_limits);
|
||||
*((ulong*) (((char*) key_cache) + offset))= (ulong) tmp;
|
||||
*((ulong*) (((char*) key_cache) + offset))= (ulong)
|
||||
var->save_result.ulonglong_value;
|
||||
|
||||
/*
|
||||
Don't create a new key cache if it didn't exist
|
||||
|
@ -196,6 +196,7 @@ public:
|
||||
sys_after_update_func func)
|
||||
:sys_var(name_arg,func), value(value_ptr_arg)
|
||||
{ chain_sys_var(chain); }
|
||||
bool check(THD *thd, set_var *var);
|
||||
bool update(THD *thd, set_var *var);
|
||||
void set_default(THD *thd, enum_var_type type);
|
||||
SHOW_TYPE show_type() { return SHOW_LONGLONG; }
|
||||
@ -442,6 +443,7 @@ public:
|
||||
sys_after_update_func func)
|
||||
:sys_var_thd(name_arg,func), offset(offset_arg)
|
||||
{ chain_sys_var(chain); }
|
||||
bool check(THD *thd, set_var *var);
|
||||
bool update(THD *thd, set_var *var);
|
||||
void set_default(THD *thd, enum_var_type type);
|
||||
SHOW_TYPE show_type() { return SHOW_HA_ROWS; }
|
||||
@ -854,6 +856,7 @@ public:
|
||||
:sys_var_key_cache_param(chain, name_arg,
|
||||
offsetof(KEY_CACHE, param_buff_size))
|
||||
{}
|
||||
bool check(THD *thd, set_var *var);
|
||||
bool update(THD *thd, set_var *var);
|
||||
SHOW_TYPE show_type() { return SHOW_LONGLONG; }
|
||||
};
|
||||
@ -865,6 +868,7 @@ public:
|
||||
sys_var_key_cache_long(sys_var_chain *chain, const char *name_arg, size_t offset_arg)
|
||||
:sys_var_key_cache_param(chain, name_arg, offset_arg)
|
||||
{}
|
||||
bool check(THD *thd, set_var *var);
|
||||
bool update(THD *thd, set_var *var);
|
||||
SHOW_TYPE show_type() { return SHOW_LONG; }
|
||||
};
|
||||
|
@ -98,7 +98,7 @@
|
||||
0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F
|
||||
0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F
|
||||
0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F
|
||||
0402 0403 201A 0453 201E 2026 2020 2021 0000 2030 0409 2039 040A 040C 040B 040F
|
||||
0402 0403 201A 0453 201E 2026 2020 2021 20AC 2030 0409 2039 040A 040C 040B 040F
|
||||
0452 2018 2019 201C 201D 2022 2013 2014 0000 2122 0459 203A 045A 045C 045B 045F
|
||||
00A0 040E 045E 0408 00A4 0490 00A6 00A7 0401 00A9 0404 00AB 00AC 00AD 00AE 0407
|
||||
00B0 00B1 0406 0456 0491 00B5 00B6 00B7 0451 2116 0454 00BB 0458 0405 0455 0457
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user