mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
merged 5.1-bugteam -> bug 34773 tree
This commit is contained in:
@ -389,6 +389,9 @@ client/readline.cpp
|
|||||||
client/rpl_constants.h
|
client/rpl_constants.h
|
||||||
client/rpl_record_old.cc
|
client/rpl_record_old.cc
|
||||||
client/rpl_record_old.h
|
client/rpl_record_old.h
|
||||||
|
client/rpl_tblmap.h
|
||||||
|
client/rpl_tblmap.cc
|
||||||
|
client/rpl_utility.h
|
||||||
client/select_test
|
client/select_test
|
||||||
client/sql_string.cpp
|
client/sql_string.cpp
|
||||||
client/ssl_test
|
client/ssl_test
|
||||||
|
@ -176,7 +176,7 @@ check_cpu () {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
cc_ver=`$cc --version | sed 1q`
|
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 '.' ' '`
|
set -- `echo $cc_verno | tr '.' ' '`
|
||||||
cc_major=$1
|
cc_major=$1
|
||||||
cc_minor=$2
|
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"
|
. "$path/autorun.sh"
|
||||||
|
|
||||||
# For "optimal" code for this computer add -fast to EXTRA
|
# 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"
|
EXTRA="-fast"
|
||||||
|
|
||||||
#
|
#
|
||||||
# The following should not need to be touched
|
# 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"
|
STD="-g -mt -D_FORTEC_ $EXTRA $EXTRA_64_BIT"
|
||||||
ASFLAGS="$EXTRA_64_BIT"
|
ASFLAGS="$EXTRA_64_BIT"
|
||||||
CC=cc-5.0
|
CC=cc-5.0
|
||||||
CFLAGS="-Xa -xstrconst $STD"
|
CFLAGS="-Xa -xstrconst $STD"
|
||||||
CXX=CC
|
CXX=CC
|
||||||
CXXFLAGS="-noex $STD"
|
CXXFLAGS="-noex $STD"
|
||||||
|
LIBS=-lmtmalloc
|
||||||
./configure \
|
./configure \
|
||||||
--prefix=/usr/local/mysql \
|
--prefix=/usr/local/mysql \
|
||||||
--localstatedir=/usr/local/mysql/data \
|
--localstatedir=/usr/local/mysql/data \
|
||||||
|
@ -6,8 +6,8 @@ gmake -k clean || true
|
|||||||
path=`dirname $0`
|
path=`dirname $0`
|
||||||
. "$path/autorun.sh"
|
. "$path/autorun.sh"
|
||||||
|
|
||||||
# To compile 64 bit, add -xarch=amd64 to EXTRA_64_BIT
|
# To compile 64 bit, add -m64 to EXTRA_64_BIT
|
||||||
EXTRA_64_BIT="-xarch=amd64"
|
EXTRA_64_BIT="-m64"
|
||||||
|
|
||||||
# For "optimal" code for this computer add -fast to EXTRA. Note that
|
# For "optimal" code for this computer add -fast to EXTRA. Note that
|
||||||
# this causes problem with debugging the program since -fast implies
|
# 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=`dirname $0`
|
||||||
. "$path/autorun.sh"
|
. "$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
|
make -j 4
|
||||||
|
@ -29,7 +29,7 @@ EXTRA="-fast" # Remove comment to target current machine
|
|||||||
|
|
||||||
STD="-mt -D_FORTEC_ $EXTRA $EXTRA_64_BIT"
|
STD="-mt -D_FORTEC_ $EXTRA $EXTRA_64_BIT"
|
||||||
CC=cc-5.0 CFLAGS="-Xa -xstrconst $STD" \
|
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
|
./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --prefix=$PREFIX
|
||||||
|
|
||||||
make -j 4
|
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_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4800 /wd4805")
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_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_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4996")
|
||||||
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /wd4996")
|
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /wd4996")
|
||||||
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /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_DEBUG "${CMAKE_C_FLAGS_DEBUG} /wd4996")
|
||||||
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /wd4996")
|
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /wd4996")
|
||||||
SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /wd4996")
|
SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /wd4996")
|
||||||
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
ENDIF(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7")
|
||||||
|
|
||||||
IF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR
|
|
||||||
CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
|
||||||
|
|
||||||
|
# Settings for Visual Studio 7 and above.
|
||||||
|
IF(MSVC)
|
||||||
# replace /MDd with /MTd
|
# replace /MDd with /MTd
|
||||||
STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
|
STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
|
||||||
STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO})
|
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)
|
IF(NOT tmp_manifest)
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO")
|
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO")
|
||||||
ENDIF(NOT tmp_manifest)
|
ENDIF(NOT tmp_manifest)
|
||||||
|
ENDIF(MSVC)
|
||||||
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR
|
|
||||||
CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
|
||||||
|
|
||||||
IF(WIN32)
|
IF(WIN32)
|
||||||
ADD_DEFINITIONS("-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE")
|
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@
|
$(top_builddir)/scripts/make_binary_distribution @MAKE_BINARY_DISTRIBUTION_OPTIONS@
|
||||||
|
|
||||||
# Remove BK's "SCCS" subdirectories from source distribution
|
# 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:
|
dist-hook:
|
||||||
rm -rf `find $(distdir) -type d -name SCCS -print`
|
rm -rf `find $(distdir) -type d -name SCCS -print`
|
||||||
mkdir -p $(distdir)/win
|
mkdir -p $(distdir)/win
|
||||||
@ -57,6 +57,9 @@ dist-hook:
|
|||||||
--builddir=$(top_builddir) \
|
--builddir=$(top_builddir) \
|
||||||
--datadir=$(distdir)/win/data \
|
--datadir=$(distdir)/win/data \
|
||||||
--srcdir=$(top_srcdir)
|
--srcdir=$(top_srcdir)
|
||||||
|
storage/myisam/myisamchk --silent --fast $(distdir)/win/data/mysql/*.MYI
|
||||||
|
|
||||||
|
all-local: @ABI_CHECK@
|
||||||
|
|
||||||
tags:
|
tags:
|
||||||
support-files/build-tags
|
support-files/build-tags
|
||||||
@ -231,5 +234,81 @@ test-full-qa:
|
|||||||
test-binlog-statement test-ext test-fast-view \
|
test-binlog-statement test-ext test-fast-view \
|
||||||
test-fast-cursor test-unit
|
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
|
# Don't update the files from bitkeeper
|
||||||
%::SCCS/s.%
|
%::SCCS/s.%
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
INCLUDE("${PROJECT_SOURCE_DIR}/win/mysql_manifest.cmake")
|
INCLUDE("${PROJECT_SOURCE_DIR}/win/mysql_manifest.cmake")
|
||||||
|
|
||||||
# We use the "mysqlclient_notls" library here just as safety, in case
|
# 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.
|
# Thread Local Storage directly.
|
||||||
|
|
||||||
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX")
|
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)
|
ADD_EXECUTABLE(mysql completion_hash.cc mysql.cc readline.cc sql_string.cc ../mysys/my_conio.c)
|
||||||
TARGET_LINK_LIBRARIES(mysql mysqlclient_notls wsock32)
|
TARGET_LINK_LIBRARIES(mysql mysqlclient_notls wsock32)
|
||||||
|
|
||||||
ADD_EXECUTABLE(mysqltest mysqltest.c ../mysys/my_getsystime.c
|
ADD_EXECUTABLE(mysqltest mysqltest.c)
|
||||||
../mysys/my_copy.c ../mysys/my_mkdir.c)
|
SET_SOURCE_FILES_PROPERTIES(mysqltest.c PROPERTIES COMPILE_FLAGS "-DTHREADS")
|
||||||
TARGET_LINK_LIBRARIES(mysqltest mysqlclient_notls regex wsock32)
|
TARGET_LINK_LIBRARIES(mysqltest mysqlclient mysys regex wsock32 dbug)
|
||||||
|
|
||||||
ADD_EXECUTABLE(mysqlcheck mysqlcheck.c)
|
ADD_EXECUTABLE(mysqlcheck mysqlcheck.c)
|
||||||
TARGET_LINK_LIBRARIES(mysqlcheck mysqlclient_notls wsock32)
|
TARGET_LINK_LIBRARIES(mysqlcheck mysqlclient_notls wsock32)
|
||||||
|
@ -86,11 +86,14 @@ mysqlslap_LDADD = $(CXXLDFLAGS) $(CLIENT_THREAD_LIBS) \
|
|||||||
$(LIBMYSQLCLIENT_LA) \
|
$(LIBMYSQLCLIENT_LA) \
|
||||||
$(top_builddir)/mysys/libmysys.a
|
$(top_builddir)/mysys/libmysys.a
|
||||||
|
|
||||||
mysqltest_SOURCES= mysqltest.c \
|
mysqltest_SOURCES= mysqltest.c
|
||||||
$(top_srcdir)/mysys/my_getsystime.c \
|
mysqltest_CFLAGS= -DTHREAD -UUNDEF_THREADS_HACK
|
||||||
$(top_srcdir)/mysys/my_copy.c \
|
mysqltest_LDADD = $(CXXLDFLAGS) \
|
||||||
$(top_srcdir)/mysys/my_mkdir.c
|
@CLIENT_EXTRA_LDFLAGS@ \
|
||||||
mysqltest_LDADD = $(top_builddir)/regex/libregex.a $(LDADD)
|
$(LIBMYSQLCLIENT_LA) \
|
||||||
|
$(top_builddir)/mysys/libmysys.a \
|
||||||
|
$(top_builddir)/regex/libregex.a \
|
||||||
|
$(CLIENT_THREAD_LIBS)
|
||||||
|
|
||||||
mysql_upgrade_SOURCES= mysql_upgrade.c \
|
mysql_upgrade_SOURCES= mysql_upgrade.c \
|
||||||
$(top_srcdir)/mysys/my_getpagesize.c
|
$(top_srcdir)/mysys/my_getpagesize.c
|
||||||
@ -101,6 +104,7 @@ DEFS = -DUNDEF_THREADS_HACK \
|
|||||||
-DDATADIR="\"$(localstatedir)\""
|
-DDATADIR="\"$(localstatedir)\""
|
||||||
|
|
||||||
sql_src=log_event.h mysql_priv.h rpl_constants.h \
|
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.cc my_decimal.h my_decimal.cc \
|
||||||
log_event_old.h log_event_old.cc \
|
log_event_old.h log_event_old.cc \
|
||||||
rpl_record_old.h rpl_record_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
|
the very beginning of a text file when
|
||||||
you save the file using "Unicode UTF-8" format.
|
you save the file using "Unicode UTF-8" format.
|
||||||
*/
|
*/
|
||||||
if (!line_number &&
|
if (line && !line_number &&
|
||||||
(uchar) line[0] == 0xEF &&
|
(uchar) line[0] == 0xEF &&
|
||||||
(uchar) line[1] == 0xBB &&
|
(uchar) line[1] == 0xBB &&
|
||||||
(uchar) line[2] == 0xBF)
|
(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 == '#' ||
|
else if (!*ml_comment && (!*in_string && (inchar == '#' ||
|
||||||
inchar == '-' && pos[1] == '-' &&
|
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
|
// Flush previously accepted characters
|
||||||
if (out != line)
|
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,
|
static int run_command(char* cmd,
|
||||||
DYNAMIC_STRING *ds_res)
|
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
|
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
|
||||||
Return 0 if path found
|
mechanism will be used when we run our sub-shells with popen() later.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
static void find_tool(char *tool_executable_name, const char *tool_name,
|
||||||
static my_bool get_full_path_to_executable(char* path)
|
const char *self_name)
|
||||||
{
|
{
|
||||||
my_bool ret;
|
char *last_fn_libchar;
|
||||||
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];
|
|
||||||
DYNAMIC_STRING ds_tmp;
|
DYNAMIC_STRING ds_tmp;
|
||||||
DBUG_ENTER("find_tool");
|
DBUG_ENTER("find_tool");
|
||||||
DBUG_PRINT("enter", ("progname: %s", my_progname));
|
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))
|
if (init_dynamic_string(&ds_tmp, "", 32, 32))
|
||||||
die("Out of memory");
|
die("Out of memory");
|
||||||
|
|
||||||
/* Initialize path with the full path to this program */
|
last_fn_libchar= strrchr(self_name, FN_LIBCHAR);
|
||||||
if (get_full_path_to_executable(path))
|
|
||||||
|
if (last_fn_libchar == NULL)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Easy way to get full executable path failed, try
|
mysql_upgrade was found by the shell searching the path. A sibling
|
||||||
other methods
|
next to us should be found the same way.
|
||||||
*/
|
*/
|
||||||
if (my_progname[0] == FN_LIBCHAR)
|
strncpy(tool_executable_name, tool_name, FN_REFLEN);
|
||||||
{
|
|
||||||
/* 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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
verbose("Looking for '%s' as: %s", tool_name, tool_executable_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);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Make sure it can be executed
|
Make sure it can be executed
|
||||||
*/
|
*/
|
||||||
if (run_tool(tool_path,
|
if (run_tool(tool_executable_name,
|
||||||
&ds_tmp, /* Get output from command, discard*/
|
&ds_tmp, /* Get output from command, discard*/
|
||||||
"--help",
|
"--help",
|
||||||
"2>&1",
|
"2>&1",
|
||||||
IF_WIN("> NUL", "> /dev/null"),
|
IF_WIN("> NUL", "> /dev/null"),
|
||||||
NULL))
|
NULL))
|
||||||
die("Can't execute '%s'", tool_path);
|
die("Can't execute '%s'", tool_executable_name);
|
||||||
|
|
||||||
dynstr_free(&ds_tmp);
|
dynstr_free(&ds_tmp);
|
||||||
|
|
||||||
@ -759,11 +723,20 @@ static const char *load_default_groups[]=
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
char self_name[FN_REFLEN];
|
||||||
|
|
||||||
MY_INIT(argv[0]);
|
MY_INIT(argv[0]);
|
||||||
#ifdef __NETWARE__
|
#ifdef __NETWARE__
|
||||||
setscreenmode(SCR_AUTOCLOSE_ON_EXIT);
|
setscreenmode(SCR_AUTOCLOSE_ON_EXIT);
|
||||||
#endif
|
#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))
|
if (init_dynamic_string(&ds_args, "", 512, 256))
|
||||||
die("Out of memory");
|
die("Out of memory");
|
||||||
|
|
||||||
@ -789,10 +762,10 @@ int main(int argc, char **argv)
|
|||||||
dynstr_append(&ds_args, " ");
|
dynstr_append(&ds_args, " ");
|
||||||
|
|
||||||
/* Find mysql */
|
/* 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 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
|
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 one_database=0, to_last_remote_log= 0, disable_log_bin= 0;
|
||||||
static bool opt_hexdump= 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=
|
TYPELIB base64_output_mode_typelib=
|
||||||
{ array_elements(base64_output_mode_names) - 1, "",
|
{ array_elements(base64_output_mode_names) - 1, "",
|
||||||
base64_output_mode_names, NULL };
|
base64_output_mode_names, NULL };
|
||||||
@ -83,6 +84,8 @@ static const char* user = 0;
|
|||||||
static char* pass = 0;
|
static char* pass = 0;
|
||||||
static char *charset= 0;
|
static char *charset= 0;
|
||||||
|
|
||||||
|
static uint verbose= 0;
|
||||||
|
|
||||||
static ulonglong start_position, stop_position;
|
static ulonglong start_position, stop_position;
|
||||||
#define start_position_mot ((my_off_t)start_position)
|
#define start_position_mot ((my_off_t)start_position)
|
||||||
#define stop_position_mot ((my_off_t)stop_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.",
|
{"user", 'u', "Connect to the remote server as username.",
|
||||||
(uchar**) &user, (uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0,
|
(uchar**) &user, (uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 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,
|
{"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
|
||||||
0, 0, 0, 0, 0},
|
0, 0, 0, 0, 0},
|
||||||
{"open_files_limit", OPT_OPEN_FILES_LIMIT,
|
{"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);
|
(find_type_or_exit(argument, &base64_output_mode_typelib, opt->name)-1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'v':
|
||||||
|
if (argument == disabled_my_option)
|
||||||
|
verbose= 0;
|
||||||
|
else
|
||||||
|
verbose++;
|
||||||
|
break;
|
||||||
case 'V':
|
case 'V':
|
||||||
print_version();
|
print_version();
|
||||||
exit(0);
|
exit(0);
|
||||||
@ -1343,6 +1355,8 @@ static Exit_status dump_log_entries(const char* logname)
|
|||||||
*/
|
*/
|
||||||
fprintf(result_file, "DELIMITER /*!*/;\n");
|
fprintf(result_file, "DELIMITER /*!*/;\n");
|
||||||
strmov(print_event_info.delimiter, "/*!*/;");
|
strmov(print_event_info.delimiter, "/*!*/;");
|
||||||
|
|
||||||
|
print_event_info.verbose= short_form ? 0 : verbose;
|
||||||
|
|
||||||
rc= (remote_opt ? dump_remote_log_entries(&print_event_info, logname) :
|
rc= (remote_opt ? dump_remote_log_entries(&print_event_info, logname) :
|
||||||
dump_local_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",
|
fprintf(sql_file, ",\n %s %s",
|
||||||
quote_name(row[0], name_buff, 0), row[1]);
|
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,
|
fprintf(sql_file,
|
||||||
"\n) */;\n"
|
"\n) ENGINE=MyISAM */;\n"
|
||||||
"SET character_set_client = @saved_cs_client;\n");
|
"SET character_set_client = @saved_cs_client;\n");
|
||||||
|
|
||||||
check_io(sql_file);
|
check_io(sql_file);
|
||||||
|
@ -48,7 +48,15 @@
|
|||||||
#ifdef __WIN__
|
#ifdef __WIN__
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
#endif
|
#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 */
|
/* Use cygwin for --exec and --system before 5.0 */
|
||||||
#if MYSQL_VERSION_ID < 50000
|
#if MYSQL_VERSION_ID < 50000
|
||||||
@ -163,6 +171,8 @@ static ulonglong timer_now(void);
|
|||||||
|
|
||||||
static ulonglong progress_start= 0;
|
static ulonglong progress_start= 0;
|
||||||
|
|
||||||
|
static ulong connection_retry_sleep= 100000; /* Microseconds */
|
||||||
|
|
||||||
/* Precompiled re's */
|
/* Precompiled re's */
|
||||||
static my_regex_t ps_re; /* the query can be run using PS protocol */
|
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 */
|
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 */
|
/* Used when creating views and sp, to avoid implicit commit */
|
||||||
MYSQL* util_mysql;
|
MYSQL* util_mysql;
|
||||||
char *name;
|
char *name;
|
||||||
|
size_t name_len;
|
||||||
MYSQL_STMT* stmt;
|
MYSQL_STMT* stmt;
|
||||||
|
|
||||||
#ifdef EMBEDDED_LIBRARY
|
#ifdef EMBEDDED_LIBRARY
|
||||||
@ -267,7 +278,8 @@ enum enum_commands {
|
|||||||
Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST,
|
Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST,
|
||||||
Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT, Q_SKIP,
|
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_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_UNKNOWN, /* Unknown command. */
|
||||||
Q_COMMENT, /* Comments, ignored. */
|
Q_COMMENT, /* Comments, ignored. */
|
||||||
@ -359,6 +371,9 @@ const char *command_names[]=
|
|||||||
"change_user",
|
"change_user",
|
||||||
"mkdir",
|
"mkdir",
|
||||||
"rmdir",
|
"rmdir",
|
||||||
|
"list_files",
|
||||||
|
"list_files_write_file",
|
||||||
|
"list_files_append_file",
|
||||||
|
|
||||||
0
|
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 replace_dynstr_append_uint(DYNAMIC_STRING *ds, uint val);
|
||||||
void dynstr_append_sorted(DYNAMIC_STRING* ds, DYNAMIC_STRING* ds_input);
|
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*,
|
void handle_error(struct st_command*,
|
||||||
unsigned int err_errno, const char *err_error,
|
unsigned int err_errno, const char *err_error,
|
||||||
const char *err_sqlstate, DYNAMIC_STRING *ds);
|
const char *err_sqlstate, DYNAMIC_STRING *ds);
|
||||||
@ -835,29 +853,25 @@ void check_command_args(struct st_command *command,
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void handle_command_error(struct st_command *command, uint error)
|
void handle_command_error(struct st_command *command, uint error)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("handle_command_error");
|
DBUG_ENTER("handle_command_error");
|
||||||
DBUG_PRINT("enter", ("error: %d", error));
|
DBUG_PRINT("enter", ("error: %d", error));
|
||||||
if (error != 0)
|
if (error != 0)
|
||||||
{
|
{
|
||||||
uint i;
|
int i;
|
||||||
|
|
||||||
if (command->abort_on_error)
|
if (command->abort_on_error)
|
||||||
die("command \"%.*s\" failed with error %d",
|
die("command \"%.*s\" failed with error %d",
|
||||||
command->first_word_len, command->query, error);
|
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",
|
DBUG_PRINT("info", ("command \"%.*s\" failed with expected error: %d",
|
||||||
command->expected_errors.err[i].code.errnum));
|
command->first_word_len, command->query, error));
|
||||||
if ((command->expected_errors.err[i].type == ERR_ERRNO) &&
|
DBUG_VOID_RETURN;
|
||||||
(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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
die("command \"%.*s\" failed with wrong error: %d",
|
die("command \"%.*s\" failed with wrong error: %d",
|
||||||
command->first_word_len, command->query, error);
|
command->first_word_len, command->query, error);
|
||||||
@ -2452,8 +2466,8 @@ void do_exec(struct st_command *command)
|
|||||||
error= pclose(res_file);
|
error= pclose(res_file);
|
||||||
if (error > 0)
|
if (error > 0)
|
||||||
{
|
{
|
||||||
uint status= WEXITSTATUS(error), i;
|
uint status= WEXITSTATUS(error);
|
||||||
my_bool ok= 0;
|
int i;
|
||||||
|
|
||||||
if (command->abort_on_error)
|
if (command->abort_on_error)
|
||||||
{
|
{
|
||||||
@ -2465,19 +2479,13 @@ void do_exec(struct st_command *command)
|
|||||||
|
|
||||||
DBUG_PRINT("info",
|
DBUG_PRINT("info",
|
||||||
("error: %d, status: %d", error, status));
|
("error: %d, status: %d", error, status));
|
||||||
for (i= 0; i < command->expected_errors.count; i++)
|
|
||||||
{
|
i= match_expected_error(command, status, NULL);
|
||||||
DBUG_PRINT("info", ("expected error: %d",
|
|
||||||
command->expected_errors.err[i].code.errnum));
|
if (i >= 0)
|
||||||
if ((command->expected_errors.err[i].type == ERR_ERRNO) &&
|
DBUG_PRINT("info", ("command \"%s\" failed with expected error: %d",
|
||||||
(command->expected_errors.err[i].code.errnum == status))
|
command->first_argument, status));
|
||||||
{
|
else
|
||||||
ok= 1;
|
|
||||||
DBUG_PRINT("info", ("command \"%s\" failed with expected error: %d",
|
|
||||||
command->first_argument, status));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!ok)
|
|
||||||
{
|
{
|
||||||
dynstr_free(&ds_cmd);
|
dynstr_free(&ds_cmd);
|
||||||
die("command \"%s\" failed with wrong error: %d",
|
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
|
Read characters from line buffer or file. This is needed to allow
|
||||||
my_ungetc() to buffer MAX_DELIMITER_LENGTH characters for a file
|
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 port, const char *sock)
|
||||||
{
|
{
|
||||||
int failed_attempts= 0;
|
int failed_attempts= 0;
|
||||||
static ulong connection_retry_sleep= 100000; /* Microseconds */
|
|
||||||
|
|
||||||
DBUG_ENTER("safe_connect");
|
DBUG_ENTER("safe_connect");
|
||||||
while(!mysql_real_connect(mysql, host,user, pass, db, port, sock,
|
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)
|
const char* db, int port, const char* sock)
|
||||||
{
|
{
|
||||||
DYNAMIC_STRING *ds;
|
DYNAMIC_STRING *ds;
|
||||||
|
int failed_attempts= 0;
|
||||||
|
|
||||||
ds= &ds_res;
|
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, delimiter, delimiter_length);
|
||||||
dynstr_append_mem(ds, "\n", 1);
|
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))
|
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));
|
var_set_errno(mysql_errno(con));
|
||||||
handle_error(command, mysql_errno(con), mysql_error(con),
|
handle_error(command, mysql_errno(con), mysql_error(con),
|
||||||
mysql_sqlstate(con), ds);
|
mysql_sqlstate(con), ds);
|
||||||
@ -4436,6 +4596,7 @@ void do_connect(struct st_command *command)
|
|||||||
ds_connection_name.str));
|
ds_connection_name.str));
|
||||||
if (!(con_slot->name= my_strdup(ds_connection_name.str, MYF(MY_WME))))
|
if (!(con_slot->name= my_strdup(ds_connection_name.str, MYF(MY_WME))))
|
||||||
die("Out of memory");
|
die("Out of memory");
|
||||||
|
con_slot->name_len= strlen(con_slot->name);
|
||||||
cur_con= con_slot;
|
cur_con= con_slot;
|
||||||
|
|
||||||
if (con_slot == next_con)
|
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
|
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,
|
unsigned int err_errno, const char *err_error,
|
||||||
const char *err_sqlstate, DYNAMIC_STRING *ds)
|
const char *err_sqlstate, DYNAMIC_STRING *ds)
|
||||||
{
|
{
|
||||||
uint i;
|
int i;
|
||||||
|
|
||||||
DBUG_ENTER("handle_error");
|
DBUG_ENTER("handle_error");
|
||||||
|
|
||||||
@ -6061,34 +6272,30 @@ void handle_error(struct st_command *command,
|
|||||||
|
|
||||||
DBUG_PRINT("info", ("expected_errors.count: %d",
|
DBUG_PRINT("info", ("expected_errors.count: %d",
|
||||||
command->expected_errors.count));
|
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) &&
|
if (!disable_result_log)
|
||||||
(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 (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);
|
||||||
/* Only log error if there is one possible error */
|
replace_dynstr_append(ds, err_sqlstate);
|
||||||
dynstr_append_mem(ds, "ERROR ", 6);
|
dynstr_append_mem(ds, ": ", 2);
|
||||||
replace_dynstr_append(ds, err_sqlstate);
|
replace_dynstr_append(ds, err_error);
|
||||||
dynstr_append_mem(ds, ": ", 2);
|
dynstr_append_mem(ds,"\n",1);
|
||||||
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");
|
|
||||||
}
|
}
|
||||||
/* OK */
|
/* Don't log error if we may not get an error */
|
||||||
DBUG_VOID_RETURN;
|
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,
|
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);
|
dynstr_append_mem(ds, "\n", 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i)
|
if (command->expected_errors.count > 0)
|
||||||
{
|
{
|
||||||
if (command->expected_errors.err[0].type == ERR_ERRNO)
|
if (command->expected_errors.err[0].type == ERR_ERRNO)
|
||||||
die("query '%s' failed with wrong errno %d: '%s', instead of %d...",
|
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)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -6851,6 +7156,8 @@ int main(int argc, char **argv)
|
|||||||
save_file[0]= 0;
|
save_file[0]= 0;
|
||||||
TMPDIR[0]= 0;
|
TMPDIR[0]= 0;
|
||||||
|
|
||||||
|
init_signal_handling();
|
||||||
|
|
||||||
/* Init expected errors */
|
/* Init expected errors */
|
||||||
memset(&saved_expected_errors, 0, sizeof(saved_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_REMOVE_FILE: do_remove_file(command); break;
|
||||||
case Q_MKDIR: do_mkdir(command); break;
|
case Q_MKDIR: do_mkdir(command); break;
|
||||||
case Q_RMDIR: do_rmdir(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_FILE_EXIST: do_file_exist(command); break;
|
||||||
case Q_WRITE_FILE: do_write_file(command); break;
|
case Q_WRITE_FILE: do_write_file(command); break;
|
||||||
case Q_APPEND_FILE: do_append_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"
|
default_charset_default_collation="ucs2_general_ci"
|
||||||
define(UCSC1, ucs2_general_ci ucs2_bin)
|
define(UCSC1, ucs2_general_ci ucs2_bin)
|
||||||
define(UCSC2, ucs2_czech_ci ucs2_danish_ci)
|
define(UCSC2, ucs2_czech_ci ucs2_danish_ci)
|
||||||
define(UCSC3, ucs2_esperanto_ci ucs2_estonian_ci ucs2_icelandic_ci)
|
define(UCSC3, ucs2_esperanto_ci ucs2_estonian_ci ucs2_hungarian_ci)
|
||||||
define(UCSC4, ucs2_latvian_ci ucs2_lithuanian_ci)
|
define(UCSC4, ucs2_icelandic_ci ucs2_latvian_ci ucs2_lithuanian_ci)
|
||||||
define(UCSC5, ucs2_persian_ci ucs2_polish_ci ucs2_romanian_ci)
|
define(UCSC5, ucs2_persian_ci ucs2_polish_ci ucs2_romanian_ci)
|
||||||
define(UCSC6, ucs2_slovak_ci ucs2_slovenian_ci)
|
define(UCSC6, ucs2_slovak_ci ucs2_slovenian_ci)
|
||||||
define(UCSC7, ucs2_spanish2_ci ucs2_spanish_ci)
|
define(UCSC7, ucs2_spanish2_ci ucs2_spanish_ci)
|
||||||
@ -367,8 +367,8 @@ case $default_charset in
|
|||||||
else
|
else
|
||||||
define(UTFC1, utf8_general_ci utf8_bin)
|
define(UTFC1, utf8_general_ci utf8_bin)
|
||||||
define(UTFC2, utf8_czech_ci utf8_danish_ci)
|
define(UTFC2, utf8_czech_ci utf8_danish_ci)
|
||||||
define(UTFC3, utf8_esperanto_ci utf8_estonian_ci utf8_icelandic_ci)
|
define(UTFC3, utf8_esperanto_ci utf8_estonian_ci utf8_hungarian_ci)
|
||||||
define(UTFC4, utf8_latvian_ci utf8_lithuanian_ci)
|
define(UTFC4, utf8_icelandic_ci utf8_latvian_ci utf8_lithuanian_ci)
|
||||||
define(UTFC5, utf8_persian_ci utf8_polish_ci utf8_romanian_ci)
|
define(UTFC5, utf8_persian_ci utf8_polish_ci utf8_romanian_ci)
|
||||||
define(UTFC6, utf8_slovak_ci utf8_slovenian_ci)
|
define(UTFC6, utf8_slovak_ci utf8_slovenian_ci)
|
||||||
define(UTFC7, utf8_spanish2_ci utf8_spanish_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
|
# When changing major version number please also check switch statement
|
||||||
# in mysqlbinlog::check_master_version().
|
# 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])
|
AM_CONFIG_HEADER([include/config.h:config.h.in])
|
||||||
|
|
||||||
PROTOCOL_VERSION=10
|
PROTOCOL_VERSION=10
|
||||||
@ -419,6 +419,7 @@ AC_PATH_PROG(SED, sed, sed)
|
|||||||
AC_PATH_PROG(CMP, cmp, cmp)
|
AC_PATH_PROG(CMP, cmp, cmp)
|
||||||
AC_PATH_PROG(CHMOD, chmod, chmod)
|
AC_PATH_PROG(CHMOD, chmod, chmod)
|
||||||
AC_PATH_PROG(HOSTNAME, hostname, hostname)
|
AC_PATH_PROG(HOSTNAME, hostname, hostname)
|
||||||
|
AC_PATH_PROG(DIFF, diff, diff)
|
||||||
# Check for a GNU tar named 'gtar', or 'gnutar' (MacOS X) and
|
# 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
|
# fall back to 'tar' otherwise and hope that it's a GNU tar as well
|
||||||
AC_CHECK_PROGS(TAR, gnutar gtar tar)
|
AC_CHECK_PROGS(TAR, gnutar gtar tar)
|
||||||
@ -443,66 +444,61 @@ AC_SUBST(HOSTNAME)
|
|||||||
AC_SUBST(PERL)
|
AC_SUBST(PERL)
|
||||||
AC_SUBST(PERL5)
|
AC_SUBST(PERL5)
|
||||||
|
|
||||||
# icheck, used for ABI check
|
# Enable the abi_check rule only if gcc is available
|
||||||
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)
|
|
||||||
|
|
||||||
# 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_PATH_PROG(PS, ps, ps)
|
||||||
AC_MSG_CHECKING("how to check if pid exists")
|
AC_MSG_CHECKING("how to check if pid exists")
|
||||||
PS=$ac_cv_path_PS
|
PS=$ac_cv_path_PS
|
||||||
# Linux style
|
# 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
|
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
|
# Solaris
|
||||||
elif $PS -fp $$ 2> /dev/null | grep $0 > /dev/null
|
elif $PS -fp $$ 2> /dev/null | grep -- $0 > /dev/null
|
||||||
then
|
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
|
# BSD style
|
||||||
elif $PS -uaxww 2> /dev/null | grep $0 > /dev/null
|
elif $PS -uaxww 2> /dev/null | grep -- $0 > /dev/null
|
||||||
then
|
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
|
# SysV style
|
||||||
elif $PS -ef 2> /dev/null | grep $0 > /dev/null
|
elif $PS -ef 2> /dev/null | grep -- $0 > /dev/null
|
||||||
then
|
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?
|
# Do anybody use this?
|
||||||
elif $PS $$ 2> /dev/null | grep $0 > /dev/null
|
elif $PS $$ 2> /dev/null | grep -- $0 > /dev/null
|
||||||
then
|
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
|
else
|
||||||
case $SYSTEM_TYPE in
|
case $SYSTEM_TYPE in
|
||||||
*freebsd*|*dragonfly*)
|
*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*)
|
*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*)
|
*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*)
|
*netware*)
|
||||||
FIND_PROC=
|
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
|
esac
|
||||||
fi
|
fi
|
||||||
AC_SUBST(FIND_PROC)
|
AC_SUBST(FIND_PROC)
|
||||||
@ -617,19 +613,19 @@ fi
|
|||||||
AC_MSG_CHECKING(whether features provided by the user community should be included.)
|
AC_MSG_CHECKING(whether features provided by the user community should be included.)
|
||||||
AC_ARG_ENABLE(community-features,
|
AC_ARG_ENABLE(community-features,
|
||||||
AC_HELP_STRING(
|
AC_HELP_STRING(
|
||||||
[--enable-community-features],
|
[--disable-community-features],
|
||||||
[Enable additional features provided by the user community.]),
|
[Disable additional features provided by the user community.]),
|
||||||
[ ENABLE_COMMUNITY_FEATURES=$enableval ],
|
[ ENABLE_COMMUNITY_FEATURES=$enableval ],
|
||||||
[ ENABLE_COMMUNITY_FEATURES=no ]
|
[ ENABLE_COMMUNITY_FEATURES=yes ]
|
||||||
)
|
)
|
||||||
|
|
||||||
if test "$ENABLE_COMMUNITY_FEATURES" = "yes"
|
if test "$ENABLE_COMMUNITY_FEATURES" = "yes"
|
||||||
then
|
then
|
||||||
AC_DEFINE([COMMUNITY_SERVER], [1],
|
AC_DEFINE([COMMUNITY_SERVER], [1],
|
||||||
[Whether features provided by the user community should be included])
|
[Whether features provided by the user community should be included])
|
||||||
AC_MSG_RESULT([yes, community server])
|
AC_MSG_RESULT([yes])
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT([no, enterprise server])
|
AC_MSG_RESULT([no])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_ARG_WITH(server-suffix,
|
AC_ARG_WITH(server-suffix,
|
||||||
@ -2341,10 +2337,31 @@ then
|
|||||||
fi
|
fi
|
||||||
AC_MSG_RESULT("$netinet_inc")
|
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_SAVE
|
||||||
AC_LANG_CPLUSPLUS
|
AC_LANG_CPLUSPLUS
|
||||||
AC_CHECK_HEADERS(cxxabi.h)
|
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>], [
|
[AC_TRY_LINK([#include <cxxabi.h>], [
|
||||||
char *foo= 0; int bar= 0;
|
char *foo= 0; int bar= 0;
|
||||||
foo= abi::__cxa_demangle(foo, foo, 0, &bar);
|
foo= abi::__cxa_demangle(foo, foo, 0, &bar);
|
||||||
@ -2701,6 +2718,9 @@ then
|
|||||||
sql_server="vio sql"
|
sql_server="vio sql"
|
||||||
fi
|
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
|
# 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
|
# I know to add the static NSS magic if we have static NSS libraries with
|
||||||
# glibc - Sasha
|
# 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
|
$(top_builddir)/include/sql_state.h: $(top_builddir)/include/mysqld_error.h
|
||||||
|
|
||||||
bin_PROGRAMS = replace perror resolveip my_print_defaults \
|
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
|
noinst_PROGRAMS = charset2html
|
||||||
EXTRA_PROGRAMS = comp_err
|
EXTRA_PROGRAMS = comp_err
|
||||||
EXTRA_DIST = CMakeLists.txt
|
EXTRA_DIST = CMakeLists.txt
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
SUBDIRS = taocrypt src testsuite
|
SUBDIRS = taocrypt src testsuite
|
||||||
EXTRA_DIST = yassl.dsp yassl.dsw yassl.vcproj \
|
EXTRA_DIST = CMakeLists.txt
|
||||||
CMakeLists.txt
|
|
||||||
|
|
||||||
# Don't update the files from bitkeeper
|
# Don't update the files from bitkeeper
|
||||||
%::SCCS/s.%
|
%::SCCS/s.%
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
SUBDIRS = src test benchmark
|
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
|
# Don't update the files from bitkeeper
|
||||||
%::SCCS/s.%
|
%::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 \
|
mysql_version.h.in my_handler.h my_time.h \
|
||||||
my_vle.h my_user.h my_atomic.h atomic/nolock.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/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
|
# Remove built files and the symlinked directories
|
||||||
CLEANFILES = $(BUILT_SOURCES) readline openssl
|
CLEANFILES = $(BUILT_SOURCES) readline openssl
|
||||||
|
|
||||||
EXTRA_DIST = mysql_h.ic
|
|
||||||
|
|
||||||
# Some include files that may be moved and patched by configure
|
# Some include files that may be moved and patched by configure
|
||||||
DISTCLEANFILES = sched.h $(CLEANFILES)
|
DISTCLEANFILES = sched.h $(CLEANFILES)
|
||||||
@ -63,18 +64,5 @@ my_config.h: config.h
|
|||||||
dist-hook:
|
dist-hook:
|
||||||
$(RM) -f $(distdir)/mysql_version.h $(distdir)/my_config.h
|
$(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
|
# Don't update the files from bitkeeper
|
||||||
%::SCCS/s.%
|
%::SCCS/s.%
|
||||||
|
@ -21,6 +21,40 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#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
|
Overhead to store an element in hash
|
||||||
Can be used to approximate memory consumption for a hash
|
Can be used to approximate memory consumption for a hash
|
||||||
@ -30,8 +64,8 @@ extern "C" {
|
|||||||
/* flags for hash_init */
|
/* flags for hash_init */
|
||||||
#define HASH_UNIQUE 1 /* hash_insert fails on duplicate key */
|
#define HASH_UNIQUE 1 /* hash_insert fails on duplicate key */
|
||||||
|
|
||||||
typedef uchar *(*hash_get_key)(const uchar *,size_t*,my_bool);
|
typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool);
|
||||||
typedef void (*hash_free_key)(void *);
|
typedef void (*my_hash_free_key)(void *);
|
||||||
|
|
||||||
typedef struct st_hash {
|
typedef struct st_hash {
|
||||||
size_t key_offset,key_length; /* Length of key if const length */
|
size_t key_offset,key_length; /* Length of key if const length */
|
||||||
@ -39,7 +73,7 @@ typedef struct st_hash {
|
|||||||
ulong records;
|
ulong records;
|
||||||
uint flags;
|
uint flags;
|
||||||
DYNAMIC_ARRAY array; /* Place for hash_keys */
|
DYNAMIC_ARRAY array; /* Place for hash_keys */
|
||||||
hash_get_key get_key;
|
my_hash_get_key get_key;
|
||||||
void (*free)(void *);
|
void (*free)(void *);
|
||||||
CHARSET_INFO *charset;
|
CHARSET_INFO *charset;
|
||||||
} HASH;
|
} HASH;
|
||||||
@ -47,30 +81,34 @@ typedef struct st_hash {
|
|||||||
/* A search iterator state */
|
/* A search iterator state */
|
||||||
typedef uint HASH_SEARCH_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 my_hash_init(A,B,C,D,E,F,G,H) \
|
||||||
#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_hash_init(A,0,B,C,D,E,F,G,H CALLER_INFO)
|
||||||
my_bool _hash_init(HASH *hash, uint growth_size,CHARSET_INFO *charset,
|
#define my_hash_init2(A,B,C,D,E,F,G,H,I) \
|
||||||
ulong default_array_elements, size_t key_offset,
|
_my_hash_init(A,B,C,D,E,F,G,H,I CALLER_INFO)
|
||||||
size_t key_length, hash_get_key get_key,
|
my_bool _my_hash_init(HASH *hash, uint growth_size, CHARSET_INFO *charset,
|
||||||
void (*free_element)(void*), uint flags CALLER_INFO_PROTO);
|
ulong default_array_elements, size_t key_offset,
|
||||||
void hash_free(HASH *tree);
|
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);
|
void my_hash_reset(HASH *hash);
|
||||||
uchar *hash_element(HASH *hash,ulong idx);
|
uchar *my_hash_element(HASH *hash, ulong idx);
|
||||||
uchar *hash_search(const HASH *info, const uchar *key, size_t length);
|
uchar *my_hash_search(const HASH *info, const uchar *key, size_t length);
|
||||||
uchar *hash_first(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);
|
HASH_SEARCH_STATE *state);
|
||||||
uchar *hash_next(const HASH *info, const uchar *key, size_t length,
|
uchar *my_hash_next(const HASH *info, const uchar *key, size_t length,
|
||||||
HASH_SEARCH_STATE *state);
|
HASH_SEARCH_STATE *state);
|
||||||
my_bool my_hash_insert(HASH *info,const uchar *data);
|
my_bool my_hash_insert(HASH *info, const uchar *data);
|
||||||
my_bool hash_delete(HASH *hash,uchar *record);
|
my_bool my_hash_delete(HASH *hash, uchar *record);
|
||||||
my_bool hash_update(HASH *hash,uchar *record,uchar *old_key,size_t old_key_length);
|
my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key,
|
||||||
void hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row);
|
size_t old_key_length);
|
||||||
my_bool hash_check(HASH *hash); /* Only in debug library */
|
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 my_hash_clear(H) bzero((char*) (H), sizeof(*(H)))
|
||||||
#define hash_inited(H) ((H)->array.buffer != 0)
|
#define my_hash_inited(H) ((H)->array.buffer != 0)
|
||||||
#define hash_init_opt(A,B,C,D,E,F,G,H) \
|
#define my_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))
|
(!my_hash_inited(A) && _my_hash_init(A,0,B,C,D,E,F,G, H CALLER_INFO))
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#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_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
|
||||||
NEAR my_dont_interrupt; /* call remember_intr when set */
|
NEAR my_dont_interrupt; /* call remember_intr when set */
|
||||||
extern my_bool NEAR mysys_uses_curses, my_use_symdir;
|
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 ulong my_default_record_cache_size;
|
||||||
extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io,
|
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 File my_dup(File file, myf MyFlags);
|
||||||
extern int my_mkdir(const char *dir, int Flags, 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_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 int my_realpath(char *to, const char *filename, myf MyFlags);
|
||||||
extern File my_create_with_symlink(const char *linkname, const char *filename,
|
extern File my_create_with_symlink(const char *linkname, const char *filename,
|
||||||
int createflags, int access_flags,
|
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);
|
const char *form, uint flag);
|
||||||
extern size_t strlength(const char *str);
|
extern size_t strlength(const char *str);
|
||||||
extern void pack_dirname(char * to,const char *from);
|
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 unpack_dirname(char * to,const char *from);
|
||||||
extern size_t cleanup_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);
|
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 my_off_t myisam_max_temp_length;
|
||||||
extern ulong myisam_bulk_insert_tree_size, myisam_data_pointer_size;
|
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 */
|
/* Prototypes for myisam-functions */
|
||||||
|
|
||||||
extern int mi_close(struct st_myisam_info *file);
|
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,
|
enum thr_lock_type { TL_IGNORE=-1,
|
||||||
TL_UNLOCK, /* UNLOCK ANY LOCK */
|
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, /* Read lock */
|
||||||
TL_READ_WITH_SHARED_LOCKS,
|
TL_READ_WITH_SHARED_LOCKS,
|
||||||
/* High prior. than TL_WRITE. Allow concurrent insert */
|
/* 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);
|
UNREFERENCED_PARAMETER(lpReserved);
|
||||||
} /* LibMain */
|
} /* LibMain */
|
||||||
|
|
||||||
|
|
||||||
|
static BOOL do_libmain;
|
||||||
int __stdcall DllMain(HANDLE hInst,DWORD ul_reason_being_called,LPVOID lpReserved)
|
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)
|
#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/strfunc.cc ../sql/table.cc ../sql/thr_malloc.cc
|
||||||
../sql/time.cc ../sql/tztime.cc ../sql/uniques.cc ../sql/unireg.cc
|
../sql/time.cc ../sql/tztime.cc ../sql/uniques.cc ../sql/unireg.cc
|
||||||
../sql/partition_info.cc ../sql/sql_connect.cc
|
../sql/partition_info.cc ../sql/sql_connect.cc
|
||||||
../sql/scheduler.cc ../sql/stacktrace.c
|
../sql/scheduler.cc ../sql/event_parse_data.cc
|
||||||
../sql/event_parse_data.cc
|
|
||||||
${GEN_SOURCES}
|
${GEN_SOURCES}
|
||||||
${LIB_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_select.cc sql_do.cc sql_show.cc set_var.cc \
|
||||||
sql_string.cc sql_table.cc sql_test.cc sql_udf.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 \
|
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 \
|
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 \
|
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 \
|
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)
|
if (thd->protocol == &thd->protocol_binary)
|
||||||
{
|
{
|
||||||
uint length;
|
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;
|
end_row= row + rows;
|
||||||
data->data= row;
|
data->data= row;
|
||||||
|
|
||||||
|
@ -79,6 +79,15 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
|||||||
my_bool result= 1;
|
my_bool result= 1;
|
||||||
THD *thd=(THD *) mysql->thd;
|
THD *thd=(THD *) mysql->thd;
|
||||||
NET *net= &mysql->net;
|
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)
|
#if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER)
|
||||||
thd->profiling.start_new_query();
|
thd->profiling.start_new_query();
|
||||||
@ -1094,6 +1103,9 @@ void Protocol_text::prepare_for_resend()
|
|||||||
data->embedded_info->prev_ptr= &cur->next;
|
data->embedded_info->prev_ptr= &cur->next;
|
||||||
next_field=cur->data;
|
next_field=cur->data;
|
||||||
next_mysql_field= data->embedded_info->fields_list;
|
next_mysql_field= data->embedded_info->fields_list;
|
||||||
|
#ifndef DBUG_OFF
|
||||||
|
field_pos= 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
@ -21,5 +21,9 @@ man1_MANS = @man1_files@
|
|||||||
man8_MANS = @man8_files@
|
man8_MANS = @man8_files@
|
||||||
EXTRA_DIST = $(man1_MANS) $(man8_MANS)
|
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
|
# Don't update the files from bitkeeper
|
||||||
%::SCCS/s.%
|
%::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_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/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/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)/std_data/funcs_1/* $(distdir)/std_data/funcs_1
|
||||||
$(INSTALL_DATA) $(srcdir)/lib/*.pl $(distdir)/lib
|
$(INSTALL_DATA) $(srcdir)/lib/*.pl $(distdir)/lib
|
||||||
$(INSTALL_DATA) $(srcdir)/lib/My/*.pm $(distdir)/lib/My
|
$(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_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/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/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)/std_data/funcs_1/* $(DESTDIR)$(testdir)/std_data/funcs_1
|
||||||
$(INSTALL_DATA) $(srcdir)/lib/*.pl $(DESTDIR)$(testdir)/lib
|
$(INSTALL_DATA) $(srcdir)/lib/*.pl $(DESTDIR)$(testdir)/lib
|
||||||
$(INSTALL_DATA) $(srcdir)/lib/My/*.pm $(DESTDIR)$(testdir)/lib/My
|
$(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,/
|
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /Server ver: [^,]*,/Server version,/
|
||||||
show binlog events from 0;
|
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
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
# Test of a too big SET INSERT_ID: see if the truncated value goes
|
# 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;
|
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 $table=t1;
|
||||||
let $rows_inserted=11; # total number of inserted rows in this test
|
let $count=0;
|
||||||
|
|
||||||
insert delayed into t1 values (207);
|
insert delayed into t1 values (207);
|
||||||
let $count=1;
|
inc $count;
|
||||||
|
|
||||||
# use this macro instead of sleeps.
|
|
||||||
|
|
||||||
--source include/wait_until_rows_count.inc
|
--source include/wait_until_rows_count.inc
|
||||||
|
|
||||||
insert delayed into t1 values (null);
|
insert delayed into t1 values (null);
|
||||||
inc $count;
|
inc $count;
|
||||||
--source include/wait_until_rows_count.inc
|
--source include/wait_until_rows_count.inc
|
||||||
@ -20,9 +46,10 @@ insert delayed into t1 values (300);
|
|||||||
inc $count;
|
inc $count;
|
||||||
--source include/wait_until_rows_count.inc
|
--source include/wait_until_rows_count.inc
|
||||||
|
|
||||||
# moving binlog check affront of multi-rows queries which work is indeterministic (extra table_maps)
|
# It is not enough to wait until all rows have been inserted into the
|
||||||
# todo: better check is to substitute SHOW BINLOG with reading from binlog, probably bug#19459 is in
|
# table. FLUSH TABLES ensures that they are in the binlog too. See
|
||||||
# the way
|
# comment above.
|
||||||
|
FLUSH TABLES;
|
||||||
source include/show_binlog_events.inc;
|
source include/show_binlog_events.inc;
|
||||||
|
|
||||||
insert delayed into t1 values (null),(null),(null),(null);
|
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;
|
inc $count; inc $count; inc $count; inc $count;
|
||||||
--source include/wait_until_rows_count.inc
|
--source include/wait_until_rows_count.inc
|
||||||
|
|
||||||
#check this assertion about $count calculation
|
|
||||||
--echo $count == $rows_inserted
|
|
||||||
|
|
||||||
select * from t1;
|
select * from t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
@ -139,15 +139,6 @@ drop table t1,t2,t3;
|
|||||||
# table
|
# table
|
||||||
#
|
#
|
||||||
CREATE TABLE t1(a INT) ENGINE=BLACKHOLE;
|
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);
|
INSERT DELAYED INTO t1 VALUES(1);
|
||||||
DROP TABLE t1;
|
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);
|
create procedure sp1 (a int) insert into t1 values(a);
|
||||||
drop database testing_1;
|
drop database testing_1;
|
||||||
source include/show_binlog_events.inc;
|
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
|
# Actually this test has nothing to do with innodb per se, it just requires
|
||||||
# transactional table.
|
# transactional table.
|
||||||
#
|
#
|
||||||
|
flush status;
|
||||||
show status like "binlog_cache_use";
|
show status like "binlog_cache_use";
|
||||||
show status like "binlog_cache_disk_use";
|
show status like "binlog_cache_disk_use";
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
@ -38,12 +39,3 @@ commit;
|
|||||||
show status like "binlog_cache_use";
|
show status like "binlog_cache_use";
|
||||||
show status like "binlog_cache_disk_use";
|
show status like "binlog_cache_disk_use";
|
||||||
drop table t1;
|
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;
|
eval create table t1 (a int) engine=$engine_type;
|
||||||
flush tables;
|
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;
|
drop table if exists t1;
|
||||||
save_master_pos;
|
save_master_pos;
|
||||||
connection slave;
|
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 mysqltest1;
|
||||||
CREATE DATABASE mysqltest2;
|
CREATE DATABASE mysqltest2;
|
||||||
eval CREATE TABLE mysqltest1.t1 (f1 BIGINT) ENGINE=$engine_type;
|
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;
|
INSERT INTO mysqltest1.t1 SET f1= 0;
|
||||||
eval CREATE TABLE mysqltest1.t2 (f1 BIGINT) ENGINE=$engine_type;
|
eval CREATE TABLE mysqltest1.t2 (f1 BIGINT) ENGINE=$engine_type;
|
||||||
eval CREATE TABLE mysqltest1.t3 (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()),
|
INSERT INTO t1 VALUES (NULL, f2()), (NULL, LAST_INSERT_ID()),
|
||||||
(NULL, LAST_INSERT_ID()), (NULL, f2()), (NULL, f2());
|
(NULL, LAST_INSERT_ID()), (NULL, f2()), (NULL, f2());
|
||||||
INSERT INTO t1 VALUES (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".
|
# Test replication of substitution "IS NULL" -> "= LAST_INSERT_ID".
|
||||||
INSERT INTO t1 VALUES (NULL, 0), (NULL, LAST_INSERT_ID());
|
INSERT INTO t1 VALUES (NULL, 0), (NULL, LAST_INSERT_ID());
|
||||||
UPDATE t1 SET j= -1 WHERE i IS NULL;
|
UPDATE t1 SET j= -1 WHERE i IS NULL;
|
||||||
|
@ -13,22 +13,15 @@ save_master_pos;
|
|||||||
connection slave;
|
connection slave;
|
||||||
sync_with_master;
|
sync_with_master;
|
||||||
stop slave;
|
stop slave;
|
||||||
|
--source include/wait_for_slave_to_stop.inc
|
||||||
reset master;
|
reset master;
|
||||||
reset slave;
|
reset slave;
|
||||||
# We are going to read the slave's binlog which contains file_id (for some LOAD
|
start slave;
|
||||||
# DATA INFILE); to make it repeatable (not influenced by other tests), we need
|
--source include/wait_for_slave_to_start.inc
|
||||||
# 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.
|
|
||||||
|
|
||||||
let $VERSION=`select version()`;
|
let $VERSION=`select version()`;
|
||||||
|
|
||||||
connection master;
|
connection master;
|
||||||
reset master;
|
|
||||||
eval create table t1(n int not null auto_increment primary key)ENGINE=$engine_type;
|
eval create table t1(n int not null auto_increment primary key)ENGINE=$engine_type;
|
||||||
insert into t1 values (NULL);
|
insert into t1 values (NULL);
|
||||||
drop table t1;
|
drop table t1;
|
||||||
@ -79,7 +72,6 @@ connection slave;
|
|||||||
# Note that the above 'slave start' will cause a 3rd rotate event (a fake one)
|
# 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
|
# to go into the relay log (the master always sends a fake one when replication
|
||||||
# starts).
|
# starts).
|
||||||
start slave;
|
|
||||||
let $result_pattern= '%127.0.0.1%root%master-bin.000002%slave-relay-bin.000005%Yes%Yes%0%0%None%';
|
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
|
--source include/wait_slave_status.inc
|
||||||
sync_with_master;
|
sync_with_master;
|
||||||
@ -87,6 +79,7 @@ sync_with_master;
|
|||||||
select * from t1 order by 1 asc;
|
select * from t1 order by 1 asc;
|
||||||
flush logs;
|
flush logs;
|
||||||
stop slave;
|
stop slave;
|
||||||
|
--source include/wait_for_slave_to_stop.inc
|
||||||
connection master;
|
connection master;
|
||||||
|
|
||||||
# Create some entries for second log
|
# Create some entries for second log
|
||||||
@ -95,6 +88,7 @@ eval create table t2 (n int)ENGINE=$engine_type;
|
|||||||
insert into t2 values (1);
|
insert into t2 values (1);
|
||||||
source include/show_binlog_events.inc;
|
source include/show_binlog_events.inc;
|
||||||
--replace_result $VERSION VERSION
|
--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_column 2 # 5 #
|
||||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
||||||
show binlog events in 'master-bin.000002';
|
show binlog events in 'master-bin.000002';
|
||||||
@ -102,10 +96,12 @@ show binary logs;
|
|||||||
save_master_pos;
|
save_master_pos;
|
||||||
connection slave;
|
connection slave;
|
||||||
start slave;
|
start slave;
|
||||||
|
--source include/wait_for_slave_to_start.inc
|
||||||
sync_with_master;
|
sync_with_master;
|
||||||
show binary logs;
|
show binary logs;
|
||||||
--replace_result $MASTER_MYPORT MASTER_PORT $VERSION VERSION
|
--replace_result $MASTER_MYPORT MASTER_PORT $VERSION VERSION
|
||||||
--replace_column 2 # 5 #
|
--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: #/
|
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
||||||
show binlog events in 'slave-bin.000001' from 4;
|
show binlog events in 'slave-bin.000001' from 4;
|
||||||
--replace_result $MASTER_MYPORT MASTER_PORT $VERSION VERSION
|
--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;
|
query_vertical SELECT COUNT(*) FROM t1 ORDER BY c1,c2;
|
||||||
sync_slave_with_master;
|
sync_slave_with_master;
|
||||||
set @@global.slave_exec_mode= default;
|
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;
|
disable_query_log;
|
||||||
eval SELECT "$last_error" AS Last_SQL_Error;
|
eval SELECT "$last_error" AS Last_SQL_Error;
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
query_vertical SELECT COUNT(*) FROM t1 ORDER BY c1,c2;
|
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
|
# cleanup
|
||||||
#
|
#
|
||||||
@ -272,3 +288,186 @@ query_vertical SELECT COUNT(*) FROM t1 ORDER BY c1,c2;
|
|||||||
connection master;
|
connection master;
|
||||||
DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t7,t8;
|
DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t7,t8;
|
||||||
sync_slave_with_master;
|
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
|
# Bug#3300
|
||||||
# Designed and tested by Sinisa Milivojevic, sinisa@mysql.com
|
# Designed and tested by Sinisa Milivojevic, sinisa@mysql.com
|
||||||
#
|
#
|
||||||
# two non-interfering UPDATE's not changing result set
|
# These variables have to be set before sourcing this script:
|
||||||
#
|
# TRANSACTION ISOLATION LEVEL REPEATABLE READ
|
||||||
# The variable
|
# innodb_locks_unsafe_for_binlog 0 (default) or 1 (by
|
||||||
# $engine_type -- storage engine to be tested
|
# --innodb_locks_unsafe_for_binlog)
|
||||||
# has to be set before sourcing this script.
|
# $engine_type storage engine to be tested
|
||||||
#
|
#
|
||||||
# Last update:
|
# Last update:
|
||||||
# 2006-08-02 ML test refactored
|
# 2006-08-02 ML test refactored
|
||||||
# old name was t/innodb_concurrent.test
|
# old name was t/innodb_concurrent.test
|
||||||
# main code went into include/concurrent.inc
|
# 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;
|
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
|
--disable_warnings
|
||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
--enable_warnings
|
--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
|
--echo
|
||||||
#
|
--echo **
|
||||||
#connect (thread1, localhost, mysqltest,,);
|
--echo ** two UPDATE's running and both changing distinct result sets
|
||||||
connection thread1;
|
--echo **
|
||||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
--echo ** connection thread1
|
||||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
connect (thread1, localhost, mysqltest,,);
|
||||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
connection thread1;
|
||||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
--echo ** Set up table
|
||||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||||
select get_lock("hello",10);
|
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||||
#connect (thread2, localhost, mysqltest,,);
|
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||||
connection thread2;
|
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||||
begin;
|
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||||
send update t1 set eta=1+get_lock("hello",10)*0 where tipo=1;
|
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||||
sleep 1;
|
--echo ** Get user level lock (ULL) for thread 1
|
||||||
connection thread1;
|
select get_lock("hello",10);
|
||||||
begin;
|
|
||||||
update t1 set tipo=1 where tipo=2;
|
--echo ** connection thread2
|
||||||
select release_lock("hello");
|
connect (thread2, localhost, mysqltest,,);
|
||||||
select * from t1;
|
connection thread2;
|
||||||
connection thread2;
|
--echo ** Start transaction for thread 2
|
||||||
reap;
|
begin;
|
||||||
select * from t1;
|
--echo ** Update will cause a table scan and a new ULL will
|
||||||
send commit;
|
--echo ** be created and blocked on the first row where tipo=11.
|
||||||
connection thread1;
|
send update t1 set eta=1+get_lock("hello",10)*0 where tipo=11;
|
||||||
select * from t1;
|
sleep 1;
|
||||||
commit;
|
|
||||||
select * from t1;
|
--echo ** connection thread1
|
||||||
connection thread2;
|
connection thread1;
|
||||||
reap;
|
--echo ** Start new transaction for thread 1
|
||||||
select * from t1;
|
begin;
|
||||||
connection thread1;
|
--echo ** Update on t1 will cause a table scan which will be blocked because
|
||||||
select * from t1;
|
--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;
|
connection default;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
#
|
--echo
|
||||||
# One UPDATE and one INSERT .... Monty's test
|
--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,,);
|
--echo ** connection thread2
|
||||||
connection thread1;
|
#connect (thread2, localhost, mysqltest,,);
|
||||||
create table t1 (a int not null, b int not null);
|
connection thread2;
|
||||||
insert into t1 values (1,1),(2,1),(3,1),(4,1);
|
--echo ** Start transaction on thread 2
|
||||||
select get_lock("hello2",1000);
|
begin;
|
||||||
#connect (thread2, localhost, mysqltest,,);
|
--echo ** Update will cause a table scan.
|
||||||
connection thread2;
|
--echo ** This will cause a hang on the first row where tipo=1 until the
|
||||||
begin;
|
--echo ** blocking ULL is released.
|
||||||
send update t1 set b=10+get_lock(concat("hello",a),1000)*0 where
|
send update t1 set eta=1+get_lock("hello",10)*0 where tipo=1;
|
||||||
a=2;
|
sleep 1;
|
||||||
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 thread1
|
||||||
# one UPDATE changing result set and SELECT ... FOR UPDATE
|
connection thread1;
|
||||||
#
|
--echo ** Start transaction on thread 1
|
||||||
#connect (thread1, localhost, mysqltest,,);
|
begin;
|
||||||
connection thread1;
|
--echo ** Update on t1 will cause a table scan which will be blocked because
|
||||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
--echo ** the previously initiated table scan applied exclusive key locks on
|
||||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
--echo ** all primary keys.
|
||||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
--echo ** Not so if innodb_locks_unsafe_for_binlog is set. The locks that
|
||||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
--echo ** do not match the WHERE condition are released.
|
||||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
if ($keep_locks)
|
||||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
{
|
||||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
--error ER_LOCK_WAIT_TIMEOUT
|
||||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
update t1 set tipo=1 where tipo=2;
|
||||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
}
|
||||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
if (!$keep_locks)
|
||||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
{
|
||||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
update t1 set tipo=1 where tipo=2;
|
||||||
select get_lock("hello",10);
|
}
|
||||||
#connect (thread2, localhost, mysqltest,,);
|
--echo ** Release ULL. This will release the next waiting ULL on thread 2.
|
||||||
connection thread2;
|
select release_lock("hello");
|
||||||
begin;
|
--echo ** The table should still be updated with updates for thread 1 only:
|
||||||
send select * from t1 where tipo=2 FOR UPDATE;
|
select * from t1;
|
||||||
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 thread2
|
||||||
# one UPDATE not changing result set and SELECT ... FOR UPDATE
|
connection thread2;
|
||||||
#
|
--echo ** Release the lock and collect result from thread 2:
|
||||||
#connect (thread1, localhost, mysqltest,,);
|
reap;
|
||||||
connection thread1;
|
select release_lock("hello");
|
||||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
--echo ** Seen from thread 2 the table should have been updated on four
|
||||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
--echo ** places.
|
||||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
select * from t1;
|
||||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
commit;
|
||||||
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 thread1
|
||||||
# two SELECT ... FOR UPDATE
|
connection thread1;
|
||||||
#
|
--echo ** Thread 2 has committed but the result should remain the same for
|
||||||
#connect (thread1, localhost, mysqltest,,);
|
--echo ** thread 1 (updated on three places):
|
||||||
connection thread1;
|
select * from t1;
|
||||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
commit;
|
||||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
--echo ** After a commit the table should be merged with the previous
|
||||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
--echo ** commit.
|
||||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
--echo ** This select should show both updates:
|
||||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
select * from t1;
|
||||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
|
||||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
--echo ** connection thread2
|
||||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
connection thread2;
|
||||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
select * from t1;
|
||||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
|
||||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
--echo ** connection thread1
|
||||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
connection thread1;
|
||||||
select get_lock("hello",10);
|
select * from t1;
|
||||||
#connect (thread2, localhost, mysqltest,,);
|
|
||||||
connection thread2;
|
--echo ** connection default
|
||||||
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;
|
|
||||||
connection default;
|
connection default;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
#
|
--echo
|
||||||
# one UPDATE changing result set and DELETE
|
--echo **
|
||||||
#
|
--echo ** One UPDATE and one INSERT .... Monty's test
|
||||||
#connect (thread1, localhost, mysqltest,,);
|
--echo **
|
||||||
connection thread1;
|
--echo ** connection thread1
|
||||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
#connect (thread1, localhost, mysqltest,,);
|
||||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
connection thread1;
|
||||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
--echo ** Set up table
|
||||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
create table t1 (a int not null, b int not null);
|
||||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
insert into t1 values (1,1),(2,1),(3,1),(4,1);
|
||||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
--echo ** Create ULL 'hello2'
|
||||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
select get_lock("hello2",10);
|
||||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
|
||||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
--echo ** connection thread2
|
||||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
#connect (thread2, localhost, mysqltest,,);
|
||||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
connection thread2;
|
||||||
select get_lock("hello",10);
|
--echo ** Begin a new transaction on thread 2
|
||||||
#connect (thread2, localhost, mysqltest,,);
|
begin;
|
||||||
connection thread2;
|
--echo ** Update will create a table scan which creates a ULL where a=2;
|
||||||
begin;
|
--echo ** this will hang waiting on thread 1.
|
||||||
send delete from t1 where tipo=2;
|
send update t1 set b=10+get_lock(concat("hello",a),10)*0 where a=2;
|
||||||
sleep 1;
|
sleep 1;
|
||||||
connection thread1;
|
|
||||||
begin;
|
--echo ** connection thread1
|
||||||
select release_lock("hello");
|
connection thread1;
|
||||||
--error 1205
|
--echo ** Insert new values to t1 from thread 1; this created an implicit
|
||||||
update t1 set tipo=1+get_lock("hello",10)*0 where tipo=2;
|
--echo ** commit since there are no on-going transactions.
|
||||||
select * from t1;
|
insert into t1 values (1,1);
|
||||||
connection thread2;
|
--echo ** Release the ULL (thread 2 updates will finish).
|
||||||
reap;
|
select release_lock("hello2");
|
||||||
select * from t1;
|
--echo ** ..but thread 1 will still see t1 as if nothing has happend:
|
||||||
send commit;
|
select * from t1;
|
||||||
connection thread1;
|
|
||||||
commit;
|
--echo ** connection thread2
|
||||||
connection thread2;
|
connection thread2;
|
||||||
reap;
|
--echo ** Collect results from thread 2 and release the lock.
|
||||||
select * from t1;
|
reap;
|
||||||
connection thread1;
|
select release_lock("hello2");
|
||||||
select * from t1;
|
--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;
|
connection default;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
#
|
--echo
|
||||||
# one UPDATE not changing result set and DELETE
|
--echo **
|
||||||
#
|
--echo ** one UPDATE changing result set and SELECT ... FOR UPDATE
|
||||||
#connect (thread1, localhost, mysqltest,,);
|
--echo **
|
||||||
connection thread1;
|
--echo ** connection thread1
|
||||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
#connect (thread1, localhost, mysqltest,,);
|
||||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
connection thread1;
|
||||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
--echo ** Set up table
|
||||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||||
select get_lock("hello",10);
|
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||||
#connect (thread2, localhost, mysqltest,,);
|
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||||
connection thread2;
|
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||||
begin;
|
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||||
send delete from t1 where tipo=2;
|
|
||||||
sleep 1;
|
--echo ** connection thread2
|
||||||
connection thread1;
|
#connect (thread2, localhost, mysqltest,,);
|
||||||
begin;
|
connection thread2;
|
||||||
select release_lock("hello");
|
--echo ** Begin a new transaction on thread 2
|
||||||
update t1 set tipo=1+get_lock("hello",10)*0 where tipo=22;
|
begin;
|
||||||
select * from t1;
|
--echo ** Select a range for update.
|
||||||
connection thread2;
|
select * from t1 where tipo=2 FOR UPDATE;
|
||||||
reap;
|
|
||||||
select * from t1;
|
--echo ** connection thread1
|
||||||
send commit;
|
connection thread1;
|
||||||
connection thread1;
|
--echo ** Begin a new transaction on thread 1
|
||||||
commit;
|
begin;
|
||||||
connection thread2;
|
--echo ** Update the same range which is marked for update on thread 2; this
|
||||||
reap;
|
--echo ** will hang because of row locks.
|
||||||
select * from t1;
|
--error ER_LOCK_WAIT_TIMEOUT
|
||||||
connection thread1;
|
update t1 set tipo=1 where tipo=2;
|
||||||
select * from t1;
|
--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;
|
connection default;
|
||||||
sleep 1;
|
|
||||||
drop table t1;
|
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 thread1;
|
||||||
disconnect thread2;
|
disconnect thread2;
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ connect (user3,localhost,mysqltest_3,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK);
|
|||||||
connection user3;
|
connection user3;
|
||||||
select "user3";
|
select "user3";
|
||||||
--replace_result 127.0.0.1 localhost
|
--replace_result 127.0.0.1 localhost
|
||||||
--error ER_COLUMNACCESS_DENIED_ERROR
|
--error ER_TABLEACCESS_DENIED_ERROR
|
||||||
select * from t1;
|
select * from t1;
|
||||||
select a from t1;
|
select a from t1;
|
||||||
--replace_result 127.0.0.1 localhost
|
--replace_result 127.0.0.1 localhost
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_big5.require
|
-- require r/have_big5.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "big5_chinese_ci";
|
show collation like 'big5_chinese_ci';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
-- require r/have_binlog_format_mixed.require
|
-- require r/have_binlog_format_mixed.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "binlog_format";
|
show variables like 'binlog_format';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -3,5 +3,5 @@
|
|||||||
--require r/have_binlog_format_row.require
|
--require r/have_binlog_format_row.require
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
--replace_result MIXED ROW
|
--replace_result MIXED ROW
|
||||||
show variables like "binlog_format";
|
show variables like 'binlog_format';
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
@ -4,5 +4,5 @@ source include/have_log_bin.inc;
|
|||||||
--require r/have_binlog_format_statement.require
|
--require r/have_binlog_format_statement.require
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
--replace_result MIXED STATEMENT
|
--replace_result MIXED STATEMENT
|
||||||
show variables like "binlog_format";
|
show variables like 'binlog_format';
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
-- require r/have_binlog_format_row.require
|
-- require r/have_binlog_format_row.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "binlog_format";
|
show variables like 'binlog_format';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -3,5 +3,5 @@
|
|||||||
-- require r/have_binlog_format_statement.require
|
-- require r/have_binlog_format_statement.require
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
--replace_result ROW STATEMENT
|
--replace_result ROW STATEMENT
|
||||||
show variables like "binlog_format";
|
show variables like 'binlog_format';
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
-- require r/have_binlog_format_statement.require
|
-- require r/have_binlog_format_statement.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "binlog_format";
|
show variables like 'binlog_format';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -3,5 +3,5 @@
|
|||||||
#
|
#
|
||||||
--require r/have_bug25714.require
|
--require r/have_bug25714.require
|
||||||
disable_query_log;
|
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;
|
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
|
--require r/case_sensitive_file_system.require
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
show variables like "lower_case_file_system";
|
show variables like 'lower_case_file_system';
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
--require r/have_community_features.require
|
--require r/have_community_features.require
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
show variables like "have_community_features";
|
show variables like 'have_community_features';
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_compress.require
|
-- require r/have_compress.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "have_compress";
|
show variables like 'have_compress';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_cp1250_ch.require
|
-- require r/have_cp1250_ch.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "cp1250_czech_cs";
|
show collation like 'cp1250_czech_cs';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_cp932.require
|
-- require r/have_cp932.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "cp932_japanese_ci";
|
show collation like 'cp932_japanese_ci';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_crypt.require
|
-- require r/have_crypt.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "have_crypt";
|
show variables like 'have_crypt';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_debug.require
|
-- require r/have_debug.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
select (version() like "%debug%") as debug;
|
select (version() like '%debug%') as debug;
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_eucjpms.require
|
-- require r/have_eucjpms.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "eucjpms_japanese_ci";
|
show collation like 'eucjpms_japanese_ci';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_euckr.require
|
-- require r/have_euckr.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "euckr_korean_ci";
|
show collation like 'euckr_korean_ci';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#
|
#
|
||||||
--require r/have_dynamic_loading.require
|
--require r/have_dynamic_loading.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "have_dynamic_loading";
|
show variables like 'have_dynamic_loading';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -12,5 +12,5 @@ enable_query_log;
|
|||||||
#
|
#
|
||||||
--require r/have_example_plugin.require
|
--require r/have_example_plugin.require
|
||||||
disable_query_log;
|
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;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_gb2312.require
|
-- require r/have_gb2312.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "gb2312_chinese_ci";
|
show collation like 'gb2312_chinese_ci';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_gbk.require
|
-- require r/have_gbk.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "gbk_chinese_ci";
|
show collation like 'gbk_chinese_ci';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
--require r/have_geometry.require
|
--require r/have_geometry.require
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
show variables like "have_geometry";
|
show variables like 'have_geometry';
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_latin2_ch.require
|
-- require r/have_latin2_ch.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "latin2_czech_cs";
|
show collation like 'latin2_czech_cs';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_log_bin.require
|
-- require r/have_log_bin.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "log_bin";
|
show variables like 'log_bin';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
--require r/lowercase0.require
|
--require r/lowercase0.require
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
show variables like "lower_case_%";
|
show variables like "lower_case_table_names";
|
||||||
--enable_query_log
|
--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
|
--require r/have_ndbapi_examples.require
|
||||||
disable_query_log;
|
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;
|
enable_query_log;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
-- require r/have_outfile.require
|
-- require r/have_outfile.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
select load_file(concat(@tmpdir,"/outfile.test"));
|
select load_file(concat(@tmpdir,'/outfile.test'));
|
||||||
--remove_file $MYSQLTEST_VARDIR/tmp/outfile.test
|
--remove_file $MYSQLTEST_VARDIR/tmp/outfile.test
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_partition.require
|
-- require r/have_partition.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "have_partitioning";
|
show variables like 'have_partitioning';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_query_cache.require
|
-- require r/have_query_cache.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "have_query_cache";
|
show variables like 'have_query_cache';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_sjis.require
|
-- require r/have_sjis.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "sjis_japanese_ci";
|
show collation like 'sjis_japanese_ci';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_ssl.require
|
-- require r/have_ssl.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "have_ssl";
|
show variables like 'have_ssl';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -6,5 +6,5 @@
|
|||||||
-- require r/have_symlink.require
|
-- require r/have_symlink.require
|
||||||
|
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "have_symlink";
|
show variables like 'have_symlink';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_tis620.require
|
-- require r/have_tis620.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "tis620_thai_ci";
|
show collation like 'tis620_thai_ci';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_ucs2.require
|
-- require r/have_ucs2.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "ucs2_general_ci";
|
show collation like 'ucs2_general_ci';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#
|
#
|
||||||
--require r/have_dynamic_loading.require
|
--require r/have_dynamic_loading.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show variables like "have_dynamic_loading";
|
show variables like 'have_dynamic_loading';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -12,5 +12,5 @@ enable_query_log;
|
|||||||
#
|
#
|
||||||
--require r/have_udf_example.require
|
--require r/have_udf_example.require
|
||||||
disable_query_log;
|
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;
|
enable_query_log;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- require r/have_ujis.require
|
-- require r/have_ujis.require
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
show collation like "ujis_japanese_ci";
|
show collation like 'ujis_japanese_ci';
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
@ -487,3 +487,18 @@ select * from t2 where a=4 or b=4;
|
|||||||
|
|
||||||
drop table t1, t2;
|
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=0;
|
||||||
set global innodb_commit_concurrency=@my_innodb_commit_concurrency;
|
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
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
# Fix for BUG#19243 "wrong LAST_INSERT_ID() after ON DUPLICATE KEY
|
# Fix for BUG#19243 "wrong LAST_INSERT_ID() after ON DUPLICATE KEY
|
||||||
@ -1238,6 +1256,7 @@ connect (con1,localhost,root,,);
|
|||||||
connect (con2,localhost,root,,);
|
connect (con2,localhost,root,,);
|
||||||
SET SESSION AUTOCOMMIT = 0;
|
SET SESSION AUTOCOMMIT = 0;
|
||||||
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||||
|
set binlog_format=mixed;
|
||||||
--echo # Switch to connection con1
|
--echo # Switch to connection con1
|
||||||
connection con1;
|
connection con1;
|
||||||
|
|
||||||
@ -1428,29 +1447,31 @@ DROP TABLE t1;
|
|||||||
# Bug#21704: Renaming column does not update FK definition.
|
# Bug#21704: Renaming column does not update FK definition.
|
||||||
#
|
#
|
||||||
|
|
||||||
--disable_warnings
|
#
|
||||||
DROP TABLE IF EXISTS t1;
|
# --disable_warnings
|
||||||
DROP TABLE IF EXISTS t2;
|
# DROP TABLE IF EXISTS t1;
|
||||||
--enable_warnings
|
# DROP TABLE IF EXISTS t2;
|
||||||
|
# --enable_warnings
|
||||||
CREATE TABLE t1(id INT PRIMARY KEY)
|
#
|
||||||
ENGINE=innodb;
|
# CREATE TABLE t1(id INT PRIMARY KEY)
|
||||||
|
# ENGINE=innodb;
|
||||||
CREATE TABLE t2(
|
#
|
||||||
t1_id INT PRIMARY KEY,
|
# CREATE TABLE t2(
|
||||||
CONSTRAINT fk1 FOREIGN KEY (t1_id) REFERENCES t1(id))
|
# t1_id INT PRIMARY KEY,
|
||||||
ENGINE=innodb;
|
# CONSTRAINT fk1 FOREIGN KEY (t1_id) REFERENCES t1(id))
|
||||||
|
# ENGINE=innodb;
|
||||||
--echo
|
#
|
||||||
|
# --echo
|
||||||
--disable_result_log
|
#
|
||||||
--error ER_ERROR_ON_RENAME
|
# --disable_result_log
|
||||||
ALTER TABLE t1 CHANGE id id2 INT;
|
# --error ER_ERROR_ON_RENAME
|
||||||
--enable_result_log
|
# ALTER TABLE t1 CHANGE id id2 INT;
|
||||||
|
# --enable_result_log
|
||||||
--echo
|
#
|
||||||
|
# --echo
|
||||||
DROP TABLE t2;
|
#
|
||||||
DROP TABLE t1;
|
# DROP TABLE t2;
|
||||||
|
# DROP TABLE t1;
|
||||||
|
#
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--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 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 $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 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_opts=
|
||||||
--let ndb_restore_filter=
|
--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;
|
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_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
|
--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
|
# Skip processing if already marked as skipped
|
||||||
next if $tinfo->{skip};
|
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
|
# Get binlog-format used by this test from master_opt
|
||||||
# =======================================================
|
|
||||||
my $test_binlog_format;
|
my $test_binlog_format;
|
||||||
foreach my $opt ( @{$tinfo->{master_opt}} ) {
|
foreach my $opt ( @{$tinfo->{master_opt}} ) {
|
||||||
$test_binlog_format= $test_binlog_format ||
|
$test_binlog_format=
|
||||||
mtr_match_prefix($opt, "--binlog-format=");
|
mtr_match_prefix($opt, "--binlog-format=") || $test_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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# =======================================================
|
if (defined $test_binlog_format and
|
||||||
# Check that testcase supports the designated binlog-format
|
defined $tinfo->{binlog_formats} )
|
||||||
# =======================================================
|
|
||||||
if ($test_binlog_format and defined $tinfo->{'sup_binlog_formats'} )
|
|
||||||
{
|
{
|
||||||
my $supported=
|
my $supported=
|
||||||
grep { $_ eq $test_binlog_format } @{$tinfo->{'sup_binlog_formats'}};
|
grep { $_ eq $test_binlog_format } @{$tinfo->{'binlog_formats'}};
|
||||||
if ( !$supported )
|
if ( !$supported )
|
||||||
{
|
{
|
||||||
$tinfo->{'skip'}= 1;
|
$tinfo->{'skip'}= 1;
|
||||||
@ -476,20 +486,8 @@ sub optimize_cases {
|
|||||||
next;
|
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 );
|
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 )
|
if ( $tinfo->{'big_test'} and ! $::opt_big_test )
|
||||||
{
|
{
|
||||||
$tinfo->{'skip'}= 1;
|
$tinfo->{'skip'}= 1;
|
||||||
@ -872,18 +877,19 @@ sub collect_one_test_case($$$$$$$$$) {
|
|||||||
# the specified value in "tinfo"
|
# the specified value in "tinfo"
|
||||||
our @tags=
|
our @tags=
|
||||||
(
|
(
|
||||||
["include/have_innodb.inc", "innodb_test", 1],
|
|
||||||
["include/have_binlog_format_row.inc", "sup_binlog_formats", ["row"]],
|
["include/have_binlog_format_row.inc", "binlog_formats", ["row"]],
|
||||||
["include/have_log_bin.inc", "need_binlog", 1],
|
["include/have_binlog_format_statement.inc", "binlog_formats", ["statement"]],
|
||||||
["include/have_binlog_format_statement.inc",
|
["include/have_binlog_format_mixed.inc", "binlog_formats", ["mixed"]],
|
||||||
"sup_binlog_formats", ["statement"]],
|
|
||||||
["include/have_binlog_format_mixed.inc", "sup_binlog_formats", ["mixed"]],
|
|
||||||
["include/have_binlog_format_mixed_or_row.inc",
|
["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",
|
["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",
|
["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/big_test.inc", "big_test", 1],
|
||||||
["include/have_debug.inc", "need_debug", 1],
|
["include/have_debug.inc", "need_debug", 1],
|
||||||
["include/have_ndb.inc", "ndb_test", 1],
|
["include/have_ndb.inc", "ndb_test", 1],
|
||||||
@ -891,6 +897,8 @@ our @tags=
|
|||||||
["include/have_ndb_extra.inc", "ndb_extra", 1],
|
["include/have_ndb_extra.inc", "ndb_extra", 1],
|
||||||
["include/ndb_master-slave.inc", "ndb_test", 1],
|
["include/ndb_master-slave.inc", "ndb_test", 1],
|
||||||
["require_manager", "require_manager", 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($$) {
|
sub mtr_options_from_test_file($$) {
|
||||||
|
@ -312,7 +312,7 @@ sub mtr_report_stats ($) {
|
|||||||
/Slave: According to the master's version/ or
|
/Slave: According to the master's version/ or
|
||||||
/Slave: Column [0-9]* type mismatch/ or
|
/Slave: Column [0-9]* type mismatch/ or
|
||||||
/Slave: Error .* doesn't exist/ or
|
/Slave: Error .* doesn't exist/ or
|
||||||
/Slave: Error .*Deadlock found/ or
|
/Slave: Deadlock found/ or
|
||||||
/Slave: Error .*Unknown table/ or
|
/Slave: Error .*Unknown table/ or
|
||||||
/Slave: Error in Write_rows event: / or
|
/Slave: Error in Write_rows event: / or
|
||||||
/Slave: Field .* of table .* has no default value/ or
|
/Slave: Field .* of table .* has no default value/ or
|
||||||
@ -327,7 +327,6 @@ sub mtr_report_stats ($) {
|
|||||||
/Sort aborted/ or
|
/Sort aborted/ or
|
||||||
/Time-out in NDB/ or
|
/Time-out in NDB/ or
|
||||||
/One can only use the --user.*root/ or
|
/One can only use the --user.*root/ or
|
||||||
/Setting lower_case_table_names=2/ or
|
|
||||||
/Table:.* on (delete|rename)/ or
|
/Table:.* on (delete|rename)/ or
|
||||||
/You have an error in your SQL syntax/ or
|
/You have an error in your SQL syntax/ or
|
||||||
/deprecated/ or
|
/deprecated/ or
|
||||||
@ -402,7 +401,18 @@ sub mtr_report_stats ($) {
|
|||||||
)) or
|
)) or
|
||||||
|
|
||||||
# Test case for Bug#31590 produces the following error:
|
# 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
|
next; # Skip these lines
|
||||||
|
@ -112,6 +112,7 @@ our $glob_basedir;
|
|||||||
|
|
||||||
our $path_charsetsdir;
|
our $path_charsetsdir;
|
||||||
our $path_client_bindir;
|
our $path_client_bindir;
|
||||||
|
our $path_client_libdir;
|
||||||
our $path_share;
|
our $path_share;
|
||||||
our $path_language;
|
our $path_language;
|
||||||
our $path_timefile;
|
our $path_timefile;
|
||||||
@ -250,7 +251,7 @@ our $opt_sleep;
|
|||||||
our $opt_testcase_timeout;
|
our $opt_testcase_timeout;
|
||||||
our $opt_suite_timeout;
|
our $opt_suite_timeout;
|
||||||
my $default_testcase_timeout= 15; # 15 min max
|
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_and_exit;
|
||||||
our $opt_start_dirty;
|
our $opt_start_dirty;
|
||||||
@ -657,6 +658,8 @@ sub command_line_setup () {
|
|||||||
'vardir=s' => \$opt_vardir,
|
'vardir=s' => \$opt_vardir,
|
||||||
'benchdir=s' => \$glob_mysql_bench_dir,
|
'benchdir=s' => \$glob_mysql_bench_dir,
|
||||||
'mem' => \$opt_mem,
|
'mem' => \$opt_mem,
|
||||||
|
'client-bindir=s' => \$path_client_bindir,
|
||||||
|
'client-libdir=s' => \$path_client_libdir,
|
||||||
|
|
||||||
# Misc
|
# Misc
|
||||||
'report-features' => \$opt_report_features,
|
'report-features' => \$opt_report_features,
|
||||||
@ -783,12 +786,20 @@ sub command_line_setup () {
|
|||||||
#
|
#
|
||||||
|
|
||||||
# Look for the client binaries directory
|
# Look for the client binaries directory
|
||||||
$path_client_bindir= mtr_path_exists("$glob_basedir/client_release",
|
if ($path_client_bindir)
|
||||||
"$glob_basedir/client_debug",
|
{
|
||||||
vs_config_dirs('client', ''),
|
# --client-bindir=path set on command line, check that the path exists
|
||||||
"$glob_basedir/client",
|
$path_client_bindir= mtr_path_exists($path_client_bindir);
|
||||||
"$glob_basedir/bin");
|
}
|
||||||
|
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
|
# Look for language files and charsetsdir, use same share
|
||||||
$path_share= mtr_path_exists("$glob_basedir/share/mysql",
|
$path_share= mtr_path_exists("$glob_basedir/share/mysql",
|
||||||
"$glob_basedir/sql/share",
|
"$glob_basedir/sql/share",
|
||||||
@ -1568,13 +1579,15 @@ sub executable_setup_ndb () {
|
|||||||
|
|
||||||
$exe_ndbd=
|
$exe_ndbd=
|
||||||
mtr_exe_maybe_exists("$ndb_path/src/kernel/ndbd",
|
mtr_exe_maybe_exists("$ndb_path/src/kernel/ndbd",
|
||||||
"$ndb_path/ndbd");
|
"$ndb_path/ndbd",
|
||||||
|
"$glob_basedir/libexec/ndbd");
|
||||||
$exe_ndb_mgm=
|
$exe_ndb_mgm=
|
||||||
mtr_exe_maybe_exists("$ndb_path/src/mgmclient/ndb_mgm",
|
mtr_exe_maybe_exists("$ndb_path/src/mgmclient/ndb_mgm",
|
||||||
"$ndb_path/ndb_mgm");
|
"$ndb_path/ndb_mgm");
|
||||||
$exe_ndb_mgmd=
|
$exe_ndb_mgmd=
|
||||||
mtr_exe_maybe_exists("$ndb_path/src/mgmsrv/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=
|
$exe_ndb_waiter=
|
||||||
mtr_exe_maybe_exists("$ndb_path/tools/ndb_waiter",
|
mtr_exe_maybe_exists("$ndb_path/tools/ndb_waiter",
|
||||||
"$ndb_path/ndb_waiter");
|
"$ndb_path/ndb_waiter");
|
||||||
@ -1671,7 +1684,8 @@ sub executable_setup () {
|
|||||||
# Look for mysql_fix_privilege_tables.sql script
|
# Look for mysql_fix_privilege_tables.sql script
|
||||||
$file_mysql_fix_privilege_tables=
|
$file_mysql_fix_privilege_tables=
|
||||||
mtr_file_exists("$glob_basedir/scripts/mysql_fix_privilege_tables.sql",
|
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())
|
if ( ! $opt_skip_ndbcluster and executable_setup_ndb())
|
||||||
{
|
{
|
||||||
@ -1837,19 +1851,25 @@ sub environment_setup () {
|
|||||||
|
|
||||||
my @ld_library_paths;
|
my @ld_library_paths;
|
||||||
|
|
||||||
# --------------------------------------------------------------------------
|
if ($path_client_libdir)
|
||||||
# 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/",
|
# Use the --client-libdir passed on commandline
|
||||||
"$glob_basedir/libmysql_r/.libs/",
|
push(@ld_library_paths, "$path_client_libdir");
|
||||||
"$glob_basedir/zlib.libs/");
|
|
||||||
}
|
}
|
||||||
else
|
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";
|
$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 )
|
if ( $opt_debug )
|
||||||
{
|
{
|
||||||
@ -3578,7 +3601,16 @@ sub run_testcase ($) {
|
|||||||
{
|
{
|
||||||
mtr_timer_stop_all($glob_timers);
|
mtr_timer_stop_all($glob_timers);
|
||||||
mtr_report("\nServers started, exiting");
|
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'},
|
elsif (! mtr_same_opts($master->[0]->{'start_opts'},
|
||||||
$tinfo->{'master_opt'}) )
|
$tinfo->{'master_opt'}) )
|
||||||
{
|
{
|
||||||
# Chech that diff is binlog format only
|
$do_restart= 1;
|
||||||
my $diff_opts= mtr_diff_opts($master->[0]->{'start_opts'},$tinfo->{'master_opt'});
|
mtr_verbose("Restart master: running with different options '" .
|
||||||
if (scalar(@$diff_opts) eq 2)
|
join(" ", @{$tinfo->{'master_opt'}}) . "' != '" .
|
||||||
{
|
|
||||||
$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'}}) . "' != '" .
|
|
||||||
join(" ", @{$master->[0]->{'start_opts'}}) . "'" );
|
join(" ", @{$master->[0]->{'start_opts'}}) . "'" );
|
||||||
}
|
|
||||||
}
|
}
|
||||||
elsif( ! $master->[0]->{'pid'} )
|
elsif( ! $master->[0]->{'pid'} )
|
||||||
{
|
{
|
||||||
@ -5357,6 +5380,8 @@ Misc options
|
|||||||
warnings | log-warnings Pass --log-warnings to mysqld
|
warnings | log-warnings Pass --log-warnings to mysqld
|
||||||
|
|
||||||
sleep=SECONDS Passed to mysqltest, will be used as fixed sleep time
|
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
|
Deprecated options
|
||||||
with-openssl Deprecated option for ssl
|
with-openssl Deprecated option for ssl
|
||||||
|
@ -1184,3 +1184,60 @@ check table t1;
|
|||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 check status OK
|
test.t1 check status OK
|
||||||
drop table t1;
|
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
Reference in New Issue
Block a user