Automerge
This commit is contained in:
commit
8c5ce977c6
@ -42,6 +42,10 @@
|
||||
*.vcxproj
|
||||
*.vcxproj.filters
|
||||
*/*.dir/*
|
||||
*.dir
|
||||
Debug
|
||||
MySql.sdf
|
||||
Win32
|
||||
*/*_pure_*warnings
|
||||
*/.deps
|
||||
*/.libs/*
|
||||
@ -611,6 +615,7 @@ include/mysql_h.ic
|
||||
include/mysql_version.h
|
||||
include/mysqld_ername.h
|
||||
include/mysqld_error.h
|
||||
include/mysqld_error.h.rule
|
||||
include/openssl
|
||||
include/readline
|
||||
include/readline/*.h
|
||||
@ -1883,7 +1888,9 @@ scripts/mysql_find_rows
|
||||
scripts/mysql_fix_extensions
|
||||
scripts/mysql_fix_privilege_tables
|
||||
scripts/mysql_fix_privilege_tables.sql
|
||||
scripts/mysql_fix_privilege_tables.sql.rule
|
||||
scripts/mysql_fix_privilege_tables_sql.c
|
||||
scripts/mysql_fix_privilege_tables_sql.c.rule
|
||||
scripts/mysql_install_db
|
||||
scripts/mysql_secure_installation
|
||||
scripts/mysql_setpermission
|
||||
@ -2120,6 +2127,7 @@ sql/handlerton.cc
|
||||
sql/html
|
||||
sql/latex
|
||||
sql/lex_hash.h
|
||||
sql/lex_hash.h.rule
|
||||
sql/link_sources
|
||||
sql/max/*
|
||||
sql/message.h
|
||||
@ -2151,6 +2159,7 @@ sql/sql_builtin.cc
|
||||
sql/sql_select.cc.orig
|
||||
sql/sql_yacc.cc
|
||||
sql/sql_yacc.h
|
||||
sql/sql_yacc.h.rule
|
||||
sql/sql_yacc.output
|
||||
sql/sql_yacc.yy.orig
|
||||
sql/test_time
|
||||
|
@ -116,10 +116,10 @@ link_sources:
|
||||
@LN_CP_F@ $(top_srcdir)/sql/$$f $$f; \
|
||||
done; \
|
||||
for f in $(strings_src) ; do \
|
||||
rm -f $(srcdir)/$$f; \
|
||||
rm -f $$f; \
|
||||
@LN_CP_F@ $(top_srcdir)/strings/$$f $$f; \
|
||||
done; \
|
||||
rm -f $(srcdir)/my_user.c; \
|
||||
rm -f my_user.c; \
|
||||
@LN_CP_F@ $(top_srcdir)/sql-common/my_user.c my_user.c;
|
||||
echo timestamp > link_sources;
|
||||
|
||||
|
@ -951,7 +951,8 @@ Exit_status process_event(PRINT_EVENT_INFO *print_event_info, Log_event *ev,
|
||||
passed --short-form, because --short-form disables printing
|
||||
row events.
|
||||
*/
|
||||
if (!print_event_info->printed_fd_event && !short_form)
|
||||
if (!print_event_info->printed_fd_event && !short_form &&
|
||||
opt_base64_output_mode != BASE64_OUTPUT_DECODE_ROWS)
|
||||
{
|
||||
const char* type_str= ev->get_type_str();
|
||||
if (opt_base64_output_mode == BASE64_OUTPUT_NEVER)
|
||||
|
@ -4461,13 +4461,14 @@ static int my_kill(int pid, int sig)
|
||||
command called command
|
||||
|
||||
DESCRIPTION
|
||||
shutdown [<timeout>]
|
||||
shutdown_server [<timeout>]
|
||||
|
||||
*/
|
||||
|
||||
void do_shutdown_server(struct st_command *command)
|
||||
{
|
||||
int timeout=60, pid;
|
||||
long timeout=60;
|
||||
int pid;
|
||||
DYNAMIC_STRING ds_pidfile_name;
|
||||
MYSQL* mysql = &cur_con->mysql;
|
||||
static DYNAMIC_STRING ds_timeout;
|
||||
@ -4482,8 +4483,9 @@ void do_shutdown_server(struct st_command *command)
|
||||
|
||||
if (ds_timeout.length)
|
||||
{
|
||||
timeout= atoi(ds_timeout.str);
|
||||
if (timeout == 0)
|
||||
char* endptr;
|
||||
timeout= strtol(ds_timeout.str, &endptr, 10);
|
||||
if (*endptr != '\0')
|
||||
die("Illegal argument for timeout: '%s'", ds_timeout.str);
|
||||
}
|
||||
dynstr_free(&ds_timeout);
|
||||
@ -4525,7 +4527,7 @@ void do_shutdown_server(struct st_command *command)
|
||||
DBUG_PRINT("info", ("Process %d does not exist anymore", pid));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
DBUG_PRINT("info", ("Sleeping, timeout: %d", timeout));
|
||||
DBUG_PRINT("info", ("Sleeping, timeout: %ld", timeout));
|
||||
my_sleep(1000000L);
|
||||
}
|
||||
|
||||
@ -9737,7 +9739,7 @@ int find_set(REP_SETS *sets,REP_SET *find)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return i; /* return new postion */
|
||||
return i; /* return new position */
|
||||
}
|
||||
|
||||
/* find if there is a found_set with same table_offset & found_offset
|
||||
@ -9757,7 +9759,7 @@ int find_found(FOUND_SET *found_set,uint table_offset, int found_offset)
|
||||
found_set[i].table_offset=table_offset;
|
||||
found_set[i].found_offset=found_offset;
|
||||
found_sets++;
|
||||
return -i-2; /* return new postion */
|
||||
return -i-2; /* return new position */
|
||||
}
|
||||
|
||||
/* Return 1 if regexp starts with \b or ends with \b*/
|
||||
|
@ -478,7 +478,13 @@ el_source(EditLine *el, const char *fname)
|
||||
|
||||
fp = NULL;
|
||||
if (fname == NULL) {
|
||||
#ifdef HAVE_ISSETUGID
|
||||
/* XXXMYSQL: Bug#49967 */
|
||||
#if defined(HAVE_GETUID) && defined(HAVE_GETEUID) && \
|
||||
defined(HAVE_GETGID) && defined(HAVE_GETEGID)
|
||||
#define HAVE_IDENTITY_FUNCS 1
|
||||
#endif
|
||||
|
||||
#if (defined(HAVE_ISSETUGID) || defined(HAVE_IDENTITY_FUNCS))
|
||||
static const char elpath[] = "/.editrc";
|
||||
/* XXXMYSQL: Portability fix (for which platforms?) */
|
||||
#ifdef MAXPATHLEN
|
||||
@ -486,9 +492,13 @@ el_source(EditLine *el, const char *fname)
|
||||
#else
|
||||
char path[4096];
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ISSETUGID
|
||||
if (issetugid())
|
||||
return (-1);
|
||||
#elif defined(HAVE_IDENTITY_FUNCS)
|
||||
if (getuid() != geteuid() || getgid() != getegid())
|
||||
return (-1);
|
||||
#endif
|
||||
if ((ptr = getenv("HOME")) == NULL)
|
||||
return (-1);
|
||||
if (strlcpy(path, ptr, sizeof(path)) >= sizeof(path))
|
||||
@ -498,9 +508,10 @@ el_source(EditLine *el, const char *fname)
|
||||
fname = path;
|
||||
#else
|
||||
/*
|
||||
* If issetugid() is missing, always return an error, in order
|
||||
* to keep from inadvertently opening up the user to a security
|
||||
* hole.
|
||||
* If issetugid() or the above mentioned get[e][u|g]id()
|
||||
* functions are missing, always return an error, in order
|
||||
* to keep from inadvertently opening up the user to a
|
||||
* security hole.
|
||||
*/
|
||||
return (-1);
|
||||
#endif
|
||||
|
@ -1012,8 +1012,10 @@ vi_histedit(EditLine *el, int c __attribute__((__unused__)))
|
||||
if (fd < 0)
|
||||
return CC_ERROR;
|
||||
cp = el->el_line.buffer;
|
||||
write(fd, cp, el->el_line.lastchar - cp +0u);
|
||||
write(fd, "\n", 1);
|
||||
if (write(fd, cp, el->el_line.lastchar - cp +0u) == -1)
|
||||
goto error;
|
||||
if (write(fd, "\n", 1) == -1)
|
||||
goto error;
|
||||
pid = fork();
|
||||
switch (pid) {
|
||||
case -1:
|
||||
@ -1041,6 +1043,12 @@ vi_histedit(EditLine *el, int c __attribute__((__unused__)))
|
||||
unlink(tempfile);
|
||||
/* return CC_REFRESH; */
|
||||
return ed_newline(el, 0);
|
||||
|
||||
/* XXXMYSQL: Avoid compiler warnings. */
|
||||
error:
|
||||
close(fd);
|
||||
unlink(tempfile);
|
||||
return CC_ERROR;
|
||||
}
|
||||
|
||||
/* vi_history_word():
|
||||
|
@ -1963,7 +1963,7 @@ AC_CHECK_HEADER(vis.h,
|
||||
[AC_DEFINE([HAVE_VIS_H], [1],[Found vis.h and the strvis() function])])])
|
||||
|
||||
AC_CHECK_FUNCS(strlcat strlcpy)
|
||||
AC_CHECK_FUNCS(issetugid)
|
||||
AC_CHECK_FUNCS(issetugid getuid geteuid getgid getegid)
|
||||
AC_CHECK_FUNCS(fgetln)
|
||||
AC_CHECK_FUNCS(getline flockfile)
|
||||
|
||||
|
@ -1,17 +1,19 @@
|
||||
/* Copyright (C) 2000 MySQL AB
|
||||
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; version 2 of
|
||||
the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
02110-1301 USA */
|
||||
|
||||
/*
|
||||
Replace strings in textfile
|
||||
@ -819,7 +821,7 @@ static short find_set(REP_SETS *sets,REP_SET *find)
|
||||
return (short) i;
|
||||
}
|
||||
}
|
||||
return (short) i; /* return new postion */
|
||||
return (short) i; /* return new position */
|
||||
}
|
||||
|
||||
|
||||
@ -842,7 +844,7 @@ static short find_found(FOUND_SET *found_set,uint table_offset,
|
||||
found_set[i].table_offset=table_offset;
|
||||
found_set[i].found_offset=found_offset;
|
||||
found_sets++;
|
||||
return (short) (-i-2); /* return new postion */
|
||||
return (short) (-i-2); /* return new position */
|
||||
}
|
||||
|
||||
/* Return 1 if regexp starts with \b or ends with \b*/
|
||||
|
@ -2,6 +2,8 @@
|
||||
# in alphabetical order. This also helps with merge conflict resolution.
|
||||
|
||||
binlog.binlog_multi_engine # joro : NDB tests marked as experimental as agreed with bochklin
|
||||
binlog.binlog_bug23533 # skozlov: BUG#12371924
|
||||
|
||||
|
||||
funcs_1.charset_collation_1 # depends on compile-time decisions
|
||||
funcs_1.is_cml_ndb # joro : NDB tests marked as experimental as agreed with bochklin
|
||||
@ -22,7 +24,8 @@ main.outfile_loaddata @solaris # joro : Bug #46895
|
||||
ndb.* # joro : NDB tests marked as experimental as agreed with bochklin
|
||||
|
||||
rpl.rpl_innodb_bug28430 @solaris # Bug#46029
|
||||
rpl.rpl_row_sp011 @solaris # Joro : Bug #54138
|
||||
rpl.rpl_row_sp011 @solaris # Joro : Bug #45445
|
||||
rpl.rpl_stop_slave # Sven : BUG#12345981
|
||||
|
||||
rpl_ndb.* # joro : NDB tests marked as experimental as agreed with bochklin
|
||||
rpl_ndb.rpl_ndb_log # Bug#38998
|
||||
|
@ -7,7 +7,7 @@ let $counter= 500;
|
||||
let $mysql_errno= 0;
|
||||
while (!$mysql_errno)
|
||||
{
|
||||
--error 0,1053,2002,2006,2013
|
||||
--error 0,1040,1053,2002,2003,2006,2013
|
||||
show status;
|
||||
|
||||
dec $counter;
|
||||
|
@ -1,5 +1,5 @@
|
||||
# -*- cperl -*-
|
||||
# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Library General Public
|
||||
@ -141,7 +141,11 @@ sub fix_tmpdir {
|
||||
sub fix_log_error {
|
||||
my ($self, $config, $group_name, $group)= @_;
|
||||
my $dir= $self->{ARGS}->{vardir};
|
||||
return "$dir/log/$group_name.err";
|
||||
if ( $::opt_valgrind and $::opt_debug ) {
|
||||
return "$dir/log/$group_name.trace";
|
||||
} else {
|
||||
return "$dir/log/$group_name.err";
|
||||
}
|
||||
}
|
||||
|
||||
sub fix_log {
|
||||
|
@ -1,5 +1,5 @@
|
||||
# -*- cperl -*-
|
||||
# Copyright (C) 2008 MySQL AB
|
||||
# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@ -28,8 +28,6 @@ use My::Platform;
|
||||
use base qw(Exporter);
|
||||
our @EXPORT= qw(my_find_bin my_find_dir my_find_file NOT_REQUIRED);
|
||||
|
||||
our $vs_config_dir;
|
||||
|
||||
my $bin_extension= ".exe" if IS_WINDOWS;
|
||||
|
||||
# Helper function to be used for fourth parameter to find functions
|
||||
@ -158,7 +156,7 @@ sub my_find_paths {
|
||||
# User can select to look in a special build dir
|
||||
# which is a subdirectory of any of the paths
|
||||
my @extra_dirs;
|
||||
my $build_dir= $vs_config_dir || $ENV{MTR_VS_CONFIG} || $ENV{MTR_BUILD_DIR};
|
||||
my $build_dir= $::opt_vs_config || $ENV{MTR_VS_CONFIG} || $ENV{MTR_BUILD_DIR};
|
||||
push(@extra_dirs, $build_dir) if defined $build_dir;
|
||||
|
||||
if (defined $extension){
|
||||
|
@ -94,7 +94,7 @@ eval {
|
||||
local $SIG{INT}= \&handle_signal;
|
||||
local $SIG{CHLD}= sub {
|
||||
message("Got signal @_");
|
||||
kill(9, -$child_pid);
|
||||
kill('KILL', -$child_pid);
|
||||
my $ret= waitpid($child_pid, 0);
|
||||
if ($? & 127){
|
||||
exit(65); # Killed by signal
|
||||
@ -134,7 +134,7 @@ if ( $@ ) {
|
||||
# Use negative pid in order to kill the whole
|
||||
# process group
|
||||
#
|
||||
my $ret= kill(9, -$child_pid);
|
||||
my $ret= kill('KILL', -$child_pid);
|
||||
message("Killed child: $child_pid, ret: $ret");
|
||||
if ($ret > 0) {
|
||||
message("Killed child: $child_pid");
|
||||
|
@ -1,7 +1,7 @@
|
||||
#!/usr/bin/perl
|
||||
# -*- cperl -*-
|
||||
|
||||
# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU Library General Public
|
||||
@ -256,7 +256,7 @@ my $opt_strace_client;
|
||||
|
||||
our $opt_user = "root";
|
||||
|
||||
my $opt_valgrind= 0;
|
||||
our $opt_valgrind= 0;
|
||||
my $opt_valgrind_mysqld= 0;
|
||||
my $opt_valgrind_mysqltest= 0;
|
||||
my @default_valgrind_args= ("--show-reachable=yes");
|
||||
@ -893,7 +893,7 @@ sub command_line_setup {
|
||||
'ssl|with-openssl' => \$opt_ssl,
|
||||
'skip-ssl' => \$opt_skip_ssl,
|
||||
'compress' => \$opt_compress,
|
||||
'vs-config' => \$opt_vs_config,
|
||||
'vs-config=s' => \$opt_vs_config,
|
||||
|
||||
# Max number of parallel threads to use
|
||||
'parallel=s' => \$opt_parallel,
|
||||
@ -1123,7 +1123,7 @@ sub command_line_setup {
|
||||
chomp;
|
||||
# remove comments (# foo) at the beginning of the line, or after a
|
||||
# blank at the end of the line
|
||||
s/( +|^)#.*$//;
|
||||
s/(\s+|^)#.*$//;
|
||||
# If @ platform specifier given, use this entry only if it contains
|
||||
# @<platform> or @!<xxx> where xxx != platform
|
||||
if (/\@.*/)
|
||||
@ -1134,8 +1134,8 @@ sub command_line_setup {
|
||||
s/\@.*$//;
|
||||
}
|
||||
# remove whitespace
|
||||
s/^ +//;
|
||||
s/ +$//;
|
||||
s/^\s+//;
|
||||
s/\s+$//;
|
||||
# if nothing left, don't need to remember this line
|
||||
if ( $_ eq "" ) {
|
||||
next;
|
||||
@ -4544,13 +4544,6 @@ sub mysqld_start ($$) {
|
||||
unlink($mysqld->value('pid-file'));
|
||||
|
||||
my $output= $mysqld->value('#log-error');
|
||||
if ( $opt_valgrind and $opt_debug )
|
||||
{
|
||||
# When both --valgrind and --debug is selected, send
|
||||
# all output to the trace file, making it possible to
|
||||
# see the exact location where valgrind complains
|
||||
$output= "$opt_vardir/log/".$mysqld->name().".trace";
|
||||
}
|
||||
# Remember this log file for valgrind error report search
|
||||
$mysqld_logs{$output}= 1 if $opt_valgrind;
|
||||
# Remember data dir for gmon.out files if using gprof
|
||||
|
@ -135,4 +135,17 @@ SELECT * FROM t1 PROCEDURE ANALYSE();
|
||||
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
||||
test.t1.a e e- 1 2 0 0 1.3333 NULL ENUM('e','e-') NOT NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#11756242 48137: PROCEDURE ANALYSE() LEAKS MEMORY WHEN RETURNING NULL
|
||||
#
|
||||
CREATE TABLE t1(f1 INT) ENGINE=MYISAM;
|
||||
CREATE TABLE t2(f2 INT) ENGINE=INNODB;
|
||||
INSERT INTO t2 VALUES (1);
|
||||
SELECT DISTINCTROW f1 FROM t1 NATURAL RIGHT OUTER JOIN t2 PROCEDURE ANALYSE();
|
||||
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
||||
test.t1.f1 NULL NULL 0 0 0 1 0.0 0.0 CHAR(0)
|
||||
SELECT * FROM t2 LIMIT 1 PROCEDURE ANALYSE();
|
||||
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
||||
test.t2.f2 1 1 1 1 0 0 1.0000 0.0000 ENUM('1') NOT NULL
|
||||
DROP TABLE t1, t2;
|
||||
End of 5.1 tests
|
||||
|
@ -1,3 +1,4 @@
|
||||
call mtr.add_suppression("Column count of mysql.event is wrong. Expected .*, found .*\. The table is probably corrupted");
|
||||
drop database if exists events_test;
|
||||
drop database if exists db_x;
|
||||
drop database if exists mysqltest_db2;
|
||||
@ -259,33 +260,36 @@ events_test intact_check root@localhost SYSTEM RECURRING NULL 10 # # NULL ENABLE
|
||||
Try to alter mysql.event: the server should fail to load
|
||||
event information after mysql.event was tampered with.
|
||||
|
||||
First, let's add a column to the end and make sure everything
|
||||
works as before
|
||||
First, let's add a column to the end and check the error is emitted.
|
||||
|
||||
ALTER TABLE mysql.event ADD dummy INT;
|
||||
SHOW EVENTS;
|
||||
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
|
||||
events_test intact_check root@localhost SYSTEM RECURRING NULL 10 # # NULL ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
SELECT event_name FROM INFORMATION_SCHEMA.events;
|
||||
event_name
|
||||
intact_check
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
SHOW CREATE EVENT intact_check;
|
||||
Event sql_mode time_zone Create Event character_set_client collation_connection Database Collation
|
||||
intact_check SYSTEM CREATE EVENT `intact_check` ON SCHEDULE EVERY 10 HOUR STARTS '#' ON COMPLETION NOT PRESERVE ENABLE DO SELECT "nothing" latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT no_such_event;
|
||||
ERROR HY000: Unknown event 'no_such_event'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5;
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8;
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
ALTER EVENT intact_check_1 RENAME TO intact_check_2;
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT intact_check_1;
|
||||
ERROR HY000: Unknown event 'intact_check_1'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT intact_check_2;
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT intact_check;
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP DATABASE IF EXISTS mysqltest_no_such_database;
|
||||
Warnings:
|
||||
Note 1008 Can't drop database 'mysqltest_no_such_database'; database doesn't exist
|
||||
CREATE DATABASE mysqltest_db2;
|
||||
DROP DATABASE mysqltest_db2;
|
||||
Warnings:
|
||||
Error 1545 Failed to open mysql.event
|
||||
SELECT @@event_scheduler;
|
||||
@@event_scheduler
|
||||
OFF
|
||||
@ -294,6 +298,7 @@ Variable_name Value
|
||||
event_scheduler OFF
|
||||
SET GLOBAL event_scheduler=OFF;
|
||||
ALTER TABLE mysql.event DROP dummy;
|
||||
DROP EVENT intact_check;
|
||||
CREATE EVENT intact_check ON SCHEDULE EVERY 10 HOUR DO SELECT "nothing";
|
||||
|
||||
Now let's add a column to the first position: the server
|
||||
@ -301,30 +306,32 @@ expects to see event schema name there
|
||||
|
||||
ALTER TABLE mysql.event ADD dummy INT FIRST;
|
||||
SHOW EVENTS;
|
||||
ERROR HY000: Cannot load from mysql.event. The table is probably corrupted
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
SELECT event_name FROM INFORMATION_SCHEMA.events;
|
||||
ERROR HY000: Cannot load from mysql.event. The table is probably corrupted
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
SHOW CREATE EVENT intact_check;
|
||||
ERROR HY000: Unknown event 'intact_check'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT no_such_event;
|
||||
ERROR HY000: Unknown event 'no_such_event'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5;
|
||||
ERROR HY000: Failed to store event name. Error code 2 from storage engine.
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8;
|
||||
ERROR HY000: Unknown event 'intact_check_1'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
ALTER EVENT intact_check_1 RENAME TO intact_check_2;
|
||||
ERROR HY000: Unknown event 'intact_check_1'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT intact_check_1;
|
||||
ERROR HY000: Unknown event 'intact_check_1'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT intact_check_2;
|
||||
ERROR HY000: Unknown event 'intact_check_2'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT intact_check;
|
||||
ERROR HY000: Unknown event 'intact_check'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP DATABASE IF EXISTS mysqltest_no_such_database;
|
||||
Warnings:
|
||||
Note 1008 Can't drop database 'mysqltest_no_such_database'; database doesn't exist
|
||||
CREATE DATABASE mysqltest_db2;
|
||||
DROP DATABASE mysqltest_db2;
|
||||
Warnings:
|
||||
Error 1545 Failed to open mysql.event
|
||||
SELECT @@event_scheduler;
|
||||
@@event_scheduler
|
||||
OFF
|
||||
@ -345,29 +352,32 @@ Drop some columns and try more checks.
|
||||
|
||||
ALTER TABLE mysql.event DROP comment, DROP starts;
|
||||
SHOW EVENTS;
|
||||
ERROR HY000: Cannot load from mysql.event. The table is probably corrupted
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
SELECT event_name FROM INFORMATION_SCHEMA.EVENTS;
|
||||
ERROR HY000: Cannot load from mysql.event. The table is probably corrupted
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
SHOW CREATE EVENT intact_check;
|
||||
ERROR HY000: Cannot load from mysql.event. The table is probably corrupted
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT no_such_event;
|
||||
ERROR HY000: Unknown event 'no_such_event'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5;
|
||||
ERROR HY000: Column count of mysql.event is wrong. Expected 22, found 20. The table is probably corrupted
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8;
|
||||
ERROR HY000: Unknown event 'intact_check_1'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
ALTER EVENT intact_check_1 RENAME TO intact_check_2;
|
||||
ERROR HY000: Unknown event 'intact_check_1'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT intact_check_1;
|
||||
ERROR HY000: Unknown event 'intact_check_1'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT intact_check_2;
|
||||
ERROR HY000: Unknown event 'intact_check_2'
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP EVENT intact_check;
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
DROP DATABASE IF EXISTS mysqltest_no_such_database;
|
||||
Warnings:
|
||||
Note 1008 Can't drop database 'mysqltest_no_such_database'; database doesn't exist
|
||||
CREATE DATABASE mysqltest_db2;
|
||||
DROP DATABASE mysqltest_db2;
|
||||
Warnings:
|
||||
Error 1545 Failed to open mysql.event
|
||||
SELECT @@event_scheduler;
|
||||
@@event_scheduler
|
||||
OFF
|
||||
@ -425,4 +435,42 @@ CREATE TABLE mysql.event like event_like;
|
||||
DROP TABLE event_like;
|
||||
SHOW EVENTS;
|
||||
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
|
||||
|
||||
#
|
||||
# Bug#12394306: the sever may crash if mysql.event is corrupted
|
||||
#
|
||||
|
||||
CREATE EVENT ev1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5;
|
||||
ALTER EVENT ev1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8;
|
||||
|
||||
CREATE TABLE event_original LIKE mysql.event;
|
||||
INSERT INTO event_original SELECT * FROM mysql.event;
|
||||
|
||||
ALTER TABLE mysql.event MODIFY modified CHAR(1);
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'modified' at row 1
|
||||
|
||||
SHOW EVENTS;
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
|
||||
SELECT event_name, created, last_altered FROM information_schema.events;
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
|
||||
CREATE EVENT ev2 ON SCHEDULE EVERY 5 HOUR DO SELECT 5;
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
|
||||
ALTER EVENT ev1 ON SCHEDULE EVERY 9 HOUR DO SELECT 9;
|
||||
ERROR HY000: Failed to open mysql.event
|
||||
|
||||
DROP TABLE mysql.event;
|
||||
RENAME TABLE event_original TO mysql.event;
|
||||
|
||||
DROP EVENT ev1;
|
||||
|
||||
SHOW EVENTS;
|
||||
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
|
||||
|
||||
#
|
||||
# End of tests
|
||||
#
|
||||
drop database events_test;
|
||||
|
@ -1,3 +1,4 @@
|
||||
call mtr.add_suppression("Column count of mysql.event is wrong. Expected .*, found .*\. The table is probably corrupted");
|
||||
set global event_scheduler=off;
|
||||
drop database if exists events_test;
|
||||
create database events_test;
|
||||
@ -52,6 +53,8 @@ Warnings:
|
||||
Note 1008 Can't drop database 'mysqltest_database_not_exists'; database doesn't exist
|
||||
create database mysqltest_db1;
|
||||
drop database mysqltest_db1;
|
||||
Warnings:
|
||||
Error 1545 Failed to open mysql.event
|
||||
Restore the original mysql.event table
|
||||
drop table mysql.event;
|
||||
rename table event_like to mysql.event;
|
||||
|
@ -176,11 +176,12 @@ SELECT @@session.sql_mode INTO @old_sql_mode;
|
||||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||
EXPLAIN EXTENDED SELECT 1 FROM t1
|
||||
WHERE f1 > ALL( SELECT t.f1 FROM t1,t1 AS t );
|
||||
ERROR 42000: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
||||
SHOW WARNINGS;
|
||||
Level Code Message
|
||||
Error 1140 Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
|
||||
Note 1003 select 1 AS `1` from `test`.`t1` where <not>(<exists>(...))
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||
2 SUBQUERY t1 system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
2 SUBQUERY t system NULL NULL NULL NULL 0 0.00 const row not found
|
||||
Warnings:
|
||||
Note 1003 select 1 AS `1` from `test`.`t1` where 0
|
||||
SET SESSION sql_mode=@old_sql_mode;
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests.
|
||||
|
@ -1746,4 +1746,15 @@ MAX(LENGTH(a)) LENGTH(MAX(a)) MIN(a) MAX(a) CONCAT(MIN(a)) CONCAT(MAX(a))
|
||||
20 20 18446668621106209655 18446668621106209655 18446668621106209655 18446668621106209655
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #11766270 59343: YEAR(4): INCORRECT RESULT AND VALGRIND WARNINGS WITH MIN/MAX, UNION
|
||||
#
|
||||
CREATE TABLE t1(f1 YEAR(4));
|
||||
INSERT INTO t1 VALUES (0000),(2001);
|
||||
(SELECT MAX(f1) FROM t1) UNION (SELECT MAX(f1) FROM t1);
|
||||
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
|
||||
def MAX(f1) MAX(f1) 13 4 4 Y 32864 0 63
|
||||
MAX(f1)
|
||||
2001
|
||||
DROP TABLE t1;
|
||||
#
|
||||
End of 5.1 tests
|
||||
|
@ -770,4 +770,10 @@ CASE a WHEN a THEN a END
|
||||
NULL
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #11766212 59270: NOT IN (YEAR( ... ), ... ) PRODUCES MANY VALGRIND WARNINGS
|
||||
#
|
||||
SELECT 1 IN (YEAR(FROM_UNIXTIME(NULL)) ,1);
|
||||
1 IN (YEAR(FROM_UNIXTIME(NULL)) ,1)
|
||||
1
|
||||
#
|
||||
End of 5.1 tests
|
||||
|
@ -518,4 +518,26 @@ CREATE TABLE t1 SELECT CEIL(LINESTRINGFROMWKB(1) DIV NULL);
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 SELECT FLOOR(LINESTRINGFROMWKB(1) DIV NULL);
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#11765923 58937: MANY VALGRIND ERRORS AFTER GROUPING BY RESULT OF DECIMAL COLUMN FUNCTION
|
||||
#
|
||||
CREATE TABLE t1(f1 DECIMAL(22,1));
|
||||
INSERT INTO t1 VALUES (0),(1);
|
||||
SELECT ROUND(f1, f1) FROM t1;
|
||||
ROUND(f1, f1)
|
||||
0.0
|
||||
1.0
|
||||
SELECT ROUND(f1, f1) FROM t1 GROUP BY 1;
|
||||
ROUND(f1, f1)
|
||||
0.0
|
||||
1.0
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#11764671 57533: UNINITIALISED VALUES IN COPY_AND_CONVERT (SQL_STRING.CC) WITH CERTAIN CHA
|
||||
#
|
||||
SELECT ROUND(LEAST(15, -4939092, 0.2704), STDDEV('a'));
|
||||
ROUND(LEAST(15, -4939092, 0.2704), STDDEV('a'))
|
||||
-4939092.0000
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect DOUBLE value: 'a'
|
||||
End of 5.1 tests
|
||||
|
@ -1405,4 +1405,16 @@ NULL
|
||||
SELECT ADDDATE(MONTH(FROM_UNIXTIME(NULL)),INTERVAL 1 HOUR);
|
||||
ADDDATE(MONTH(FROM_UNIXTIME(NULL)),INTERVAL 1 HOUR)
|
||||
NULL
|
||||
#
|
||||
# Bug#11889186 60503: CRASH IN MAKE_DATE_TIME WITH DATE_FORMAT / STR_TO_DATE COMBINATION
|
||||
#
|
||||
SELECT DATE_FORMAT('0000-00-11', '%W');
|
||||
DATE_FORMAT('0000-00-11', '%W')
|
||||
NULL
|
||||
SELECT DATE_FORMAT('0000-00-11', '%a');
|
||||
DATE_FORMAT('0000-00-11', '%a')
|
||||
NULL
|
||||
SELECT DATE_FORMAT('0000-00-11', '%w');
|
||||
DATE_FORMAT('0000-00-11', '%w')
|
||||
NULL
|
||||
End of 5.1 tests
|
||||
|
@ -545,4 +545,26 @@ FROM t1 JOIN t2 ON t2.f2 LIKE 'x'
|
||||
HAVING field1 < 7;
|
||||
field1
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# Bug#48916 Server incorrectly processing HAVING clauses with an ORDER BY clause
|
||||
#
|
||||
CREATE TABLE t1 (f1 INT, f2 INT);
|
||||
INSERT INTO t1 VALUES (1, 0), (2, 1), (3, 2);
|
||||
CREATE TABLE t2 (f1 INT, f2 INT);
|
||||
SELECT t1.f1
|
||||
FROM t1
|
||||
HAVING (3, 2) IN (SELECT f1, f2 FROM t2) AND t1.f1 >= 0
|
||||
ORDER BY t1.f1;
|
||||
f1
|
||||
SELECT t1.f1
|
||||
FROM t1
|
||||
HAVING (3, 2) IN (SELECT 4, 2) AND t1.f1 >= 0
|
||||
ORDER BY t1.f1;
|
||||
f1
|
||||
SELECT t1.f1
|
||||
FROM t1
|
||||
HAVING 2 IN (SELECT f2 FROM t2) AND t1.f1 >= 0
|
||||
ORDER BY t1.f1;
|
||||
f1
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.1 tests
|
||||
|
@ -532,4 +532,20 @@ a
|
||||
0
|
||||
1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#11765139 58069: LOAD DATA INFILE: VALGRIND REPORTS INVALID MEMORY READS AND WRITES WITH U
|
||||
#
|
||||
CREATE TABLE t1(f1 INT);
|
||||
SELECT 0xE1BB30 INTO OUTFILE 't1.dat';
|
||||
LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#11765141 - 58072: LOAD DATA INFILE: LEAKS IO CACHE MEMORY
|
||||
# WHEN ERROR OCCURS
|
||||
#
|
||||
SELECT '1\n' INTO DUMPFILE 'MYSQLTEST_VARDIR/tmp/bug11735141.txt';
|
||||
create table t1(a point);
|
||||
LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/bug11735141.txt' INTO TABLE t1;
|
||||
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
||||
drop table t1;
|
||||
End of 5.1 tests
|
||||
|
@ -109,3 +109,13 @@ count(*)
|
||||
35840
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
RESET MASTER;
|
||||
USE test;
|
||||
SET @old_binlog_format= @@binlog_format;
|
||||
SET SESSION binlog_format=ROW;
|
||||
CREATE TABLE t1(c1 INT);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
FLUSH LOGS;
|
||||
DROP TABLE t1;
|
||||
SET SESSION binlog_format= @old_binlog_format;
|
||||
RESET MASTER;
|
||||
|
@ -79,3 +79,12 @@ a
|
||||
DROP TABLE t1;
|
||||
# Should not be any files left here
|
||||
# End of bug#30102 test.
|
||||
# Test of post-push fix for bug#11766249/59316
|
||||
CREATE TABLE t1 (a INT, b VARCHAR(255), PRIMARY KEY (a))
|
||||
ENGINE = MyISAM
|
||||
PARTITION BY RANGE (a)
|
||||
(PARTITION p0 VALUES LESS THAN (0) MAX_ROWS=100,
|
||||
PARTITION p1 VALUES LESS THAN (100) MAX_ROWS=100,
|
||||
PARTITION pMax VALUES LESS THAN MAXVALUE);
|
||||
INSERT INTO t1 VALUES (1, "Partition p1, first row");
|
||||
DROP TABLE t1;
|
38
mysql-test/r/secure_file_priv_win.result
Normal file
38
mysql-test/r/secure_file_priv_win.result
Normal file
@ -0,0 +1,38 @@
|
||||
CREATE TABLE t1 (c1 longtext);
|
||||
INSERT INTO t1 values ('a');
|
||||
SELECT * FROM t1 INTO OUTFILE 'MYSQL_TMP_DIR/B11764517.tmp';
|
||||
show global variables like 'secure_file_priv';
|
||||
Variable_name Value
|
||||
secure_file_priv MYSQL_TMP_DIR/
|
||||
SELECT load_file('MYSQL_TMP_DIR\\B11764517.tmp') AS x;
|
||||
x
|
||||
a
|
||||
|
||||
SELECT load_file('MYSQL_TMP_DIR/B11764517.tmp') AS x;
|
||||
x
|
||||
a
|
||||
|
||||
SELECT load_file('MYSQL_TMP_DIR_UCASE/B11764517.tmp') AS x;
|
||||
x
|
||||
a
|
||||
|
||||
SELECT load_file('MYSQL_TMP_DIR_LCASE/B11764517.tmp') AS x;
|
||||
x
|
||||
a
|
||||
|
||||
SELECT load_file('MYSQL_TMP_DIR\\..a..\\..\\..\\B11764517.tmp') AS x;
|
||||
x
|
||||
NULL
|
||||
LOAD DATA INFILE 'MYSQL_TMP_DIR\\B11764517.tmp' INTO TABLE t1;
|
||||
LOAD DATA INFILE 'MYSQL_TMP_DIR/B11764517.tmp' INTO TABLE t1;
|
||||
LOAD DATA INFILE 'MYSQL_TMP_DIR_UCASE/B11764517.tmp' INTO TABLE t1;
|
||||
LOAD DATA INFILE 'MYSQL_TMP_DIR_LCASE/B11764517.tmp' INTO TABLE t1;
|
||||
LOAD DATA INFILE "MYSQL_TMP_DIR\\..a..\\..\\..\\B11764517.tmp" into table t1;
|
||||
ERROR HY000: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
|
||||
SELECT * FROM t1 INTO OUTFILE 'MYSQL_TMP_DIR\\..a..\\..\\..\\B11764517-2.tmp';
|
||||
ERROR HY000: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
|
||||
SELECT * FROM t1 INTO OUTFILE 'MYSQL_TMP_DIR\\B11764517-2.tmp';
|
||||
SELECT * FROM t1 INTO OUTFILE 'MYSQL_TMP_DIR/B11764517-3.tmp';
|
||||
SELECT * FROM t1 INTO OUTFILE 'MYSQL_TMP_DIR_UCASE/B11764517-4.tmp';
|
||||
SELECT * FROM t1 INTO OUTFILE 'MYSQL_TMP_DIR_LCASE/B11764517-5.tmp';
|
||||
DROP TABLE t1;
|
@ -4435,6 +4435,32 @@ pk int_key
|
||||
3 3
|
||||
7 3
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# Bug#12329653
|
||||
# EXPLAIN, UNION, PREPARED STATEMENT, CRASH, SQL_FULL_GROUP_BY
|
||||
#
|
||||
CREATE TABLE t1(a1 int);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
SELECT @@session.sql_mode INTO @old_sql_mode;
|
||||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||
SELECT 1 FROM t1 WHERE 1 < SOME (SELECT a1 FROM t1);
|
||||
1
|
||||
1
|
||||
1
|
||||
PREPARE stmt FROM
|
||||
'SELECT 1 UNION ALL
|
||||
SELECT 1 FROM t1
|
||||
ORDER BY
|
||||
(SELECT 1 FROM t1 AS t1_0
|
||||
WHERE 1 < SOME (SELECT a1 FROM t1)
|
||||
)' ;
|
||||
EXECUTE stmt ;
|
||||
ERROR 21000: Subquery returns more than 1 row
|
||||
EXECUTE stmt ;
|
||||
ERROR 21000: Subquery returns more than 1 row
|
||||
SET SESSION sql_mode=@old_sql_mode;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests.
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
INSERT INTO t1 VALUES (2,22),(1,11),(2,22);
|
||||
@ -4734,3 +4760,21 @@ SELECT * FROM t2 UNION SELECT * FROM t2
|
||||
ORDER BY (SELECT * FROM t1 WHERE MATCH(a) AGAINST ('+abc' IN BOOLEAN MODE));
|
||||
DROP TABLE t1,t2;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# Bug #11765713 58705:
|
||||
# OPTIMIZER LET ENGINE DEPEND ON UNINITIALIZED VALUES
|
||||
# CREATED BY OPT_SUM_QUERY
|
||||
#
|
||||
CREATE TABLE t1(a INT NOT NULL, KEY (a));
|
||||
INSERT INTO t1 VALUES (0), (1);
|
||||
SELECT 1 as foo FROM t1 WHERE a < SOME
|
||||
(SELECT a FROM t1 WHERE a <=>
|
||||
(SELECT a FROM t1)
|
||||
);
|
||||
ERROR 21000: Subquery returns more than 1 row
|
||||
SELECT 1 as foo FROM t1 WHERE a < SOME
|
||||
(SELECT a FROM t1 WHERE a <=>
|
||||
(SELECT a FROM t1 where a is null)
|
||||
);
|
||||
foo
|
||||
DROP TABLE t1;
|
||||
|
@ -547,4 +547,67 @@ a
|
||||
2000-01-01 00:00:01
|
||||
2000-01-01 00:00:01
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#50774: failed to get the correct resultset when timestamp values
|
||||
# are appended with .0
|
||||
#
|
||||
CREATE TABLE t1 ( a TIMESTAMP, KEY ( a ) );
|
||||
INSERT INTO t1 VALUES( '2010-02-01 09:31:01' );
|
||||
INSERT INTO t1 VALUES( '2010-02-01 09:31:02' );
|
||||
INSERT INTO t1 VALUES( '2010-02-01 09:31:03' );
|
||||
INSERT INTO t1 VALUES( '2010-02-01 09:31:04' );
|
||||
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
|
||||
a
|
||||
2010-02-01 09:31:02
|
||||
2010-02-01 09:31:03
|
||||
2010-02-01 09:31:04
|
||||
SELECT * FROM t1 WHERE '2010-02-01 09:31:02.0' <= a;
|
||||
a
|
||||
2010-02-01 09:31:02
|
||||
2010-02-01 09:31:03
|
||||
2010-02-01 09:31:04
|
||||
SELECT * FROM t1 WHERE a <= '2010-02-01 09:31:02.0';
|
||||
a
|
||||
2010-02-01 09:31:01
|
||||
2010-02-01 09:31:02
|
||||
SELECT * FROM t1 WHERE '2010-02-01 09:31:02.0' >= a;
|
||||
a
|
||||
2010-02-01 09:31:01
|
||||
2010-02-01 09:31:02
|
||||
EXPLAIN
|
||||
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
x x x range x x x x x x
|
||||
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
|
||||
a
|
||||
2010-02-01 09:31:02
|
||||
2010-02-01 09:31:03
|
||||
2010-02-01 09:31:04
|
||||
CREATE TABLE t2 ( a TIMESTAMP, KEY ( a DESC ) );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:01' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:02' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:03' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:04' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:05' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:06' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:07' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:08' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:09' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:10' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:11' );
|
||||
# The bug would cause the range optimizer's comparison to use an open
|
||||
# interval here. This reveals itself only in the number of reads
|
||||
# performed.
|
||||
FLUSH STATUS;
|
||||
EXPLAIN
|
||||
SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0';
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
x x x range x x x x x x
|
||||
SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0';
|
||||
a
|
||||
2010-02-01 09:31:01
|
||||
SHOW STATUS LIKE 'Handler_read_next';
|
||||
Variable_name Value
|
||||
Handler_read_next 1
|
||||
DROP TABLE t1, t2;
|
||||
End of 5.1 tests
|
||||
|
15
mysql-test/suite/binlog/r/binlog_bug23533.result
Normal file
15
mysql-test/suite/binlog/r/binlog_bug23533.result
Normal file
@ -0,0 +1,15 @@
|
||||
SET AUTOCOMMIT=0;
|
||||
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT, b TEXT, PRIMARY KEY(a)) ENGINE=InnoDB;
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
1000
|
||||
SET GLOBAL binlog_cache_size=4096;
|
||||
SET GLOBAL max_binlog_cache_size=4096;
|
||||
START TRANSACTION;
|
||||
CREATE TABLE t2 SELECT * FROM t1;
|
||||
ERROR HY000: Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
|
||||
COMMIT;
|
||||
SHOW TABLES LIKE 't%';
|
||||
Tables_in_test (t%)
|
||||
t1
|
||||
DROP TABLE t1;
|
10
mysql-test/suite/binlog/r/binlog_bug36391.result
Normal file
10
mysql-test/suite/binlog/r/binlog_bug36391.result
Normal file
@ -0,0 +1,10 @@
|
||||
CREATE TABLE t1(id INT);
|
||||
SHOW TABLES;
|
||||
Tables_in_test
|
||||
t1
|
||||
FLUSH LOGS;
|
||||
DROP TABLE t1;
|
||||
SHOW TABLES;
|
||||
Tables_in_test
|
||||
t1
|
||||
DROP TABLE t1;
|
@ -4,33 +4,47 @@
|
||||
#############################################################
|
||||
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_log_bin.inc
|
||||
--source include/have_binlog_format_row.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
SET AUTOCOMMIT=0;
|
||||
SET GLOBAL max_binlog_cache_size=4096;
|
||||
SHOW VARIABLES LIKE 'max_binlog_cache_size';
|
||||
|
||||
# Create 1st table
|
||||
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT, b TEXT, PRIMARY KEY(a)) ENGINE=InnoDB;
|
||||
|
||||
--disable_query_log
|
||||
let $i= 1000;
|
||||
while ($i)
|
||||
{
|
||||
BEGIN;
|
||||
eval INSERT INTO t1 VALUES($i, REPEAT('x', 4096));
|
||||
COMMIT;
|
||||
dec $i;
|
||||
}
|
||||
--enable_query_log
|
||||
|
||||
SELECT COUNT(*) FROM t1;
|
||||
|
||||
# Set small value for max_binlog_cache_size
|
||||
let $saved_binlog_cache_size= query_get_value(SELECT @@binlog_cache_size AS Value, Value, 1);
|
||||
let $saved_max_binlog_cache_size= query_get_value(SELECT @@max_binlog_cache_size AS Value, Value, 1);
|
||||
SET GLOBAL binlog_cache_size=4096;
|
||||
SET GLOBAL max_binlog_cache_size=4096;
|
||||
|
||||
# New value of max_binlog_cache_size will apply to new session
|
||||
disconnect default;
|
||||
connect(default,localhost,root,,test);
|
||||
|
||||
# Copied data from t1 into t2 large than max_binlog_cache_size
|
||||
START TRANSACTION;
|
||||
--error 1534
|
||||
--error 1197
|
||||
CREATE TABLE t2 SELECT * FROM t1;
|
||||
COMMIT;
|
||||
SHOW TABLES LIKE 't%';
|
||||
|
||||
|
||||
# 5.1 End of Test
|
||||
--source include/rpl_end.inc
|
||||
--disable_query_log
|
||||
eval SET GLOBAL max_binlog_cache_size=$saved_max_binlog_cache_size;
|
||||
eval SET GLOBAL binlog_cache_size=$saved_binlog_cache_size;
|
||||
--enable_query_log
|
||||
DROP TABLE t1;
|
||||
disconnect default;
|
||||
connect(default,localhost,root,,test);
|
@ -13,17 +13,18 @@
|
||||
#
|
||||
#
|
||||
|
||||
--source include/master-slave.inc
|
||||
--source include/have_log_bin.inc
|
||||
--source include/have_binlog_format_mixed.inc
|
||||
|
||||
create table t1(id int);
|
||||
CREATE TABLE t1(id INT);
|
||||
let $binlog= query_get_value(SHOW MASTER STATUS, File, 1);
|
||||
let $binlog_path= `SELECT CONCAT(@@DATADIR, '$binlog')`;
|
||||
SHOW TABLES;
|
||||
FLUSH LOGS;
|
||||
DROP TABLE t1;
|
||||
|
||||
show tables;
|
||||
--exec $MYSQL_BINLOG $binlog_path | $MYSQL test
|
||||
SHOW TABLES;
|
||||
|
||||
--source include/show_master_status.inc
|
||||
|
||||
flush logs;
|
||||
|
||||
--exec $MYSQL_BINLOG $MYSQL_TEST_DIR/var/log/master-bin.000001 | $MYSQL test
|
||||
|
||||
drop table t1;
|
||||
--source include/rpl_end.inc
|
||||
# Clean up
|
||||
DROP TABLE t1;
|
@ -1,8 +0,0 @@
|
||||
[row]
|
||||
binlog-format=row
|
||||
|
||||
[stmt]
|
||||
binlog-format=statement
|
||||
|
||||
[mix]
|
||||
binlog-format=mixed
|
@ -1,3 +0,0 @@
|
||||
a
|
||||
b
|
||||
c
|
@ -1,33 +0,0 @@
|
||||
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;
|
||||
|
||||
**** On Master ****
|
||||
CREATE TABLE t1 (b CHAR(10));
|
||||
|
||||
**** On Slave ****
|
||||
STOP SLAVE;
|
||||
|
||||
**** On Master ****
|
||||
LOAD DATA INFILE FILENAME
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
3
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query # # use `test`; CREATE TABLE t1 (b CHAR(10))
|
||||
master-bin.000001 # Begin_load_query # # ;file_id=#;block_len=#
|
||||
master-bin.000001 # Execute_load_query # # use `test`; LOAD DATA INFILE 'MYSQLTEST_VARDIR/tmp/rpl_bug12691.dat' INTO TABLE `t1` FIELDS TERMINATED BY '|' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`b`) ;file_id=#
|
||||
|
||||
**** On Slave ****
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
|
||||
START SLAVE;
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
0
|
||||
|
||||
**** On Master ****
|
||||
DROP TABLE t1;
|
@ -1,23 +0,0 @@
|
||||
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;
|
||||
DROP TABLE IF EXISTS t1,t2;
|
||||
SET AUTOCOMMIT=0;
|
||||
SET GLOBAL max_binlog_cache_size=4096;
|
||||
SHOW VARIABLES LIKE 'max_binlog_cache_size';
|
||||
Variable_name Value
|
||||
max_binlog_cache_size 4096
|
||||
CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT, b TEXT, PRIMARY KEY(a)) ENGINE=InnoDB;
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
1000
|
||||
START TRANSACTION;
|
||||
CREATE TABLE t2 SELECT * FROM t1;
|
||||
ERROR HY000: Writing one row to the row-based binary log failed
|
||||
COMMIT;
|
||||
SHOW TABLES LIKE 't%';
|
||||
Tables_in_test (t%)
|
||||
t1
|
@ -1,16 +0,0 @@
|
||||
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;
|
||||
CREATE TABLE t1 (a VARCHAR(10) PRIMARY KEY) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES ('a');
|
||||
UPDATE t1 SET a = 'MyISAM';
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a
|
||||
MyISAM
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a
|
||||
MyISAM
|
||||
DROP TABLE t1;
|
@ -1,16 +0,0 @@
|
||||
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;
|
||||
CREATE TABLE t1 ( a INT, b INT DEFAULT -3 );
|
||||
INSERT INTO t1 VALUES (1, DEFAULT);
|
||||
UPDATE t1 SET a = 3;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a b
|
||||
3 -3
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
a b
|
||||
3 -3
|
||||
DROP TABLE t1;
|
@ -1,15 +0,0 @@
|
||||
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;
|
||||
create table `t1` (`id` int not null auto_increment primary key);
|
||||
create trigger `trg` before insert on `t1` for each row begin end;
|
||||
set @@global.debug="+d,simulate_bug33029";
|
||||
stop slave;
|
||||
start slave;
|
||||
insert into `t1` values ();
|
||||
select * from t1;
|
||||
id
|
||||
1
|
@ -1,18 +0,0 @@
|
||||
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;
|
||||
drop table if exists t1;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
create table t1(id int);
|
||||
show tables;
|
||||
Tables_in_test
|
||||
t1
|
||||
show master status;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000001 # <Binlog_Do_DB> <Binlog_Ignore_DB>
|
||||
flush logs;
|
||||
drop table t1;
|
@ -1,17 +0,0 @@
|
||||
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;
|
||||
CREATE TABLE char128_utf8 (
|
||||
i1 INT NOT NULL,
|
||||
c CHAR(128) CHARACTER SET utf8 NOT NULL,
|
||||
i2 INT NOT NULL);
|
||||
INSERT INTO char128_utf8 VALUES ( 1, "123", 1 );
|
||||
SELECT * FROM char128_utf8;
|
||||
i1 c i2
|
||||
1 123 1
|
||||
SELECT * FROM char128_utf8;
|
||||
i1 c i2
|
||||
1 123 1
|
@ -1,56 +0,0 @@
|
||||
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;
|
||||
create table t1i(n int primary key) engine=innodb;
|
||||
create table t2m(n int primary key) engine=myisam;
|
||||
begin;
|
||||
insert into t1i values (1);
|
||||
insert into t1i values (2);
|
||||
insert into t1i values (3);
|
||||
commit;
|
||||
begin;
|
||||
insert into t1i values (5);
|
||||
begin;
|
||||
insert into t1i values (4);
|
||||
insert into t2m values (1);
|
||||
update t1i set n = 5 where n = 4;
|
||||
commit;
|
||||
zero
|
||||
0
|
||||
*** kill sql thread ***
|
||||
rollback;
|
||||
*** sql thread is *not* running: No ***
|
||||
*** the prove: the killed slave has not finished the current transaction ***
|
||||
three
|
||||
3
|
||||
one
|
||||
1
|
||||
zero
|
||||
0
|
||||
delete from t2m;
|
||||
start slave sql_thread;
|
||||
delete from t1i;
|
||||
delete from t2m;
|
||||
begin;
|
||||
insert into t1i values (5);
|
||||
begin;
|
||||
insert into t1i values (4);
|
||||
update t1i set n = 5 where n = 4;
|
||||
commit;
|
||||
zero
|
||||
0
|
||||
stop slave sql_thread;
|
||||
rollback;
|
||||
*** sql thread is *not* running: No ***
|
||||
*** the prove: the stopped slave has rolled back the current transaction ***
|
||||
zero
|
||||
0
|
||||
zero
|
||||
0
|
||||
one
|
||||
1
|
||||
start slave sql_thread;
|
||||
drop table t1i, t2m;
|
@ -1,49 +0,0 @@
|
||||
# Bug#12691: Exec_master_log_pos corrupted with SQL_SLAVE_SKIP_COUNTER
|
||||
|
||||
--source include/master-slave.inc
|
||||
--connection master
|
||||
--source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
--echo
|
||||
--echo **** On Master ****
|
||||
CREATE TABLE t1 (b CHAR(10));
|
||||
--echo
|
||||
--echo **** On Slave ****
|
||||
--sync_slave_with_master
|
||||
STOP SLAVE;
|
||||
--source include/wait_for_slave_to_stop.inc
|
||||
|
||||
--connection master
|
||||
|
||||
--echo
|
||||
--echo **** On Master ****
|
||||
--exec cp $MYSQL_TEST_DIR/suite/bugs/data/rpl_bug12691.dat $MYSQLTEST_VARDIR/tmp/
|
||||
--echo LOAD DATA INFILE FILENAME
|
||||
--disable_query_log
|
||||
--eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/rpl_bug12691.dat' INTO TABLE t1 FIELDS TERMINATED BY '|'
|
||||
--enable_query_log
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/rpl_bug12691.dat
|
||||
|
||||
SELECT COUNT(*) FROM t1;
|
||||
|
||||
source include/show_binlog_events.inc;
|
||||
|
||||
--save_master_pos
|
||||
|
||||
--connection slave
|
||||
--echo
|
||||
--echo **** On Slave ****
|
||||
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
|
||||
START SLAVE;
|
||||
--source include/wait_for_slave_to_start.inc
|
||||
--sync_with_master
|
||||
|
||||
SELECT COUNT(*) FROM t1;
|
||||
|
||||
# Clean up
|
||||
--connection master
|
||||
--echo
|
||||
--echo **** On Master ****
|
||||
DROP TABLE t1;
|
||||
|
||||
--source include/rpl_end.inc
|
@ -1,25 +0,0 @@
|
||||
|
||||
# BUG#31582: 5.1-telco-6.1 -> 5.1.22. Slave crashes when reading
|
||||
# UPDATE for VARCHAR
|
||||
|
||||
# This is a problem for any update statement replicating from an old
|
||||
# server to a new server. The bug consisted of a new slave trying to
|
||||
# read two column bitmaps, but there is only one available in the old
|
||||
# format.
|
||||
|
||||
# This test case should be executed replicating from an old server to
|
||||
# a new server, so make sure you have one handy.
|
||||
|
||||
source include/master-slave.inc;
|
||||
|
||||
CREATE TABLE t1 (a VARCHAR(10) PRIMARY KEY) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES ('a');
|
||||
UPDATE t1 SET a = 'MyISAM';
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
sync_slave_with_master;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
|
||||
connection master;
|
||||
DROP TABLE t1;
|
||||
|
||||
--source include/rpl_end.inc
|
@ -1,25 +0,0 @@
|
||||
#
|
||||
# BUG#31583: 5.1-telco-6.1 -> 5.1.22. Slave returns Error in unknown event
|
||||
|
||||
# This is a problem for any update statement replicating from an old
|
||||
# server to a new server. The bug consisted of a new slave trying to
|
||||
# read two column bitmaps, but there is only one available in the old
|
||||
# format.
|
||||
|
||||
# This test case should be executed replicating from an old server to
|
||||
# a new server, so make sure you have one handy.
|
||||
|
||||
source include/master-slave.inc;
|
||||
|
||||
CREATE TABLE t1 ( a INT, b INT DEFAULT -3 );
|
||||
|
||||
INSERT INTO t1 VALUES (1, DEFAULT);
|
||||
UPDATE t1 SET a = 3;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
sync_slave_with_master;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
|
||||
connection master;
|
||||
DROP TABLE t1;
|
||||
|
||||
--source include/rpl_end.inc
|
@ -1,26 +0,0 @@
|
||||
#
|
||||
# Bug #36443 Server crashes when executing insert when insert trigger on table
|
||||
#
|
||||
# Emulating the former bug#33029 situation to see that there is no crash anymore.
|
||||
#
|
||||
|
||||
|
||||
source include/master-slave.inc;
|
||||
|
||||
create table `t1` (`id` int not null auto_increment primary key);
|
||||
create trigger `trg` before insert on `t1` for each row begin end;
|
||||
|
||||
sync_slave_with_master;
|
||||
set @@global.debug="+d,simulate_bug33029";
|
||||
|
||||
stop slave;
|
||||
start slave;
|
||||
|
||||
connection master;
|
||||
|
||||
insert into `t1` values ();
|
||||
|
||||
sync_slave_with_master;
|
||||
select * from t1;
|
||||
|
||||
--source include/rpl_end.inc
|
@ -1,166 +0,0 @@
|
||||
#
|
||||
# Bug #38205 Row-based Replication (RBR) causes inconsistencies: HA_ERR_FOUND_DUPP_KEY
|
||||
# Bug#319 if while a non-transactional slave is replicating a transaction possible problem
|
||||
#
|
||||
# Verifying the fact that STOP SLAVE in the middle of a group execution waits
|
||||
# for the end of the group before the slave sql thread will stop.
|
||||
# The patch refines STOP SLAVE to not interrupt a transaction or other type of
|
||||
# the replication events group (the part I).
|
||||
# Killing the sql thread continues to provide a "hard" stop (the part II).
|
||||
#
|
||||
# Non-deterministic tests
|
||||
#
|
||||
|
||||
source include/master-slave.inc;
|
||||
source include/have_innodb.inc;
|
||||
|
||||
|
||||
#
|
||||
# Part II, killed sql slave leaves instantly
|
||||
#
|
||||
|
||||
# A. multi-statement transaction as the replication group
|
||||
|
||||
connection master;
|
||||
|
||||
create table t1i(n int primary key) engine=innodb;
|
||||
create table t2m(n int primary key) engine=myisam;
|
||||
|
||||
sync_slave_with_master;
|
||||
|
||||
connection master;
|
||||
|
||||
begin;
|
||||
insert into t1i values (1);
|
||||
insert into t1i values (2);
|
||||
insert into t1i values (3);
|
||||
commit;
|
||||
|
||||
sync_slave_with_master;
|
||||
|
||||
#
|
||||
# todo: first challenge is to find out the SQL thread id
|
||||
# the following is not fully reliable
|
||||
#
|
||||
|
||||
let $id=`SELECT id from information_schema.processlist where user like 'system user' and state like '%Has read all relay log%' or user like 'system user' and state like '%Reading event from the relay log%'`;
|
||||
connection slave;
|
||||
begin;
|
||||
insert into t1i values (5);
|
||||
|
||||
connection master;
|
||||
let $pos0_master= query_get_value(SHOW MASTER STATUS, Position, 1);
|
||||
begin;
|
||||
insert into t1i values (4);
|
||||
insert into t2m values (1); # non-ta update
|
||||
update t1i set n = 5 where n = 4; # to block at. can't be played with killed
|
||||
commit;
|
||||
let $pos1_master= query_get_value(SHOW MASTER STATUS, Position, 1);
|
||||
|
||||
connection slave;
|
||||
# slave sql thread must be locked out by the conn `slave' explicit lock
|
||||
let $pos0_slave= query_get_value(SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1);
|
||||
--disable_query_log
|
||||
eval select $pos0_master - $pos0_slave as zero;
|
||||
--enable_query_log
|
||||
|
||||
connection slave1;
|
||||
|
||||
let $count= 1;
|
||||
let $table= t2m;
|
||||
source include/wait_until_rows_count.inc;
|
||||
#
|
||||
# todo: may fail as said above
|
||||
#
|
||||
--echo *** kill sql thread ***
|
||||
--disable_query_log
|
||||
eval kill connection $id;
|
||||
--enable_query_log
|
||||
|
||||
connection slave;
|
||||
rollback; # release the sql thread
|
||||
|
||||
connection slave1;
|
||||
|
||||
source include/wait_for_slave_sql_to_stop.inc;
|
||||
let $sql_status= query_get_value(SHOW SLAVE STATUS, Slave_SQL_Running, 1);
|
||||
--echo *** sql thread is *not* running: $sql_status ***
|
||||
let $pos1_slave= query_get_value(SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1);
|
||||
|
||||
connection slave;
|
||||
--echo *** the prove: the killed slave has not finished the current transaction ***
|
||||
|
||||
--disable_query_log
|
||||
select count(*) as three from t1i;
|
||||
eval select $pos1_master > $pos1_slave as one;
|
||||
eval select $pos1_slave - $pos0_slave as zero;
|
||||
--enable_query_log
|
||||
|
||||
delete from t2m; # remove the row to be able to replay
|
||||
start slave sql_thread;
|
||||
|
||||
#
|
||||
# Part I: B The homogenous transaction remains interuptable in between
|
||||
#
|
||||
|
||||
connection master;
|
||||
delete from t1i;
|
||||
delete from t2m;
|
||||
|
||||
sync_slave_with_master;
|
||||
begin;
|
||||
insert into t1i values (5);
|
||||
|
||||
connection master;
|
||||
let $pos0_master= query_get_value(SHOW MASTER STATUS, Position, 1);
|
||||
begin;
|
||||
insert into t1i values (4);
|
||||
update t1i set n = 5 where n = 4; # to block at. not to be played
|
||||
commit;
|
||||
let $pos1_master= query_get_value(SHOW MASTER STATUS, Position, 1);
|
||||
|
||||
|
||||
connection slave1;
|
||||
# slave sql can't advance as must be locked by the conn `slave' trans
|
||||
let $pos0_slave= query_get_value(SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1);
|
||||
--disable_query_log
|
||||
eval select $pos0_master - $pos0_slave as zero;
|
||||
--enable_query_log
|
||||
|
||||
#
|
||||
# the replicated trans is blocked by the slave's local.
|
||||
# However, it's not easy to catch the exact moment when it happens.
|
||||
# The test issues sleep which makes the test either non-deterministic or
|
||||
# wasting too much time.
|
||||
#
|
||||
--sleep 3
|
||||
|
||||
send stop slave sql_thread;
|
||||
|
||||
connection slave;
|
||||
rollback; # release the sql thread
|
||||
|
||||
connection slave1;
|
||||
reap;
|
||||
source include/wait_for_slave_sql_to_stop.inc;
|
||||
let $sql_status= query_get_value(SHOW SLAVE STATUS, Slave_SQL_Running, 1);
|
||||
--echo *** sql thread is *not* running: $sql_status ***
|
||||
|
||||
let $pos1_slave= query_get_value(SHOW SLAVE STATUS, Exec_Master_Log_Pos, 1);
|
||||
|
||||
--echo *** the prove: the stopped slave has rolled back the current transaction ***
|
||||
|
||||
--disable_query_log
|
||||
select count(*) as zero from t1i;
|
||||
eval select $pos0_master - $pos0_slave as zero;
|
||||
eval select $pos1_master > $pos0_slave as one;
|
||||
--enable_query_log
|
||||
|
||||
start slave sql_thread;
|
||||
|
||||
# clean-up
|
||||
|
||||
connection master;
|
||||
drop table t1i, t2m;
|
||||
|
||||
--source include/rpl_end.inc
|
17
mysql-test/suite/innodb/r/innodb_bug59410.result
Normal file
17
mysql-test/suite/innodb/r/innodb_bug59410.result
Normal file
@ -0,0 +1,17 @@
|
||||
create table `bug59410_1`(`a` int)engine=innodb;
|
||||
insert into `bug59410_1` values (1),(2),(3);
|
||||
select 1 from `bug59410_1` where `a` <> any (
|
||||
select 1 from `bug59410_1` where `a` <> 1 for update)
|
||||
for update;
|
||||
1
|
||||
1
|
||||
1
|
||||
drop table bug59410_1;
|
||||
create table bug59410_2(`a` char(1),`b` int)engine=innodb;
|
||||
insert into bug59410_2 values('0',0);
|
||||
set transaction isolation level read uncommitted;
|
||||
start transaction;
|
||||
set @a=(select b from bug59410_2 where
|
||||
(select 1 from bug59410_2 where a group by @a=b)
|
||||
group by @a:=b);
|
||||
drop table bug59410_2;
|
57
mysql-test/suite/innodb/r/innodb_bug59641.result
Normal file
57
mysql-test/suite/innodb/r/innodb_bug59641.result
Normal file
@ -0,0 +1,57 @@
|
||||
CREATE TABLE t(a INT PRIMARY KEY, b INT)ENGINE=InnoDB;
|
||||
INSERT INTO t VALUES(2,2),(4,4),(8,8),(16,16),(32,32);
|
||||
COMMIT;
|
||||
XA START '123';
|
||||
INSERT INTO t VALUES(1,1);
|
||||
XA END '123';
|
||||
XA PREPARE '123';
|
||||
XA START '456';
|
||||
INSERT INTO t VALUES(3,47),(5,67);
|
||||
UPDATE t SET b=2*b WHERE a BETWEEN 5 AND 8;
|
||||
XA END '456';
|
||||
XA PREPARE '456';
|
||||
XA START '789';
|
||||
UPDATE t SET b=4*a WHERE a=32;
|
||||
XA END '789';
|
||||
XA PREPARE '789';
|
||||
call mtr.add_suppression("Found 3 prepared XA transactions");
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
a b
|
||||
1 1
|
||||
2 2
|
||||
3 47
|
||||
4 4
|
||||
5 134
|
||||
8 16
|
||||
16 16
|
||||
32 128
|
||||
COMMIT;
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
a b
|
||||
1 1
|
||||
2 2
|
||||
3 47
|
||||
4 4
|
||||
5 134
|
||||
8 16
|
||||
16 16
|
||||
32 128
|
||||
COMMIT;
|
||||
XA RECOVER;
|
||||
formatID gtrid_length bqual_length data
|
||||
1 3 0 789
|
||||
1 3 0 456
|
||||
1 3 0 123
|
||||
XA ROLLBACK '123';
|
||||
XA ROLLBACK '456';
|
||||
XA COMMIT '789';
|
||||
SELECT * FROM t;
|
||||
a b
|
||||
2 2
|
||||
4 4
|
||||
8 8
|
||||
16 16
|
||||
32 128
|
||||
DROP TABLE t;
|
24
mysql-test/suite/innodb/t/innodb_bug59410.test
Normal file
24
mysql-test/suite/innodb/t/innodb_bug59410.test
Normal file
@ -0,0 +1,24 @@
|
||||
#
|
||||
# Bug#59410 read uncommitted: unlock row could not find a 3 mode lock on the record
|
||||
#
|
||||
-- source include/have_innodb.inc
|
||||
|
||||
# only interested that the following do not produce something like
|
||||
# InnoDB: Error: unlock row could not find a 2 mode lock on the record
|
||||
# in the error log
|
||||
|
||||
create table `bug59410_1`(`a` int)engine=innodb;
|
||||
insert into `bug59410_1` values (1),(2),(3);
|
||||
select 1 from `bug59410_1` where `a` <> any (
|
||||
select 1 from `bug59410_1` where `a` <> 1 for update)
|
||||
for update;
|
||||
drop table bug59410_1;
|
||||
|
||||
create table bug59410_2(`a` char(1),`b` int)engine=innodb;
|
||||
insert into bug59410_2 values('0',0);
|
||||
set transaction isolation level read uncommitted;
|
||||
start transaction;
|
||||
set @a=(select b from bug59410_2 where
|
||||
(select 1 from bug59410_2 where a group by @a=b)
|
||||
group by @a:=b);
|
||||
drop table bug59410_2;
|
66
mysql-test/suite/innodb/t/innodb_bug59641.test
Normal file
66
mysql-test/suite/innodb/t/innodb_bug59641.test
Normal file
@ -0,0 +1,66 @@
|
||||
# Bug #59641 Prepared XA transaction causes shutdown hang after a crash
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
-- source include/have_innodb.inc
|
||||
|
||||
CREATE TABLE t(a INT PRIMARY KEY, b INT)ENGINE=InnoDB;
|
||||
INSERT INTO t VALUES(2,2),(4,4),(8,8),(16,16),(32,32);
|
||||
COMMIT;
|
||||
XA START '123';
|
||||
INSERT INTO t VALUES(1,1);
|
||||
XA END '123';
|
||||
XA PREPARE '123';
|
||||
|
||||
CONNECT (con1,localhost,root,,);
|
||||
CONNECTION con1;
|
||||
|
||||
XA START '456';
|
||||
INSERT INTO t VALUES(3,47),(5,67);
|
||||
UPDATE t SET b=2*b WHERE a BETWEEN 5 AND 8;
|
||||
XA END '456';
|
||||
XA PREPARE '456';
|
||||
|
||||
CONNECT (con2,localhost,root,,);
|
||||
CONNECTION con2;
|
||||
|
||||
XA START '789';
|
||||
UPDATE t SET b=4*a WHERE a=32;
|
||||
XA END '789';
|
||||
XA PREPARE '789';
|
||||
|
||||
# The server would issue this warning on restart.
|
||||
call mtr.add_suppression("Found 3 prepared XA transactions");
|
||||
|
||||
# Kill the server without sending a shutdown command
|
||||
-- exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- shutdown_server 0
|
||||
-- source include/wait_until_disconnected.inc
|
||||
|
||||
# Restart the server.
|
||||
-- exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- enable_reconnect
|
||||
-- source include/wait_until_connected_again.inc
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
COMMIT;
|
||||
|
||||
# Shut down the server. This would hang because of the bug.
|
||||
-- exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- shutdown_server
|
||||
-- source include/wait_until_disconnected.inc
|
||||
|
||||
# Restart the server.
|
||||
-- exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- enable_reconnect
|
||||
-- source include/wait_until_connected_again.inc
|
||||
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
COMMIT;
|
||||
XA RECOVER;
|
||||
XA ROLLBACK '123';
|
||||
XA ROLLBACK '456';
|
||||
XA COMMIT '789';
|
||||
SELECT * FROM t;
|
||||
|
||||
DROP TABLE t;
|
17
mysql-test/suite/innodb_plugin/r/innodb_bug59410.result
Normal file
17
mysql-test/suite/innodb_plugin/r/innodb_bug59410.result
Normal file
@ -0,0 +1,17 @@
|
||||
create table `bug59410_1`(`a` int)engine=innodb;
|
||||
insert into `bug59410_1` values (1),(2),(3);
|
||||
select 1 from `bug59410_1` where `a` <> any (
|
||||
select 1 from `bug59410_1` where `a` <> 1 for update)
|
||||
for update;
|
||||
1
|
||||
1
|
||||
1
|
||||
drop table bug59410_1;
|
||||
create table bug59410_2(`a` char(1),`b` int)engine=innodb;
|
||||
insert into bug59410_2 values('0',0);
|
||||
set transaction isolation level read uncommitted;
|
||||
start transaction;
|
||||
set @a=(select b from bug59410_2 where
|
||||
(select 1 from bug59410_2 where a group by @a=b)
|
||||
group by @a:=b);
|
||||
drop table bug59410_2;
|
57
mysql-test/suite/innodb_plugin/r/innodb_bug59641.result
Normal file
57
mysql-test/suite/innodb_plugin/r/innodb_bug59641.result
Normal file
@ -0,0 +1,57 @@
|
||||
CREATE TABLE t(a INT PRIMARY KEY, b INT)ENGINE=InnoDB;
|
||||
INSERT INTO t VALUES(2,2),(4,4),(8,8),(16,16),(32,32);
|
||||
COMMIT;
|
||||
XA START '123';
|
||||
INSERT INTO t VALUES(1,1);
|
||||
XA END '123';
|
||||
XA PREPARE '123';
|
||||
XA START '456';
|
||||
INSERT INTO t VALUES(3,47),(5,67);
|
||||
UPDATE t SET b=2*b WHERE a BETWEEN 5 AND 8;
|
||||
XA END '456';
|
||||
XA PREPARE '456';
|
||||
XA START '789';
|
||||
UPDATE t SET b=4*a WHERE a=32;
|
||||
XA END '789';
|
||||
XA PREPARE '789';
|
||||
call mtr.add_suppression("Found 3 prepared XA transactions");
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
a b
|
||||
1 1
|
||||
2 2
|
||||
3 47
|
||||
4 4
|
||||
5 134
|
||||
8 16
|
||||
16 16
|
||||
32 128
|
||||
COMMIT;
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
a b
|
||||
1 1
|
||||
2 2
|
||||
3 47
|
||||
4 4
|
||||
5 134
|
||||
8 16
|
||||
16 16
|
||||
32 128
|
||||
COMMIT;
|
||||
XA RECOVER;
|
||||
formatID gtrid_length bqual_length data
|
||||
1 3 0 789
|
||||
1 3 0 456
|
||||
1 3 0 123
|
||||
XA ROLLBACK '123';
|
||||
XA ROLLBACK '456';
|
||||
XA COMMIT '789';
|
||||
SELECT * FROM t;
|
||||
a b
|
||||
2 2
|
||||
4 4
|
||||
8 8
|
||||
16 16
|
||||
32 128
|
||||
DROP TABLE t;
|
24
mysql-test/suite/innodb_plugin/t/innodb_bug59410.test
Normal file
24
mysql-test/suite/innodb_plugin/t/innodb_bug59410.test
Normal file
@ -0,0 +1,24 @@
|
||||
#
|
||||
# Bug#59410 read uncommitted: unlock row could not find a 3 mode lock on the record
|
||||
#
|
||||
-- source include/have_innodb_plugin.inc
|
||||
|
||||
# only interested that the following do not produce something like
|
||||
# InnoDB: Error: unlock row could not find a 2 mode lock on the record
|
||||
# in the error log
|
||||
|
||||
create table `bug59410_1`(`a` int)engine=innodb;
|
||||
insert into `bug59410_1` values (1),(2),(3);
|
||||
select 1 from `bug59410_1` where `a` <> any (
|
||||
select 1 from `bug59410_1` where `a` <> 1 for update)
|
||||
for update;
|
||||
drop table bug59410_1;
|
||||
|
||||
create table bug59410_2(`a` char(1),`b` int)engine=innodb;
|
||||
insert into bug59410_2 values('0',0);
|
||||
set transaction isolation level read uncommitted;
|
||||
start transaction;
|
||||
set @a=(select b from bug59410_2 where
|
||||
(select 1 from bug59410_2 where a group by @a=b)
|
||||
group by @a:=b);
|
||||
drop table bug59410_2;
|
70
mysql-test/suite/innodb_plugin/t/innodb_bug59641.test
Normal file
70
mysql-test/suite/innodb_plugin/t/innodb_bug59641.test
Normal file
@ -0,0 +1,70 @@
|
||||
# Bug #59641 Prepared XA transaction causes shutdown hang after a crash
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
-- source include/have_innodb_plugin.inc
|
||||
|
||||
let $innodb_file_format_check_orig=`select @@innodb_file_format_check`;
|
||||
|
||||
CREATE TABLE t(a INT PRIMARY KEY, b INT)ENGINE=InnoDB;
|
||||
INSERT INTO t VALUES(2,2),(4,4),(8,8),(16,16),(32,32);
|
||||
COMMIT;
|
||||
XA START '123';
|
||||
INSERT INTO t VALUES(1,1);
|
||||
XA END '123';
|
||||
XA PREPARE '123';
|
||||
|
||||
CONNECT (con1,localhost,root,,);
|
||||
CONNECTION con1;
|
||||
|
||||
XA START '456';
|
||||
INSERT INTO t VALUES(3,47),(5,67);
|
||||
UPDATE t SET b=2*b WHERE a BETWEEN 5 AND 8;
|
||||
XA END '456';
|
||||
XA PREPARE '456';
|
||||
|
||||
CONNECT (con2,localhost,root,,);
|
||||
CONNECTION con2;
|
||||
|
||||
XA START '789';
|
||||
UPDATE t SET b=4*a WHERE a=32;
|
||||
XA END '789';
|
||||
XA PREPARE '789';
|
||||
|
||||
# The server would issue this warning on restart.
|
||||
call mtr.add_suppression("Found 3 prepared XA transactions");
|
||||
|
||||
# Kill the server without sending a shutdown command
|
||||
-- exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- shutdown_server 0
|
||||
-- source include/wait_until_disconnected.inc
|
||||
|
||||
# Restart the server.
|
||||
-- exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- enable_reconnect
|
||||
-- source include/wait_until_connected_again.inc
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
COMMIT;
|
||||
|
||||
# Shut down the server. This would hang because of the bug.
|
||||
-- exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- shutdown_server
|
||||
-- source include/wait_until_disconnected.inc
|
||||
|
||||
# Restart the server.
|
||||
-- exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
|
||||
-- enable_reconnect
|
||||
-- source include/wait_until_connected_again.inc
|
||||
|
||||
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
|
||||
SELECT * FROM t;
|
||||
COMMIT;
|
||||
XA RECOVER;
|
||||
XA ROLLBACK '123';
|
||||
XA ROLLBACK '456';
|
||||
XA COMMIT '789';
|
||||
SELECT * FROM t;
|
||||
|
||||
DROP TABLE t;
|
||||
--disable_query_log
|
||||
eval set global innodb_file_format_check=$innodb_file_format_check_orig;
|
12
mysql-test/suite/rpl/r/rpl_bug37426.result
Normal file
12
mysql-test/suite/rpl/r/rpl_bug37426.result
Normal file
@ -0,0 +1,12 @@
|
||||
include/master-slave.inc
|
||||
[connection master]
|
||||
CREATE TABLE char128_utf8 (i1 INT NOT NULL, c CHAR(128) CHARACTER SET utf8 NOT NULL, i2 INT NOT NULL);
|
||||
INSERT INTO char128_utf8 VALUES ( 1, "123", 1 );
|
||||
SELECT * FROM char128_utf8;
|
||||
i1 c i2
|
||||
1 123 1
|
||||
SELECT * FROM char128_utf8;
|
||||
i1 c i2
|
||||
1 123 1
|
||||
DROP TABLE char128_utf8;
|
||||
include/rpl_end.inc
|
@ -19,7 +19,7 @@ change master to master_port=MASTER_PORT;
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=UNTIL_POS;
|
||||
include/wait_for_slave_io_to_start.inc
|
||||
include/wait_for_slave_sql_to_stop.inc
|
||||
*** checking until postion execution: must be only t1 in the list ***
|
||||
*** checking until position execution: must be only t1 in the list ***
|
||||
show tables;
|
||||
Tables_in_test
|
||||
t1
|
||||
|
@ -7,15 +7,16 @@ source include/master-slave.inc;
|
||||
source include/have_binlog_format_row.inc;
|
||||
|
||||
connection master;
|
||||
CREATE TABLE char128_utf8 (
|
||||
i1 INT NOT NULL,
|
||||
c CHAR(128) CHARACTER SET utf8 NOT NULL,
|
||||
i2 INT NOT NULL);
|
||||
|
||||
CREATE TABLE char128_utf8 (i1 INT NOT NULL, c CHAR(128) CHARACTER SET utf8 NOT NULL, i2 INT NOT NULL);
|
||||
INSERT INTO char128_utf8 VALUES ( 1, "123", 1 );
|
||||
|
||||
SELECT * FROM char128_utf8;
|
||||
sync_slave_with_master;
|
||||
|
||||
SELECT * FROM char128_utf8;
|
||||
|
||||
# Clean up
|
||||
connection master;
|
||||
DROP TABLE char128_utf8;
|
||||
sync_slave_with_master;
|
||||
--source include/rpl_end.inc
|
@ -9,29 +9,29 @@ connection master;
|
||||
CREATE TABLE t1(n INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
INSERT INTO t1 VALUES (1),(2),(3),(4);
|
||||
DROP TABLE t1;
|
||||
# Save master log postion for query DROP TABLE t1
|
||||
# Save master log position for query DROP TABLE t1
|
||||
save_master_pos;
|
||||
let $master_pos_drop_t1= query_get_value(SHOW BINLOG EVENTS, Pos, 7);
|
||||
let $master_log_file= query_get_value(SHOW BINLOG EVENTS, Log_name, 7);
|
||||
|
||||
CREATE TABLE t2(n INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
|
||||
# Save master log postion for query CREATE TABLE t2
|
||||
# Save master log position for query CREATE TABLE t2
|
||||
save_master_pos;
|
||||
let $master_pos_create_t2= query_get_value(SHOW BINLOG EVENTS, Pos, 8);
|
||||
|
||||
INSERT INTO t2 VALUES (1),(2);
|
||||
save_master_pos;
|
||||
# Save master log postion for query INSERT INTO t2 VALUES (1),(2);
|
||||
# Save master log position for query INSERT INTO t2 VALUES (1),(2);
|
||||
let $master_pos_insert1_t2= query_get_value(SHOW BINLOG EVENTS, End_log_pos, 12);
|
||||
sync_slave_with_master;
|
||||
|
||||
# Save relay log postion for query INSERT INTO t2 VALUES (1),(2);
|
||||
# Save relay log position for query INSERT INTO t2 VALUES (1),(2);
|
||||
let $relay_pos_insert1_t2= query_get_value(show slave status, Relay_Log_Pos, 1);
|
||||
|
||||
connection master;
|
||||
INSERT INTO t2 VALUES (3),(4);
|
||||
DROP TABLE t2;
|
||||
# Save master log postion for query INSERT INTO t2 VALUES (1),(2);
|
||||
# Save master log position for query INSERT INTO t2 VALUES (1),(2);
|
||||
let $master_pos_drop_t2= query_get_value(SHOW BINLOG EVENTS, End_log_pos, 17);
|
||||
sync_slave_with_master;
|
||||
|
||||
|
@ -47,7 +47,7 @@ eval start slave until master_log_file='master-bin.000001', master_log_pos=$unti
|
||||
--source include/wait_for_slave_io_to_start.inc
|
||||
--source include/wait_for_slave_sql_to_stop.inc
|
||||
|
||||
--echo *** checking until postion execution: must be only t1 in the list ***
|
||||
--echo *** checking until position execution: must be only t1 in the list ***
|
||||
show tables;
|
||||
|
||||
# cleanup
|
||||
|
@ -1,6 +1,7 @@
|
||||
#
|
||||
# Test of procedure analyse
|
||||
#
|
||||
-- source include/have_innodb.inc
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1,t2;
|
||||
@ -144,4 +145,15 @@ INSERT INTO t1 VALUES ('e'),('e'),('e-');
|
||||
SELECT * FROM t1 PROCEDURE ANALYSE();
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11756242 48137: PROCEDURE ANALYSE() LEAKS MEMORY WHEN RETURNING NULL
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(f1 INT) ENGINE=MYISAM;
|
||||
CREATE TABLE t2(f2 INT) ENGINE=INNODB;
|
||||
INSERT INTO t2 VALUES (1);
|
||||
SELECT DISTINCTROW f1 FROM t1 NATURAL RIGHT OUTER JOIN t2 PROCEDURE ANALYSE();
|
||||
SELECT * FROM t2 LIMIT 1 PROCEDURE ANALYSE();
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -4,6 +4,8 @@
|
||||
# Can't test with embedded server that doesn't support grants
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
call mtr.add_suppression("Column count of mysql.event is wrong. Expected .*, found .*\. The table is probably corrupted");
|
||||
|
||||
--disable_warnings
|
||||
drop database if exists events_test;
|
||||
drop database if exists db_x;
|
||||
@ -270,23 +272,28 @@ SHOW EVENTS;
|
||||
--echo Try to alter mysql.event: the server should fail to load
|
||||
--echo event information after mysql.event was tampered with.
|
||||
--echo
|
||||
--echo First, let's add a column to the end and make sure everything
|
||||
--echo works as before
|
||||
--echo First, let's add a column to the end and check the error is emitted.
|
||||
--echo
|
||||
ALTER TABLE mysql.event ADD dummy INT;
|
||||
--replace_column 8 # 9 #
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
SHOW EVENTS;
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
SELECT event_name FROM INFORMATION_SCHEMA.events;
|
||||
--replace_regex /STARTS '[^']+'/STARTS '#'/
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
SHOW CREATE EVENT intact_check;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT no_such_event;
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5;
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8;
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
ALTER EVENT intact_check_1 RENAME TO intact_check_2;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT intact_check_1;
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT intact_check_2;
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT intact_check;
|
||||
DROP DATABASE IF EXISTS mysqltest_no_such_database;
|
||||
CREATE DATABASE mysqltest_db2;
|
||||
@ -296,6 +303,7 @@ SHOW VARIABLES LIKE 'event_scheduler';
|
||||
SET GLOBAL event_scheduler=OFF;
|
||||
# Clean up
|
||||
ALTER TABLE mysql.event DROP dummy;
|
||||
DROP EVENT intact_check;
|
||||
CREATE EVENT intact_check ON SCHEDULE EVERY 10 HOUR DO SELECT "nothing";
|
||||
--echo
|
||||
--echo Now let's add a column to the first position: the server
|
||||
@ -303,24 +311,26 @@ CREATE EVENT intact_check ON SCHEDULE EVERY 10 HOUR DO SELECT "nothing";
|
||||
--echo
|
||||
ALTER TABLE mysql.event ADD dummy INT FIRST;
|
||||
--error ER_CANNOT_LOAD_FROM_TABLE
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
SHOW EVENTS;
|
||||
--error ER_CANNOT_LOAD_FROM_TABLE
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
SELECT event_name FROM INFORMATION_SCHEMA.events;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
SHOW CREATE EVENT intact_check;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT no_such_event;
|
||||
--error ER_EVENT_STORE_FAILED
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
ALTER EVENT intact_check_1 RENAME TO intact_check_2;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT intact_check_1;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT intact_check_2;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT intact_check;
|
||||
# Should work OK
|
||||
DROP DATABASE IF EXISTS mysqltest_no_such_database;
|
||||
@ -341,25 +351,25 @@ INSERT INTO event_like SELECT * FROM mysql.event;
|
||||
--echo
|
||||
--echo
|
||||
ALTER TABLE mysql.event DROP comment, DROP starts;
|
||||
--error ER_CANNOT_LOAD_FROM_TABLE
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
SHOW EVENTS;
|
||||
--error ER_CANNOT_LOAD_FROM_TABLE
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
SELECT event_name FROM INFORMATION_SCHEMA.EVENTS;
|
||||
--error ER_CANNOT_LOAD_FROM_TABLE
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
SHOW CREATE EVENT intact_check;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT no_such_event;
|
||||
--error ER_COL_COUNT_DOESNT_MATCH_CORRUPTED
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
ALTER EVENT intact_check_1 RENAME TO intact_check_2;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT intact_check_1;
|
||||
--error ER_EVENT_DOES_NOT_EXIST
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT intact_check_2;
|
||||
# Should succeed
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
DROP EVENT intact_check;
|
||||
DROP DATABASE IF EXISTS mysqltest_no_such_database;
|
||||
CREATE DATABASE mysqltest_db2;
|
||||
@ -407,9 +417,54 @@ CREATE TABLE mysql.event like event_like;
|
||||
DROP TABLE event_like;
|
||||
--replace_column 8 # 9 #
|
||||
SHOW EVENTS;
|
||||
#
|
||||
# End of tests
|
||||
#
|
||||
|
||||
--echo
|
||||
--echo #
|
||||
--echo # Bug#12394306: the sever may crash if mysql.event is corrupted
|
||||
--echo #
|
||||
|
||||
--echo
|
||||
CREATE EVENT ev1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5;
|
||||
ALTER EVENT ev1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8;
|
||||
|
||||
--echo
|
||||
CREATE TABLE event_original LIKE mysql.event;
|
||||
INSERT INTO event_original SELECT * FROM mysql.event;
|
||||
|
||||
--echo
|
||||
ALTER TABLE mysql.event MODIFY modified CHAR(1);
|
||||
|
||||
--echo
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
SHOW EVENTS;
|
||||
|
||||
--echo
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
SELECT event_name, created, last_altered FROM information_schema.events;
|
||||
|
||||
--echo
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
CREATE EVENT ev2 ON SCHEDULE EVERY 5 HOUR DO SELECT 5;
|
||||
|
||||
--echo
|
||||
--error ER_EVENT_OPEN_TABLE_FAILED
|
||||
ALTER EVENT ev1 ON SCHEDULE EVERY 9 HOUR DO SELECT 9;
|
||||
|
||||
--echo
|
||||
DROP TABLE mysql.event;
|
||||
RENAME TABLE event_original TO mysql.event;
|
||||
|
||||
--echo
|
||||
DROP EVENT ev1;
|
||||
|
||||
--echo
|
||||
SHOW EVENTS;
|
||||
|
||||
|
||||
--echo
|
||||
--echo #
|
||||
--echo # End of tests
|
||||
--echo #
|
||||
|
||||
let $wait_condition=
|
||||
select count(*) = 0 from information_schema.processlist
|
||||
|
@ -1,6 +1,8 @@
|
||||
# Can't test with embedded server that doesn't support grants
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
call mtr.add_suppression("Column count of mysql.event is wrong. Expected .*, found .*\. The table is probably corrupted");
|
||||
|
||||
#
|
||||
# Test that when the server is restarted, it checks mysql.event table,
|
||||
# and disables the scheduler if it's not up to date.
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Test of different EXPLAIN's
|
||||
# Test of different EXPLAINs
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
@ -157,11 +157,12 @@ CREATE TABLE t1 (f1 INT);
|
||||
SELECT @@session.sql_mode INTO @old_sql_mode;
|
||||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||
|
||||
# EXPLAIN EXTENDED (with subselect). used to crash. should give NOTICE.
|
||||
--error ER_MIX_OF_GROUP_FUNC_AND_FIELDS
|
||||
# EXPLAIN EXTENDED (with subselect). used to crash.
|
||||
# This is actually a valid query for this sql_mode,
|
||||
# but it was transformed in such a way that it failed, see
|
||||
# Bug#12329653 - EXPLAIN, UNION, PREPARED STATEMENT, CRASH, SQL_FULL_GROUP_BY
|
||||
EXPLAIN EXTENDED SELECT 1 FROM t1
|
||||
WHERE f1 > ALL( SELECT t.f1 FROM t1,t1 AS t );
|
||||
SHOW WARNINGS;
|
||||
|
||||
SET SESSION sql_mode=@old_sql_mode;
|
||||
|
||||
|
@ -1127,6 +1127,18 @@ INSERT INTO t1 VALUES (18446668621106209655);
|
||||
SELECT MAX(LENGTH(a)), LENGTH(MAX(a)), MIN(a), MAX(a), CONCAT(MIN(a)), CONCAT(MAX(a)) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #11766270 59343: YEAR(4): INCORRECT RESULT AND VALGRIND WARNINGS WITH MIN/MAX, UNION
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(f1 YEAR(4));
|
||||
INSERT INTO t1 VALUES (0000),(2001);
|
||||
--enable_metadata
|
||||
(SELECT MAX(f1) FROM t1) UNION (SELECT MAX(f1) FROM t1);
|
||||
--disable_metadata
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo End of 5.1 tests
|
||||
|
||||
|
@ -554,6 +554,12 @@ SELECT CASE a WHEN a THEN a END FROM t1 GROUP BY a WITH ROLLUP;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #11766212 59270: NOT IN (YEAR( ... ), ... ) PRODUCES MANY VALGRIND WARNINGS
|
||||
--echo #
|
||||
|
||||
SELECT 1 IN (YEAR(FROM_UNIXTIME(NULL)) ,1);
|
||||
|
||||
--echo #
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -333,4 +333,20 @@ DROP TABLE t1;
|
||||
CREATE TABLE t1 SELECT FLOOR(LINESTRINGFROMWKB(1) DIV NULL);
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11765923 58937: MANY VALGRIND ERRORS AFTER GROUPING BY RESULT OF DECIMAL COLUMN FUNCTION
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(f1 DECIMAL(22,1));
|
||||
INSERT INTO t1 VALUES (0),(1);
|
||||
SELECT ROUND(f1, f1) FROM t1;
|
||||
SELECT ROUND(f1, f1) FROM t1 GROUP BY 1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11764671 57533: UNINITIALISED VALUES IN COPY_AND_CONVERT (SQL_STRING.CC) WITH CERTAIN CHA
|
||||
--echo #
|
||||
|
||||
SELECT ROUND(LEAST(15, -4939092, 0.2704), STDDEV('a'));
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -913,4 +913,12 @@ SELECT CAST((MONTH(FROM_UNIXTIME(@@GLOBAL.SQL_MODE))) AS BINARY(1025));
|
||||
|
||||
SELECT ADDDATE(MONTH(FROM_UNIXTIME(NULL)),INTERVAL 1 HOUR);
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11889186 60503: CRASH IN MAKE_DATE_TIME WITH DATE_FORMAT / STR_TO_DATE COMBINATION
|
||||
--echo #
|
||||
|
||||
SELECT DATE_FORMAT('0000-00-11', '%W');
|
||||
SELECT DATE_FORMAT('0000-00-11', '%a');
|
||||
SELECT DATE_FORMAT('0000-00-11', '%w');
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -564,4 +564,30 @@ HAVING field1 < 7;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#48916 Server incorrectly processing HAVING clauses with an ORDER BY clause
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (f1 INT, f2 INT);
|
||||
INSERT INTO t1 VALUES (1, 0), (2, 1), (3, 2);
|
||||
CREATE TABLE t2 (f1 INT, f2 INT);
|
||||
|
||||
SELECT t1.f1
|
||||
FROM t1
|
||||
HAVING (3, 2) IN (SELECT f1, f2 FROM t2) AND t1.f1 >= 0
|
||||
ORDER BY t1.f1;
|
||||
|
||||
SELECT t1.f1
|
||||
FROM t1
|
||||
HAVING (3, 2) IN (SELECT 4, 2) AND t1.f1 >= 0
|
||||
ORDER BY t1.f1;
|
||||
|
||||
SELECT t1.f1
|
||||
FROM t1
|
||||
HAVING 2 IN (SELECT f2 FROM t2) AND t1.f1 >= 0
|
||||
ORDER BY t1.f1;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -611,5 +611,33 @@ DROP TABLE t1;
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
remove_file $MYSQLD_DATADIR/test/tmpp2.txt;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11765139 58069: LOAD DATA INFILE: VALGRIND REPORTS INVALID MEMORY READS AND WRITES WITH U
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(f1 INT);
|
||||
EVAL SELECT 0xE1BB30 INTO OUTFILE 't1.dat';
|
||||
--disable_warnings
|
||||
LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8;
|
||||
--enable_warnings
|
||||
|
||||
DROP TABLE t1;
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
remove_file $MYSQLD_DATADIR/test/t1.dat;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#11765141 - 58072: LOAD DATA INFILE: LEAKS IO CACHE MEMORY
|
||||
--echo # WHEN ERROR OCCURS
|
||||
--echo #
|
||||
|
||||
--let $file=$MYSQLTEST_VARDIR/tmp/bug11735141.txt
|
||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
--eval SELECT '1\n' INTO DUMPFILE '$file'
|
||||
|
||||
create table t1(a point);
|
||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
--error ER_CANT_CREATE_GEOMETRY_OBJECT
|
||||
--eval LOAD DATA INFILE '$file' INTO TABLE t1
|
||||
drop table t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -71,3 +71,32 @@ select count(*) from t2;
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/mysqlbinlog_base64.sql
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
|
||||
#
|
||||
# BUG#12354268
|
||||
#
|
||||
# This test verifies that using --start-position with DECODE-ROWS
|
||||
# does not make mysqlbinlog to output an error stating that it
|
||||
# does not contain any FD event.
|
||||
#
|
||||
|
||||
RESET MASTER;
|
||||
USE test;
|
||||
SET @old_binlog_format= @@binlog_format;
|
||||
SET SESSION binlog_format=ROW;
|
||||
CREATE TABLE t1(c1 INT);
|
||||
--let $master_binlog= query_get_value(SHOW MASTER STATUS, File, 1)
|
||||
--let $master_pos= query_get_value(SHOW MASTER STATUS, Position, 1)
|
||||
--let $MYSQLD_DATADIR= `SELECT @@datadir`
|
||||
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
FLUSH LOGS;
|
||||
|
||||
--disable_result_log
|
||||
--exec $MYSQL_BINLOG --base64-output=DECODE-ROWS --start-position=$master_pos -v $MYSQLD_DATADIR/$master_binlog
|
||||
--enable_result_log
|
||||
|
||||
DROP TABLE t1;
|
||||
SET SESSION binlog_format= @old_binlog_format;
|
||||
RESET MASTER;
|
||||
|
@ -1,5 +1,4 @@
|
||||
-- source include/have_partition.inc
|
||||
-- source include/not_embedded.inc
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
--enable_warnings
|
||||
@ -51,3 +50,13 @@ DROP TABLE t1;
|
||||
--list_files $MYSQLD_DATADIR/test t1*
|
||||
--list_files $MYSQLD_DATADIR/test t2*
|
||||
--echo # End of bug#30102 test.
|
||||
|
||||
--echo # Test of post-push fix for bug#11766249/59316
|
||||
CREATE TABLE t1 (a INT, b VARCHAR(255), PRIMARY KEY (a))
|
||||
ENGINE = MyISAM
|
||||
PARTITION BY RANGE (a)
|
||||
(PARTITION p0 VALUES LESS THAN (0) MAX_ROWS=100,
|
||||
PARTITION p1 VALUES LESS THAN (100) MAX_ROWS=100,
|
||||
PARTITION pMax VALUES LESS THAN MAXVALUE);
|
||||
INSERT INTO t1 VALUES (1, "Partition p1, first row");
|
||||
DROP TABLE t1;
|
1
mysql-test/t/secure_file_priv_win-master.opt
Normal file
1
mysql-test/t/secure_file_priv_win-master.opt
Normal file
@ -0,0 +1 @@
|
||||
--secure_file_priv=$MYSQL_TMP_DIR
|
79
mysql-test/t/secure_file_priv_win.test
Normal file
79
mysql-test/t/secure_file_priv_win.test
Normal file
@ -0,0 +1,79 @@
|
||||
#
|
||||
# Bug58747 breaks secure_file_priv+not secure yet+still accesses other folders
|
||||
#
|
||||
|
||||
# we do the windows specific relative directory testing
|
||||
|
||||
--source include/windows.inc
|
||||
|
||||
CREATE TABLE t1 (c1 longtext);
|
||||
INSERT INTO t1 values ('a');
|
||||
|
||||
LET $MYSQL_TMP_DIR_UCASE= `SELECT upper('$MYSQL_TMP_DIR')`;
|
||||
LET $MYSQL_TMP_DIR_LCASE= `SELECT lower('$MYSQL_TMP_DIR')`;
|
||||
|
||||
#create the file
|
||||
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||
eval SELECT * FROM t1 INTO OUTFILE '$MYSQL_TMP_DIR/B11764517.tmp';
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||
show global variables like 'secure_file_priv';
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||
eval SELECT load_file('$MYSQL_TMP_DIR\\\\B11764517.tmp') AS x;
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||
eval SELECT load_file('$MYSQL_TMP_DIR/B11764517.tmp') AS x;
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR_UCASE MYSQL_TMP_DIR_UCASE
|
||||
eval SELECT load_file('$MYSQL_TMP_DIR_UCASE/B11764517.tmp') AS x;
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR_LCASE MYSQL_TMP_DIR_LCASE
|
||||
eval SELECT load_file('$MYSQL_TMP_DIR_LCASE/B11764517.tmp') AS x;
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||
eval SELECT load_file('$MYSQL_TMP_DIR\\\\..a..\\\\..\\\\..\\\\B11764517.tmp') AS x;
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||
eval LOAD DATA INFILE '$MYSQL_TMP_DIR\\\\B11764517.tmp' INTO TABLE t1;
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||
eval LOAD DATA INFILE '$MYSQL_TMP_DIR/B11764517.tmp' INTO TABLE t1;
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR_UCASE MYSQL_TMP_DIR_UCASE
|
||||
eval LOAD DATA INFILE '$MYSQL_TMP_DIR_UCASE/B11764517.tmp' INTO TABLE t1;
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR_LCASE MYSQL_TMP_DIR_LCASE
|
||||
eval LOAD DATA INFILE '$MYSQL_TMP_DIR_LCASE/B11764517.tmp' INTO TABLE t1;
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||
--error ER_OPTION_PREVENTS_STATEMENT
|
||||
eval LOAD DATA INFILE "$MYSQL_TMP_DIR\\\\..a..\\\\..\\\\..\\\\B11764517.tmp" into table t1;
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||
--error ER_OPTION_PREVENTS_STATEMENT
|
||||
eval SELECT * FROM t1 INTO OUTFILE '$MYSQL_TMP_DIR\\\\..a..\\\\..\\\\..\\\\B11764517-2.tmp';
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||
eval SELECT * FROM t1 INTO OUTFILE '$MYSQL_TMP_DIR\\\\B11764517-2.tmp';
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
|
||||
eval SELECT * FROM t1 INTO OUTFILE '$MYSQL_TMP_DIR/B11764517-3.tmp';
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR_UCASE MYSQL_TMP_DIR_UCASE
|
||||
eval SELECT * FROM t1 INTO OUTFILE '$MYSQL_TMP_DIR_UCASE/B11764517-4.tmp';
|
||||
|
||||
--replace_result $MYSQL_TMP_DIR_LCASE MYSQL_TMP_DIR_LCASE
|
||||
eval SELECT * FROM t1 INTO OUTFILE '$MYSQL_TMP_DIR_LCASE/B11764517-5.tmp';
|
||||
|
||||
--error 0,1
|
||||
--remove_file $MYSQL_TMP_DIR/B11764517.tmp;
|
||||
--error 0,1
|
||||
--remove_file $MYSQL_TMP_DIR/B11764517-2.tmp;
|
||||
--error 0,1
|
||||
--remove_file $MYSQL_TMP_DIR/B11764517-3.tmp;
|
||||
--error 0,1
|
||||
--remove_file $MYSQL_TMP_DIR/B11764517-4.tmp;
|
||||
--error 0,1
|
||||
--remove_file $MYSQL_TMP_DIR/B11764517-5.tmp;
|
||||
DROP TABLE t1;
|
@ -3393,6 +3393,39 @@ ORDER BY outr.pk;
|
||||
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#12329653
|
||||
--echo # EXPLAIN, UNION, PREPARED STATEMENT, CRASH, SQL_FULL_GROUP_BY
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a1 int);
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
|
||||
SELECT @@session.sql_mode INTO @old_sql_mode;
|
||||
SET SESSION sql_mode='ONLY_FULL_GROUP_BY';
|
||||
|
||||
## First a simpler query, illustrating the transformation
|
||||
## '1 < some (...)' => '1 < max(...)'
|
||||
SELECT 1 FROM t1 WHERE 1 < SOME (SELECT a1 FROM t1);
|
||||
|
||||
## The query which made the server crash.
|
||||
PREPARE stmt FROM
|
||||
'SELECT 1 UNION ALL
|
||||
SELECT 1 FROM t1
|
||||
ORDER BY
|
||||
(SELECT 1 FROM t1 AS t1_0
|
||||
WHERE 1 < SOME (SELECT a1 FROM t1)
|
||||
)' ;
|
||||
|
||||
--error ER_SUBQUERY_NO_1_ROW
|
||||
EXECUTE stmt ;
|
||||
--error ER_SUBQUERY_NO_1_ROW
|
||||
EXECUTE stmt ;
|
||||
|
||||
SET SESSION sql_mode=@old_sql_mode;
|
||||
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests.
|
||||
|
||||
@ -3726,3 +3759,25 @@ DROP TABLE t1,t2;
|
||||
--enable_result_log
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
--echo #
|
||||
--echo # Bug #11765713 58705:
|
||||
--echo # OPTIMIZER LET ENGINE DEPEND ON UNINITIALIZED VALUES
|
||||
--echo # CREATED BY OPT_SUM_QUERY
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a INT NOT NULL, KEY (a));
|
||||
INSERT INTO t1 VALUES (0), (1);
|
||||
|
||||
--error ER_SUBQUERY_NO_1_ROW
|
||||
SELECT 1 as foo FROM t1 WHERE a < SOME
|
||||
(SELECT a FROM t1 WHERE a <=>
|
||||
(SELECT a FROM t1)
|
||||
);
|
||||
|
||||
SELECT 1 as foo FROM t1 WHERE a < SOME
|
||||
(SELECT a FROM t1 WHERE a <=>
|
||||
(SELECT a FROM t1 where a is null)
|
||||
);
|
||||
|
||||
DROP TABLE t1;
|
||||
|
@ -373,4 +373,51 @@ SELECT a FROM t1 WHERE a >= '20000101000000';
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#50774: failed to get the correct resultset when timestamp values
|
||||
--echo # are appended with .0
|
||||
--echo #
|
||||
CREATE TABLE t1 ( a TIMESTAMP, KEY ( a ) );
|
||||
|
||||
INSERT INTO t1 VALUES( '2010-02-01 09:31:01' );
|
||||
INSERT INTO t1 VALUES( '2010-02-01 09:31:02' );
|
||||
INSERT INTO t1 VALUES( '2010-02-01 09:31:03' );
|
||||
INSERT INTO t1 VALUES( '2010-02-01 09:31:04' );
|
||||
|
||||
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
|
||||
SELECT * FROM t1 WHERE '2010-02-01 09:31:02.0' <= a;
|
||||
SELECT * FROM t1 WHERE a <= '2010-02-01 09:31:02.0';
|
||||
SELECT * FROM t1 WHERE '2010-02-01 09:31:02.0' >= a;
|
||||
|
||||
--replace_column 1 x 2 x 3 x 5 x 6 x 7 x 8 x 9 x 10 x
|
||||
EXPLAIN
|
||||
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
|
||||
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
|
||||
|
||||
CREATE TABLE t2 ( a TIMESTAMP, KEY ( a DESC ) );
|
||||
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:01' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:02' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:03' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:04' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:05' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:06' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:07' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:08' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:09' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:10' );
|
||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:11' );
|
||||
|
||||
--echo # The bug would cause the range optimizer's comparison to use an open
|
||||
--echo # interval here. This reveals itself only in the number of reads
|
||||
--echo # performed.
|
||||
FLUSH STATUS;
|
||||
--replace_column 1 x 2 x 3 x 5 x 6 x 7 x 8 x 9 x 10 x
|
||||
EXPLAIN
|
||||
SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0';
|
||||
SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0';
|
||||
SHOW STATUS LIKE 'Handler_read_next';
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -144,24 +144,23 @@ int my_realpath(char *to, const char *filename, myf MyFlags)
|
||||
result= -1;
|
||||
}
|
||||
DBUG_RETURN(result);
|
||||
#else
|
||||
#ifdef _WIN32
|
||||
int ret= GetFullPathName(filename,FN_REFLEN,
|
||||
to,
|
||||
NULL);
|
||||
#elif defined(_WIN32)
|
||||
int ret= GetFullPathName(filename,FN_REFLEN, to, NULL);
|
||||
if (ret == 0 || ret > FN_REFLEN)
|
||||
{
|
||||
if (ret > FN_REFLEN)
|
||||
my_errno= ENAMETOOLONG;
|
||||
else
|
||||
my_errno= EACCES;
|
||||
my_errno= (ret > FN_REFLEN) ? ENAMETOOLONG : GetLastError();
|
||||
if (MyFlags & MY_WME)
|
||||
my_error(EE_REALPATH, MYF(0), filename, my_errno);
|
||||
return -1;
|
||||
/*
|
||||
GetFullPathName didn't work : use my_load_path() which is a poor
|
||||
substitute original name but will at least be able to resolve
|
||||
paths that starts with '.'.
|
||||
*/
|
||||
my_load_path(to, filename, NullS);
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
my_load_path(to, filename, NullS);
|
||||
#endif
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
@ -772,7 +772,7 @@ long calc_daynr(uint year,uint month,uint day)
|
||||
int y= year; /* may be < 0 temporarily */
|
||||
DBUG_ENTER("calc_daynr");
|
||||
|
||||
if (y == 0 && month == 0 && day == 0)
|
||||
if (y == 0 && month == 0)
|
||||
DBUG_RETURN(0); /* Skip errors */
|
||||
/* Cast to int to be able to handle month == 0 */
|
||||
delsum= (long) (365 * y + 31 *((int) month - 1) + (int) day);
|
||||
@ -783,6 +783,7 @@ long calc_daynr(uint year,uint month,uint day)
|
||||
temp=(int) ((y/100+1)*3)/4;
|
||||
DBUG_PRINT("exit",("year: %d month: %d day: %d -> daynr: %ld",
|
||||
y+(month <= 2),month,day,delsum+y/4-temp));
|
||||
DBUG_ASSERT(delsum+(int) y/4-temp > 0);
|
||||
DBUG_RETURN(delsum+(int) y/4-temp);
|
||||
} /* calc_daynr */
|
||||
|
||||
|
@ -582,6 +582,14 @@ Event_db_repository::open_event_table(THD *thd, enum thr_lock_type lock_type,
|
||||
|
||||
*table= tables.table;
|
||||
tables.table->use_all_columns();
|
||||
|
||||
if (table_intact.check(*table, &event_table_def))
|
||||
{
|
||||
close_thread_tables(thd);
|
||||
my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
|
||||
|
@ -5467,6 +5467,7 @@ double Field_year::val_real(void)
|
||||
longlong Field_year::val_int(void)
|
||||
{
|
||||
ASSERT_COLUMN_MARKED_FOR_READ;
|
||||
DBUG_ASSERT(field_length == 2 || field_length == 4);
|
||||
int tmp= (int) ptr[0];
|
||||
if (field_length != 4)
|
||||
tmp%=100; // Return last 2 char
|
||||
@ -5479,6 +5480,7 @@ longlong Field_year::val_int(void)
|
||||
String *Field_year::val_str(String *val_buffer,
|
||||
String *val_ptr __attribute__((unused)))
|
||||
{
|
||||
DBUG_ASSERT(field_length < 5);
|
||||
val_buffer->alloc(5);
|
||||
val_buffer->length(field_length);
|
||||
char *to=(char*) val_buffer->ptr();
|
||||
|
@ -163,8 +163,7 @@ const uint ha_partition::NO_CURRENT_PART_ID= 0xFFFFFFFF;
|
||||
*/
|
||||
|
||||
ha_partition::ha_partition(handlerton *hton, TABLE_SHARE *share)
|
||||
:handler(hton, share), m_part_info(NULL), m_create_handler(FALSE),
|
||||
m_is_sub_partitioned(0)
|
||||
:handler(hton, share)
|
||||
{
|
||||
DBUG_ENTER("ha_partition::ha_partition(table)");
|
||||
init_handler_variables();
|
||||
@ -184,15 +183,44 @@ ha_partition::ha_partition(handlerton *hton, TABLE_SHARE *share)
|
||||
*/
|
||||
|
||||
ha_partition::ha_partition(handlerton *hton, partition_info *part_info)
|
||||
:handler(hton, NULL), m_part_info(part_info), m_create_handler(TRUE),
|
||||
m_is_sub_partitioned(m_part_info->is_sub_partitioned())
|
||||
:handler(hton, NULL)
|
||||
{
|
||||
DBUG_ENTER("ha_partition::ha_partition(part_info)");
|
||||
DBUG_ASSERT(part_info);
|
||||
init_handler_variables();
|
||||
DBUG_ASSERT(m_part_info);
|
||||
m_part_info= part_info;
|
||||
m_create_handler= TRUE;
|
||||
m_is_sub_partitioned= m_part_info->is_sub_partitioned();
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
/**
|
||||
ha_partition constructor method used by ha_partition::clone()
|
||||
|
||||
@param hton Handlerton (partition_hton)
|
||||
@param share Table share object
|
||||
@param part_info_arg partition_info to use
|
||||
@param clone_arg ha_partition to clone
|
||||
@param clme_mem_root_arg MEM_ROOT to use
|
||||
|
||||
@return New partition handler
|
||||
*/
|
||||
|
||||
ha_partition::ha_partition(handlerton *hton, TABLE_SHARE *share,
|
||||
partition_info *part_info_arg,
|
||||
ha_partition *clone_arg,
|
||||
MEM_ROOT *clone_mem_root_arg)
|
||||
:handler(hton, share)
|
||||
{
|
||||
DBUG_ENTER("ha_partition::ha_partition(clone)");
|
||||
init_handler_variables();
|
||||
m_part_info= part_info_arg;
|
||||
m_create_handler= TRUE;
|
||||
m_is_sub_partitioned= m_part_info->is_sub_partitioned();
|
||||
m_is_clone_of= clone_arg;
|
||||
m_clone_mem_root= clone_mem_root_arg;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
/*
|
||||
Initialize handler object
|
||||
@ -244,7 +272,6 @@ void ha_partition::init_handler_variables()
|
||||
m_rec0= 0;
|
||||
m_curr_key_info[0]= NULL;
|
||||
m_curr_key_info[1]= NULL;
|
||||
is_clone= FALSE,
|
||||
m_part_func_monotonicity_info= NON_MONOTONIC;
|
||||
auto_increment_lock= FALSE;
|
||||
auto_increment_safe_stmt_log_lock= FALSE;
|
||||
@ -252,6 +279,11 @@ void ha_partition::init_handler_variables()
|
||||
this allows blackhole to work properly
|
||||
*/
|
||||
m_no_locks= 0;
|
||||
m_part_info= NULL;
|
||||
m_create_handler= FALSE;
|
||||
m_is_sub_partitioned= 0;
|
||||
m_is_clone_of= NULL;
|
||||
m_clone_mem_root= NULL;
|
||||
|
||||
#ifdef DONT_HAVE_TO_BE_INITALIZED
|
||||
m_start_key.flag= 0;
|
||||
@ -359,7 +391,8 @@ bool ha_partition::initialize_partition(MEM_ROOT *mem_root)
|
||||
*/
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
else if (get_from_handler_file(table_share->normalized_path.str, mem_root))
|
||||
else if (get_from_handler_file(table_share->normalized_path.str,
|
||||
mem_root, false))
|
||||
{
|
||||
my_message(ER_UNKNOWN_ERROR, "Failed to read from the .par file", MYF(0));
|
||||
DBUG_RETURN(1);
|
||||
@ -1848,7 +1881,7 @@ uint ha_partition::del_ren_cre_table(const char *from,
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
if (get_from_handler_file(from, ha_thd()->mem_root))
|
||||
if (get_from_handler_file(from, ha_thd()->mem_root, false))
|
||||
DBUG_RETURN(TRUE);
|
||||
DBUG_ASSERT(m_file_buffer);
|
||||
DBUG_PRINT("enter", ("from: (%s) to: (%s)", from, to));
|
||||
@ -2064,18 +2097,16 @@ static uint name_add(char *dest, const char *first_name, const char *sec_name)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
/**
|
||||
Create the special .par file
|
||||
|
||||
SYNOPSIS
|
||||
create_handler_file()
|
||||
name Full path of table name
|
||||
@param name Full path of table name
|
||||
|
||||
RETURN VALUE
|
||||
>0 Error code
|
||||
0 Success
|
||||
@return Operation status
|
||||
@retval FALSE Error code
|
||||
@retval TRUE Success
|
||||
|
||||
DESCRIPTION
|
||||
@note
|
||||
Method used to create handler file with names of partitions, their
|
||||
engine types and the number of partitions.
|
||||
*/
|
||||
@ -2139,19 +2170,22 @@ bool ha_partition::create_handler_file(const char *name)
|
||||
Array of engine types n * 4 bytes where
|
||||
n = (m_tot_parts + 3)/4
|
||||
Length of name part in bytes 4 bytes
|
||||
(Names in filename format)
|
||||
Name part m * 4 bytes where
|
||||
m = ((length_name_part + 3)/4)*4
|
||||
|
||||
All padding bytes are zeroed
|
||||
*/
|
||||
tot_partition_words= (tot_parts + 3) / 4;
|
||||
tot_name_words= (tot_name_len + 3) / 4;
|
||||
tot_partition_words= (tot_parts + PAR_WORD_SIZE - 1) / PAR_WORD_SIZE;
|
||||
tot_name_words= (tot_name_len + PAR_WORD_SIZE - 1) / PAR_WORD_SIZE;
|
||||
/* 4 static words (tot words, checksum, tot partitions, name length) */
|
||||
tot_len_words= 4 + tot_partition_words + tot_name_words;
|
||||
tot_len_byte= 4 * tot_len_words;
|
||||
tot_len_byte= PAR_WORD_SIZE * tot_len_words;
|
||||
if (!(file_buffer= (uchar *) my_malloc(tot_len_byte, MYF(MY_ZEROFILL))))
|
||||
DBUG_RETURN(TRUE);
|
||||
engine_array= (file_buffer + 12);
|
||||
name_buffer_ptr= (char*) (file_buffer + ((4 + tot_partition_words) * 4));
|
||||
engine_array= (file_buffer + PAR_ENGINES_OFFSET);
|
||||
name_buffer_ptr= (char*) (engine_array + tot_partition_words * PAR_WORD_SIZE
|
||||
+ PAR_WORD_SIZE);
|
||||
part_it.rewind();
|
||||
for (i= 0; i < no_parts; i++)
|
||||
{
|
||||
@ -2189,13 +2223,15 @@ bool ha_partition::create_handler_file(const char *name)
|
||||
}
|
||||
chksum= 0;
|
||||
int4store(file_buffer, tot_len_words);
|
||||
int4store(file_buffer + 8, tot_parts);
|
||||
int4store(file_buffer + 12 + (tot_partition_words * 4), tot_name_len);
|
||||
int4store(file_buffer + PAR_NUM_PARTS_OFFSET, tot_parts);
|
||||
int4store(file_buffer + PAR_ENGINES_OFFSET +
|
||||
(tot_partition_words * PAR_WORD_SIZE),
|
||||
tot_name_len);
|
||||
for (i= 0; i < tot_len_words; i++)
|
||||
chksum^= uint4korr(file_buffer + 4 * i);
|
||||
int4store(file_buffer + 4, chksum);
|
||||
chksum^= uint4korr(file_buffer + PAR_WORD_SIZE * i);
|
||||
int4store(file_buffer + PAR_CHECKSUM_OFFSET, chksum);
|
||||
/*
|
||||
Remove .frm extension and replace with .par
|
||||
Add .par extension to the file name.
|
||||
Create and write and close file
|
||||
to be used at open, delete_table and rename_table
|
||||
*/
|
||||
@ -2213,14 +2249,9 @@ bool ha_partition::create_handler_file(const char *name)
|
||||
DBUG_RETURN(result);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
/**
|
||||
Clear handler variables and free some memory
|
||||
|
||||
SYNOPSIS
|
||||
clear_handler_file()
|
||||
|
||||
RETURN VALUE
|
||||
NONE
|
||||
*/
|
||||
|
||||
void ha_partition::clear_handler_file()
|
||||
@ -2233,16 +2264,15 @@ void ha_partition::clear_handler_file()
|
||||
m_engine_array= NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
/**
|
||||
Create underlying handler objects
|
||||
|
||||
SYNOPSIS
|
||||
create_handlers()
|
||||
mem_root Allocate memory through this
|
||||
@param mem_root Allocate memory through this
|
||||
|
||||
RETURN VALUE
|
||||
TRUE Error
|
||||
FALSE Success
|
||||
@return Operation status
|
||||
@retval TRUE Error
|
||||
@retval FALSE Success
|
||||
*/
|
||||
|
||||
bool ha_partition::create_handlers(MEM_ROOT *mem_root)
|
||||
@ -2280,6 +2310,7 @@ bool ha_partition::create_handlers(MEM_ROOT *mem_root)
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Create underlying handler objects from partition info
|
||||
|
||||
@ -2351,100 +2382,164 @@ error_end:
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Get info about partition engines and their names from the .par file
|
||||
/**
|
||||
Read the .par file to get the partitions engines and names
|
||||
|
||||
SYNOPSIS
|
||||
get_from_handler_file()
|
||||
name Full path of table name
|
||||
mem_root Allocate memory through this
|
||||
@param name Name of table file (without extention)
|
||||
|
||||
RETURN VALUE
|
||||
TRUE Error
|
||||
FALSE Success
|
||||
@return Operation status
|
||||
@retval true Failure
|
||||
@retval false Success
|
||||
|
||||
DESCRIPTION
|
||||
Open handler file to get partition names, engine types and number of
|
||||
partitions.
|
||||
@note On success, m_file_buffer is allocated and must be
|
||||
freed by the caller. m_name_buffer_ptr and m_tot_parts is also set.
|
||||
*/
|
||||
|
||||
bool ha_partition::get_from_handler_file(const char *name, MEM_ROOT *mem_root)
|
||||
bool ha_partition::read_par_file(const char *name)
|
||||
{
|
||||
char buff[FN_REFLEN], *address_tot_name_len;
|
||||
char buff[FN_REFLEN], *tot_name_len_offset;
|
||||
File file;
|
||||
char *file_buffer, *name_buffer_ptr;
|
||||
handlerton **engine_array;
|
||||
char *file_buffer;
|
||||
uint i, len_bytes, len_words, tot_partition_words, tot_name_words, chksum;
|
||||
DBUG_ENTER("ha_partition::get_from_handler_file");
|
||||
DBUG_ENTER("ha_partition::read_par_file");
|
||||
DBUG_PRINT("enter", ("table name: '%s'", name));
|
||||
|
||||
if (m_file_buffer)
|
||||
DBUG_RETURN(FALSE);
|
||||
DBUG_RETURN(false);
|
||||
fn_format(buff, name, "", ha_par_ext, MY_APPEND_EXT);
|
||||
|
||||
/* Following could be done with my_stat to read in whole file */
|
||||
if ((file= my_open(buff, O_RDONLY | O_SHARE, MYF(0))) < 0)
|
||||
DBUG_RETURN(TRUE);
|
||||
if (my_read(file, (uchar *) & buff[0], 8, MYF(MY_NABP)))
|
||||
DBUG_RETURN(true);
|
||||
if (my_read(file, (uchar *) & buff[0], PAR_WORD_SIZE, MYF(MY_NABP)))
|
||||
goto err1;
|
||||
len_words= uint4korr(buff);
|
||||
len_bytes= 4 * len_words;
|
||||
len_bytes= PAR_WORD_SIZE * len_words;
|
||||
if (my_seek(file, 0, MY_SEEK_SET, MYF(0)) == MY_FILEPOS_ERROR)
|
||||
goto err1;
|
||||
if (!(file_buffer= (char*) my_malloc(len_bytes, MYF(0))))
|
||||
goto err1;
|
||||
VOID(my_seek(file, 0, MY_SEEK_SET, MYF(0)));
|
||||
if (my_read(file, (uchar *) file_buffer, len_bytes, MYF(MY_NABP)))
|
||||
goto err2;
|
||||
|
||||
chksum= 0;
|
||||
for (i= 0; i < len_words; i++)
|
||||
chksum ^= uint4korr((file_buffer) + 4 * i);
|
||||
chksum ^= uint4korr((file_buffer) + PAR_WORD_SIZE * i);
|
||||
if (chksum)
|
||||
goto err2;
|
||||
m_tot_parts= uint4korr((file_buffer) + 8);
|
||||
m_tot_parts= uint4korr((file_buffer) + PAR_NUM_PARTS_OFFSET);
|
||||
DBUG_PRINT("info", ("No of parts = %u", m_tot_parts));
|
||||
tot_partition_words= (m_tot_parts + 3) / 4;
|
||||
tot_partition_words= (m_tot_parts + PAR_WORD_SIZE - 1) / PAR_WORD_SIZE;
|
||||
|
||||
tot_name_len_offset= file_buffer + PAR_ENGINES_OFFSET +
|
||||
PAR_WORD_SIZE * tot_partition_words;
|
||||
tot_name_words= (uint4korr(tot_name_len_offset) + PAR_WORD_SIZE - 1) /
|
||||
PAR_WORD_SIZE;
|
||||
/*
|
||||
Verify the total length = tot size word, checksum word, num parts word +
|
||||
engines array + name length word + name array.
|
||||
*/
|
||||
if (len_words != (tot_partition_words + tot_name_words + 4))
|
||||
goto err2;
|
||||
VOID(my_close(file, MYF(0)));
|
||||
m_file_buffer= file_buffer; // Will be freed in clear_handler_file()
|
||||
m_name_buffer_ptr= tot_name_len_offset + PAR_WORD_SIZE;
|
||||
|
||||
DBUG_RETURN(false);
|
||||
|
||||
err2:
|
||||
my_free(file_buffer, MYF(0));
|
||||
err1:
|
||||
VOID(my_close(file, MYF(0)));
|
||||
DBUG_RETURN(true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Setup m_engine_array
|
||||
|
||||
@param mem_root MEM_ROOT to use for allocating new handlers
|
||||
|
||||
@return Operation status
|
||||
@retval false Success
|
||||
@retval true Failure
|
||||
*/
|
||||
|
||||
bool ha_partition::setup_engine_array(MEM_ROOT *mem_root)
|
||||
{
|
||||
uint i;
|
||||
uchar *buff;
|
||||
handlerton **engine_array;
|
||||
|
||||
DBUG_ASSERT(!m_file);
|
||||
DBUG_ENTER("ha_partition::setup_engine_array");
|
||||
engine_array= (handlerton **) my_alloca(m_tot_parts * sizeof(handlerton*));
|
||||
if (!engine_array)
|
||||
DBUG_RETURN(true);
|
||||
|
||||
buff= (uchar *) (m_file_buffer + PAR_ENGINES_OFFSET);
|
||||
for (i= 0; i < m_tot_parts; i++)
|
||||
{
|
||||
engine_array[i]= ha_resolve_by_legacy_type(ha_thd(),
|
||||
(enum legacy_db_type)
|
||||
*(uchar *) ((file_buffer) +
|
||||
12 + i));
|
||||
*(buff + i));
|
||||
if (!engine_array[i])
|
||||
goto err3;
|
||||
goto err;
|
||||
}
|
||||
address_tot_name_len= file_buffer + 12 + 4 * tot_partition_words;
|
||||
tot_name_words= (uint4korr(address_tot_name_len) + 3) / 4;
|
||||
if (len_words != (tot_partition_words + tot_name_words + 4))
|
||||
goto err3;
|
||||
name_buffer_ptr= file_buffer + 16 + 4 * tot_partition_words;
|
||||
VOID(my_close(file, MYF(0)));
|
||||
m_file_buffer= file_buffer; // Will be freed in clear_handler_file()
|
||||
m_name_buffer_ptr= name_buffer_ptr;
|
||||
|
||||
if (!(m_engine_array= (plugin_ref*)
|
||||
my_malloc(m_tot_parts * sizeof(plugin_ref), MYF(MY_WME))))
|
||||
goto err3;
|
||||
goto err;
|
||||
|
||||
for (i= 0; i < m_tot_parts; i++)
|
||||
m_engine_array[i]= ha_lock_engine(NULL, engine_array[i]);
|
||||
|
||||
my_afree((gptr) engine_array);
|
||||
|
||||
if (!m_file && create_handlers(mem_root))
|
||||
if (create_handlers(mem_root))
|
||||
{
|
||||
clear_handler_file();
|
||||
DBUG_RETURN(TRUE);
|
||||
DBUG_RETURN(true);
|
||||
}
|
||||
DBUG_RETURN(FALSE);
|
||||
|
||||
err3:
|
||||
DBUG_RETURN(false);
|
||||
|
||||
err:
|
||||
my_afree((gptr) engine_array);
|
||||
err2:
|
||||
my_free(file_buffer, MYF(0));
|
||||
err1:
|
||||
VOID(my_close(file, MYF(0)));
|
||||
DBUG_RETURN(TRUE);
|
||||
DBUG_RETURN(true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Get info about partition engines and their names from the .par file
|
||||
|
||||
@param name Full path of table name
|
||||
@param mem_root Allocate memory through this
|
||||
@param is_clone If it is a clone, don't create new handlers
|
||||
|
||||
@return Operation status
|
||||
@retval true Error
|
||||
@retval false Success
|
||||
|
||||
@note Open handler file to get partition names, engine types and number of
|
||||
partitions.
|
||||
*/
|
||||
|
||||
bool ha_partition::get_from_handler_file(const char *name, MEM_ROOT *mem_root,
|
||||
bool is_clone)
|
||||
{
|
||||
DBUG_ENTER("ha_partition::get_from_handler_file");
|
||||
DBUG_PRINT("enter", ("table name: '%s'", name));
|
||||
|
||||
if (m_file_buffer)
|
||||
DBUG_RETURN(false);
|
||||
|
||||
if (read_par_file(name))
|
||||
DBUG_RETURN(true);
|
||||
|
||||
if (!is_clone && setup_engine_array(mem_root))
|
||||
DBUG_RETURN(true);
|
||||
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
|
||||
|
||||
@ -2491,13 +2586,13 @@ void ha_data_partition_destroy(void *ha_data)
|
||||
|
||||
int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
||||
{
|
||||
char *name_buffer_ptr= m_name_buffer_ptr;
|
||||
int error;
|
||||
char *name_buffer_ptr;
|
||||
int error= HA_ERR_INITIALIZATION;
|
||||
uint alloc_len;
|
||||
handler **file;
|
||||
char name_buff[FN_REFLEN];
|
||||
bool is_not_tmp_table= (table_share->tmp_table == NO_TMP_TABLE);
|
||||
ulonglong check_table_flags= 0;
|
||||
ulonglong check_table_flags;
|
||||
DBUG_ENTER("ha_partition::open");
|
||||
|
||||
DBUG_ASSERT(table->s == table_share);
|
||||
@ -2505,8 +2600,9 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
||||
m_mode= mode;
|
||||
m_open_test_lock= test_if_locked;
|
||||
m_part_field_array= m_part_info->full_part_field_array;
|
||||
if (get_from_handler_file(name, &table->mem_root))
|
||||
DBUG_RETURN(1);
|
||||
if (get_from_handler_file(name, &table->mem_root, test(m_is_clone_of)))
|
||||
DBUG_RETURN(error);
|
||||
name_buffer_ptr= m_name_buffer_ptr;
|
||||
m_start_key.length= 0;
|
||||
m_rec0= table->record[0];
|
||||
m_rec_length= table_share->reclength;
|
||||
@ -2516,7 +2612,7 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
||||
{
|
||||
if (!(m_ordered_rec_buffer= (uchar*)my_malloc(alloc_len, MYF(MY_WME))))
|
||||
{
|
||||
DBUG_RETURN(1);
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
{
|
||||
/*
|
||||
@ -2539,48 +2635,84 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
||||
|
||||
/* Initialize the bitmap we use to minimize ha_start_bulk_insert calls */
|
||||
if (bitmap_init(&m_bulk_insert_started, NULL, m_tot_parts + 1, FALSE))
|
||||
DBUG_RETURN(1);
|
||||
DBUG_RETURN(error);
|
||||
bitmap_clear_all(&m_bulk_insert_started);
|
||||
/* Initialize the bitmap we use to determine what partitions are used */
|
||||
if (!is_clone)
|
||||
if (!m_is_clone_of)
|
||||
{
|
||||
DBUG_ASSERT(!m_clone_mem_root);
|
||||
if (bitmap_init(&(m_part_info->used_partitions), NULL, m_tot_parts, TRUE))
|
||||
{
|
||||
bitmap_free(&m_bulk_insert_started);
|
||||
DBUG_RETURN(1);
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
bitmap_set_all(&(m_part_info->used_partitions));
|
||||
}
|
||||
|
||||
file= m_file;
|
||||
do
|
||||
if (m_is_clone_of)
|
||||
{
|
||||
create_partition_name(name_buff, name, name_buffer_ptr, NORMAL_PART_NAME,
|
||||
FALSE);
|
||||
if ((error= (*file)->ha_open(table, (const char*) name_buff, mode,
|
||||
test_if_locked)))
|
||||
goto err_handler;
|
||||
m_no_locks+= (*file)->lock_count();
|
||||
name_buffer_ptr+= strlen(name_buffer_ptr) + 1;
|
||||
uint i;
|
||||
DBUG_ASSERT(m_clone_mem_root);
|
||||
/* Allocate an array of handler pointers for the partitions handlers. */
|
||||
alloc_len= (m_tot_parts + 1) * sizeof(handler*);
|
||||
if (!(m_file= (handler **) alloc_root(m_clone_mem_root, alloc_len)))
|
||||
goto err_alloc;
|
||||
memset(m_file, 0, alloc_len);
|
||||
/*
|
||||
Populate them by cloning the original partitions. This also opens them.
|
||||
Note that file->ref is allocated too.
|
||||
*/
|
||||
file= m_is_clone_of->m_file;
|
||||
for (i= 0; i < m_tot_parts; i++)
|
||||
{
|
||||
create_partition_name(name_buff, name, name_buffer_ptr, NORMAL_PART_NAME,
|
||||
FALSE);
|
||||
if (!(m_file[i]= file[i]->clone(name_buff, m_clone_mem_root)))
|
||||
{
|
||||
error= HA_ERR_INITIALIZATION;
|
||||
file= &m_file[i];
|
||||
goto err_handler;
|
||||
}
|
||||
name_buffer_ptr+= strlen(name_buffer_ptr) + 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
file= m_file;
|
||||
do
|
||||
{
|
||||
create_partition_name(name_buff, name, name_buffer_ptr, NORMAL_PART_NAME,
|
||||
FALSE);
|
||||
if ((error= (*file)->ha_open(table, name_buff, mode, test_if_locked)))
|
||||
goto err_handler;
|
||||
m_no_locks+= (*file)->lock_count();
|
||||
name_buffer_ptr+= strlen(name_buffer_ptr) + 1;
|
||||
} while (*(++file));
|
||||
}
|
||||
|
||||
file= m_file;
|
||||
ref_length= (*file)->ref_length;
|
||||
check_table_flags= (((*file)->ha_table_flags() &
|
||||
~(PARTITION_DISABLED_TABLE_FLAGS)) |
|
||||
(PARTITION_ENABLED_TABLE_FLAGS));
|
||||
while (*(++file))
|
||||
{
|
||||
/* MyISAM can have smaller ref_length for partitions with MAX_ROWS set */
|
||||
set_if_bigger(ref_length, ((*file)->ref_length));
|
||||
/*
|
||||
Verify that all partitions have the same set of table flags.
|
||||
Mask all flags that partitioning enables/disables.
|
||||
*/
|
||||
if (!check_table_flags)
|
||||
{
|
||||
check_table_flags= (((*file)->ha_table_flags() &
|
||||
~(PARTITION_DISABLED_TABLE_FLAGS)) |
|
||||
(PARTITION_ENABLED_TABLE_FLAGS));
|
||||
}
|
||||
else if (check_table_flags != (((*file)->ha_table_flags() &
|
||||
~(PARTITION_DISABLED_TABLE_FLAGS)) |
|
||||
(PARTITION_ENABLED_TABLE_FLAGS)))
|
||||
if (check_table_flags != (((*file)->ha_table_flags() &
|
||||
~(PARTITION_DISABLED_TABLE_FLAGS)) |
|
||||
(PARTITION_ENABLED_TABLE_FLAGS)))
|
||||
{
|
||||
error= HA_ERR_INITIALIZATION;
|
||||
/* set file to last handler, so all of them is closed */
|
||||
file = &m_file[m_tot_parts - 1];
|
||||
goto err_handler;
|
||||
}
|
||||
} while (*(++file));
|
||||
}
|
||||
key_used_on_scan= m_file[0]->key_used_on_scan;
|
||||
implicit_emptied= m_file[0]->implicit_emptied;
|
||||
/*
|
||||
@ -2589,6 +2721,7 @@ int ha_partition::open(const char *name, int mode, uint test_if_locked)
|
||||
*/
|
||||
ref_length+= PARTITION_BYTES_IN_POS;
|
||||
m_ref_length= ref_length;
|
||||
|
||||
/*
|
||||
Release buffer read from .par file. It will not be reused again after
|
||||
being opened once.
|
||||
@ -2646,25 +2779,54 @@ err_handler:
|
||||
DEBUG_SYNC(ha_thd(), "partition_open_error");
|
||||
while (file-- != m_file)
|
||||
(*file)->close();
|
||||
err_alloc:
|
||||
bitmap_free(&m_bulk_insert_started);
|
||||
if (!is_clone)
|
||||
if (!m_is_clone_of)
|
||||
bitmap_free(&(m_part_info->used_partitions));
|
||||
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
handler *ha_partition::clone(MEM_ROOT *mem_root)
|
||||
|
||||
/**
|
||||
Clone the open and locked partitioning handler.
|
||||
|
||||
@param mem_root MEM_ROOT to use.
|
||||
|
||||
@return Pointer to the successfully created clone or NULL
|
||||
|
||||
@details
|
||||
This function creates a new ha_partition handler as a clone/copy. The
|
||||
original (this) must already be opened and locked. The clone will use
|
||||
the originals m_part_info.
|
||||
It also allocates memory for ref + ref_dup.
|
||||
In ha_partition::open() it will clone its original handlers partitions
|
||||
which will allocate then on the correct MEM_ROOT and also open them.
|
||||
*/
|
||||
|
||||
handler *ha_partition::clone(const char *name, MEM_ROOT *mem_root)
|
||||
{
|
||||
handler *new_handler= get_new_handler(table->s, mem_root,
|
||||
table->s->db_type());
|
||||
((ha_partition*)new_handler)->m_part_info= m_part_info;
|
||||
((ha_partition*)new_handler)->is_clone= TRUE;
|
||||
if (new_handler && !new_handler->ha_open(table,
|
||||
table->s->normalized_path.str,
|
||||
table->db_stat,
|
||||
HA_OPEN_IGNORE_IF_LOCKED))
|
||||
return new_handler;
|
||||
return NULL;
|
||||
ha_partition *new_handler;
|
||||
|
||||
DBUG_ENTER("ha_partition::clone");
|
||||
new_handler= new (mem_root) ha_partition(ht, table_share, m_part_info,
|
||||
this, mem_root);
|
||||
/*
|
||||
Allocate new_handler->ref here because otherwise ha_open will allocate it
|
||||
on this->table->mem_root and we will not be able to reclaim that memory
|
||||
when the clone handler object is destroyed.
|
||||
*/
|
||||
if (new_handler &&
|
||||
!(new_handler->ref= (uchar*) alloc_root(mem_root,
|
||||
ALIGN_SIZE(m_ref_length)*2)))
|
||||
new_handler= NULL;
|
||||
|
||||
if (new_handler &&
|
||||
new_handler->ha_open(table, name,
|
||||
table->db_stat, HA_OPEN_IGNORE_IF_LOCKED))
|
||||
new_handler= NULL;
|
||||
|
||||
DBUG_RETURN((handler*) new_handler);
|
||||
}
|
||||
|
||||
|
||||
@ -2695,7 +2857,7 @@ int ha_partition::close(void)
|
||||
DBUG_ASSERT(table->s == table_share);
|
||||
delete_queue(&m_queue);
|
||||
bitmap_free(&m_bulk_insert_started);
|
||||
if (!is_clone)
|
||||
if (!m_is_clone_of)
|
||||
bitmap_free(&(m_part_info->used_partitions));
|
||||
file= m_file;
|
||||
|
||||
@ -3795,19 +3957,16 @@ end_dont_reset_start_part:
|
||||
void ha_partition::position(const uchar *record)
|
||||
{
|
||||
handler *file= m_file[m_last_part];
|
||||
uint pad_length;
|
||||
DBUG_ENTER("ha_partition::position");
|
||||
|
||||
file->position(record);
|
||||
int2store(ref, m_last_part);
|
||||
memcpy((ref + PARTITION_BYTES_IN_POS), file->ref,
|
||||
(ref_length - PARTITION_BYTES_IN_POS));
|
||||
memcpy((ref + PARTITION_BYTES_IN_POS), file->ref, file->ref_length);
|
||||
pad_length= m_ref_length - PARTITION_BYTES_IN_POS - file->ref_length;
|
||||
if (pad_length)
|
||||
memset((ref + PARTITION_BYTES_IN_POS + file->ref_length), 0, pad_length);
|
||||
|
||||
#ifdef SUPPORTING_PARTITION_OVER_DIFFERENT_ENGINES
|
||||
#ifdef HAVE_purify
|
||||
bzero(ref + PARTITION_BYTES_IN_POS + ref_length,
|
||||
max_ref_length-ref_length);
|
||||
#endif /* HAVE_purify */
|
||||
#endif
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
@ -4317,7 +4476,8 @@ int ha_partition::index_read_idx_map(uchar *buf, uint index,
|
||||
break;
|
||||
}
|
||||
}
|
||||
m_last_part= part;
|
||||
if (part <= m_part_spec.end_part)
|
||||
m_last_part= part;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -6237,7 +6397,14 @@ void ha_partition::print_error(int error, myf errflag)
|
||||
{
|
||||
/* In case m_file has not been initialized, like in bug#42438 */
|
||||
if (m_file)
|
||||
{
|
||||
if (m_last_part >= m_tot_parts)
|
||||
{
|
||||
DBUG_ASSERT(0);
|
||||
m_last_part= 0;
|
||||
}
|
||||
m_file[m_last_part]->print_error(error, errflag);
|
||||
}
|
||||
else
|
||||
handler::print_error(error, errflag);
|
||||
}
|
||||
|
@ -55,6 +55,16 @@ typedef struct st_ha_data_partition
|
||||
HA_DUPLICATE_POS | \
|
||||
HA_CAN_SQL_HANDLER | \
|
||||
HA_CAN_INSERT_DELAYED)
|
||||
|
||||
/* First 4 bytes in the .par file is the number of 32-bit words in the file */
|
||||
#define PAR_WORD_SIZE 4
|
||||
/* offset to the .par file checksum */
|
||||
#define PAR_CHECKSUM_OFFSET 4
|
||||
/* offset to the total number of partitions */
|
||||
#define PAR_NUM_PARTS_OFFSET 8
|
||||
/* offset to the engines array */
|
||||
#define PAR_ENGINES_OFFSET 12
|
||||
|
||||
class ha_partition :public handler
|
||||
{
|
||||
private:
|
||||
@ -71,7 +81,7 @@ private:
|
||||
/* Data for the partition handler */
|
||||
int m_mode; // Open mode
|
||||
uint m_open_test_lock; // Open test_if_locked
|
||||
char *m_file_buffer; // Buffer with names
|
||||
char *m_file_buffer; // Content of the .par file
|
||||
char *m_name_buffer_ptr; // Pointer to first partition name
|
||||
plugin_ref *m_engine_array; // Array of types of the handlers
|
||||
handler **m_file; // Array of references to handler inst.
|
||||
@ -133,6 +143,13 @@ private:
|
||||
bool m_is_sub_partitioned; // Is subpartitioned
|
||||
bool m_ordered_scan_ongoing;
|
||||
|
||||
/*
|
||||
If set, this object was created with ha_partition::clone and doesn't
|
||||
"own" the m_part_info structure.
|
||||
*/
|
||||
ha_partition *m_is_clone_of;
|
||||
MEM_ROOT *m_clone_mem_root;
|
||||
|
||||
/*
|
||||
We keep track if all underlying handlers are MyISAM since MyISAM has a
|
||||
great number of extra flags not needed by other handlers.
|
||||
@ -169,11 +186,6 @@ private:
|
||||
PARTITION_SHARE *share; /* Shared lock info */
|
||||
#endif
|
||||
|
||||
/*
|
||||
TRUE <=> this object was created with ha_partition::clone and doesn't
|
||||
"own" the m_part_info structure.
|
||||
*/
|
||||
bool is_clone;
|
||||
bool auto_increment_lock; /**< lock reading/updating auto_inc */
|
||||
/**
|
||||
Flag to keep the auto_increment lock through out the statement.
|
||||
@ -186,7 +198,7 @@ private:
|
||||
/** used for prediction of start_bulk_insert rows */
|
||||
enum_monotonicity_info m_part_func_monotonicity_info;
|
||||
public:
|
||||
handler *clone(MEM_ROOT *mem_root);
|
||||
handler *clone(const char *name, MEM_ROOT *mem_root);
|
||||
virtual void set_part_info(partition_info *part_info)
|
||||
{
|
||||
m_part_info= part_info;
|
||||
@ -205,6 +217,10 @@ public:
|
||||
*/
|
||||
ha_partition(handlerton *hton, TABLE_SHARE * table);
|
||||
ha_partition(handlerton *hton, partition_info * part_info);
|
||||
ha_partition(handlerton *hton, TABLE_SHARE *share,
|
||||
partition_info *part_info_arg,
|
||||
ha_partition *clone_arg,
|
||||
MEM_ROOT *clone_mem_root_arg);
|
||||
~ha_partition();
|
||||
/*
|
||||
A partition handler has no characteristics in itself. It only inherits
|
||||
@ -275,7 +291,10 @@ private:
|
||||
And one method to read it in.
|
||||
*/
|
||||
bool create_handler_file(const char *name);
|
||||
bool get_from_handler_file(const char *name, MEM_ROOT *mem_root);
|
||||
bool setup_engine_array(MEM_ROOT *mem_root);
|
||||
bool read_par_file(const char *name);
|
||||
bool get_from_handler_file(const char *name, MEM_ROOT *mem_root,
|
||||
bool is_clone);
|
||||
bool new_handlers_from_part_info(MEM_ROOT *mem_root);
|
||||
bool create_handlers(MEM_ROOT *mem_root);
|
||||
void clear_handler_file();
|
||||
|
@ -2037,22 +2037,29 @@ int ha_delete_table(THD *thd, handlerton *table_type, const char *path,
|
||||
/****************************************************************************
|
||||
** General handler functions
|
||||
****************************************************************************/
|
||||
handler *handler::clone(MEM_ROOT *mem_root)
|
||||
handler *handler::clone(const char *name, MEM_ROOT *mem_root)
|
||||
{
|
||||
handler *new_handler= get_new_handler(table->s, mem_root, table->s->db_type());
|
||||
handler *new_handler= get_new_handler(table->s, mem_root, ht);
|
||||
/*
|
||||
Allocate handler->ref here because otherwise ha_open will allocate it
|
||||
on this->table->mem_root and we will not be able to reclaim that memory
|
||||
when the clone handler object is destroyed.
|
||||
*/
|
||||
if (!(new_handler->ref= (uchar*) alloc_root(mem_root, ALIGN_SIZE(ref_length)*2)))
|
||||
return NULL;
|
||||
if (new_handler && !new_handler->ha_open(table,
|
||||
table->s->normalized_path.str,
|
||||
table->db_stat,
|
||||
HA_OPEN_IGNORE_IF_LOCKED))
|
||||
return new_handler;
|
||||
return NULL;
|
||||
if (new_handler &&
|
||||
!(new_handler->ref= (uchar*) alloc_root(mem_root,
|
||||
ALIGN_SIZE(ref_length)*2)))
|
||||
new_handler= NULL;
|
||||
/*
|
||||
TODO: Implement a more efficient way to have more than one index open for
|
||||
the same table instance. The ha_open call is not cachable for clone.
|
||||
*/
|
||||
if (new_handler && new_handler->ha_open(table,
|
||||
name,
|
||||
table->db_stat,
|
||||
HA_OPEN_IGNORE_IF_LOCKED))
|
||||
new_handler= NULL;
|
||||
|
||||
return new_handler;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,18 +1,19 @@
|
||||
/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
|
||||
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; version 2 of the License.
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; version 2 of
|
||||
the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
02110-1301 USA */
|
||||
|
||||
/* Definitions for parameters to do with handler-routines */
|
||||
|
||||
@ -56,7 +57,7 @@
|
||||
a table with rnd_next()
|
||||
- We will see all rows (including deleted ones)
|
||||
- Row positions are 'table->s->db_record_offset' apart
|
||||
If this flag is not set, filesort will do a postion() call for each matched
|
||||
If this flag is not set, filesort will do a position() call for each matched
|
||||
row to be able to find the row later.
|
||||
*/
|
||||
#define HA_REC_NOT_IN_SEQ (1 << 3)
|
||||
@ -1165,7 +1166,7 @@ public:
|
||||
DBUG_ASSERT(locked == FALSE);
|
||||
/* TODO: DBUG_ASSERT(inited == NONE); */
|
||||
}
|
||||
virtual handler *clone(MEM_ROOT *mem_root);
|
||||
virtual handler *clone(const char *name, MEM_ROOT *mem_root);
|
||||
/** This is called after create to allow us to set up cached variables */
|
||||
void init()
|
||||
{
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2000-2006 MySQL AB
|
||||
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -183,7 +183,7 @@ char * ip_to_hostname(struct in_addr *in, uint *errors)
|
||||
&tmp_hostent,buff,sizeof(buff),&tmp_errno)))
|
||||
{
|
||||
DBUG_PRINT("error",("gethostbyaddr_r returned %d",tmp_errno));
|
||||
return 0;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
if (!(check=my_gethostbyname_r(hp->h_name,&tmp_hostent2,buff2,sizeof(buff2),
|
||||
&tmp_errno)))
|
||||
|
@ -4464,14 +4464,14 @@ mark_non_agg_field:
|
||||
SELECT_LEX *select_lex= cached_table ?
|
||||
cached_table->select_lex : context->select_lex;
|
||||
if (!thd->lex->in_sum_func)
|
||||
select_lex->full_group_by_flag|= NON_AGG_FIELD_USED;
|
||||
select_lex->set_non_agg_field_used(true);
|
||||
else
|
||||
{
|
||||
if (outer_fixed)
|
||||
thd->lex->in_sum_func->outer_fields.push_back(this);
|
||||
else if (thd->lex->in_sum_func->nest_level !=
|
||||
thd->lex->current_select->nest_level)
|
||||
select_lex->full_group_by_flag|= NON_AGG_FIELD_USED;
|
||||
select_lex->set_non_agg_field_used(true);
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
|
@ -4000,13 +4000,11 @@ void Item_func_in::fix_length_and_dec()
|
||||
uint j=0;
|
||||
for (uint i=1 ; i < arg_count ; i++)
|
||||
{
|
||||
if (!args[i]->null_value) // Skip NULL values
|
||||
{
|
||||
array->set(j,args[i]);
|
||||
j++;
|
||||
}
|
||||
else
|
||||
have_null= 1;
|
||||
array->set(j,args[i]);
|
||||
if (!args[i]->null_value) // Skip NULL values
|
||||
j++;
|
||||
else
|
||||
have_null= 1;
|
||||
}
|
||||
if ((array->used_count= j))
|
||||
array->sort();
|
||||
|
@ -2122,10 +2122,7 @@ my_decimal *Item_func_round::decimal_op(my_decimal *decimal_value)
|
||||
if (!(null_value= (args[0]->null_value || args[1]->null_value ||
|
||||
my_decimal_round(E_DEC_FATAL_ERROR, value, (int) dec,
|
||||
truncate, decimal_value) > 1)))
|
||||
{
|
||||
decimal_value->frac= decimals;
|
||||
return decimal_value;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1016,6 +1016,14 @@ Item_in_subselect::single_value_transformer(JOIN *join,
|
||||
it.replace(item);
|
||||
}
|
||||
|
||||
DBUG_EXECUTE("where",
|
||||
print_where(item, "rewrite with MIN/MAX", QT_ORDINARY););
|
||||
if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY)
|
||||
{
|
||||
DBUG_ASSERT(select_lex->non_agg_field_used());
|
||||
select_lex->set_non_agg_field_used(false);
|
||||
}
|
||||
|
||||
save_allow_sum_func= thd->lex->allow_sum_func;
|
||||
thd->lex->allow_sum_func|= 1 << thd->lex->current_select->nest_level;
|
||||
/*
|
||||
|
@ -247,10 +247,10 @@ bool Item_sum::check_sum_func(THD *thd, Item **ref)
|
||||
in_sum_func->outer_fields.push_back(field);
|
||||
}
|
||||
else
|
||||
sel->full_group_by_flag|= NON_AGG_FIELD_USED;
|
||||
sel->set_non_agg_field_used(true);
|
||||
}
|
||||
if (sel->nest_level > aggr_level &&
|
||||
(sel->full_group_by_flag & SUM_FUNC_USED) &&
|
||||
(sel->agg_func_used()) &&
|
||||
!sel->group_list.elements)
|
||||
{
|
||||
my_message(ER_MIX_OF_GROUP_FUNC_AND_FIELDS,
|
||||
@ -259,7 +259,7 @@ bool Item_sum::check_sum_func(THD *thd, Item **ref)
|
||||
}
|
||||
}
|
||||
}
|
||||
aggr_sel->full_group_by_flag|= SUM_FUNC_USED;
|
||||
aggr_sel->set_agg_func_used(true);
|
||||
update_used_tables();
|
||||
thd->lex->in_sum_func= in_sum_func;
|
||||
return FALSE;
|
||||
@ -612,17 +612,13 @@ Item_sum_hybrid::fix_fields(THD *thd, Item **ref)
|
||||
|
||||
switch (hybrid_type= item->result_type()) {
|
||||
case INT_RESULT:
|
||||
max_length= 20;
|
||||
break;
|
||||
case DECIMAL_RESULT:
|
||||
case STRING_RESULT:
|
||||
max_length= item->max_length;
|
||||
break;
|
||||
case REAL_RESULT:
|
||||
max_length= float_length(decimals);
|
||||
break;
|
||||
case STRING_RESULT:
|
||||
max_length= item->max_length;
|
||||
break;
|
||||
case ROW_RESULT:
|
||||
default:
|
||||
DBUG_ASSERT(0);
|
||||
|
@ -648,7 +648,7 @@ bool make_date_time(DATE_TIME_FORMAT *format, MYSQL_TIME *l_time,
|
||||
system_charset_info);
|
||||
break;
|
||||
case 'W':
|
||||
if (type == MYSQL_TIMESTAMP_TIME)
|
||||
if (type == MYSQL_TIMESTAMP_TIME || !(l_time->month || l_time->year))
|
||||
return 1;
|
||||
weekday= calc_weekday(calc_daynr(l_time->year,l_time->month,
|
||||
l_time->day),0);
|
||||
@ -657,7 +657,7 @@ bool make_date_time(DATE_TIME_FORMAT *format, MYSQL_TIME *l_time,
|
||||
system_charset_info);
|
||||
break;
|
||||
case 'a':
|
||||
if (type == MYSQL_TIMESTAMP_TIME)
|
||||
if (type == MYSQL_TIMESTAMP_TIME || !(l_time->month || l_time->year))
|
||||
return 1;
|
||||
weekday=calc_weekday(calc_daynr(l_time->year,l_time->month,
|
||||
l_time->day),0);
|
||||
@ -816,7 +816,7 @@ bool make_date_time(DATE_TIME_FORMAT *format, MYSQL_TIME *l_time,
|
||||
}
|
||||
break;
|
||||
case 'w':
|
||||
if (type == MYSQL_TIMESTAMP_TIME)
|
||||
if (type == MYSQL_TIMESTAMP_TIME || !(l_time->month || l_time->year))
|
||||
return 1;
|
||||
weekday=calc_weekday(calc_daynr(l_time->year,l_time->month,
|
||||
l_time->day),1);
|
||||
|
@ -1469,13 +1469,6 @@ SQL_SELECT *make_select(TABLE *head, table_map const_tables,
|
||||
bool allow_null_cond, int *error);
|
||||
extern Item **not_found_item;
|
||||
|
||||
/*
|
||||
A set of constants used for checking non aggregated fields and sum
|
||||
functions mixture in the ONLY_FULL_GROUP_BY_MODE.
|
||||
*/
|
||||
#define NON_AGG_FIELD_USED 1
|
||||
#define SUM_FUNC_USED 2
|
||||
|
||||
/*
|
||||
This enumeration type is used only by the function find_item_in_list
|
||||
to return the info on how an item has been resolved against a list
|
||||
|
@ -8961,12 +8961,15 @@ fn_format_relative_to_data_home(char * to, const char *name,
|
||||
bool is_secure_file_path(char *path)
|
||||
{
|
||||
char buff1[FN_REFLEN], buff2[FN_REFLEN];
|
||||
size_t opt_secure_file_priv_len;
|
||||
/*
|
||||
All paths are secure if opt_secure_file_path is 0
|
||||
*/
|
||||
if (!opt_secure_file_priv)
|
||||
return TRUE;
|
||||
|
||||
opt_secure_file_priv_len= strlen(opt_secure_file_priv);
|
||||
|
||||
if (strlen(path) >= FN_REFLEN)
|
||||
return FALSE;
|
||||
|
||||
@ -8984,11 +8987,24 @@ bool is_secure_file_path(char *path)
|
||||
return FALSE;
|
||||
}
|
||||
convert_dirname(buff2, buff1, NullS);
|
||||
if (strncmp(opt_secure_file_priv, buff2, strlen(opt_secure_file_priv)))
|
||||
return FALSE;
|
||||
if (!lower_case_file_system)
|
||||
{
|
||||
if (strncmp(opt_secure_file_priv, buff2, opt_secure_file_priv_len))
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (files_charset_info->coll->strnncoll(files_charset_info,
|
||||
(uchar *) buff2, strlen(buff2),
|
||||
(uchar *) opt_secure_file_priv,
|
||||
opt_secure_file_priv_len,
|
||||
TRUE))
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static int fix_paths(void)
|
||||
{
|
||||
char buff[FN_REFLEN],*pos;
|
||||
|
@ -1335,7 +1335,7 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler)
|
||||
}
|
||||
|
||||
thd= head->in_use;
|
||||
if (!(file= head->file->clone(thd->mem_root)))
|
||||
if (!(file= head->file->clone(head->s->normalized_path.str, thd->mem_root)))
|
||||
{
|
||||
/*
|
||||
Manually set the error flag. Note: there seems to be quite a few
|
||||
|
@ -211,6 +211,7 @@ static int get_index_max_value(TABLE *table, TABLE_REF *ref, uint range_fl)
|
||||
/**
|
||||
Substitutes constants for some COUNT(), MIN() and MAX() functions.
|
||||
|
||||
@param thd thread handler
|
||||
@param tables list of leaves of join table tree
|
||||
@param all_fields All fields to be returned
|
||||
@param conds WHERE clause
|
||||
@ -228,9 +229,12 @@ static int get_index_max_value(TABLE *table, TABLE_REF *ref, uint range_fl)
|
||||
HA_ERR_KEY_NOT_FOUND on impossible conditions
|
||||
@retval
|
||||
HA_ERR_... if a deadlock or a lock wait timeout happens, for example
|
||||
@retval
|
||||
ER_... e.g. ER_SUBQUERY_NO_1_ROW
|
||||
*/
|
||||
|
||||
int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
||||
int opt_sum_query(THD *thd,
|
||||
TABLE_LIST *tables, List<Item> &all_fields, COND *conds)
|
||||
{
|
||||
List_iterator_fast<Item> it(all_fields);
|
||||
int const_result= 1;
|
||||
@ -242,6 +246,8 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
||||
Item *item;
|
||||
int error;
|
||||
|
||||
DBUG_ENTER("opt_sum_query");
|
||||
|
||||
if (conds)
|
||||
where_tables= conds->used_tables();
|
||||
|
||||
@ -269,7 +275,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
||||
WHERE t2.field IS NULL;
|
||||
*/
|
||||
if (tl->table->map & where_tables)
|
||||
return 0;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
else
|
||||
used_tables|= tl->table->map;
|
||||
@ -297,7 +303,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
||||
{
|
||||
tl->table->file->print_error(error, MYF(0));
|
||||
tl->table->in_use->fatal_error();
|
||||
return error;
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
count*= tl->table->file->stats.records;
|
||||
}
|
||||
@ -390,10 +396,10 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
||||
if (error)
|
||||
{
|
||||
if (error == HA_ERR_KEY_NOT_FOUND || error == HA_ERR_END_OF_FILE)
|
||||
return HA_ERR_KEY_NOT_FOUND; // No rows matching WHERE
|
||||
DBUG_RETURN(HA_ERR_KEY_NOT_FOUND); // No rows matching WHERE
|
||||
/* HA_ERR_LOCK_DEADLOCK or some other error */
|
||||
table->file->print_error(error, MYF(0));
|
||||
return(error);
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
removed_tables|= table->map;
|
||||
}
|
||||
@ -437,6 +443,10 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
||||
const_result= 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (thd->is_error())
|
||||
DBUG_RETURN(thd->main_da.sql_errno());
|
||||
|
||||
/*
|
||||
If we have a where clause, we can only ignore searching in the
|
||||
tables if MIN/MAX optimisation replaced all used tables
|
||||
@ -446,7 +456,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
||||
*/
|
||||
if (removed_tables && used_tables != removed_tables)
|
||||
const_result= 0; // We didn't remove all tables
|
||||
return const_result;
|
||||
DBUG_RETURN(const_result);
|
||||
}
|
||||
|
||||
|
||||
@ -732,6 +742,12 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
|
||||
|
||||
if (is_null || (is_null_safe_eq && args[1]->is_null()))
|
||||
{
|
||||
/*
|
||||
If we have a non-nullable index, we cannot use it,
|
||||
since set_null will be ignored, and we will compare uninitialized data.
|
||||
*/
|
||||
if (!part->field->real_maybe_null())
|
||||
DBUG_RETURN(false);
|
||||
part->field->set_null();
|
||||
*key_ptr= (uchar) 1;
|
||||
}
|
||||
@ -802,8 +818,9 @@ static bool matching_cond(bool max_fl, TABLE_REF *ref, KEY *keyinfo,
|
||||
@param[out] prefix_len Length of prefix for the search range
|
||||
|
||||
@note
|
||||
This function may set table->key_read to 1, which must be reset after
|
||||
index is used! (This can only happen when function returns 1)
|
||||
This function may set field->table->key_read to true,
|
||||
which must be reset after index is used!
|
||||
(This can only happen when function returns 1)
|
||||
|
||||
@retval
|
||||
0 Index can not be used to optimize MIN(field)/MAX(field)
|
||||
@ -818,7 +835,9 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
|
||||
uint *range_fl, uint *prefix_len)
|
||||
{
|
||||
if (!(field->flags & PART_KEY_FLAG))
|
||||
return 0; // Not key field
|
||||
return false; // Not key field
|
||||
|
||||
DBUG_ENTER("find_key_for_maxmin");
|
||||
|
||||
TABLE *table= field->table;
|
||||
uint idx= 0;
|
||||
@ -843,7 +862,7 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
|
||||
part++, jdx++, key_part_to_use= (key_part_to_use << 1) | 1)
|
||||
{
|
||||
if (!(table->file->index_flags(idx, jdx, 0) & HA_READ_ORDER))
|
||||
return 0;
|
||||
DBUG_RETURN(false);
|
||||
|
||||
/* Check whether the index component is partial */
|
||||
Field *part_field= table->field[part->fieldnr-1];
|
||||
@ -892,12 +911,12 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
|
||||
*/
|
||||
if (field->part_of_key.is_set(idx))
|
||||
table->set_keyread(TRUE);
|
||||
return 1;
|
||||
DBUG_RETURN(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
|
||||
|
||||
|
@ -97,7 +97,7 @@ static const char *reconnect_messages[SLAVE_RECON_ACT_MAX][SLAVE_RECON_MSG_MAX]=
|
||||
registration on master",
|
||||
"Reconnecting after a failed registration on master",
|
||||
"failed registering on master, reconnecting to try again, \
|
||||
log '%s' at postion %s",
|
||||
log '%s' at position %s",
|
||||
"COM_REGISTER_SLAVE",
|
||||
"Slave I/O thread killed during or after reconnect"
|
||||
},
|
||||
@ -105,7 +105,7 @@ log '%s' at postion %s",
|
||||
"Waiting to reconnect after a failed binlog dump request",
|
||||
"Slave I/O thread killed while retrying master dump",
|
||||
"Reconnecting after a failed binlog dump request",
|
||||
"failed dump request, reconnecting to try again, log '%s' at postion %s",
|
||||
"failed dump request, reconnecting to try again, log '%s' at position %s",
|
||||
"COM_BINLOG_DUMP",
|
||||
"Slave I/O thread killed during or after reconnect"
|
||||
},
|
||||
@ -114,7 +114,7 @@ log '%s' at postion %s",
|
||||
"Slave I/O thread killed while waiting to reconnect after a failed read",
|
||||
"Reconnecting after a failed master event read",
|
||||
"Slave I/O thread: Failed reading log event, reconnecting to retry, \
|
||||
log '%s' at postion %s",
|
||||
log '%s' at position %s",
|
||||
"",
|
||||
"Slave I/O thread killed during or after a reconnect done to recover from \
|
||||
failed read"
|
||||
|
@ -3383,6 +3383,7 @@ bool xid_cache_insert(XID *xid, enum xa_states xa_state)
|
||||
xs->xa_state=xa_state;
|
||||
xs->xid.set(xid);
|
||||
xs->in_thd=0;
|
||||
xs->rm_error=0;
|
||||
res=my_hash_insert(&xid_cache, (uchar*)xs);
|
||||
}
|
||||
pthread_mutex_unlock(&LOCK_xid_cache);
|
||||
|
@ -1621,6 +1621,8 @@ void st_select_lex::init_query()
|
||||
nest_level= 0;
|
||||
link_next= 0;
|
||||
lock_option= TL_READ_DEFAULT;
|
||||
m_non_agg_field_used= false;
|
||||
m_agg_func_used= false;
|
||||
}
|
||||
|
||||
void st_select_lex::init_select()
|
||||
@ -1651,7 +1653,8 @@ void st_select_lex::init_select()
|
||||
non_agg_fields.empty();
|
||||
cond_value= having_value= Item::COND_UNDEF;
|
||||
inner_refs_list.empty();
|
||||
full_group_by_flag= 0;
|
||||
m_non_agg_field_used= false;
|
||||
m_agg_func_used= false;
|
||||
}
|
||||
|
||||
/*
|
||||
|
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