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