Merged 5.1 with maria 5.1
This commit is contained in:
commit
f47e003e1b
6
.bzr-mysql.moved/default.conf
Normal file
6
.bzr-mysql.moved/default.conf
Normal file
@ -0,0 +1,6 @@
|
||||
[MYSQL]
|
||||
tree_location = bzr+ssh://bk-internal.mysql.com/bzrroot/server/mysql-maria/
|
||||
post_commit_to = maria@lists.mysql.com
|
||||
post_commit_url = bzr+ssh://bk-internal.mysql.com/bzrroot/server/mysql-maria/
|
||||
tree_name = mysql-maria
|
||||
project_name = MySQL/Maria
|
12
.bzrignore
12
.bzrignore
@ -330,6 +330,9 @@ client/readline.cpp
|
||||
client/rpl_constants.h
|
||||
client/rpl_record_old.cc
|
||||
client/rpl_record_old.h
|
||||
client/rpl_tblmap.h
|
||||
client/rpl_tblmap.cc
|
||||
client/rpl_utility.h
|
||||
client/select_test
|
||||
client/sql_string.cpp
|
||||
client/ssl_test
|
||||
@ -746,6 +749,8 @@ mysql-test/funcs_1.log
|
||||
mysql-test/funcs_1.tar
|
||||
mysql-test/install_test_db
|
||||
mysql-test/lib/init_db.sql
|
||||
mysql-test/linux_sys_vars.inc
|
||||
mysql-test/load_sysvars.inc
|
||||
mysql-test/mtr
|
||||
mysql-test/mysql-test-run
|
||||
mysql-test/mysql-test-run-shell
|
||||
@ -781,6 +786,7 @@ mysql-test/r/im_client_port.log
|
||||
mysql-test/r/index_merge_load.result
|
||||
mysql-test/r/isam.err
|
||||
mysql-test/r/lowercase_table2.err
|
||||
mysql-test/r/max_allowed_packet_func.result
|
||||
mysql-test/r/multi_update.err
|
||||
mysql-test/r/mysql_protocols.err
|
||||
mysql-test/r/mysqlbinlog.err
|
||||
@ -858,6 +864,7 @@ mysql-test/t/index_merge.load
|
||||
mysql-test/t/tmp.test
|
||||
mysql-test/var
|
||||
mysql-test/var/*
|
||||
mysql-test/windows_sys_vars.inc
|
||||
mysql.kdevprj
|
||||
mysql.proj
|
||||
mysql_priv.h
|
||||
@ -1860,3 +1867,8 @@ win/vs8cache.txt
|
||||
ylwrap
|
||||
zlib/*.ds?
|
||||
zlib/*.vcproj
|
||||
mysql-test/bug36522-64.tar
|
||||
mysql-test/bug36522.tar
|
||||
mysql-test/t.log
|
||||
mysql-test/tps.log
|
||||
libmysqld/event_parse_data.cc
|
||||
|
@ -20,6 +20,7 @@
|
||||
EXTRA_DIST = FINISH.sh \
|
||||
SETUP.sh \
|
||||
autorun.sh \
|
||||
build_mccge.sh \
|
||||
check-cpu \
|
||||
cleanup \
|
||||
compile-alpha \
|
||||
@ -27,8 +28,12 @@ EXTRA_DIST = FINISH.sh \
|
||||
compile-alpha-cxx \
|
||||
compile-alpha-debug \
|
||||
compile-amd64-debug-max \
|
||||
compile-amd64-debug-max-no-ndb \
|
||||
compile-amd64-gcov \
|
||||
compile-amd64-gprof \
|
||||
compile-amd64-max \
|
||||
compile-amd64-max-sci \
|
||||
compile-amd64-valgrind-max \
|
||||
compile-darwin-mwcc \
|
||||
compile-dist \
|
||||
compile-hpux11-parisc2-aCC \
|
||||
@ -51,8 +56,12 @@ EXTRA_DIST = FINISH.sh \
|
||||
compile-pentium-mysqlfs-debug \
|
||||
compile-pentium-pgcc \
|
||||
compile-pentium-valgrind-max \
|
||||
compile-pentium64 \
|
||||
compile-pentium64-debug \
|
||||
compile-pentium64-debug-max \
|
||||
compile-pentium64-gcov \
|
||||
compile-pentium64-gprof \
|
||||
compile-pentium64-max \
|
||||
compile-pentium64-max-sci \
|
||||
compile-pentium64-valgrind-max \
|
||||
compile-ppc \
|
||||
@ -60,6 +69,10 @@ EXTRA_DIST = FINISH.sh \
|
||||
compile-ppc-debug-max \
|
||||
compile-ppc-debug-max-no-ndb \
|
||||
compile-ppc-max \
|
||||
compile-solaris-amd64 \
|
||||
compile-solaris-amd64-debug \
|
||||
compile-solaris-amd64-forte \
|
||||
compile-solaris-amd64-forte-debug \
|
||||
compile-solaris-sparc \
|
||||
compile-solaris-sparc-debug \
|
||||
compile-solaris-sparc-forte \
|
||||
|
@ -176,7 +176,7 @@ check_cpu () {
|
||||
fi
|
||||
|
||||
cc_ver=`$cc --version | sed 1q`
|
||||
cc_verno=`echo $cc_ver | sed -e 's/^.*gcc/gcc/g; s/[^0-9. ]//g; s/^ *//g; s/ .*//g'`
|
||||
cc_verno=`echo $cc_ver | sed -e 's/^.*(GCC)//g; s/[^0-9. ]//g; s/^ *//g; s/ .*//g'`
|
||||
set -- `echo $cc_verno | tr '.' ' '`
|
||||
cc_major=$1
|
||||
cc_minor=$2
|
||||
|
24
BUILD/compile-pentium-valgrind-max-no-ndb
Executable file
24
BUILD/compile-pentium-valgrind-max-no-ndb
Executable file
@ -0,0 +1,24 @@
|
||||
#! /bin/sh
|
||||
|
||||
path=`dirname $0`
|
||||
. "$path/SETUP.sh"
|
||||
|
||||
extra_flags="$pentium_cflags $debug_cflags $valgrind_flags"
|
||||
extra_configs="$pentium_configs $debug_configs $max_no_ndb_configs"
|
||||
|
||||
. "$path/FINISH.sh"
|
||||
|
||||
if test -z "$just_print"
|
||||
then
|
||||
set +v +x
|
||||
echo "\
|
||||
******************************************************************************
|
||||
Note that by default BUILD/compile-pentium-valgrind-max calls 'configure' with
|
||||
--enable-assembler. When Valgrind detects an error involving an assembly
|
||||
function (for example an uninitialized value used as an argument of an
|
||||
assembly function), Valgrind will not print the stacktrace and 'valgrind
|
||||
--gdb-attach=yes' will not work either. If you need a stacktrace in those
|
||||
cases, you have to run BUILD/compile-pentium-valgrind-max with the
|
||||
--disable-assembler argument.
|
||||
******************************************************************************"
|
||||
fi
|
@ -115,18 +115,18 @@ SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DDBUG_OFF")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4800 /wd4805")
|
||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4800 /wd4805")
|
||||
|
||||
IF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
# Disable warnings in Visual Studio 8 and above
|
||||
IF(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7")
|
||||
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4996")
|
||||
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /wd4996")
|
||||
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /wd4996")
|
||||
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /wd4996")
|
||||
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /wd4996")
|
||||
SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /wd4996")
|
||||
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
|
||||
IF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR
|
||||
CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
ENDIF(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7")
|
||||
|
||||
# Settings for Visual Studio 7 and above.
|
||||
IF(MSVC)
|
||||
# replace /MDd with /MTd
|
||||
STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
|
||||
STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO})
|
||||
@ -156,9 +156,7 @@ IF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR
|
||||
IF(NOT tmp_manifest)
|
||||
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO")
|
||||
ENDIF(NOT tmp_manifest)
|
||||
|
||||
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR
|
||||
CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
ENDIF(MSVC)
|
||||
|
||||
IF(WIN32)
|
||||
ADD_DEFINITIONS("-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE")
|
||||
|
@ -19,11 +19,24 @@ EXTRA_DIST = mysql.info INSTALL-BINARY @extra_docs@
|
||||
# automake only seems to take care of this automatically,
|
||||
# if we're building the info page from texi directly.
|
||||
install-data-hook: $(srcdir)/mysql.info
|
||||
$(mkinstalldirs) $(DESTDIR)$(infodir)
|
||||
$(INSTALL_DATA) $(srcdir)/mysql.info $(DESTDIR)$(infodir)
|
||||
if test `basename $(prefix)` = "mysql" ; then \
|
||||
$(mkinstalldirs) $(DESTDIR)$(prefix)/docs ; \
|
||||
$(INSTALL_DATA) $(srcdir)/mysql.info $(DESTDIR)$(prefix)/docs ; \
|
||||
test ! -f $(top_srcdir)/ChangeLog || $(INSTALL_DATA) $(top_srcdir)/ChangeLog $(DESTDIR)$(prefix)/docs ; \
|
||||
else \
|
||||
$(mkinstalldirs) $(DESTDIR)$(infodir) $(DESTDIR)$(pkgdatadir) ; \
|
||||
$(INSTALL_DATA) $(srcdir)/mysql.info $(DESTDIR)$(infodir) ; \
|
||||
test ! -f $(top_srcdir)/ChangeLog || $(INSTALL_DATA) $(top_srcdir)/ChangeLog $(DESTDIR)$(pkgdatadir) ; \
|
||||
fi
|
||||
|
||||
uninstall-local:
|
||||
@RM@ -f $(DESTDIR)$(infodir)/mysql.info
|
||||
if test `basename $(prefix)` = "mysql" ; then \
|
||||
@RM@ -f $(DESTDIR)$(prefix)/docs/mysql.info ; \
|
||||
@RM@ -f $(DESTDIR)$(prefix)/docs/ChangeLog ; \
|
||||
else \
|
||||
@RM@ -f $(DESTDIR)$(infodir)/mysql.info ; \
|
||||
@RM@ -f $(DESTDIR)$(pkgdatadir)/ChangeLog ; \
|
||||
fi
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
142
Makefile.am
142
Makefile.am
@ -49,7 +49,7 @@ bin-dist: all
|
||||
$(top_builddir)/scripts/make_binary_distribution @MAKE_BINARY_DISTRIBUTION_OPTIONS@
|
||||
|
||||
# Remove BK's "SCCS" subdirectories from source distribution
|
||||
# Create initial database files for Windows installations.
|
||||
# Create initial database files for Windows installations and check them.
|
||||
dist-hook:
|
||||
rm -rf `find $(distdir) -type d -name SCCS -print`
|
||||
mkdir -p $(distdir)/win
|
||||
@ -57,6 +57,9 @@ dist-hook:
|
||||
--builddir=$(top_builddir) \
|
||||
--datadir=$(distdir)/win/data \
|
||||
--srcdir=$(top_srcdir)
|
||||
storage/myisam/myisamchk --silent --fast $(distdir)/win/data/mysql/*.MYI
|
||||
|
||||
all-local: @ABI_CHECK@
|
||||
|
||||
tags:
|
||||
support-files/build-tags
|
||||
@ -66,7 +69,7 @@ tags:
|
||||
test-pl test-force-pl test-full-pl test-force-full-pl test-force-pl-mem \
|
||||
test-unit test-unit-big test-ps test-nr test-pr test-ns test-binlog-statement \
|
||||
test-ext-funcs test-ext-rpl test-ext-partitions test-ext-jp \
|
||||
test-ext-stress test-ext test-embedded \
|
||||
test-ext-stress test-ext test-embedded test-reprepare \
|
||||
test-fast test-fast-cursor test-fast-view test-fast-prepare \
|
||||
test-full-qa
|
||||
|
||||
@ -112,9 +115,14 @@ test-embedded:
|
||||
--embedded-server --skip-rpl --skip-ndbcluster ; \
|
||||
else \
|
||||
echo "no program found for 'embedded' tests - skipped testing" ; \
|
||||
fi
|
||||
fi
|
||||
|
||||
test: test-ns test-pr
|
||||
test-reprepare:
|
||||
cd mysql-test ; \
|
||||
@PERL@ ./mysql-test-run.pl $(force) $(mem) --ps-protocol \
|
||||
--mysqld=--debug=+d,reprepare_each_statement
|
||||
|
||||
test: test-ns test-pr
|
||||
|
||||
test-full: test test-nr test-ps
|
||||
|
||||
@ -135,15 +143,33 @@ test-bt:
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=ps --force --timer \
|
||||
--skip-ndbcluster --ps-protocol
|
||||
-if [ -e bin/ndbd -o -e storage/ndb/src/kernel/ndbd ] ; then \
|
||||
cd mysql-test ; \
|
||||
MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=ndb+rpl_ndb+ps --force --timer \
|
||||
--ps-protocol --mysqld=--binlog-format=row --suite=ndb,rpl_ndb ; \
|
||||
MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=ndb --force --timer \
|
||||
--with-ndbcluster-only ; \
|
||||
else \
|
||||
echo "no program found for 'ndbcluster' tests - skipped testing" ; \
|
||||
fi
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=normal+rowrepl --force --timer \
|
||||
--skip-ndbcluster --mysqld=--binlog-format=row
|
||||
@PERL@ ./mysql-test-run.pl --force --comment=funcs1+ps --ps-protocol --reorder --suite=funcs_1
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=ps+rowrepl+NDB --force --timer \
|
||||
--ps-protocol --mysqld=--binlog-format=row
|
||||
@PERL@ ./mysql-test-run.pl --force --comment=funcs2 --suite=funcs_2
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=NDB --force --timer \
|
||||
--with-ndbcluster-only
|
||||
@PERL@ ./mysql-test-run.pl --force --comment=partitions --suite=parts
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --force --comment=stress --suite=stress
|
||||
-if [ -d mysql-test/suite/nist ] ; then \
|
||||
cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=nist --force --suite=nist ; \
|
||||
fi
|
||||
-if [ -d mysql-test/suite/nist ] ; then \
|
||||
cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=nist+ps --force --suite=nist --ps-protocol ; \
|
||||
fi
|
||||
-if [ -e bin/mysqltest_embedded -o -e libmysqld/examples/mysqltest_embedded ] ; then \
|
||||
cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=embedded --force --timer \
|
||||
@ -151,24 +177,6 @@ test-bt:
|
||||
else \
|
||||
echo "no program found for 'embedded' tests - skipped testing" ; \
|
||||
fi
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --force --comment=funcs1_ps --ps-protocol --suite=funcs_1
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --force --comment=funcs2 --suite=funcs_2
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --force --comment=rpl --suite=rpl
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --force --comment=partitions --suite=parts
|
||||
-if [ -d mysql-test/suite/nist ] ; then \
|
||||
cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=NIST+normal --force --suite=nist ; \
|
||||
fi
|
||||
-if [ -d mysql-test/suite/nist ] ; then \
|
||||
cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --comment=NIST+ps --force --suite=nist --ps-protocol ; \
|
||||
fi
|
||||
-cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@PERL@ ./mysql-test-run.pl --force --comment=stress --suite=stress
|
||||
|
||||
# Re-enable the "jp" suite when bug#28563 is fixed
|
||||
# -cd mysql-test ; MTR_BUILD_THREAD=auto \
|
||||
@ -188,7 +196,7 @@ test-force-full-pl: test-force-full
|
||||
|
||||
test-ext-funcs:
|
||||
cd mysql-test ; \
|
||||
@PERL@ ./mysql-test-run.pl --force --suite=funcs_1 ; \
|
||||
@PERL@ ./mysql-test-run.pl --force --reorder --suite=funcs_1 ; \
|
||||
@PERL@ ./mysql-test-run.pl --force --suite=funcs_2
|
||||
|
||||
test-ext-rpl:
|
||||
@ -229,5 +237,81 @@ test-full-qa:
|
||||
test-binlog-statement test-ext test-fast-view \
|
||||
test-fast-cursor test-unit
|
||||
|
||||
#
|
||||
# Headers which need to be checked for abi/api compatibility.
|
||||
# API_PREPROCESSOR_HEADER will be used until mysql_priv.h stablizes
|
||||
# after which TEST_PREPROCESSOR_HEADER will be used.
|
||||
#
|
||||
|
||||
API_PREPROCESSOR_HEADER = $(top_srcdir)/include/mysql/plugin.h \
|
||||
$(top_srcdir)/include/mysql.h
|
||||
|
||||
TEST_PREPROCESSOR_HEADER = $(top_srcdir)/include/mysql/plugin.h \
|
||||
$(top_srcdir)/sql/mysql_priv.h \
|
||||
$(top_srcdir)/include/mysql.h
|
||||
|
||||
#
|
||||
# Rules for checking that the abi/api has not changed.
|
||||
#
|
||||
# The following steps are followed in the do_abi_check rule below
|
||||
#
|
||||
# 1) Generate preprocessor output for the files that need to
|
||||
# be tested for abi/api changes. use -nostdinc to prevent
|
||||
# generation of preprocessor output for system headers. This
|
||||
# results in messages in stderr saying that these headers
|
||||
# were not found. Redirect the stderr output to /dev/null
|
||||
# to prevent seeing these messages.
|
||||
# 2) sed the output to
|
||||
# 2.1) remove blank lines and lines that begin with "# "
|
||||
# 2.2) When gcc -E is run on the Mac OS and solaris sparc platforms it
|
||||
# introduces a line of output that shows up as a difference between
|
||||
# the .pp and .out files. Remove these OS specific preprocessor text
|
||||
# inserted by the preprocessor.
|
||||
# 3) diff the generated file and the canons (.pp files already in
|
||||
# the repository).
|
||||
# 4) delete the .out file that is generated.
|
||||
#
|
||||
# If the diff fails, the generated file is not removed. This will
|
||||
# be useful for analysis of ABI differences (e.g. using a visual
|
||||
# diff tool).
|
||||
#
|
||||
# A ABI change that causes a build to fail will always be accompanied
|
||||
# by new canons (.out files). The .out files that are not removed will
|
||||
# be replaced as the new .pp files.
|
||||
#
|
||||
# e.g. If include/mysql/plugin.h has an ABI change then this rule would
|
||||
# leave a <build directory>/abi_check.out file.
|
||||
#
|
||||
# A developer with a justified API change will then do a
|
||||
# mv <build directory>/abi_check.out include/mysql/plugin.pp
|
||||
# to replace the old canons with the new ones.
|
||||
#
|
||||
|
||||
abi_check: $(API_PREPROCESSOR_HEADER)
|
||||
$(MAKE) abi_headers="$^" do_abi_check
|
||||
|
||||
abi_check_all: $(TEST_PREPROCESSOR_HEADER)
|
||||
$(MAKE) abi_headers="$^" do_abi_check
|
||||
|
||||
do_abi_check:
|
||||
set -ex; \
|
||||
for file in $(abi_headers); do \
|
||||
@CC@ -E -nostdinc -dI \
|
||||
-I$(top_srcdir)/include \
|
||||
-I$(top_srcdir)/include/mysql \
|
||||
-I$(top_srcdir)/sql \
|
||||
-I$(top_builddir)/include \
|
||||
-I$(top_builddir)/include/mysql \
|
||||
-I$(top_builddir)/sql \
|
||||
$$file 2>/dev/null | \
|
||||
@SED@ -e '/^# /d' \
|
||||
-e '/^[ ]*$$/d' \
|
||||
-e '/^#pragma GCC set_debug_pwd/d' \
|
||||
-e '/^#ident/d' > \
|
||||
$(top_builddir)/abi_check.out; \
|
||||
@DIFF@ -w $$file.pp $(top_builddir)/abi_check.out; \
|
||||
@RM@ $(top_builddir)/abi_check.out; \
|
||||
done
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -15,7 +15,7 @@
|
||||
INCLUDE("${PROJECT_SOURCE_DIR}/win/mysql_manifest.cmake")
|
||||
|
||||
# We use the "mysqlclient_notls" library here just as safety, in case
|
||||
# any of the clients here would go beond the client API and access the
|
||||
# any of the clients here would go beyond the client API and access the
|
||||
# Thread Local Storage directly.
|
||||
|
||||
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX")
|
||||
@ -32,9 +32,9 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include
|
||||
ADD_EXECUTABLE(mysql completion_hash.cc mysql.cc readline.cc sql_string.cc ../mysys/my_conio.c)
|
||||
TARGET_LINK_LIBRARIES(mysql mysqlclient_notls wsock32)
|
||||
|
||||
ADD_EXECUTABLE(mysqltest mysqltest.c ../mysys/my_getsystime.c
|
||||
../mysys/my_copy.c ../mysys/my_mkdir.c)
|
||||
TARGET_LINK_LIBRARIES(mysqltest mysqlclient_notls regex wsock32)
|
||||
ADD_EXECUTABLE(mysqltest mysqltest.c)
|
||||
SET_SOURCE_FILES_PROPERTIES(mysqltest.c PROPERTIES COMPILE_FLAGS "-DTHREADS")
|
||||
TARGET_LINK_LIBRARIES(mysqltest mysqlclient mysys regex wsock32 dbug)
|
||||
|
||||
ADD_EXECUTABLE(mysqlcheck mysqlcheck.c)
|
||||
TARGET_LINK_LIBRARIES(mysqlcheck mysqlclient_notls wsock32)
|
||||
|
@ -86,11 +86,14 @@ mysqlslap_LDADD = $(CXXLDFLAGS) $(CLIENT_THREAD_LIBS) \
|
||||
$(LIBMYSQLCLIENT_LA) \
|
||||
$(top_builddir)/mysys/libmysys.a
|
||||
|
||||
mysqltest_SOURCES= mysqltest.c \
|
||||
$(top_srcdir)/mysys/my_getsystime.c \
|
||||
$(top_srcdir)/mysys/my_copy.c \
|
||||
$(top_srcdir)/mysys/my_mkdir.c
|
||||
mysqltest_LDADD = $(top_builddir)/regex/libregex.a $(LDADD)
|
||||
mysqltest_SOURCES= mysqltest.c
|
||||
mysqltest_CFLAGS= -DTHREAD -UUNDEF_THREADS_HACK
|
||||
mysqltest_LDADD = $(CXXLDFLAGS) \
|
||||
@CLIENT_EXTRA_LDFLAGS@ \
|
||||
$(LIBMYSQLCLIENT_LA) \
|
||||
$(top_builddir)/mysys/libmysys.a \
|
||||
$(top_builddir)/regex/libregex.a \
|
||||
$(CLIENT_THREAD_LIBS)
|
||||
|
||||
mysql_upgrade_SOURCES= mysql_upgrade.c \
|
||||
$(top_srcdir)/mysys/my_getpagesize.c
|
||||
@ -101,6 +104,7 @@ DEFS = -DUNDEF_THREADS_HACK \
|
||||
-DDATADIR="\"$(localstatedir)\""
|
||||
|
||||
sql_src=log_event.h mysql_priv.h rpl_constants.h \
|
||||
rpl_utility.h rpl_tblmap.h rpl_tblmap.cc \
|
||||
log_event.cc my_decimal.h my_decimal.cc \
|
||||
log_event_old.h log_event_old.cc \
|
||||
rpl_record_old.h rpl_record_old.cc
|
||||
|
@ -1828,7 +1828,7 @@ static int read_and_execute(bool interactive)
|
||||
the very beginning of a text file when
|
||||
you save the file using "Unicode UTF-8" format.
|
||||
*/
|
||||
if (!line_number &&
|
||||
if (line && !line_number &&
|
||||
(uchar) line[0] == 0xEF &&
|
||||
(uchar) line[1] == 0xBB &&
|
||||
(uchar) line[2] == 0xBF)
|
||||
@ -2183,7 +2183,14 @@ static bool add_line(String &buffer,char *line,char *in_string,
|
||||
}
|
||||
else if (!*ml_comment && (!*in_string && (inchar == '#' ||
|
||||
inchar == '-' && pos[1] == '-' &&
|
||||
my_isspace(charset_info,pos[2]))))
|
||||
/*
|
||||
The third byte is either whitespace or is the
|
||||
end of the line -- which would occur only
|
||||
because of the user sending newline -- which is
|
||||
itself whitespace and should also match.
|
||||
*/
|
||||
(my_isspace(charset_info,pos[2]) ||
|
||||
!pos[2]))))
|
||||
{
|
||||
// Flush previously accepted characters
|
||||
if (out != line)
|
||||
|
@ -43,6 +43,8 @@ static DYNAMIC_STRING ds_args;
|
||||
static char *opt_password= 0;
|
||||
static my_bool tty_password= 0;
|
||||
|
||||
static char opt_tmpdir[FN_REFLEN];
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
static char *default_dbug_option= (char*) "d:t:O,/tmp/mysql_upgrade.trace";
|
||||
#endif
|
||||
@ -113,6 +115,8 @@ static struct my_option my_long_options[]=
|
||||
#endif
|
||||
{"socket", 'S', "Socket file to use for connection.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"tmpdir", 't', "Directory for temporary files",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"user", 'u', "User for login if not current user.", (uchar**) &opt_user,
|
||||
(uchar**) &opt_user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#include <sslopt-longopts.h>
|
||||
@ -239,6 +243,11 @@ get_one_option(int optid, const struct my_option *opt,
|
||||
}
|
||||
break;
|
||||
|
||||
case 't':
|
||||
strnmov(opt_tmpdir, argument, sizeof(opt_tmpdir));
|
||||
add_option= FALSE;
|
||||
break;
|
||||
|
||||
case 'b': /* --basedir */
|
||||
case 'v': /* --verbose */
|
||||
case 'd': /* --datadir */
|
||||
@ -260,6 +269,10 @@ get_one_option(int optid, const struct my_option *opt,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Run a command using the shell, storing its output in the supplied dynamic
|
||||
string.
|
||||
*/
|
||||
static int run_command(char* cmd,
|
||||
DYNAMIC_STRING *ds_res)
|
||||
{
|
||||
@ -332,37 +345,15 @@ static int run_tool(char *tool_path, DYNAMIC_STRING *ds_res, ...)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Try to get the full path to this exceutable
|
||||
|
||||
Return 0 if path found
|
||||
|
||||
/**
|
||||
Look for the filename of given tool, with the presumption that it is in the
|
||||
same directory as mysql_upgrade and that the same executable-searching
|
||||
mechanism will be used when we run our sub-shells with popen() later.
|
||||
*/
|
||||
|
||||
static my_bool get_full_path_to_executable(char* path)
|
||||
static void find_tool(char *tool_executable_name, const char *tool_name,
|
||||
const char *self_name)
|
||||
{
|
||||
my_bool ret;
|
||||
DBUG_ENTER("get_full_path_to_executable");
|
||||
#ifdef __WIN__
|
||||
ret= (GetModuleFileName(NULL, path, FN_REFLEN) == 0);
|
||||
#else
|
||||
/* my_readlink returns 0 if a symlink was read */
|
||||
ret= (my_readlink(path, "/proc/self/exe", MYF(0)) != 0);
|
||||
/* Might also want to try with /proc/$$/exe if the above fails */
|
||||
#endif
|
||||
DBUG_PRINT("exit", ("path: %s", path));
|
||||
DBUG_RETURN(ret);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Look for the tool in the same directory as mysql_upgrade.
|
||||
*/
|
||||
|
||||
static void find_tool(char *tool_path, const char *tool_name)
|
||||
{
|
||||
size_t path_len;
|
||||
char path[FN_REFLEN];
|
||||
char *last_fn_libchar;
|
||||
DYNAMIC_STRING ds_tmp;
|
||||
DBUG_ENTER("find_tool");
|
||||
DBUG_PRINT("enter", ("progname: %s", my_progname));
|
||||
@ -370,77 +361,59 @@ static void find_tool(char *tool_path, const char *tool_name)
|
||||
if (init_dynamic_string(&ds_tmp, "", 32, 32))
|
||||
die("Out of memory");
|
||||
|
||||
/* Initialize path with the full path to this program */
|
||||
if (get_full_path_to_executable(path))
|
||||
last_fn_libchar= strrchr(self_name, FN_LIBCHAR);
|
||||
|
||||
if (last_fn_libchar == NULL)
|
||||
{
|
||||
/*
|
||||
Easy way to get full executable path failed, try
|
||||
other methods
|
||||
mysql_upgrade was found by the shell searching the path. A sibling
|
||||
next to us should be found the same way.
|
||||
*/
|
||||
if (my_progname[0] == FN_LIBCHAR)
|
||||
{
|
||||
/* 1. my_progname contains full path */
|
||||
strmake(path, my_progname, FN_REFLEN);
|
||||
}
|
||||
else if (my_progname[0] == '.')
|
||||
{
|
||||
/* 2. my_progname contains relative path, prepend wd */
|
||||
char buf[FN_REFLEN];
|
||||
my_getwd(buf, FN_REFLEN, MYF(0));
|
||||
my_snprintf(path, FN_REFLEN, "%s%s", buf, my_progname);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 3. Just go for it and hope tool is in path */
|
||||
path[0]= 0;
|
||||
}
|
||||
strncpy(tool_executable_name, tool_name, FN_REFLEN);
|
||||
}
|
||||
|
||||
DBUG_PRINT("info", ("path: '%s'", path));
|
||||
|
||||
/* Chop off binary name (i.e mysql-upgrade) from path */
|
||||
dirname_part(path, path, &path_len);
|
||||
|
||||
/*
|
||||
When running in a not yet installed build and using libtool,
|
||||
the program(mysql_upgrade) will be in .libs/ and executed
|
||||
through a libtool wrapper in order to use the dynamic libraries
|
||||
from this build. The same must be done for the tools(mysql and
|
||||
mysqlcheck). Thus if path ends in .libs/, step up one directory
|
||||
and execute the tools from there
|
||||
*/
|
||||
path[max(path_len-1, 0)]= 0; /* Chop off last / */
|
||||
if (strncmp(path + dirname_length(path), ".libs", 5) == 0)
|
||||
else
|
||||
{
|
||||
DBUG_PRINT("info", ("Chopping off .libs from '%s'", path));
|
||||
int len;
|
||||
|
||||
/* Chop off .libs */
|
||||
dirname_part(path, path, &path_len);
|
||||
/*
|
||||
mysql_upgrade was run absolutely or relatively. We can find a sibling
|
||||
by replacing our name after the LIBCHAR with the new tool name.
|
||||
*/
|
||||
|
||||
/*
|
||||
When running in a not yet installed build and using libtool,
|
||||
the program(mysql_upgrade) will be in .libs/ and executed
|
||||
through a libtool wrapper in order to use the dynamic libraries
|
||||
from this build. The same must be done for the tools(mysql and
|
||||
mysqlcheck). Thus if path ends in .libs/, step up one directory
|
||||
and execute the tools from there
|
||||
*/
|
||||
if (((last_fn_libchar - 6) >= self_name) &&
|
||||
(strncmp(last_fn_libchar - 5, ".libs", 5) == 0) &&
|
||||
(*(last_fn_libchar - 6) == FN_LIBCHAR))
|
||||
{
|
||||
DBUG_PRINT("info", ("Chopping off \".libs\" from end of path"));
|
||||
last_fn_libchar -= 6;
|
||||
}
|
||||
|
||||
len= last_fn_libchar - self_name;
|
||||
|
||||
my_snprintf(tool_executable_name, FN_REFLEN, "%.*s%c%s",
|
||||
len, self_name, FN_LIBCHAR, tool_name);
|
||||
}
|
||||
|
||||
|
||||
DBUG_PRINT("info", ("path: '%s'", path));
|
||||
|
||||
/* Format name of the tool to search for */
|
||||
fn_format(tool_path, tool_name,
|
||||
path, "", MYF(MY_REPLACE_DIR));
|
||||
|
||||
verbose("Looking for '%s' in: %s", tool_name, tool_path);
|
||||
|
||||
/* Make sure the tool exists */
|
||||
if (my_access(tool_path, F_OK) != 0)
|
||||
die("Can't find '%s'", tool_path);
|
||||
verbose("Looking for '%s' as: %s", tool_name, tool_executable_name);
|
||||
|
||||
/*
|
||||
Make sure it can be executed
|
||||
*/
|
||||
if (run_tool(tool_path,
|
||||
if (run_tool(tool_executable_name,
|
||||
&ds_tmp, /* Get output from command, discard*/
|
||||
"--help",
|
||||
"2>&1",
|
||||
IF_WIN("> NUL", "> /dev/null"),
|
||||
NULL))
|
||||
die("Can't execute '%s'", tool_path);
|
||||
die("Can't execute '%s'", tool_executable_name);
|
||||
|
||||
dynstr_free(&ds_tmp);
|
||||
|
||||
@ -460,7 +433,7 @@ static int run_query(const char *query, DYNAMIC_STRING *ds_res,
|
||||
char query_file_path[FN_REFLEN];
|
||||
DBUG_ENTER("run_query");
|
||||
DBUG_PRINT("enter", ("query: %s", query));
|
||||
if ((fd= create_temp_file(query_file_path, NULL,
|
||||
if ((fd= create_temp_file(query_file_path, opt_tmpdir,
|
||||
"sql", O_CREAT | O_SHARE | O_RDWR,
|
||||
MYF(MY_WME))) < 0)
|
||||
die("Failed to create temporary file for defaults");
|
||||
@ -750,11 +723,20 @@ static const char *load_default_groups[]=
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char self_name[FN_REFLEN];
|
||||
|
||||
MY_INIT(argv[0]);
|
||||
#ifdef __NETWARE__
|
||||
setscreenmode(SCR_AUTOCLOSE_ON_EXIT);
|
||||
#endif
|
||||
|
||||
#if __WIN__
|
||||
if (GetModuleFileName(NULL, self_name, FN_REFLEN) == 0)
|
||||
#endif
|
||||
{
|
||||
strncpy(self_name, argv[0], FN_REFLEN);
|
||||
}
|
||||
|
||||
if (init_dynamic_string(&ds_args, "", 512, 256))
|
||||
die("Out of memory");
|
||||
|
||||
@ -780,10 +762,10 @@ int main(int argc, char **argv)
|
||||
dynstr_append(&ds_args, " ");
|
||||
|
||||
/* Find mysql */
|
||||
find_tool(mysql_path, IF_WIN("mysql.exe", "mysql"));
|
||||
find_tool(mysql_path, IF_WIN("mysql.exe", "mysql"), self_name);
|
||||
|
||||
/* Find mysqlcheck */
|
||||
find_tool(mysqlcheck_path, IF_WIN("mysqlcheck.exe", "mysqlcheck"));
|
||||
find_tool(mysqlcheck_path, IF_WIN("mysqlcheck.exe", "mysqlcheck"), self_name);
|
||||
|
||||
/*
|
||||
Read the mysql_upgrade_info file to check if mysql_upgrade
|
||||
|
@ -64,7 +64,8 @@ static void warning(const char *format, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||
|
||||
static bool one_database=0, to_last_remote_log= 0, disable_log_bin= 0;
|
||||
static bool opt_hexdump= 0;
|
||||
const char *base64_output_mode_names[]= {"NEVER", "AUTO", "ALWAYS", NullS};
|
||||
const char *base64_output_mode_names[]=
|
||||
{"NEVER", "AUTO", "ALWAYS", "UNSPEC", "DECODE-ROWS", NullS};
|
||||
TYPELIB base64_output_mode_typelib=
|
||||
{ array_elements(base64_output_mode_names) - 1, "",
|
||||
base64_output_mode_names, NULL };
|
||||
@ -83,6 +84,8 @@ static const char* user = 0;
|
||||
static char* pass = 0;
|
||||
static char *charset= 0;
|
||||
|
||||
static uint verbose= 0;
|
||||
|
||||
static ulonglong start_position, stop_position;
|
||||
#define start_position_mot ((my_off_t)start_position)
|
||||
#define stop_position_mot ((my_off_t)stop_position)
|
||||
@ -1063,6 +1066,9 @@ that may lead to an endless loop.",
|
||||
{"user", 'u', "Connect to the remote server as username.",
|
||||
(uchar**) &user, (uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"verbose", 'v', "Reconstruct SQL statements out of row events. "
|
||||
"-v -v adds comments on column data types",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
|
||||
0, 0, 0, 0, 0},
|
||||
{"open_files_limit", OPT_OPEN_FILES_LIMIT,
|
||||
@ -1258,6 +1264,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
||||
(find_type_or_exit(argument, &base64_output_mode_typelib, opt->name)-1);
|
||||
}
|
||||
break;
|
||||
case 'v':
|
||||
if (argument == disabled_my_option)
|
||||
verbose= 0;
|
||||
else
|
||||
verbose++;
|
||||
break;
|
||||
case 'V':
|
||||
print_version();
|
||||
exit(0);
|
||||
@ -1343,6 +1355,8 @@ static Exit_status dump_log_entries(const char* logname)
|
||||
*/
|
||||
fprintf(result_file, "DELIMITER /*!*/;\n");
|
||||
strmov(print_event_info.delimiter, "/*!*/;");
|
||||
|
||||
print_event_info.verbose= short_form ? 0 : verbose;
|
||||
|
||||
rc= (remote_opt ? dump_remote_log_entries(&print_event_info, logname) :
|
||||
dump_local_log_entries(&print_event_info, logname));
|
||||
@ -1926,7 +1940,7 @@ int main(int argc, char** argv)
|
||||
DBUG_ENTER("main");
|
||||
DBUG_PROCESS(argv[0]);
|
||||
|
||||
init_time(); // for time functions
|
||||
my_init_time(); // for time functions
|
||||
|
||||
parse_args(&argc, (char***)&argv);
|
||||
defaults_argv=argv;
|
||||
|
@ -4347,7 +4347,10 @@ static int do_flush_tables_read_lock(MYSQL *mysql_con)
|
||||
update starts between the two FLUSHes, we have that bad stall.
|
||||
*/
|
||||
return
|
||||
( mysql_query_with_error_report(mysql_con, 0, "FLUSH TABLES") ||
|
||||
( mysql_query_with_error_report(mysql_con, 0,
|
||||
((opt_master_data != 0) ?
|
||||
"FLUSH /*!40101 LOCAL */ TABLES" :
|
||||
"FLUSH TABLES")) ||
|
||||
mysql_query_with_error_report(mysql_con, 0,
|
||||
"FLUSH TABLES WITH READ LOCK") );
|
||||
}
|
||||
|
@ -48,7 +48,15 @@
|
||||
#ifdef __WIN__
|
||||
#include <direct.h>
|
||||
#endif
|
||||
#include <signal.h>
|
||||
#include <my_stacktrace.h>
|
||||
|
||||
#ifdef __WIN__
|
||||
#include <crtdbg.h>
|
||||
#define SIGNAL_FMT "exception 0x%x"
|
||||
#else
|
||||
#define SIGNAL_FMT "signal %d"
|
||||
#endif
|
||||
|
||||
/* Use cygwin for --exec and --system before 5.0 */
|
||||
#if MYSQL_VERSION_ID < 50000
|
||||
@ -167,6 +175,8 @@ static ulonglong timer_now(void);
|
||||
|
||||
static ulonglong progress_start= 0;
|
||||
|
||||
static ulong connection_retry_sleep= 100000; /* Microseconds */
|
||||
|
||||
/* Precompiled re's */
|
||||
static my_regex_t ps_re; /* the query can be run using PS protocol */
|
||||
static my_regex_t sp_re; /* the query can be run as a SP */
|
||||
@ -222,6 +232,7 @@ struct st_connection
|
||||
/* Used when creating views and sp, to avoid implicit commit */
|
||||
MYSQL* util_mysql;
|
||||
char *name;
|
||||
size_t name_len;
|
||||
MYSQL_STMT* stmt;
|
||||
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
@ -275,7 +286,8 @@ enum enum_commands {
|
||||
Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST,
|
||||
Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT, Q_SKIP,
|
||||
Q_CHMOD_FILE, Q_APPEND_FILE, Q_CAT_FILE, Q_DIFF_FILES,
|
||||
Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR,
|
||||
Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR, Q_LIST_FILES,
|
||||
Q_LIST_FILES_WRITE_FILE, Q_LIST_FILES_APPEND_FILE,
|
||||
|
||||
Q_UNKNOWN, /* Unknown command. */
|
||||
Q_COMMENT, /* Comments, ignored. */
|
||||
@ -367,6 +379,9 @@ const char *command_names[]=
|
||||
"change_user",
|
||||
"mkdir",
|
||||
"rmdir",
|
||||
"list_files",
|
||||
"list_files_write_file",
|
||||
"list_files_append_file",
|
||||
|
||||
0
|
||||
};
|
||||
@ -490,6 +505,9 @@ void replace_dynstr_append(DYNAMIC_STRING *ds, const char *val);
|
||||
void replace_dynstr_append_uint(DYNAMIC_STRING *ds, uint val);
|
||||
void dynstr_append_sorted(DYNAMIC_STRING* ds, DYNAMIC_STRING* ds_input);
|
||||
|
||||
static int match_expected_error(struct st_command *command,
|
||||
unsigned int err_errno,
|
||||
const char *err_sqlstate);
|
||||
void handle_error(struct st_command*,
|
||||
unsigned int err_errno, const char *err_error,
|
||||
const char *err_sqlstate, DYNAMIC_STRING *ds);
|
||||
@ -843,29 +861,25 @@ void check_command_args(struct st_command *command,
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
void handle_command_error(struct st_command *command, uint error)
|
||||
{
|
||||
DBUG_ENTER("handle_command_error");
|
||||
DBUG_PRINT("enter", ("error: %d", error));
|
||||
if (error != 0)
|
||||
{
|
||||
uint i;
|
||||
int i;
|
||||
|
||||
if (command->abort_on_error)
|
||||
die("command \"%.*s\" failed with error %d",
|
||||
command->first_word_len, command->query, error);
|
||||
for (i= 0; i < command->expected_errors.count; i++)
|
||||
|
||||
i= match_expected_error(command, error, NULL);
|
||||
|
||||
if (i >= 0)
|
||||
{
|
||||
DBUG_PRINT("info", ("expected error: %d",
|
||||
command->expected_errors.err[i].code.errnum));
|
||||
if ((command->expected_errors.err[i].type == ERR_ERRNO) &&
|
||||
(command->expected_errors.err[i].code.errnum == error))
|
||||
{
|
||||
DBUG_PRINT("info", ("command \"%.*s\" failed with expected error: %d",
|
||||
command->first_word_len, command->query, error));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
DBUG_PRINT("info", ("command \"%.*s\" failed with expected error: %d",
|
||||
command->first_word_len, command->query, error));
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
die("command \"%.*s\" failed with wrong error: %d",
|
||||
command->first_word_len, command->query, error);
|
||||
@ -1528,7 +1542,7 @@ int dyn_string_cmp(DYNAMIC_STRING* ds, const char *fname)
|
||||
DBUG_ENTER("dyn_string_cmp");
|
||||
DBUG_PRINT("enter", ("fname: %s", fname));
|
||||
|
||||
if ((fd= create_temp_file(temp_file_path, NULL,
|
||||
if ((fd= create_temp_file(temp_file_path, TMPDIR,
|
||||
"tmp", O_CREAT | O_SHARE | O_RDWR,
|
||||
MYF(MY_WME))) < 0)
|
||||
die("Failed to create temporary file for ds");
|
||||
@ -2486,8 +2500,8 @@ void do_exec(struct st_command *command)
|
||||
error= pclose(res_file);
|
||||
if (error > 0)
|
||||
{
|
||||
uint status= WEXITSTATUS(error), i;
|
||||
my_bool ok= 0;
|
||||
uint status= WEXITSTATUS(error);
|
||||
int i;
|
||||
|
||||
if (command->abort_on_error)
|
||||
{
|
||||
@ -2499,19 +2513,13 @@ void do_exec(struct st_command *command)
|
||||
|
||||
DBUG_PRINT("info",
|
||||
("error: %d, status: %d", error, status));
|
||||
for (i= 0; i < command->expected_errors.count; i++)
|
||||
{
|
||||
DBUG_PRINT("info", ("expected error: %d",
|
||||
command->expected_errors.err[i].code.errnum));
|
||||
if ((command->expected_errors.err[i].type == ERR_ERRNO) &&
|
||||
(command->expected_errors.err[i].code.errnum == status))
|
||||
{
|
||||
ok= 1;
|
||||
DBUG_PRINT("info", ("command \"%s\" failed with expected error: %d",
|
||||
command->first_argument, status));
|
||||
}
|
||||
}
|
||||
if (!ok)
|
||||
|
||||
i= match_expected_error(command, status, NULL);
|
||||
|
||||
if (i >= 0)
|
||||
DBUG_PRINT("info", ("command \"%s\" failed with expected error: %d",
|
||||
command->first_argument, status));
|
||||
else
|
||||
{
|
||||
dynstr_free(&ds_cmd);
|
||||
die("command \"%s\" failed with wrong error: %d",
|
||||
@ -2861,6 +2869,126 @@ void do_rmdir(struct st_command *command)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
get_list_files
|
||||
ds output
|
||||
ds_dirname dir to list
|
||||
ds_wild wild-card file pattern (can be empty)
|
||||
|
||||
DESCRIPTION
|
||||
list all entries in directory (matching ds_wild if given)
|
||||
*/
|
||||
|
||||
static int get_list_files(DYNAMIC_STRING *ds, const DYNAMIC_STRING *ds_dirname,
|
||||
const DYNAMIC_STRING *ds_wild)
|
||||
{
|
||||
uint i;
|
||||
MY_DIR *dir_info;
|
||||
FILEINFO *file;
|
||||
DBUG_ENTER("get_list_files");
|
||||
|
||||
DBUG_PRINT("info", ("listing directory: %s", ds_dirname->str));
|
||||
/* Note that my_dir sorts the list if not given any flags */
|
||||
if (!(dir_info= my_dir(ds_dirname->str, MYF(0))))
|
||||
DBUG_RETURN(1);
|
||||
for (i= 0; i < (uint) dir_info->number_off_files; i++)
|
||||
{
|
||||
file= dir_info->dir_entry + i;
|
||||
if (file->name[0] == '.' &&
|
||||
(file->name[1] == '\0' ||
|
||||
(file->name[1] == '.' && file->name[2] == '\0')))
|
||||
continue; /* . or .. */
|
||||
if (ds_wild && ds_wild->length &&
|
||||
wild_compare(file->name, ds_wild->str, 0))
|
||||
continue;
|
||||
dynstr_append(ds, file->name);
|
||||
dynstr_append(ds, "\n");
|
||||
}
|
||||
my_dirend(dir_info);
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
do_list_files
|
||||
command called command
|
||||
|
||||
DESCRIPTION
|
||||
list_files <dir_name> [<file_name>]
|
||||
List files and directories in directory <dir_name> (like `ls`)
|
||||
[Matching <file_name>, where wild-cards are allowed]
|
||||
*/
|
||||
|
||||
static void do_list_files(struct st_command *command)
|
||||
{
|
||||
int error;
|
||||
static DYNAMIC_STRING ds_dirname;
|
||||
static DYNAMIC_STRING ds_wild;
|
||||
const struct command_arg list_files_args[] = {
|
||||
{"dirname", ARG_STRING, TRUE, &ds_dirname, "Directory to list"},
|
||||
{"file", ARG_STRING, FALSE, &ds_wild, "Filename (incl. wildcard)"}
|
||||
};
|
||||
DBUG_ENTER("do_list_files");
|
||||
|
||||
check_command_args(command, command->first_argument,
|
||||
list_files_args,
|
||||
sizeof(list_files_args)/sizeof(struct command_arg), ' ');
|
||||
|
||||
error= get_list_files(&ds_res, &ds_dirname, &ds_wild);
|
||||
handle_command_error(command, error);
|
||||
dynstr_free(&ds_dirname);
|
||||
dynstr_free(&ds_wild);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
do_list_files_write_file_command
|
||||
command called command
|
||||
append append file, or create new
|
||||
|
||||
DESCRIPTION
|
||||
list_files_{write|append}_file <filename> <dir_name> [<match_file>]
|
||||
List files and directories in directory <dir_name> (like `ls`)
|
||||
[Matching <match_file>, where wild-cards are allowed]
|
||||
|
||||
Note: File will be truncated if exists and append is not true.
|
||||
*/
|
||||
|
||||
static void do_list_files_write_file_command(struct st_command *command,
|
||||
my_bool append)
|
||||
{
|
||||
int error;
|
||||
static DYNAMIC_STRING ds_content;
|
||||
static DYNAMIC_STRING ds_filename;
|
||||
static DYNAMIC_STRING ds_dirname;
|
||||
static DYNAMIC_STRING ds_wild;
|
||||
const struct command_arg list_files_args[] = {
|
||||
{"filename", ARG_STRING, TRUE, &ds_filename, "Filename for write"},
|
||||
{"dirname", ARG_STRING, TRUE, &ds_dirname, "Directory to list"},
|
||||
{"file", ARG_STRING, FALSE, &ds_wild, "Filename (incl. wildcard)"}
|
||||
};
|
||||
DBUG_ENTER("do_list_files_write_file");
|
||||
|
||||
check_command_args(command, command->first_argument,
|
||||
list_files_args,
|
||||
sizeof(list_files_args)/sizeof(struct command_arg), ' ');
|
||||
|
||||
init_dynamic_string(&ds_content, "", 1024, 1024);
|
||||
error= get_list_files(&ds_content, &ds_dirname, &ds_wild);
|
||||
handle_command_error(command, error);
|
||||
str_to_file2(ds_filename.str, ds_content.str, ds_content.length, append);
|
||||
dynstr_free(&ds_content);
|
||||
dynstr_free(&ds_filename);
|
||||
dynstr_free(&ds_dirname);
|
||||
dynstr_free(&ds_wild);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Read characters from line buffer or file. This is needed to allow
|
||||
my_ungetc() to buffer MAX_DELIMITER_LENGTH characters for a file
|
||||
@ -4191,7 +4319,6 @@ void safe_connect(MYSQL* mysql, const char *name, const char *host,
|
||||
int port, const char *sock)
|
||||
{
|
||||
int failed_attempts= 0;
|
||||
static ulong connection_retry_sleep= 100000; /* Microseconds */
|
||||
|
||||
DBUG_ENTER("safe_connect");
|
||||
while(!mysql_real_connect(mysql, host,user, pass, db, port, sock,
|
||||
@ -4258,6 +4385,7 @@ int connect_n_handle_errors(struct st_command *command,
|
||||
const char* db, int port, const char* sock)
|
||||
{
|
||||
DYNAMIC_STRING *ds;
|
||||
int failed_attempts= 0;
|
||||
|
||||
ds= &ds_res;
|
||||
|
||||
@ -4286,9 +4414,41 @@ int connect_n_handle_errors(struct st_command *command,
|
||||
dynstr_append_mem(ds, delimiter, delimiter_length);
|
||||
dynstr_append_mem(ds, "\n", 1);
|
||||
}
|
||||
if (!mysql_real_connect(con, host, user, pass, db, port, sock ? sock: 0,
|
||||
while (!mysql_real_connect(con, host, user, pass, db, port, sock ? sock: 0,
|
||||
CLIENT_MULTI_STATEMENTS))
|
||||
{
|
||||
/*
|
||||
If we have used up all our connections check whether this
|
||||
is expected (by --error). If so, handle the error right away.
|
||||
Otherwise, give it some extra time to rule out race-conditions.
|
||||
If extra-time doesn't help, we have an unexpected error and
|
||||
must abort -- just proceeding to handle_error() when second
|
||||
and third chances are used up will handle that for us.
|
||||
|
||||
There are various user-limits of which only max_user_connections
|
||||
and max_connections_per_hour apply at connect time. For the
|
||||
the second to create a race in our logic, we'd need a limits
|
||||
test that runs without a FLUSH for longer than an hour, so we'll
|
||||
stay clear of trying to work out which exact user-limit was
|
||||
exceeded.
|
||||
*/
|
||||
|
||||
if (((mysql_errno(con) == ER_TOO_MANY_USER_CONNECTIONS) ||
|
||||
(mysql_errno(con) == ER_USER_LIMIT_REACHED)) &&
|
||||
(failed_attempts++ < opt_max_connect_retries))
|
||||
{
|
||||
int i;
|
||||
|
||||
i= match_expected_error(command, mysql_errno(con), mysql_sqlstate(con));
|
||||
|
||||
if (i >= 0)
|
||||
goto do_handle_error; /* expected error, handle */
|
||||
|
||||
my_sleep(connection_retry_sleep); /* unexpected error, wait */
|
||||
continue; /* and give it 1 more chance */
|
||||
}
|
||||
|
||||
do_handle_error:
|
||||
var_set_errno(mysql_errno(con));
|
||||
handle_error(command, mysql_errno(con), mysql_error(con),
|
||||
mysql_sqlstate(con), ds);
|
||||
@ -4470,6 +4630,7 @@ void do_connect(struct st_command *command)
|
||||
ds_connection_name.str));
|
||||
if (!(con_slot->name= my_strdup(ds_connection_name.str, MYF(MY_WME))))
|
||||
die("Out of memory");
|
||||
con_slot->name_len= strlen(con_slot->name);
|
||||
cur_con= con_slot;
|
||||
|
||||
if (con_slot == next_con)
|
||||
@ -5539,6 +5700,7 @@ void init_win_path_patterns()
|
||||
const char* paths[] = { "$MYSQL_TEST_DIR",
|
||||
"$MYSQL_TMP_DIR",
|
||||
"$MYSQLTEST_VARDIR",
|
||||
"$MASTER_MYSOCK",
|
||||
"./test/" };
|
||||
int num_paths= sizeof(paths)/sizeof(char*);
|
||||
int i;
|
||||
@ -5643,8 +5805,10 @@ void fix_win_paths(const char *val, int len)
|
||||
*/
|
||||
|
||||
void append_field(DYNAMIC_STRING *ds, uint col_idx, MYSQL_FIELD* field,
|
||||
const char* val, ulonglong len, my_bool is_null)
|
||||
char* val, ulonglong len, my_bool is_null)
|
||||
{
|
||||
char null[]= "NULL";
|
||||
|
||||
if (col_idx < max_replace_column && replace_column[col_idx])
|
||||
{
|
||||
val= replace_column[col_idx];
|
||||
@ -5652,7 +5816,7 @@ void append_field(DYNAMIC_STRING *ds, uint col_idx, MYSQL_FIELD* field,
|
||||
}
|
||||
else if (is_null)
|
||||
{
|
||||
val= "NULL";
|
||||
val= null;
|
||||
len= 4;
|
||||
}
|
||||
#ifdef __WIN__
|
||||
@ -5666,9 +5830,18 @@ void append_field(DYNAMIC_STRING *ds, uint col_idx, MYSQL_FIELD* field,
|
||||
(start[1] == '-' || start[1] == '+') && start[2] == '0')
|
||||
{
|
||||
start+=2; /* Now points at first '0' */
|
||||
/* Move all chars after the first '0' one step left */
|
||||
memmove(start, start + 1, strlen(start));
|
||||
len--;
|
||||
if (field->flags & ZEROFILL_FLAG)
|
||||
{
|
||||
/* Move all chars before the first '0' one step right */
|
||||
memmove(val + 1, val, start - val);
|
||||
*val= '0';
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Move all chars after the first '0' one step left */
|
||||
memmove(start, start + 1, strlen(start));
|
||||
len--;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -5707,7 +5880,7 @@ void append_result(DYNAMIC_STRING *ds, MYSQL_RES *res)
|
||||
lengths = mysql_fetch_lengths(res);
|
||||
for (i = 0; i < num_fields; i++)
|
||||
append_field(ds, i, &fields[i],
|
||||
(const char*)row[i], lengths[i], !row[i]);
|
||||
row[i], lengths[i], !row[i]);
|
||||
if (!display_result_vertically)
|
||||
dynstr_append_mem(ds, "\n", 1);
|
||||
}
|
||||
@ -5756,7 +5929,7 @@ void append_stmt_result(DYNAMIC_STRING *ds, MYSQL_STMT *stmt,
|
||||
while (mysql_stmt_fetch(stmt) == 0)
|
||||
{
|
||||
for (i= 0; i < num_fields; i++)
|
||||
append_field(ds, i, &fields[i], (const char *) my_bind[i].buffer,
|
||||
append_field(ds, i, &fields[i], my_bind[i].buffer,
|
||||
*my_bind[i].length, *my_bind[i].is_null);
|
||||
if (!display_result_vertically)
|
||||
dynstr_append_mem(ds, "\n", 1);
|
||||
@ -6052,6 +6225,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
|
||||
|
||||
@ -6072,7 +6295,7 @@ void handle_error(struct st_command *command,
|
||||
unsigned int err_errno, const char *err_error,
|
||||
const char *err_sqlstate, DYNAMIC_STRING *ds)
|
||||
{
|
||||
uint i;
|
||||
int i;
|
||||
|
||||
DBUG_ENTER("handle_error");
|
||||
|
||||
@ -6098,34 +6321,30 @@ void handle_error(struct st_command *command,
|
||||
|
||||
DBUG_PRINT("info", ("expected_errors.count: %d",
|
||||
command->expected_errors.count));
|
||||
for (i= 0 ; (uint) i < command->expected_errors.count ; i++)
|
||||
|
||||
i= match_expected_error(command, err_errno, err_sqlstate);
|
||||
|
||||
if (i >= 0)
|
||||
{
|
||||
if (((command->expected_errors.err[i].type == ERR_ERRNO) &&
|
||||
(command->expected_errors.err[i].code.errnum == err_errno)) ||
|
||||
((command->expected_errors.err[i].type == ERR_SQLSTATE) &&
|
||||
(strncmp(command->expected_errors.err[i].code.sqlstate,
|
||||
err_sqlstate, SQLSTATE_LENGTH) == 0)))
|
||||
if (!disable_result_log)
|
||||
{
|
||||
if (!disable_result_log)
|
||||
if (command->expected_errors.count == 1)
|
||||
{
|
||||
if (command->expected_errors.count == 1)
|
||||
{
|
||||
/* Only log error if there is one possible error */
|
||||
dynstr_append_mem(ds, "ERROR ", 6);
|
||||
replace_dynstr_append(ds, err_sqlstate);
|
||||
dynstr_append_mem(ds, ": ", 2);
|
||||
replace_dynstr_append(ds, err_error);
|
||||
dynstr_append_mem(ds,"\n",1);
|
||||
}
|
||||
/* Don't log error if we may not get an error */
|
||||
else if (command->expected_errors.err[0].type == ERR_SQLSTATE ||
|
||||
(command->expected_errors.err[0].type == ERR_ERRNO &&
|
||||
command->expected_errors.err[0].code.errnum != 0))
|
||||
dynstr_append(ds,"Got one of the listed errors\n");
|
||||
/* Only log error if there is one possible error */
|
||||
dynstr_append_mem(ds, "ERROR ", 6);
|
||||
replace_dynstr_append(ds, err_sqlstate);
|
||||
dynstr_append_mem(ds, ": ", 2);
|
||||
replace_dynstr_append(ds, err_error);
|
||||
dynstr_append_mem(ds,"\n",1);
|
||||
}
|
||||
/* OK */
|
||||
DBUG_VOID_RETURN;
|
||||
/* Don't log error if we may not get an error */
|
||||
else if (command->expected_errors.err[0].type == ERR_SQLSTATE ||
|
||||
(command->expected_errors.err[0].type == ERR_ERRNO &&
|
||||
command->expected_errors.err[0].code.errnum != 0))
|
||||
dynstr_append(ds,"Got one of the listed errors\n");
|
||||
}
|
||||
/* OK */
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
DBUG_PRINT("info",("i: %d expected_errors: %d", i,
|
||||
@ -6140,7 +6359,7 @@ void handle_error(struct st_command *command,
|
||||
dynstr_append_mem(ds, "\n", 1);
|
||||
}
|
||||
|
||||
if (i)
|
||||
if (command->expected_errors.count > 0)
|
||||
{
|
||||
if (command->expected_errors.err[0].type == ERR_ERRNO)
|
||||
die("query '%s' failed with wrong errno %d: '%s', instead of %d...",
|
||||
@ -6875,6 +7094,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)
|
||||
{
|
||||
@ -6888,6 +7205,8 @@ int main(int argc, char **argv)
|
||||
save_file[0]= 0;
|
||||
TMPDIR[0]= 0;
|
||||
|
||||
init_signal_handling();
|
||||
|
||||
/* Init expected errors */
|
||||
memset(&saved_expected_errors, 0, sizeof(saved_expected_errors));
|
||||
|
||||
@ -7074,6 +7393,13 @@ int main(int argc, char **argv)
|
||||
case Q_REMOVE_FILE: do_remove_file(command); break;
|
||||
case Q_MKDIR: do_mkdir(command); break;
|
||||
case Q_RMDIR: do_rmdir(command); break;
|
||||
case Q_LIST_FILES: do_list_files(command); break;
|
||||
case Q_LIST_FILES_WRITE_FILE:
|
||||
do_list_files_write_file_command(command, FALSE);
|
||||
break;
|
||||
case Q_LIST_FILES_APPEND_FILE:
|
||||
do_list_files_write_file_command(command, TRUE);
|
||||
break;
|
||||
case Q_FILE_EXIST: do_file_exist(command); break;
|
||||
case Q_WRITE_FILE: do_write_file(command); break;
|
||||
case Q_APPEND_FILE: do_append_file(command); break;
|
||||
@ -8143,8 +8469,6 @@ uint replace_len(char * str)
|
||||
uint len=0;
|
||||
while (*str)
|
||||
{
|
||||
if (str[0] == '\\' && str[1])
|
||||
str++;
|
||||
str++;
|
||||
len++;
|
||||
}
|
||||
@ -8157,7 +8481,6 @@ REPLACE *init_replace(char * *from, char * *to,uint count,
|
||||
char * word_end_chars)
|
||||
{
|
||||
static const int SPACE_CHAR= 256;
|
||||
static const int START_OF_LINE= 257;
|
||||
static const int END_OF_LINE= 258;
|
||||
|
||||
uint i,j,states,set_nr,len,result_len,max_length,found_end,bits_set,bit_nr;
|
||||
@ -8243,35 +8566,7 @@ REPLACE *init_replace(char * *from, char * *to,uint count,
|
||||
}
|
||||
for (pos=from[i], len=0; *pos ; pos++)
|
||||
{
|
||||
if (*pos == '\\' && *(pos+1))
|
||||
{
|
||||
pos++;
|
||||
switch (*pos) {
|
||||
case 'b':
|
||||
follow_ptr->chr = SPACE_CHAR;
|
||||
break;
|
||||
case '^':
|
||||
follow_ptr->chr = START_OF_LINE;
|
||||
break;
|
||||
case '$':
|
||||
follow_ptr->chr = END_OF_LINE;
|
||||
break;
|
||||
case 'r':
|
||||
follow_ptr->chr = '\r';
|
||||
break;
|
||||
case 't':
|
||||
follow_ptr->chr = '\t';
|
||||
break;
|
||||
case 'v':
|
||||
follow_ptr->chr = '\v';
|
||||
break;
|
||||
default:
|
||||
follow_ptr->chr = (uchar) *pos;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
follow_ptr->chr= (uchar) *pos;
|
||||
follow_ptr->chr= (uchar) *pos;
|
||||
follow_ptr->table_offset=i;
|
||||
follow_ptr->len= ++len;
|
||||
follow_ptr++;
|
||||
|
@ -343,8 +343,8 @@ case $default_charset in
|
||||
default_charset_default_collation="ucs2_general_ci"
|
||||
define(UCSC1, ucs2_general_ci ucs2_bin)
|
||||
define(UCSC2, ucs2_czech_ci ucs2_danish_ci)
|
||||
define(UCSC3, ucs2_esperanto_ci ucs2_estonian_ci ucs2_icelandic_ci)
|
||||
define(UCSC4, ucs2_latvian_ci ucs2_lithuanian_ci)
|
||||
define(UCSC3, ucs2_esperanto_ci ucs2_estonian_ci ucs2_hungarian_ci)
|
||||
define(UCSC4, ucs2_icelandic_ci ucs2_latvian_ci ucs2_lithuanian_ci)
|
||||
define(UCSC5, ucs2_persian_ci ucs2_polish_ci ucs2_romanian_ci)
|
||||
define(UCSC6, ucs2_slovak_ci ucs2_slovenian_ci)
|
||||
define(UCSC7, ucs2_spanish2_ci ucs2_spanish_ci)
|
||||
@ -367,8 +367,8 @@ case $default_charset in
|
||||
else
|
||||
define(UTFC1, utf8_general_ci utf8_bin)
|
||||
define(UTFC2, utf8_czech_ci utf8_danish_ci)
|
||||
define(UTFC3, utf8_esperanto_ci utf8_estonian_ci utf8_icelandic_ci)
|
||||
define(UTFC4, utf8_latvian_ci utf8_lithuanian_ci)
|
||||
define(UTFC3, utf8_esperanto_ci utf8_estonian_ci utf8_hungarian_ci)
|
||||
define(UTFC4, utf8_icelandic_ci utf8_latvian_ci utf8_lithuanian_ci)
|
||||
define(UTFC5, utf8_persian_ci utf8_polish_ci utf8_romanian_ci)
|
||||
define(UTFC6, utf8_slovak_ci utf8_slovenian_ci)
|
||||
define(UTFC7, utf8_spanish2_ci utf8_spanish_ci)
|
||||
|
61
configure.in
61
configure.in
@ -10,7 +10,7 @@ AC_CANONICAL_SYSTEM
|
||||
#
|
||||
# When changing major version number please also check switch statement
|
||||
# in mysqlbinlog::check_master_version().
|
||||
AM_INIT_AUTOMAKE(mysql, 5.1.25-maria-alpha)
|
||||
AM_INIT_AUTOMAKE(mysql, 5.1.30-maria-alpha)
|
||||
AM_CONFIG_HEADER([include/config.h:config.h.in])
|
||||
|
||||
PROTOCOL_VERSION=10
|
||||
@ -417,6 +417,7 @@ AC_PATH_PROG(SED, sed, sed)
|
||||
AC_PATH_PROG(CMP, cmp, cmp)
|
||||
AC_PATH_PROG(CHMOD, chmod, chmod)
|
||||
AC_PATH_PROG(HOSTNAME, hostname, hostname)
|
||||
AC_PATH_PROG(DIFF, diff, diff)
|
||||
# Check for a GNU tar named 'gtar', or 'gnutar' (MacOS X) and
|
||||
# fall back to 'tar' otherwise and hope that it's a GNU tar as well
|
||||
AC_CHECK_PROGS(TAR, gnutar gtar tar)
|
||||
@ -441,25 +442,16 @@ AC_SUBST(HOSTNAME)
|
||||
AC_SUBST(PERL)
|
||||
AC_SUBST(PERL5)
|
||||
|
||||
# icheck, used for ABI check
|
||||
AC_PATH_PROG(ICHECK, icheck, no)
|
||||
# "icheck" is also the name of a file system check program on Tru64.
|
||||
# Verify the program found is really the interface checker.
|
||||
if test "x$ICHECK" != "xno"
|
||||
# Enable the abi_check rule only if gcc is available
|
||||
|
||||
if expr "$CC" : ".*gcc.*"
|
||||
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
|
||||
ABI_CHECK="abi_check"
|
||||
else
|
||||
ABI_CHECK=""
|
||||
fi
|
||||
AC_SUBST(ICHECK)
|
||||
|
||||
AC_SUBST(ABI_CHECK)
|
||||
|
||||
# Lock for PS
|
||||
AC_PATH_PROG(PS, ps, ps)
|
||||
@ -615,19 +607,19 @@ fi
|
||||
AC_MSG_CHECKING(whether features provided by the user community should be included.)
|
||||
AC_ARG_ENABLE(community-features,
|
||||
AC_HELP_STRING(
|
||||
[--enable-community-features],
|
||||
[Enable additional features provided by the user community.]),
|
||||
[--disable-community-features],
|
||||
[Disable additional features provided by the user community.]),
|
||||
[ ENABLE_COMMUNITY_FEATURES=$enableval ],
|
||||
[ ENABLE_COMMUNITY_FEATURES=no ]
|
||||
[ ENABLE_COMMUNITY_FEATURES=yes ]
|
||||
)
|
||||
|
||||
if test "$ENABLE_COMMUNITY_FEATURES" = "yes"
|
||||
then
|
||||
AC_DEFINE([COMMUNITY_SERVER], [1],
|
||||
[Whether features provided by the user community should be included])
|
||||
AC_MSG_RESULT([yes, community server])
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no, enterprise server])
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
|
||||
AC_ARG_WITH(server-suffix,
|
||||
@ -2341,10 +2333,31 @@ then
|
||||
fi
|
||||
AC_MSG_RESULT("$netinet_inc")
|
||||
|
||||
AC_CACHE_CHECK([support for weak symbols], mysql_cv_weak_symbol,
|
||||
[AC_TRY_LINK([],[
|
||||
extern void __attribute__((weak)) foo(void);
|
||||
], [mysql_cv_weak_symbol=yes], [mysql_cv_weak_symbol=no])])
|
||||
|
||||
if test "x$mysql_cv_weak_symbol" = xyes; then
|
||||
AC_DEFINE(HAVE_WEAK_SYMBOL, 1,
|
||||
[Define to 1 if compiler supports weak symbol attribute.])
|
||||
fi
|
||||
|
||||
AC_CACHE_CHECK([whether __bss_start is defined], mysql_cv_bss_start,
|
||||
[AC_TRY_LINK([],[
|
||||
extern char *__bss_start;
|
||||
return __bss_start ? 1 : 0;
|
||||
], [mysql_cv_bss_start=yes], [mysql_cv_bss_start=no])])
|
||||
|
||||
if test "x$mysql_cv_bss_start" = xyes; then
|
||||
AC_DEFINE(HAVE_BSS_START, 1,
|
||||
[Define to 1 if compiler defines __bss_start.])
|
||||
fi
|
||||
|
||||
AC_LANG_SAVE
|
||||
AC_LANG_CPLUSPLUS
|
||||
AC_CHECK_HEADERS(cxxabi.h)
|
||||
AC_CACHE_CHECK([checking for abi::__cxa_demangle], mysql_cv_cxa_demangle,
|
||||
AC_CACHE_CHECK([for abi::__cxa_demangle], mysql_cv_cxa_demangle,
|
||||
[AC_TRY_LINK([#include <cxxabi.h>], [
|
||||
char *foo= 0; int bar= 0;
|
||||
foo= abi::__cxa_demangle(foo, foo, 0, &bar);
|
||||
|
@ -533,7 +533,7 @@ int DbugParse(CODE_STATE *cs, const char *control)
|
||||
}
|
||||
|
||||
end= DbugStrTok(control);
|
||||
while (1)
|
||||
while (control < end)
|
||||
{
|
||||
int c, sign= (*control == '+') ? 1 : (*control == '-') ? -1 : 0;
|
||||
if (sign) control++;
|
||||
|
@ -1,6 +1,5 @@
|
||||
SUBDIRS = taocrypt src testsuite
|
||||
EXTRA_DIST = yassl.dsp yassl.dsw yassl.vcproj \
|
||||
CMakeLists.txt
|
||||
EXTRA_DIST = CMakeLists.txt
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -1,5 +1,5 @@
|
||||
SUBDIRS = src test benchmark
|
||||
EXTRA_DIST = taocrypt.dsw taocrypt.dsp taocrypt.vcproj CMakeLists.txt $(wildcard mySTL/*.hpp)
|
||||
EXTRA_DIST = CMakeLists.txt $(wildcard mySTL/*.hpp)
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -1,268 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="taocrypt"
|
||||
SccProjectName=""
|
||||
SccLocalPath="">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\debug_obj"
|
||||
IntermediateDirectory=".\debug_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,mySTL"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
||||
ExceptionHandling="FALSE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\debug_obj/taocrypt.pch"
|
||||
AssemblerListingLocation=".\debug_obj/"
|
||||
ObjectFile=".\debug_obj/"
|
||||
ProgramDataBaseFileName=".\debug_obj/"
|
||||
BrowseInformation="1"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\debug_obj\taocrypt.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\release_obj"
|
||||
IntermediateDirectory=".\release_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,mySTL"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\release_obj/taocrypt.pch"
|
||||
AssemblerListingLocation=".\release_obj/"
|
||||
ObjectFile=".\release_obj/"
|
||||
ProgramDataBaseFileName=".\release_obj/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\release_obj\taocrypt.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="src\aes.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\aestables.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\algebra.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\arc4.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\asn.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\coding.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\des.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\dh.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\dsa.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\file.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\hash.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\integer.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\md2.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\md4.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\md5.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\misc.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\random.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\ripemd.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\rsa.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\sha.cpp">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="include\aes.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\algebra.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\arc4.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\asn.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\block.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\coding.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\des.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\dh.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\dsa.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\error.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\file.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\hash.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\hmac.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\integer.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\md2.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\md4.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\md5.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\misc.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\modarith.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\modes.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\random.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\ripemd.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\rsa.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\sha.hpp">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
@ -1,211 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="yassl"
|
||||
SccProjectName=""
|
||||
SccLocalPath="">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\debug_obj"
|
||||
IntermediateDirectory=".\debug_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,taocrypt\include,taocrypt\mySTL"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;YASSL_PREFIX"
|
||||
ExceptionHandling="FALSE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\debug_obj/yassl.pch"
|
||||
AssemblerListingLocation=".\debug_obj/"
|
||||
ObjectFile=".\debug_obj/"
|
||||
ProgramDataBaseFileName=".\debug_obj/"
|
||||
BrowseInformation="1"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\debug_obj\yassl.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\release_obj"
|
||||
IntermediateDirectory=".\release_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,taocrypt\include,taocrypt\mySTL"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;YASSL_PREFIX"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\release_obj/yassl.pch"
|
||||
AssemblerListingLocation=".\release_obj/"
|
||||
ObjectFile=".\release_obj/"
|
||||
ProgramDataBaseFileName=".\release_obj/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\release_obj\yassl.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="src\buffer.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\cert_wrapper.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\crypto_wrapper.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\handshake.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\lock.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\log.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\socket_wrapper.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\ssl.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\timer.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\yassl_error.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\yassl_imp.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\yassl_int.cpp">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="include\buffer.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\cert_wrapper.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\crypto_wrapper.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\factory.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\handshake.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\lock.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\log.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\socket_wrapper.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\timer.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_error.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_imp.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_int.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_types.hpp">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
@ -36,13 +36,13 @@ noinst_HEADERS = config-win.h config-netware.h lf.h my_bit.h \
|
||||
mysql_version.h.in my_handler.h my_time.h \
|
||||
my_vle.h my_user.h my_atomic.h atomic/nolock.h \
|
||||
atomic/rwlock.h atomic/x86-gcc.h atomic/generic-msvc.h \
|
||||
atomic/gcc_builtins.h my_libwrap.h wqueue.h \
|
||||
waiting_threads.h
|
||||
atomic/gcc_builtins.h my_libwrap.h my_stacktrace.h \
|
||||
wqueue.h waiting_threads.h
|
||||
EXTRA_DIST = mysql.h.pp mysql/plugin.h.pp
|
||||
|
||||
# Remove built files and the symlinked directories
|
||||
CLEANFILES = $(BUILT_SOURCES) readline openssl
|
||||
|
||||
EXTRA_DIST = mysql_h.ic
|
||||
|
||||
# Some include files that may be moved and patched by configure
|
||||
DISTCLEANFILES = sched.h $(CLEANFILES)
|
||||
@ -64,18 +64,5 @@ my_config.h: config.h
|
||||
dist-hook:
|
||||
$(RM) -f $(distdir)/mysql_version.h $(distdir)/my_config.h
|
||||
|
||||
#
|
||||
# Rules for checking that ABI has not changed
|
||||
#
|
||||
|
||||
# Create a icheck file and compare it to the reference
|
||||
abi_check: $(HEADERS_ABI) mysql_version.h mysql_h.ic
|
||||
@set -ex; \
|
||||
if [ @ICHECK@ != no ] ; then \
|
||||
@ICHECK@ --canonify --skip-from-re /usr/ -o $@ $(HEADERS_ABI); \
|
||||
@ICHECK@ --compare mysql_h.ic $@; \
|
||||
fi; \
|
||||
touch abi_check;
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -96,6 +96,7 @@ extern const char *client_errors[]; /* Error messages */
|
||||
#define CR_NOT_IMPLEMENTED 2054
|
||||
#define CR_SERVER_LOST_EXTENDED 2055
|
||||
#define CR_STMT_CLOSED 2056
|
||||
#define CR_ERROR_LAST /*Copy last error nr:*/ 2056
|
||||
#define CR_NEW_STMT_METADATA 2057
|
||||
#define CR_ERROR_LAST /*Copy last error nr:*/ 2057
|
||||
/* Add error numbers before CR_ERROR_LAST and change it accordingly. */
|
||||
|
||||
|
@ -39,12 +39,12 @@ typedef struct st_mem_root
|
||||
/* if block have less memory it will be put in 'used' list */
|
||||
size_t min_malloc;
|
||||
size_t block_size; /* initial block size */
|
||||
unsigned long block_num; /* allocated blocks counter */
|
||||
unsigned int block_num; /* allocated blocks counter */
|
||||
/*
|
||||
first free block in queue test counter (if it exceed
|
||||
MAX_BLOCK_USAGE_BEFORE_DROP block will be dropped in 'used' list)
|
||||
*/
|
||||
unsigned long first_block_usage;
|
||||
unsigned int first_block_usage;
|
||||
|
||||
void (*error_handler)(void);
|
||||
} MEM_ROOT;
|
||||
|
@ -45,6 +45,7 @@ extern "C" {
|
||||
|
||||
#define HA_MAX_POSSIBLE_KEY_BUFF (HA_MAX_KEY_LENGTH + 24+ 6+6)
|
||||
#define HA_MAX_KEY_BUFF (HA_MAX_KEY_LENGTH+HA_MAX_KEY_SEG*6+8+8)
|
||||
#define HA_MAX_MSG_BUF 1024 /* used in CHECK TABLE, REPAIR TABLE */
|
||||
|
||||
typedef struct st_HA_KEYSEG /* Key-portion */
|
||||
{
|
||||
|
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_ */
|
@ -94,6 +94,9 @@ extern int NEAR my_errno; /* Last error in mysys */
|
||||
#define ME_COLOUR3 ((3 << ME_HIGHBYTE))
|
||||
#define ME_JUST_INFO 1024 /**< not error but just info */
|
||||
#define ME_JUST_WARNING 2048 /**< not error but just warning */
|
||||
#define ME_FATALERROR 4096 /* Fatal statement error */
|
||||
#define ME_NO_WARNING_FOR_ERROR 8192 /* Don't push a warning for error */
|
||||
#define ME_NO_SP_HANDLER 16384 /* Don't call stored routine error handlers */
|
||||
|
||||
/* Bits in last argument to fn_format */
|
||||
#define MY_REPLACE_DIR 1 /* replace dir in name with 'dir' */
|
||||
@ -251,7 +254,7 @@ extern int NEAR my_umask, /* Default creation mask */
|
||||
NEAR my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
|
||||
NEAR my_dont_interrupt; /* call remember_intr when set */
|
||||
extern my_bool NEAR mysys_uses_curses, my_use_symdir;
|
||||
extern ulong sf_malloc_cur_memory, sf_malloc_max_memory;
|
||||
extern size_t sf_malloc_cur_memory, sf_malloc_max_memory;
|
||||
|
||||
extern ulong my_default_record_cache_size;
|
||||
extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io,
|
||||
@ -589,6 +592,7 @@ extern int my_close(File Filedes,myf MyFlags);
|
||||
extern File my_dup(File file, myf MyFlags);
|
||||
extern int my_mkdir(const char *dir, int Flags, myf MyFlags);
|
||||
extern int my_readlink(char *to, const char *filename, myf MyFlags);
|
||||
extern int my_is_symlink(const char *filename);
|
||||
extern int my_realpath(char *to, const char *filename, myf MyFlags);
|
||||
extern File my_create_with_symlink(const char *linkname, const char *filename,
|
||||
int createflags, int access_flags,
|
||||
@ -708,6 +712,7 @@ extern char * fn_format(char * to,const char *name,const char *dir,
|
||||
const char *form, uint flag);
|
||||
extern size_t strlength(const char *str);
|
||||
extern void pack_dirname(char * to,const char *from);
|
||||
extern size_t normalize_dirname(char * to, const char *from);
|
||||
extern size_t unpack_dirname(char * to,const char *from);
|
||||
extern size_t cleanup_dirname(char * to,const char *from);
|
||||
extern size_t system_filename(char * to,const char *from);
|
||||
|
@ -95,7 +95,7 @@ long calc_daynr(uint year,uint month,uint day);
|
||||
uint calc_days_in_year(uint year);
|
||||
uint year_2000_handling(uint year);
|
||||
|
||||
void init_time(void);
|
||||
void my_init_time(void);
|
||||
|
||||
|
||||
/*
|
||||
|
@ -46,7 +46,6 @@ extern "C" {
|
||||
|
||||
#define MI_MAX_POSSIBLE_KEY_BUFF HA_MAX_POSSIBLE_KEY_BUFF
|
||||
|
||||
#define MI_MAX_MSG_BUF 1024 /* used in CHECK TABLE, REPAIR TABLE */
|
||||
#define MI_NAME_IEXT ".MYI"
|
||||
#define MI_NAME_DEXT ".MYD"
|
||||
/* Max extra space to use when sorting keys */
|
||||
@ -249,6 +248,10 @@ extern my_bool myisam_flush,myisam_delay_key_write,myisam_single_user;
|
||||
extern my_off_t myisam_max_temp_length;
|
||||
extern ulong myisam_bulk_insert_tree_size, myisam_data_pointer_size;
|
||||
|
||||
/* usually used to check if a symlink points into the mysql data home */
|
||||
/* which is normally forbidden */
|
||||
extern int (*myisam_test_invalid_symlink)(const char *filename);
|
||||
|
||||
/* Prototypes for myisam-functions */
|
||||
|
||||
extern int mi_close(struct st_myisam_info *file);
|
||||
|
@ -112,6 +112,7 @@ extern int myrg_reset(MYRG_INFO *info);
|
||||
extern void myrg_extrafunc(MYRG_INFO *info,invalidator_by_filename inv);
|
||||
extern ha_rows myrg_records_in_range(MYRG_INFO *info, int inx,
|
||||
key_range *min_key, key_range *max_key);
|
||||
extern ha_rows myrg_records(MYRG_INFO *info);
|
||||
|
||||
extern ulonglong myrg_position(MYRG_INFO *info);
|
||||
#ifdef __cplusplus
|
||||
|
671
include/mysql.h.pp
Normal file
671
include/mysql.h.pp
Normal file
@ -0,0 +1,671 @@
|
||||
#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 my_rnd_struct;
|
||||
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 create_random_string(char *to, unsigned int length,
|
||||
struct my_rnd_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;
|
||||
size_t left;
|
||||
size_t 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);
|
140
include/mysql/plugin.h.pp
Normal file
140
include/mysql/plugin.h.pp
Normal file
@ -0,0 +1,140 @@
|
||||
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);
|
||||
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);
|
||||
const char *set_thd_proc_info(void*, const char * info, const char *func,
|
||||
const char *file, const unsigned int line);
|
||||
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);
|
@ -184,19 +184,38 @@ enum enum_server_command
|
||||
#define SERVER_MORE_RESULTS_EXISTS 8 /* Multi query - next query exists */
|
||||
#define SERVER_QUERY_NO_GOOD_INDEX_USED 16
|
||||
#define SERVER_QUERY_NO_INDEX_USED 32
|
||||
/*
|
||||
/**
|
||||
The server was able to fulfill the clients request and opened a
|
||||
read-only non-scrollable cursor for a query. This flag comes
|
||||
in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands.
|
||||
*/
|
||||
#define SERVER_STATUS_CURSOR_EXISTS 64
|
||||
/*
|
||||
/**
|
||||
This flag is sent when a read-only cursor is exhausted, in reply to
|
||||
COM_STMT_FETCH command.
|
||||
*/
|
||||
#define SERVER_STATUS_LAST_ROW_SENT 128
|
||||
#define SERVER_STATUS_DB_DROPPED 256 /* A database was dropped */
|
||||
#define SERVER_STATUS_NO_BACKSLASH_ESCAPES 512
|
||||
/**
|
||||
Sent to the client if after a prepared statement reprepare
|
||||
we discovered that the new statement returns a different
|
||||
number of result set columns.
|
||||
*/
|
||||
#define SERVER_STATUS_METADATA_CHANGED 1024
|
||||
|
||||
/**
|
||||
Server status flags that must be cleared when starting
|
||||
execution of a new SQL statement.
|
||||
Flags from this set are only added to the
|
||||
current server status by the execution engine, but
|
||||
never removed -- the execution engine expects them
|
||||
to disappear automagically by the next command.
|
||||
*/
|
||||
#define SERVER_STATUS_CLEAR_SET (SERVER_QUERY_NO_GOOD_INDEX_USED| \
|
||||
SERVER_QUERY_NO_INDEX_USED|\
|
||||
SERVER_MORE_RESULTS_EXISTS|\
|
||||
SERVER_STATUS_METADATA_CHANGED)
|
||||
|
||||
#define MYSQL_ERRMSG_SIZE 512
|
||||
#define NET_READ_TIMEOUT 30 /* Timeout on read */
|
||||
@ -205,6 +224,7 @@ enum enum_server_command
|
||||
|
||||
#define ONLY_KILL_QUERY 1
|
||||
|
||||
|
||||
struct st_vio; /* Only C */
|
||||
typedef struct st_vio Vio;
|
||||
|
||||
|
1166
include/mysql_h.ic
1166
include/mysql_h.ic
File diff suppressed because it is too large
Load Diff
@ -89,9 +89,20 @@ BOOL APIENTRY LibMain(HANDLE hInst,DWORD ul_reason_being_called,
|
||||
UNREFERENCED_PARAMETER(lpReserved);
|
||||
} /* LibMain */
|
||||
|
||||
|
||||
static BOOL do_libmain;
|
||||
int __stdcall DllMain(HANDLE hInst,DWORD ul_reason_being_called,LPVOID lpReserved)
|
||||
{
|
||||
return LibMain(hInst,ul_reason_being_called,lpReserved);
|
||||
/*
|
||||
Unless environment variable LIBMYSQL_DLLINIT is set, do nothing.
|
||||
The environment variable is checked once, during the first call to DllMain()
|
||||
(in DLL_PROCESS_ATTACH hook).
|
||||
*/
|
||||
if (ul_reason_being_called == DLL_PROCESS_ATTACH)
|
||||
do_libmain = (getenv("LIBMYSQL_DLLINIT") != NULL);
|
||||
if (do_libmain)
|
||||
return LibMain(hInst,ul_reason_being_called,lpReserved);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#elif defined(WINDOWS)
|
||||
|
@ -84,6 +84,7 @@ const char *client_errors[]=
|
||||
"This feature is not implemented yet",
|
||||
"Lost connection to MySQL server at '%s', system error: %d",
|
||||
"Statement closed indirectly because of a preceeding %s() call",
|
||||
"The number of columns in the result set differs from the number of bound buffers. You must reset the statement, rebind the result set columns, and execute the statement again",
|
||||
""
|
||||
};
|
||||
|
||||
@ -149,6 +150,7 @@ const char *client_errors[]=
|
||||
"This feature is not implemented yet",
|
||||
"Lost connection to MySQL server at '%s', system error: %d",
|
||||
"Statement closed indirectly because of a preceeding %s() call",
|
||||
"The number of columns in the result set differs from the number of bound buffers. You must reset the statement, rebind the result set columns, and execute the statement again",
|
||||
""
|
||||
};
|
||||
|
||||
@ -212,6 +214,7 @@ const char *client_errors[]=
|
||||
"This feature is not implemented yet",
|
||||
"Lost connection to MySQL server at '%s', system error: %d",
|
||||
"Statement closed indirectly because of a preceeding %s() call",
|
||||
"The number of columns in the result set differs from the number of bound buffers. You must reset the statement, rebind the result set columns, and execute the statement again",
|
||||
""
|
||||
};
|
||||
#endif
|
||||
|
@ -1706,6 +1706,7 @@ static my_bool setup_one_fetch_function(MYSQL_BIND *, MYSQL_FIELD *field);
|
||||
#define RESET_SERVER_SIDE 1
|
||||
#define RESET_LONG_DATA 2
|
||||
#define RESET_STORE_RESULT 4
|
||||
#define RESET_CLEAR_ERROR 8
|
||||
|
||||
static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags);
|
||||
|
||||
@ -2090,7 +2091,7 @@ mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, ulong length)
|
||||
To be removed when all commands will fully support prepared mode.
|
||||
*/
|
||||
|
||||
static unsigned int alloc_stmt_fields(MYSQL_STMT *stmt)
|
||||
static void alloc_stmt_fields(MYSQL_STMT *stmt)
|
||||
{
|
||||
MYSQL_FIELD *fields, *field, *end;
|
||||
MEM_ROOT *alloc= &stmt->mem_root;
|
||||
@ -2108,7 +2109,10 @@ static unsigned int alloc_stmt_fields(MYSQL_STMT *stmt)
|
||||
!(stmt->bind= (MYSQL_BIND *) alloc_root(alloc,
|
||||
sizeof(MYSQL_BIND) *
|
||||
stmt->field_count)))
|
||||
return 0;
|
||||
{
|
||||
set_stmt_error(stmt, CR_OUT_OF_MEMORY, unknown_sqlstate, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
for (fields= mysql->fields, end= fields+stmt->field_count,
|
||||
field= stmt->fields;
|
||||
@ -2127,13 +2131,15 @@ static unsigned int alloc_stmt_fields(MYSQL_STMT *stmt)
|
||||
field->def = fields->def ? strdup_root(alloc,fields->def): 0;
|
||||
field->max_length= 0;
|
||||
}
|
||||
return stmt->field_count;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
/**
|
||||
Update result set columns metadata if it was sent again in
|
||||
reply to COM_STMT_EXECUTE.
|
||||
|
||||
@note If the new field count is different from the original one,
|
||||
an error is set and no update is performed.
|
||||
*/
|
||||
|
||||
static void update_stmt_fields(MYSQL_STMT *stmt)
|
||||
@ -2143,7 +2149,22 @@ static void update_stmt_fields(MYSQL_STMT *stmt)
|
||||
MYSQL_FIELD *stmt_field= stmt->fields;
|
||||
MYSQL_BIND *my_bind= stmt->bind_result_done ? stmt->bind : 0;
|
||||
|
||||
DBUG_ASSERT(stmt->field_count == stmt->mysql->field_count);
|
||||
if (stmt->field_count != stmt->mysql->field_count)
|
||||
{
|
||||
/*
|
||||
The tables used in the statement were altered,
|
||||
and the query now returns a different number of columns.
|
||||
There is no way to continue without reallocating the bind
|
||||
array:
|
||||
- if the number of columns increased, mysql_stmt_fetch()
|
||||
will write beyond allocated memory
|
||||
- if the number of columns decreased, some user-bound
|
||||
buffers will be left unassigned without user knowing
|
||||
that.
|
||||
*/
|
||||
set_stmt_error(stmt, CR_NEW_STMT_METADATA, unknown_sqlstate, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
for (; field < field_end; ++field, ++stmt_field)
|
||||
{
|
||||
@ -2792,6 +2813,50 @@ my_bool STDCALL mysql_stmt_attr_get(MYSQL_STMT *stmt,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Update statement result set metadata from with the new field
|
||||
information sent during statement execute.
|
||||
|
||||
@pre mysql->field_count is not zero
|
||||
|
||||
@retval TRUE if error: out of memory or the new
|
||||
result set has a different number of columns
|
||||
@retval FALSE success
|
||||
*/
|
||||
|
||||
static void reinit_result_set_metadata(MYSQL_STMT *stmt)
|
||||
{
|
||||
/* Server has sent result set metadata */
|
||||
if (stmt->field_count == 0)
|
||||
{
|
||||
/*
|
||||
This is 'SHOW'/'EXPLAIN'-like query. Current implementation of
|
||||
prepared statements can't send result set metadata for these queries
|
||||
on prepare stage. Read it now.
|
||||
*/
|
||||
alloc_stmt_fields(stmt);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Update result set metadata if it for some reason changed between
|
||||
prepare and execute, i.e.:
|
||||
- in case of 'SELECT ?' we don't know column type unless data was
|
||||
supplied to mysql_stmt_execute, so updated column type is sent
|
||||
now.
|
||||
- if data dictionary changed between prepare and execute, for
|
||||
example a table used in the query was altered.
|
||||
Note, that now (4.1.3) we always send metadata in reply to
|
||||
COM_STMT_EXECUTE (even if it is not necessary), so either this or
|
||||
previous branch always works.
|
||||
TODO: send metadata only when it's really necessary and add a warning
|
||||
'Metadata changed' when it's sent twice.
|
||||
*/
|
||||
update_stmt_fields(stmt);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Send placeholders data to server (if there are placeholders)
|
||||
and execute prepared statement.
|
||||
@ -2847,7 +2912,7 @@ int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt)
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
if (reset_stmt_handle(stmt, RESET_STORE_RESULT))
|
||||
if (reset_stmt_handle(stmt, RESET_STORE_RESULT | RESET_CLEAR_ERROR))
|
||||
DBUG_RETURN(1);
|
||||
/*
|
||||
No need to check for stmt->state: if the statement wasn't
|
||||
@ -2855,40 +2920,10 @@ int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt)
|
||||
*/
|
||||
if (mysql->methods->stmt_execute(stmt))
|
||||
DBUG_RETURN(1);
|
||||
stmt->state= MYSQL_STMT_EXECUTE_DONE;
|
||||
if (mysql->field_count)
|
||||
{
|
||||
/* Server has sent result set metadata */
|
||||
if (stmt->field_count == 0)
|
||||
{
|
||||
/*
|
||||
This is 'SHOW'/'EXPLAIN'-like query. Current implementation of
|
||||
prepared statements can't send result set metadata for these queries
|
||||
on prepare stage. Read it now.
|
||||
*/
|
||||
alloc_stmt_fields(stmt);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Update result set metadata if it for some reason changed between
|
||||
prepare and execute, i.e.:
|
||||
- in case of 'SELECT ?' we don't know column type unless data was
|
||||
supplied to mysql_stmt_execute, so updated column type is sent
|
||||
now.
|
||||
- if data dictionary changed between prepare and execute, for
|
||||
example a table used in the query was altered.
|
||||
Note, that now (4.1.3) we always send metadata in reply to
|
||||
COM_STMT_EXECUTE (even if it is not necessary), so either this or
|
||||
previous branch always works.
|
||||
TODO: send metadata only when it's really necessary and add a warning
|
||||
'Metadata changed' when it's sent twice.
|
||||
*/
|
||||
update_stmt_fields(stmt);
|
||||
}
|
||||
}
|
||||
stmt->state= MYSQL_STMT_EXECUTE_DONE;
|
||||
if (stmt->field_count)
|
||||
{
|
||||
reinit_result_set_metadata(stmt);
|
||||
if (stmt->server_status & SERVER_STATUS_CURSOR_EXISTS)
|
||||
{
|
||||
mysql->status= MYSQL_STATUS_READY;
|
||||
@ -2903,7 +2938,7 @@ int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt)
|
||||
network or b) is more efficient if all (few) result set rows are
|
||||
precached on client and server's resources are freed.
|
||||
*/
|
||||
DBUG_RETURN(mysql_stmt_store_result(stmt));
|
||||
mysql_stmt_store_result(stmt);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2912,7 +2947,7 @@ int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt)
|
||||
stmt->read_row_func= stmt_read_row_unbuffered;
|
||||
}
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(test(stmt->last_errno));
|
||||
}
|
||||
|
||||
|
||||
@ -4765,6 +4800,12 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
if (stmt->last_errno)
|
||||
{
|
||||
/* An attempt to use an invalid statement handle. */
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
if (mysql->status == MYSQL_STATUS_READY &&
|
||||
stmt->server_status & SERVER_STATUS_CURSOR_EXISTS)
|
||||
{
|
||||
@ -4972,9 +5013,10 @@ static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags)
|
||||
stmt->state= MYSQL_STMT_INIT_DONE;
|
||||
return 1;
|
||||
}
|
||||
stmt_clear_error(stmt);
|
||||
}
|
||||
}
|
||||
if (flags & RESET_CLEAR_ERROR)
|
||||
stmt_clear_error(stmt);
|
||||
stmt->state= MYSQL_STMT_PREPARE_DONE;
|
||||
}
|
||||
return 0;
|
||||
@ -4985,7 +5027,8 @@ my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt)
|
||||
DBUG_ENTER("mysql_stmt_free_result");
|
||||
|
||||
/* Free the client side and close the server side cursor if there is one */
|
||||
DBUG_RETURN(reset_stmt_handle(stmt, RESET_LONG_DATA | RESET_STORE_RESULT));
|
||||
DBUG_RETURN(reset_stmt_handle(stmt, RESET_LONG_DATA | RESET_STORE_RESULT |
|
||||
RESET_CLEAR_ERROR));
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
@ -5066,7 +5109,9 @@ my_bool STDCALL mysql_stmt_reset(MYSQL_STMT *stmt)
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
/* Reset the client and server sides of the prepared statement */
|
||||
DBUG_RETURN(reset_stmt_handle(stmt, RESET_SERVER_SIDE | RESET_LONG_DATA));
|
||||
DBUG_RETURN(reset_stmt_handle(stmt,
|
||||
RESET_SERVER_SIDE | RESET_LONG_DATA |
|
||||
RESET_CLEAR_ERROR));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -154,14 +154,12 @@ ENDIF(WITH_MARIA_STORAGE_ENGINE)
|
||||
|
||||
SET(SOURCE_SUBLIBS FALSE)
|
||||
|
||||
SET(LIBMYSQLD_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
|
||||
SET(LIBMYSQLD_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
|
||||
../libmysql/libmysql.c ../libmysql/errmsg.c ../client/get_password.c
|
||||
../sql-common/client.c ../sql-common/my_time.c
|
||||
../sql-common/my_user.c ../sql-common/pack.c
|
||||
../sql/password.c ../sql/discover.cc ../sql/derror.cc
|
||||
../sql/event_scheduler.cc ../sql/events.cc
|
||||
../sql/event_data_objects.cc ../sql/event_queue.cc
|
||||
../sql/event_db_repository.cc ../sql/field.cc ../sql/field_conv.cc
|
||||
../sql/field.cc ../sql/field_conv.cc
|
||||
../sql/filesort.cc ../sql/gstream.cc ../sql/ha_partition.cc
|
||||
../sql/handler.cc ../sql/hash_filo.cc ../sql/hostname.cc
|
||||
../sql/init.cc ../sql/item_buff.cc ../sql/item_cmpfunc.cc
|
||||
@ -194,7 +192,7 @@ SET(LIBMYSQLD_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
|
||||
../sql/strfunc.cc ../sql/table.cc ../sql/thr_malloc.cc
|
||||
../sql/time.cc ../sql/tztime.cc ../sql/uniques.cc ../sql/unireg.cc
|
||||
../sql/partition_info.cc ../sql/sql_connect.cc
|
||||
../sql/scheduler.cc
|
||||
../sql/scheduler.cc ../sql/event_parse_data.cc
|
||||
${GEN_SOURCES}
|
||||
${LIB_SOURCES})
|
||||
|
||||
|
@ -69,16 +69,14 @@ sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \
|
||||
sql_select.cc sql_do.cc sql_show.cc set_var.cc \
|
||||
sql_string.cc sql_table.cc sql_test.cc sql_udf.cc \
|
||||
sql_update.cc sql_yacc.cc table.cc thr_malloc.cc time.cc \
|
||||
unireg.cc uniques.cc stacktrace.c sql_union.cc hash_filo.cc \
|
||||
unireg.cc uniques.cc sql_union.cc hash_filo.cc \
|
||||
spatial.cc gstream.cc sql_help.cc tztime.cc sql_cursor.cc \
|
||||
sp_head.cc sp_pcontext.cc sp.cc sp_cache.cc sp_rcontext.cc \
|
||||
parse_file.cc sql_view.cc sql_trigger.cc my_decimal.cc \
|
||||
event_scheduler.cc events.cc event_data_objects.cc \
|
||||
event_queue.cc event_db_repository.cc \
|
||||
rpl_filter.cc sql_partition.cc sql_builtin.cc sql_plugin.cc \
|
||||
sql_tablespace.cc \
|
||||
rpl_injector.cc my_user.c partition_info.cc \
|
||||
sql_servers.cc
|
||||
sql_servers.cc event_parse_data.cc
|
||||
|
||||
libmysqld_int_a_SOURCES= $(libmysqld_sources)
|
||||
nodist_libmysqld_int_a_SOURCES= $(libmysqlsources) $(sqlsources)
|
||||
|
@ -447,7 +447,8 @@ int emb_load_querycache_result(THD *thd, Querycache_stream *src)
|
||||
if (thd->protocol == &thd->protocol_binary)
|
||||
{
|
||||
uint length;
|
||||
row= (MYSQL_ROWS *)alloc_root(&data->alloc, rows * sizeof(MYSQL_ROWS));
|
||||
row= (MYSQL_ROWS *)alloc_root(&data->alloc,
|
||||
(size_t) (rows * sizeof(MYSQL_ROWS)));
|
||||
end_row= row + rows;
|
||||
data->data= row;
|
||||
|
||||
|
@ -79,6 +79,15 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
my_bool result= 1;
|
||||
THD *thd=(THD *) mysql->thd;
|
||||
NET *net= &mysql->net;
|
||||
my_bool stmt_skip= stmt ? stmt->state != MYSQL_STMT_INIT_DONE : FALSE;
|
||||
|
||||
if (!thd)
|
||||
{
|
||||
/* Do "reconnect" if possible */
|
||||
if (mysql_reconnect(mysql) || stmt_skip)
|
||||
return 1;
|
||||
thd= (THD *) mysql->thd;
|
||||
}
|
||||
|
||||
#if defined(ENABLED_PROFILING) && defined(COMMUNITY_SERVER)
|
||||
thd->profiling.start_new_query();
|
||||
@ -285,7 +294,7 @@ static int emb_stmt_execute(MYSQL_STMT *stmt)
|
||||
my_bool res;
|
||||
|
||||
int4store(header, stmt->stmt_id);
|
||||
header[4]= stmt->flags;
|
||||
header[4]= (uchar) stmt->flags;
|
||||
thd= (THD*)stmt->mysql->thd;
|
||||
thd->client_param_count= stmt->param_count;
|
||||
thd->client_params= stmt->params;
|
||||
@ -848,7 +857,7 @@ void Protocol_text::remove_last_row()
|
||||
{
|
||||
MYSQL_DATA *data= thd->cur_data;
|
||||
MYSQL_ROWS **last_row_hook= &data->data;
|
||||
uint count= data->rows;
|
||||
my_ulonglong count= data->rows;
|
||||
DBUG_ENTER("Protocol_text::remove_last_row");
|
||||
while (--count)
|
||||
last_row_hook= &(*last_row_hook)->next;
|
||||
@ -1094,6 +1103,9 @@ void Protocol_text::prepare_for_resend()
|
||||
data->embedded_info->prev_ptr= &cur->next;
|
||||
next_field=cur->data;
|
||||
next_mysql_field= data->embedded_info->fields_list;
|
||||
#ifndef DBUG_OFF
|
||||
field_pos= 0;
|
||||
#endif
|
||||
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
@ -1124,6 +1136,9 @@ bool Protocol::net_store_data(const uchar *from, size_t length)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1400
|
||||
#define vsnprintf _vsnprintf
|
||||
#endif
|
||||
|
||||
int vprint_msg_to_log(enum loglevel level __attribute__((unused)),
|
||||
const char *format, va_list argsi)
|
||||
|
@ -46,6 +46,7 @@ dist-hook:
|
||||
$(distdir)/std_data/ndb_backup51_data_le \
|
||||
$(distdir)/std_data/parts \
|
||||
$(distdir)/lib \
|
||||
$(distdir)/std_data/funcs_1 \
|
||||
$(distdir)/lib/My
|
||||
-$(INSTALL_DATA) $(srcdir)/t/*.def $(distdir)/t
|
||||
$(INSTALL_DATA) $(srcdir)/t/*.test $(distdir)/t
|
||||
@ -70,11 +71,14 @@ dist-hook:
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.frm $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.MY* $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.cnf $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.txt $(distdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup50/BACKUP* $(distdir)/std_data/ndb_backup50
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51/BACKUP* $(distdir)/std_data/ndb_backup51
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51_data_be/BACKUP* $(distdir)/std_data/ndb_backup51_data_be
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51_data_le/BACKUP* $(distdir)/std_data/ndb_backup51_data_le
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/parts/part_* $(distdir)/std_data/parts
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/parts/*.MY* $(distdir)/std_data/parts
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/funcs_1/* $(distdir)/std_data/funcs_1
|
||||
$(INSTALL_DATA) $(srcdir)/lib/*.pl $(distdir)/lib
|
||||
$(INSTALL_DATA) $(srcdir)/lib/My/*.pm $(distdir)/lib/My
|
||||
-rm -rf `find $(distdir)/suite -type d -name SCCS` $(distdir)/suite/row_lock
|
||||
@ -93,6 +97,7 @@ install-data-local:
|
||||
$(DESTDIR)$(testdir)/std_data/ndb_backup51_data_le \
|
||||
$(DESTDIR)$(testdir)/std_data/parts \
|
||||
$(DESTDIR)$(testdir)/lib \
|
||||
$(DESTDIR)$(testdir)/std_data/funcs_1 \
|
||||
$(DESTDIR)$(testdir)/lib/My
|
||||
$(INSTALL_DATA) $(srcdir)/README $(DESTDIR)$(testdir)
|
||||
-$(INSTALL_DATA) $(srcdir)/t/*.def $(DESTDIR)$(testdir)/t
|
||||
@ -122,11 +127,14 @@ install-data-local:
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.frm $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.MY* $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.cnf $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/*.txt $(DESTDIR)$(testdir)/std_data
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup50/BACKUP* $(DESTDIR)$(testdir)/std_data/ndb_backup50
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51/BACKUP* $(DESTDIR)$(testdir)/std_data/ndb_backup51
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51_data_be/BACKUP* $(DESTDIR)$(testdir)/std_data/ndb_backup51_data_be
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/ndb_backup51_data_le/BACKUP* $(DESTDIR)$(testdir)/std_data/ndb_backup51_data_le
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/parts/part_* $(DESTDIR)$(testdir)/std_data/parts
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/parts/*.MY* $(DESTDIR)$(testdir)/std_data/parts
|
||||
$(INSTALL_DATA) $(srcdir)/std_data/funcs_1/* $(DESTDIR)$(testdir)/std_data/funcs_1
|
||||
$(INSTALL_DATA) $(srcdir)/lib/*.pl $(DESTDIR)$(testdir)/lib
|
||||
$(INSTALL_DATA) $(srcdir)/lib/My/*.pm $(DESTDIR)$(testdir)/lib/My
|
||||
for f in `(cd $(srcdir); find suite -type f | egrep -v 'SCCS|row_lock')`; \
|
||||
|
@ -1,17 +1,43 @@
|
||||
# Test of binlogging of INSERT_ID with INSERT DELAYED
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# Verify that INSERT DELAYED in mixed or row mode writes events to the
|
||||
# binlog, and that AUTO_INCREMENT works correctly.
|
||||
#
|
||||
# ==== Method ====
|
||||
#
|
||||
# Insert both single and multiple rows into an autoincrement column,
|
||||
# both with specified value and with NULL.
|
||||
#
|
||||
# With INSERT DELAYED, the rows do not show up in the table
|
||||
# immediately, so we must do source include/wait_until_rows_count.inc
|
||||
# between any two INSERT DELAYED statements. Moreover, if mixed or
|
||||
# row-based logging is used, there is also a delay between when rows
|
||||
# show up in the table and when they show up in the binlog. To ensure
|
||||
# that the rows show up in the binlog, we call FLUSH TABLES, which
|
||||
# waits until the delayed_insert thread has finished.
|
||||
#
|
||||
# We cannot read the binlog after executing INSERT DELAYED statements
|
||||
# that insert multiple rows, because that is nondeterministic. More
|
||||
# precisely, rows may be written in batches to the binlog, where each
|
||||
# batch has one Table_map_log_event and one or more
|
||||
# Write_rows_log_event. The number of rows included in each batch is
|
||||
# nondeterministic.
|
||||
#
|
||||
# ==== Related bugs ====
|
||||
#
|
||||
# BUG#20627: INSERT DELAYED does not honour auto_increment_* variables
|
||||
# Bug in this test: BUG#38068: binlog_stm_binlog fails sporadically in pushbuild
|
||||
|
||||
|
||||
create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
|
||||
# First, avoid BUG#20627:
|
||||
set @@session.auto_increment_increment=1, @@session.auto_increment_offset=1;
|
||||
# Verify that only one INSERT_ID event is binlogged.
|
||||
# Note, that because of WL#3368 mixed mode binlog records RBR events for the delayed
|
||||
|
||||
let $table=t1;
|
||||
let $rows_inserted=11; # total number of inserted rows in this test
|
||||
let $count=0;
|
||||
|
||||
insert delayed into t1 values (207);
|
||||
let $count=1;
|
||||
|
||||
# use this macro instead of sleeps.
|
||||
|
||||
inc $count;
|
||||
--source include/wait_until_rows_count.inc
|
||||
|
||||
insert delayed into t1 values (null);
|
||||
inc $count;
|
||||
--source include/wait_until_rows_count.inc
|
||||
@ -20,9 +46,10 @@ insert delayed into t1 values (300);
|
||||
inc $count;
|
||||
--source include/wait_until_rows_count.inc
|
||||
|
||||
# moving binlog check affront of multi-rows queries which work is indeterministic (extra table_maps)
|
||||
# todo: better check is to substitute SHOW BINLOG with reading from binlog, probably bug#19459 is in
|
||||
# the way
|
||||
# It is not enough to wait until all rows have been inserted into the
|
||||
# table. FLUSH TABLES ensures that they are in the binlog too. See
|
||||
# comment above.
|
||||
FLUSH TABLES;
|
||||
source include/show_binlog_events.inc;
|
||||
|
||||
insert delayed into t1 values (null),(null),(null),(null);
|
||||
@ -33,8 +60,5 @@ insert delayed into t1 values (null),(null),(400),(null);
|
||||
inc $count; inc $count; inc $count; inc $count;
|
||||
--source include/wait_until_rows_count.inc
|
||||
|
||||
#check this assertion about $count calculation
|
||||
--echo $count == $rows_inserted
|
||||
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
@ -13,3 +13,18 @@ create trigger tr1 before insert on t1 for each row insert into t2 values (2*new
|
||||
create procedure sp1 (a int) insert into t1 values(a);
|
||||
drop database testing_1;
|
||||
source include/show_binlog_events.inc;
|
||||
|
||||
# BUG#38773: DROP DATABASE cause switch to stmt-mode when there are
|
||||
# temporary tables open
|
||||
|
||||
use test;
|
||||
reset master;
|
||||
create temporary table tt1 (a int);
|
||||
create table t1 (a int);
|
||||
insert into t1 values (1);
|
||||
disable_warnings;
|
||||
drop database if exists mysqltest1;
|
||||
enable_warnings;
|
||||
insert into t1 values (1);
|
||||
drop table tt1, t1;
|
||||
source include/show_binlog_events.inc;
|
||||
|
@ -151,6 +151,20 @@ DROP DATABASE IF EXISTS mysqltest3;
|
||||
CREATE DATABASE mysqltest1;
|
||||
CREATE DATABASE mysqltest2;
|
||||
eval CREATE TABLE mysqltest1.t1 (f1 BIGINT) ENGINE=$engine_type;
|
||||
# Prevent Bug#26687 rpl_ddl test fails if run with --innodb option
|
||||
# The testscript (suite/rpl/rpl_ddl.test) + the expected result need that the
|
||||
# slave uses MyISAM for the table mysqltest.t1.
|
||||
# This is not valid in case of suite/rpl_ndb/rpl_ndb_ddl.test which sources
|
||||
# also this script.
|
||||
sync_slave_with_master;
|
||||
connection slave;
|
||||
if (`SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES
|
||||
WHERE TABLE_SCHEMA = 'mysqltest1' AND TABLE_NAME = 't1'
|
||||
AND ENGINE <> 'MyISAM' AND '$engine_type' <> 'NDB'`)
|
||||
{
|
||||
skip This test needs on slave side: InnoDB disabled, default engine: MyISAM;
|
||||
}
|
||||
connection master;
|
||||
INSERT INTO mysqltest1.t1 SET f1= 0;
|
||||
eval CREATE TABLE mysqltest1.t2 (f1 BIGINT) ENGINE=$engine_type;
|
||||
eval CREATE TABLE mysqltest1.t3 (f1 BIGINT) ENGINE=$engine_type;
|
||||
|
@ -28,9 +28,17 @@ drop table if exists t1, t2, t3;
|
||||
-- source include/master-slave.inc
|
||||
#should work for both SBR and RBR
|
||||
|
||||
# If concurrent inserts are on, it is not guaranteed that the rows
|
||||
# inserted by INSERT are immediately accessible by SELECT in another
|
||||
# thread. This would cause problems near the line 'connection master1'
|
||||
# below. So we turn off concurrent inserts.
|
||||
connection master;
|
||||
create table t1(a int auto_increment, key(a));
|
||||
create table t2(b int auto_increment, c int, key(b));
|
||||
SET @old_concurrent_insert= @@global.concurrent_insert;
|
||||
SET @@global.concurrent_insert= 0;
|
||||
|
||||
connection master;
|
||||
eval create table t1(a int auto_increment, key(a)) engine=$engine_type;
|
||||
eval create table t2(b int auto_increment, c int, key(b)) engine=$engine_type;
|
||||
insert into t1 values (1),(2),(3);
|
||||
insert into t1 values (null);
|
||||
insert into t2 values (null,last_insert_id());
|
||||
@ -68,8 +76,8 @@ connection master;
|
||||
|
||||
drop table t2;
|
||||
drop table t1;
|
||||
create table t1(a int auto_increment, key(a));
|
||||
create table t2(b int auto_increment, c int, key(b));
|
||||
eval create table t1(a int auto_increment, key(a)) engine=$engine_type;
|
||||
eval create table t2(b int auto_increment, c int, key(b)) engine=$engine_type;
|
||||
insert into t1 values (10);
|
||||
insert into t1 values (null),(null),(null);
|
||||
insert into t2 values (5,0);
|
||||
@ -94,7 +102,7 @@ sync_with_master;
|
||||
|
||||
connection master;
|
||||
SET TIMESTAMP=1000000000;
|
||||
CREATE TABLE t1 ( a INT UNIQUE );
|
||||
eval CREATE TABLE t1 ( a INT UNIQUE ) engine=$engine_type;
|
||||
SET FOREIGN_KEY_CHECKS=0;
|
||||
# Duplicate Key Errors
|
||||
--error 1022, ER_DUP_ENTRY
|
||||
@ -109,8 +117,8 @@ sync_slave_with_master;
|
||||
--echo #
|
||||
|
||||
connection master;
|
||||
create table t1(a int auto_increment, key(a));
|
||||
create table t2(a int);
|
||||
eval create table t1(a int auto_increment, key(a)) engine=$engine_type;
|
||||
eval create table t2(a int) engine=$engine_type;
|
||||
insert into t1 (a) values (null);
|
||||
insert into t2 (a) select a from t1 where a is null;
|
||||
insert into t2 (a) select a from t1 where a is null;
|
||||
@ -139,11 +147,11 @@ drop function if exists bug15728_insert;
|
||||
drop table if exists t1, t2;
|
||||
--enable_warnings
|
||||
|
||||
create table t1 (
|
||||
eval create table t1 (
|
||||
id int not null auto_increment,
|
||||
last_id int,
|
||||
primary key (id)
|
||||
);
|
||||
) engine=$engine_type;
|
||||
create function bug15728() returns int(11)
|
||||
return last_insert_id();
|
||||
|
||||
@ -152,11 +160,11 @@ insert into t1 (last_id) values (last_insert_id());
|
||||
insert into t1 (last_id) values (bug15728());
|
||||
|
||||
# Check that nested call replicates too.
|
||||
create table t2 (
|
||||
eval create table t2 (
|
||||
id int not null auto_increment,
|
||||
last_id int,
|
||||
primary key (id)
|
||||
);
|
||||
) engine=$engine_type;
|
||||
delimiter |;
|
||||
create function bug15728_insert() returns int(11) modifies sql data
|
||||
begin
|
||||
@ -215,8 +223,8 @@ drop procedure foo;
|
||||
# test of BUG#20188 REPLACE or ON DUPLICATE KEY UPDATE in
|
||||
# auto_increment breaks binlog
|
||||
|
||||
create table t1 (n int primary key auto_increment not null,
|
||||
b int, unique(b));
|
||||
eval create table t1 (n int primary key auto_increment not null,
|
||||
b int, unique(b)) engine=$engine_type;
|
||||
|
||||
# First, test that we do not call restore_auto_increment() too early
|
||||
# in write_record():
|
||||
@ -257,8 +265,8 @@ select * from t1 order by n;
|
||||
# and now test for the bug:
|
||||
connection master;
|
||||
drop table t1;
|
||||
create table t1 (n int primary key auto_increment not null,
|
||||
b int, unique(b));
|
||||
eval create table t1 (n int primary key auto_increment not null,
|
||||
b int, unique(b)) engine=$engine_type;
|
||||
insert into t1 values(null,100);
|
||||
select * from t1 order by n;
|
||||
sync_slave_with_master;
|
||||
@ -282,29 +290,29 @@ sync_slave_with_master;
|
||||
|
||||
connection master;
|
||||
# testcase with INSERT VALUES
|
||||
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT,
|
||||
UNIQUE(b));
|
||||
eval CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY AUTO_INCREMENT, b INT,
|
||||
UNIQUE(b)) ENGINE=$engine_type;
|
||||
INSERT INTO t1(b) VALUES(1),(1),(2) ON DUPLICATE KEY UPDATE t1.b=10;
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
sync_slave_with_master;
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t1 ORDER BY a;
|
||||
connection master;
|
||||
drop table t1;
|
||||
|
||||
# tescase with INSERT SELECT
|
||||
CREATE TABLE t1 (
|
||||
eval CREATE TABLE t1 (
|
||||
id bigint(20) unsigned NOT NULL auto_increment,
|
||||
field_1 int(10) unsigned NOT NULL,
|
||||
field_2 varchar(255) NOT NULL,
|
||||
field_3 varchar(255) NOT NULL,
|
||||
PRIMARY KEY (id),
|
||||
UNIQUE KEY field_1 (field_1, field_2)
|
||||
);
|
||||
CREATE TABLE t2 (
|
||||
) ENGINE=$engine_type;
|
||||
eval CREATE TABLE t2 (
|
||||
field_a int(10) unsigned NOT NULL,
|
||||
field_b varchar(255) NOT NULL,
|
||||
field_c varchar(255) NOT NULL
|
||||
);
|
||||
) ENGINE=$engine_type;
|
||||
INSERT INTO t2 (field_a, field_b, field_c) VALUES (1, 'a', '1a');
|
||||
INSERT INTO t2 (field_a, field_b, field_c) VALUES (2, 'b', '2b');
|
||||
INSERT INTO t2 (field_a, field_b, field_c) VALUES (3, 'c', '3c');
|
||||
@ -324,9 +332,9 @@ SELECT t2.field_a, t2.field_b, t2.field_c
|
||||
FROM t2
|
||||
ON DUPLICATE KEY UPDATE
|
||||
t1.field_3 = t2.field_c;
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t1 ORDER BY id;
|
||||
sync_slave_with_master;
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t1 ORDER BY id;
|
||||
connection master;
|
||||
drop table t1, t2;
|
||||
|
||||
@ -348,17 +356,17 @@ DROP TABLE IF EXISTS t1, t2;
|
||||
# Reset result of LAST_INSERT_ID().
|
||||
SELECT LAST_INSERT_ID(0);
|
||||
|
||||
CREATE TABLE t1 (
|
||||
eval CREATE TABLE t1 (
|
||||
id INT NOT NULL DEFAULT 0,
|
||||
last_id INT,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
) ENGINE=$engine_type;
|
||||
|
||||
CREATE TABLE t2 (
|
||||
eval CREATE TABLE t2 (
|
||||
id INT NOT NULL AUTO_INCREMENT,
|
||||
last_id INT,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
) ENGINE=$engine_type;
|
||||
|
||||
delimiter |;
|
||||
CREATE PROCEDURE p1()
|
||||
@ -369,12 +377,12 @@ END|
|
||||
delimiter ;|
|
||||
|
||||
CALL p1();
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
SELECT * FROM t1 ORDER BY id;
|
||||
SELECT * FROM t2 ORDER BY id;
|
||||
|
||||
sync_slave_with_master;
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
SELECT * FROM t1 ORDER BY id;
|
||||
SELECT * FROM t2 ORDER BY id;
|
||||
|
||||
connection master;
|
||||
|
||||
@ -394,11 +402,11 @@ DROP FUNCTION IF EXISTS f3;
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (
|
||||
eval CREATE TABLE t1 (
|
||||
i INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
j INT DEFAULT 0
|
||||
);
|
||||
CREATE TABLE t2 (i INT);
|
||||
) ENGINE=$engine_type;
|
||||
eval CREATE TABLE t2 (i INT) ENGINE=$engine_type;
|
||||
|
||||
delimiter |;
|
||||
CREATE PROCEDURE p1()
|
||||
@ -443,14 +451,16 @@ UPDATE t1 SET j= -1 WHERE i IS NULL;
|
||||
# Test statement-based replication of function calls.
|
||||
INSERT INTO t1 (i) VALUES (NULL);
|
||||
|
||||
# Here, we rely on having set @@concurrent_insert= 0 (see comment at
|
||||
# the top of this file).
|
||||
connection master1;
|
||||
INSERT INTO t1 (i) VALUES (NULL);
|
||||
|
||||
connection master;
|
||||
SELECT f3();
|
||||
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
SELECT * FROM t1 ORDER BY i;
|
||||
SELECT * FROM t2 ORDER BY i;
|
||||
|
||||
sync_slave_with_master;
|
||||
SELECT * FROM t1;
|
||||
@ -472,11 +482,11 @@ sync_slave_with_master;
|
||||
|
||||
# Tests in this file are tightly bound together. Recreate t2.
|
||||
connection master;
|
||||
create table t2 (
|
||||
eval create table t2 (
|
||||
id int not null auto_increment,
|
||||
last_id int,
|
||||
primary key (id)
|
||||
);
|
||||
) engine=$engine_type;
|
||||
|
||||
|
||||
# Test for BUG#20341 "stored function inserting into one
|
||||
@ -484,7 +494,8 @@ create table t2 (
|
||||
|
||||
connection master;
|
||||
truncate table t2;
|
||||
create table t1 (id tinyint primary key); # no auto_increment
|
||||
# no auto_increment
|
||||
eval create table t1 (id tinyint primary key) engine=$engine_type;
|
||||
|
||||
delimiter |;
|
||||
create function insid() returns int
|
||||
@ -504,20 +515,20 @@ insert into t2 (id) values(5),(6),(7);
|
||||
delete from t2 where id>=5;
|
||||
set sql_log_bin=1;
|
||||
insert into t1 select insid();
|
||||
select * from t1;
|
||||
select * from t2;
|
||||
select * from t1 order by id;
|
||||
select * from t2 order by id;
|
||||
|
||||
sync_slave_with_master;
|
||||
select * from t1;
|
||||
select * from t2;
|
||||
select * from t1 order by id;
|
||||
select * from t2 order by id;
|
||||
|
||||
connection master;
|
||||
drop table t1;
|
||||
drop function insid;
|
||||
|
||||
truncate table t2;
|
||||
create table t1 (n int primary key auto_increment not null,
|
||||
b int, unique(b));
|
||||
eval create table t1 (n int primary key auto_increment not null,
|
||||
b int, unique(b)) engine=$engine_type;
|
||||
delimiter |;
|
||||
create procedure foo()
|
||||
begin
|
||||
@ -528,14 +539,15 @@ begin
|
||||
end|
|
||||
delimiter ;|
|
||||
call foo();
|
||||
select * from t1;
|
||||
select * from t2;
|
||||
select * from t1 order by n;
|
||||
select * from t2 order by id;
|
||||
|
||||
sync_slave_with_master;
|
||||
select * from t1;
|
||||
select * from t2;
|
||||
select * from t1 order by n;
|
||||
select * from t2 order by id;
|
||||
|
||||
connection master;
|
||||
drop table t1, t2;
|
||||
drop procedure foo;
|
||||
SET @@global.concurrent_insert= @old_concurrent_insert;
|
||||
sync_slave_with_master;
|
||||
|
@ -13,22 +13,15 @@ save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
stop slave;
|
||||
--source include/wait_for_slave_to_stop.inc
|
||||
reset master;
|
||||
reset slave;
|
||||
# We are going to read the slave's binlog which contains file_id (for some LOAD
|
||||
# DATA INFILE); to make it repeatable (not influenced by other tests), we need
|
||||
# to stop and start the slave, to be sure file_id will start from 1.
|
||||
# This can be done with 'server_stop slave', but
|
||||
# this would require the manager, so most of the time the test will be skipped
|
||||
# :(
|
||||
# To workaround this, I (Guilhem) add a (empty) rpl_log-slave.opt (because when
|
||||
# mysql-test-run finds such a file it restarts the slave before doing the
|
||||
# test). That's not very elegant but I could find no better way, sorry.
|
||||
start slave;
|
||||
--source include/wait_for_slave_to_start.inc
|
||||
|
||||
let $VERSION=`select version()`;
|
||||
|
||||
connection master;
|
||||
reset master;
|
||||
eval create table t1(n int not null auto_increment primary key)ENGINE=$engine_type;
|
||||
insert into t1 values (NULL);
|
||||
drop table t1;
|
||||
@ -79,7 +72,6 @@ connection slave;
|
||||
# Note that the above 'slave start' will cause a 3rd rotate event (a fake one)
|
||||
# to go into the relay log (the master always sends a fake one when replication
|
||||
# starts).
|
||||
start slave;
|
||||
let $result_pattern= '%127.0.0.1%root%master-bin.000002%slave-relay-bin.000005%Yes%Yes%0%0%None%';
|
||||
--source include/wait_slave_status.inc
|
||||
sync_with_master;
|
||||
@ -87,6 +79,7 @@ sync_with_master;
|
||||
select * from t1 order by 1 asc;
|
||||
flush logs;
|
||||
stop slave;
|
||||
--source include/wait_for_slave_to_stop.inc
|
||||
connection master;
|
||||
|
||||
# Create some entries for second log
|
||||
@ -95,6 +88,7 @@ eval create table t2 (n int)ENGINE=$engine_type;
|
||||
insert into t2 values (1);
|
||||
source include/show_binlog_events.inc;
|
||||
--replace_result $VERSION VERSION
|
||||
--replace_regex /file_id=[0-9]+/file_id=#/ /block_len=[0-9]+/block_len=#/ /infile '.+'/infile 'words.dat'/
|
||||
--replace_column 2 # 5 #
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
||||
show binlog events in 'master-bin.000002';
|
||||
@ -102,10 +96,12 @@ show binary logs;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
start slave;
|
||||
--source include/wait_for_slave_to_start.inc
|
||||
sync_with_master;
|
||||
show binary logs;
|
||||
--replace_result $MASTER_MYPORT MASTER_PORT $VERSION VERSION
|
||||
--replace_column 2 # 5 #
|
||||
--replace_regex /file_id=[0-9]+/file_id=#/ /block_len=[0-9]+/block_len=#/ /INFILE '.+'/INFILE 'words.dat'/
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
||||
show binlog events in 'slave-bin.000001' from 4;
|
||||
--replace_result $MASTER_MYPORT MASTER_PORT $VERSION VERSION
|
||||
|
@ -259,12 +259,28 @@ DELETE FROM t1;
|
||||
query_vertical SELECT COUNT(*) FROM t1 ORDER BY c1,c2;
|
||||
sync_slave_with_master;
|
||||
set @@global.slave_exec_mode= default;
|
||||
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1);
|
||||
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
|
||||
disable_query_log;
|
||||
eval SELECT "$last_error" AS Last_SQL_Error;
|
||||
enable_query_log;
|
||||
query_vertical SELECT COUNT(*) FROM t1 ORDER BY c1,c2;
|
||||
|
||||
# BUG#37076: TIMESTAMP/DATETIME values are not replicated correctly
|
||||
# between machines with mixed endiannes
|
||||
# (regression test)
|
||||
|
||||
--echo **** Test for BUG#37076 ****
|
||||
--echo **** On Master ****
|
||||
connection master;
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (a TIMESTAMP, b DATETIME, c DATE);
|
||||
INSERT INTO t1 VALUES(
|
||||
'2005-11-14 01:01:01', '2005-11-14 01:01:02', '2005-11-14');
|
||||
|
||||
--echo **** On Slave ****
|
||||
sync_slave_with_master slave;
|
||||
SELECT * FROM t1;
|
||||
|
||||
#
|
||||
# cleanup
|
||||
#
|
||||
@ -272,3 +288,186 @@ query_vertical SELECT COUNT(*) FROM t1 ORDER BY c1,c2;
|
||||
connection master;
|
||||
DROP TABLE IF EXISTS t1,t2,t3,t4,t5,t6,t7,t8;
|
||||
sync_slave_with_master;
|
||||
|
||||
#
|
||||
# BUG#37426: RBR breaks for CHAR() UTF8 fields > 85 chars
|
||||
#
|
||||
|
||||
# We have 4 combinations to test with respect to the field length
|
||||
# (i.e., the number of bytes) of the CHAR fields:
|
||||
#
|
||||
# 1. Replicating from CHAR<256 to CHAR<256
|
||||
# 2. Replicating from CHAR<256 to CHAR>255
|
||||
# 3. Replicating from CHAR>255 to CHAR<256
|
||||
# 4. Replicating from CHAR>255 to CHAR>255
|
||||
|
||||
# We also make a special case of using the max size of a field on the
|
||||
# master, i.e. CHAR(255) in UTF-8, giving another three cases.
|
||||
#
|
||||
# 5. Replicating UTF-8 CHAR(255) to CHAR(<256)
|
||||
# 6. Replicating UTF-8 CHAR(255) to CHAR(>255)
|
||||
# 7. Replicating UTF-8 CHAR(255) to CHAR(255) UTF-8
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t1 (i INT NOT NULL,
|
||||
c CHAR(16) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
|
||||
eval CREATE TABLE t2 (i INT NOT NULL,
|
||||
c CHAR(16) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
|
||||
sync_slave_with_master;
|
||||
ALTER TABLE t2 MODIFY c CHAR(128) CHARACTER SET utf8 NOT NULL;
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t3 (i INT NOT NULL,
|
||||
c CHAR(128) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
sync_slave_with_master;
|
||||
ALTER TABLE t3 MODIFY c CHAR(16) CHARACTER SET utf8 NOT NULL;
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t4 (i INT NOT NULL,
|
||||
c CHAR(128) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
|
||||
eval CREATE TABLE t5 (i INT NOT NULL,
|
||||
c CHAR(255) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
sync_slave_with_master;
|
||||
ALTER TABLE t5 MODIFY c CHAR(16) CHARACTER SET utf8 NOT NULL;
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t6 (i INT NOT NULL,
|
||||
c CHAR(255) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
sync_slave_with_master;
|
||||
ALTER TABLE t6 MODIFY c CHAR(128) CHARACTER SET utf8 NOT NULL;
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t7 (i INT NOT NULL,
|
||||
c CHAR(255) CHARACTER SET utf8 NOT NULL,
|
||||
j INT NOT NULL) ENGINE = $type ;
|
||||
|
||||
--echo [expecting slave to replicate correctly]
|
||||
connection master;
|
||||
INSERT INTO t1 VALUES (1, "", 1);
|
||||
INSERT INTO t1 VALUES (2, repeat(_utf8'a', 16), 2);
|
||||
sync_slave_with_master;
|
||||
|
||||
let $diff_table_1=master:test.t1;
|
||||
let $diff_table_2=slave:test.t1;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
--echo [expecting slave to replicate correctly]
|
||||
connection master;
|
||||
INSERT INTO t2 VALUES (1, "", 1);
|
||||
INSERT INTO t2 VALUES (2, repeat(_utf8'a', 16), 2);
|
||||
sync_slave_with_master;
|
||||
|
||||
let $diff_table_1=master:test.t2;
|
||||
let $diff_table_2=slave:test.t2;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
--echo [expecting slave to stop]
|
||||
connection master;
|
||||
INSERT INTO t3 VALUES (1, "", 1);
|
||||
INSERT INTO t3 VALUES (2, repeat(_utf8'a', 128), 2);
|
||||
|
||||
connection slave;
|
||||
source include/wait_for_slave_sql_to_stop.inc;
|
||||
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
|
||||
disable_query_log;
|
||||
eval SELECT "$last_error" AS Last_SQL_Error;
|
||||
enable_query_log;
|
||||
connection master;
|
||||
RESET MASTER;
|
||||
connection slave;
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
START SLAVE;
|
||||
source include/wait_for_slave_to_start.inc;
|
||||
|
||||
--echo [expecting slave to replicate correctly]
|
||||
connection master;
|
||||
INSERT INTO t4 VALUES (1, "", 1);
|
||||
INSERT INTO t4 VALUES (2, repeat(_utf8'a', 128), 2);
|
||||
sync_slave_with_master;
|
||||
|
||||
let $diff_table_1=master:test.t4;
|
||||
let $diff_table_2=slave:test.t4;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
--echo [expecting slave to stop]
|
||||
connection master;
|
||||
INSERT INTO t5 VALUES (1, "", 1);
|
||||
INSERT INTO t5 VALUES (2, repeat(_utf8'a', 255), 2);
|
||||
|
||||
connection slave;
|
||||
source include/wait_for_slave_sql_to_stop.inc;
|
||||
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
|
||||
disable_query_log;
|
||||
eval SELECT "$last_error" AS Last_SQL_Error;
|
||||
enable_query_log;
|
||||
connection master;
|
||||
RESET MASTER;
|
||||
connection slave;
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
START SLAVE;
|
||||
source include/wait_for_slave_to_start.inc;
|
||||
|
||||
--echo [expecting slave to stop]
|
||||
connection master;
|
||||
INSERT INTO t6 VALUES (1, "", 1);
|
||||
INSERT INTO t6 VALUES (2, repeat(_utf8'a', 255), 2);
|
||||
|
||||
connection slave;
|
||||
source include/wait_for_slave_sql_to_stop.inc;
|
||||
let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Error, 1);
|
||||
disable_query_log;
|
||||
eval SELECT "$last_error" AS Last_SQL_Error;
|
||||
enable_query_log;
|
||||
connection master;
|
||||
RESET MASTER;
|
||||
connection slave;
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
START SLAVE;
|
||||
source include/wait_for_slave_to_start.inc;
|
||||
|
||||
--echo [expecting slave to replicate correctly]
|
||||
connection master;
|
||||
INSERT INTO t7 VALUES (1, "", 1);
|
||||
INSERT INTO t7 VALUES (2, repeat(_utf8'a', 255), 2);
|
||||
sync_slave_with_master;
|
||||
|
||||
let $diff_table_1=master:test.t7;
|
||||
let $diff_table_2=slave:test.t7;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
connection master;
|
||||
drop table t1, t2, t3, t4, t5, t6, t7;
|
||||
sync_slave_with_master;
|
||||
|
||||
#
|
||||
# BUG#32709: Assertion failed: trx_data->empty(), file .\log.cc, line 1293
|
||||
#
|
||||
|
||||
connection master;
|
||||
eval CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=$type;
|
||||
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
--error ER_DUP_ENTRY
|
||||
UPDATE t1 SET a = 10;
|
||||
INSERT INTO t1 VALUES (4);
|
||||
sync_slave_with_master;
|
||||
|
||||
let $diff_table_1=master:test.t1;
|
||||
let $diff_table_2=slave:test.t1;
|
||||
source include/diff_tables.inc;
|
||||
|
||||
connection master;
|
||||
drop table t1;
|
||||
sync_slave_with_master;
|
||||
|
81
mysql-test/include/charset_basic.inc
Normal file
81
mysql-test/include/charset_basic.inc
Normal file
@ -0,0 +1,81 @@
|
||||
#
|
||||
# This auxiliary script is used by character set test cases.
|
||||
#
|
||||
|
||||
|
||||
|
||||
--Error 0,ER_UNKNOWN_CHARACTER_SET
|
||||
eval SET $charset_variable = big5;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = dec8;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = cp850;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = hp8;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = koi8r;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = latin1;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = latin2;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = swe7;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = ascii;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = ujis;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = sjis;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = hebrew;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = tis620;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = euckr;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = koi8u;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = gb2312;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = greek;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = cp1250;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = gbk;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = latin5;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = armscii8;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = utf8;
|
||||
eval SELECT $charset_variable;
|
||||
# Error with Linux
|
||||
--error 0,ER_WRONG_VALUE_FOR_VAR
|
||||
eval SET $charset_variable = ucs2;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = cp866;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = keybcs2;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = macce;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = macroman;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = cp852;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = latin7;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = cp1251;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = cp1256;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = cp1257;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = binary;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = geostd8;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = cp932;
|
||||
eval SELECT $charset_variable;
|
||||
eval SET $charset_variable = eucjpms;
|
||||
eval SELECT $charset_variable;
|
258
mysql-test/include/collation_basic.inc
Normal file
258
mysql-test/include/collation_basic.inc
Normal file
@ -0,0 +1,258 @@
|
||||
#
|
||||
# This auxiliary file is used by collation variables
|
||||
#
|
||||
--Error 0,ER_UNKNOWN_CHARACTER_SET
|
||||
eval SET $collation_variable = big5_chinese_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = big5_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = dec8_swedish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = dec8_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp850_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp850_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = hp8_english_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = hp8_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = koi8r_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = koi8r_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin1_german1_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin1_swedish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin1_danish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin1_german2_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin1_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin1_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin1_general_cs;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin1_spanish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin2_czech_cs;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin2_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin2_hungarian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin2_croatian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin2_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = swe7_swedish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = swe7_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ascii_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ascii_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ujis_japanese_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ujis_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = sjis_japanese_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = sjis_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = hebrew_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = hebrew_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = tis620_thai_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = tis620_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = euckr_korean_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = euckr_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = koi8u_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = koi8u_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = gb2312_chinese_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = gb2312_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = greek_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = greek_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1250_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1250_czech_cs;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1250_croatian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1250_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1250_polish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = gbk_chinese_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = gbk_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin5_turkish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin5_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = armscii8_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = armscii8_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_unicode_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_icelandic_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_latvian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_romanian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_slovenian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_polish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_estonian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_spanish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_swedish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_turkish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_czech_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_danish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_lithuanian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_slovak_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_spanish2_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_roman_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_persian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_esperanto_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = utf8_hungarian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_unicode_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_icelandic_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_latvian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_romanian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_slovenian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_polish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_estonian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_spanish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_swedish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_turkish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_czech_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_danish_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_lithuanian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_slovak_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_spanish2_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_roman_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_persian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_esperanto_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = ucs2_hungarian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp866_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp866_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = keybcs2_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = keybcs2_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = macce_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = macce_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = macroman_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = macroman_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp852_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp852_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin7_estonian_cs;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin7_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin7_general_cs;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = latin7_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1251_bulgarian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1251_ukrainian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1251_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1251_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1251_general_cs;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1256_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1256_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1257_lithuanian_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1257_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp1257_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = binary;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = geostd8_general_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = geostd8_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp932_japanese_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = cp932_bin;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = eucjpms_japanese_ci;
|
||||
eval SELECT $collation_variable;
|
||||
eval SET $collation_variable = eucjpms_bin;
|
||||
eval SELECT $collation_variable;
|
@ -4,354 +4,641 @@
|
||||
# Bug#3300
|
||||
# Designed and tested by Sinisa Milivojevic, sinisa@mysql.com
|
||||
#
|
||||
# two non-interfering UPDATE's not changing result set
|
||||
#
|
||||
# The variable
|
||||
# $engine_type -- storage engine to be tested
|
||||
# has to be set before sourcing this script.
|
||||
# These variables have to be set before sourcing this script:
|
||||
# TRANSACTION ISOLATION LEVEL REPEATABLE READ
|
||||
# innodb_locks_unsafe_for_binlog 0 (default) or 1 (by
|
||||
# --innodb_locks_unsafe_for_binlog)
|
||||
# $engine_type storage engine to be tested
|
||||
#
|
||||
# Last update:
|
||||
# 2006-08-02 ML test refactored
|
||||
# old name was t/innodb_concurrent.test
|
||||
# main code went into include/concurrent.inc
|
||||
# 2008-06-03 KP test refactored; removed name locks, added comments.
|
||||
# renamed wrapper t/concurrent_innodb.test ->
|
||||
# t/concurrent_innodb_unsafelog.test
|
||||
# new wrapper t/concurrent_innodb_safelog.test
|
||||
#
|
||||
|
||||
connection default;
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
|
||||
#
|
||||
# Show prerequisites for this test.
|
||||
#
|
||||
SELECT @@global.tx_isolation;
|
||||
SELECT @@global.innodb_locks_unsafe_for_binlog;
|
||||
#
|
||||
# When innodb_locks_unsafe_for_binlog is not set (zero), which is the
|
||||
# default, InnoDB takes "next-key locks"/"gap locks". This means it
|
||||
# locks the gap before the keys that it accessed to find the rows to
|
||||
# use for a statement. In this case we have to expect some more lock
|
||||
# wait timeouts in the tests below as if innodb_locks_unsafe_for_binlog
|
||||
# is set (non-zero). In the latter case no "next-key locks"/"gap locks"
|
||||
# are taken and locks on keys that do not match the WHERE conditon are
|
||||
# released. Hence less lock collisions occur.
|
||||
# We use the variable $keep_locks to set the expectations for
|
||||
# lock wait timeouts accordingly.
|
||||
#
|
||||
let $keep_locks= `SELECT NOT @@global.innodb_locks_unsafe_for_binlog`;
|
||||
--echo # keep_locks == $keep_locks
|
||||
|
||||
#
|
||||
# Set up privileges and remove user level locks, if exist.
|
||||
#
|
||||
GRANT USAGE ON test.* TO mysqltest@localhost;
|
||||
|
||||
#
|
||||
# Preparatory cleanup.
|
||||
#
|
||||
DO release_lock("hello");
|
||||
DO release_lock("hello2");
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",1);
|
||||
connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send update t1 set eta=1+get_lock("hello",1)*0 where tipo=11;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
update t1 set eta=2 where tipo=22;
|
||||
select release_lock("hello");
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
commit;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# two UPDATE's running and one changing result set
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send update t1 set eta=1+get_lock("hello",10)*0 where tipo=1;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
update t1 set tipo=1 where tipo=2;
|
||||
select release_lock("hello");
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
commit;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** two UPDATE's running and both changing distinct result sets
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
--echo ** Get user level lock (ULL) for thread 1
|
||||
select get_lock("hello",10);
|
||||
|
||||
--echo ** connection thread2
|
||||
connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Start transaction for thread 2
|
||||
begin;
|
||||
--echo ** Update will cause a table scan and a new ULL will
|
||||
--echo ** be created and blocked on the first row where tipo=11.
|
||||
send update t1 set eta=1+get_lock("hello",10)*0 where tipo=11;
|
||||
sleep 1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Start new transaction for thread 1
|
||||
begin;
|
||||
--echo ** Update on t1 will cause a table scan which will be blocked because
|
||||
--echo ** the previously initiated table scan applied exclusive key locks on
|
||||
--echo ** all primary keys.
|
||||
--echo ** Not so if innodb_locks_unsafe_for_binlog is set. The locks that
|
||||
--echo ** do not match the WHERE condition are released.
|
||||
if ($keep_locks)
|
||||
{
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set eta=2 where tipo=22;
|
||||
}
|
||||
if (!$keep_locks)
|
||||
{
|
||||
update t1 set eta=2 where tipo=22;
|
||||
}
|
||||
--echo ** Release user level name lock from thread 1. This will cause the ULL
|
||||
--echo ** on thread 2 to end its wait.
|
||||
select release_lock("hello");
|
||||
--echo ** Table is now updated with a new eta on tipo=22 for thread 1.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Release the lock and collect result from update on thread 2
|
||||
reap;
|
||||
select release_lock("hello");
|
||||
--echo ** Table should have eta updates where tipo=11 but updates made by
|
||||
--echo ** thread 1 shouldn't be visible yet.
|
||||
select * from t1;
|
||||
--echo ** Sending commit on thread 2.
|
||||
commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Make sure table reads didn't change yet on thread 1.
|
||||
select * from t1;
|
||||
--echo ** And send final commit on thread 1.
|
||||
commit;
|
||||
--echo ** Table should now be updated by both updates in the order of
|
||||
--echo ** thread 1,2.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Make sure the output is similar for t1.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
#
|
||||
# One UPDATE and one INSERT .... Monty's test
|
||||
#
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** two UPDATE's running and one changing result set
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
--echo ** Get ULL "hello" on thread 1
|
||||
select get_lock("hello",10);
|
||||
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1 (a int not null, b int not null);
|
||||
insert into t1 values (1,1),(2,1),(3,1),(4,1);
|
||||
select get_lock("hello2",1000);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send update t1 set b=10+get_lock(concat("hello",a),1000)*0 where
|
||||
a=2;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
insert into t1 values (1,1);
|
||||
select release_lock("hello2");
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
sleep 1;
|
||||
connection thread2;
|
||||
reap;
|
||||
connection default;
|
||||
drop table t1;
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Start transaction on thread 2
|
||||
begin;
|
||||
--echo ** Update will cause a table scan.
|
||||
--echo ** This will cause a hang on the first row where tipo=1 until the
|
||||
--echo ** blocking ULL is released.
|
||||
send update t1 set eta=1+get_lock("hello",10)*0 where tipo=1;
|
||||
sleep 1;
|
||||
|
||||
#
|
||||
# one UPDATE changing result set and SELECT ... FOR UPDATE
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send select * from t1 where tipo=2 FOR UPDATE;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
select release_lock("hello");
|
||||
--error 1205
|
||||
update t1 set tipo=1+get_lock("hello",10)*0 where tipo=2;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
commit;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
connection default;
|
||||
drop table t1;
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Start transaction on thread 1
|
||||
begin;
|
||||
--echo ** Update on t1 will cause a table scan which will be blocked because
|
||||
--echo ** the previously initiated table scan applied exclusive key locks on
|
||||
--echo ** all primary keys.
|
||||
--echo ** Not so if innodb_locks_unsafe_for_binlog is set. The locks that
|
||||
--echo ** do not match the WHERE condition are released.
|
||||
if ($keep_locks)
|
||||
{
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set tipo=1 where tipo=2;
|
||||
}
|
||||
if (!$keep_locks)
|
||||
{
|
||||
update t1 set tipo=1 where tipo=2;
|
||||
}
|
||||
--echo ** Release ULL. This will release the next waiting ULL on thread 2.
|
||||
select release_lock("hello");
|
||||
--echo ** The table should still be updated with updates for thread 1 only:
|
||||
select * from t1;
|
||||
|
||||
#
|
||||
# one UPDATE not changing result set and SELECT ... FOR UPDATE
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send select * from t1 where tipo=2 FOR UPDATE;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
select release_lock("hello");
|
||||
--error 1205
|
||||
update t1 set tipo=11+get_lock("hello",10)*0 where tipo=22;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
commit;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
connection default;
|
||||
drop table t1;
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Release the lock and collect result from thread 2:
|
||||
reap;
|
||||
select release_lock("hello");
|
||||
--echo ** Seen from thread 2 the table should have been updated on four
|
||||
--echo ** places.
|
||||
select * from t1;
|
||||
commit;
|
||||
|
||||
#
|
||||
# two SELECT ... FOR UPDATE
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send select * from t1 where tipo=2 FOR UPDATE;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
select release_lock("hello");
|
||||
--error 1205
|
||||
select * from t1 where tipo=1 FOR UPDATE;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
commit;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Thread 2 has committed but the result should remain the same for
|
||||
--echo ** thread 1 (updated on three places):
|
||||
select * from t1;
|
||||
commit;
|
||||
--echo ** After a commit the table should be merged with the previous
|
||||
--echo ** commit.
|
||||
--echo ** This select should show both updates:
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
#
|
||||
# one UPDATE changing result set and DELETE
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send delete from t1 where tipo=2;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
select release_lock("hello");
|
||||
--error 1205
|
||||
update t1 set tipo=1+get_lock("hello",10)*0 where tipo=2;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
commit;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** One UPDATE and one INSERT .... Monty's test
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1 (a int not null, b int not null);
|
||||
insert into t1 values (1,1),(2,1),(3,1),(4,1);
|
||||
--echo ** Create ULL 'hello2'
|
||||
select get_lock("hello2",10);
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Begin a new transaction on thread 2
|
||||
begin;
|
||||
--echo ** Update will create a table scan which creates a ULL where a=2;
|
||||
--echo ** this will hang waiting on thread 1.
|
||||
send update t1 set b=10+get_lock(concat("hello",a),10)*0 where a=2;
|
||||
sleep 1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Insert new values to t1 from thread 1; this created an implicit
|
||||
--echo ** commit since there are no on-going transactions.
|
||||
insert into t1 values (1,1);
|
||||
--echo ** Release the ULL (thread 2 updates will finish).
|
||||
select release_lock("hello2");
|
||||
--echo ** ..but thread 1 will still see t1 as if nothing has happend:
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Collect results from thread 2 and release the lock.
|
||||
reap;
|
||||
select release_lock("hello2");
|
||||
--echo ** The table should look like the original+updates for thread 2,
|
||||
--echo ** and consist of new rows:
|
||||
select * from t1;
|
||||
--echo ** Commit changes from thread 2
|
||||
commit;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
#
|
||||
# one UPDATE not changing result set and DELETE
|
||||
#
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
select get_lock("hello",10);
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send delete from t1 where tipo=2;
|
||||
sleep 1;
|
||||
connection thread1;
|
||||
begin;
|
||||
select release_lock("hello");
|
||||
update t1 set tipo=1+get_lock("hello",10)*0 where tipo=22;
|
||||
select * from t1;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
connection thread1;
|
||||
commit;
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** one UPDATE changing result set and SELECT ... FOR UPDATE
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Begin a new transaction on thread 2
|
||||
begin;
|
||||
--echo ** Select a range for update.
|
||||
select * from t1 where tipo=2 FOR UPDATE;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Begin a new transaction on thread 1
|
||||
begin;
|
||||
--echo ** Update the same range which is marked for update on thread 2; this
|
||||
--echo ** will hang because of row locks.
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set tipo=1 where tipo=2;
|
||||
--echo ** After the update the table will be unmodified because the previous
|
||||
--echo ** transaction failed and was rolled back.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** The table should look unmodified from thread 2.
|
||||
select * from t1;
|
||||
--echo ** Sending a commit should release the row locks and enable
|
||||
--echo ** thread 1 to complete the transaction.
|
||||
commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Commit on thread 1.
|
||||
commit;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** The table should not have been changed.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Even on thread 1:
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
sleep 1;
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** one UPDATE not changing result set and SELECT ... FOR UPDATE
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Starting new transaction on thread 2.
|
||||
begin;
|
||||
--echo ** Starting SELECT .. FOR UPDATE
|
||||
select * from t1 where tipo=2 FOR UPDATE;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo
|
||||
--echo ** Starting new transaction on thread 1
|
||||
begin;
|
||||
--echo ** Updating single row using a table scan. This will time out
|
||||
--echo ** because of ongoing transaction on thread 1 holding lock on
|
||||
--echo ** all primary keys in the scan.
|
||||
--echo ** Not so if innodb_locks_unsafe_for_binlog is set. The locks that
|
||||
--echo ** do not match the WHERE condition are released.
|
||||
if ($keep_locks)
|
||||
{
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set tipo=11 where tipo=22;
|
||||
}
|
||||
if (!$keep_locks)
|
||||
{
|
||||
update t1 set tipo=11 where tipo=22;
|
||||
}
|
||||
--echo ** After the time out the transaction is aborted; no rows should
|
||||
--echo ** have changed.
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** The same thing should hold true for the transaction on
|
||||
--echo ** thread 2
|
||||
select * from t1;
|
||||
send commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
commit;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Even after committing:
|
||||
reap;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** two SELECT ... FOR UPDATE
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
--echo ** Begin a new transaction on thread 2
|
||||
begin;
|
||||
select * from t1 where tipo=2 FOR UPDATE;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Begin a new transaction on thread 1
|
||||
begin;
|
||||
--echo ** Selecting a range for update by table scan will be blocked
|
||||
--echo ** because of on-going transaction on thread 2.
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
select * from t1 where tipo=1 FOR UPDATE;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Table will be unchanged and the select command will not be
|
||||
--echo ** blocked:
|
||||
select * from t1;
|
||||
--echo ** Commit transacton on thread 2.
|
||||
commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Commit transaction on thread 1.
|
||||
commit;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
--echo ** Make sure table isn't blocked on thread 2:
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
--echo ** Make sure table isn't blocked on thread 1:
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** one UPDATE changing result set and DELETE
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send delete from t1 where tipo=2;
|
||||
sleep 1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
begin;
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set tipo=1 where tipo=2;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
commit;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
--echo
|
||||
--echo **
|
||||
--echo ** one UPDATE not changing result set and DELETE
|
||||
--echo **
|
||||
--echo ** connection thread1
|
||||
#connect (thread1, localhost, mysqltest,,);
|
||||
connection thread1;
|
||||
--echo ** Set up table
|
||||
eval SET SESSION STORAGE_ENGINE = $engine_type;
|
||||
create table t1(eta int(11) not null, tipo int(11), c varchar(255));
|
||||
insert into t1 values (7,7, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
|
||||
insert into t1 values (8,8, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
|
||||
insert into t1 values (10,1,"ccccccccccccccccccccccccccccccccccccccccccc");
|
||||
insert into t1 values (20,2,"ddddddddddddddddddddddddddddddddddddddddddd");
|
||||
insert into t1 values (30,1,"eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
|
||||
insert into t1 values (40,2,"fffffffffffffffffffffffffffffffffffffffffff");
|
||||
insert into t1 values (50,1,"ggggggggggggggggggggggggggggggggggggggggggg");
|
||||
insert into t1 values (60,2,"hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
|
||||
insert into t1 values (70,1,"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
|
||||
insert into t1 values (80,22,"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj");
|
||||
insert into t1 values (90,11,"kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk");
|
||||
|
||||
--echo ** connection thread2
|
||||
#connect (thread2, localhost, mysqltest,,);
|
||||
connection thread2;
|
||||
begin;
|
||||
send delete from t1 where tipo=2;
|
||||
sleep 1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
begin;
|
||||
--echo ** Update on t1 will cause a table scan which will be blocked because
|
||||
--echo ** the previously initiated table scan applied exclusive key locks on
|
||||
--echo ** all primary keys.
|
||||
--echo ** Not so if innodb_locks_unsafe_for_binlog is set. The locks that
|
||||
--echo ** do not match the WHERE condition are released.
|
||||
if ($keep_locks)
|
||||
{
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
update t1 set tipo=1 where tipo=22;
|
||||
}
|
||||
if (!$keep_locks)
|
||||
{
|
||||
update t1 set tipo=1 where tipo=22;
|
||||
}
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
send commit;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
commit;
|
||||
|
||||
--echo ** connection thread2
|
||||
connection thread2;
|
||||
reap;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection thread1
|
||||
connection thread1;
|
||||
select * from t1;
|
||||
|
||||
--echo ** connection default
|
||||
connection default;
|
||||
drop table t1;
|
||||
|
||||
|
||||
disconnect thread1;
|
||||
disconnect thread2;
|
||||
|
||||
|
@ -136,7 +136,7 @@ connect (user3,localhost,mysqltest_3,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK);
|
||||
connection user3;
|
||||
select "user3";
|
||||
--replace_result 127.0.0.1 localhost
|
||||
--error ER_COLUMNACCESS_DENIED_ERROR
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
select * from t1;
|
||||
select a from t1;
|
||||
--replace_result 127.0.0.1 localhost
|
||||
|
16
mysql-test/include/have_32bit.inc
Normal file
16
mysql-test/include/have_32bit.inc
Normal file
@ -0,0 +1,16 @@
|
||||
# Created by Horst Hunger 2008-04-15
|
||||
# see also have_64bit.inc
|
||||
|
||||
--disable_query_log
|
||||
--disable_warnings
|
||||
let $save = `SELECT @@global.sort_buffer_size`;
|
||||
SET @@global.sort_buffer_size = 4294967296;
|
||||
let $mach32 = `SELECT @@global.sort_buffer_size <= 4294967295`;
|
||||
eval SET @@global.sort_buffer_size = $save;
|
||||
--enable_warnings
|
||||
--enable_query_log
|
||||
if (!$mach32)
|
||||
{
|
||||
skip Need a 32 bit machine;
|
||||
}
|
||||
|
14
mysql-test/include/have_64bit.inc
Normal file
14
mysql-test/include/have_64bit.inc
Normal file
@ -0,0 +1,14 @@
|
||||
# Created by Horst Hunger 2008-04-15
|
||||
# see also have_32bit.inc
|
||||
|
||||
--disable_query_log
|
||||
let $save = `SELECT @@session.sort_buffer_size`;
|
||||
SET @@session.sort_buffer_size = 4294967296;
|
||||
let $mach64 = `SELECT @@session.sort_buffer_size > 4294967295`;
|
||||
eval SET @@session.sort_buffer_size = $save;
|
||||
--enable_query_log
|
||||
if (!$mach64)
|
||||
{
|
||||
skip Need a 64 bit machine;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_big5.require
|
||||
disable_query_log;
|
||||
show collation like "big5_chinese_ci";
|
||||
show collation like 'big5_chinese_ci';
|
||||
enable_query_log;
|
||||
|
@ -2,5 +2,5 @@
|
||||
|
||||
-- require r/have_binlog_format_mixed.require
|
||||
disable_query_log;
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
enable_query_log;
|
||||
|
@ -3,5 +3,5 @@
|
||||
--require r/have_binlog_format_row.require
|
||||
--disable_query_log
|
||||
--replace_result MIXED ROW
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
--enable_query_log
|
||||
|
@ -4,5 +4,5 @@ source include/have_log_bin.inc;
|
||||
--require r/have_binlog_format_statement.require
|
||||
--disable_query_log
|
||||
--replace_result MIXED STATEMENT
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
--enable_query_log
|
||||
|
@ -2,5 +2,5 @@
|
||||
|
||||
-- require r/have_binlog_format_row.require
|
||||
disable_query_log;
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
enable_query_log;
|
||||
|
@ -3,5 +3,5 @@
|
||||
-- require r/have_binlog_format_statement.require
|
||||
--disable_query_log
|
||||
--replace_result ROW STATEMENT
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
--enable_query_log
|
||||
|
@ -2,5 +2,5 @@
|
||||
|
||||
-- require r/have_binlog_format_statement.require
|
||||
disable_query_log;
|
||||
show variables like "binlog_format";
|
||||
show variables like 'binlog_format';
|
||||
enable_query_log;
|
||||
|
@ -3,5 +3,5 @@
|
||||
#
|
||||
--require r/have_bug25714.require
|
||||
disable_query_log;
|
||||
eval select LENGTH("$MYSQL_BUG25714") > 0 as "have_bug25714_exe";
|
||||
eval select LENGTH('$MYSQL_BUG25714') > 0 as 'have_bug25714_exe';
|
||||
enable_query_log;
|
||||
|
4
mysql-test/include/have_case_insensitive_file_system.inc
Normal file
4
mysql-test/include/have_case_insensitive_file_system.inc
Normal file
@ -0,0 +1,4 @@
|
||||
--require r/case_insensitive_file_system.require
|
||||
--disable_query_log
|
||||
show variables like "lower_case_file_system";
|
||||
--enable_query_log
|
@ -1,4 +1,4 @@
|
||||
--require r/case_sensitive_file_system.require
|
||||
--disable_query_log
|
||||
show variables like "lower_case_file_system";
|
||||
show variables like 'lower_case_file_system';
|
||||
--enable_query_log
|
||||
|
@ -1,4 +1,4 @@
|
||||
--require r/have_community_features.require
|
||||
--disable_query_log
|
||||
show variables like "have_community_features";
|
||||
show variables like 'have_community_features';
|
||||
--enable_query_log
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_compress.require
|
||||
disable_query_log;
|
||||
show variables like "have_compress";
|
||||
show variables like 'have_compress';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_cp1250_ch.require
|
||||
disable_query_log;
|
||||
show collation like "cp1250_czech_cs";
|
||||
show collation like 'cp1250_czech_cs';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_cp932.require
|
||||
disable_query_log;
|
||||
show collation like "cp932_japanese_ci";
|
||||
show collation like 'cp932_japanese_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_crypt.require
|
||||
disable_query_log;
|
||||
show variables like "have_crypt";
|
||||
show variables like 'have_crypt';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_debug.require
|
||||
disable_query_log;
|
||||
select (version() like "%debug%") as debug;
|
||||
select (version() like '%debug%') as debug;
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_eucjpms.require
|
||||
disable_query_log;
|
||||
show collation like "eucjpms_japanese_ci";
|
||||
show collation like 'eucjpms_japanese_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_euckr.require
|
||||
disable_query_log;
|
||||
show collation like "euckr_korean_ci";
|
||||
show collation like 'euckr_korean_ci';
|
||||
enable_query_log;
|
||||
|
@ -4,7 +4,7 @@
|
||||
#
|
||||
--require r/have_dynamic_loading.require
|
||||
disable_query_log;
|
||||
show variables like "have_dynamic_loading";
|
||||
show variables like 'have_dynamic_loading';
|
||||
enable_query_log;
|
||||
|
||||
#
|
||||
@ -12,5 +12,5 @@ enable_query_log;
|
||||
#
|
||||
--require r/have_example_plugin.require
|
||||
disable_query_log;
|
||||
eval select LENGTH("$EXAMPLE_PLUGIN") > 0 as "have_example_plugin";
|
||||
eval select LENGTH('$EXAMPLE_PLUGIN') > 0 as 'have_example_plugin';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_gb2312.require
|
||||
disable_query_log;
|
||||
show collation like "gb2312_chinese_ci";
|
||||
show collation like 'gb2312_chinese_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_gbk.require
|
||||
disable_query_log;
|
||||
show collation like "gbk_chinese_ci";
|
||||
show collation like 'gbk_chinese_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
--require r/have_geometry.require
|
||||
--disable_query_log
|
||||
show variables like "have_geometry";
|
||||
show variables like 'have_geometry';
|
||||
--enable_query_log
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_latin2_ch.require
|
||||
disable_query_log;
|
||||
show collation like "latin2_czech_cs";
|
||||
show collation like 'latin2_czech_cs';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_log_bin.require
|
||||
disable_query_log;
|
||||
show variables like "log_bin";
|
||||
show variables like 'log_bin';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
--require r/lowercase0.require
|
||||
--disable_query_log
|
||||
show variables like "lower_case_%";
|
||||
show variables like "lower_case_table_names";
|
||||
--enable_query_log
|
||||
|
4
mysql-test/include/have_lowercase2.inc
Normal file
4
mysql-test/include/have_lowercase2.inc
Normal file
@ -0,0 +1,4 @@
|
||||
--require r/lowercase2.require
|
||||
--disable_query_log
|
||||
show variables like 'lower_case_table_names';
|
||||
--enable_query_log
|
@ -1,4 +1,4 @@
|
||||
--require r/have_ndbapi_examples.require
|
||||
disable_query_log;
|
||||
eval select LENGTH("$MY_NDB_EXAMPLES_BINARY") > 0 as "have_ndb_example";
|
||||
eval select LENGTH('$MY_NDB_EXAMPLES_BINARY') > 0 as 'have_ndb_example';
|
||||
enable_query_log;
|
||||
|
@ -1,5 +1,5 @@
|
||||
-- require r/have_outfile.require
|
||||
disable_query_log;
|
||||
select load_file(concat(@tmpdir,"/outfile.test"));
|
||||
select load_file(concat(@tmpdir,'/outfile.test'));
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/outfile.test
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_partition.require
|
||||
disable_query_log;
|
||||
show variables like "have_partitioning";
|
||||
show variables like 'have_partitioning';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_query_cache.require
|
||||
disable_query_log;
|
||||
show variables like "have_query_cache";
|
||||
show variables like 'have_query_cache';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_sjis.require
|
||||
disable_query_log;
|
||||
show collation like "sjis_japanese_ci";
|
||||
show collation like 'sjis_japanese_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_ssl.require
|
||||
disable_query_log;
|
||||
show variables like "have_ssl";
|
||||
show variables like 'have_ssl';
|
||||
enable_query_log;
|
||||
|
@ -6,5 +6,5 @@
|
||||
-- require r/have_symlink.require
|
||||
|
||||
disable_query_log;
|
||||
show variables like "have_symlink";
|
||||
show variables like 'have_symlink';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_tis620.require
|
||||
disable_query_log;
|
||||
show collation like "tis620_thai_ci";
|
||||
show collation like 'tis620_thai_ci';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_ucs2.require
|
||||
disable_query_log;
|
||||
show collation like "ucs2_general_ci";
|
||||
show collation like 'ucs2_general_ci';
|
||||
enable_query_log;
|
||||
|
@ -4,7 +4,7 @@
|
||||
#
|
||||
--require r/have_dynamic_loading.require
|
||||
disable_query_log;
|
||||
show variables like "have_dynamic_loading";
|
||||
show variables like 'have_dynamic_loading';
|
||||
enable_query_log;
|
||||
|
||||
#
|
||||
@ -12,5 +12,5 @@ enable_query_log;
|
||||
#
|
||||
--require r/have_udf_example.require
|
||||
disable_query_log;
|
||||
eval select LENGTH("$UDF_EXAMPLE_LIB") > 0 as "have_udf_example_lib";
|
||||
eval select LENGTH('$UDF_EXAMPLE_LIB') > 0 as 'have_udf_example_lib';
|
||||
enable_query_log;
|
||||
|
@ -1,4 +1,4 @@
|
||||
-- require r/have_ujis.require
|
||||
disable_query_log;
|
||||
show collation like "ujis_japanese_ci";
|
||||
show collation like 'ujis_japanese_ci';
|
||||
enable_query_log;
|
||||
|
5
mysql-test/include/is_embedded.inc
Normal file
5
mysql-test/include/is_embedded.inc
Normal file
@ -0,0 +1,5 @@
|
||||
-- require r/is_embedded.require
|
||||
disable_query_log;
|
||||
select version() like '%embedded%' as 'have_embedded';
|
||||
enable_query_log;
|
||||
|
34
mysql-test/include/linux_sys_vars.inc
Normal file
34
mysql-test/include/linux_sys_vars.inc
Normal file
@ -0,0 +1,34 @@
|
||||
#
|
||||
# This file contains default,min and max values for sys variables for redhat linux
|
||||
#
|
||||
|
||||
--disable_query_log
|
||||
|
||||
SET @default_flush_time = 0;
|
||||
SET @min_flush_time = 0;
|
||||
#SET @max_flush_time = 0;
|
||||
|
||||
SET @default_key_buffer_size = 131072;
|
||||
SET @min_key_buffer_size = 36;
|
||||
|
||||
#SET @default_join_buffer_size = 131072;
|
||||
#SET @min_join_buffer_size = 8200;
|
||||
#SET @max_join_buffer_size = 4294967295;
|
||||
|
||||
SET @default_max_join_size = 4294967295;
|
||||
SET @min_max_join_size = 1;
|
||||
SET @max_max_join_size = 4294967295;
|
||||
|
||||
SET @default_sql_max_join_size = 4294967295;
|
||||
SET @min_sql_max_join_size = 1;
|
||||
SET @max_sql_max_join_size = 4294967295;
|
||||
|
||||
SET @default_sql_select_limit = 4294967295;
|
||||
SET @min_sql_select_limit = 0;
|
||||
SET @max_sql_select_limit = 4294967295;
|
||||
|
||||
SET @default_wait_timeout= 28800;
|
||||
SET @min_wait_timeout= 1;
|
||||
SET @max_wait_timeout= 31536000;
|
||||
|
||||
--enable_query_log
|
15
mysql-test/include/load_sysvars.inc
Normal file
15
mysql-test/include/load_sysvars.inc
Normal file
@ -0,0 +1,15 @@
|
||||
#
|
||||
# This script is included by tests of system variables to include system
|
||||
# dependant values for the variables: default, minimum and maximum values
|
||||
#
|
||||
|
||||
if (`SELECT convert(@@version_compile_os using latin1)
|
||||
IN ('Win32','Win64','Windows')`)
|
||||
{
|
||||
--source include/windows_sys_vars.inc
|
||||
}
|
||||
if (!`SELECT convert(@@version_compile_os using latin1)
|
||||
IN ('Win32','Win64','Windows')`)
|
||||
{
|
||||
--source include/linux_sys_vars.inc
|
||||
}
|
@ -3,7 +3,7 @@ connection slave;
|
||||
#(the server was started with skip-slave-start)
|
||||
--disable_warnings
|
||||
stop slave;
|
||||
--wait_for_slave_to_stop
|
||||
source include/wait_for_slave_to_stop.inc;
|
||||
--enable_warnings
|
||||
connection master;
|
||||
--disable_warnings
|
||||
@ -20,3 +20,4 @@ reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
--enable_warnings
|
||||
start slave;
|
||||
source include/wait_for_slave_to_start.inc;
|
||||
|
@ -1103,6 +1103,24 @@ set @my_innodb_commit_concurrency=@@global.innodb_commit_concurrency;
|
||||
set global innodb_commit_concurrency=0;
|
||||
set global innodb_commit_concurrency=@my_innodb_commit_concurrency;
|
||||
|
||||
#
|
||||
# Bug #37830: ORDER BY ASC/DESC - no difference
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a int, b int, c int, PRIMARY KEY (a), KEY t1_b (b))
|
||||
ENGINE=InnoDB;
|
||||
|
||||
INSERT INTO t1 (a,b,c) VALUES (1,1,1), (2,1,1), (3,1,1), (4,1,1);
|
||||
INSERT INTO t1 (a,b,c) SELECT a+4,b,c FROM t1;
|
||||
|
||||
# should be range access
|
||||
EXPLAIN SELECT a, b, c FROM t1 WHERE b = 1 ORDER BY a DESC LIMIT 5;
|
||||
|
||||
# should produce '8 7 6 5 4' for a
|
||||
SELECT a, b, c FROM t1 WHERE b = 1 ORDER BY a DESC LIMIT 5;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
# Fix for BUG#19243 "wrong LAST_INSERT_ID() after ON DUPLICATE KEY
|
||||
@ -1309,6 +1327,7 @@ SELECT * FROM t1;
|
||||
|
||||
--echo # Switch to connection con2
|
||||
connection con2;
|
||||
--reap
|
||||
SELECT * FROM t1;
|
||||
|
||||
--echo # Switch to connection con1
|
||||
@ -1427,29 +1446,31 @@ DROP TABLE t1;
|
||||
# Bug#21704: Renaming column does not update FK definition.
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1(id INT PRIMARY KEY)
|
||||
ENGINE=innodb;
|
||||
|
||||
CREATE TABLE t2(
|
||||
t1_id INT PRIMARY KEY,
|
||||
CONSTRAINT fk1 FOREIGN KEY (t1_id) REFERENCES t1(id))
|
||||
ENGINE=innodb;
|
||||
|
||||
--echo
|
||||
|
||||
--disable_result_log
|
||||
--error ER_ERROR_ON_RENAME
|
||||
ALTER TABLE t1 CHANGE id id2 INT;
|
||||
--enable_result_log
|
||||
|
||||
--echo
|
||||
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# --disable_warnings
|
||||
# DROP TABLE IF EXISTS t1;
|
||||
# DROP TABLE IF EXISTS t2;
|
||||
# --enable_warnings
|
||||
#
|
||||
# CREATE TABLE t1(id INT PRIMARY KEY)
|
||||
# ENGINE=innodb;
|
||||
#
|
||||
# CREATE TABLE t2(
|
||||
# t1_id INT PRIMARY KEY,
|
||||
# CONSTRAINT fk1 FOREIGN KEY (t1_id) REFERENCES t1(id))
|
||||
# ENGINE=innodb;
|
||||
#
|
||||
# --echo
|
||||
#
|
||||
# --disable_result_log
|
||||
# --error ER_ERROR_ON_RENAME
|
||||
# ALTER TABLE t1 CHANGE id id2 INT;
|
||||
# --enable_result_log
|
||||
#
|
||||
# --echo
|
||||
#
|
||||
# DROP TABLE t2;
|
||||
# DROP TABLE t1;
|
||||
#
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
1922
mysql-test/include/mysqlbinlog_row_engine.inc
Normal file
1922
mysql-test/include/mysqlbinlog_row_engine.inc
Normal file
File diff suppressed because it is too large
Load Diff
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;
|
@ -41,18 +41,17 @@ let $wait_condition=
|
||||
|
||||
# check that table t1 contains something
|
||||
--echo "Checking event data on the master"
|
||||
--enable_info
|
||||
--replace_column 3 TIMESTAMP
|
||||
SELECT * FROM t1 ORDER BY id;
|
||||
--disable_info
|
||||
let $events_done=`SELECT count(*) FROM t1 id`;
|
||||
--disable_query_log
|
||||
eval SELECT $events_done > 0 as ONE;
|
||||
--enable_query_log
|
||||
|
||||
sync_slave_with_master;
|
||||
|
||||
--echo "Checking event data on the slave"
|
||||
--enable_info
|
||||
--replace_column 3 TIMESTAMP
|
||||
SELECT * FROM t1 ORDER BY id;
|
||||
--disable_info
|
||||
--disable_query_log
|
||||
eval SELECT count(*) - $events_done as ZERO FROM t1 id;
|
||||
--enable_query_log
|
||||
|
||||
--echo "Checking event is inactive on slave"
|
||||
SELECT db, name, status, originator FROM mysql.event WHERE db = 'test' AND name = 'justonce';
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user