merged 5.1-bugteam -> bug 34773 tree
This commit is contained in:
commit
b6704027d6
@ -389,6 +389,9 @@ client/readline.cpp
|
||||
client/rpl_constants.h
|
||||
client/rpl_record_old.cc
|
||||
client/rpl_record_old.h
|
||||
client/rpl_tblmap.h
|
||||
client/rpl_tblmap.cc
|
||||
client/rpl_utility.h
|
||||
client/select_test
|
||||
client/sql_string.cpp
|
||||
client/ssl_test
|
||||
|
@ -176,7 +176,7 @@ check_cpu () {
|
||||
fi
|
||||
|
||||
cc_ver=`$cc --version | sed 1q`
|
||||
cc_verno=`echo $cc_ver | sed -e 's/^.*gcc/gcc/g; s/[^0-9. ]//g; s/^ *//g; s/ .*//g'`
|
||||
cc_verno=`echo $cc_ver | sed -e 's/^.*(GCC)//g; s/[^0-9. ]//g; s/^ *//g; s/ .*//g'`
|
||||
set -- `echo $cc_verno | tr '.' ' '`
|
||||
cc_major=$1
|
||||
cc_minor=$2
|
||||
|
7
BUILD/compile-solaris-amd64-forte
Normal file → Executable file
7
BUILD/compile-solaris-amd64-forte
Normal file → Executable file
@ -7,22 +7,23 @@ path=`dirname $0`
|
||||
. "$path/autorun.sh"
|
||||
|
||||
# For "optimal" code for this computer add -fast to EXTRA
|
||||
# To compile 64 bit, add -xarch=v9 to EXTRA_64_BIT
|
||||
# To compile 64 bit, add -m64 to EXTRA_64_BIT
|
||||
|
||||
EXTRA_64_BIT="-xarch=amd64"
|
||||
EXTRA_64_BIT="-m64"
|
||||
EXTRA="-fast"
|
||||
|
||||
#
|
||||
# The following should not need to be touched
|
||||
#
|
||||
|
||||
export CC CXX CFLAGS CXXFLAGS
|
||||
export CC CXX CFLAGS CXXFLAGS LIBS
|
||||
STD="-g -mt -D_FORTEC_ $EXTRA $EXTRA_64_BIT"
|
||||
ASFLAGS="$EXTRA_64_BIT"
|
||||
CC=cc-5.0
|
||||
CFLAGS="-Xa -xstrconst $STD"
|
||||
CXX=CC
|
||||
CXXFLAGS="-noex $STD"
|
||||
LIBS=-lmtmalloc
|
||||
./configure \
|
||||
--prefix=/usr/local/mysql \
|
||||
--localstatedir=/usr/local/mysql/data \
|
||||
|
@ -6,8 +6,8 @@ gmake -k clean || true
|
||||
path=`dirname $0`
|
||||
. "$path/autorun.sh"
|
||||
|
||||
# To compile 64 bit, add -xarch=amd64 to EXTRA_64_BIT
|
||||
EXTRA_64_BIT="-xarch=amd64"
|
||||
# To compile 64 bit, add -m64 to EXTRA_64_BIT
|
||||
EXTRA_64_BIT="-m64"
|
||||
|
||||
# For "optimal" code for this computer add -fast to EXTRA. Note that
|
||||
# this causes problem with debugging the program since -fast implies
|
||||
|
@ -9,6 +9,6 @@ PATH=$PATH:/usr/ccs/bin:/usr/local/bin
|
||||
path=`dirname $0`
|
||||
. "$path/autorun.sh"
|
||||
|
||||
CFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Wunused -O3 -fno-omit-frame-pointer -mcpu=v8 -Wa,-xarch=v8plusa" CXX=gcc CXXFLAGS="-Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Woverloaded-virtual -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor -felide-constructors -fno-exceptions -fno-rtti -O3 -fno-omit-frame-pointer -mcpu=v8 -Wa,-xarch=v8plusa -g" ./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client
|
||||
CFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Wunused -O3 -fno-omit-frame-pointer -mcpu=v8 -Wa,-xarch=v8plusa" CXX=gcc CXXFLAGS="-Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Woverloaded-virtual -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor -felide-constructors -fno-exceptions -fno-rtti -O3 -fno-omit-frame-pointer -mcpu=v8 -Wa,-xarch=v8plusa -g" LIBS="-lmtmalloc" ./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client
|
||||
|
||||
make -j 4
|
||||
|
@ -29,7 +29,7 @@ EXTRA="-fast" # Remove comment to target current machine
|
||||
|
||||
STD="-mt -D_FORTEC_ $EXTRA $EXTRA_64_BIT"
|
||||
CC=cc-5.0 CFLAGS="-Xa -xstrconst $STD" \
|
||||
CXX=CC CXXFLAGS="-noex $STD" \
|
||||
CXX=CC CXXFLAGS="-noex $STD" LIBS="-lmtmalloc" \
|
||||
./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --prefix=$PREFIX
|
||||
|
||||
make -j 4
|
||||
|
@ -108,18 +108,18 @@ SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DDBUG_OFF")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4800 /wd4805")
|
||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4800 /wd4805")
|
||||
|
||||
IF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
# Disable warnings in Visual Studio 8 and above
|
||||
IF(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7")
|
||||
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4996")
|
||||
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /wd4996")
|
||||
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /wd4996")
|
||||
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /wd4996")
|
||||
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /wd4996")
|
||||
SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /wd4996")
|
||||
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
|
||||
IF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR
|
||||
CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
ENDIF(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7")
|
||||
|
||||
# Settings for Visual Studio 7 and above.
|
||||
IF(MSVC)
|
||||
# replace /MDd with /MTd
|
||||
STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
|
||||
STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO})
|
||||
@ -149,9 +149,7 @@ IF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR
|
||||
IF(NOT tmp_manifest)
|
||||
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO")
|
||||
ENDIF(NOT tmp_manifest)
|
||||
|
||||
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR
|
||||
CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
ENDIF(MSVC)
|
||||
|
||||
IF(WIN32)
|
||||
ADD_DEFINITIONS("-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE")
|
||||
|
81
Makefile.am
81
Makefile.am
@ -49,7 +49,7 @@ bin-dist: all
|
||||
$(top_builddir)/scripts/make_binary_distribution @MAKE_BINARY_DISTRIBUTION_OPTIONS@
|
||||
|
||||
# Remove BK's "SCCS" subdirectories from source distribution
|
||||
# Create initial database files for Windows installations.
|
||||
# Create initial database files for Windows installations and check them.
|
||||
dist-hook:
|
||||
rm -rf `find $(distdir) -type d -name SCCS -print`
|
||||
mkdir -p $(distdir)/win
|
||||
@ -57,6 +57,9 @@ dist-hook:
|
||||
--builddir=$(top_builddir) \
|
||||
--datadir=$(distdir)/win/data \
|
||||
--srcdir=$(top_srcdir)
|
||||
storage/myisam/myisamchk --silent --fast $(distdir)/win/data/mysql/*.MYI
|
||||
|
||||
all-local: @ABI_CHECK@
|
||||
|
||||
tags:
|
||||
support-files/build-tags
|
||||
@ -231,5 +234,81 @@ test-full-qa:
|
||||
test-binlog-statement test-ext test-fast-view \
|
||||
test-fast-cursor test-unit
|
||||
|
||||
#
|
||||
# Headers which need to be checked for abi/api compatibility.
|
||||
# API_PREPROCESSOR_HEADER will be used until mysql_priv.h stablizes
|
||||
# after which TEST_PREPROCESSOR_HEADER will be used.
|
||||
#
|
||||
|
||||
API_PREPROCESSOR_HEADER = $(top_srcdir)/include/mysql/plugin.h \
|
||||
$(top_srcdir)/include/mysql.h
|
||||
|
||||
TEST_PREPROCESSOR_HEADER = $(top_srcdir)/include/mysql/plugin.h \
|
||||
$(top_srcdir)/sql/mysql_priv.h \
|
||||
$(top_srcdir)/include/mysql.h
|
||||
|
||||
#
|
||||
# Rules for checking that the abi/api has not changed.
|
||||
#
|
||||
# The following steps are followed in the do_abi_check rule below
|
||||
#
|
||||
# 1) Generate preprocessor output for the files that need to
|
||||
# be tested for abi/api changes. use -nostdinc to prevent
|
||||
# generation of preprocessor output for system headers. This
|
||||
# results in messages in stderr saying that these headers
|
||||
# were not found. Redirect the stderr output to /dev/null
|
||||
# to prevent seeing these messages.
|
||||
# 2) sed the output to
|
||||
# 2.1) remove blank lines and lines that begin with "# "
|
||||
# 2.2) When gcc -E is run on the Mac OS and solaris sparc platforms it
|
||||
# introduces a line of output that shows up as a difference between
|
||||
# the .pp and .out files. Remove these OS specific preprocessor text
|
||||
# inserted by the preprocessor.
|
||||
# 3) diff the generated file and the canons (.pp files already in
|
||||
# the repository).
|
||||
# 4) delete the .out file that is generated.
|
||||
#
|
||||
# If the diff fails, the generated file is not removed. This will
|
||||
# be useful for analysis of ABI differences (e.g. using a visual
|
||||
# diff tool).
|
||||
#
|
||||
# A ABI change that causes a build to fail will always be accompanied
|
||||
# by new canons (.out files). The .out files that are not removed will
|
||||
# be replaced as the new .pp files.
|
||||
#
|
||||
# e.g. If include/mysql/plugin.h has an ABI change then this rule would
|
||||
# leave a <build directory>/abi_check.out file.
|
||||
#
|
||||
# A developer with a justified API change will then do a
|
||||
# mv <build directory>/abi_check.out include/mysql/plugin.pp
|
||||
# to replace the old canons with the new ones.
|
||||
#
|
||||
|
||||
abi_check: $(API_PREPROCESSOR_HEADER)
|
||||
$(MAKE) abi_headers="$^" do_abi_check
|
||||
|
||||
abi_check_all: $(TEST_PREPROCESSOR_HEADER)
|
||||
$(MAKE) abi_headers="$^" do_abi_check
|
||||
|
||||
do_abi_check:
|
||||
set -ex; \
|
||||
for file in $(abi_headers); do \
|
||||
@CC@ -E -nostdinc -dI \
|
||||
-I$(top_srcdir)/include \
|
||||
-I$(top_srcdir)/include/mysql \
|
||||
-I$(top_srcdir)/sql \
|
||||
-I$(top_builddir)/include \
|
||||
-I$(top_builddir)/include/mysql \
|
||||
-I$(top_builddir)/sql \
|
||||
$$file 2>/dev/null | \
|
||||
@SED@ -e '/^# /d' \
|
||||
-e '/^[ ]*$$/d' \
|
||||
-e '/^#pragma GCC set_debug_pwd/d' \
|
||||
-e '/^#ident/d' > \
|
||||
$(top_builddir)/abi_check.out; \
|
||||
@DIFF@ -w $$file.pp $(top_builddir)/abi_check.out; \
|
||||
@RM@ $(top_builddir)/abi_check.out; \
|
||||
done
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -15,7 +15,7 @@
|
||||
INCLUDE("${PROJECT_SOURCE_DIR}/win/mysql_manifest.cmake")
|
||||
|
||||
# We use the "mysqlclient_notls" library here just as safety, in case
|
||||
# any of the clients here would go beond the client API and access the
|
||||
# any of the clients here would go beyond the client API and access the
|
||||
# Thread Local Storage directly.
|
||||
|
||||
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX")
|
||||
@ -32,9 +32,9 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include
|
||||
ADD_EXECUTABLE(mysql completion_hash.cc mysql.cc readline.cc sql_string.cc ../mysys/my_conio.c)
|
||||
TARGET_LINK_LIBRARIES(mysql mysqlclient_notls wsock32)
|
||||
|
||||
ADD_EXECUTABLE(mysqltest mysqltest.c ../mysys/my_getsystime.c
|
||||
../mysys/my_copy.c ../mysys/my_mkdir.c)
|
||||
TARGET_LINK_LIBRARIES(mysqltest mysqlclient_notls regex wsock32)
|
||||
ADD_EXECUTABLE(mysqltest mysqltest.c)
|
||||
SET_SOURCE_FILES_PROPERTIES(mysqltest.c PROPERTIES COMPILE_FLAGS "-DTHREADS")
|
||||
TARGET_LINK_LIBRARIES(mysqltest mysqlclient mysys regex wsock32 dbug)
|
||||
|
||||
ADD_EXECUTABLE(mysqlcheck mysqlcheck.c)
|
||||
TARGET_LINK_LIBRARIES(mysqlcheck mysqlclient_notls wsock32)
|
||||
|
@ -86,11 +86,14 @@ mysqlslap_LDADD = $(CXXLDFLAGS) $(CLIENT_THREAD_LIBS) \
|
||||
$(LIBMYSQLCLIENT_LA) \
|
||||
$(top_builddir)/mysys/libmysys.a
|
||||
|
||||
mysqltest_SOURCES= mysqltest.c \
|
||||
$(top_srcdir)/mysys/my_getsystime.c \
|
||||
$(top_srcdir)/mysys/my_copy.c \
|
||||
$(top_srcdir)/mysys/my_mkdir.c
|
||||
mysqltest_LDADD = $(top_builddir)/regex/libregex.a $(LDADD)
|
||||
mysqltest_SOURCES= mysqltest.c
|
||||
mysqltest_CFLAGS= -DTHREAD -UUNDEF_THREADS_HACK
|
||||
mysqltest_LDADD = $(CXXLDFLAGS) \
|
||||
@CLIENT_EXTRA_LDFLAGS@ \
|
||||
$(LIBMYSQLCLIENT_LA) \
|
||||
$(top_builddir)/mysys/libmysys.a \
|
||||
$(top_builddir)/regex/libregex.a \
|
||||
$(CLIENT_THREAD_LIBS)
|
||||
|
||||
mysql_upgrade_SOURCES= mysql_upgrade.c \
|
||||
$(top_srcdir)/mysys/my_getpagesize.c
|
||||
@ -101,6 +104,7 @@ DEFS = -DUNDEF_THREADS_HACK \
|
||||
-DDATADIR="\"$(localstatedir)\""
|
||||
|
||||
sql_src=log_event.h mysql_priv.h rpl_constants.h \
|
||||
rpl_utility.h rpl_tblmap.h rpl_tblmap.cc \
|
||||
log_event.cc my_decimal.h my_decimal.cc \
|
||||
log_event_old.h log_event_old.cc \
|
||||
rpl_record_old.h rpl_record_old.cc
|
||||
|
@ -1821,7 +1821,7 @@ static int read_and_execute(bool interactive)
|
||||
the very beginning of a text file when
|
||||
you save the file using "Unicode UTF-8" format.
|
||||
*/
|
||||
if (!line_number &&
|
||||
if (line && !line_number &&
|
||||
(uchar) line[0] == 0xEF &&
|
||||
(uchar) line[1] == 0xBB &&
|
||||
(uchar) line[2] == 0xBF)
|
||||
@ -2176,7 +2176,14 @@ static bool add_line(String &buffer,char *line,char *in_string,
|
||||
}
|
||||
else if (!*ml_comment && (!*in_string && (inchar == '#' ||
|
||||
inchar == '-' && pos[1] == '-' &&
|
||||
my_isspace(charset_info,pos[2]))))
|
||||
/*
|
||||
The third byte is either whitespace or is the
|
||||
end of the line -- which would occur only
|
||||
because of the user sending newline -- which is
|
||||
itself whitespace and should also match.
|
||||
*/
|
||||
(my_isspace(charset_info,pos[2]) ||
|
||||
!pos[2]))))
|
||||
{
|
||||
// Flush previously accepted characters
|
||||
if (out != line)
|
||||
|
@ -269,6 +269,10 @@ get_one_option(int optid, const struct my_option *opt,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Run a command using the shell, storing its output in the supplied dynamic
|
||||
string.
|
||||
*/
|
||||
static int run_command(char* cmd,
|
||||
DYNAMIC_STRING *ds_res)
|
||||
{
|
||||
@ -341,37 +345,15 @@ static int run_tool(char *tool_path, DYNAMIC_STRING *ds_res, ...)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Try to get the full path to this exceutable
|
||||
|
||||
Return 0 if path found
|
||||
|
||||
/**
|
||||
Look for the filename of given tool, with the presumption that it is in the
|
||||
same directory as mysql_upgrade and that the same executable-searching
|
||||
mechanism will be used when we run our sub-shells with popen() later.
|
||||
*/
|
||||
|
||||
static my_bool get_full_path_to_executable(char* path)
|
||||
static void find_tool(char *tool_executable_name, const char *tool_name,
|
||||
const char *self_name)
|
||||
{
|
||||
my_bool ret;
|
||||
DBUG_ENTER("get_full_path_to_executable");
|
||||
#ifdef __WIN__
|
||||
ret= (GetModuleFileName(NULL, path, FN_REFLEN) == 0);
|
||||
#else
|
||||
/* my_readlink returns 0 if a symlink was read */
|
||||
ret= (my_readlink(path, "/proc/self/exe", MYF(0)) != 0);
|
||||
/* Might also want to try with /proc/$$/exe if the above fails */
|
||||
#endif
|
||||
DBUG_PRINT("exit", ("path: %s", path));
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Look for the tool in the same directory as mysql_upgrade.
|
||||
*/
|
||||
|
||||
static void find_tool(char *tool_path, const char *tool_name)
|
||||
{
|
||||
size_t path_len;
|
||||
char path[FN_REFLEN];
|
||||
char *last_fn_libchar;
|
||||
DYNAMIC_STRING ds_tmp;
|
||||
DBUG_ENTER("find_tool");
|
||||
DBUG_PRINT("enter", ("progname: %s", my_progname));
|
||||
@ -379,77 +361,59 @@ static void find_tool(char *tool_path, const char *tool_name)
|
||||
if (init_dynamic_string(&ds_tmp, "", 32, 32))
|
||||
die("Out of memory");
|
||||
|
||||
/* Initialize path with the full path to this program */
|
||||
if (get_full_path_to_executable(path))
|
||||
last_fn_libchar= strrchr(self_name, FN_LIBCHAR);
|
||||
|
||||
if (last_fn_libchar == NULL)
|
||||
{
|
||||
/*
|
||||
Easy way to get full executable path failed, try
|
||||
other methods
|
||||
mysql_upgrade was found by the shell searching the path. A sibling
|
||||
next to us should be found the same way.
|
||||
*/
|
||||
if (my_progname[0] == FN_LIBCHAR)
|
||||
{
|
||||
/* 1. my_progname contains full path */
|
||||
strmake(path, my_progname, FN_REFLEN);
|
||||
}
|
||||
else if (my_progname[0] == '.')
|
||||
{
|
||||
/* 2. my_progname contains relative path, prepend wd */
|
||||
char buf[FN_REFLEN];
|
||||
my_getwd(buf, FN_REFLEN, MYF(0));
|
||||
my_snprintf(path, FN_REFLEN, "%s%s", buf, my_progname);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 3. Just go for it and hope tool is in path */
|
||||
path[0]= 0;
|
||||
}
|
||||
strncpy(tool_executable_name, tool_name, FN_REFLEN);
|
||||
}
|
||||
|
||||
DBUG_PRINT("info", ("path: '%s'", path));
|
||||
|
||||
/* Chop off binary name (i.e mysql-upgrade) from path */
|
||||
dirname_part(path, path, &path_len);
|
||||
|
||||
/*
|
||||
When running in a not yet installed build and using libtool,
|
||||
the program(mysql_upgrade) will be in .libs/ and executed
|
||||
through a libtool wrapper in order to use the dynamic libraries
|
||||
from this build. The same must be done for the tools(mysql and
|
||||
mysqlcheck). Thus if path ends in .libs/, step up one directory
|
||||
and execute the tools from there
|
||||
*/
|
||||
path[max(path_len-1, 0)]= 0; /* Chop off last / */
|
||||
if (strncmp(path + dirname_length(path), ".libs", 5) == 0)
|
||||
else
|
||||
{
|
||||
DBUG_PRINT("info", ("Chopping off .libs from '%s'", path));
|
||||
int len;
|
||||
|
||||
/* Chop off .libs */
|
||||
dirname_part(path, path, &path_len);
|
||||
/*
|
||||
mysql_upgrade was run absolutely or relatively. We can find a sibling
|
||||
by replacing our name after the LIBCHAR with the new tool name.
|
||||
*/
|
||||
|
||||
/*
|
||||
When running in a not yet installed build and using libtool,
|
||||
the program(mysql_upgrade) will be in .libs/ and executed
|
||||
through a libtool wrapper in order to use the dynamic libraries
|
||||
from this build. The same must be done for the tools(mysql and
|
||||
mysqlcheck). Thus if path ends in .libs/, step up one directory
|
||||
and execute the tools from there
|
||||
*/
|
||||
if (((last_fn_libchar - 6) >= self_name) &&
|
||||
(strncmp(last_fn_libchar - 5, ".libs", 5) == 0) &&
|
||||
(*(last_fn_libchar - 6) == FN_LIBCHAR))
|
||||
{
|
||||
DBUG_PRINT("info", ("Chopping off \".libs\" from end of path"));
|
||||
last_fn_libchar -= 6;
|
||||
}
|
||||
|
||||
len= last_fn_libchar - self_name;
|
||||
|
||||
my_snprintf(tool_executable_name, FN_REFLEN, "%.*s%c%s",
|
||||
len, self_name, FN_LIBCHAR, tool_name);
|
||||
}
|
||||
|
||||
|
||||
DBUG_PRINT("info", ("path: '%s'", path));
|
||||
|
||||
/* Format name of the tool to search for */
|
||||
fn_format(tool_path, tool_name,
|
||||
path, "", MYF(MY_REPLACE_DIR));
|
||||
|
||||
verbose("Looking for '%s' in: %s", tool_name, tool_path);
|
||||
|
||||
/* Make sure the tool exists */
|
||||
if (my_access(tool_path, F_OK) != 0)
|
||||
die("Can't find '%s'", tool_path);
|
||||
verbose("Looking for '%s' as: %s", tool_name, tool_executable_name);
|
||||
|
||||
/*
|
||||
Make sure it can be executed
|
||||
*/
|
||||
if (run_tool(tool_path,
|
||||
if (run_tool(tool_executable_name,
|
||||
&ds_tmp, /* Get output from command, discard*/
|
||||
"--help",
|
||||
"2>&1",
|
||||
IF_WIN("> NUL", "> /dev/null"),
|
||||
NULL))
|
||||
die("Can't execute '%s'", tool_path);
|
||||
die("Can't execute '%s'", tool_executable_name);
|
||||
|
||||
dynstr_free(&ds_tmp);
|
||||
|
||||
@ -759,11 +723,20 @@ static const char *load_default_groups[]=
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char self_name[FN_REFLEN];
|
||||
|
||||
MY_INIT(argv[0]);
|
||||
#ifdef __NETWARE__
|
||||
setscreenmode(SCR_AUTOCLOSE_ON_EXIT);
|
||||
#endif
|
||||
|
||||
#if __WIN__
|
||||
if (GetModuleFileName(NULL, self_name, FN_REFLEN) == 0)
|
||||
#endif
|
||||
{
|
||||
strncpy(self_name, argv[0], FN_REFLEN);
|
||||
}
|
||||
|
||||
if (init_dynamic_string(&ds_args, "", 512, 256))
|
||||
die("Out of memory");
|
||||
|
||||
@ -789,10 +762,10 @@ int main(int argc, char **argv)
|
||||
dynstr_append(&ds_args, " ");
|
||||
|
||||
/* Find mysql */
|
||||
find_tool(mysql_path, IF_WIN("mysql.exe", "mysql"));
|
||||
find_tool(mysql_path, IF_WIN("mysql.exe", "mysql"), self_name);
|
||||
|
||||
/* Find mysqlcheck */
|
||||
find_tool(mysqlcheck_path, IF_WIN("mysqlcheck.exe", "mysqlcheck"));
|
||||
find_tool(mysqlcheck_path, IF_WIN("mysqlcheck.exe", "mysqlcheck"), self_name);
|
||||
|
||||
/*
|
||||
Read the mysql_upgrade_info file to check if mysql_upgrade
|
||||
|
@ -64,7 +64,8 @@ static void warning(const char *format, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||
|
||||
static bool one_database=0, to_last_remote_log= 0, disable_log_bin= 0;
|
||||
static bool opt_hexdump= 0;
|
||||
const char *base64_output_mode_names[]= {"NEVER", "AUTO", "ALWAYS", NullS};
|
||||
const char *base64_output_mode_names[]=
|
||||
{"NEVER", "AUTO", "ALWAYS", "UNSPEC", "DECODE-ROWS", NullS};
|
||||
TYPELIB base64_output_mode_typelib=
|
||||
{ array_elements(base64_output_mode_names) - 1, "",
|
||||
base64_output_mode_names, NULL };
|
||||
@ -83,6 +84,8 @@ static const char* user = 0;
|
||||
static char* pass = 0;
|
||||
static char *charset= 0;
|
||||
|
||||
static uint verbose= 0;
|
||||
|
||||
static ulonglong start_position, stop_position;
|
||||
#define start_position_mot ((my_off_t)start_position)
|
||||
#define stop_position_mot ((my_off_t)stop_position)
|
||||
@ -1063,6 +1066,9 @@ that may lead to an endless loop.",
|
||||
{"user", 'u', "Connect to the remote server as username.",
|
||||
(uchar**) &user, (uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"verbose", 'v', "Reconstruct SQL statements out of row events. "
|
||||
"-v -v adds comments on column data types",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
|
||||
0, 0, 0, 0, 0},
|
||||
{"open_files_limit", OPT_OPEN_FILES_LIMIT,
|
||||
@ -1258,6 +1264,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
||||
(find_type_or_exit(argument, &base64_output_mode_typelib, opt->name)-1);
|
||||
}
|
||||
break;
|
||||
case 'v':
|
||||
if (argument == disabled_my_option)
|
||||
verbose= 0;
|
||||
else
|
||||
verbose++;
|
||||
break;
|
||||
case 'V':
|
||||
print_version();
|
||||
exit(0);
|
||||
@ -1343,6 +1355,8 @@ static Exit_status dump_log_entries(const char* logname)
|
||||
*/
|
||||
fprintf(result_file, "DELIMITER /*!*/;\n");
|
||||
strmov(print_event_info.delimiter, "/*!*/;");
|
||||
|
||||
print_event_info.verbose= short_form ? 0 : verbose;
|
||||
|
||||
rc= (remote_opt ? dump_remote_log_entries(&print_event_info, logname) :
|
||||
dump_local_log_entries(&print_event_info, logname));
|
||||
|
@ -2396,8 +2396,15 @@ static uint get_table_structure(char *table, char *db, char *table_type,
|
||||
fprintf(sql_file, ",\n %s %s",
|
||||
quote_name(row[0], name_buff, 0), row[1]);
|
||||
}
|
||||
|
||||
/*
|
||||
Stand-in tables are always MyISAM tables as the default
|
||||
engine might have a column-limit that's lower than the
|
||||
number of columns in the view, and MyISAM support is
|
||||
guaranteed to be in the server anyway.
|
||||
*/
|
||||
fprintf(sql_file,
|
||||
"\n) */;\n"
|
||||
"\n) ENGINE=MyISAM */;\n"
|
||||
"SET character_set_client = @saved_cs_client;\n");
|
||||
|
||||
check_io(sql_file);
|
||||
|
@ -48,7 +48,15 @@
|
||||
#ifdef __WIN__
|
||||
#include <direct.h>
|
||||
#endif
|
||||
#include <signal.h>
|
||||
#include <my_stacktrace.h>
|
||||
|
||||
#ifdef __WIN__
|
||||
#include <crtdbg.h>
|
||||
#define SIGNAL_FMT "exception 0x%x"
|
||||
#else
|
||||
#define SIGNAL_FMT "signal %d"
|
||||
#endif
|
||||
|
||||
/* Use cygwin for --exec and --system before 5.0 */
|
||||
#if MYSQL_VERSION_ID < 50000
|
||||
@ -163,6 +171,8 @@ static ulonglong timer_now(void);
|
||||
|
||||
static ulonglong progress_start= 0;
|
||||
|
||||
static ulong connection_retry_sleep= 100000; /* Microseconds */
|
||||
|
||||
/* Precompiled re's */
|
||||
static my_regex_t ps_re; /* the query can be run using PS protocol */
|
||||
static my_regex_t sp_re; /* the query can be run as a SP */
|
||||
@ -214,6 +224,7 @@ struct st_connection
|
||||
/* Used when creating views and sp, to avoid implicit commit */
|
||||
MYSQL* util_mysql;
|
||||
char *name;
|
||||
size_t name_len;
|
||||
MYSQL_STMT* stmt;
|
||||
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
@ -267,7 +278,8 @@ enum enum_commands {
|
||||
Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST,
|
||||
Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT, Q_SKIP,
|
||||
Q_CHMOD_FILE, Q_APPEND_FILE, Q_CAT_FILE, Q_DIFF_FILES,
|
||||
Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR,
|
||||
Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR, Q_LIST_FILES,
|
||||
Q_LIST_FILES_WRITE_FILE, Q_LIST_FILES_APPEND_FILE,
|
||||
|
||||
Q_UNKNOWN, /* Unknown command. */
|
||||
Q_COMMENT, /* Comments, ignored. */
|
||||
@ -359,6 +371,9 @@ const char *command_names[]=
|
||||
"change_user",
|
||||
"mkdir",
|
||||
"rmdir",
|
||||
"list_files",
|
||||
"list_files_write_file",
|
||||
"list_files_append_file",
|
||||
|
||||
0
|
||||
};
|
||||
@ -482,6 +497,9 @@ void replace_dynstr_append(DYNAMIC_STRING *ds, const char *val);
|
||||
void replace_dynstr_append_uint(DYNAMIC_STRING *ds, uint val);
|
||||
void dynstr_append_sorted(DYNAMIC_STRING* ds, DYNAMIC_STRING* ds_input);
|
||||
|
||||
static int match_expected_error(struct st_command *command,
|
||||
unsigned int err_errno,
|
||||
const char *err_sqlstate);
|
||||
void handle_error(struct st_command*,
|
||||
unsigned int err_errno, const char *err_error,
|
||||
const char *err_sqlstate, DYNAMIC_STRING *ds);
|
||||
@ -835,29 +853,25 @@ void check_command_args(struct st_command *command,
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
void handle_command_error(struct st_command *command, uint error)
|
||||
{
|
||||
DBUG_ENTER("handle_command_error");
|
||||
DBUG_PRINT("enter", ("error: %d", error));
|
||||
if (error != 0)
|
||||
{
|
||||
uint i;
|
||||
int i;
|
||||
|
||||
if (command->abort_on_error)
|
||||
die("command \"%.*s\" failed with error %d",
|
||||
command->first_word_len, command->query, error);
|
||||
for (i= 0; i < command->expected_errors.count; i++)
|
||||
|
||||
i= match_expected_error(command, error, NULL);
|
||||
|
||||
if (i >= 0)
|
||||
{
|
||||
DBUG_PRINT("info", ("expected error: %d",
|
||||
command->expected_errors.err[i].code.errnum));
|
||||
if ((command->expected_errors.err[i].type == ERR_ERRNO) &&
|
||||
(command->expected_errors.err[i].code.errnum == error))
|
||||
{
|
||||
DBUG_PRINT("info", ("command \"%.*s\" failed with expected error: %d",
|
||||
command->first_word_len, command->query, error));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
DBUG_PRINT("info", ("command \"%.*s\" failed with expected error: %d",
|
||||
command->first_word_len, command->query, error));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
die("command \"%.*s\" failed with wrong error: %d",
|
||||
command->first_word_len, command->query, error);
|
||||
@ -2452,8 +2466,8 @@ void do_exec(struct st_command *command)
|
||||
error= pclose(res_file);
|
||||
if (error > 0)
|
||||
{
|
||||
uint status= WEXITSTATUS(error), i;
|
||||
my_bool ok= 0;
|
||||
uint status= WEXITSTATUS(error);
|
||||
int i;
|
||||
|
||||
if (command->abort_on_error)
|
||||
{
|
||||
@ -2465,19 +2479,13 @@ void do_exec(struct st_command *command)
|
||||
|
||||
DBUG_PRINT("info",
|
||||
("error: %d, status: %d", error, status));
|
||||
for (i= 0; i < command->expected_errors.count; i++)
|
||||
{
|
||||
DBUG_PRINT("info", ("expected error: %d",
|
||||
command->expected_errors.err[i].code.errnum));
|
||||
if ((command->expected_errors.err[i].type == ERR_ERRNO) &&
|
||||
(command->expected_errors.err[i].code.errnum == status))
|
||||
{
|
||||
ok= 1;
|
||||
DBUG_PRINT("info", ("command \"%s\" failed with expected error: %d",
|
||||
command->first_argument, status));
|
||||
}
|
||||
}
|
||||
if (!ok)
|
||||
|
||||
i= match_expected_error(command, status, NULL);
|
||||
|
||||
if (i >= 0)
|
||||
DBUG_PRINT("info", ("command \"%s\" failed with expected error: %d",
|
||||
command->first_argument, status));
|
||||
else
|
||||
{
|
||||
dynstr_free(&ds_cmd);
|
||||
die("command \"%s\" failed with wrong error: %d",
|
||||
@ -2827,6 +2835,126 @@ void do_rmdir(struct st_command *command)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
get_list_files
|
||||
ds output
|
||||
ds_dirname dir to list
|
||||
ds_wild wild-card file pattern (can be empty)
|
||||
|
||||
DESCRIPTION
|
||||
list all entries in directory (matching ds_wild if given)
|
||||
*/
|
||||
|
||||
static int get_list_files(DYNAMIC_STRING *ds, const DYNAMIC_STRING *ds_dirname,
|
||||
const DYNAMIC_STRING *ds_wild)
|
||||
{
|
||||
uint i;
|
||||
MY_DIR *dir_info;
|
||||
FILEINFO *file;
|
||||
DBUG_ENTER("get_list_files");
|
||||
|
||||
DBUG_PRINT("info", ("listing directory: %s", ds_dirname->str));
|
||||
/* Note that my_dir sorts the list if not given any flags */
|
||||
if (!(dir_info= my_dir(ds_dirname->str, MYF(0))))
|
||||
DBUG_RETURN(1);
|
||||
for (i= 0; i < (uint) dir_info->number_off_files; i++)
|
||||
{
|
||||
file= dir_info->dir_entry + i;
|
||||
if (file->name[0] == '.' &&
|
||||
(file->name[1] == '\0' ||
|
||||
(file->name[1] == '.' && file->name[2] == '\0')))
|
||||
continue; /* . or .. */
|
||||
if (ds_wild && ds_wild->length &&
|
||||
wild_compare(file->name, ds_wild->str, 0))
|
||||
continue;
|
||||
dynstr_append(ds, file->name);
|
||||
dynstr_append(ds, "\n");
|
||||
}
|
||||
my_dirend(dir_info);
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
do_list_files
|
||||
command called command
|
||||
|
||||
DESCRIPTION
|
||||
list_files <dir_name> [<file_name>]
|
||||
List files and directories in directory <dir_name> (like `ls`)
|
||||
[Matching <file_name>, where wild-cards are allowed]
|
||||
*/
|
||||
|
||||
static void do_list_files(struct st_command *command)
|
||||
{
|
||||
int error;
|
||||
static DYNAMIC_STRING ds_dirname;
|
||||
static DYNAMIC_STRING ds_wild;
|
||||
const struct command_arg list_files_args[] = {
|
||||
{"dirname", ARG_STRING, TRUE, &ds_dirname, "Directory to list"},
|
||||
{"file", ARG_STRING, FALSE, &ds_wild, "Filename (incl. wildcard)"}
|
||||
};
|
||||
DBUG_ENTER("do_list_files");
|
||||
|
||||
check_command_args(command, command->first_argument,
|
||||
list_files_args,
|
||||
sizeof(list_files_args)/sizeof(struct command_arg), ' ');
|
||||
|
||||
error= get_list_files(&ds_res, &ds_dirname, &ds_wild);
|
||||
handle_command_error(command, error);
|
||||
dynstr_free(&ds_dirname);
|
||||
dynstr_free(&ds_wild);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
do_list_files_write_file_command
|
||||
command called command
|
||||
append append file, or create new
|
||||
|
||||
DESCRIPTION
|
||||
list_files_{write|append}_file <filename> <dir_name> [<match_file>]
|
||||
List files and directories in directory <dir_name> (like `ls`)
|
||||
[Matching <match_file>, where wild-cards are allowed]
|
||||
|
||||
Note: File will be truncated if exists and append is not true.
|
||||
*/
|
||||
|
||||
static void do_list_files_write_file_command(struct st_command *command,
|
||||
my_bool append)
|
||||
{
|
||||
int error;
|
||||
static DYNAMIC_STRING ds_content;
|
||||
static DYNAMIC_STRING ds_filename;
|
||||
static DYNAMIC_STRING ds_dirname;
|
||||
static DYNAMIC_STRING ds_wild;
|
||||
const struct command_arg list_files_args[] = {
|
||||
{"filename", ARG_STRING, TRUE, &ds_filename, "Filename for write"},
|
||||
{"dirname", ARG_STRING, TRUE, &ds_dirname, "Directory to list"},
|
||||
{"file", ARG_STRING, FALSE, &ds_wild, "Filename (incl. wildcard)"}
|
||||
};
|
||||
DBUG_ENTER("do_list_files_write_file");
|
||||
|
||||
check_command_args(command, command->first_argument,
|
||||
list_files_args,
|
||||
sizeof(list_files_args)/sizeof(struct command_arg), ' ');
|
||||
|
||||
init_dynamic_string(&ds_content, "", 1024, 1024);
|
||||
error= get_list_files(&ds_content, &ds_dirname, &ds_wild);
|
||||
handle_command_error(command, error);
|
||||
str_to_file2(ds_filename.str, ds_content.str, ds_content.length, append);
|
||||
dynstr_free(&ds_content);
|
||||
dynstr_free(&ds_filename);
|
||||
dynstr_free(&ds_dirname);
|
||||
dynstr_free(&ds_wild);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Read characters from line buffer or file. This is needed to allow
|
||||
my_ungetc() to buffer MAX_DELIMITER_LENGTH characters for a file
|
||||
@ -4157,7 +4285,6 @@ void safe_connect(MYSQL* mysql, const char *name, const char *host,
|
||||
int port, const char *sock)
|
||||
{
|
||||
int failed_attempts= 0;
|
||||
static ulong connection_retry_sleep= 100000; /* Microseconds */
|
||||
|
||||
DBUG_ENTER("safe_connect");
|
||||
while(!mysql_real_connect(mysql, host,user, pass, db, port, sock,
|
||||
@ -4224,6 +4351,7 @@ int connect_n_handle_errors(struct st_command *command,
|
||||
const char* db, int port, const char* sock)
|
||||
{
|
||||
DYNAMIC_STRING *ds;
|
||||
int failed_attempts= 0;
|
||||
|
||||
ds= &ds_res;
|
||||
|
||||
@ -4252,9 +4380,41 @@ int connect_n_handle_errors(struct st_command *command,
|
||||
dynstr_append_mem(ds, delimiter, delimiter_length);
|
||||
dynstr_append_mem(ds, "\n", 1);
|
||||
}
|
||||
if (!mysql_real_connect(con, host, user, pass, db, port, sock ? sock: 0,
|
||||
while (!mysql_real_connect(con, host, user, pass, db, port, sock ? sock: 0,
|
||||
CLIENT_MULTI_STATEMENTS))
|
||||
{
|
||||
/*
|
||||
If we have used up all our connections check whether this
|
||||
is expected (by --error). If so, handle the error right away.
|
||||
Otherwise, give it some extra time to rule out race-conditions.
|
||||
If extra-time doesn't help, we have an unexpected error and
|
||||
must abort -- just proceeding to handle_error() when second
|
||||
and third chances are used up will handle that for us.
|
||||
|
||||
There are various user-limits of which only max_user_connections
|
||||
and max_connections_per_hour apply at connect time. For the
|
||||
the second to create a race in our logic, we'd need a limits
|
||||
test that runs without a FLUSH for longer than an hour, so we'll
|
||||
stay clear of trying to work out which exact user-limit was
|
||||
exceeded.
|
||||
*/
|
||||
|
||||
if (((mysql_errno(con) == ER_TOO_MANY_USER_CONNECTIONS) ||
|
||||
(mysql_errno(con) == ER_USER_LIMIT_REACHED)) &&
|
||||
(failed_attempts++ < opt_max_connect_retries))
|
||||
{
|
||||
int i;
|
||||
|
||||
i= match_expected_error(command, mysql_errno(con), mysql_sqlstate(con));
|
||||
|
||||
if (i >= 0)
|
||||
goto do_handle_error; /* expected error, handle */
|
||||
|
||||
my_sleep(connection_retry_sleep); /* unexpected error, wait */
|
||||
continue; /* and give it 1 more chance */
|
||||
}
|
||||
|
||||
do_handle_error:
|
||||
var_set_errno(mysql_errno(con));
|
||||
handle_error(command, mysql_errno(con), mysql_error(con),
|
||||
mysql_sqlstate(con), ds);
|
||||
@ -4436,6 +4596,7 @@ void do_connect(struct st_command *command)
|
||||
ds_connection_name.str));
|
||||
if (!(con_slot->name= my_strdup(ds_connection_name.str, MYF(MY_WME))))
|
||||
die("Out of memory");
|
||||
con_slot->name_len= strlen(con_slot->name);
|
||||
cur_con= con_slot;
|
||||
|
||||
if (con_slot == next_con)
|
||||
@ -6015,6 +6176,56 @@ end:
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Check whether given error is in list of expected errors
|
||||
|
||||
SYNOPSIS
|
||||
match_expected_error()
|
||||
|
||||
PARAMETERS
|
||||
command the current command (and its expect-list)
|
||||
err_errno error number of the error that actually occurred
|
||||
err_sqlstate SQL-state that was thrown, or NULL for impossible
|
||||
(file-ops, diff, etc.)
|
||||
|
||||
RETURNS
|
||||
-1 for not in list, index in list of expected errors otherwise
|
||||
|
||||
NOTE
|
||||
If caller needs to know whether the list was empty, they should
|
||||
check command->expected_errors.count.
|
||||
*/
|
||||
|
||||
static int match_expected_error(struct st_command *command,
|
||||
unsigned int err_errno,
|
||||
const char *err_sqlstate)
|
||||
{
|
||||
uint i;
|
||||
|
||||
for (i= 0 ; (uint) i < command->expected_errors.count ; i++)
|
||||
{
|
||||
if ((command->expected_errors.err[i].type == ERR_ERRNO) &&
|
||||
(command->expected_errors.err[i].code.errnum == err_errno))
|
||||
return i;
|
||||
|
||||
if (command->expected_errors.err[i].type == ERR_SQLSTATE)
|
||||
{
|
||||
/*
|
||||
NULL is quite likely, but not in conjunction with a SQL-state expect!
|
||||
*/
|
||||
if (unlikely(err_sqlstate == NULL))
|
||||
die("expecting a SQL-state (%s) from query '%s' which cannot produce one...",
|
||||
command->expected_errors.err[i].code.sqlstate, command->query);
|
||||
|
||||
if (strncmp(command->expected_errors.err[i].code.sqlstate,
|
||||
err_sqlstate, SQLSTATE_LENGTH) == 0)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Handle errors which occurred during execution
|
||||
|
||||
@ -6035,7 +6246,7 @@ void handle_error(struct st_command *command,
|
||||
unsigned int err_errno, const char *err_error,
|
||||
const char *err_sqlstate, DYNAMIC_STRING *ds)
|
||||
{
|
||||
uint i;
|
||||
int i;
|
||||
|
||||
DBUG_ENTER("handle_error");
|
||||
|
||||
@ -6061,34 +6272,30 @@ void handle_error(struct st_command *command,
|
||||
|
||||
DBUG_PRINT("info", ("expected_errors.count: %d",
|
||||
command->expected_errors.count));
|
||||
for (i= 0 ; (uint) i < command->expected_errors.count ; i++)
|
||||
|
||||
i= match_expected_error(command, err_errno, err_sqlstate);
|
||||
|
||||
if (i >= 0)
|
||||
{
|
||||
if (((command->expected_errors.err[i].type == ERR_ERRNO) &&
|
||||
(command->expected_errors.err[i].code.errnum == err_errno)) ||
|
||||
((command->expected_errors.err[i].type == ERR_SQLSTATE) &&
|
||||
(strncmp(command->expected_errors.err[i].code.sqlstate,
|
||||
err_sqlstate, SQLSTATE_LENGTH) == 0)))
|
||||
if (!disable_result_log)
|
||||
{
|
||||
if (!disable_result_log)
|
||||
if (command->expected_errors.count == 1)
|
||||
{
|
||||
if (command->expected_errors.count == 1)
|
||||
{
|
||||
/* Only log error if there is one possible error */
|
||||
dynstr_append_mem(ds, "ERROR ", 6);
|
||||
replace_dynstr_append(ds, err_sqlstate);
|
||||
dynstr_append_mem(ds, ": ", 2);
|
||||
replace_dynstr_append(ds, err_error);
|
||||
dynstr_append_mem(ds,"\n",1);
|
||||
}
|
||||
/* Don't log error if we may not get an error */
|
||||
else if (command->expected_errors.err[0].type == ERR_SQLSTATE ||
|
||||
(command->expected_errors.err[0].type == ERR_ERRNO &&
|
||||
command->expected_errors.err[0].code.errnum != 0))
|
||||
dynstr_append(ds,"Got one of the listed errors\n");
|
||||
/* Only log error if there is one possible error */
|
||||
dynstr_append_mem(ds, "ERROR ", 6);
|
||||
replace_dynstr_append(ds, err_sqlstate);
|
||||
dynstr_append_mem(ds, ": ", 2);
|
||||
replace_dynstr_append(ds, err_error);
|
||||
dynstr_append_mem(ds,"\n",1);
|
||||
}
|
||||
/* OK */
|
||||
DBUG_VOID_RETURN;
|
||||
/* Don't log error if we may not get an error */
|
||||
else if (command->expected_errors.err[0].type == ERR_SQLSTATE ||
|
||||
(command->expected_errors.err[0].type == ERR_ERRNO &&
|
||||
command->expected_errors.err[0].code.errnum != 0))
|
||||
dynstr_append(ds,"Got one of the listed errors\n");
|
||||
}
|
||||
/* OK */
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
DBUG_PRINT("info",("i: %d expected_errors: %d", i,
|
||||
@ -6103,7 +6310,7 @@ void handle_error(struct st_command *command,
|
||||
dynstr_append_mem(ds, "\n", 1);
|
||||
}
|
||||
|
||||
if (i)
|
||||
if (command->expected_errors.count > 0)
|
||||
{
|
||||
if (command->expected_errors.err[0].type == ERR_ERRNO)
|
||||
die("query '%s' failed with wrong errno %d: '%s', instead of %d...",
|
||||
@ -6838,6 +7045,104 @@ void mark_progress(struct st_command* command __attribute__((unused)),
|
||||
|
||||
}
|
||||
|
||||
#ifdef HAVE_STACKTRACE
|
||||
|
||||
static void dump_backtrace(void)
|
||||
{
|
||||
struct st_connection *conn= cur_con;
|
||||
|
||||
my_safe_print_str("read_command_buf", read_command_buf,
|
||||
sizeof(read_command_buf));
|
||||
if (conn)
|
||||
{
|
||||
my_safe_print_str("conn->name", conn->name, conn->name_len);
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
my_safe_print_str("conn->cur_query", conn->cur_query, conn->cur_query_len);
|
||||
#endif
|
||||
}
|
||||
fputs("Attempting backtrace...\n", stderr);
|
||||
my_print_stacktrace(NULL, my_thread_stack_size);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void dump_backtrace(void)
|
||||
{
|
||||
fputs("Backtrace not available.\n", stderr);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static sig_handler signal_handler(int sig)
|
||||
{
|
||||
fprintf(stderr, "mysqltest got " SIGNAL_FMT "\n", sig);
|
||||
dump_backtrace();
|
||||
}
|
||||
|
||||
#ifdef __WIN__
|
||||
|
||||
LONG WINAPI exception_filter(EXCEPTION_POINTERS *exp)
|
||||
{
|
||||
__try
|
||||
{
|
||||
my_set_exception_pointers(exp);
|
||||
signal_handler(exp->ExceptionRecord->ExceptionCode);
|
||||
}
|
||||
__except(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
fputs("Got exception in exception handler!\n", stderr);
|
||||
}
|
||||
|
||||
return EXCEPTION_CONTINUE_SEARCH;
|
||||
}
|
||||
|
||||
|
||||
static void init_signal_handling(void)
|
||||
{
|
||||
UINT mode;
|
||||
|
||||
/* Set output destination of messages to the standard error stream. */
|
||||
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
|
||||
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
|
||||
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
|
||||
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
|
||||
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
|
||||
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
|
||||
|
||||
/* Do not not display the a error message box. */
|
||||
mode= SetErrorMode(0) | SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX;
|
||||
SetErrorMode(mode);
|
||||
|
||||
SetUnhandledExceptionFilter(exception_filter);
|
||||
}
|
||||
|
||||
#else /* __WIN__ */
|
||||
|
||||
static void init_signal_handling(void)
|
||||
{
|
||||
struct sigaction sa;
|
||||
DBUG_ENTER("init_signal_handling");
|
||||
|
||||
#ifdef HAVE_STACKTRACE
|
||||
my_init_stacktrace();
|
||||
#endif
|
||||
|
||||
sa.sa_flags = SA_RESETHAND | SA_NODEFER;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sigprocmask(SIG_SETMASK, &sa.sa_mask, NULL);
|
||||
|
||||
sa.sa_handler= signal_handler;
|
||||
|
||||
sigaction(SIGSEGV, &sa, NULL);
|
||||
sigaction(SIGABRT, &sa, NULL);
|
||||
#ifdef SIGBUS
|
||||
sigaction(SIGBUS, &sa, NULL);
|
||||
#endif
|
||||
sigaction(SIGILL, &sa, NULL);
|
||||
sigaction(SIGFPE, &sa, NULL);
|
||||
}
|
||||
|
||||
#endif /* !__WIN__ */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
@ -6851,6 +7156,8 @@ int main(int argc, char **argv)
|
||||
save_file[0]= 0;
|
||||
TMPDIR[0]= 0;
|
||||
|
||||
init_signal_handling();
|
||||
|
||||
/* Init expected errors */
|
||||
memset(&saved_expected_errors, 0, sizeof(saved_expected_errors));
|
||||
|
||||
@ -7037,6 +7344,13 @@ int main(int argc, char **argv)
|
||||
case Q_REMOVE_FILE: do_remove_file(command); break;
|
||||
case Q_MKDIR: do_mkdir(command); break;
|
||||
case Q_RMDIR: do_rmdir(command); break;
|
||||
case Q_LIST_FILES: do_list_files(command); break;
|
||||
case Q_LIST_FILES_WRITE_FILE:
|
||||
do_list_files_write_file_command(command, FALSE);
|
||||
break;
|
||||
case Q_LIST_FILES_APPEND_FILE:
|
||||
do_list_files_write_file_command(command, TRUE);
|
||||
break;
|
||||
case Q_FILE_EXIST: do_file_exist(command); break;
|
||||
case Q_WRITE_FILE: do_write_file(command); break;
|
||||
case Q_APPEND_FILE: do_append_file(command); break;
|
||||
|
@ -343,8 +343,8 @@ case $default_charset in
|
||||
default_charset_default_collation="ucs2_general_ci"
|
||||
define(UCSC1, ucs2_general_ci ucs2_bin)
|
||||
define(UCSC2, ucs2_czech_ci ucs2_danish_ci)
|
||||
define(UCSC3, ucs2_esperanto_ci ucs2_estonian_ci ucs2_icelandic_ci)
|
||||
define(UCSC4, ucs2_latvian_ci ucs2_lithuanian_ci)
|
||||
define(UCSC3, ucs2_esperanto_ci ucs2_estonian_ci ucs2_hungarian_ci)
|
||||
define(UCSC4, ucs2_icelandic_ci ucs2_latvian_ci ucs2_lithuanian_ci)
|
||||
define(UCSC5, ucs2_persian_ci ucs2_polish_ci ucs2_romanian_ci)
|
||||
define(UCSC6, ucs2_slovak_ci ucs2_slovenian_ci)
|
||||
define(UCSC7, ucs2_spanish2_ci ucs2_spanish_ci)
|
||||
@ -367,8 +367,8 @@ case $default_charset in
|
||||
else
|
||||
define(UTFC1, utf8_general_ci utf8_bin)
|
||||
define(UTFC2, utf8_czech_ci utf8_danish_ci)
|
||||
define(UTFC3, utf8_esperanto_ci utf8_estonian_ci utf8_icelandic_ci)
|
||||
define(UTFC4, utf8_latvian_ci utf8_lithuanian_ci)
|
||||
define(UTFC3, utf8_esperanto_ci utf8_estonian_ci utf8_hungarian_ci)
|
||||
define(UTFC4, utf8_icelandic_ci utf8_latvian_ci utf8_lithuanian_ci)
|
||||
define(UTFC5, utf8_persian_ci utf8_polish_ci utf8_romanian_ci)
|
||||
define(UTFC6, utf8_slovak_ci utf8_slovenian_ci)
|
||||
define(UTFC7, utf8_spanish2_ci utf8_spanish_ci)
|
||||
|
102
configure.in
102
configure.in
@ -10,7 +10,7 @@ AC_CANONICAL_SYSTEM
|
||||
#
|
||||
# When changing major version number please also check switch statement
|
||||
# in mysqlbinlog::check_master_version().
|
||||
AM_INIT_AUTOMAKE(mysql, 5.1.26-rc)
|
||||
AM_INIT_AUTOMAKE(mysql, 5.1.30)
|
||||
AM_CONFIG_HEADER([include/config.h:config.h.in])
|
||||
|
||||
PROTOCOL_VERSION=10
|
||||
@ -419,6 +419,7 @@ AC_PATH_PROG(SED, sed, sed)
|
||||
AC_PATH_PROG(CMP, cmp, cmp)
|
||||
AC_PATH_PROG(CHMOD, chmod, chmod)
|
||||
AC_PATH_PROG(HOSTNAME, hostname, hostname)
|
||||
AC_PATH_PROG(DIFF, diff, diff)
|
||||
# Check for a GNU tar named 'gtar', or 'gnutar' (MacOS X) and
|
||||
# fall back to 'tar' otherwise and hope that it's a GNU tar as well
|
||||
AC_CHECK_PROGS(TAR, gnutar gtar tar)
|
||||
@ -443,66 +444,61 @@ AC_SUBST(HOSTNAME)
|
||||
AC_SUBST(PERL)
|
||||
AC_SUBST(PERL5)
|
||||
|
||||
# icheck, used for ABI check
|
||||
AC_PATH_PROG(ICHECK, icheck, no)
|
||||
# "icheck" is also the name of a file system check program on Tru64.
|
||||
# Verify the program found is really the interface checker.
|
||||
if test "x$ICHECK" != "xno"
|
||||
then
|
||||
AC_MSG_CHECKING(if $ICHECK works as expected)
|
||||
echo "int foo;" > conftest.h
|
||||
$ICHECK --canonify -o conftest.ic conftest.h 2>/dev/null
|
||||
if test -f "conftest.ic"
|
||||
then
|
||||
AC_MSG_RESULT(yes)
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
ICHECK=no
|
||||
fi
|
||||
rm -f conftest.ic conftest.h
|
||||
fi
|
||||
AC_SUBST(ICHECK)
|
||||
# Enable the abi_check rule only if gcc is available
|
||||
|
||||
# Lock for PS
|
||||
if expr "$CC" : ".*gcc.*"
|
||||
then
|
||||
ABI_CHECK="abi_check"
|
||||
else
|
||||
ABI_CHECK=""
|
||||
fi
|
||||
|
||||
AC_SUBST(ABI_CHECK)
|
||||
|
||||
# Look for PS usage. We use double dollar-signs in FIND_PROC because this
|
||||
# value is written to a makefile, which interprets away one level of
|
||||
# dollar-signs. So, interpretation stages are m4 and then shell in autoconf,
|
||||
# then Make, then shell. The autoconf substitution uses single quotes, so
|
||||
# no unprotected single quotes should appear in the expression.
|
||||
AC_PATH_PROG(PS, ps, ps)
|
||||
AC_MSG_CHECKING("how to check if pid exists")
|
||||
PS=$ac_cv_path_PS
|
||||
# Linux style
|
||||
if $PS p $$ 2> /dev/null | grep `echo $0 | sed s/\-//` > /dev/null
|
||||
if $PS wwwp $$ 2> /dev/null | grep -- "$0" > /dev/null
|
||||
then
|
||||
FIND_PROC="$PS p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
|
||||
FIND_PROC="$PS wwwp \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null"
|
||||
# Solaris
|
||||
elif $PS -fp $$ 2> /dev/null | grep $0 > /dev/null
|
||||
elif $PS -fp $$ 2> /dev/null | grep -- $0 > /dev/null
|
||||
then
|
||||
FIND_PROC="$PS -p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
|
||||
FIND_PROC="$PS -p \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null"
|
||||
# BSD style
|
||||
elif $PS -uaxww 2> /dev/null | grep $0 > /dev/null
|
||||
elif $PS -uaxww 2> /dev/null | grep -- $0 > /dev/null
|
||||
then
|
||||
FIND_PROC="$PS -uaxww | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
|
||||
FIND_PROC="$PS -uaxww | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null"
|
||||
# SysV style
|
||||
elif $PS -ef 2> /dev/null | grep $0 > /dev/null
|
||||
elif $PS -ef 2> /dev/null | grep -- $0 > /dev/null
|
||||
then
|
||||
FIND_PROC="$PS -ef | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
|
||||
FIND_PROC="$PS -ef | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null"
|
||||
# Do anybody use this?
|
||||
elif $PS $$ 2> /dev/null | grep $0 > /dev/null
|
||||
elif $PS $$ 2> /dev/null | grep -- $0 > /dev/null
|
||||
then
|
||||
FIND_PROC="$PS \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
|
||||
FIND_PROC="$PS \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null"
|
||||
else
|
||||
case $SYSTEM_TYPE in
|
||||
*freebsd*|*dragonfly*)
|
||||
FIND_PROC="$PS p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
|
||||
FIND_PROC="$PS p \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null"
|
||||
;;
|
||||
*darwin*)
|
||||
FIND_PROC="$PS -uaxww | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
|
||||
FIND_PROC="$PS -uaxww | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null"
|
||||
;;
|
||||
*cygwin*)
|
||||
FIND_PROC="$PS -e | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
|
||||
FIND_PROC="$PS -e | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null"
|
||||
;;
|
||||
*netware*)
|
||||
FIND_PROC=
|
||||
;;
|
||||
*)
|
||||
AC_MSG_ERROR([Could not find the right ps switches. Which OS is this ?. See the Installation chapter in the Reference Manual.])
|
||||
AC_MSG_ERROR([Could not find the right ps and/or grep switches. Which OS is this? See the Installation chapter in the Reference Manual.])
|
||||
esac
|
||||
fi
|
||||
AC_SUBST(FIND_PROC)
|
||||
@ -617,19 +613,19 @@ fi
|
||||
AC_MSG_CHECKING(whether features provided by the user community should be included.)
|
||||
AC_ARG_ENABLE(community-features,
|
||||
AC_HELP_STRING(
|
||||
[--enable-community-features],
|
||||
[Enable additional features provided by the user community.]),
|
||||
[--disable-community-features],
|
||||
[Disable additional features provided by the user community.]),
|
||||
[ ENABLE_COMMUNITY_FEATURES=$enableval ],
|
||||
[ ENABLE_COMMUNITY_FEATURES=no ]
|
||||
[ ENABLE_COMMUNITY_FEATURES=yes ]
|
||||
)
|
||||
|
||||
if test "$ENABLE_COMMUNITY_FEATURES" = "yes"
|
||||
then
|
||||
AC_DEFINE([COMMUNITY_SERVER], [1],
|
||||
[Whether features provided by the user community should be included])
|
||||
AC_MSG_RESULT([yes, community server])
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no, enterprise server])
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(server-suffix,
|
||||
@ -2341,10 +2337,31 @@ then
|
||||
fi
|
||||
AC_MSG_RESULT("$netinet_inc")
|
||||
|
||||
AC_CACHE_CHECK([support for weak symbols], mysql_cv_weak_symbol,
|
||||
[AC_TRY_LINK([],[
|
||||
extern void __attribute__((weak)) foo(void);
|
||||
], [mysql_cv_weak_symbol=yes], [mysql_cv_weak_symbol=no])])
|
||||
|
||||
if test "x$mysql_cv_weak_symbol" = xyes; then
|
||||
AC_DEFINE(HAVE_WEAK_SYMBOL, 1,
|
||||
[Define to 1 if compiler supports weak symbol attribute.])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([whether __bss_start is defined], mysql_cv_bss_start,
|
||||
[AC_TRY_LINK([],[
|
||||
extern char *__bss_start;
|
||||
return __bss_start ? 1 : 0;
|
||||
], [mysql_cv_bss_start=yes], [mysql_cv_bss_start=no])])
|
||||
|
||||
if test "x$mysql_cv_bss_start" = xyes; then
|
||||
AC_DEFINE(HAVE_BSS_START, 1,
|
||||
[Define to 1 if compiler defines __bss_start.])
|
||||
fi
|
||||
|
||||
AC_LANG_SAVE
|
||||
AC_LANG_CPLUSPLUS
|
||||
AC_CHECK_HEADERS(cxxabi.h)
|
||||
AC_CACHE_CHECK([checking for abi::__cxa_demangle], mysql_cv_cxa_demangle,
|
||||
AC_CACHE_CHECK([for abi::__cxa_demangle], mysql_cv_cxa_demangle,
|
||||
[AC_TRY_LINK([#include <cxxabi.h>], [
|
||||
char *foo= 0; int bar= 0;
|
||||
foo= abi::__cxa_demangle(foo, foo, 0, &bar);
|
||||
@ -2701,6 +2718,9 @@ then
|
||||
sql_server="vio sql"
|
||||
fi
|
||||
|
||||
# "innochecksum" is not in the "innobase/" subdirectory, but should be switched
|
||||
AM_CONDITIONAL([BUILD_INNODB_TOOLS], [test X"$with_plugin_innobase" = Xyes])
|
||||
|
||||
# IMPORTANT - do not modify LIBS past this line - this hack is the only way
|
||||
# I know to add the static NSS magic if we have static NSS libraries with
|
||||
# glibc - Sasha
|
||||
|
@ -43,7 +43,12 @@ $(top_builddir)/include/mysqld_ername.h: $(top_builddir)/include/mysqld_error.h
|
||||
$(top_builddir)/include/sql_state.h: $(top_builddir)/include/mysqld_error.h
|
||||
|
||||
bin_PROGRAMS = replace perror resolveip my_print_defaults \
|
||||
resolve_stack_dump mysql_waitpid innochecksum
|
||||
resolve_stack_dump mysql_waitpid
|
||||
# "innochecksum" should be switched
|
||||
if BUILD_INNODB_TOOLS
|
||||
bin_PROGRAMS += innochecksum
|
||||
endif
|
||||
|
||||
noinst_PROGRAMS = charset2html
|
||||
EXTRA_PROGRAMS = comp_err
|
||||
EXTRA_DIST = CMakeLists.txt
|
||||
|
@ -1,6 +1,5 @@
|
||||
SUBDIRS = taocrypt src testsuite
|
||||
EXTRA_DIST = yassl.dsp yassl.dsw yassl.vcproj \
|
||||
CMakeLists.txt
|
||||
EXTRA_DIST = CMakeLists.txt
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -1,5 +1,5 @@
|
||||
SUBDIRS = src test benchmark
|
||||
EXTRA_DIST = taocrypt.dsw taocrypt.dsp taocrypt.vcproj CMakeLists.txt $(wildcard mySTL/*.hpp)
|
||||
EXTRA_DIST = CMakeLists.txt $(wildcard mySTL/*.hpp)
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -1,268 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="taocrypt"
|
||||
SccProjectName=""
|
||||
SccLocalPath="">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\debug_obj"
|
||||
IntermediateDirectory=".\debug_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,mySTL"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
||||
ExceptionHandling="FALSE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\debug_obj/taocrypt.pch"
|
||||
AssemblerListingLocation=".\debug_obj/"
|
||||
ObjectFile=".\debug_obj/"
|
||||
ProgramDataBaseFileName=".\debug_obj/"
|
||||
BrowseInformation="1"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\debug_obj\taocrypt.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\release_obj"
|
||||
IntermediateDirectory=".\release_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,mySTL"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\release_obj/taocrypt.pch"
|
||||
AssemblerListingLocation=".\release_obj/"
|
||||
ObjectFile=".\release_obj/"
|
||||
ProgramDataBaseFileName=".\release_obj/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\release_obj\taocrypt.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="src\aes.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\aestables.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\algebra.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\arc4.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\asn.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\coding.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\des.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\dh.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\dsa.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\file.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\hash.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\integer.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\md2.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\md4.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\md5.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\misc.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\random.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\ripemd.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\rsa.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\sha.cpp">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="include\aes.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\algebra.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\arc4.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\asn.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\block.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\coding.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\des.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\dh.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\dsa.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\error.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\file.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\hash.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\hmac.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\integer.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\md2.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\md4.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\md5.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\misc.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\modarith.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\modes.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\random.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\ripemd.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\rsa.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\sha.hpp">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
@ -1,211 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="yassl"
|
||||
SccProjectName=""
|
||||
SccLocalPath="">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\debug_obj"
|
||||
IntermediateDirectory=".\debug_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,taocrypt\include,taocrypt\mySTL"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;YASSL_PREFIX"
|
||||
ExceptionHandling="FALSE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\debug_obj/yassl.pch"
|
||||
AssemblerListingLocation=".\debug_obj/"
|
||||
ObjectFile=".\debug_obj/"
|
||||
ProgramDataBaseFileName=".\debug_obj/"
|
||||
BrowseInformation="1"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\debug_obj\yassl.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\release_obj"
|
||||
IntermediateDirectory=".\release_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,taocrypt\include,taocrypt\mySTL"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;YASSL_PREFIX"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\release_obj/yassl.pch"
|
||||
AssemblerListingLocation=".\release_obj/"
|
||||
ObjectFile=".\release_obj/"
|
||||
ProgramDataBaseFileName=".\release_obj/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\release_obj\yassl.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="src\buffer.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\cert_wrapper.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\crypto_wrapper.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\handshake.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\lock.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\log.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\socket_wrapper.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\ssl.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\timer.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\yassl_error.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\yassl_imp.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\yassl_int.cpp">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="include\buffer.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\cert_wrapper.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\crypto_wrapper.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\factory.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\handshake.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\lock.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\log.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\socket_wrapper.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\timer.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_error.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_imp.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_int.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_types.hpp">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
@ -36,12 +36,13 @@ noinst_HEADERS = config-win.h config-netware.h my_bit.h \
|
||||
mysql_version.h.in my_handler.h my_time.h \
|
||||
my_vle.h my_user.h my_atomic.h atomic/nolock.h \
|
||||
atomic/rwlock.h atomic/x86-gcc.h atomic/x86-msvc.h \
|
||||
atomic/gcc_builtins.h my_libwrap.h
|
||||
atomic/gcc_builtins.h my_libwrap.h my_stacktrace.h
|
||||
|
||||
EXTRA_DIST = mysql.h.pp mysql/plugin.h.pp
|
||||
|
||||
# Remove built files and the symlinked directories
|
||||
CLEANFILES = $(BUILT_SOURCES) readline openssl
|
||||
|
||||
EXTRA_DIST = mysql_h.ic
|
||||
|
||||
# Some include files that may be moved and patched by configure
|
||||
DISTCLEANFILES = sched.h $(CLEANFILES)
|
||||
@ -63,18 +64,5 @@ my_config.h: config.h
|
||||
dist-hook:
|
||||
$(RM) -f $(distdir)/mysql_version.h $(distdir)/my_config.h
|
||||
|
||||
#
|
||||
# Rules for checking that ABI has not changed
|
||||
#
|
||||
|
||||
# Create a icheck file and compare it to the reference
|
||||
abi_check: $(HEADERS_ABI) mysql_version.h mysql_h.ic
|
||||
@set -ex; \
|
||||
if [ @ICHECK@ != no ] ; then \
|
||||
@ICHECK@ --canonify --skip-from-re /usr/ -o $@ $(HEADERS_ABI); \
|
||||
@ICHECK@ --compare mysql_h.ic $@; \
|
||||
fi; \
|
||||
touch abi_check;
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -21,6 +21,40 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
There was a problem on MacOSX with a shared object ha_example.so.
|
||||
It used hash_search(). During build of ha_example.so no libmysys
|
||||
was specified. Since MacOSX had a hash_search() in the system
|
||||
library, it built the shared object so that the dynamic linker
|
||||
linked hash_search() to the system library, which caused a crash
|
||||
when called. To come around this, we renamed hash_search() to
|
||||
my_hash_search(), as we did long ago with hash_insert() and
|
||||
hash_reset(). However, this time we made the move complete with
|
||||
all names. To keep compatibility, we redefine the old names.
|
||||
Since every C and C++ file, that uses HASH, needs to include
|
||||
this file, the change is complete. Both names could be used
|
||||
in the code, but the my_* versions are recommended now.
|
||||
*/
|
||||
#define hash_get_key my_hash_get_key
|
||||
#define hash_free_key my_hash_free_key
|
||||
#define hash_init my_hash_init
|
||||
#define hash_init2 my_hash_init2
|
||||
#define _hash_init _my_hash_init
|
||||
#define hash_free my_hash_free
|
||||
#define hash_reset my_hash_reset
|
||||
#define hash_element my_hash_element
|
||||
#define hash_search my_hash_search
|
||||
#define hash_first my_hash_first
|
||||
#define hash_next my_hash_next
|
||||
#define hash_insert my_hash_insert
|
||||
#define hash_delete my_hash_delete
|
||||
#define hash_update my_hash_update
|
||||
#define hash_replace my_hash_replace
|
||||
#define hash_check my_hash_check
|
||||
#define hash_clear my_hash_clear
|
||||
#define hash_inited my_hash_inited
|
||||
#define hash_init_opt my_hash_init_opt
|
||||
|
||||
/*
|
||||
Overhead to store an element in hash
|
||||
Can be used to approximate memory consumption for a hash
|
||||
@ -30,8 +64,8 @@ extern "C" {
|
||||
/* flags for hash_init */
|
||||
#define HASH_UNIQUE 1 /* hash_insert fails on duplicate key */
|
||||
|
||||
typedef uchar *(*hash_get_key)(const uchar *,size_t*,my_bool);
|
||||
typedef void (*hash_free_key)(void *);
|
||||
typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool);
|
||||
typedef void (*my_hash_free_key)(void *);
|
||||
|
||||
typedef struct st_hash {
|
||||
size_t key_offset,key_length; /* Length of key if const length */
|
||||
@ -39,7 +73,7 @@ typedef struct st_hash {
|
||||
ulong records;
|
||||
uint flags;
|
||||
DYNAMIC_ARRAY array; /* Place for hash_keys */
|
||||
hash_get_key get_key;
|
||||
my_hash_get_key get_key;
|
||||
void (*free)(void *);
|
||||
CHARSET_INFO *charset;
|
||||
} HASH;
|
||||
@ -47,30 +81,34 @@ typedef struct st_hash {
|
||||
/* A search iterator state */
|
||||
typedef uint HASH_SEARCH_STATE;
|
||||
|
||||
#define hash_init(A,B,C,D,E,F,G,H) _hash_init(A,0,B,C,D,E,F,G,H CALLER_INFO)
|
||||
#define hash_init2(A,B,C,D,E,F,G,H,I) _hash_init(A,B,C,D,E,F,G,H,I CALLER_INFO)
|
||||
my_bool _hash_init(HASH *hash, uint growth_size,CHARSET_INFO *charset,
|
||||
ulong default_array_elements, size_t key_offset,
|
||||
size_t key_length, hash_get_key get_key,
|
||||
void (*free_element)(void*), uint flags CALLER_INFO_PROTO);
|
||||
void hash_free(HASH *tree);
|
||||
#define my_hash_init(A,B,C,D,E,F,G,H) \
|
||||
_my_hash_init(A,0,B,C,D,E,F,G,H CALLER_INFO)
|
||||
#define my_hash_init2(A,B,C,D,E,F,G,H,I) \
|
||||
_my_hash_init(A,B,C,D,E,F,G,H,I CALLER_INFO)
|
||||
my_bool _my_hash_init(HASH *hash, uint growth_size, CHARSET_INFO *charset,
|
||||
ulong default_array_elements, size_t key_offset,
|
||||
size_t key_length, my_hash_get_key get_key,
|
||||
void (*free_element)(void*),
|
||||
uint flags CALLER_INFO_PROTO);
|
||||
void my_hash_free(HASH *tree);
|
||||
void my_hash_reset(HASH *hash);
|
||||
uchar *hash_element(HASH *hash,ulong idx);
|
||||
uchar *hash_search(const HASH *info, const uchar *key, size_t length);
|
||||
uchar *hash_first(const HASH *info, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *state);
|
||||
uchar *hash_next(const HASH *info, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *state);
|
||||
my_bool my_hash_insert(HASH *info,const uchar *data);
|
||||
my_bool hash_delete(HASH *hash,uchar *record);
|
||||
my_bool hash_update(HASH *hash,uchar *record,uchar *old_key,size_t old_key_length);
|
||||
void hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row);
|
||||
my_bool hash_check(HASH *hash); /* Only in debug library */
|
||||
uchar *my_hash_element(HASH *hash, ulong idx);
|
||||
uchar *my_hash_search(const HASH *info, const uchar *key, size_t length);
|
||||
uchar *my_hash_first(const HASH *info, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *state);
|
||||
uchar *my_hash_next(const HASH *info, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *state);
|
||||
my_bool my_hash_insert(HASH *info, const uchar *data);
|
||||
my_bool my_hash_delete(HASH *hash, uchar *record);
|
||||
my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key,
|
||||
size_t old_key_length);
|
||||
void my_hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row);
|
||||
my_bool my_hash_check(HASH *hash); /* Only in debug library */
|
||||
|
||||
#define hash_clear(H) bzero((char*) (H),sizeof(*(H)))
|
||||
#define hash_inited(H) ((H)->array.buffer != 0)
|
||||
#define hash_init_opt(A,B,C,D,E,F,G,H) \
|
||||
(!hash_inited(A) && _hash_init(A,0,B,C,D,E,F,G, H CALLER_INFO))
|
||||
#define my_hash_clear(H) bzero((char*) (H), sizeof(*(H)))
|
||||
#define my_hash_inited(H) ((H)->array.buffer != 0)
|
||||
#define my_hash_init_opt(A,B,C,D,E,F,G,H) \
|
||||
(!my_hash_inited(A) && _my_hash_init(A,0,B,C,D,E,F,G, H CALLER_INFO))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
66
include/my_stacktrace.h
Normal file
66
include/my_stacktrace.h
Normal file
@ -0,0 +1,66 @@
|
||||
/* Copyright (C) 2000 MySQL AB
|
||||
|
||||
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
|
||||
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 */
|
||||
|
||||
#ifndef _my_stacktrace_h_
|
||||
#define _my_stacktrace_h_
|
||||
|
||||
#include <my_global.h>
|
||||
|
||||
#ifdef TARGET_OS_LINUX
|
||||
#if defined (__x86_64__) || defined (__i386__) || \
|
||||
(defined(__alpha__) && defined(__GNUC__))
|
||||
#define HAVE_STACKTRACE 1
|
||||
#endif
|
||||
#elif defined(__WIN__)
|
||||
#define HAVE_STACKTRACE 1
|
||||
#endif
|
||||
|
||||
#if HAVE_BACKTRACE && (HAVE_BACKTRACE_SYMBOLS || HAVE_BACKTRACE_SYMBOLS_FD)
|
||||
#undef HAVE_STACKTRACE
|
||||
#define HAVE_STACKTRACE 1
|
||||
#endif
|
||||
|
||||
#if !defined(__NETWARE__)
|
||||
#define HAVE_WRITE_CORE
|
||||
#endif
|
||||
|
||||
#if HAVE_BACKTRACE && HAVE_BACKTRACE_SYMBOLS && \
|
||||
HAVE_CXXABI_H && HAVE_ABI_CXA_DEMANGLE && \
|
||||
HAVE_WEAK_SYMBOL
|
||||
#define BACKTRACE_DEMANGLE 1
|
||||
#endif
|
||||
|
||||
C_MODE_START
|
||||
|
||||
#if defined(HAVE_STACKTRACE) || defined(HAVE_BACKTRACE)
|
||||
void my_init_stacktrace();
|
||||
void my_print_stacktrace(uchar* stack_bottom, ulong thread_stack);
|
||||
void my_safe_print_str(const char* name, const char* val, int max_len);
|
||||
void my_write_core(int sig);
|
||||
#if BACKTRACE_DEMANGLE
|
||||
char *my_demangle(const char *mangled_name, int *status);
|
||||
#endif
|
||||
#ifdef __WIN__
|
||||
void my_set_exception_pointers(EXCEPTION_POINTERS *ep);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_WRITE_CORE
|
||||
void my_write_core(int sig);
|
||||
#endif
|
||||
|
||||
C_MODE_END
|
||||
|
||||
#endif /* _my_stacktrace_h_ */
|
@ -246,7 +246,7 @@ extern int NEAR my_umask, /* Default creation mask */
|
||||
NEAR my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
|
||||
NEAR my_dont_interrupt; /* call remember_intr when set */
|
||||
extern my_bool NEAR mysys_uses_curses, my_use_symdir;
|
||||
extern ulong sf_malloc_cur_memory, sf_malloc_max_memory;
|
||||
extern size_t sf_malloc_cur_memory, sf_malloc_max_memory;
|
||||
|
||||
extern ulong my_default_record_cache_size;
|
||||
extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io,
|
||||
@ -577,6 +577,7 @@ extern int my_close(File Filedes,myf MyFlags);
|
||||
extern File my_dup(File file, myf MyFlags);
|
||||
extern int my_mkdir(const char *dir, int Flags, myf MyFlags);
|
||||
extern int my_readlink(char *to, const char *filename, myf MyFlags);
|
||||
extern int my_is_symlink(const char *filename);
|
||||
extern int my_realpath(char *to, const char *filename, myf MyFlags);
|
||||
extern File my_create_with_symlink(const char *linkname, const char *filename,
|
||||
int createflags, int access_flags,
|
||||
@ -693,6 +694,7 @@ extern char * fn_format(char * to,const char *name,const char *dir,
|
||||
const char *form, uint flag);
|
||||
extern size_t strlength(const char *str);
|
||||
extern void pack_dirname(char * to,const char *from);
|
||||
extern size_t normalize_dirname(char * to, const char *from);
|
||||
extern size_t unpack_dirname(char * to,const char *from);
|
||||
extern size_t cleanup_dirname(char * to,const char *from);
|
||||
extern size_t system_filename(char * to,const char *from);
|
||||
|
@ -256,6 +256,10 @@ extern my_bool myisam_flush,myisam_delay_key_write,myisam_single_user;
|
||||
extern my_off_t myisam_max_temp_length;
|
||||
extern ulong myisam_bulk_insert_tree_size, myisam_data_pointer_size;
|
||||
|
||||
/* usually used to check if a symlink points into the mysql data home */
|
||||
/* which is normally forbidden */
|
||||
extern int (*myisam_test_invalid_symlink)(const char *filename);
|
||||
|
||||
/* Prototypes for myisam-functions */
|
||||
|
||||
extern int mi_close(struct st_myisam_info *file);
|
||||
|
674
include/mysql.h.pp
Normal file
674
include/mysql.h.pp
Normal file
@ -0,0 +1,674 @@
|
||||
#include <sys/types.h>
|
||||
typedef char my_bool;
|
||||
typedef int my_socket;
|
||||
#include "mysql_version.h"
|
||||
#include "mysql_com.h"
|
||||
enum enum_server_command
|
||||
{
|
||||
COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY, COM_FIELD_LIST,
|
||||
COM_CREATE_DB, COM_DROP_DB, COM_REFRESH, COM_SHUTDOWN, COM_STATISTICS,
|
||||
COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL, COM_DEBUG, COM_PING,
|
||||
COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP,
|
||||
COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE,
|
||||
COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE,
|
||||
COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON,
|
||||
COM_END
|
||||
};
|
||||
struct st_vio;
|
||||
typedef struct st_vio Vio;
|
||||
typedef struct st_net {
|
||||
Vio *vio;
|
||||
unsigned char *buff,*buff_end,*write_pos,*read_pos;
|
||||
my_socket fd;
|
||||
unsigned long remain_in_buf,length, buf_length, where_b;
|
||||
unsigned long max_packet,max_packet_size;
|
||||
unsigned int pkt_nr,compress_pkt_nr;
|
||||
unsigned int write_timeout, read_timeout, retry_count;
|
||||
int fcntl;
|
||||
unsigned int *return_status;
|
||||
unsigned char reading_or_writing;
|
||||
char save_char;
|
||||
my_bool unused0;
|
||||
my_bool unused;
|
||||
my_bool compress;
|
||||
my_bool unused1;
|
||||
unsigned char *query_cache_query;
|
||||
unsigned int last_errno;
|
||||
unsigned char error;
|
||||
my_bool unused2;
|
||||
my_bool return_errno;
|
||||
char last_error[512];
|
||||
char sqlstate[5 +1];
|
||||
void *extension;
|
||||
} NET;
|
||||
enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
|
||||
MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,
|
||||
MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
|
||||
MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP,
|
||||
MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,
|
||||
MYSQL_TYPE_DATE, MYSQL_TYPE_TIME,
|
||||
MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
|
||||
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
|
||||
MYSQL_TYPE_BIT,
|
||||
MYSQL_TYPE_NEWDECIMAL=246,
|
||||
MYSQL_TYPE_ENUM=247,
|
||||
MYSQL_TYPE_SET=248,
|
||||
MYSQL_TYPE_TINY_BLOB=249,
|
||||
MYSQL_TYPE_MEDIUM_BLOB=250,
|
||||
MYSQL_TYPE_LONG_BLOB=251,
|
||||
MYSQL_TYPE_BLOB=252,
|
||||
MYSQL_TYPE_VAR_STRING=253,
|
||||
MYSQL_TYPE_STRING=254,
|
||||
MYSQL_TYPE_GEOMETRY=255
|
||||
};
|
||||
enum mysql_enum_shutdown_level {
|
||||
SHUTDOWN_DEFAULT = 0,
|
||||
SHUTDOWN_WAIT_CONNECTIONS= (unsigned char)(1 << 0),
|
||||
SHUTDOWN_WAIT_TRANSACTIONS= (unsigned char)(1 << 1),
|
||||
SHUTDOWN_WAIT_UPDATES= (unsigned char)(1 << 3),
|
||||
SHUTDOWN_WAIT_ALL_BUFFERS= ((unsigned char)(1 << 3) << 1),
|
||||
SHUTDOWN_WAIT_CRITICAL_BUFFERS= ((unsigned char)(1 << 3) << 1) + 1,
|
||||
KILL_QUERY= 254,
|
||||
KILL_CONNECTION= 255
|
||||
};
|
||||
enum enum_cursor_type
|
||||
{
|
||||
CURSOR_TYPE_NO_CURSOR= 0,
|
||||
CURSOR_TYPE_READ_ONLY= 1,
|
||||
CURSOR_TYPE_FOR_UPDATE= 2,
|
||||
CURSOR_TYPE_SCROLLABLE= 4
|
||||
};
|
||||
enum enum_mysql_set_option
|
||||
{
|
||||
MYSQL_OPTION_MULTI_STATEMENTS_ON,
|
||||
MYSQL_OPTION_MULTI_STATEMENTS_OFF
|
||||
};
|
||||
my_bool my_net_init(NET *net, Vio* vio);
|
||||
void my_net_local_init(NET *net);
|
||||
void net_end(NET *net);
|
||||
void net_clear(NET *net, my_bool clear_buffer);
|
||||
my_bool net_realloc(NET *net, size_t length);
|
||||
my_bool net_flush(NET *net);
|
||||
my_bool my_net_write(NET *net,const unsigned char *packet, size_t len);
|
||||
my_bool net_write_command(NET *net,unsigned char command,
|
||||
const unsigned char *header, size_t head_len,
|
||||
const unsigned char *packet, size_t len);
|
||||
int net_real_write(NET *net,const unsigned char *packet, size_t len);
|
||||
unsigned long my_net_read(NET *net);
|
||||
struct sockaddr;
|
||||
int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen,
|
||||
unsigned int timeout);
|
||||
struct rand_struct {
|
||||
unsigned long seed1,seed2,max_value;
|
||||
double max_value_dbl;
|
||||
};
|
||||
enum Item_result {STRING_RESULT=0, REAL_RESULT, INT_RESULT, ROW_RESULT,
|
||||
DECIMAL_RESULT};
|
||||
typedef struct st_udf_args
|
||||
{
|
||||
unsigned int arg_count;
|
||||
enum Item_result *arg_type;
|
||||
char **args;
|
||||
unsigned long *lengths;
|
||||
char *maybe_null;
|
||||
char **attributes;
|
||||
unsigned long *attribute_lengths;
|
||||
void *extension;
|
||||
} UDF_ARGS;
|
||||
typedef struct st_udf_init
|
||||
{
|
||||
my_bool maybe_null;
|
||||
unsigned int decimals;
|
||||
unsigned long max_length;
|
||||
char *ptr;
|
||||
my_bool const_item;
|
||||
void *extension;
|
||||
} UDF_INIT;
|
||||
void randominit(struct rand_struct *, unsigned long seed1,
|
||||
unsigned long seed2);
|
||||
double my_rnd(struct rand_struct *);
|
||||
void create_random_string(char *to, unsigned int length, struct rand_struct *rand_st);
|
||||
void hash_password(unsigned long *to, const char *password, unsigned int password_len);
|
||||
void make_scrambled_password_323(char *to, const char *password);
|
||||
void scramble_323(char *to, const char *message, const char *password);
|
||||
my_bool check_scramble_323(const char *, const char *message,
|
||||
unsigned long *salt);
|
||||
void get_salt_from_password_323(unsigned long *res, const char *password);
|
||||
void make_password_from_salt_323(char *to, const unsigned long *salt);
|
||||
void make_scrambled_password(char *to, const char *password);
|
||||
void scramble(char *to, const char *message, const char *password);
|
||||
my_bool check_scramble(const char *reply, const char *message,
|
||||
const unsigned char *hash_stage2);
|
||||
void get_salt_from_password(unsigned char *res, const char *password);
|
||||
void make_password_from_salt(char *to, const unsigned char *hash_stage2);
|
||||
char *octet2hex(char *to, const char *str, unsigned int len);
|
||||
char *get_tty_password(const char *opt_message);
|
||||
const char *mysql_errno_to_sqlstate(unsigned int mysql_errno);
|
||||
my_bool my_thread_init(void);
|
||||
void my_thread_end(void);
|
||||
#include "mysql_time.h"
|
||||
enum enum_mysql_timestamp_type
|
||||
{
|
||||
MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1,
|
||||
MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2
|
||||
};
|
||||
typedef struct st_mysql_time
|
||||
{
|
||||
unsigned int year, month, day, hour, minute, second;
|
||||
unsigned long second_part;
|
||||
my_bool neg;
|
||||
enum enum_mysql_timestamp_type time_type;
|
||||
} MYSQL_TIME;
|
||||
#include "my_list.h"
|
||||
typedef struct st_list {
|
||||
struct st_list *prev,*next;
|
||||
void *data;
|
||||
} LIST;
|
||||
typedef int (*list_walk_action)(void *,void *);
|
||||
extern LIST *list_add(LIST *root,LIST *element);
|
||||
extern LIST *list_delete(LIST *root,LIST *element);
|
||||
extern LIST *list_cons(void *data,LIST *root);
|
||||
extern LIST *list_reverse(LIST *root);
|
||||
extern void list_free(LIST *root,unsigned int free_data);
|
||||
extern unsigned int list_length(LIST *);
|
||||
extern int list_walk(LIST *,list_walk_action action,unsigned char * argument);
|
||||
extern unsigned int mysql_port;
|
||||
extern char *mysql_unix_port;
|
||||
typedef struct st_mysql_field {
|
||||
char *name;
|
||||
char *org_name;
|
||||
char *table;
|
||||
char *org_table;
|
||||
char *db;
|
||||
char *catalog;
|
||||
char *def;
|
||||
unsigned long length;
|
||||
unsigned long max_length;
|
||||
unsigned int name_length;
|
||||
unsigned int org_name_length;
|
||||
unsigned int table_length;
|
||||
unsigned int org_table_length;
|
||||
unsigned int db_length;
|
||||
unsigned int catalog_length;
|
||||
unsigned int def_length;
|
||||
unsigned int flags;
|
||||
unsigned int decimals;
|
||||
unsigned int charsetnr;
|
||||
enum enum_field_types type;
|
||||
void *extension;
|
||||
} MYSQL_FIELD;
|
||||
typedef char **MYSQL_ROW;
|
||||
typedef unsigned int MYSQL_FIELD_OFFSET;
|
||||
typedef unsigned long long my_ulonglong;
|
||||
#include "typelib.h"
|
||||
#include "my_alloc.h"
|
||||
typedef struct st_used_mem
|
||||
{
|
||||
struct st_used_mem *next;
|
||||
unsigned int left;
|
||||
unsigned int size;
|
||||
} USED_MEM;
|
||||
typedef struct st_mem_root
|
||||
{
|
||||
USED_MEM *free;
|
||||
USED_MEM *used;
|
||||
USED_MEM *pre_alloc;
|
||||
size_t min_malloc;
|
||||
size_t block_size;
|
||||
unsigned int block_num;
|
||||
unsigned int first_block_usage;
|
||||
void (*error_handler)(void);
|
||||
} MEM_ROOT;
|
||||
typedef struct st_typelib {
|
||||
unsigned int count;
|
||||
const char *name;
|
||||
const char **type_names;
|
||||
unsigned int *type_lengths;
|
||||
} TYPELIB;
|
||||
extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position);
|
||||
extern int find_type_or_exit(const char *x, TYPELIB *typelib,
|
||||
const char *option);
|
||||
extern int find_type(char *x, const TYPELIB *typelib, unsigned int full_name);
|
||||
extern void make_type(char *to,unsigned int nr,TYPELIB *typelib);
|
||||
extern const char *get_type(TYPELIB *typelib,unsigned int nr);
|
||||
extern TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from);
|
||||
extern TYPELIB sql_protocol_typelib;
|
||||
typedef struct st_mysql_rows {
|
||||
struct st_mysql_rows *next;
|
||||
MYSQL_ROW data;
|
||||
unsigned long length;
|
||||
} MYSQL_ROWS;
|
||||
typedef MYSQL_ROWS *MYSQL_ROW_OFFSET;
|
||||
#include "my_alloc.h"
|
||||
typedef struct embedded_query_result EMBEDDED_QUERY_RESULT;
|
||||
typedef struct st_mysql_data {
|
||||
MYSQL_ROWS *data;
|
||||
struct embedded_query_result *embedded_info;
|
||||
MEM_ROOT alloc;
|
||||
my_ulonglong rows;
|
||||
unsigned int fields;
|
||||
void *extension;
|
||||
} MYSQL_DATA;
|
||||
enum mysql_option
|
||||
{
|
||||
MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE,
|
||||
MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
|
||||
MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE,
|
||||
MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT,
|
||||
MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT,
|
||||
MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
|
||||
MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH,
|
||||
MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT,
|
||||
MYSQL_OPT_SSL_VERIFY_SERVER_CERT
|
||||
};
|
||||
struct st_mysql_options {
|
||||
unsigned int connect_timeout, read_timeout, write_timeout;
|
||||
unsigned int port, protocol;
|
||||
unsigned long client_flag;
|
||||
char *host,*user,*password,*unix_socket,*db;
|
||||
struct st_dynamic_array *init_commands;
|
||||
char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name;
|
||||
char *ssl_key;
|
||||
char *ssl_cert;
|
||||
char *ssl_ca;
|
||||
char *ssl_capath;
|
||||
char *ssl_cipher;
|
||||
char *shared_memory_base_name;
|
||||
unsigned long max_allowed_packet;
|
||||
my_bool use_ssl;
|
||||
my_bool compress,named_pipe;
|
||||
my_bool rpl_probe;
|
||||
my_bool rpl_parse;
|
||||
my_bool no_master_reads;
|
||||
my_bool separate_thread;
|
||||
enum mysql_option methods_to_use;
|
||||
char *client_ip;
|
||||
my_bool secure_auth;
|
||||
my_bool report_data_truncation;
|
||||
int (*local_infile_init)(void **, const char *, void *);
|
||||
int (*local_infile_read)(void *, char *, unsigned int);
|
||||
void (*local_infile_end)(void *);
|
||||
int (*local_infile_error)(void *, char *, unsigned int);
|
||||
void *local_infile_userdata;
|
||||
void *extension;
|
||||
};
|
||||
enum mysql_status
|
||||
{
|
||||
MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,MYSQL_STATUS_USE_RESULT
|
||||
};
|
||||
enum mysql_protocol_type
|
||||
{
|
||||
MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
|
||||
MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
|
||||
};
|
||||
enum mysql_rpl_type
|
||||
{
|
||||
MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN
|
||||
};
|
||||
typedef struct character_set
|
||||
{
|
||||
unsigned int number;
|
||||
unsigned int state;
|
||||
const char *csname;
|
||||
const char *name;
|
||||
const char *comment;
|
||||
const char *dir;
|
||||
unsigned int mbminlen;
|
||||
unsigned int mbmaxlen;
|
||||
} MY_CHARSET_INFO;
|
||||
struct st_mysql_methods;
|
||||
struct st_mysql_stmt;
|
||||
typedef struct st_mysql
|
||||
{
|
||||
NET net;
|
||||
unsigned char *connector_fd;
|
||||
char *host,*user,*passwd,*unix_socket,*server_version,*host_info;
|
||||
char *info, *db;
|
||||
struct charset_info_st *charset;
|
||||
MYSQL_FIELD *fields;
|
||||
MEM_ROOT field_alloc;
|
||||
my_ulonglong affected_rows;
|
||||
my_ulonglong insert_id;
|
||||
my_ulonglong extra_info;
|
||||
unsigned long thread_id;
|
||||
unsigned long packet_length;
|
||||
unsigned int port;
|
||||
unsigned long client_flag,server_capabilities;
|
||||
unsigned int protocol_version;
|
||||
unsigned int field_count;
|
||||
unsigned int server_status;
|
||||
unsigned int server_language;
|
||||
unsigned int warning_count;
|
||||
struct st_mysql_options options;
|
||||
enum mysql_status status;
|
||||
my_bool free_me;
|
||||
my_bool reconnect;
|
||||
char scramble[20 +1];
|
||||
my_bool rpl_pivot;
|
||||
struct st_mysql* master, *next_slave;
|
||||
struct st_mysql* last_used_slave;
|
||||
struct st_mysql* last_used_con;
|
||||
LIST *stmts;
|
||||
const struct st_mysql_methods *methods;
|
||||
void *thd;
|
||||
my_bool *unbuffered_fetch_owner;
|
||||
char *info_buffer;
|
||||
void *extension;
|
||||
} MYSQL;
|
||||
typedef struct st_mysql_res {
|
||||
my_ulonglong row_count;
|
||||
MYSQL_FIELD *fields;
|
||||
MYSQL_DATA *data;
|
||||
MYSQL_ROWS *data_cursor;
|
||||
unsigned long *lengths;
|
||||
MYSQL *handle;
|
||||
const struct st_mysql_methods *methods;
|
||||
MYSQL_ROW row;
|
||||
MYSQL_ROW current_row;
|
||||
MEM_ROOT field_alloc;
|
||||
unsigned int field_count, current_field;
|
||||
my_bool eof;
|
||||
my_bool unbuffered_fetch_cancelled;
|
||||
void *extension;
|
||||
} MYSQL_RES;
|
||||
typedef struct st_mysql_manager
|
||||
{
|
||||
NET net;
|
||||
char *host, *user, *passwd;
|
||||
char *net_buf, *net_buf_pos, *net_data_end;
|
||||
unsigned int port;
|
||||
int cmd_status;
|
||||
int last_errno;
|
||||
int net_buf_size;
|
||||
my_bool free_me;
|
||||
my_bool eof;
|
||||
char last_error[256];
|
||||
void *extension;
|
||||
} MYSQL_MANAGER;
|
||||
typedef struct st_mysql_parameters
|
||||
{
|
||||
unsigned long *p_max_allowed_packet;
|
||||
unsigned long *p_net_buffer_length;
|
||||
void *extension;
|
||||
} MYSQL_PARAMETERS;
|
||||
int mysql_server_init(int argc, char **argv, char **groups);
|
||||
void mysql_server_end(void);
|
||||
MYSQL_PARAMETERS * mysql_get_parameters(void);
|
||||
my_bool mysql_thread_init(void);
|
||||
void mysql_thread_end(void);
|
||||
my_ulonglong mysql_num_rows(MYSQL_RES *res);
|
||||
unsigned int mysql_num_fields(MYSQL_RES *res);
|
||||
my_bool mysql_eof(MYSQL_RES *res);
|
||||
MYSQL_FIELD * mysql_fetch_field_direct(MYSQL_RES *res,
|
||||
unsigned int fieldnr);
|
||||
MYSQL_FIELD * mysql_fetch_fields(MYSQL_RES *res);
|
||||
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *res);
|
||||
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *res);
|
||||
unsigned int mysql_field_count(MYSQL *mysql);
|
||||
my_ulonglong mysql_affected_rows(MYSQL *mysql);
|
||||
my_ulonglong mysql_insert_id(MYSQL *mysql);
|
||||
unsigned int mysql_errno(MYSQL *mysql);
|
||||
const char * mysql_error(MYSQL *mysql);
|
||||
const char * mysql_sqlstate(MYSQL *mysql);
|
||||
unsigned int mysql_warning_count(MYSQL *mysql);
|
||||
const char * mysql_info(MYSQL *mysql);
|
||||
unsigned long mysql_thread_id(MYSQL *mysql);
|
||||
const char * mysql_character_set_name(MYSQL *mysql);
|
||||
int mysql_set_character_set(MYSQL *mysql, const char *csname);
|
||||
MYSQL * mysql_init(MYSQL *mysql);
|
||||
my_bool mysql_ssl_set(MYSQL *mysql, const char *key,
|
||||
const char *cert, const char *ca,
|
||||
const char *capath, const char *cipher);
|
||||
const char * mysql_get_ssl_cipher(MYSQL *mysql);
|
||||
my_bool mysql_change_user(MYSQL *mysql, const char *user,
|
||||
const char *passwd, const char *db);
|
||||
MYSQL * mysql_real_connect(MYSQL *mysql, const char *host,
|
||||
const char *user,
|
||||
const char *passwd,
|
||||
const char *db,
|
||||
unsigned int port,
|
||||
const char *unix_socket,
|
||||
unsigned long clientflag);
|
||||
int mysql_select_db(MYSQL *mysql, const char *db);
|
||||
int mysql_query(MYSQL *mysql, const char *q);
|
||||
int mysql_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
int mysql_real_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
MYSQL_RES * mysql_store_result(MYSQL *mysql);
|
||||
MYSQL_RES * mysql_use_result(MYSQL *mysql);
|
||||
my_bool mysql_master_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool mysql_master_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool mysql_slave_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool mysql_slave_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
void mysql_get_character_set_info(MYSQL *mysql,
|
||||
MY_CHARSET_INFO *charset);
|
||||
void
|
||||
mysql_set_local_infile_handler(MYSQL *mysql,
|
||||
int (*local_infile_init)(void **, const char *,
|
||||
void *),
|
||||
int (*local_infile_read)(void *, char *,
|
||||
unsigned int),
|
||||
void (*local_infile_end)(void *),
|
||||
int (*local_infile_error)(void *, char*,
|
||||
unsigned int),
|
||||
void *);
|
||||
void
|
||||
mysql_set_local_infile_default(MYSQL *mysql);
|
||||
void mysql_enable_rpl_parse(MYSQL* mysql);
|
||||
void mysql_disable_rpl_parse(MYSQL* mysql);
|
||||
int mysql_rpl_parse_enabled(MYSQL* mysql);
|
||||
void mysql_enable_reads_from_master(MYSQL* mysql);
|
||||
void mysql_disable_reads_from_master(MYSQL* mysql);
|
||||
my_bool mysql_reads_from_master_enabled(MYSQL* mysql);
|
||||
enum mysql_rpl_type mysql_rpl_query_type(const char* q, int len);
|
||||
my_bool mysql_rpl_probe(MYSQL* mysql);
|
||||
int mysql_set_master(MYSQL* mysql, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
const char* passwd);
|
||||
int mysql_add_slave(MYSQL* mysql, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
const char* passwd);
|
||||
int mysql_shutdown(MYSQL *mysql,
|
||||
enum mysql_enum_shutdown_level
|
||||
shutdown_level);
|
||||
int mysql_dump_debug_info(MYSQL *mysql);
|
||||
int mysql_refresh(MYSQL *mysql,
|
||||
unsigned int refresh_options);
|
||||
int mysql_kill(MYSQL *mysql,unsigned long pid);
|
||||
int mysql_set_server_option(MYSQL *mysql,
|
||||
enum enum_mysql_set_option
|
||||
option);
|
||||
int mysql_ping(MYSQL *mysql);
|
||||
const char * mysql_stat(MYSQL *mysql);
|
||||
const char * mysql_get_server_info(MYSQL *mysql);
|
||||
const char * mysql_get_client_info(void);
|
||||
unsigned long mysql_get_client_version(void);
|
||||
const char * mysql_get_host_info(MYSQL *mysql);
|
||||
unsigned long mysql_get_server_version(MYSQL *mysql);
|
||||
unsigned int mysql_get_proto_info(MYSQL *mysql);
|
||||
MYSQL_RES * mysql_list_dbs(MYSQL *mysql,const char *wild);
|
||||
MYSQL_RES * mysql_list_tables(MYSQL *mysql,const char *wild);
|
||||
MYSQL_RES * mysql_list_processes(MYSQL *mysql);
|
||||
int mysql_options(MYSQL *mysql,enum mysql_option option,
|
||||
const void *arg);
|
||||
void mysql_free_result(MYSQL_RES *result);
|
||||
void mysql_data_seek(MYSQL_RES *result,
|
||||
my_ulonglong offset);
|
||||
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result,
|
||||
MYSQL_ROW_OFFSET offset);
|
||||
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result,
|
||||
MYSQL_FIELD_OFFSET offset);
|
||||
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
|
||||
unsigned long * mysql_fetch_lengths(MYSQL_RES *result);
|
||||
MYSQL_FIELD * mysql_fetch_field(MYSQL_RES *result);
|
||||
MYSQL_RES * mysql_list_fields(MYSQL *mysql, const char *table,
|
||||
const char *wild);
|
||||
unsigned long mysql_escape_string(char *to,const char *from,
|
||||
unsigned long from_length);
|
||||
unsigned long mysql_hex_string(char *to,const char *from,
|
||||
unsigned long from_length);
|
||||
unsigned long mysql_real_escape_string(MYSQL *mysql,
|
||||
char *to,const char *from,
|
||||
unsigned long length);
|
||||
void mysql_debug(const char *debug);
|
||||
void myodbc_remove_escape(MYSQL *mysql,char *name);
|
||||
unsigned int mysql_thread_safe(void);
|
||||
my_bool mysql_embedded(void);
|
||||
MYSQL_MANAGER* mysql_manager_init(MYSQL_MANAGER* con);
|
||||
MYSQL_MANAGER* mysql_manager_connect(MYSQL_MANAGER* con,
|
||||
const char* host,
|
||||
const char* user,
|
||||
const char* passwd,
|
||||
unsigned int port);
|
||||
void mysql_manager_close(MYSQL_MANAGER* con);
|
||||
int mysql_manager_command(MYSQL_MANAGER* con,
|
||||
const char* cmd, int cmd_len);
|
||||
int mysql_manager_fetch_line(MYSQL_MANAGER* con,
|
||||
char* res_buf,
|
||||
int res_buf_size);
|
||||
my_bool mysql_read_query_result(MYSQL *mysql);
|
||||
enum enum_mysql_stmt_state
|
||||
{
|
||||
MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE,
|
||||
MYSQL_STMT_FETCH_DONE
|
||||
};
|
||||
typedef struct st_mysql_bind
|
||||
{
|
||||
unsigned long *length;
|
||||
my_bool *is_null;
|
||||
void *buffer;
|
||||
my_bool *error;
|
||||
unsigned char *row_ptr;
|
||||
void (*store_param_func)(NET *net, struct st_mysql_bind *param);
|
||||
void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *,
|
||||
unsigned char **row);
|
||||
void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *,
|
||||
unsigned char **row);
|
||||
unsigned long buffer_length;
|
||||
unsigned long offset;
|
||||
unsigned long length_value;
|
||||
unsigned int param_number;
|
||||
unsigned int pack_length;
|
||||
enum enum_field_types buffer_type;
|
||||
my_bool error_value;
|
||||
my_bool is_unsigned;
|
||||
my_bool long_data_used;
|
||||
my_bool is_null_value;
|
||||
void *extension;
|
||||
} MYSQL_BIND;
|
||||
typedef struct st_mysql_stmt
|
||||
{
|
||||
MEM_ROOT mem_root;
|
||||
LIST list;
|
||||
MYSQL *mysql;
|
||||
MYSQL_BIND *params;
|
||||
MYSQL_BIND *bind;
|
||||
MYSQL_FIELD *fields;
|
||||
MYSQL_DATA result;
|
||||
MYSQL_ROWS *data_cursor;
|
||||
int (*read_row_func)(struct st_mysql_stmt *stmt,
|
||||
unsigned char **row);
|
||||
my_ulonglong affected_rows;
|
||||
my_ulonglong insert_id;
|
||||
unsigned long stmt_id;
|
||||
unsigned long flags;
|
||||
unsigned long prefetch_rows;
|
||||
unsigned int server_status;
|
||||
unsigned int last_errno;
|
||||
unsigned int param_count;
|
||||
unsigned int field_count;
|
||||
enum enum_mysql_stmt_state state;
|
||||
char last_error[512];
|
||||
char sqlstate[5 +1];
|
||||
my_bool send_types_to_server;
|
||||
my_bool bind_param_done;
|
||||
unsigned char bind_result_done;
|
||||
my_bool unbuffered_fetch_cancelled;
|
||||
my_bool update_max_length;
|
||||
void *extension;
|
||||
} MYSQL_STMT;
|
||||
enum enum_stmt_attr_type
|
||||
{
|
||||
STMT_ATTR_UPDATE_MAX_LENGTH,
|
||||
STMT_ATTR_CURSOR_TYPE,
|
||||
STMT_ATTR_PREFETCH_ROWS
|
||||
};
|
||||
typedef struct st_mysql_methods
|
||||
{
|
||||
my_bool (*read_query_result)(MYSQL *mysql);
|
||||
my_bool (*advanced_command)(MYSQL *mysql,
|
||||
enum enum_server_command command,
|
||||
const unsigned char *header,
|
||||
unsigned long header_length,
|
||||
const unsigned char *arg,
|
||||
unsigned long arg_length,
|
||||
my_bool skip_check,
|
||||
MYSQL_STMT *stmt);
|
||||
MYSQL_DATA *(*read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
|
||||
unsigned int fields);
|
||||
MYSQL_RES * (*use_result)(MYSQL *mysql);
|
||||
void (*fetch_lengths)(unsigned long *to,
|
||||
MYSQL_ROW column, unsigned int field_count);
|
||||
void (*flush_use_result)(MYSQL *mysql);
|
||||
MYSQL_FIELD * (*list_fields)(MYSQL *mysql);
|
||||
my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
|
||||
int (*stmt_execute)(MYSQL_STMT *stmt);
|
||||
int (*read_binary_rows)(MYSQL_STMT *stmt);
|
||||
int (*unbuffered_fetch)(MYSQL *mysql, char **row);
|
||||
void (*free_embedded_thd)(MYSQL *mysql);
|
||||
const char *(*read_statistics)(MYSQL *mysql);
|
||||
my_bool (*next_result)(MYSQL *mysql);
|
||||
int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd);
|
||||
int (*read_rows_from_cursor)(MYSQL_STMT *stmt);
|
||||
} MYSQL_METHODS;
|
||||
MYSQL_STMT * mysql_stmt_init(MYSQL *mysql);
|
||||
int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query,
|
||||
unsigned long length);
|
||||
int mysql_stmt_execute(MYSQL_STMT *stmt);
|
||||
int mysql_stmt_fetch(MYSQL_STMT *stmt);
|
||||
int mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg,
|
||||
unsigned int column,
|
||||
unsigned long offset);
|
||||
int mysql_stmt_store_result(MYSQL_STMT *stmt);
|
||||
unsigned long mysql_stmt_param_count(MYSQL_STMT * stmt);
|
||||
my_bool mysql_stmt_attr_set(MYSQL_STMT *stmt,
|
||||
enum enum_stmt_attr_type attr_type,
|
||||
const void *attr);
|
||||
my_bool mysql_stmt_attr_get(MYSQL_STMT *stmt,
|
||||
enum enum_stmt_attr_type attr_type,
|
||||
void *attr);
|
||||
my_bool mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
|
||||
my_bool mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
|
||||
my_bool mysql_stmt_close(MYSQL_STMT * stmt);
|
||||
my_bool mysql_stmt_reset(MYSQL_STMT * stmt);
|
||||
my_bool mysql_stmt_free_result(MYSQL_STMT *stmt);
|
||||
my_bool mysql_stmt_send_long_data(MYSQL_STMT *stmt,
|
||||
unsigned int param_number,
|
||||
const char *data,
|
||||
unsigned long length);
|
||||
MYSQL_RES * mysql_stmt_result_metadata(MYSQL_STMT *stmt);
|
||||
MYSQL_RES * mysql_stmt_param_metadata(MYSQL_STMT *stmt);
|
||||
unsigned int mysql_stmt_errno(MYSQL_STMT * stmt);
|
||||
const char * mysql_stmt_error(MYSQL_STMT * stmt);
|
||||
const char * mysql_stmt_sqlstate(MYSQL_STMT * stmt);
|
||||
MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT *stmt,
|
||||
MYSQL_ROW_OFFSET offset);
|
||||
MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt);
|
||||
void mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset);
|
||||
my_ulonglong mysql_stmt_num_rows(MYSQL_STMT *stmt);
|
||||
my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt);
|
||||
my_ulonglong mysql_stmt_insert_id(MYSQL_STMT *stmt);
|
||||
unsigned int mysql_stmt_field_count(MYSQL_STMT *stmt);
|
||||
my_bool mysql_commit(MYSQL * mysql);
|
||||
my_bool mysql_rollback(MYSQL * mysql);
|
||||
my_bool mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
|
||||
my_bool mysql_more_results(MYSQL *mysql);
|
||||
int mysql_next_result(MYSQL *mysql);
|
||||
void mysql_close(MYSQL *sock);
|
139
include/mysql/plugin.h.pp
Normal file
139
include/mysql/plugin.h.pp
Normal file
@ -0,0 +1,139 @@
|
||||
struct st_mysql_lex_string
|
||||
{
|
||||
char *str;
|
||||
unsigned int length;
|
||||
};
|
||||
typedef struct st_mysql_lex_string MYSQL_LEX_STRING;
|
||||
struct st_mysql_xid {
|
||||
long formatID;
|
||||
long gtrid_length;
|
||||
long bqual_length;
|
||||
char data[128];
|
||||
};
|
||||
typedef struct st_mysql_xid MYSQL_XID;
|
||||
enum enum_mysql_show_type
|
||||
{
|
||||
SHOW_UNDEF, SHOW_BOOL, SHOW_INT, SHOW_LONG,
|
||||
SHOW_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR,
|
||||
SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE
|
||||
};
|
||||
struct st_mysql_show_var {
|
||||
const char *name;
|
||||
char *value;
|
||||
enum enum_mysql_show_type type;
|
||||
};
|
||||
typedef int (*mysql_show_var_func)(void*, struct st_mysql_show_var*, char *);
|
||||
struct st_mysql_sys_var;
|
||||
struct st_mysql_value;
|
||||
typedef int (*mysql_var_check_func)(void* thd,
|
||||
struct st_mysql_sys_var *var,
|
||||
void *save, struct st_mysql_value *value);
|
||||
typedef void (*mysql_var_update_func)(void* thd,
|
||||
struct st_mysql_sys_var *var,
|
||||
void *var_ptr, const void *save);
|
||||
struct st_mysql_plugin
|
||||
{
|
||||
int type;
|
||||
void *info;
|
||||
const char *name;
|
||||
const char *author;
|
||||
const char *descr;
|
||||
int license;
|
||||
int (*init)(void *);
|
||||
int (*deinit)(void *);
|
||||
unsigned int version;
|
||||
struct st_mysql_show_var *status_vars;
|
||||
struct st_mysql_sys_var **system_vars;
|
||||
void * __reserved1;
|
||||
};
|
||||
enum enum_ftparser_mode
|
||||
{
|
||||
MYSQL_FTPARSER_SIMPLE_MODE= 0,
|
||||
MYSQL_FTPARSER_WITH_STOPWORDS= 1,
|
||||
MYSQL_FTPARSER_FULL_BOOLEAN_INFO= 2
|
||||
};
|
||||
enum enum_ft_token_type
|
||||
{
|
||||
FT_TOKEN_EOF= 0,
|
||||
FT_TOKEN_WORD= 1,
|
||||
FT_TOKEN_LEFT_PAREN= 2,
|
||||
FT_TOKEN_RIGHT_PAREN= 3,
|
||||
FT_TOKEN_STOPWORD= 4
|
||||
};
|
||||
typedef struct st_mysql_ftparser_boolean_info
|
||||
{
|
||||
enum enum_ft_token_type type;
|
||||
int yesno;
|
||||
int weight_adjust;
|
||||
char wasign;
|
||||
char trunc;
|
||||
char prev;
|
||||
char *quot;
|
||||
} MYSQL_FTPARSER_BOOLEAN_INFO;
|
||||
typedef struct st_mysql_ftparser_param
|
||||
{
|
||||
int (*mysql_parse)(struct st_mysql_ftparser_param *,
|
||||
char *doc, int doc_len);
|
||||
int (*mysql_add_word)(struct st_mysql_ftparser_param *,
|
||||
char *word, int word_len,
|
||||
MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info);
|
||||
void *ftparser_state;
|
||||
void *mysql_ftparam;
|
||||
struct charset_info_st *cs;
|
||||
char *doc;
|
||||
int length;
|
||||
int flags;
|
||||
enum enum_ftparser_mode mode;
|
||||
} MYSQL_FTPARSER_PARAM;
|
||||
struct st_mysql_ftparser
|
||||
{
|
||||
int interface_version;
|
||||
int (*parse)(MYSQL_FTPARSER_PARAM *param);
|
||||
int (*init)(MYSQL_FTPARSER_PARAM *param);
|
||||
int (*deinit)(MYSQL_FTPARSER_PARAM *param);
|
||||
};
|
||||
struct st_mysql_storage_engine
|
||||
{
|
||||
int interface_version;
|
||||
};
|
||||
struct handlerton;
|
||||
struct st_mysql_daemon
|
||||
{
|
||||
int interface_version;
|
||||
};
|
||||
struct st_mysql_information_schema
|
||||
{
|
||||
int interface_version;
|
||||
};
|
||||
struct st_mysql_value
|
||||
{
|
||||
int (*value_type)(struct st_mysql_value *);
|
||||
const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length);
|
||||
int (*val_real)(struct st_mysql_value *, double *realbuf);
|
||||
int (*val_int)(struct st_mysql_value *, long long *intbuf);
|
||||
};
|
||||
int thd_in_lock_tables(const void* thd);
|
||||
int thd_tablespace_op(const void* thd);
|
||||
long long thd_test_options(const void* thd, long long test_options);
|
||||
int thd_sql_command(const void* thd);
|
||||
const char *thd_proc_info(void* thd, const char *info);
|
||||
void **thd_ha_data(const void* thd, const struct handlerton *hton);
|
||||
int thd_tx_isolation(const void* thd);
|
||||
char *thd_security_context(void* thd, char *buffer, unsigned int length,
|
||||
unsigned int max_query_len);
|
||||
void thd_inc_row_count(void* thd);
|
||||
int mysql_tmpfile(const char *prefix);
|
||||
int thd_killed(const void* thd);
|
||||
unsigned long thd_get_thread_id(const void* thd);
|
||||
void *thd_alloc(void* thd, unsigned int size);
|
||||
void *thd_calloc(void* thd, unsigned int size);
|
||||
char *thd_strdup(void* thd, const char *str);
|
||||
char *thd_strmake(void* thd, const char *str, unsigned int size);
|
||||
void *thd_memdup(void* thd, const void* str, unsigned int size);
|
||||
MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str,
|
||||
const char *str, unsigned int size,
|
||||
int allocate_lex_string);
|
||||
void thd_get_xid(const void* thd, MYSQL_XID *xid);
|
||||
void mysql_query_cache_invalidate4(void* thd,
|
||||
const char *key, unsigned int key_length,
|
||||
int using_trx);
|
1166
include/mysql_h.ic
1166
include/mysql_h.ic
File diff suppressed because it is too large
Load Diff
@ -29,6 +29,14 @@ extern ulong locks_immediate,locks_waited ;
|
||||
|
||||
enum thr_lock_type { TL_IGNORE=-1,
|
||||
TL_UNLOCK, /* UNLOCK ANY LOCK */
|
||||
/*
|
||||
Parser only! At open_tables() becomes TL_READ or
|
||||
TL_READ_NO_INSERT depending on the binary log format
|
||||
(SBR/RBR) and on the table category (log table).
|
||||
Used for tables that are read by statements which
|
||||
modify tables.
|
||||
*/
|
||||
TL_READ_DEFAULT,
|
||||
TL_READ, /* Read lock */
|
||||
TL_READ_WITH_SHARED_LOCKS,
|
||||
/* High prior. than TL_WRITE. Allow concurrent insert */
|
||||
|
@ -89,9 +89,20 @@ BOOL APIENTRY LibMain(HANDLE hInst,DWORD ul_reason_being_called,
|
||||
UNREFERENCED_PARAMETER(lpReserved);
|
||||
} /* LibMain */
|
||||
|
||||
|
||||
static BOOL do_libmain;
|
||||
int __stdcall DllMain(HANDLE hInst,DWORD ul_reason_being_called,LPVOID lpReserved)
|
||||
{
|
||||
return LibMain(hInst,ul_reason_being_called,lpReserved);
|
||||
/*
|
||||
Unless environment variable LIBMYSQL_DLLINIT is set, do nothing.
|
||||
The environment variable is checked once, during the first call to DllMain()
|
||||
(in DLL_PROCESS_ATTACH hook).
|
||||
*/
|
||||
if (ul_reason_being_called == DLL_PROCESS_ATTACH)
|
||||
do_libmain = (getenv("LIBMYSQL_DLLINIT") != NULL);
|
||||
if (do_libmain)
|
||||
return LibMain(hInst,ul_reason_being_called,lpReserved);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#elif defined(WINDOWS)
|
||||
|
@ -185,8 +185,7 @@ SET(LIBMYSQLD_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
|
||||
../sql/strfunc.cc ../sql/table.cc ../sql/thr_malloc.cc
|
||||
../sql/time.cc ../sql/tztime.cc ../sql/uniques.cc ../sql/unireg.cc
|
||||
../sql/partition_info.cc ../sql/sql_connect.cc
|
||||
../sql/scheduler.cc ../sql/stacktrace.c
|
||||
../sql/event_parse_data.cc
|
||||
../sql/scheduler.cc ../sql/event_parse_data.cc
|
||||
${GEN_SOURCES}
|
||||
${LIB_SOURCES})
|
||||
|
||||
|
@ -69,7 +69,7 @@ sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \
|
||||
sql_select.cc sql_do.cc sql_show.cc set_var.cc \
|
||||
sql_string.cc sql_table.cc sql_test.cc sql_udf.cc \
|
||||
sql_update.cc sql_yacc.cc table.cc thr_malloc.cc time.cc \
|
||||
unireg.cc uniques.cc stacktrace.c sql_union.cc hash_filo.cc \
|
||||
unireg.cc uniques.cc sql_union.cc hash_filo.cc \
|
||||
spatial.cc gstream.cc sql_help.cc tztime.cc sql_cursor.cc \
|
||||
sp_head.cc sp_pcontext.cc sp.cc sp_cache.cc sp_rcontext.cc \
|
||||
parse_file.cc sql_view.cc sql_trigger.cc my_decimal.cc \
|
||||
|
@ -447,7 +447,8 @@ int emb_load_querycache_result(THD *thd, Querycache_stream *src)
|
||||
if (thd->protocol == &thd->protocol_binary)
|
||||
{
|
||||
uint length;
|
||||
row= (MYSQL_ROWS *)alloc_root(&data->alloc, rows * sizeof(MYSQL_ROWS));
|
||||
row= (MYSQL_ROWS *)alloc_root(&data->alloc,
|
||||
(size_t) (rows * sizeof(MYSQL_ROWS)));
|
||||
end_row= row + rows;
|
||||
data->data= row;
|
||||
|
||||
|
@ -79,6 +79,15 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
my_bool result= 1;
|
||||
THD *thd=(THD *) mysql->thd;
|
||||
NET *net= &mysql->net;
|
||||
my_bool stmt_skip= stmt ? stmt->state != MYSQL_STMT_INIT_DONE : FALSE;
|
||||
|
||||
if (!thd)
|
||||
{
|
||||
/* Do "reconnect" if possible */
|
||||
if (mysql_reconnect(mysql) || stmt_skip)
|
||||
return 1;
|
||||
thd= (THD *) mysql->thd;
|
||||
}
|
||||
|
||||
#if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER)
|
||||
thd->profiling.start_new_query();
|
||||
@ -1094,6 +1103,9 @@ void Protocol_text::prepare_for_resend()
|
||||
data->embedded_info->prev_ptr= &cur->next;
|
||||
next_field=cur->data;
|
||||
next_mysql_field= data->embedded_info->fields_list;
|
||||
#ifndef DBUG_OFF
|
||||
field_pos= 0;
|
||||
#endif
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
@ -21,5 +21,9 @@ man1_MANS = @man1_files@
|
||||
man8_MANS = @man8_files@
|
||||
EXTRA_DIST = $(man1_MANS) $(man8_MANS)
|
||||
|
||||
# "make_win_*" are not needed in Unix binary packages,
|
||||
install-data-hook:
|
||||
rm -f $(DESTDIR)$(manlibdir)/man1/make_win_*
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -77,6 +77,7 @@ dist-hook:
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51_data_be/BACKUP* $(distdir)/std_data/ndb_backup51_data_be
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51_data_le/BACKUP* $(distdir)/std_data/ndb_backup51_data_le
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/parts/part_* $(distdir)/std_data/parts
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/parts/*.MY* $(distdir)/std_data/parts
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/funcs_1/* $(distdir)/std_data/funcs_1
|
||||
$(INSTALL_DATA) $(srcdir)/lib/*.pl $(distdir)/lib
|
||||
$(INSTALL_DATA) $(srcdir)/lib/My/*.pm $(distdir)/lib/My
|
||||
@ -132,6 +133,7 @@ install-data-local:
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51_data_be/BACKUP* $(DESTDIR)$(testdir)/std_data/ndb_backup51_data_be
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51_data_le/BACKUP* $(DESTDIR)$(testdir)/std_data/ndb_backup51_data_le
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/parts/part_* $(DESTDIR)$(testdir)/std_data/parts
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/parts/*.MY* $(DESTDIR)$(testdir)/std_data/parts
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/funcs_1/* $(DESTDIR)$(testdir)/std_data/funcs_1
|
||||
$(INSTALL_DATA) $(srcdir)/lib/*.pl $(DESTDIR)$(testdir)/lib
|
||||
$(INSTALL_DATA) $(srcdir)/lib/My/*.pm $(DESTDIR)$(testdir)/lib/My
|
||||
|
@ -125,6 +125,45 @@ drop table t1;
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /Server ver: [^,]*,/Server version,/
|
||||
show binlog events from 0;
|
||||
|
||||
|
||||
#
|
||||
# Bug #39182: Binary log producing incompatible character set query from
|
||||
# stored procedure.
|
||||
#
|
||||
reset master;
|
||||
CREATE DATABASE bug39182 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
|
||||
USE bug39182;
|
||||
CREATE TABLE t1 (a VARCHAR(255) COLLATE utf8_unicode_ci)
|
||||
DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
|
||||
DELIMITER //;
|
||||
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE s1 VARCHAR(255);
|
||||
SET s1= "test";
|
||||
CREATE TEMPORARY TABLE tmp1
|
||||
SELECT * FROM t1 WHERE a LIKE CONCAT("%", s1, "%");
|
||||
SELECT
|
||||
COLLATION(NAME_CONST('s1', _utf8'test')) c1,
|
||||
COLLATION(NAME_CONST('s1', _utf8'test' COLLATE utf8_unicode_ci)) c2,
|
||||
COLLATION(s1) c3,
|
||||
COERCIBILITY(NAME_CONST('s1', _utf8'test')) d1,
|
||||
COERCIBILITY(NAME_CONST('s1', _utf8'test' COLLATE utf8_unicode_ci)) d2,
|
||||
COERCIBILITY(s1) d3;
|
||||
DROP TEMPORARY TABLE tmp1;
|
||||
END//
|
||||
|
||||
DELIMITER ;//
|
||||
|
||||
CALL p1();
|
||||
source include/show_binlog_events.inc;
|
||||
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1;
|
||||
DROP DATABASE bug39182;
|
||||
USE test;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
# Test of a too big SET INSERT_ID: see if the truncated value goes
|
||||
|
@ -1,17 +1,43 @@
|
||||
# Test of binlogging of INSERT_ID with INSERT DELAYED
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# Verify that INSERT DELAYED in mixed or row mode writes events to the
|
||||
# binlog, and that AUTO_INCREMENT works correctly.
|
||||
#
|
||||
# ==== Method ====
|
||||
#
|
||||
# Insert both single and multiple rows into an autoincrement column,
|
||||
# both with specified value and with NULL.
|
||||
#
|
||||
# With INSERT DELAYED, the rows do not show up in the table
|
||||
# immediately, so we must do source include/wait_until_rows_count.inc
|
||||
# between any two INSERT DELAYED statements. Moreover, if mixed or
|
||||
# row-based logging is used, there is also a delay between when rows
|
||||
# show up in the table and when they show up in the binlog. To ensure
|
||||
# that the rows show up in the binlog, we call FLUSH TABLES, which
|
||||
# waits until the delayed_insert thread has finished.
|
||||
#
|
||||
# We cannot read the binlog after executing INSERT DELAYED statements
|
||||
# that insert multiple rows, because that is nondeterministic. More
|
||||
# precisely, rows may be written in batches to the binlog, where each
|
||||
# batch has one Table_map_log_event and one or more
|
||||
# Write_rows_log_event. The number of rows included in each batch is
|
||||
# nondeterministic.
|
||||
#
|
||||
# ==== Related bugs ====
|
||||
#
|
||||
# BUG#20627: INSERT DELAYED does not honour auto_increment_* variables
|
||||
# Bug in this test: BUG#38068: binlog_stm_binlog fails sporadically in pushbuild
|
||||
|
||||
|
||||
create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
|
||||
# First, avoid BUG#20627:
|
||||
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
|
||||
# Verify that only one INSERT_ID event is binlogged.
|
||||
# Note, that because of WL#3368 mixed mode binlog records RBR events for the delayed
|
||||
|
||||
let $table=t1;
|
||||
let $rows_inserted=11; # total number of inserted rows in this test
|
||||
let $count=0;
|
||||
|
||||
insert delayed into t1 values (207);
|
||||
let $count=1;
|
||||
|
||||
# use this macro instead of sleeps.
|
||||
|
||||
inc $count;
|
||||
--source include/wait_until_rows_count.inc
|
||||
|
||||
insert delayed into t1 values (null);
|
||||
inc $count;
|
||||
--source include/wait_until_rows_count.inc
|
||||
@ -20,9 +46,10 @@ insert delayed into t1 values (300);
|
||||
inc $count;
|
||||
--source include/wait_until_rows_count.inc
|
||||
|
||||
# moving binlog check affront of multi-rows queries which work is indeterministic (extra table_maps)
|
||||
# todo: better check is to substitute SHOW BINLOG with reading from binlog, probably bug#19459 is in
|
||||
# the way
|
||||
# It is not enough to wait until all rows have been inserted into the
|
||||
# table. FLUSH TABLES ensures that they are in the binlog too. See
|
||||
# comment above.
|
||||
FLUSH TABLES;
|
||||
source include/show_binlog_events.inc;
|
||||
|
||||
insert delayed into t1 values (null),(null),(null),(null);
|
||||
@ -33,8 +60,5 @@ insert delayed into t1 values (null),(null),(400),(null);
|
||||
inc $count; inc $count; inc $count; inc $count;
|
||||
--source include/wait_until_rows_count.inc
|
||||
|
||||
#check this assertion about $count calculation
|
||||
--echo $count == $rows_inserted
|
||||
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
@ -139,15 +139,6 @@ drop table t1,t2,t3;
|
||||
# table
|
||||
#
|
||||
CREATE TABLE t1(a INT) ENGINE=BLACKHOLE;
|
||||
# NOTE: After exchanging open_ltable() by open_and_lock_tables() in
|
||||
# handle_delayed_insert() to fix problems with MERGE tables (Bug#26379),
|
||||
# problems with INSERT DELAYED and BLACKHOLE popped up. open_ltable()
|
||||
# does not check if the binlogging capabilities of the statement and the
|
||||
# table match. So the below used to succeed. But since INSERT DELAYED
|
||||
# switches to row-based logging in mixed-mode and BLACKHOLE cannot do
|
||||
# row-based logging, it could not really work. Until this problem is
|
||||
# correctly fixed, we have that error here.
|
||||
--error ER_BINLOG_LOGGING_IMPOSSIBLE
|
||||
INSERT DELAYED INTO t1 VALUES(1);
|
||||
DROP TABLE t1;
|
||||
|
||||
|
@ -13,3 +13,18 @@ create trigger tr1 before insert on t1 for each row insert into t2 values (2*new
|
||||
create procedure sp1 (a int) insert into t1 values(a);
|
||||
drop database testing_1;
|
||||
source include/show_binlog_events.inc;
|
||||
|
||||
# BUG#38773: DROP DATABASE cause switch to stmt-mode when there are
|
||||
# temporary tables open
|
||||
|
||||
use test;
|
||||
reset master;
|
||||
create temporary table tt1 (a int);
|
||||
create table t1 (a int);
|
||||
insert into t1 values (1);
|
||||
disable_warnings;
|
||||
drop database if exists mysqltest1;
|
||||
enable_warnings;
|
||||
insert into t1 values (1);
|
||||
drop table tt1, t1;
|
||||
source include/show_binlog_events.inc;
|
||||
|
@ -7,6 +7,7 @@
|
||||
# Actually this test has nothing to do with innodb per se, it just requires
|
||||
# transactional table.
|
||||
#
|
||||
flush status;
|
||||
show status like "binlog_cache_use";
|
||||
show status like "binlog_cache_disk_use";
|
||||
--disable_warnings
|
||||
@ -38,12 +39,3 @@ commit;
|
||||
show status like "binlog_cache_use";
|
||||
show status like "binlog_cache_disk_use";
|
||||
drop table t1;
|
||||
|
||||
# Test for testable InnoDB status variables. This test
|
||||
# uses previous ones(pages_created, rows_deleted, ...).
|
||||
show status like "Innodb_buffer_pool_pages_total";
|
||||
show status like "Innodb_page_size";
|
||||
show status like "Innodb_rows_deleted";
|
||||
show status like "Innodb_rows_inserted";
|
||||
show status like "Innodb_rows_updated";
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
eval create table t1 (a int) engine=$engine_type;
|
||||
flush tables;
|
||||
system rm $MYSQLTEST_VARDIR/master-data/test/t1.MYI ;
|
||||
remove_file $MYSQLTEST_VARDIR/master-data/test/t1.MYI ;
|
||||
drop table if exists t1;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
|
32
mysql-test/extra/rpl_tests/rpl_blackhole.test
Normal file
32
mysql-test/extra/rpl_tests/rpl_blackhole.test
Normal file
@ -0,0 +1,32 @@
|
||||
# Check replication of one statement assuming that the engine on the
|
||||
# slave is a blackhole engine.
|
||||
|
||||
# Input:
|
||||
# $statement Statement to evaluate, it is assumed to change t1
|
||||
|
||||
# 1. Evaluate statement on master, it is assumed to change t1
|
||||
# 2. Wait for statement to be processed on slave
|
||||
# 3. SELECT from table t1 to see what was written
|
||||
# 4. Compare position on slave before executing statement and after
|
||||
# executing statement. If difference is >0, then something was
|
||||
# written to the binary log on the slave.
|
||||
|
||||
connection slave;
|
||||
let $before = query_get_value("SHOW MASTER STATUS", Position, 1);
|
||||
|
||||
--echo [on master]
|
||||
connection master;
|
||||
eval $statement;
|
||||
|
||||
--echo [on slave]
|
||||
sync_slave_with_master;
|
||||
--echo # Expect 0
|
||||
SELECT COUNT(*) FROM t1;
|
||||
let $after = query_get_value("SHOW MASTER STATUS", Position, 1);
|
||||
let $something_written = `select $after - $before != 0`;
|
||||
if ($something_written) {
|
||||
--echo >>> Something was written to binary log <<<
|
||||
}
|
||||
if (!$something_written) {
|
||||
--echo >>> Nothing was written to binary log <<<
|
||||
}
|
@ -151,6 +151,20 @@ DROP DATABASE IF EXISTS mysqltest3;
|
||||
CREATE DATABASE mysqltest1;
|
||||
CREATE DATABASE mysqltest2;
|
||||
eval CREATE TABLE mysqltest1.t1 (f1 BIGINT) ENGINE=$engine_type;
|
||||
# Prevent Bug#26687 rpl_ddl test fails if run with --innodb option
|
||||
# The testscript (suite/rpl/rpl_ddl.test) + the expected result need that the
|
||||
# slave uses MyISAM for the table mysqltest.t1.
|
||||
# This is not valid in case of suite/rpl_ndb/rpl_ndb_ddl.test which sources
|
||||
# also this script.
|
||||
sync_slave_with_master;
|
||||
connection slave;
|
||||
if (`SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES
|
||||
WHERE TABLE_SCHEMA = 'mysqltest1' AND TABLE_NAME = 't1'
|
||||
AND ENGINE <> 'MyISAM' AND '$engine_type' <> 'NDB'`)
|
||||
{
|
||||
skip This test needs on slave side: InnoDB disabled, default engine: MyISAM;
|
||||
}
|
||||
connection master;
|
||||
INSERT INTO mysqltest1.t1 SET f1= 0;
|
||||
eval CREATE TABLE mysqltest1.t2 (f1 BIGINT) ENGINE=$engine_type;
|
||||
eval CREATE TABLE mysqltest1.t3 (f1 BIGINT) ENGINE=$engine_type;
|
||||
|
@ -442,8 +442,6 @@ SELECT f1();
|
||||
INSERT INTO t1 VALUES (NULL, f2()), (NULL, LAST_INSERT_ID()),
|
||||
(NULL, LAST_INSERT_ID()), (NULL, f2()), (NULL, f2());
|
||||
INSERT INTO t1 VALUES (NULL, f2());
|
||||
INSERT INTO t1 VALUES (NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID(5)),
|
||||
(NULL, @@LAST_INSERT_ID);
|
||||
# Test replication of substitution "IS NULL" -> "= LAST_INSERT_ID".
|
||||
INSERT INTO t1 VALUES (NULL, 0), (NULL, LAST_INSERT_ID());
|
||||
UPDATE t1 SET j= -1 WHERE i IS NULL;
|
||||
|
@ -13,22 +13,15 @@ save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
stop slave;
|
||||
--source include/wait_for_slave_to_stop.inc
|
||||
reset master;
|
||||
reset slave;
|
||||
# We are going to read the slave's binlog which contains file_id (for some LOAD
|
||||
# DATA INFILE); to make it repeatable (not influenced by other tests), we need
|
||||
# to stop and start the slave, to be sure file_id will start from 1.
|
||||
# This can be done with 'server_stop slave', but
|
||||
# this would require the manager, so most of the time the test will be skipped
|
||||
# :(
|
||||
# To workaround this, I (Guilhem) add a (empty) rpl_log-slave.opt (because when
|
||||
# mysql-test-run finds such a file it restarts the slave before doing the
|
||||
# test). That's not very elegant but I could find no better way, sorry.
|
||||
start slave;
|
||||
--source include/wait_for_slave_to_start.inc
|
||||
|
||||
let $VERSION=`select version()`;
|
||||
|
||||
connection master;
|
||||
reset master;
|
||||
eval create table t1(n int not null auto_increment primary key)ENGINE=$engine_type;
|
||||
insert into t1 values (NULL);
|
||||
drop table t1;
|
||||
@ -79,7 +72,6 @@ connection slave;
|
||||
# Note that the above 'slave start' will cause a 3rd rotate event (a fake one)
|
||||
# to go into the relay log (the master always sends a fake one when replication
|
||||
# starts).
|
||||
start slave;
|
||||
let $result_pattern= '%127.0.0.1%root%master-bin.000002%slave-relay-bin.000005%Yes%Yes%0%0%None%';
|
||||
--source include/wait_slave_status.inc
|
||||
sync_with_master;
|
||||
@ -87,6 +79,7 @@ sync_with_master;
|
||||
select * from t1 order by 1 asc;
|
||||
flush logs;
|
||||
stop slave;
|
||||
--source include/wait_for_slave_to_stop.inc
|
||||
connection master;
|
||||
|
||||
# Create some entries for second log
|
||||
@ -95,6 +88,7 @@ eval create table t2 (n int)ENGINE=$engine_type;
|
||||
insert into t2 values (1);
|
||||
source include/show_binlog_events.inc;
|
||||
--replace_result $VERSION VERSION
|
||||
--replace_regex /file_id=[0-9]+/file_id=#/ /block_len=[0-9]+/block_len=#/ /infile '.+'/infile 'words.dat'/
|
||||
--replace_column 2 # 5 #
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
||||
show binlog events in 'master-bin.000002';
|
||||
@ -102,10 +96,12 @@ show binary logs;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
start slave;
|
||||
--source include/wait_for_slave_to_start.inc
|
||||
sync_with_master;
|
||||
show binary logs;
|
||||
--replace_result $MASTER_MYPORT MASTER_PORT $VERSION VERSION
|
||||
--replace_column 2 # 5 #
|
||||
--replace_regex /file_id=[0-9]+/file_id=#/ /block_len=[0-9]+/block_len=#/ /INFILE '.+'/INFILE 'words.dat'/
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
||||
show binlog events in 'slave-bin.000001' from 4;
|
||||
--replace_result $MASTER_MYPORT MASTER_PORT $VERSION VERSION
|
||||
|
@ -259,12 +259,28 @@ DELETE FROM t1;
|
||||
query_vertical SELECT COUNT(*) FROM t1 ORDER BY c1,c2;
|
||||
sync_slave_with_master;
|
||||
set @@global.slave_exec_mode= default;
|
||||
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
|
||||
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
|
||||
disable_query_log;
|
||||
eval SELECT "$last_error" AS Last_SQL_Error;
|
||||
enable_query_log;
|
||||
query_vertical SELECT COUNT(*) FROM t1 ORDER BY c1,c2;
|
||||
|
||||
# BUG#37076: TIMESTAMP/DATETIME values are not replicated correctly
|
||||
# between machines with mixed endiannes
|
||||
# (regression test)
|
||||
|
||||
--echo **** Test for BUG#37076 ****
|
||||
--echo **** On Master ****
|
||||
connection master;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (a TIMESTAMP, b DATETIME, c DATE);
|
||||
INSERT INTO t1 VALUES(
|
||||
'2005-11-14 01:01:01', '2005-11-14 01:01:02', '2005-11-14');
|
||||
|
||||
--echo **** On Slave ****
|
||||
sync_slave_with_master slave;
|
||||
SELECT * FROM t1;
|
||||
|
||||
#
|
||||
# cleanup
|
||||
#
|
||||
@ -272,3 +288,186 @@ query_vertical SELECT COUNT(*) FROM t1 ORDER BY c1,c2;
|
||||
connection master;
|
||||
DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t7,t8;
|
||||
sync_slave_with_master;
|
||||
|
||||
#
|
||||
# BUG#37426: RBR breaks for CHAR() UTF8 fields > 85 chars
|
||||
#
|
||||
|
||||
# We have 4 combinations to test with respect to the field length
|
||||
# (i.e., the number of bytes) of the CHAR fields:
|
||||
#
|
||||
# 1. Replicating from CHAR<256 to CHAR<256
|
||||
# 2. Replicating from CHAR<256 to CHAR>255
|
||||
# 3. Replicating from CHAR>255 to CHAR<256
|
||||
# 4. Replicating from CHAR>255 to CHAR>255
|
||||
|
||||
# We also make a special case of using the max size of a field on the
|
||||
# master, i.e. CHAR(255) in UTF-8, giving another three cases.
|
||||
#
|
||||
# 5. Replicating UTF-8 CHAR(255) to CHAR(<256)
|
||||
# 6. Replicating UTF-8 CHAR(255) to CHAR(>255)
|
||||
# 7. Replicating UTF-8 CHAR(255) to CHAR(255) UTF-8
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t1 (i INT NOT NULL,
|
||||
c CHAR(16) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
|
||||
eval CREATE TABLE t2 (i INT NOT NULL,
|
||||
c CHAR(16) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
|
||||
sync_slave_with_master;
|
||||
ALTER TABLE t2 MODIFY c CHAR(128) CHARACTER SET utf8 NOT NULL;
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t3 (i INT NOT NULL,
|
||||
c CHAR(128) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
sync_slave_with_master;
|
||||
ALTER TABLE t3 MODIFY c CHAR(16) CHARACTER SET utf8 NOT NULL;
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t4 (i INT NOT NULL,
|
||||
c CHAR(128) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
|
||||
eval CREATE TABLE t5 (i INT NOT NULL,
|
||||
c CHAR(255) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
sync_slave_with_master;
|
||||
ALTER TABLE t5 MODIFY c CHAR(16) CHARACTER SET utf8 NOT NULL;
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t6 (i INT NOT NULL,
|
||||
c CHAR(255) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
sync_slave_with_master;
|
||||
ALTER TABLE t6 MODIFY c CHAR(128) CHARACTER SET utf8 NOT NULL;
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t7 (i INT NOT NULL,
|
||||
c CHAR(255) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
|
||||
--echo [expecting slave to replicate correctly]
|
||||
connection master;
|
||||
INSERT INTO t1 VALUES (1, "", 1);
|
||||
INSERT INTO t1 VALUES (2, repeat(_utf8'a', 16), 2);
|
||||
sync_slave_with_master;
|
||||
|
||||
let $diff_table_1=master:test.t1;
|
||||
let $diff_table_2=slave:test.t1;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
--echo [expecting slave to replicate correctly]
|
||||
connection master;
|
||||
INSERT INTO t2 VALUES (1, "", 1);
|
||||
INSERT INTO t2 VALUES (2, repeat(_utf8'a', 16), 2);
|
||||
sync_slave_with_master;
|
||||
|
||||
let $diff_table_1=master:test.t2;
|
||||
let $diff_table_2=slave:test.t2;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
--echo [expecting slave to stop]
|
||||
connection master;
|
||||
INSERT INTO t3 VALUES (1, "", 1);
|
||||
INSERT INTO t3 VALUES (2, repeat(_utf8'a', 128), 2);
|
||||
|
||||
connection slave;
|
||||
source include/wait_for_slave_sql_to_stop.inc;
|
||||
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
|
||||
disable_query_log;
|
||||
eval SELECT "$last_error" AS Last_SQL_Error;
|
||||
enable_query_log;
|
||||
connection master;
|
||||
RESET MASTER;
|
||||
connection slave;
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
START SLAVE;
|
||||
source include/wait_for_slave_to_start.inc;
|
||||
|
||||
--echo [expecting slave to replicate correctly]
|
||||
connection master;
|
||||
INSERT INTO t4 VALUES (1, "", 1);
|
||||
INSERT INTO t4 VALUES (2, repeat(_utf8'a', 128), 2);
|
||||
sync_slave_with_master;
|
||||
|
||||
let $diff_table_1=master:test.t4;
|
||||
let $diff_table_2=slave:test.t4;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
--echo [expecting slave to stop]
|
||||
connection master;
|
||||
INSERT INTO t5 VALUES (1, "", 1);
|
||||
INSERT INTO t5 VALUES (2, repeat(_utf8'a', 255), 2);
|
||||
|
||||
connection slave;
|
||||
source include/wait_for_slave_sql_to_stop.inc;
|
||||
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
|
||||
disable_query_log;
|
||||
eval SELECT "$last_error" AS Last_SQL_Error;
|
||||
enable_query_log;
|
||||
connection master;
|
||||
RESET MASTER;
|
||||
connection slave;
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
START SLAVE;
|
||||
source include/wait_for_slave_to_start.inc;
|
||||
|
||||
--echo [expecting slave to stop]
|
||||
connection master;
|
||||
INSERT INTO t6 VALUES (1, "", 1);
|
||||
INSERT INTO t6 VALUES (2, repeat(_utf8'a', 255), 2);
|
||||
|
||||
connection slave;
|
||||
source include/wait_for_slave_sql_to_stop.inc;
|
||||
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
|
||||
disable_query_log;
|
||||
eval SELECT "$last_error" AS Last_SQL_Error;
|
||||
enable_query_log;
|
||||
connection master;
|
||||
RESET MASTER;
|
||||
connection slave;
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
START SLAVE;
|
||||
source include/wait_for_slave_to_start.inc;
|
||||
|
||||
--echo [expecting slave to replicate correctly]
|
||||
connection master;
|
||||
INSERT INTO t7 VALUES (1, "", 1);
|
||||
INSERT INTO t7 VALUES (2, repeat(_utf8'a', 255), 2);
|
||||
sync_slave_with_master;
|
||||
|
||||
let $diff_table_1=master:test.t7;
|
||||
let $diff_table_2=slave:test.t7;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
connection master;
|
||||
drop table t1, t2, t3, t4, t5, t6, t7;
|
||||
sync_slave_with_master;
|
||||
|
||||
#
|
||||
# BUG#32709: Assertion failed: trx_data->empty(), file .\log.cc, line 1293
|
||||
#
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=$type;
|
||||
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
--error ER_DUP_ENTRY
|
||||
UPDATE t1 SET a = 10;
|
||||
INSERT INTO t1 VALUES (4);
|
||||
sync_slave_with_master;
|
||||
|
||||
let $diff_table_1=master:test.t1;
|
||||
let $diff_table_2=slave:test.t1;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
connection master;
|
||||
drop table t1;
|
||||
sync_slave_with_master;
|
||||
|
@ -4,354 +4,641 @@
|
||||
# Bug#3300
|
||||
# Designed and tested by Sinisa Milivojevic, sinisa@mysql.com
|
||||
#
|
||||
# two non-interfering UPDATE's not changing result set
|
||||
#
|
||||
# The variable
|
||||
# $engine_type -- storage engine to be tested
|
||||
# has to be set before sourcing this script.
|
||||
# These variables have to be set before sourcing this script:
|
||||
# TRANSACTION ISOLATION LEVEL REPEATABLE READ
|
||||
# innodb_locks_unsafe_for_binlog 0 (default) or 1 (by
|
||||
# --innodb_locks_unsafe_for_binlog)
|
||||
# $engine_type storage engine to be tested
|
||||
#
|
||||
# Last update:
|
||||
# 2006-08-02 ML test refactored
|
||||
# old name was t/innodb_concurrent.test
|
||||
# main code went into include/concurrent.inc
|
||||
# 2008-06-03 KP test refactored; removed name locks, added comments.
|
||||
# renamed wrapper t/concurrent_innodb.test ->
|
||||
# t/concurrent_innodb_unsafelog.test
|
||||
# new wrapper t/concurrent_innodb_safelog.test
|
||||
#
|
||||
|
||||
connection default;
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
|
||||
#
|
||||
# Show prerequisites for this test.
|
||||
#
|
||||
SELECT @@global.tx_isolation;
|
||||
SELECT @@global.innodb_locks_unsafe_for_binlog;
|
||||
#
|
||||
# When innodb_locks_unsafe_for_binlog is not set (zero), which is the
|
||||
# default, InnoDB takes "next-key locks"/"gap locks". This means it
|
||||
# locks the gap before the keys that it accessed to find the rows to
|
||||
# use for a statement. In this case we have to expect some more lock
|
||||
# wait timeouts in the tests below as if innodb_locks_unsafe_for_binlog
|
||||
# is set (non-zero). In the latter case no "next-key locks"/"gap locks"
|
||||
# are taken and locks on keys that do not match the WHERE conditon are
|
||||
# released. Hence less lock collisions occur.
|
||||
# We use the variable $keep_locks to set the expectations for
|
||||
# lock wait timeouts accordingly.
|
||||
#
|
||||
let $keep_locks= `SELECT NOT @@global.innodb_locks_unsafe_for_binlog`;
|
||||
--echo # keep_locks == $keep_locks
|
||||
|
||||
#
|
||||
# Set up privileges and remove user level locks, if exist.
|
||||
#
|
||||
GRANT USAGE ON test.* TO mysqltest@localhost;
|
||||
|
||||
#
|
||||
# Preparatory cleanup.
|
||||
#
|
||||
DO release_lock("hello");
|
||||
DO release_lock("hello2");
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",1);
|
||||
connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send update t1 set eta=1+get_lock("hello",1)*0 where tipo=11;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
update t1 set eta=2 where tipo=22;
|
||||
select release_lock("hello");
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
commit;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# two UPDATE's running and one changing result set
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send update t1 set eta=1+get_lock("hello",10)*0 where tipo=1;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
update t1 set tipo=1 where tipo=2;
|
||||
select release_lock("hello");
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
commit;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** two UPDATE's running and both changing distinct result sets
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
--echo ** Get user level lock (ULL) for thread 1
|
||||
select get_lock("hello",10);
|
||||
|
||||
--echo ** connection thread2
|
||||
connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Start transaction for thread 2
|
||||
begin;
|
||||
--echo ** Update will cause a table scan and a new ULL will
|
||||
--echo ** be created and blocked on the first row where tipo=11.
|
||||
send update t1 set eta=1+get_lock("hello",10)*0 where tipo=11;
|
||||
sleep 1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Start new transaction for thread 1
|
||||
begin;
|
||||
--echo ** Update on t1 will cause a table scan which will be blocked because
|
||||
--echo ** the previously initiated table scan applied exclusive key locks on
|
||||
--echo ** all primary keys.
|
||||
--echo ** Not so if innodb_locks_unsafe_for_binlog is set. The locks that
|
||||
--echo ** do not match the WHERE condition are released.
|
||||
if ($keep_locks)
|
||||
{
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set eta=2 where tipo=22;
|
||||
}
|
||||
if (!$keep_locks)
|
||||
{
|
||||
update t1 set eta=2 where tipo=22;
|
||||
}
|
||||
--echo ** Release user level name lock from thread 1. This will cause the ULL
|
||||
--echo ** on thread 2 to end its wait.
|
||||
select release_lock("hello");
|
||||
--echo ** Table is now updated with a new eta on tipo=22 for thread 1.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Release the lock and collect result from update on thread 2
|
||||
reap;
|
||||
select release_lock("hello");
|
||||
--echo ** Table should have eta updates where tipo=11 but updates made by
|
||||
--echo ** thread 1 shouldn't be visible yet.
|
||||
select * from t1;
|
||||
--echo ** Sending commit on thread 2.
|
||||
commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Make sure table reads didn't change yet on thread 1.
|
||||
select * from t1;
|
||||
--echo ** And send final commit on thread 1.
|
||||
commit;
|
||||
--echo ** Table should now be updated by both updates in the order of
|
||||
--echo ** thread 1,2.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Make sure the output is similar for t1.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
#
|
||||
# One UPDATE and one INSERT .... Monty's test
|
||||
#
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** two UPDATE's running and one changing result set
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
--echo ** Get ULL "hello" on thread 1
|
||||
select get_lock("hello",10);
|
||||
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1 (a int not null, b int not null);
|
||||
insert into t1 values (1,1),(2,1),(3,1),(4,1);
|
||||
select get_lock("hello2",1000);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send update t1 set b=10+get_lock(concat("hello",a),1000)*0 where
|
||||
a=2;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
insert into t1 values (1,1);
|
||||
select release_lock("hello2");
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
sleep 1;
|
||||
connection thread2;
|
||||
reap;
|
||||
connection default;
|
||||
drop table t1;
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Start transaction on thread 2
|
||||
begin;
|
||||
--echo ** Update will cause a table scan.
|
||||
--echo ** This will cause a hang on the first row where tipo=1 until the
|
||||
--echo ** blocking ULL is released.
|
||||
send update t1 set eta=1+get_lock("hello",10)*0 where tipo=1;
|
||||
sleep 1;
|
||||
|
||||
#
|
||||
# one UPDATE changing result set and SELECT ... FOR UPDATE
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send select * from t1 where tipo=2 FOR UPDATE;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
select release_lock("hello");
|
||||
--error 1205
|
||||
update t1 set tipo=1+get_lock("hello",10)*0 where tipo=2;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
commit;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
connection default;
|
||||
drop table t1;
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Start transaction on thread 1
|
||||
begin;
|
||||
--echo ** Update on t1 will cause a table scan which will be blocked because
|
||||
--echo ** the previously initiated table scan applied exclusive key locks on
|
||||
--echo ** all primary keys.
|
||||
--echo ** Not so if innodb_locks_unsafe_for_binlog is set. The locks that
|
||||
--echo ** do not match the WHERE condition are released.
|
||||
if ($keep_locks)
|
||||
{
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set tipo=1 where tipo=2;
|
||||
}
|
||||
if (!$keep_locks)
|
||||
{
|
||||
update t1 set tipo=1 where tipo=2;
|
||||
}
|
||||
--echo ** Release ULL. This will release the next waiting ULL on thread 2.
|
||||
select release_lock("hello");
|
||||
--echo ** The table should still be updated with updates for thread 1 only:
|
||||
select * from t1;
|
||||
|
||||
#
|
||||
# one UPDATE not changing result set and SELECT ... FOR UPDATE
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send select * from t1 where tipo=2 FOR UPDATE;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
select release_lock("hello");
|
||||
--error 1205
|
||||
update t1 set tipo=11+get_lock("hello",10)*0 where tipo=22;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
commit;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
connection default;
|
||||
drop table t1;
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Release the lock and collect result from thread 2:
|
||||
reap;
|
||||
select release_lock("hello");
|
||||
--echo ** Seen from thread 2 the table should have been updated on four
|
||||
--echo ** places.
|
||||
select * from t1;
|
||||
commit;
|
||||
|
||||
#
|
||||
# two SELECT ... FOR UPDATE
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send select * from t1 where tipo=2 FOR UPDATE;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
select release_lock("hello");
|
||||
--error 1205
|
||||
select * from t1 where tipo=1 FOR UPDATE;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
commit;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Thread 2 has committed but the result should remain the same for
|
||||
--echo ** thread 1 (updated on three places):
|
||||
select * from t1;
|
||||
commit;
|
||||
--echo ** After a commit the table should be merged with the previous
|
||||
--echo ** commit.
|
||||
--echo ** This select should show both updates:
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
#
|
||||
# one UPDATE changing result set and DELETE
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send delete from t1 where tipo=2;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
select release_lock("hello");
|
||||
--error 1205
|
||||
update t1 set tipo=1+get_lock("hello",10)*0 where tipo=2;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
commit;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** One UPDATE and one INSERT .... Monty's test
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1 (a int not null, b int not null);
|
||||
insert into t1 values (1,1),(2,1),(3,1),(4,1);
|
||||
--echo ** Create ULL 'hello2'
|
||||
select get_lock("hello2",10);
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Begin a new transaction on thread 2
|
||||
begin;
|
||||
--echo ** Update will create a table scan which creates a ULL where a=2;
|
||||
--echo ** this will hang waiting on thread 1.
|
||||
send update t1 set b=10+get_lock(concat("hello",a),10)*0 where a=2;
|
||||
sleep 1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Insert new values to t1 from thread 1; this created an implicit
|
||||
--echo ** commit since there are no on-going transactions.
|
||||
insert into t1 values (1,1);
|
||||
--echo ** Release the ULL (thread 2 updates will finish).
|
||||
select release_lock("hello2");
|
||||
--echo ** ..but thread 1 will still see t1 as if nothing has happend:
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Collect results from thread 2 and release the lock.
|
||||
reap;
|
||||
select release_lock("hello2");
|
||||
--echo ** The table should look like the original+updates for thread 2,
|
||||
--echo ** and consist of new rows:
|
||||
select * from t1;
|
||||
--echo ** Commit changes from thread 2
|
||||
commit;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
#
|
||||
# one UPDATE not changing result set and DELETE
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send delete from t1 where tipo=2;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
select release_lock("hello");
|
||||
update t1 set tipo=1+get_lock("hello",10)*0 where tipo=22;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
commit;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** one UPDATE changing result set and SELECT ... FOR UPDATE
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Begin a new transaction on thread 2
|
||||
begin;
|
||||
--echo ** Select a range for update.
|
||||
select * from t1 where tipo=2 FOR UPDATE;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Begin a new transaction on thread 1
|
||||
begin;
|
||||
--echo ** Update the same range which is marked for update on thread 2; this
|
||||
--echo ** will hang because of row locks.
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set tipo=1 where tipo=2;
|
||||
--echo ** After the update the table will be unmodified because the previous
|
||||
--echo ** transaction failed and was rolled back.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** The table should look unmodified from thread 2.
|
||||
select * from t1;
|
||||
--echo ** Sending a commit should release the row locks and enable
|
||||
--echo ** thread 1 to complete the transaction.
|
||||
commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Commit on thread 1.
|
||||
commit;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** The table should not have been changed.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Even on thread 1:
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
sleep 1;
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** one UPDATE not changing result set and SELECT ... FOR UPDATE
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Starting new transaction on thread 2.
|
||||
begin;
|
||||
--echo ** Starting SELECT .. FOR UPDATE
|
||||
select * from t1 where tipo=2 FOR UPDATE;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo
|
||||
--echo ** Starting new transaction on thread 1
|
||||
begin;
|
||||
--echo ** Updating single row using a table scan. This will time out
|
||||
--echo ** because of ongoing transaction on thread 1 holding lock on
|
||||
--echo ** all primary keys in the scan.
|
||||
--echo ** Not so if innodb_locks_unsafe_for_binlog is set. The locks that
|
||||
--echo ** do not match the WHERE condition are released.
|
||||
if ($keep_locks)
|
||||
{
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set tipo=11 where tipo=22;
|
||||
}
|
||||
if (!$keep_locks)
|
||||
{
|
||||
update t1 set tipo=11 where tipo=22;
|
||||
}
|
||||
--echo ** After the time out the transaction is aborted; no rows should
|
||||
--echo ** have changed.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** The same thing should hold true for the transaction on
|
||||
--echo ** thread 2
|
||||
select * from t1;
|
||||
send commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
commit;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Even after committing:
|
||||
reap;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** two SELECT ... FOR UPDATE
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Begin a new transaction on thread 2
|
||||
begin;
|
||||
select * from t1 where tipo=2 FOR UPDATE;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Begin a new transaction on thread 1
|
||||
begin;
|
||||
--echo ** Selecting a range for update by table scan will be blocked
|
||||
--echo ** because of on-going transaction on thread 2.
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
select * from t1 where tipo=1 FOR UPDATE;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Table will be unchanged and the select command will not be
|
||||
--echo ** blocked:
|
||||
select * from t1;
|
||||
--echo ** Commit transacton on thread 2.
|
||||
commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Commit transaction on thread 1.
|
||||
commit;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Make sure table isn't blocked on thread 2:
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Make sure table isn't blocked on thread 1:
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** one UPDATE changing result set and DELETE
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send delete from t1 where tipo=2;
|
||||
sleep 1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
begin;
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set tipo=1 where tipo=2;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
commit;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** one UPDATE not changing result set and DELETE
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send delete from t1 where tipo=2;
|
||||
sleep 1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
begin;
|
||||
--echo ** Update on t1 will cause a table scan which will be blocked because
|
||||
--echo ** the previously initiated table scan applied exclusive key locks on
|
||||
--echo ** all primary keys.
|
||||
--echo ** Not so if innodb_locks_unsafe_for_binlog is set. The locks that
|
||||
--echo ** do not match the WHERE condition are released.
|
||||
if ($keep_locks)
|
||||
{
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set tipo=1 where tipo=22;
|
||||
}
|
||||
if (!$keep_locks)
|
||||
{
|
||||
update t1 set tipo=1 where tipo=22;
|
||||
}
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
commit;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
disconnect thread1;
|
||||
disconnect thread2;
|
||||
|
||||
|
@ -136,7 +136,7 @@ connect (user3,localhost,mysqltest_3,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connection user3;
|
||||
select "user3";
|
||||
--replace_result 127.0.0.1 localhost
|
||||
--error ER_COLUMNACCESS_DENIED_ERROR
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
select * from t1;
|
||||
select a from t1;
|
||||
--replace_result 127.0.0.1 localhost
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_big5.require
|
||||
disable_query_log;
|
||||
show collation like "big5_chinese_ci";
|
||||
show collation like 'big5_chinese_ci';
|
||||
enable_query_log;
|
||||
|
@ -2,5 +2,5 @@
|
||||
|
||||
-- require r/have_binlog_format_mixed.require
|
||||
disable_query_log;
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
enable_query_log;
|
||||
|
@ -3,5 +3,5 @@
|
||||
--require r/have_binlog_format_row.require
|
||||
--disable_query_log
|
||||
--replace_result MIXED ROW
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
--enable_query_log
|
||||
|
@ -4,5 +4,5 @@ source include/have_log_bin.inc;
|
||||
--require r/have_binlog_format_statement.require
|
||||
--disable_query_log
|
||||
--replace_result MIXED STATEMENT
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
--enable_query_log
|
||||
|
@ -2,5 +2,5 @@
|
||||
|
||||
-- require r/have_binlog_format_row.require
|
||||
disable_query_log;
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
enable_query_log;
|
||||
|
@ -3,5 +3,5 @@
|
||||
-- require r/have_binlog_format_statement.require
|
||||
--disable_query_log
|
||||
--replace_result ROW STATEMENT
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
--enable_query_log
|
||||
|
@ -2,5 +2,5 @@
|
||||
|
||||
-- require r/have_binlog_format_statement.require
|
||||
disable_query_log;
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
enable_query_log;
|
||||
|
@ -3,5 +3,5 @@
|
||||
#
|
||||
--require r/have_bug25714.require
|
||||
disable_query_log;
|
||||
eval select LENGTH("$MYSQL_BUG25714") > 0 as "have_bug25714_exe";
|
||||
eval select LENGTH('$MYSQL_BUG25714') > 0 as 'have_bug25714_exe';
|
||||
enable_query_log;
|
||||
|
4
mysql-test/include/have_case_insensitive_file_system.inc
Normal file
4
mysql-test/include/have_case_insensitive_file_system.inc
Normal file
@ -0,0 +1,4 @@
|
||||
--require r/case_insensitive_file_system.require
|
||||
--disable_query_log
|
||||
show variables like "lower_case_file_system";
|
||||
--enable_query_log
|
@ -1,4 +1,4 @@
|
||||
--require r/case_sensitive_file_system.require
|
||||
--disable_query_log
|
||||
show variables like "lower_case_file_system";
|
||||
show variables like 'lower_case_file_system';
|
||||
--enable_query_log
|
||||
|
@ -1,4 +1,4 @@
|
||||
--require r/have_community_features.require
|
||||
--disable_query_log
|
||||
show variables like "have_community_features";
|
||||
show variables like 'have_community_features';
|
||||
--enable_query_log
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_compress.require
|
||||
disable_query_log;
|
||||
show variables like "have_compress";
|
||||
show variables like 'have_compress';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_cp1250_ch.require
|
||||
disable_query_log;
|
||||
show collation like "cp1250_czech_cs";
|
||||
show collation like 'cp1250_czech_cs';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_cp932.require
|
||||
disable_query_log;
|
||||
show collation like "cp932_japanese_ci";
|
||||
show collation like 'cp932_japanese_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_crypt.require
|
||||
disable_query_log;
|
||||
show variables like "have_crypt";
|
||||
show variables like 'have_crypt';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_debug.require
|
||||
disable_query_log;
|
||||
select (version() like "%debug%") as debug;
|
||||
select (version() like '%debug%') as debug;
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_eucjpms.require
|
||||
disable_query_log;
|
||||
show collation like "eucjpms_japanese_ci";
|
||||
show collation like 'eucjpms_japanese_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_euckr.require
|
||||
disable_query_log;
|
||||
show collation like "euckr_korean_ci";
|
||||
show collation like 'euckr_korean_ci';
|
||||
enable_query_log;
|
||||
|
@ -4,7 +4,7 @@
|
||||
#
|
||||
--require r/have_dynamic_loading.require
|
||||
disable_query_log;
|
||||
show variables like "have_dynamic_loading";
|
||||
show variables like 'have_dynamic_loading';
|
||||
enable_query_log;
|
||||
|
||||
#
|
||||
@ -12,5 +12,5 @@ enable_query_log;
|
||||
#
|
||||
--require r/have_example_plugin.require
|
||||
disable_query_log;
|
||||
eval select LENGTH("$EXAMPLE_PLUGIN") > 0 as "have_example_plugin";
|
||||
eval select LENGTH('$EXAMPLE_PLUGIN') > 0 as 'have_example_plugin';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_gb2312.require
|
||||
disable_query_log;
|
||||
show collation like "gb2312_chinese_ci";
|
||||
show collation like 'gb2312_chinese_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_gbk.require
|
||||
disable_query_log;
|
||||
show collation like "gbk_chinese_ci";
|
||||
show collation like 'gbk_chinese_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
--require r/have_geometry.require
|
||||
--disable_query_log
|
||||
show variables like "have_geometry";
|
||||
show variables like 'have_geometry';
|
||||
--enable_query_log
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_latin2_ch.require
|
||||
disable_query_log;
|
||||
show collation like "latin2_czech_cs";
|
||||
show collation like 'latin2_czech_cs';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_log_bin.require
|
||||
disable_query_log;
|
||||
show variables like "log_bin";
|
||||
show variables like 'log_bin';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
--require r/lowercase0.require
|
||||
--disable_query_log
|
||||
show variables like "lower_case_%";
|
||||
show variables like "lower_case_table_names";
|
||||
--enable_query_log
|
||||
|
4
mysql-test/include/have_lowercase2.inc
Normal file
4
mysql-test/include/have_lowercase2.inc
Normal file
@ -0,0 +1,4 @@
|
||||
--require r/lowercase2.require
|
||||
--disable_query_log
|
||||
show variables like 'lower_case_table_names';
|
||||
--enable_query_log
|
@ -1,4 +1,4 @@
|
||||
--require r/have_ndbapi_examples.require
|
||||
disable_query_log;
|
||||
eval select LENGTH("$MY_NDB_EXAMPLES_BINARY") > 0 as "have_ndb_example";
|
||||
eval select LENGTH('$MY_NDB_EXAMPLES_BINARY') > 0 as 'have_ndb_example';
|
||||
enable_query_log;
|
||||
|
@ -1,5 +1,5 @@
|
||||
-- require r/have_outfile.require
|
||||
disable_query_log;
|
||||
select load_file(concat(@tmpdir,"/outfile.test"));
|
||||
select load_file(concat(@tmpdir,'/outfile.test'));
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/outfile.test
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_partition.require
|
||||
disable_query_log;
|
||||
show variables like "have_partitioning";
|
||||
show variables like 'have_partitioning';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_query_cache.require
|
||||
disable_query_log;
|
||||
show variables like "have_query_cache";
|
||||
show variables like 'have_query_cache';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_sjis.require
|
||||
disable_query_log;
|
||||
show collation like "sjis_japanese_ci";
|
||||
show collation like 'sjis_japanese_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_ssl.require
|
||||
disable_query_log;
|
||||
show variables like "have_ssl";
|
||||
show variables like 'have_ssl';
|
||||
enable_query_log;
|
||||
|
@ -6,5 +6,5 @@
|
||||
-- require r/have_symlink.require
|
||||
|
||||
disable_query_log;
|
||||
show variables like "have_symlink";
|
||||
show variables like 'have_symlink';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_tis620.require
|
||||
disable_query_log;
|
||||
show collation like "tis620_thai_ci";
|
||||
show collation like 'tis620_thai_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_ucs2.require
|
||||
disable_query_log;
|
||||
show collation like "ucs2_general_ci";
|
||||
show collation like 'ucs2_general_ci';
|
||||
enable_query_log;
|
||||
|
@ -4,7 +4,7 @@
|
||||
#
|
||||
--require r/have_dynamic_loading.require
|
||||
disable_query_log;
|
||||
show variables like "have_dynamic_loading";
|
||||
show variables like 'have_dynamic_loading';
|
||||
enable_query_log;
|
||||
|
||||
#
|
||||
@ -12,5 +12,5 @@ enable_query_log;
|
||||
#
|
||||
--require r/have_udf_example.require
|
||||
disable_query_log;
|
||||
eval select LENGTH("$UDF_EXAMPLE_LIB") > 0 as "have_udf_example_lib";
|
||||
eval select LENGTH('$UDF_EXAMPLE_LIB') > 0 as 'have_udf_example_lib';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_ujis.require
|
||||
disable_query_log;
|
||||
show collation like "ujis_japanese_ci";
|
||||
show collation like 'ujis_japanese_ci';
|
||||
enable_query_log;
|
||||
|
@ -487,3 +487,18 @@ select * from t2 where a=4 or b=4;
|
||||
|
||||
drop table t1, t2;
|
||||
|
||||
#
|
||||
# Bug #37943: Reproducible mysqld crash/sigsegv in sel_trees_can_be_ored
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a varchar(8), b set('a','b','c','d','e','f','g','h'),
|
||||
KEY b(b), KEY a(a));
|
||||
INSERT INTO t1 VALUES ('y',''), ('z','');
|
||||
|
||||
#should not crash
|
||||
SELECT b,a from t1 WHERE (b!='c' AND b!='f' && b!='h') OR
|
||||
(a='pure-S') OR (a='DE80337a') OR (a='DE80799');
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
@ -1103,6 +1103,24 @@ set @my_innodb_commit_concurrency=@@global.innodb_commit_concurrency;
|
||||
set global innodb_commit_concurrency=0;
|
||||
set global innodb_commit_concurrency=@my_innodb_commit_concurrency;
|
||||
|
||||
#
|
||||
# Bug #37830: ORDER BY ASC/DESC - no difference
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a int, b int, c int, PRIMARY KEY (a), KEY t1_b (b))
|
||||
ENGINE=InnoDB;
|
||||
|
||||
INSERT INTO t1 (a,b,c) VALUES (1,1,1), (2,1,1), (3,1,1), (4,1,1);
|
||||
INSERT INTO t1 (a,b,c) SELECT a+4,b,c FROM t1;
|
||||
|
||||
# should be range access
|
||||
EXPLAIN SELECT a, b, c FROM t1 WHERE b = 1 ORDER BY a DESC LIMIT 5;
|
||||
|
||||
# should produce '8 7 6 5 4' for a
|
||||
SELECT a, b, c FROM t1 WHERE b = 1 ORDER BY a DESC LIMIT 5;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
# Fix for BUG#19243 "wrong LAST_INSERT_ID() after ON DUPLICATE KEY
|
||||
@ -1238,6 +1256,7 @@ connect (con1,localhost,root,,);
|
||||
connect (con2,localhost,root,,);
|
||||
SET SESSION AUTOCOMMIT = 0;
|
||||
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
set binlog_format=mixed;
|
||||
--echo # Switch to connection con1
|
||||
connection con1;
|
||||
|
||||
@ -1428,29 +1447,31 @@ DROP TABLE t1;
|
||||
# Bug#21704: Renaming column does not update FK definition.
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1(id INT PRIMARY KEY)
|
||||
ENGINE=innodb;
|
||||
|
||||
CREATE TABLE t2(
|
||||
t1_id INT PRIMARY KEY,
|
||||
CONSTRAINT fk1 FOREIGN KEY (t1_id) REFERENCES t1(id))
|
||||
ENGINE=innodb;
|
||||
|
||||
--echo
|
||||
|
||||
--disable_result_log
|
||||
--error ER_ERROR_ON_RENAME
|
||||
ALTER TABLE t1 CHANGE id id2 INT;
|
||||
--enable_result_log
|
||||
|
||||
--echo
|
||||
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# --disable_warnings
|
||||
# DROP TABLE IF EXISTS t1;
|
||||
# DROP TABLE IF EXISTS t2;
|
||||
# --enable_warnings
|
||||
#
|
||||
# CREATE TABLE t1(id INT PRIMARY KEY)
|
||||
# ENGINE=innodb;
|
||||
#
|
||||
# CREATE TABLE t2(
|
||||
# t1_id INT PRIMARY KEY,
|
||||
# CONSTRAINT fk1 FOREIGN KEY (t1_id) REFERENCES t1(id))
|
||||
# ENGINE=innodb;
|
||||
#
|
||||
# --echo
|
||||
#
|
||||
# --disable_result_log
|
||||
# --error ER_ERROR_ON_RENAME
|
||||
# ALTER TABLE t1 CHANGE id id2 INT;
|
||||
# --enable_result_log
|
||||
#
|
||||
# --echo
|
||||
#
|
||||
# DROP TABLE t2;
|
||||
# DROP TABLE t1;
|
||||
#
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
1922
mysql-test/include/mysqlbinlog_row_engine.inc
Normal file
1922
mysql-test/include/mysqlbinlog_row_engine.inc
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,7 @@
|
||||
--exec $NDB_TOOLS_DIR/ndb_restore --no-defaults $ndb_restore_opts -b $the_backup_id -n 1 $NDB_BACKUP_DIR/BACKUP/BACKUP-$the_backup_id $ndb_restore_filter > $MYSQLTEST_VARDIR/tmp/tmp.dat
|
||||
--exec $NDB_TOOLS_DIR/ndb_restore --no-defaults $ndb_restore_opts -b $the_backup_id -n 2 $NDB_BACKUP_DIR/BACKUP/BACKUP-$the_backup_id $ndb_restore_filter >> $MYSQLTEST_VARDIR/tmp/tmp.dat
|
||||
--exec sort $MYSQLTEST_VARDIR/tmp/tmp.dat
|
||||
--exec rm -f $MYSQLTEST_VARDIR/tmp/tmp.dat
|
||||
--error 0,1
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/tmp.dat
|
||||
--let ndb_restore_opts=
|
||||
--let ndb_restore_filter=
|
||||
|
25
mysql-test/include/ps_ddl_1.inc
Normal file
25
mysql-test/include/ps_ddl_1.inc
Normal file
@ -0,0 +1,25 @@
|
||||
# include/ps_ddl_1.inc
|
||||
#
|
||||
# Auxiliary script to be used in ps_ddl.test
|
||||
#
|
||||
|
||||
prepare stmt_sf from 'select f_12093();';
|
||||
prepare stmt_sp from 'call p_12093(f_12093())';
|
||||
execute stmt_sf;
|
||||
execute stmt_sp;
|
||||
|
||||
connection con1;
|
||||
eval $my_drop;
|
||||
#
|
||||
connection default;
|
||||
--echo # XXX: used to be a bug
|
||||
execute stmt_sf;
|
||||
--echo # XXX: used to be a bug
|
||||
execute stmt_sp;
|
||||
#
|
||||
--echo # XXX: used to be a bug
|
||||
execute stmt_sf;
|
||||
--echo # XXX: used to be a bug
|
||||
execute stmt_sp;
|
||||
|
||||
connection default;
|
@ -4,7 +4,7 @@ if (!$binlog_start)
|
||||
{
|
||||
let $binlog_start=106;
|
||||
}
|
||||
--replace_result $binlog_start <binlog_start>
|
||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR $binlog_start <binlog_start>
|
||||
--replace_column 2 # 4 # 5 #
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /file_id=[0-9]+/file_id=#/
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /file_id=[0-9]+/file_id=#/ /block_len=[0-9]+/block_len=#/
|
||||
--eval show binlog events from $binlog_start
|
||||
|
59
mysql-test/include/wait_condition.inc.moved
Normal file
59
mysql-test/include/wait_condition.inc.moved
Normal file
@ -0,0 +1,59 @@
|
||||
# include/wait_condition.inc
|
||||
#
|
||||
# SUMMARY
|
||||
#
|
||||
# Waits until the passed statement returns true, or the operation
|
||||
# times out.
|
||||
#
|
||||
# USAGE
|
||||
#
|
||||
# let $wait_condition=
|
||||
# SELECT c = 3 FROM t;
|
||||
# --source include/wait_condition.inc
|
||||
#
|
||||
# OR
|
||||
#
|
||||
# let $wait_timeout= 60; # Override default 30 seconds with 60.
|
||||
# let $wait_condition=
|
||||
# SELECT c = 3 FROM t;
|
||||
# --source include/wait_condition.inc
|
||||
# --echo Executed the test condition $wait_condition_reps times
|
||||
#
|
||||
# EXAMPLE
|
||||
# events_bugs.test, events_time_zone.test
|
||||
#
|
||||
|
||||
--disable_query_log
|
||||
|
||||
let $wait_counter= 300;
|
||||
if ($wait_timeout)
|
||||
{
|
||||
let $wait_counter= `SELECT $wait_timeout * 10`;
|
||||
}
|
||||
# Reset $wait_timeout so that its value won't be used on subsequent
|
||||
# calls, and default will be used instead.
|
||||
let $wait_timeout= 0;
|
||||
|
||||
# Keep track of how many times the wait condition is tested
|
||||
# This is used by some tests (e.g., main.status)
|
||||
let $wait_condition_reps= 0;
|
||||
while ($wait_counter)
|
||||
{
|
||||
let $success= `$wait_condition`;
|
||||
inc $wait_condition_reps;
|
||||
if ($success)
|
||||
{
|
||||
let $wait_counter= 0;
|
||||
}
|
||||
if (!$success)
|
||||
{
|
||||
real_sleep 0.1;
|
||||
dec $wait_counter;
|
||||
}
|
||||
}
|
||||
if (!$success)
|
||||
{
|
||||
echo Timeout in wait_condition.inc for $wait_condition;
|
||||
}
|
||||
|
||||
--enable_query_log
|
27
mysql-test/include/wait_for_slave_sql_error_and_skip.inc
Normal file
27
mysql-test/include/wait_for_slave_sql_error_and_skip.inc
Normal file
@ -0,0 +1,27 @@
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# Wait for slave SQL error, skip the erroneous statement and restart
|
||||
# slave
|
||||
#
|
||||
# ==== Usage ====
|
||||
#
|
||||
# let show_sql_error=0|1;
|
||||
# source include/wait_for_slave_sql_error_and_skip.inc;
|
||||
|
||||
echo --source include/wait_for_slave_sql_error_and_skip.inc;
|
||||
connection slave;
|
||||
source include/wait_for_slave_sql_error.inc;
|
||||
if ($show_sql_error)
|
||||
{
|
||||
let $error= query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
|
||||
echo Last_SQL_Error = $error;
|
||||
}
|
||||
|
||||
# wait for SQL thread to stop after the error
|
||||
source include/wait_for_slave_sql_to_stop.inc;
|
||||
|
||||
# skip the erroneous statement
|
||||
set global sql_slave_skip_counter=1;
|
||||
start slave;
|
||||
source include/wait_for_slave_to_start.inc;
|
||||
connection master;
|
@ -433,41 +433,51 @@ sub optimize_cases {
|
||||
# Skip processing if already marked as skipped
|
||||
next if $tinfo->{skip};
|
||||
|
||||
# Replication test needs an adjustment of binlog format
|
||||
if (mtr_match_prefix($tinfo->{'name'}, "rpl"))
|
||||
# =======================================================
|
||||
# If a special binlog format was selected with
|
||||
# --mysqld=--binlog-format=x, skip all test that does not
|
||||
# support it
|
||||
# =======================================================
|
||||
#print "used_binlog_format: $::used_binlog_format\n";
|
||||
if (defined $::used_binlog_format )
|
||||
{
|
||||
# =======================================================
|
||||
# Fixed --binlog-format=x specified on command line
|
||||
# =======================================================
|
||||
if ( defined $tinfo->{'binlog_formats'} )
|
||||
{
|
||||
#print "binlog_formats: ". join(", ", @{$tinfo->{binlog_formats}})."\n";
|
||||
|
||||
# The test supports different binlog formats
|
||||
# check if the selected one is ok
|
||||
my $supported=
|
||||
grep { $_ eq $::used_binlog_format } @{$tinfo->{'binlog_formats'}};
|
||||
if ( !$supported )
|
||||
{
|
||||
$tinfo->{'skip'}= 1;
|
||||
$tinfo->{'comment'}=
|
||||
"Doesn't support --binlog-format='$::used_binlog_format'";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
# =======================================================
|
||||
# Use dynamic switching of binlog format
|
||||
# =======================================================
|
||||
|
||||
# Get binlog-format used by this test from master_opt
|
||||
# =======================================================
|
||||
my $test_binlog_format;
|
||||
foreach my $opt ( @{$tinfo->{master_opt}} ) {
|
||||
$test_binlog_format= $test_binlog_format ||
|
||||
mtr_match_prefix($opt, "--binlog-format=");
|
||||
}
|
||||
# print $tinfo->{name}." uses ".$test_binlog_format."\n";
|
||||
|
||||
# =======================================================
|
||||
# If a special binlog format was selected with
|
||||
# --mysqld=--binlog-format=x, skip all test with different
|
||||
# binlog-format
|
||||
# =======================================================
|
||||
if (defined $::used_binlog_format and
|
||||
$test_binlog_format and
|
||||
$::used_binlog_format ne $test_binlog_format)
|
||||
{
|
||||
$tinfo->{'skip'}= 1;
|
||||
$tinfo->{'comment'}= "Requires --binlog-format='$test_binlog_format'";
|
||||
next;
|
||||
$test_binlog_format=
|
||||
mtr_match_prefix($opt, "--binlog-format=") || $test_binlog_format;
|
||||
}
|
||||
|
||||
# =======================================================
|
||||
# Check that testcase supports the designated binlog-format
|
||||
# =======================================================
|
||||
if ($test_binlog_format and defined $tinfo->{'sup_binlog_formats'} )
|
||||
if (defined $test_binlog_format and
|
||||
defined $tinfo->{binlog_formats} )
|
||||
{
|
||||
my $supported=
|
||||
grep { $_ eq $test_binlog_format } @{$tinfo->{'sup_binlog_formats'}};
|
||||
grep { $_ eq $test_binlog_format } @{$tinfo->{'binlog_formats'}};
|
||||
if ( !$supported )
|
||||
{
|
||||
$tinfo->{'skip'}= 1;
|
||||
@ -476,20 +486,8 @@ sub optimize_cases {
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
# =======================================================
|
||||
# Use dynamic switching of binlog-format if mtr started
|
||||
# w/o --mysqld=--binlog-format=xxx and combinations.
|
||||
# =======================================================
|
||||
if (!defined $tinfo->{'combination'} and
|
||||
!defined $::used_binlog_format)
|
||||
{
|
||||
$test_binlog_format= $tinfo->{'sup_binlog_formats'}->[0];
|
||||
}
|
||||
|
||||
# Save binlog format for dynamic switching
|
||||
$tinfo->{binlog_format}= $test_binlog_format;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -773,6 +771,13 @@ sub collect_one_test_case($$$$$$$$$) {
|
||||
if ( $::used_default_engine =~ /^innodb/i );
|
||||
}
|
||||
|
||||
#enable federated for this test
|
||||
if ($tinfo->{'federated_test'})
|
||||
{
|
||||
push(@{$tinfo->{'master_opt'}}, "--loose-federated");
|
||||
push(@{$tinfo->{'slave_opt'}}, "--loose-federated");
|
||||
}
|
||||
|
||||
if ( $tinfo->{'big_test'} and ! $::opt_big_test )
|
||||
{
|
||||
$tinfo->{'skip'}= 1;
|
||||
@ -872,18 +877,19 @@ sub collect_one_test_case($$$$$$$$$) {
|
||||
# the specified value in "tinfo"
|
||||
our @tags=
|
||||
(
|
||||
["include/have_innodb.inc", "innodb_test", 1],
|
||||
["include/have_binlog_format_row.inc", "sup_binlog_formats", ["row"]],
|
||||
["include/have_log_bin.inc", "need_binlog", 1],
|
||||
["include/have_binlog_format_statement.inc",
|
||||
"sup_binlog_formats", ["statement"]],
|
||||
["include/have_binlog_format_mixed.inc", "sup_binlog_formats", ["mixed"]],
|
||||
|
||||
["include/have_binlog_format_row.inc", "binlog_formats", ["row"]],
|
||||
["include/have_binlog_format_statement.inc", "binlog_formats", ["statement"]],
|
||||
["include/have_binlog_format_mixed.inc", "binlog_formats", ["mixed"]],
|
||||
["include/have_binlog_format_mixed_or_row.inc",
|
||||
"sup_binlog_formats", ["mixed","row"]],
|
||||
"binlog_formats", ["mixed", "row"]],
|
||||
["include/have_binlog_format_mixed_or_statement.inc",
|
||||
"sup_binlog_formats", ["mixed","statement"]],
|
||||
"binlog_formats", ["mixed", "statement"]],
|
||||
["include/have_binlog_format_row_or_statement.inc",
|
||||
"sup_binlog_formats", ["row","statement"]],
|
||||
"binlog_formats", ["row", "statement"]],
|
||||
|
||||
["include/have_innodb.inc", "innodb_test", 1],
|
||||
["include/have_log_bin.inc", "need_binlog", 1],
|
||||
["include/big_test.inc", "big_test", 1],
|
||||
["include/have_debug.inc", "need_debug", 1],
|
||||
["include/have_ndb.inc", "ndb_test", 1],
|
||||
@ -891,6 +897,8 @@ our @tags=
|
||||
["include/have_ndb_extra.inc", "ndb_extra", 1],
|
||||
["include/ndb_master-slave.inc", "ndb_test", 1],
|
||||
["require_manager", "require_manager", 1],
|
||||
["include/federated.inc", "federated_test", 1],
|
||||
["include/have_federated_db.inc", "federated_test", 1],
|
||||
);
|
||||
|
||||
sub mtr_options_from_test_file($$) {
|
||||
|
@ -312,7 +312,7 @@ sub mtr_report_stats ($) {
|
||||
/Slave: According to the master's version/ or
|
||||
/Slave: Column [0-9]* type mismatch/ or
|
||||
/Slave: Error .* doesn't exist/ or
|
||||
/Slave: Error .*Deadlock found/ or
|
||||
/Slave: Deadlock found/ or
|
||||
/Slave: Error .*Unknown table/ or
|
||||
/Slave: Error in Write_rows event: / or
|
||||
/Slave: Field .* of table .* has no default value/ or
|
||||
@ -327,7 +327,6 @@ sub mtr_report_stats ($) {
|
||||
/Sort aborted/ or
|
||||
/Time-out in NDB/ or
|
||||
/One can only use the --user.*root/ or
|
||||
/Setting lower_case_table_names=2/ or
|
||||
/Table:.* on (delete|rename)/ or
|
||||
/You have an error in your SQL syntax/ or
|
||||
/deprecated/ or
|
||||
@ -402,7 +401,18 @@ sub mtr_report_stats ($) {
|
||||
)) or
|
||||
|
||||
# Test case for Bug#31590 produces the following error:
|
||||
/Out of sort memory; increase server sort buffer size/
|
||||
/Out of sort memory; increase server sort buffer size/ or
|
||||
|
||||
# Bug#35161, test of auto repair --myisam-recover
|
||||
/able.*_will_crash/ or
|
||||
|
||||
# lowercase_table3 using case sensitive option on
|
||||
# case insensitive filesystem (InnoDB error).
|
||||
/Cannot find or open table test\/BUG29839 from/ or
|
||||
|
||||
# When trying to set lower_case_table_names = 2
|
||||
# on a case sensitive file system. Bug#37402.
|
||||
/lower_case_table_names was set to 2, even though your the file system '.*' is case sensitive. Now setting lower_case_table_names to 0 to avoid future problems./
|
||||
)
|
||||
{
|
||||
next; # Skip these lines
|
||||
|
@ -112,6 +112,7 @@ our $glob_basedir;
|
||||
|
||||
our $path_charsetsdir;
|
||||
our $path_client_bindir;
|
||||
our $path_client_libdir;
|
||||
our $path_share;
|
||||
our $path_language;
|
||||
our $path_timefile;
|
||||
@ -250,7 +251,7 @@ our $opt_sleep;
|
||||
our $opt_testcase_timeout;
|
||||
our $opt_suite_timeout;
|
||||
my $default_testcase_timeout= 15; # 15 min max
|
||||
my $default_suite_timeout= 180; # 3 hours max
|
||||
my $default_suite_timeout= 300; # 5 hours max
|
||||
|
||||
our $opt_start_and_exit;
|
||||
our $opt_start_dirty;
|
||||
@ -657,6 +658,8 @@ sub command_line_setup () {
|
||||
'vardir=s' => \$opt_vardir,
|
||||
'benchdir=s' => \$glob_mysql_bench_dir,
|
||||
'mem' => \$opt_mem,
|
||||
'client-bindir=s' => \$path_client_bindir,
|
||||
'client-libdir=s' => \$path_client_libdir,
|
||||
|
||||
# Misc
|
||||
'report-features' => \$opt_report_features,
|
||||
@ -783,12 +786,20 @@ sub command_line_setup () {
|
||||
#
|
||||
|
||||
# Look for the client binaries directory
|
||||
$path_client_bindir= mtr_path_exists("$glob_basedir/client_release",
|
||||
"$glob_basedir/client_debug",
|
||||
vs_config_dirs('client', ''),
|
||||
"$glob_basedir/client",
|
||||
"$glob_basedir/bin");
|
||||
|
||||
if ($path_client_bindir)
|
||||
{
|
||||
# --client-bindir=path set on command line, check that the path exists
|
||||
$path_client_bindir= mtr_path_exists($path_client_bindir);
|
||||
}
|
||||
else
|
||||
{
|
||||
$path_client_bindir= mtr_path_exists("$glob_basedir/client_release",
|
||||
"$glob_basedir/client_debug",
|
||||
vs_config_dirs('client', ''),
|
||||
"$glob_basedir/client",
|
||||
"$glob_basedir/bin");
|
||||
}
|
||||
|
||||
# Look for language files and charsetsdir, use same share
|
||||
$path_share= mtr_path_exists("$glob_basedir/share/mysql",
|
||||
"$glob_basedir/sql/share",
|
||||
@ -1568,13 +1579,15 @@ sub executable_setup_ndb () {
|
||||
|
||||
$exe_ndbd=
|
||||
mtr_exe_maybe_exists("$ndb_path/src/kernel/ndbd",
|
||||
"$ndb_path/ndbd");
|
||||
"$ndb_path/ndbd",
|
||||
"$glob_basedir/libexec/ndbd");
|
||||
$exe_ndb_mgm=
|
||||
mtr_exe_maybe_exists("$ndb_path/src/mgmclient/ndb_mgm",
|
||||
"$ndb_path/ndb_mgm");
|
||||
$exe_ndb_mgmd=
|
||||
mtr_exe_maybe_exists("$ndb_path/src/mgmsrv/ndb_mgmd",
|
||||
"$ndb_path/ndb_mgmd");
|
||||
"$ndb_path/ndb_mgmd",
|
||||
"$glob_basedir/libexec/ndb_mgmd");
|
||||
$exe_ndb_waiter=
|
||||
mtr_exe_maybe_exists("$ndb_path/tools/ndb_waiter",
|
||||
"$ndb_path/ndb_waiter");
|
||||
@ -1671,7 +1684,8 @@ sub executable_setup () {
|
||||
# Look for mysql_fix_privilege_tables.sql script
|
||||
$file_mysql_fix_privilege_tables=
|
||||
mtr_file_exists("$glob_basedir/scripts/mysql_fix_privilege_tables.sql",
|
||||
"$glob_basedir/share/mysql_fix_privilege_tables.sql");
|
||||
"$glob_basedir/share/mysql_fix_privilege_tables.sql",
|
||||
"$glob_basedir/share/mysql/mysql_fix_privilege_tables.sql");
|
||||
|
||||
if ( ! $opt_skip_ndbcluster and executable_setup_ndb())
|
||||
{
|
||||
@ -1837,19 +1851,25 @@ sub environment_setup () {
|
||||
|
||||
my @ld_library_paths;
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Setup LD_LIBRARY_PATH so the libraries from this distro/clone
|
||||
# are used in favor of the system installed ones
|
||||
# --------------------------------------------------------------------------
|
||||
if ( $source_dist )
|
||||
if ($path_client_libdir)
|
||||
{
|
||||
push(@ld_library_paths, "$glob_basedir/libmysql/.libs/",
|
||||
"$glob_basedir/libmysql_r/.libs/",
|
||||
"$glob_basedir/zlib.libs/");
|
||||
# Use the --client-libdir passed on commandline
|
||||
push(@ld_library_paths, "$path_client_libdir");
|
||||
}
|
||||
else
|
||||
{
|
||||
push(@ld_library_paths, "$glob_basedir/lib");
|
||||
# Setup LD_LIBRARY_PATH so the libraries from this distro/clone
|
||||
# are used in favor of the system installed ones
|
||||
if ( $source_dist )
|
||||
{
|
||||
push(@ld_library_paths, "$glob_basedir/libmysql/.libs/",
|
||||
"$glob_basedir/libmysql_r/.libs/",
|
||||
"$glob_basedir/zlib.libs/");
|
||||
}
|
||||
else
|
||||
{
|
||||
push(@ld_library_paths, "$glob_basedir/lib");
|
||||
}
|
||||
}
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
@ -2091,6 +2111,9 @@ sub environment_setup () {
|
||||
{
|
||||
$cmdline_mysqlbinlog .=" --character-sets-dir=$path_charsetsdir";
|
||||
}
|
||||
# Always use the given tmpdir for the LOAD files created
|
||||
# by mysqlbinlog
|
||||
$cmdline_mysqlbinlog .=" --local-load=$opt_tmpdir";
|
||||
|
||||
if ( $opt_debug )
|
||||
{
|
||||
@ -3578,7 +3601,16 @@ sub run_testcase ($) {
|
||||
{
|
||||
mtr_timer_stop_all($glob_timers);
|
||||
mtr_report("\nServers started, exiting");
|
||||
exit(0);
|
||||
if ($glob_win32_perl)
|
||||
{
|
||||
#ActiveState perl hangs when using normal exit, use POSIX::_exit instead
|
||||
use POSIX qw[ _exit ];
|
||||
POSIX::_exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
@ -4334,19 +4366,10 @@ sub run_testcase_need_master_restart($)
|
||||
elsif (! mtr_same_opts($master->[0]->{'start_opts'},
|
||||
$tinfo->{'master_opt'}) )
|
||||
{
|
||||
# Chech that diff is binlog format only
|
||||
my $diff_opts= mtr_diff_opts($master->[0]->{'start_opts'},$tinfo->{'master_opt'});
|
||||
if (scalar(@$diff_opts) eq 2)
|
||||
{
|
||||
$do_restart= 1 unless ($diff_opts->[0] =~/^--binlog-format=/ and $diff_opts->[1] =~/^--binlog-format=/);
|
||||
}
|
||||
else
|
||||
{
|
||||
$do_restart= 1;
|
||||
mtr_verbose("Restart master: running with different options '" .
|
||||
join(" ", @{$tinfo->{'master_opt'}}) . "' != '" .
|
||||
$do_restart= 1;
|
||||
mtr_verbose("Restart master: running with different options '" .
|
||||
join(" ", @{$tinfo->{'master_opt'}}) . "' != '" .
|
||||
join(" ", @{$master->[0]->{'start_opts'}}) . "'" );
|
||||
}
|
||||
}
|
||||
elsif( ! $master->[0]->{'pid'} )
|
||||
{
|
||||
@ -5357,6 +5380,8 @@ Misc options
|
||||
warnings | log-warnings Pass --log-warnings to mysqld
|
||||
|
||||
sleep=SECONDS Passed to mysqltest, will be used as fixed sleep time
|
||||
client-bindir=PATH Path to the directory where client binaries are located
|
||||
client-libdir=PATH Path to the directory where client libraries are located
|
||||
|
||||
Deprecated options
|
||||
with-openssl Deprecated option for ssl
|
||||
|
@ -1184,3 +1184,60 @@ check table t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
drop table t1;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (id int, c int) character set latin1;
|
||||
INSERT INTO t1 VALUES (1,1);
|
||||
ALTER TABLE t1 CHANGE c d int;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
ALTER TABLE t1 CHANGE d c int;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
ALTER TABLE t1 MODIFY c VARCHAR(10);
|
||||
affected rows: 1
|
||||
info: Records: 1 Duplicates: 0 Warnings: 0
|
||||
ALTER TABLE t1 CHANGE c d varchar(10);
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
ALTER TABLE t1 CHANGE d c varchar(10);
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
DROP TABLE t1;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (id int, c int) character set utf8;
|
||||
INSERT INTO t1 VALUES (1,1);
|
||||
ALTER TABLE t1 CHANGE c d int;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
ALTER TABLE t1 CHANGE d c int;
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
ALTER TABLE t1 MODIFY c VARCHAR(10);
|
||||
affected rows: 1
|
||||
info: Records: 1 Duplicates: 0 Warnings: 0
|
||||
ALTER TABLE t1 CHANGE c d varchar(10);
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
ALTER TABLE t1 CHANGE d c varchar(10);
|
||||
affected rows: 0
|
||||
info: Records: 0 Duplicates: 0 Warnings: 0
|
||||
DROP TABLE t1;
|
||||
create table t1(f1 int not null, f2 int not null, key (f1), key (f2));
|
||||
select index_length into @unpaked_keys_size from
|
||||
information_schema.tables where table_name='t1';
|
||||
alter table t1 pack_keys=1;
|
||||
select index_length into @paked_keys_size from
|
||||
information_schema.tables where table_name='t1';
|
||||
select (@unpaked_keys_size > @paked_keys_size);
|
||||
(@unpaked_keys_size > @paked_keys_size)
|
||||
1
|
||||
select max_data_length into @orig_max_data_length from
|
||||
information_schema.tables where table_name='t1';
|
||||
alter table t1 max_rows=100;
|
||||
select max_data_length into @changed_max_data_length from
|
||||
information_schema.tables where table_name='t1';
|
||||
select (@orig_max_data_length > @changed_max_data_length);
|
||||
(@orig_max_data_length > @changed_max_data_length)
|
||||
1
|
||||
drop table t1;
|
||||
End of 5.1 tests
|
||||
|
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