List:Commits« Previous MessageNext Message »
From:Joerg Bruehe Date:October 4 2008 10:25am
Subject:bzr commit into mysql-5.1 branch (joerg:2688)
View as plain text  
#At file:///MySQL/REPO/V51/push-5.1/

 2688 Joerg Bruehe	2008-10-04 [merge]
      Merge main 5.1 branch -> 5.1-build (team tree).
removed:
  extra/yassl/taocrypt/taocrypt.vcproj
  extra/yassl/yassl.vcproj
  include/mysql_h.ic
  mysql-test/suite/rpl/t/rpl_view-slave.opt
  server-tools/instance-manager/mysqlmanager.vcproj
added:
  include/mysql.h.pp
  include/mysql/plugin.h.pp
  mysql-test/r/skip_log_bin.result
  mysql-test/suite/binlog/r/binlog_grant.result
  mysql-test/suite/binlog/t/binlog_grant.test
  mysql-test/suite/rpl/r/rpl_binlog_query_filter_rules.result
  mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules-master.opt
  mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules.test
  mysql-test/t/skip_log_bin-master.opt
  mysql-test/t/skip_log_bin.test
  sql/mysql_priv.h.pp
  win/build-vs9.bat
  win/build-vs9_x64.bat
modified:
  CMakeLists.txt
  Makefile.am
  configure.in
  extra/yassl/Makefile.am
  extra/yassl/taocrypt/Makefile.am
  include/Makefile.am
  libmysql/dll.c
  mysql-test/extra/rpl_tests/rpl_ddl.test
  mysql-test/extra/rpl_tests/rpl_log.test
  mysql-test/extra/rpl_tests/rpl_row_basic.test
  mysql-test/include/grant_cache.inc
  mysql-test/r/create.result
  mysql-test/r/default.result
  mysql-test/r/func_regexp.result
  mysql-test/r/grant2.result
  mysql-test/r/grant_cache_no_prot.result
  mysql-test/r/grant_cache_ps_prot.result
  mysql-test/r/status.result
  mysql-test/r/type_datetime.result
  mysql-test/r/type_set.result
  mysql-test/r/view_grant.result
  mysql-test/suite/funcs_1/datadict/processlist_priv.inc
  mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result
  mysql-test/suite/funcs_1/r/processlist_priv_ps.result
  mysql-test/suite/rpl/r/rpl_row_basic_2myisam.result
  mysql-test/suite/rpl/r/rpl_row_basic_3innodb.result
  mysql-test/suite/rpl/r/rpl_row_log.result
  mysql-test/suite/rpl/r/rpl_row_log_innodb.result
  mysql-test/suite/rpl/r/rpl_stm_log.result
  mysql-test/suite/rpl/t/rpl_stm_log-slave.opt
  mysql-test/suite/rpl_ndb/r/rpl_ndb_log.result
  mysql-test/suite/rpl_ndb/r/rpl_row_basic_7ndb.result
  mysql-test/t/create.test
  mysql-test/t/default.test
  mysql-test/t/func_regexp.test
  mysql-test/t/grant2.test
  mysql-test/t/partition_not_windows.test
  mysql-test/t/status.test
  mysql-test/t/type_datetime.test
  mysql-test/t/type_set.test
  mysql-test/t/view_grant.test
  scripts/mysql_install_db.sh
  sql/handler.cc
  sql/item.cc
  sql/item_cmpfunc.cc
  sql/item_cmpfunc.h
  sql/log.cc
  sql/log.h
  sql/log_event.cc
  sql/set_var.cc
  sql/set_var.h
  sql/sql_acl.cc
  sql/sql_base.cc
  sql/sql_cache.cc
  sql/sql_class.cc
  sql/sql_class.h
  sql/sql_derived.cc
  sql/sql_insert.cc
  sql/sql_parse.cc
  sql/sql_yacc.yy
  sql/table.cc
  sql/table.h
  zlib/zutil.h

=== modified file 'CMakeLists.txt'
--- a/CMakeLists.txt	2008-03-27 23:46:43 +0000
+++ b/CMakeLists.txt	2008-09-01 09:48:21 +0000
@@ -108,18 +108,18 @@ SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAK
 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4800 /wd4805")
 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4800 /wd4805")
 
-IF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
+# Disable warnings in Visual Studio 8 and above
+IF(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7")
     SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4996")
     SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /wd4996")
     SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /wd4996")
     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /wd4996")
     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /wd4996")
     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /wd4996")
-ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
-
-IF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR 
-   CMAKE_GENERATOR MATCHES "Visual Studio 8")
+ENDIF(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7")
 
+# Settings for Visual Studio 7 and above.  
+IF(MSVC)
     # replace /MDd with /MTd
     STRING(REPLACE "/MD"  "/MT"  CMAKE_C_FLAGS_RELEASE          ${CMAKE_C_FLAGS_RELEASE})
     STRING(REPLACE "/MD"  "/MT"  CMAKE_C_FLAGS_RELWITHDEBINFO   ${CMAKE_C_FLAGS_RELWITHDEBINFO})
@@ -149,9 +149,7 @@ IF(CMAKE_GENERATOR MATCHES "Visual Studi
     IF(NOT tmp_manifest)
         SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO")
     ENDIF(NOT tmp_manifest)
-
-ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR 
-      CMAKE_GENERATOR MATCHES "Visual Studio 8")
+ENDIF(MSVC)
 
 IF(WIN32)
   ADD_DEFINITIONS("-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE")

=== modified file 'Makefile.am'
--- a/Makefile.am	2008-08-20 13:06:22 +0000
+++ b/Makefile.am	2008-09-04 11:53:16 +0000
@@ -59,6 +59,8 @@ dist-hook:
 		--srcdir=$(top_srcdir)
 	storage/myisam/myisamchk --silent --fast $(distdir)/win/data/mysql/*.MYI
 
+all-local:		@ABI_CHECK@	
+
 tags:
 	support-files/build-tags
 
@@ -232,5 +234,81 @@ test-full-qa:
 	    test-binlog-statement test-ext test-fast-view \
 	        test-fast-cursor test-unit
 
+#
+# Headers which need to be checked for abi/api compatibility.
+# API_PREPROCESSOR_HEADER will be used until mysql_priv.h stablizes
+# after which TEST_PREPROCESSOR_HEADER will be used.
+#
+
+API_PREPROCESSOR_HEADER = $(top_srcdir)/include/mysql/plugin.h \
+                           $(top_srcdir)/include/mysql.h
+
+TEST_PREPROCESSOR_HEADER = $(top_srcdir)/include/mysql/plugin.h \
+                            $(top_srcdir)/sql/mysql_priv.h \
+                            $(top_srcdir)/include/mysql.h
+
+#
+# Rules for checking that the abi/api has not changed.
+#
+# The following steps are followed in the do_abi_check rule below
+#
+# 1) Generate preprocessor output for the files that need to
+#    be tested for abi/api changes. use -nostdinc to prevent
+#    generation of preprocessor output for system headers. This
+#    results in messages in stderr saying that these headers
+#    were not found. Redirect the stderr output to /dev/null
+#    to prevent seeing these messages.
+# 2) sed the output to 
+#    2.1) remove blank lines and lines that begin with "# "
+#    2.2) When gcc -E is run on the Mac OS  and solaris sparc platforms it
+#         introduces a line of output that shows up as a difference between
+#         the .pp and .out files. Remove these OS specific preprocessor text
+#         inserted by the preprocessor.
+# 3) diff the generated file and the canons (.pp files already in
+#    the repository).
+# 4) delete the .out file that is generated.
+#
+# If the diff fails, the generated file is not removed. This will
+# be useful for analysis of ABI differences (e.g. using a visual
+# diff tool).
+#
+# A ABI change that causes a build to fail will always be accompanied
+# by new canons (.out files). The .out files that are not removed will
+# be replaced as the new .pp files.
+#
+# e.g. If include/mysql/plugin.h has an ABI change then this rule would
+# leave a <build directory>/abi_check.out file.
+#
+# A developer with a justified API change will then do a
+# mv <build directory>/abi_check.out include/mysql/plugin.pp 
+# to replace the old canons with the new ones.
+#
+
+abi_check:	$(API_PREPROCESSOR_HEADER)
+	$(MAKE) abi_headers="$^" do_abi_check
+
+abi_check_all:	$(TEST_PREPROCESSOR_HEADER)
+	$(MAKE) abi_headers="$^" do_abi_check
+
+do_abi_check:
+	set -ex; \
+	for file in $(abi_headers); do \
+	         @CC@ -E -nostdinc -dI \
+	                  -I$(top_srcdir)/include \
+	                  -I$(top_srcdir)/include/mysql \
+	                  -I$(top_srcdir)/sql \
+	                  -I$(top_builddir)/include \
+	                  -I$(top_builddir)/include/mysql \
+	                  -I$(top_builddir)/sql \
+	                                 $$file 2>/dev/null | \
+	                  @SED@ -e '/^# /d' \
+	                            -e '/^[ 	]*$$/d' \
+	                            -e '/^#pragma GCC set_debug_pwd/d' \
+	                            -e '/^#ident/d' > \
+	                                       $(top_builddir)/abi_check.out; \
+	                  @DIFF@ -w $$file.pp $(top_builddir)/abi_check.out; \
+	                  @RM@ $(top_builddir)/abi_check.out; \
+	done
+
 # Don't update the files from bitkeeper
 %::SCCS/s.%

=== modified file 'configure.in'
--- a/configure.in	2008-09-11 12:39:35 +0000
+++ b/configure.in	2008-10-04 10:23:43 +0000
@@ -419,6 +419,7 @@ AC_PATH_PROG(SED, sed, sed)
 AC_PATH_PROG(CMP, cmp, cmp)
 AC_PATH_PROG(CHMOD, chmod, chmod)
 AC_PATH_PROG(HOSTNAME, hostname, hostname)
+AC_PATH_PROG(DIFF, diff, diff)
 # Check for a GNU tar named 'gtar', or 'gnutar' (MacOS X) and
 # fall back to 'tar' otherwise and hope that it's a GNU tar as well
 AC_CHECK_PROGS(TAR, gnutar gtar tar)
@@ -443,25 +444,16 @@ AC_SUBST(HOSTNAME)
 AC_SUBST(PERL)
 AC_SUBST(PERL5)
 
-# icheck, used for ABI check
-AC_PATH_PROG(ICHECK, icheck, no)
-# "icheck" is also the name of a file system check program on Tru64.
-# Verify the program found is really the interface checker.
-if test "x$ICHECK" != "xno"
-then
-  AC_MSG_CHECKING(if $ICHECK works as expected)
-  echo "int foo;" > conftest.h
-  $ICHECK --canonify -o conftest.ic conftest.h 2>/dev/null
-  if test -f "conftest.ic"
-  then
-    AC_MSG_RESULT(yes)
-  else
-    AC_MSG_RESULT(no)
-    ICHECK=no
-  fi
-  rm -f conftest.ic conftest.h
+# Enable the abi_check rule only if gcc is available
+
+if expr "$CC" : ".*gcc.*"
+then
+  ABI_CHECK="abi_check"
+else
+  ABI_CHECK=""
 fi
-AC_SUBST(ICHECK)
+
+AC_SUBST(ABI_CHECK)
 
 # Lock for PS
 AC_PATH_PROG(PS, ps, ps)

=== modified file 'extra/yassl/Makefile.am'
--- a/extra/yassl/Makefile.am	2006-12-31 00:32:21 +0000
+++ b/extra/yassl/Makefile.am	2008-09-01 21:27:14 +0000
@@ -1,6 +1,5 @@
 SUBDIRS = taocrypt src testsuite
-EXTRA_DIST = yassl.dsp yassl.dsw yassl.vcproj \
-	     CMakeLists.txt
+EXTRA_DIST = CMakeLists.txt
 
 # Don't update the files from bitkeeper
 %::SCCS/s.%

=== modified file 'extra/yassl/taocrypt/Makefile.am'
--- a/extra/yassl/taocrypt/Makefile.am	2006-12-31 00:32:21 +0000
+++ b/extra/yassl/taocrypt/Makefile.am	2008-09-01 21:27:14 +0000
@@ -1,5 +1,5 @@
 SUBDIRS = src test benchmark
-EXTRA_DIST = taocrypt.dsw taocrypt.dsp taocrypt.vcproj CMakeLists.txt $(wildcard mySTL/*.hpp)
+EXTRA_DIST = CMakeLists.txt $(wildcard mySTL/*.hpp)
 
 # Don't update the files from bitkeeper
 %::SCCS/s.%

=== removed file 'extra/yassl/taocrypt/taocrypt.vcproj'
--- a/extra/yassl/taocrypt/taocrypt.vcproj	2007-03-20 16:58:30 +0000
+++ b/extra/yassl/taocrypt/taocrypt.vcproj	1970-01-01 00:00:00 +0000
@@ -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>

=== removed file 'extra/yassl/yassl.vcproj'
--- a/extra/yassl/yassl.vcproj	2007-03-20 16:58:30 +0000
+++ b/extra/yassl/yassl.vcproj	1970-01-01 00:00:00 +0000
@@ -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>

=== modified file 'include/Makefile.am'
--- a/include/Makefile.am	2008-06-18 16:17:15 +0000
+++ b/include/Makefile.am	2008-07-18 13:51:54 +0000
@@ -38,10 +38,11 @@ noinst_HEADERS =	config-win.h config-net
 			atomic/rwlock.h atomic/x86-gcc.h atomic/x86-msvc.h \
 			atomic/gcc_builtins.h my_libwrap.h my_stacktrace.h
 
+EXTRA_DIST =        mysql.h.pp mysql/plugin.h.pp
+
 # Remove built files and the symlinked directories
 CLEANFILES =            $(BUILT_SOURCES) readline openssl
 
-EXTRA_DIST =            mysql_h.ic
 
 # Some include files that may be moved and patched by configure
 DISTCLEANFILES =	sched.h $(CLEANFILES)
@@ -63,18 +64,5 @@ my_config.h: config.h
 dist-hook:
 	$(RM) -f $(distdir)/mysql_version.h $(distdir)/my_config.h
 
-#
-# Rules for checking that ABI has not changed
-#
-
-# Create a icheck file and compare it to the reference
-abi_check: $(HEADERS_ABI) mysql_version.h mysql_h.ic
-	@set -ex; \
-	if [ @ICHECK@ != no ] ; then \
-	  @ICHECK@ --canonify --skip-from-re /usr/ -o $@ $(HEADERS_ABI); \
-	  @ICHECK@ --compare mysql_h.ic $@; \
-	fi; \
-	touch abi_check;
-
 # Don't update the files from bitkeeper
 %::SCCS/s.%

=== added file 'include/mysql.h.pp'
--- a/include/mysql.h.pp	1970-01-01 00:00:00 +0000
+++ b/include/mysql.h.pp	2008-08-08 09:00:05 +0000
@@ -0,0 +1,674 @@
+#include <sys/types.h>
+typedef char my_bool;
+typedef int my_socket;
+#include "mysql_version.h"
+#include "mysql_com.h"
+enum enum_server_command
+{
+  COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY, COM_FIELD_LIST,
+  COM_CREATE_DB, COM_DROP_DB, COM_REFRESH, COM_SHUTDOWN, COM_STATISTICS,
+  COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL, COM_DEBUG, COM_PING,
+  COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP,
+  COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE,
+  COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE,
+  COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON,
+  COM_END
+};
+struct st_vio;
+typedef struct st_vio Vio;
+typedef struct st_net {
+  Vio *vio;
+  unsigned char *buff,*buff_end,*write_pos,*read_pos;
+  my_socket fd;
+  unsigned long remain_in_buf,length, buf_length, where_b;
+  unsigned long max_packet,max_packet_size;
+  unsigned int pkt_nr,compress_pkt_nr;
+  unsigned int write_timeout, read_timeout, retry_count;
+  int fcntl;
+  unsigned int *return_status;
+  unsigned char reading_or_writing;
+  char save_char;
+  my_bool unused0;
+  my_bool unused;
+  my_bool compress;
+  my_bool unused1;
+  unsigned char *query_cache_query;
+  unsigned int last_errno;
+  unsigned char error;
+  my_bool unused2;
+  my_bool return_errno;
+  char last_error[512];
+  char sqlstate[5 +1];
+  void *extension;
+} NET;
+enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
+   MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,
+   MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
+   MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP,
+   MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,
+   MYSQL_TYPE_DATE, MYSQL_TYPE_TIME,
+   MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
+   MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
+   MYSQL_TYPE_BIT,
+                        MYSQL_TYPE_NEWDECIMAL=246,
+   MYSQL_TYPE_ENUM=247,
+   MYSQL_TYPE_SET=248,
+   MYSQL_TYPE_TINY_BLOB=249,
+   MYSQL_TYPE_MEDIUM_BLOB=250,
+   MYSQL_TYPE_LONG_BLOB=251,
+   MYSQL_TYPE_BLOB=252,
+   MYSQL_TYPE_VAR_STRING=253,
+   MYSQL_TYPE_STRING=254,
+   MYSQL_TYPE_GEOMETRY=255
+};
+enum mysql_enum_shutdown_level {
+  SHUTDOWN_DEFAULT = 0,
+  SHUTDOWN_WAIT_CONNECTIONS= (unsigned char)(1 << 0),
+  SHUTDOWN_WAIT_TRANSACTIONS= (unsigned char)(1 << 1),
+  SHUTDOWN_WAIT_UPDATES= (unsigned char)(1 << 3),
+  SHUTDOWN_WAIT_ALL_BUFFERS= ((unsigned char)(1 << 3) << 1),
+  SHUTDOWN_WAIT_CRITICAL_BUFFERS= ((unsigned char)(1 << 3) << 1) + 1,
+  KILL_QUERY= 254,
+  KILL_CONNECTION= 255
+};
+enum enum_cursor_type
+{
+  CURSOR_TYPE_NO_CURSOR= 0,
+  CURSOR_TYPE_READ_ONLY= 1,
+  CURSOR_TYPE_FOR_UPDATE= 2,
+  CURSOR_TYPE_SCROLLABLE= 4
+};
+enum enum_mysql_set_option
+{
+  MYSQL_OPTION_MULTI_STATEMENTS_ON,
+  MYSQL_OPTION_MULTI_STATEMENTS_OFF
+};
+my_bool my_net_init(NET *net, Vio* vio);
+void my_net_local_init(NET *net);
+void net_end(NET *net);
+  void net_clear(NET *net, my_bool clear_buffer);
+my_bool net_realloc(NET *net, size_t length);
+my_bool net_flush(NET *net);
+my_bool my_net_write(NET *net,const unsigned char *packet, size_t len);
+my_bool net_write_command(NET *net,unsigned char command,
+     const unsigned char *header, size_t head_len,
+     const unsigned char *packet, size_t len);
+int net_real_write(NET *net,const unsigned char *packet, size_t len);
+unsigned long my_net_read(NET *net);
+struct sockaddr;
+int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen,
+        unsigned int timeout);
+struct rand_struct {
+  unsigned long seed1,seed2,max_value;
+  double max_value_dbl;
+};
+enum Item_result {STRING_RESULT=0, REAL_RESULT, INT_RESULT, ROW_RESULT,
+                  DECIMAL_RESULT};
+typedef struct st_udf_args
+{
+  unsigned int arg_count;
+  enum Item_result *arg_type;
+  char **args;
+  unsigned long *lengths;
+  char *maybe_null;
+  char **attributes;
+  unsigned long *attribute_lengths;
+  void *extension;
+} UDF_ARGS;
+typedef struct st_udf_init
+{
+  my_bool maybe_null;
+  unsigned int decimals;
+  unsigned long max_length;
+  char *ptr;
+  my_bool const_item;
+  void *extension;
+} UDF_INIT;
+void randominit(struct rand_struct *, unsigned long seed1,
+                unsigned long seed2);
+double my_rnd(struct rand_struct *);
+void create_random_string(char *to, unsigned int length, struct rand_struct *rand_st);
+void hash_password(unsigned long *to, const char *password, unsigned int password_len);
+void make_scrambled_password_323(char *to, const char *password);
+void scramble_323(char *to, const char *message, const char *password);
+my_bool check_scramble_323(const char *, const char *message,
+                           unsigned long *salt);
+void get_salt_from_password_323(unsigned long *res, const char *password);
+void make_password_from_salt_323(char *to, const unsigned long *salt);
+void make_scrambled_password(char *to, const char *password);
+void scramble(char *to, const char *message, const char *password);
+my_bool check_scramble(const char *reply, const char *message,
+                       const unsigned char *hash_stage2);
+void get_salt_from_password(unsigned char *res, const char *password);
+void make_password_from_salt(char *to, const unsigned char *hash_stage2);
+char *octet2hex(char *to, const char *str, unsigned int len);
+char *get_tty_password(const char *opt_message);
+const char *mysql_errno_to_sqlstate(unsigned int mysql_errno);
+my_bool my_thread_init(void);
+void my_thread_end(void);
+#include "mysql_time.h"
+enum enum_mysql_timestamp_type
+{
+  MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1,
+  MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2
+};
+typedef struct st_mysql_time
+{
+  unsigned int year, month, day, hour, minute, second;
+  unsigned long second_part;
+  my_bool neg;
+  enum enum_mysql_timestamp_type time_type;
+} MYSQL_TIME;
+#include "my_list.h"
+typedef struct st_list {
+  struct st_list *prev,*next;
+  void *data;
+} LIST;
+typedef int (*list_walk_action)(void *,void *);
+extern LIST *list_add(LIST *root,LIST *element);
+extern LIST *list_delete(LIST *root,LIST *element);
+extern LIST *list_cons(void *data,LIST *root);
+extern LIST *list_reverse(LIST *root);
+extern void list_free(LIST *root,unsigned int free_data);
+extern unsigned int list_length(LIST *);
+extern int list_walk(LIST *,list_walk_action action,unsigned char * argument);
+extern unsigned int mysql_port;
+extern char *mysql_unix_port;
+typedef struct st_mysql_field {
+  char *name;
+  char *org_name;
+  char *table;
+  char *org_table;
+  char *db;
+  char *catalog;
+  char *def;
+  unsigned long length;
+  unsigned long max_length;
+  unsigned int name_length;
+  unsigned int org_name_length;
+  unsigned int table_length;
+  unsigned int org_table_length;
+  unsigned int db_length;
+  unsigned int catalog_length;
+  unsigned int def_length;
+  unsigned int flags;
+  unsigned int decimals;
+  unsigned int charsetnr;
+  enum enum_field_types type;
+  void *extension;
+} MYSQL_FIELD;
+typedef char **MYSQL_ROW;
+typedef unsigned int MYSQL_FIELD_OFFSET;
+typedef unsigned long long my_ulonglong;
+#include "typelib.h"
+#include "my_alloc.h"
+typedef struct st_used_mem
+{
+  struct st_used_mem *next;
+  unsigned int left;
+  unsigned int size;
+} USED_MEM;
+typedef struct st_mem_root
+{
+  USED_MEM *free;
+  USED_MEM *used;
+  USED_MEM *pre_alloc;
+  size_t min_malloc;
+  size_t block_size;
+  unsigned int block_num;
+  unsigned int first_block_usage;
+  void (*error_handler)(void);
+} MEM_ROOT;
+typedef struct st_typelib {
+  unsigned int count;
+  const char *name;
+  const char **type_names;
+  unsigned int *type_lengths;
+} TYPELIB;
+extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position);
+extern int find_type_or_exit(const char *x, TYPELIB *typelib,
+                             const char *option);
+extern int find_type(char *x, const TYPELIB *typelib, unsigned int full_name);
+extern void make_type(char *to,unsigned int nr,TYPELIB *typelib);
+extern const char *get_type(TYPELIB *typelib,unsigned int nr);
+extern TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from);
+extern TYPELIB sql_protocol_typelib;
+typedef struct st_mysql_rows {
+  struct st_mysql_rows *next;
+  MYSQL_ROW data;
+  unsigned long length;
+} MYSQL_ROWS;
+typedef MYSQL_ROWS *MYSQL_ROW_OFFSET;
+#include "my_alloc.h"
+typedef struct embedded_query_result EMBEDDED_QUERY_RESULT;
+typedef struct st_mysql_data {
+  MYSQL_ROWS *data;
+  struct embedded_query_result *embedded_info;
+  MEM_ROOT alloc;
+  my_ulonglong rows;
+  unsigned int fields;
+  void *extension;
+} MYSQL_DATA;
+enum mysql_option
+{
+  MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE,
+  MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
+  MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE,
+  MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT,
+  MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT,
+  MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
+  MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH,
+  MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT,
+  MYSQL_OPT_SSL_VERIFY_SERVER_CERT
+};
+struct st_mysql_options {
+  unsigned int connect_timeout, read_timeout, write_timeout;
+  unsigned int port, protocol;
+  unsigned long client_flag;
+  char *host,*user,*password,*unix_socket,*db;
+  struct st_dynamic_array *init_commands;
+  char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name;
+  char *ssl_key;
+  char *ssl_cert;
+  char *ssl_ca;
+  char *ssl_capath;
+  char *ssl_cipher;
+  char *shared_memory_base_name;
+  unsigned long max_allowed_packet;
+  my_bool use_ssl;
+  my_bool compress,named_pipe;
+  my_bool rpl_probe;
+  my_bool rpl_parse;
+  my_bool no_master_reads;
+  my_bool separate_thread;
+  enum mysql_option methods_to_use;
+  char *client_ip;
+  my_bool secure_auth;
+  my_bool report_data_truncation;
+  int (*local_infile_init)(void **, const char *, void *);
+  int (*local_infile_read)(void *, char *, unsigned int);
+  void (*local_infile_end)(void *);
+  int (*local_infile_error)(void *, char *, unsigned int);
+  void *local_infile_userdata;
+  void *extension;
+};
+enum mysql_status
+{
+  MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,MYSQL_STATUS_USE_RESULT
+};
+enum mysql_protocol_type
+{
+  MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
+  MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
+};
+enum mysql_rpl_type
+{
+  MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN
+};
+typedef struct character_set
+{
+  unsigned int number;
+  unsigned int state;
+  const char *csname;
+  const char *name;
+  const char *comment;
+  const char *dir;
+  unsigned int mbminlen;
+  unsigned int mbmaxlen;
+} MY_CHARSET_INFO;
+struct st_mysql_methods;
+struct st_mysql_stmt;
+typedef struct st_mysql
+{
+  NET net;
+  unsigned char *connector_fd;
+  char *host,*user,*passwd,*unix_socket,*server_version,*host_info;
+  char *info, *db;
+  struct charset_info_st *charset;
+  MYSQL_FIELD *fields;
+  MEM_ROOT field_alloc;
+  my_ulonglong affected_rows;
+  my_ulonglong insert_id;
+  my_ulonglong extra_info;
+  unsigned long thread_id;
+  unsigned long packet_length;
+  unsigned int port;
+  unsigned long client_flag,server_capabilities;
+  unsigned int protocol_version;
+  unsigned int field_count;
+  unsigned int server_status;
+  unsigned int server_language;
+  unsigned int warning_count;
+  struct st_mysql_options options;
+  enum mysql_status status;
+  my_bool free_me;
+  my_bool reconnect;
+  char scramble[20 +1];
+  my_bool rpl_pivot;
+  struct st_mysql* master, *next_slave;
+  struct st_mysql* last_used_slave;
+  struct st_mysql* last_used_con;
+  LIST *stmts;
+  const struct st_mysql_methods *methods;
+  void *thd;
+  my_bool *unbuffered_fetch_owner;
+  char *info_buffer;
+  void *extension;
+} MYSQL;
+typedef struct st_mysql_res {
+  my_ulonglong row_count;
+  MYSQL_FIELD *fields;
+  MYSQL_DATA *data;
+  MYSQL_ROWS *data_cursor;
+  unsigned long *lengths;
+  MYSQL *handle;
+  const struct st_mysql_methods *methods;
+  MYSQL_ROW row;
+  MYSQL_ROW current_row;
+  MEM_ROOT field_alloc;
+  unsigned int field_count, current_field;
+  my_bool eof;
+  my_bool unbuffered_fetch_cancelled;
+  void *extension;
+} MYSQL_RES;
+typedef struct st_mysql_manager
+{
+  NET net;
+  char *host, *user, *passwd;
+  char *net_buf, *net_buf_pos, *net_data_end;
+  unsigned int port;
+  int cmd_status;
+  int last_errno;
+  int net_buf_size;
+  my_bool free_me;
+  my_bool eof;
+  char last_error[256];
+  void *extension;
+} MYSQL_MANAGER;
+typedef struct st_mysql_parameters
+{
+  unsigned long *p_max_allowed_packet;
+  unsigned long *p_net_buffer_length;
+  void *extension;
+} MYSQL_PARAMETERS;
+int mysql_server_init(int argc, char **argv, char **groups);
+void mysql_server_end(void);
+MYSQL_PARAMETERS * mysql_get_parameters(void);
+my_bool mysql_thread_init(void);
+void mysql_thread_end(void);
+my_ulonglong mysql_num_rows(MYSQL_RES *res);
+unsigned int mysql_num_fields(MYSQL_RES *res);
+my_bool mysql_eof(MYSQL_RES *res);
+MYSQL_FIELD * mysql_fetch_field_direct(MYSQL_RES *res,
+           unsigned int fieldnr);
+MYSQL_FIELD * mysql_fetch_fields(MYSQL_RES *res);
+MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *res);
+MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *res);
+unsigned int mysql_field_count(MYSQL *mysql);
+my_ulonglong mysql_affected_rows(MYSQL *mysql);
+my_ulonglong mysql_insert_id(MYSQL *mysql);
+unsigned int mysql_errno(MYSQL *mysql);
+const char * mysql_error(MYSQL *mysql);
+const char * mysql_sqlstate(MYSQL *mysql);
+unsigned int mysql_warning_count(MYSQL *mysql);
+const char * mysql_info(MYSQL *mysql);
+unsigned long mysql_thread_id(MYSQL *mysql);
+const char * mysql_character_set_name(MYSQL *mysql);
+int mysql_set_character_set(MYSQL *mysql, const char *csname);
+MYSQL * mysql_init(MYSQL *mysql);
+my_bool mysql_ssl_set(MYSQL *mysql, const char *key,
+          const char *cert, const char *ca,
+          const char *capath, const char *cipher);
+const char * mysql_get_ssl_cipher(MYSQL *mysql);
+my_bool mysql_change_user(MYSQL *mysql, const char *user,
+       const char *passwd, const char *db);
+MYSQL * mysql_real_connect(MYSQL *mysql, const char *host,
+        const char *user,
+        const char *passwd,
+        const char *db,
+        unsigned int port,
+        const char *unix_socket,
+        unsigned long clientflag);
+int mysql_select_db(MYSQL *mysql, const char *db);
+int mysql_query(MYSQL *mysql, const char *q);
+int mysql_send_query(MYSQL *mysql, const char *q,
+      unsigned long length);
+int mysql_real_query(MYSQL *mysql, const char *q,
+     unsigned long length);
+MYSQL_RES * mysql_store_result(MYSQL *mysql);
+MYSQL_RES * mysql_use_result(MYSQL *mysql);
+my_bool mysql_master_query(MYSQL *mysql, const char *q,
+        unsigned long length);
+my_bool mysql_master_send_query(MYSQL *mysql, const char *q,
+      unsigned long length);
+my_bool mysql_slave_query(MYSQL *mysql, const char *q,
+       unsigned long length);
+my_bool mysql_slave_send_query(MYSQL *mysql, const char *q,
+            unsigned long length);
+void mysql_get_character_set_info(MYSQL *mysql,
+                           MY_CHARSET_INFO *charset);
+void
+mysql_set_local_infile_handler(MYSQL *mysql,
+                               int (*local_infile_init)(void **, const char *,
+                            void *),
+                               int (*local_infile_read)(void *, char *,
+       unsigned int),
+                               void (*local_infile_end)(void *),
+                               int (*local_infile_error)(void *, char*,
+        unsigned int),
+                               void *);
+void
+mysql_set_local_infile_default(MYSQL *mysql);
+void mysql_enable_rpl_parse(MYSQL* mysql);
+void mysql_disable_rpl_parse(MYSQL* mysql);
+int mysql_rpl_parse_enabled(MYSQL* mysql);
+void mysql_enable_reads_from_master(MYSQL* mysql);
+void mysql_disable_reads_from_master(MYSQL* mysql);
+my_bool mysql_reads_from_master_enabled(MYSQL* mysql);
+enum mysql_rpl_type mysql_rpl_query_type(const char* q, int len);
+my_bool mysql_rpl_probe(MYSQL* mysql);
+int mysql_set_master(MYSQL* mysql, const char* host,
+      unsigned int port,
+      const char* user,
+      const char* passwd);
+int mysql_add_slave(MYSQL* mysql, const char* host,
+     unsigned int port,
+     const char* user,
+     const char* passwd);
+int mysql_shutdown(MYSQL *mysql,
+                                       enum mysql_enum_shutdown_level
+                                       shutdown_level);
+int mysql_dump_debug_info(MYSQL *mysql);
+int mysql_refresh(MYSQL *mysql,
+         unsigned int refresh_options);
+int mysql_kill(MYSQL *mysql,unsigned long pid);
+int mysql_set_server_option(MYSQL *mysql,
+      enum enum_mysql_set_option
+      option);
+int mysql_ping(MYSQL *mysql);
+const char * mysql_stat(MYSQL *mysql);
+const char * mysql_get_server_info(MYSQL *mysql);
+const char * mysql_get_client_info(void);
+unsigned long mysql_get_client_version(void);
+const char * mysql_get_host_info(MYSQL *mysql);
+unsigned long mysql_get_server_version(MYSQL *mysql);
+unsigned int mysql_get_proto_info(MYSQL *mysql);
+MYSQL_RES * mysql_list_dbs(MYSQL *mysql,const char *wild);
+MYSQL_RES * mysql_list_tables(MYSQL *mysql,const char *wild);
+MYSQL_RES * mysql_list_processes(MYSQL *mysql);
+int mysql_options(MYSQL *mysql,enum mysql_option option,
+          const void *arg);
+void mysql_free_result(MYSQL_RES *result);
+void mysql_data_seek(MYSQL_RES *result,
+     my_ulonglong offset);
+MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result,
+      MYSQL_ROW_OFFSET offset);
+MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result,
+        MYSQL_FIELD_OFFSET offset);
+MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
+unsigned long * mysql_fetch_lengths(MYSQL_RES *result);
+MYSQL_FIELD * mysql_fetch_field(MYSQL_RES *result);
+MYSQL_RES * mysql_list_fields(MYSQL *mysql, const char *table,
+       const char *wild);
+unsigned long mysql_escape_string(char *to,const char *from,
+         unsigned long from_length);
+unsigned long mysql_hex_string(char *to,const char *from,
+                                         unsigned long from_length);
+unsigned long mysql_real_escape_string(MYSQL *mysql,
+            char *to,const char *from,
+            unsigned long length);
+void mysql_debug(const char *debug);
+void myodbc_remove_escape(MYSQL *mysql,char *name);
+unsigned int mysql_thread_safe(void);
+my_bool mysql_embedded(void);
+MYSQL_MANAGER* mysql_manager_init(MYSQL_MANAGER* con);
+MYSQL_MANAGER* mysql_manager_connect(MYSQL_MANAGER* con,
+           const char* host,
+           const char* user,
+           const char* passwd,
+           unsigned int port);
+void mysql_manager_close(MYSQL_MANAGER* con);
+int mysql_manager_command(MYSQL_MANAGER* con,
+      const char* cmd, int cmd_len);
+int mysql_manager_fetch_line(MYSQL_MANAGER* con,
+        char* res_buf,
+       int res_buf_size);
+my_bool mysql_read_query_result(MYSQL *mysql);
+enum enum_mysql_stmt_state
+{
+  MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE,
+  MYSQL_STMT_FETCH_DONE
+};
+typedef struct st_mysql_bind
+{
+  unsigned long *length;
+  my_bool *is_null;
+  void *buffer;
+  my_bool *error;
+  unsigned char *row_ptr;
+  void (*store_param_func)(NET *net, struct st_mysql_bind *param);
+  void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *,
+                       unsigned char **row);
+  void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *,
+        unsigned char **row);
+  unsigned long buffer_length;
+  unsigned long offset;
+  unsigned long length_value;
+  unsigned int param_number;
+  unsigned int pack_length;
+  enum enum_field_types buffer_type;
+  my_bool error_value;
+  my_bool is_unsigned;
+  my_bool long_data_used;
+  my_bool is_null_value;
+  void *extension;
+} MYSQL_BIND;
+typedef struct st_mysql_stmt
+{
+  MEM_ROOT mem_root;
+  LIST list;
+  MYSQL *mysql;
+  MYSQL_BIND *params;
+  MYSQL_BIND *bind;
+  MYSQL_FIELD *fields;
+  MYSQL_DATA result;
+  MYSQL_ROWS *data_cursor;
+  int (*read_row_func)(struct st_mysql_stmt *stmt,
+                                  unsigned char **row);
+  my_ulonglong affected_rows;
+  my_ulonglong insert_id;
+  unsigned long stmt_id;
+  unsigned long flags;
+  unsigned long prefetch_rows;
+  unsigned int server_status;
+  unsigned int last_errno;
+  unsigned int param_count;
+  unsigned int field_count;
+  enum enum_mysql_stmt_state state;
+  char last_error[512];
+  char sqlstate[5 +1];
+  my_bool send_types_to_server;
+  my_bool bind_param_done;
+  unsigned char bind_result_done;
+  my_bool unbuffered_fetch_cancelled;
+  my_bool update_max_length;
+  void *extension;
+} MYSQL_STMT;
+enum enum_stmt_attr_type
+{
+  STMT_ATTR_UPDATE_MAX_LENGTH,
+  STMT_ATTR_CURSOR_TYPE,
+  STMT_ATTR_PREFETCH_ROWS
+};
+typedef struct st_mysql_methods
+{
+  my_bool (*read_query_result)(MYSQL *mysql);
+  my_bool (*advanced_command)(MYSQL *mysql,
+         enum enum_server_command command,
+         const unsigned char *header,
+         unsigned long header_length,
+         const unsigned char *arg,
+         unsigned long arg_length,
+         my_bool skip_check,
+                              MYSQL_STMT *stmt);
+  MYSQL_DATA *(*read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
+      unsigned int fields);
+  MYSQL_RES * (*use_result)(MYSQL *mysql);
+  void (*fetch_lengths)(unsigned long *to,
+   MYSQL_ROW column, unsigned int field_count);
+  void (*flush_use_result)(MYSQL *mysql);
+  MYSQL_FIELD * (*list_fields)(MYSQL *mysql);
+  my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
+  int (*stmt_execute)(MYSQL_STMT *stmt);
+  int (*read_binary_rows)(MYSQL_STMT *stmt);
+  int (*unbuffered_fetch)(MYSQL *mysql, char **row);
+  void (*free_embedded_thd)(MYSQL *mysql);
+  const char *(*read_statistics)(MYSQL *mysql);
+  my_bool (*next_result)(MYSQL *mysql);
+  int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd);
+  int (*read_rows_from_cursor)(MYSQL_STMT *stmt);
+} MYSQL_METHODS;
+MYSQL_STMT * mysql_stmt_init(MYSQL *mysql);
+int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query,
+                               unsigned long length);
+int mysql_stmt_execute(MYSQL_STMT *stmt);
+int mysql_stmt_fetch(MYSQL_STMT *stmt);
+int mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg,
+                                    unsigned int column,
+                                    unsigned long offset);
+int mysql_stmt_store_result(MYSQL_STMT *stmt);
+unsigned long mysql_stmt_param_count(MYSQL_STMT * stmt);
+my_bool mysql_stmt_attr_set(MYSQL_STMT *stmt,
+                                    enum enum_stmt_attr_type attr_type,
+                                    const void *attr);
+my_bool mysql_stmt_attr_get(MYSQL_STMT *stmt,
+                                    enum enum_stmt_attr_type attr_type,
+                                    void *attr);
+my_bool mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
+my_bool mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
+my_bool mysql_stmt_close(MYSQL_STMT * stmt);
+my_bool mysql_stmt_reset(MYSQL_STMT * stmt);
+my_bool mysql_stmt_free_result(MYSQL_STMT *stmt);
+my_bool mysql_stmt_send_long_data(MYSQL_STMT *stmt,
+                                          unsigned int param_number,
+                                          const char *data,
+                                          unsigned long length);
+MYSQL_RES * mysql_stmt_result_metadata(MYSQL_STMT *stmt);
+MYSQL_RES * mysql_stmt_param_metadata(MYSQL_STMT *stmt);
+unsigned int mysql_stmt_errno(MYSQL_STMT * stmt);
+const char * mysql_stmt_error(MYSQL_STMT * stmt);
+const char * mysql_stmt_sqlstate(MYSQL_STMT * stmt);
+MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT *stmt,
+                                             MYSQL_ROW_OFFSET offset);
+MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt);
+void mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset);
+my_ulonglong mysql_stmt_num_rows(MYSQL_STMT *stmt);
+my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt);
+my_ulonglong mysql_stmt_insert_id(MYSQL_STMT *stmt);
+unsigned int mysql_stmt_field_count(MYSQL_STMT *stmt);
+my_bool mysql_commit(MYSQL * mysql);
+my_bool mysql_rollback(MYSQL * mysql);
+my_bool mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
+my_bool mysql_more_results(MYSQL *mysql);
+int mysql_next_result(MYSQL *mysql);
+void mysql_close(MYSQL *sock);

=== added file 'include/mysql/plugin.h.pp'
--- a/include/mysql/plugin.h.pp	1970-01-01 00:00:00 +0000
+++ b/include/mysql/plugin.h.pp	2008-06-17 12:27:04 +0000
@@ -0,0 +1,139 @@
+struct st_mysql_lex_string
+{
+  char *str;
+  unsigned int length;
+};
+typedef struct st_mysql_lex_string MYSQL_LEX_STRING;
+struct st_mysql_xid {
+  long formatID;
+  long gtrid_length;
+  long bqual_length;
+  char data[128];
+};
+typedef struct st_mysql_xid MYSQL_XID;
+enum enum_mysql_show_type
+{
+  SHOW_UNDEF, SHOW_BOOL, SHOW_INT, SHOW_LONG,
+  SHOW_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR,
+  SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE
+};
+struct st_mysql_show_var {
+  const char *name;
+  char *value;
+  enum enum_mysql_show_type type;
+};
+typedef int (*mysql_show_var_func)(void*, struct st_mysql_show_var*, char *);
+struct st_mysql_sys_var;
+struct st_mysql_value;
+typedef int (*mysql_var_check_func)(void* thd,
+                                    struct st_mysql_sys_var *var,
+                                    void *save, struct st_mysql_value *value);
+typedef void (*mysql_var_update_func)(void* thd,
+                                      struct st_mysql_sys_var *var,
+                                      void *var_ptr, const void *save);
+struct st_mysql_plugin
+{
+  int type;
+  void *info;
+  const char *name;
+  const char *author;
+  const char *descr;
+  int license;
+  int (*init)(void *);
+  int (*deinit)(void *);
+  unsigned int version;
+  struct st_mysql_show_var *status_vars;
+  struct st_mysql_sys_var **system_vars;
+  void * __reserved1;
+};
+enum enum_ftparser_mode
+{
+  MYSQL_FTPARSER_SIMPLE_MODE= 0,
+  MYSQL_FTPARSER_WITH_STOPWORDS= 1,
+  MYSQL_FTPARSER_FULL_BOOLEAN_INFO= 2
+};
+enum enum_ft_token_type
+{
+  FT_TOKEN_EOF= 0,
+  FT_TOKEN_WORD= 1,
+  FT_TOKEN_LEFT_PAREN= 2,
+  FT_TOKEN_RIGHT_PAREN= 3,
+  FT_TOKEN_STOPWORD= 4
+};
+typedef struct st_mysql_ftparser_boolean_info
+{
+  enum enum_ft_token_type type;
+  int yesno;
+  int weight_adjust;
+  char wasign;
+  char trunc;
+  char prev;
+  char *quot;
+} MYSQL_FTPARSER_BOOLEAN_INFO;
+typedef struct st_mysql_ftparser_param
+{
+  int (*mysql_parse)(struct st_mysql_ftparser_param *,
+                     char *doc, int doc_len);
+  int (*mysql_add_word)(struct st_mysql_ftparser_param *,
+                        char *word, int word_len,
+                        MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info);
+  void *ftparser_state;
+  void *mysql_ftparam;
+  struct charset_info_st *cs;
+  char *doc;
+  int length;
+  int flags;
+  enum enum_ftparser_mode mode;
+} MYSQL_FTPARSER_PARAM;
+struct st_mysql_ftparser
+{
+  int interface_version;
+  int (*parse)(MYSQL_FTPARSER_PARAM *param);
+  int (*init)(MYSQL_FTPARSER_PARAM *param);
+  int (*deinit)(MYSQL_FTPARSER_PARAM *param);
+};
+struct st_mysql_storage_engine
+{
+  int interface_version;
+};
+struct handlerton;
+struct st_mysql_daemon
+{
+  int interface_version;
+};
+struct st_mysql_information_schema
+{
+  int interface_version;
+};
+struct st_mysql_value
+{
+  int (*value_type)(struct st_mysql_value *);
+  const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length);
+  int (*val_real)(struct st_mysql_value *, double *realbuf);
+  int (*val_int)(struct st_mysql_value *, long long *intbuf);
+};
+int thd_in_lock_tables(const void* thd);
+int thd_tablespace_op(const void* thd);
+long long thd_test_options(const void* thd, long long test_options);
+int thd_sql_command(const void* thd);
+const char *thd_proc_info(void* thd, const char *info);
+void **thd_ha_data(const void* thd, const struct handlerton *hton);
+int thd_tx_isolation(const void* thd);
+char *thd_security_context(void* thd, char *buffer, unsigned int length,
+                           unsigned int max_query_len);
+void thd_inc_row_count(void* thd);
+int mysql_tmpfile(const char *prefix);
+int thd_killed(const void* thd);
+unsigned long thd_get_thread_id(const void* thd);
+void *thd_alloc(void* thd, unsigned int size);
+void *thd_calloc(void* thd, unsigned int size);
+char *thd_strdup(void* thd, const char *str);
+char *thd_strmake(void* thd, const char *str, unsigned int size);
+void *thd_memdup(void* thd, const void* str, unsigned int size);
+MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str,
+                                      const char *str, unsigned int size,
+                                      int allocate_lex_string);
+void thd_get_xid(const void* thd, MYSQL_XID *xid);
+void mysql_query_cache_invalidate4(void* thd,
+                                   const char *key, unsigned int key_length,
+                                   int using_trx);

=== removed file 'include/mysql_h.ic'
--- a/include/mysql_h.ic	2008-02-28 17:55:46 +0000
+++ b/include/mysql_h.ic	1970-01-01 00:00:00 +0000
@@ -1,1166 +0,0 @@
-struct character_set;
-struct rand_struct;
-struct st_list;
-struct st_mem_root;
-struct st_mysql;
-struct st_mysql_bind;
-struct st_mysql_daemon;
-struct st_mysql_data;
-struct st_mysql_field;
-struct st_mysql_ftparser;
-struct st_mysql_ftparser_boolean_info;
-struct st_mysql_ftparser_param;
-struct st_mysql_information_schema;
-struct st_mysql_lex_string;
-struct st_mysql_manager;
-struct st_mysql_methods;
-struct st_mysql_options;
-struct st_mysql_parameters;
-struct st_mysql_plugin;
-struct st_mysql_res;
-struct st_mysql_rows;
-struct st_mysql_show_var;
-struct st_mysql_stmt;
-struct st_mysql_storage_engine;
-struct st_mysql_time;
-struct st_mysql_value;
-struct st_mysql_xid;
-struct st_net;
-struct st_typelib;
-struct st_udf_args;
-struct st_udf_init;
-struct st_used_mem;
-enum Item_result;
-enum enum_cursor_type;
-enum enum_field_types;
-enum enum_ft_token_type;
-enum enum_ftparser_mode;
-enum enum_mysql_set_option;
-enum enum_mysql_show_type;
-enum enum_mysql_stmt_state;
-enum enum_mysql_timestamp_type;
-enum enum_server_command;
-enum enum_stmt_attr_type;
-enum mysql_enum_shutdown_level;
-enum mysql_option;
-enum mysql_protocol_type;
-enum mysql_rpl_type;
-enum mysql_status;
-# 139 "mysql.h"
-typedef struct st_mysql_rows MYSQL_ROWS;
-# 23 "my_list.h"
-typedef struct st_list LIST;
-# 34 "my_alloc.h"
-typedef struct st_mem_root MEM_ROOT;
-# 258 "mysql.h"
-typedef struct st_mysql MYSQL;
-# 654 "mysql.h"
-typedef struct st_mysql_bind MYSQL_BIND;
-# 95 "mysql.h"
-typedef struct st_mysql_field MYSQL_FIELD;
-# 120 "mysql.h"
-typedef unsigned int MYSQL_FIELD_OFFSET;
-# 35 "mysql/plugin.h"
-typedef struct st_mysql_lex_string MYSQL_LEX_STRING;
-# 348 "mysql.h"
-typedef struct st_mysql_manager MYSQL_MANAGER;
-# 363 "mysql.h"
-typedef struct st_mysql_parameters MYSQL_PARAMETERS;
-# 316 "mysql.h"
-typedef struct st_mysql_res MYSQL_RES;
-# 119 "mysql.h"
-typedef char * * MYSQL_ROW;
-# 145 "mysql.h"
-typedef MYSQL_ROWS * MYSQL_ROW_OFFSET;
-# 683 "mysql.h"
-typedef struct st_mysql_stmt MYSQL_STMT;
-# 52 "mysql/plugin.h"
-typedef struct st_mysql_xid MYSQL_XID;
-# 243 "mysql.h"
-typedef struct character_set MY_CHARSET_INFO;
-# 188 "mysql_com.h"
-typedef struct st_net NET;
-# 22 "typelib.h"
-typedef struct st_typelib TYPELIB;
-# 178 "mysql_com.h"
-typedef struct st_vio Vio;
-# 28 "my_list.h"
-typedef int (* list_walk_action)(void *, void *);
-# 51 "mysql.h"
-typedef char my_bool;
-# 65 "mysql.h"
-typedef int my_socket;
-# 128 "mysql.h"
-typedef unsigned long long int my_ulonglong;
-# 214 "/usr/lib/gcc/i486-linux-gnu/4.1.3/include/stddef.h"
-typedef unsigned int size_t;
-# 149 "mysql.h"
-typedef struct embedded_query_result EMBEDDED_QUERY_RESULT;
-# 150 "mysql.h"
-typedef struct st_mysql_data MYSQL_DATA;
-# 495 "mysql/plugin.h"
-typedef struct st_mysql_ftparser_boolean_info MYSQL_FTPARSER_BOOLEAN_INFO;
-# 557 "mysql/plugin.h"
-typedef struct st_mysql_ftparser_param MYSQL_FTPARSER_PARAM;
-# 753 "mysql.h"
-typedef struct st_mysql_methods MYSQL_METHODS;
-# 47 "mysql_time.h"
-typedef struct st_mysql_time MYSQL_TIME;
-# 383 "mysql_com.h"
-typedef struct st_udf_args UDF_ARGS;
-# 397 "mysql_com.h"
-typedef struct st_udf_init UDF_INIT;
-# 26 "my_alloc.h"
-typedef struct st_used_mem USED_MEM;
-# 123 "mysql/plugin.h"
-typedef int (* mysql_show_var_func)(void *, struct st_mysql_show_var *, char *);
-# 170 "mysql/plugin.h"
-typedef int (* mysql_var_check_func)(void * thd, struct st_mysql_sys_var * var, void * save, struct st_mysql_value * value);
-# 188 "mysql/plugin.h"
-typedef void (* mysql_var_update_func)(void * thd, struct st_mysql_sys_var * var, void * var_ptr, void * save);
-# 243 "mysql.h"
-struct __attribute__((aligned(__alignof__(unsigned int)), aligned(__alignof__(void *)))) character_set
-  {
-    unsigned int number;
-    unsigned int state;
-    char const * csname;
-    char const * name;
-    char const * comment;
-    char const * dir;
-    unsigned int mbminlen;
-    unsigned int mbmaxlen;
-  };
-# 369 "mysql_com.h"
-struct __attribute__((aligned(__alignof__(unsigned long int)), aligned(__alignof__(double)))) rand_struct
-  {
-    unsigned long int seed1;
-    unsigned long int seed2;
-    unsigned long int max_value;
-    double max_value_dbl;
-  };
-# 23 "my_list.h"
-struct __attribute__((aligned(__alignof__(void *)))) st_list
-  {
-    struct st_list * prev;
-    struct st_list * next;
-    void * data;
-  };
-# 34 "my_alloc.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(unsigned int)))) 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);
-  };
-# 258 "mysql.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(unsigned long long int)))) st_mysql
-  {
-    NET net;
-    unsigned char * connector_fd;
-    char * host;
-    char * user;
-    char * passwd;
-    char * unix_socket;
-    char * server_version;
-    char * host_info;
-    char * info;
-    char * 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 int thread_id;
-    unsigned long int packet_length;
-    unsigned int port;
-    unsigned long int client_flag;
-    unsigned long int 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;
-    struct st_mysql * next_slave;
-    struct st_mysql * last_used_slave;
-    struct st_mysql * last_used_con;
-    LIST * stmts;
-    struct st_mysql_methods const * methods;
-    void * thd;
-    my_bool * unbuffered_fetch_owner;
-    char * info_buffer;
-    void * extension;
-  };
-# 654 "mysql.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(unsigned long int)))) st_mysql_bind
-  {
-    unsigned long int * 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 int buffer_length;
-    unsigned long int offset;
-    unsigned long int 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;
-  };
-# 628 "mysql/plugin.h"
-struct __attribute__((aligned(__alignof__(int)))) st_mysql_daemon
-  {
-    int interface_version;
-  };
-# 150 "mysql.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(unsigned long long int)))) st_mysql_data
-  {
-    MYSQL_ROWS * data;
-    struct embedded_query_result * embedded_info;
-    MEM_ROOT alloc;
-    my_ulonglong rows;
-    unsigned int fields;
-    void * extension;
-  };
-# 95 "mysql.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(unsigned long int)))) st_mysql_field
-  {
-    char * name;
-    char * org_name;
-    char * table;
-    char * org_table;
-    char * db;
-    char * catalog;
-    char * def;
-    unsigned long int length;
-    unsigned long int 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;
-  };
-# 581 "mysql/plugin.h"
-struct __attribute__((aligned(__alignof__(int)), aligned(__alignof__(void *)))) st_mysql_ftparser
-  {
-    int interface_version;
-    int (* parse)(MYSQL_FTPARSER_PARAM * param);
-    int (* init)(MYSQL_FTPARSER_PARAM * param);
-    int (* deinit)(MYSQL_FTPARSER_PARAM * param);
-  };
-# 495 "mysql/plugin.h"
-struct __attribute__((aligned(__alignof__(int)), aligned(__alignof__(void *)))) st_mysql_ftparser_boolean_info
-  {
-    enum enum_ft_token_type type;
-    int yesno;
-    int weight_adjust;
-    char wasign;
-    char trunc;
-    char prev;
-    char * quot;
-  };
-# 557 "mysql/plugin.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(int)))) st_mysql_ftparser_param
-  {
-    int (* mysql_parse)(struct st_mysql_ftparser_param *, char * doc, int);
-    int (* mysql_add_word)(struct st_mysql_ftparser_param *, char * word, int, 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;
-  };
-# 638 "mysql/plugin.h"
-struct __attribute__((aligned(__alignof__(int)))) st_mysql_information_schema
-  {
-    int interface_version;
-  };
-# 29 "mysql/plugin.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(unsigned int)))) st_mysql_lex_string
-  {
-    char * str;
-    unsigned int length;
-  };
-# 348 "mysql.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(unsigned long int)))) st_mysql_manager
-  {
-    NET net;
-    char * host;
-    char * user;
-    char * passwd;
-    char * net_buf;
-    char * net_buf_pos;
-    char * 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;
-  };
-# 753 "mysql.h"
-struct __attribute__((aligned(__alignof__(void *)))) st_mysql_methods
-  {
-    my_bool (* read_query_result)(MYSQL * mysql);
-    my_bool (* advanced_command)(MYSQL * mysql, enum enum_server_command, unsigned char const * header, unsigned long int, unsigned char const * arg, unsigned long int, my_bool, MYSQL_STMT * stmt);
-    MYSQL_DATA * (* read_rows)(MYSQL * mysql, MYSQL_FIELD * mysql_fields, unsigned int);
-    MYSQL_RES * (* use_result)(MYSQL * mysql);
-    void (* fetch_lengths)(unsigned long int * to, MYSQL_ROW, unsigned int);
-    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);
-    char const * (* read_statistics)(MYSQL * mysql);
-    my_bool (* next_result)(MYSQL * mysql);
-    int (* read_change_user_result)(MYSQL * mysql, char * buff, char const * passwd);
-    int (* read_rows_from_cursor)(MYSQL_STMT * stmt);
-  };
-# 173 "mysql.h"
-struct __attribute__((aligned(__alignof__(unsigned long int)), aligned(__alignof__(void *)))) st_mysql_options
-  {
-    unsigned int connect_timeout;
-    unsigned int read_timeout;
-    unsigned int write_timeout;
-    unsigned int port;
-    unsigned int protocol;
-    unsigned long int client_flag;
-    char * host;
-    char * user;
-    char * password;
-    char * unix_socket;
-    char * db;
-    struct st_dynamic_array * init_commands;
-    char * my_cnf_file;
-    char * my_cnf_group;
-    char * charset_dir;
-    char * charset_name;
-    char * ssl_key;
-    char * ssl_cert;
-    char * ssl_ca;
-    char * ssl_capath;
-    char * ssl_cipher;
-    char * shared_memory_base_name;
-    unsigned long int max_allowed_packet;
-    my_bool use_ssl;
-    my_bool compress;
-    my_bool 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 * *, char const *, 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;
-  };
-# 363 "mysql.h"
-struct __attribute__((aligned(__alignof__(void *)))) st_mysql_parameters
-  {
-    unsigned long int * p_max_allowed_packet;
-    unsigned long int * p_net_buffer_length;
-    void * extension;
-  };
-# 384 "mysql/plugin.h"
-struct __attribute__((aligned(__alignof__(int)), aligned(__alignof__(void *)))) st_mysql_plugin
-  {
-    int type;
-    void * info;
-    char const * name;
-    char const * author;
-    char const * 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;
-  };
-# 316 "mysql.h"
-struct __attribute__((aligned(__alignof__(unsigned long long int)), aligned(__alignof__(void *)))) st_mysql_res
-  {
-    my_ulonglong row_count;
-    MYSQL_FIELD * fields;
-    MYSQL_DATA * data;
-    MYSQL_ROWS * data_cursor;
-    unsigned long int * lengths;
-    MYSQL * handle;
-    struct st_mysql_methods const * methods;
-    MYSQL_ROW row;
-    MYSQL_ROW current_row;
-    MEM_ROOT field_alloc;
-    unsigned int field_count;
-    unsigned int current_field;
-    my_bool eof;
-    my_bool unbuffered_fetch_cancelled;
-    void * extension;
-  };
-# 139 "mysql.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(unsigned long int)))) st_mysql_rows
-  {
-    struct st_mysql_rows * next;
-    MYSQL_ROW data;
-    unsigned long int length;
-  };
-# 116 "mysql/plugin.h"
-struct __attribute__((aligned(__alignof__(void *)))) st_mysql_show_var
-  {
-    char const * name;
-    char * value;
-    enum enum_mysql_show_type type;
-  };
-# 683 "mysql.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(unsigned long long int)))) 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 int stmt_id;
-    unsigned long int flags;
-    unsigned long int 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;
-  };
-# 616 "mysql/plugin.h"
-struct __attribute__((aligned(__alignof__(int)))) st_mysql_storage_engine
-  {
-    int interface_version;
-  };
-# 47 "mysql_time.h"
-struct __attribute__((aligned(__alignof__(unsigned long int)))) st_mysql_time
-  {
-    unsigned int year;
-    unsigned int month;
-    unsigned int day;
-    unsigned int hour;
-    unsigned int minute;
-    unsigned int second;
-    unsigned long int second_part;
-    my_bool neg;
-    enum enum_mysql_timestamp_type time_type;
-  };
-# 658 "mysql/plugin.h"
-struct __attribute__((aligned(__alignof__(void *)))) st_mysql_value
-  {
-    int (* value_type)(struct st_mysql_value *);
-    char const * (* 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 int * intbuf);
-  };
-# 46 "mysql/plugin.h"
-struct __attribute__((aligned(__alignof__(long int)))) st_mysql_xid
-  {
-    long int formatID;
-    long int gtrid_length;
-    long int bqual_length;
-    char data[128];
-  };
-# 188 "mysql_com.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(unsigned long int)))) st_net
-  {
-    Vio * vio;
-    unsigned char * buff;
-    unsigned char * buff_end;
-    unsigned char * write_pos;
-    unsigned char * read_pos;
-    my_socket fd;
-    unsigned long int remain_in_buf;
-    unsigned long int length;
-    unsigned long int buf_length;
-    unsigned long int where_b;
-    unsigned long int max_packet;
-    unsigned long int max_packet_size;
-    unsigned int pkt_nr;
-    unsigned int compress_pkt_nr;
-    unsigned int write_timeout;
-    unsigned int read_timeout;
-    unsigned int 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;
-  };
-# 22 "typelib.h"
-struct __attribute__((aligned(__alignof__(unsigned int)), aligned(__alignof__(void *)))) st_typelib
-  {
-    unsigned int count;
-    char const * name;
-    char const * * type_names;
-    unsigned int * type_lengths;
-  };
-# 383 "mysql_com.h"
-struct __attribute__((aligned(__alignof__(unsigned int)), aligned(__alignof__(void *)))) st_udf_args
-  {
-    unsigned int arg_count;
-    enum Item_result * arg_type;
-    char * * args;
-    unsigned long int * lengths;
-    char * maybe_null;
-    char * * attributes;
-    unsigned long int * attribute_lengths;
-    void * extension;
-  };
-# 397 "mysql_com.h"
-struct __attribute__((aligned(__alignof__(unsigned long int)), aligned(__alignof__(void *)))) st_udf_init
-  {
-    my_bool maybe_null;
-    unsigned int decimals;
-    unsigned long int max_length;
-    char * ptr;
-    my_bool const_item;
-    void * extension;
-  };
-# 26 "my_alloc.h"
-struct __attribute__((aligned(__alignof__(void *)), aligned(__alignof__(unsigned int)))) st_used_mem
-  {
-    struct st_used_mem * next;
-    unsigned int left;
-    unsigned int size;
-  };
-# 380 "mysql_com.h"
-enum Item_result
-  {
-    STRING_RESULT = 0,
-    REAL_RESULT = 1,
-    INT_RESULT = 2,
-    ROW_RESULT = 3,
-    DECIMAL_RESULT = 4,
-  };
-# 321 "mysql_com.h"
-enum enum_cursor_type
-  {
-    CURSOR_TYPE_NO_CURSOR = 0,
-    CURSOR_TYPE_READ_ONLY = 1,
-    CURSOR_TYPE_FOR_UPDATE = 2,
-    CURSOR_TYPE_SCROLLABLE = 4,
-  };
-# 234 "mysql_com.h"
-enum enum_field_types
-  {
-    MYSQL_TYPE_DECIMAL = 0,
-    MYSQL_TYPE_TINY = 1,
-    MYSQL_TYPE_SHORT = 2,
-    MYSQL_TYPE_LONG = 3,
-    MYSQL_TYPE_FLOAT = 4,
-    MYSQL_TYPE_DOUBLE = 5,
-    MYSQL_TYPE_NULL = 6,
-    MYSQL_TYPE_TIMESTAMP = 7,
-    MYSQL_TYPE_LONGLONG = 8,
-    MYSQL_TYPE_INT24 = 9,
-    MYSQL_TYPE_DATE = 10,
-    MYSQL_TYPE_TIME = 11,
-    MYSQL_TYPE_DATETIME = 12,
-    MYSQL_TYPE_YEAR = 13,
-    MYSQL_TYPE_NEWDATE = 14,
-    MYSQL_TYPE_VARCHAR = 15,
-    MYSQL_TYPE_BIT = 16,
-    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,
-  };
-# 455 "mysql/plugin.h"
-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,
-  };
-# 407 "mysql/plugin.h"
-enum enum_ftparser_mode
-  {
-    MYSQL_FTPARSER_SIMPLE_MODE = 0,
-    MYSQL_FTPARSER_WITH_STOPWORDS = 1,
-    MYSQL_FTPARSER_FULL_BOOLEAN_INFO = 2,
-  };
-# 331 "mysql_com.h"
-enum enum_mysql_set_option
-  {
-    MYSQL_OPTION_MULTI_STATEMENTS_ON = 0,
-    MYSQL_OPTION_MULTI_STATEMENTS_OFF = 1,
-  };
-# 109 "mysql/plugin.h"
-enum enum_mysql_show_type
-  {
-    SHOW_UNDEF = 0,
-    SHOW_BOOL = 1,
-    SHOW_INT = 2,
-    SHOW_LONG = 3,
-    SHOW_LONGLONG = 4,
-    SHOW_CHAR = 5,
-    SHOW_CHAR_PTR = 6,
-    SHOW_ARRAY = 7,
-    SHOW_FUNC = 8,
-    SHOW_DOUBLE = 9,
-  };
-# 584 "mysql.h"
-enum enum_mysql_stmt_state
-  {
-    MYSQL_STMT_INIT_DONE = 1,
-    MYSQL_STMT_PREPARE_DONE = 2,
-    MYSQL_STMT_EXECUTE_DONE = 3,
-    MYSQL_STMT_FETCH_DONE = 4,
-  };
-# 28 "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,
-  };
-# 55 "mysql_com.h"
-enum enum_server_command
-  {
-    COM_SLEEP = 0,
-    COM_QUIT = 1,
-    COM_INIT_DB = 2,
-    COM_QUERY = 3,
-    COM_FIELD_LIST = 4,
-    COM_CREATE_DB = 5,
-    COM_DROP_DB = 6,
-    COM_REFRESH = 7,
-    COM_SHUTDOWN = 8,
-    COM_STATISTICS = 9,
-    COM_PROCESS_INFO = 10,
-    COM_CONNECT = 11,
-    COM_PROCESS_KILL = 12,
-    COM_DEBUG = 13,
-    COM_PING = 14,
-    COM_TIME = 15,
-    COM_DELAYED_INSERT = 16,
-    COM_CHANGE_USER = 17,
-    COM_BINLOG_DUMP = 18,
-    COM_TABLE_DUMP = 19,
-    COM_CONNECT_OUT = 20,
-    COM_REGISTER_SLAVE = 21,
-    COM_STMT_PREPARE = 22,
-    COM_STMT_EXECUTE = 23,
-    COM_STMT_SEND_LONG_DATA = 24,
-    COM_STMT_CLOSE = 25,
-    COM_STMT_RESET = 26,
-    COM_SET_OPTION = 27,
-    COM_STMT_FETCH = 28,
-    COM_DAEMON = 29,
-    COM_END = 30,
-  };
-# 730 "mysql.h"
-enum enum_stmt_attr_type
-  {
-    STMT_ATTR_UPDATE_MAX_LENGTH = 0,
-    STMT_ATTR_CURSOR_TYPE = 1,
-    STMT_ATTR_PREFETCH_ROWS = 2,
-  };
-# 296 "mysql_com.h"
-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_CONNECTION = 255,
-  };
-# 160 "mysql.h"
-enum mysql_option
-  {
-    MYSQL_OPT_CONNECT_TIMEOUT = 0,
-    MYSQL_OPT_COMPRESS = 1,
-    MYSQL_OPT_NAMED_PIPE = 2,
-    MYSQL_INIT_COMMAND = 3,
-    MYSQL_READ_DEFAULT_FILE = 4,
-    MYSQL_READ_DEFAULT_GROUP = 5,
-    MYSQL_SET_CHARSET_DIR = 6,
-    MYSQL_SET_CHARSET_NAME = 7,
-    MYSQL_OPT_LOCAL_INFILE = 8,
-    MYSQL_OPT_PROTOCOL = 9,
-    MYSQL_SHARED_MEMORY_BASE_NAME = 10,
-    MYSQL_OPT_READ_TIMEOUT = 11,
-    MYSQL_OPT_WRITE_TIMEOUT = 12,
-    MYSQL_OPT_USE_RESULT = 13,
-    MYSQL_OPT_USE_REMOTE_CONNECTION = 14,
-    MYSQL_OPT_USE_EMBEDDED_CONNECTION = 15,
-    MYSQL_OPT_GUESS_CONNECTION = 16,
-    MYSQL_SET_CLIENT_IP = 17,
-    MYSQL_SECURE_AUTH = 18,
-    MYSQL_REPORT_DATA_TRUNCATION = 19,
-    MYSQL_OPT_RECONNECT = 20,
-    MYSQL_OPT_SSL_VERIFY_SERVER_CERT = 21,
-  };
-# 228 "mysql.h"
-enum mysql_protocol_type
-  {
-    MYSQL_PROTOCOL_DEFAULT = 0,
-    MYSQL_PROTOCOL_TCP = 1,
-    MYSQL_PROTOCOL_SOCKET = 2,
-    MYSQL_PROTOCOL_PIPE = 3,
-    MYSQL_PROTOCOL_MEMORY = 4,
-  };
-# 238 "mysql.h"
-enum mysql_rpl_type
-  {
-    MYSQL_RPL_MASTER = 0,
-    MYSQL_RPL_SLAVE = 1,
-    MYSQL_RPL_ADMIN = 2,
-  };
-# 223 "mysql.h"
-enum mysql_status
-  {
-    MYSQL_STATUS_READY = 0,
-    MYSQL_STATUS_GET_RESULT = 1,
-    MYSQL_STATUS_USE_RESULT = 2,
-  };
-# 441 "mysql_com.h"
-extern my_bool check_scramble(char const * reply, char const * message, unsigned char const * hash_stage2);
-# 434 "mysql_com.h"
-extern my_bool check_scramble_323(char const *, char const * message, unsigned long int * salt);
-# 35 "typelib.h"
-extern TYPELIB * copy_typelib(MEM_ROOT * root, TYPELIB * from);
-# 429 "mysql_com.h"
-extern void create_random_string(char * to, unsigned int, struct rand_struct * rand_st);
-# 32 "typelib.h"
-extern int find_type(char * x, TYPELIB const * typelib, unsigned int);
-# 30 "typelib.h"
-extern int find_type_or_exit(char const * x, TYPELIB * typelib, char const * option);
-# 29 "typelib.h"
-extern my_ulonglong find_typeset(char * x, TYPELIB * typelib, int * error_position);
-# 443 "mysql_com.h"
-extern void get_salt_from_password(unsigned char * res, char const * password);
-# 436 "mysql_com.h"
-extern void get_salt_from_password_323(unsigned long int * res, char const * password);
-# 449 "mysql_com.h"
-extern char * get_tty_password(char const * opt_message);
-# 34 "typelib.h"
-extern char const * get_type(TYPELIB * typelib, unsigned int);
-# 431 "mysql_com.h"
-extern void hash_password(unsigned long int * to, char const * password, unsigned int);
-# 30 "my_list.h"
-extern LIST * list_add(LIST * root, LIST * element);
-# 32 "my_list.h"
-extern LIST * list_cons(void * data, LIST * root);
-# 31 "my_list.h"
-extern LIST * list_delete(LIST * root, LIST * element);
-# 34 "my_list.h"
-extern void list_free(LIST * root, unsigned int);
-# 35 "my_list.h"
-extern unsigned int list_length(LIST *);
-# 33 "my_list.h"
-extern LIST * list_reverse(LIST * root);
-# 36 "my_list.h"
-extern int list_walk(LIST *, list_walk_action, unsigned char * argument);
-# 444 "mysql_com.h"
-extern void make_password_from_salt(char * to, unsigned char const * hash_stage2);
-# 437 "mysql_com.h"
-extern void make_password_from_salt_323(char * to, unsigned long int const * salt);
-# 439 "mysql_com.h"
-extern void make_scrambled_password(char * to, char const * password);
-# 432 "mysql_com.h"
-extern void make_scrambled_password_323(char * to, char const * password);
-# 33 "typelib.h"
-extern void make_type(char * to, unsigned int, TYPELIB * typelib);
-# 366 "mysql_com.h"
-extern int my_connect(my_socket, struct sockaddr const * name, unsigned int, unsigned int);
-# 343 "mysql_com.h"
-extern my_bool my_net_init(NET * net, Vio * vio);
-# 344 "mysql_com.h"
-extern void my_net_local_init(NET * net);
-# 354 "mysql_com.h"
-extern unsigned long int my_net_read(NET * net);
-# 349 "mysql_com.h"
-extern my_bool my_net_write(NET * net, unsigned char const * packet, size_t);
-# 428 "mysql_com.h"
-extern double my_rnd(struct rand_struct *);
-# 455 "mysql_com.h"
-extern void my_thread_end(void);
-# 454 "mysql_com.h"
-extern my_bool my_thread_init(void);
-# 560 "mysql.h"
-extern void myodbc_remove_escape(MYSQL * mysql, char * name);
-# 512 "mysql.h"
-extern int mysql_add_slave(MYSQL * mysql, char const * host, unsigned int, char const * user, char const * passwd);
-# 421 "mysql.h"
-extern my_ulonglong mysql_affected_rows(MYSQL * mysql);
-# 826 "mysql.h"
-extern my_bool mysql_autocommit(MYSQL * mysql, my_bool);
-# 437 "mysql.h"
-extern my_bool mysql_change_user(MYSQL * mysql, char const * user, char const * passwd, char const * db);
-# 429 "mysql.h"
-extern char const * mysql_character_set_name(MYSQL * mysql);
-# 829 "mysql.h"
-extern void mysql_close(MYSQL * sock);
-# 824 "mysql.h"
-extern my_bool mysql_commit(MYSQL * mysql);
-# 541 "mysql.h"
-extern void mysql_data_seek(MYSQL_RES * result, my_ulonglong);
-# 559 "mysql.h"
-extern void mysql_debug(char const * debug);
-# 498 "mysql.h"
-extern void mysql_disable_reads_from_master(MYSQL * mysql);
-# 492 "mysql.h"
-extern void mysql_disable_rpl_parse(MYSQL * mysql);
-# 520 "mysql.h"
-extern int mysql_dump_debug_info(MYSQL * mysql);
-# 562 "mysql.h"
-extern my_bool mysql_embedded(void);
-# 497 "mysql.h"
-extern void mysql_enable_reads_from_master(MYSQL * mysql);
-# 491 "mysql.h"
-extern void mysql_enable_rpl_parse(MYSQL * mysql);
-# 413 "mysql.h"
-extern my_bool mysql_eof(MYSQL_RES * res);
-# 423 "mysql.h"
-extern unsigned int mysql_errno(MYSQL * mysql);
-# 450 "mysql_com.h"
-extern char const * mysql_errno_to_sqlstate(unsigned int);
-# 424 "mysql.h"
-extern char const * mysql_error(MYSQL * mysql);
-# 552 "mysql.h"
-extern unsigned long int mysql_escape_string(char * to, char const * from, unsigned long int);
-# 549 "mysql.h"
-extern MYSQL_FIELD * mysql_fetch_field(MYSQL_RES * result);
-# 414 "mysql.h"
-extern MYSQL_FIELD * mysql_fetch_field_direct(MYSQL_RES * res, unsigned int);
-# 416 "mysql.h"
-extern MYSQL_FIELD * mysql_fetch_fields(MYSQL_RES * res);
-# 548 "mysql.h"
-extern unsigned long int * mysql_fetch_lengths(MYSQL_RES * result);
-# 547 "mysql.h"
-extern MYSQL_ROW mysql_fetch_row(MYSQL_RES * result);
-# 420 "mysql.h"
-extern unsigned int mysql_field_count(MYSQL * mysql);
-# 545 "mysql.h"
-extern MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES * result, MYSQL_FIELD_OFFSET);
-# 418 "mysql.h"
-extern MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES * res);
-# 540 "mysql.h"
-extern void mysql_free_result(MYSQL_RES * result);
-# 465 "mysql.h"
-extern void mysql_get_character_set_info(MYSQL * mysql, MY_CHARSET_INFO * charset);
-# 530 "mysql.h"
-extern char const * mysql_get_client_info(void);
-# 531 "mysql.h"
-extern unsigned long int mysql_get_client_version(void);
-# 532 "mysql.h"
-extern char const * mysql_get_host_info(MYSQL * mysql);
-# 395 "mysql.h"
-extern MYSQL_PARAMETERS * mysql_get_parameters(void);
-# 534 "mysql.h"
-extern unsigned int mysql_get_proto_info(MYSQL * mysql);
-# 529 "mysql.h"
-extern char const * mysql_get_server_info(MYSQL * mysql);
-# 533 "mysql.h"
-extern unsigned long int mysql_get_server_version(MYSQL * mysql);
-# 436 "mysql.h"
-extern char const * mysql_get_ssl_cipher(MYSQL * mysql);
-# 554 "mysql.h"
-extern unsigned long int mysql_hex_string(char * to, char const * from, unsigned long int);
-# 427 "mysql.h"
-extern char const * mysql_info(MYSQL * mysql);
-# 432 "mysql.h"
-extern MYSQL * mysql_init(MYSQL * mysql);
-# 422 "mysql.h"
-extern my_ulonglong mysql_insert_id(MYSQL * mysql);
-# 523 "mysql.h"
-extern int mysql_kill(MYSQL * mysql, unsigned long int);
-# 535 "mysql.h"
-extern MYSQL_RES * mysql_list_dbs(MYSQL * mysql, char const * wild);
-# 550 "mysql.h"
-extern MYSQL_RES * mysql_list_fields(MYSQL * mysql, char const * table, char const * wild);
-# 537 "mysql.h"
-extern MYSQL_RES * mysql_list_processes(MYSQL * mysql);
-# 536 "mysql.h"
-extern MYSQL_RES * mysql_list_tables(MYSQL * mysql, char const * wild);
-# 569 "mysql.h"
-extern void mysql_manager_close(MYSQL_MANAGER * con);
-# 570 "mysql.h"
-extern int mysql_manager_command(MYSQL_MANAGER * con, char const * cmd, int);
-# 564 "mysql.h"
-extern MYSQL_MANAGER * mysql_manager_connect(MYSQL_MANAGER * con, char const * host, char const * user, char const * passwd, unsigned int);
-# 572 "mysql.h"
-extern int mysql_manager_fetch_line(MYSQL_MANAGER * con, char * res_buf, int);
-# 563 "mysql.h"
-extern MYSQL_MANAGER * mysql_manager_init(MYSQL_MANAGER * con);
-# 456 "mysql.h"
-extern my_bool mysql_master_query(MYSQL * mysql, char const * q, unsigned long int);
-# 458 "mysql.h"
-extern my_bool mysql_master_send_query(MYSQL * mysql, char const * q, unsigned long int);
-# 827 "mysql.h"
-extern my_bool mysql_more_results(MYSQL * mysql);
-# 828 "mysql.h"
-extern int mysql_next_result(MYSQL * mysql);
-# 412 "mysql.h"
-extern unsigned int mysql_num_fields(MYSQL_RES * res);
-# 411 "mysql.h"
-extern my_ulonglong mysql_num_rows(MYSQL_RES * res);
-# 538 "mysql.h"
-extern int mysql_options(MYSQL * mysql, enum mysql_option, void const * arg);
-# 527 "mysql.h"
-extern int mysql_ping(MYSQL * mysql);
-# 76 "mysql.h"
-extern unsigned int mysql_port;
-# 447 "mysql.h"
-extern int mysql_query(MYSQL * mysql, char const * q);
-# 780 "mysql/plugin.h"
-extern void mysql_query_cache_invalidate4(void * thd, char const * key, unsigned int, int);
-# 575 "mysql.h"
-extern my_bool mysql_read_query_result(MYSQL * mysql);
-# 500 "mysql.h"
-extern my_bool mysql_reads_from_master_enabled(MYSQL * mysql);
-# 439 "mysql.h"
-extern MYSQL * mysql_real_connect(MYSQL * mysql, char const * host, char const * user, char const * passwd, char const * db, unsigned int, char const * unix_socket, unsigned long int);
-# 556 "mysql.h"
-extern unsigned long int mysql_real_escape_string(MYSQL * mysql, char * to, char const * from, unsigned long int);
-# 450 "mysql.h"
-extern int mysql_real_query(MYSQL * mysql, char const * q, unsigned long int);
-# 521 "mysql.h"
-extern int mysql_refresh(MYSQL * mysql, unsigned int);
-# 825 "mysql.h"
-extern my_bool mysql_rollback(MYSQL * mysql);
-# 543 "mysql.h"
-extern MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES * result, MYSQL_ROW_OFFSET);
-# 417 "mysql.h"
-extern MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES * res);
-# 494 "mysql.h"
-extern int mysql_rpl_parse_enabled(MYSQL * mysql);
-# 505 "mysql.h"
-extern my_bool mysql_rpl_probe(MYSQL * mysql);
-# 502 "mysql.h"
-extern enum mysql_rpl_type mysql_rpl_query_type(char const * q, int);
-# 446 "mysql.h"
-extern int mysql_select_db(MYSQL * mysql, char const * db);
-# 448 "mysql.h"
-extern int mysql_send_query(MYSQL * mysql, char const * q, unsigned long int);
-# 381 "mysql.h"
-extern void mysql_server_end(void);
-# 380 "mysql.h"
-extern int mysql_server_init(int, char * * argv, char * * groups);
-# 430 "mysql.h"
-extern int mysql_set_character_set(MYSQL * mysql, char const * csname);
-# 483 "mysql.h"
-extern void mysql_set_local_infile_default(MYSQL * mysql);
-# 472 "mysql.h"
-extern void mysql_set_local_infile_handler(MYSQL * mysql, int (* local_infile_init)(void * *, char const *, void *), int (* local_infile_read)(void *, char *, unsigned int), void (* local_infile_end)(void), int (* local_infile_error)(void *, char *, unsigned int), void *);
-# 508 "mysql.h"
-extern int mysql_set_master(MYSQL * mysql, char const * host, unsigned int, char const * user, char const * passwd);
-# 524 "mysql.h"
-extern int mysql_set_server_option(MYSQL * mysql, enum enum_mysql_set_option);
-# 517 "mysql.h"
-extern int mysql_shutdown(MYSQL * mysql, enum mysql_enum_shutdown_level);
-# 461 "mysql.h"
-extern my_bool mysql_slave_query(MYSQL * mysql, char const * q, unsigned long int);
-# 463 "mysql.h"
-extern my_bool mysql_slave_send_query(MYSQL * mysql, char const * q, unsigned long int);
-# 425 "mysql.h"
-extern char const * mysql_sqlstate(MYSQL * mysql);
-# 433 "mysql.h"
-extern my_bool mysql_ssl_set(MYSQL * mysql, char const * key, char const * cert, char const * ca, char const * capath, char const * cipher);
-# 528 "mysql.h"
-extern char const * mysql_stat(MYSQL * mysql);
-# 820 "mysql.h"
-extern my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT * stmt);
-# 798 "mysql.h"
-extern my_bool mysql_stmt_attr_get(MYSQL_STMT * stmt, enum enum_stmt_attr_type, void * attr);
-# 795 "mysql.h"
-extern my_bool mysql_stmt_attr_set(MYSQL_STMT * stmt, enum enum_stmt_attr_type, void const * attr);
-# 801 "mysql.h"
-extern my_bool mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
-# 802 "mysql.h"
-extern my_bool mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
-# 803 "mysql.h"
-extern my_bool mysql_stmt_close(MYSQL_STMT * stmt);
-# 818 "mysql.h"
-extern void mysql_stmt_data_seek(MYSQL_STMT * stmt, my_ulonglong);
-# 812 "mysql.h"
-extern unsigned int mysql_stmt_errno(MYSQL_STMT * stmt);
-# 813 "mysql.h"
-extern char const * mysql_stmt_error(MYSQL_STMT * stmt);
-# 788 "mysql.h"
-extern int mysql_stmt_execute(MYSQL_STMT * stmt);
-# 789 "mysql.h"
-extern int mysql_stmt_fetch(MYSQL_STMT * stmt);
-# 790 "mysql.h"
-extern int mysql_stmt_fetch_column(MYSQL_STMT * stmt, MYSQL_BIND * bind_arg, unsigned int, unsigned long int);
-# 822 "mysql.h"
-extern unsigned int mysql_stmt_field_count(MYSQL_STMT * stmt);
-# 805 "mysql.h"
-extern my_bool mysql_stmt_free_result(MYSQL_STMT * stmt);
-# 785 "mysql.h"
-extern MYSQL_STMT * mysql_stmt_init(MYSQL * mysql);
-# 821 "mysql.h"
-extern my_ulonglong mysql_stmt_insert_id(MYSQL_STMT * stmt);
-# 819 "mysql.h"
-extern my_ulonglong mysql_stmt_num_rows(MYSQL_STMT * stmt);
-# 794 "mysql.h"
-extern unsigned long int mysql_stmt_param_count(MYSQL_STMT * stmt);
-# 811 "mysql.h"
-extern MYSQL_RES * mysql_stmt_param_metadata(MYSQL_STMT * stmt);
-# 786 "mysql.h"
-extern int mysql_stmt_prepare(MYSQL_STMT * stmt, char const * query, unsigned long int);
-# 804 "mysql.h"
-extern my_bool mysql_stmt_reset(MYSQL_STMT * stmt);
-# 810 "mysql.h"
-extern MYSQL_RES * mysql_stmt_result_metadata(MYSQL_STMT * stmt);
-# 815 "mysql.h"
-extern MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT * stmt, MYSQL_ROW_OFFSET);
-# 817 "mysql.h"
-extern MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT * stmt);
-# 806 "mysql.h"
-extern my_bool mysql_stmt_send_long_data(MYSQL_STMT * stmt, unsigned int, char const * data, unsigned long int);
-# 814 "mysql.h"
-extern char const * mysql_stmt_sqlstate(MYSQL_STMT * stmt);
-# 793 "mysql.h"
-extern int mysql_stmt_store_result(MYSQL_STMT * stmt);
-# 452 "mysql.h"
-extern MYSQL_RES * mysql_store_result(MYSQL * mysql);
-# 404 "mysql.h"
-extern void mysql_thread_end(void);
-# 428 "mysql.h"
-extern unsigned long int mysql_thread_id(MYSQL * mysql);
-# 403 "mysql.h"
-extern my_bool mysql_thread_init(void);
-# 561 "mysql.h"
-extern unsigned int mysql_thread_safe(void);
-# 699 "mysql/plugin.h"
-extern int mysql_tmpfile(char const * prefix);
-# 77 "mysql.h"
-extern char * mysql_unix_port;
-# 453 "mysql.h"
-extern MYSQL_RES * mysql_use_result(MYSQL * mysql);
-# 426 "mysql.h"
-extern unsigned int mysql_warning_count(MYSQL * mysql);
-# 346 "mysql_com.h"
-extern void net_clear(NET * net, my_bool);
-# 345 "mysql_com.h"
-extern void net_end(NET * net);
-# 348 "mysql_com.h"
-extern my_bool net_flush(NET * net);
-# 353 "mysql_com.h"
-extern int net_real_write(NET * net, unsigned char const * packet, size_t);
-# 347 "mysql_com.h"
-extern my_bool net_realloc(NET * net, size_t);
-# 350 "mysql_com.h"
-extern my_bool net_write_command(NET * net, unsigned char, unsigned char const * header, size_t, unsigned char const * packet, size_t);
-# 445 "mysql_com.h"
-extern char * octet2hex(char * to, char const * str, unsigned int);
-# 426 "mysql_com.h"
-extern void randominit(struct rand_struct *, unsigned long int, unsigned long int);
-# 440 "mysql_com.h"
-extern void scramble(char * to, char const * message, char const * password);
-# 433 "mysql_com.h"
-extern void scramble_323(char * to, char const * message, char const * password);
-# 37 "typelib.h"
-extern TYPELIB sql_protocol_typelib;
-# 729 "mysql/plugin.h"
-extern void * thd_alloc(void * thd, unsigned int);
-# 733 "mysql/plugin.h"
-extern void * thd_calloc(void * thd, unsigned int);
-# 770 "mysql/plugin.h"
-extern void thd_get_xid(void const * thd, MYSQL_XID * xid);
-# 680 "mysql/plugin.h"
-extern void * * thd_ha_data(void const * thd, struct handlerton const * hton);
-# 675 "mysql/plugin.h"
-extern int thd_in_lock_tables(void const * thd);
-# 685 "mysql/plugin.h"
-extern void thd_inc_row_count(void);
-# 715 "mysql/plugin.h"
-extern int thd_killed(void const * thd);
-# 760 "mysql/plugin.h"
-extern MYSQL_LEX_STRING * thd_make_lex_string(void * thd, MYSQL_LEX_STRING * lex_str, char const * str, unsigned int, int);
-# 745 "mysql/plugin.h"
-extern void * thd_memdup(void * thd, void const * str, unsigned int);
-# 679 "mysql/plugin.h"
-extern char const * thd_proc_info(void * thd, char const * info);
-# 682 "mysql/plugin.h"
-extern char * thd_security_context(void * thd, char * buffer, unsigned int, unsigned int);
-# 678 "mysql/plugin.h"
-extern int thd_sql_command(void const * thd);
-# 737 "mysql/plugin.h"
-extern char * thd_strdup(void * thd, char const * str);
-# 741 "mysql/plugin.h"
-extern char * thd_strmake(void * thd, char const * str, unsigned int);
-# 676 "mysql/plugin.h"
-extern int thd_tablespace_op(void const * thd);
-# 677 "mysql/plugin.h"
-extern long long int thd_test_options(void const * thd, long long int);
-# 681 "mysql/plugin.h"
-extern int thd_tx_isolation(void const * thd);

=== modified file 'libmysql/dll.c'
--- a/libmysql/dll.c	2008-02-19 17:45:11 +0000
+++ b/libmysql/dll.c	2008-09-01 21:51:54 +0000
@@ -89,9 +89,20 @@ BOOL APIENTRY LibMain(HANDLE hInst,DWORD
   UNREFERENCED_PARAMETER(lpReserved);
 } /* LibMain */
 
+
+static BOOL do_libmain;
 int __stdcall DllMain(HANDLE hInst,DWORD ul_reason_being_called,LPVOID lpReserved)
 {
-  return LibMain(hInst,ul_reason_being_called,lpReserved);
+  /*
+    Unless environment variable LIBMYSQL_DLLINIT is set, do nothing.
+    The environment variable is checked once, during the first call to DllMain()
+    (in DLL_PROCESS_ATTACH hook).
+  */
+  if (ul_reason_being_called == DLL_PROCESS_ATTACH)
+    do_libmain = (getenv("LIBMYSQL_DLLINIT") != NULL);
+  if (do_libmain)
+    return LibMain(hInst,ul_reason_being_called,lpReserved);
+  return TRUE;
 }
 
 #elif defined(WINDOWS)

=== modified file 'mysql-test/extra/rpl_tests/rpl_ddl.test'
--- a/mysql-test/extra/rpl_tests/rpl_ddl.test	2007-03-06 17:15:31 +0000
+++ b/mysql-test/extra/rpl_tests/rpl_ddl.test	2008-08-25 13:09:51 +0000
@@ -151,6 +151,20 @@ DROP DATABASE IF EXISTS mysqltest3;
 CREATE DATABASE mysqltest1;
 CREATE DATABASE mysqltest2;
 eval CREATE TABLE mysqltest1.t1 (f1 BIGINT) ENGINE=$engine_type;
+# Prevent Bug#26687 rpl_ddl test fails if run with --innodb option
+# The testscript (suite/rpl/rpl_ddl.test) + the expected result need that the
+# slave uses MyISAM for the table mysqltest.t1.
+# This is not valid in case of suite/rpl_ndb/rpl_ndb_ddl.test which sources
+# also this script.
+sync_slave_with_master;
+connection slave;
+if (`SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES
+     WHERE TABLE_SCHEMA = 'mysqltest1' AND TABLE_NAME = 't1'
+           AND ENGINE <> 'MyISAM' AND '$engine_type' <> 'NDB'`)
+{
+   skip This test needs on slave side: InnoDB disabled, default engine: MyISAM;
+}
+connection master;
 INSERT INTO mysqltest1.t1 SET f1= 0;
 eval CREATE TABLE mysqltest1.t2 (f1 BIGINT) ENGINE=$engine_type;
 eval CREATE TABLE mysqltest1.t3 (f1 BIGINT) ENGINE=$engine_type;

=== modified file 'mysql-test/extra/rpl_tests/rpl_log.test'
--- a/mysql-test/extra/rpl_tests/rpl_log.test	2008-03-14 16:52:57 +0000
+++ b/mysql-test/extra/rpl_tests/rpl_log.test	2008-09-01 09:00:52 +0000
@@ -13,22 +13,15 @@ save_master_pos;
 connection slave;
 sync_with_master;
 stop slave;
+--source include/wait_for_slave_to_stop.inc
 reset master;
 reset slave;
-# We are going to read the slave's binlog which contains file_id (for some LOAD
-# DATA INFILE); to make it repeatable (not influenced by other tests), we need
-# to stop and start the slave, to be sure file_id will start from 1.
-#  This can be done with 'server_stop slave', but
-# this would require the manager, so most of the time the test will be skipped
-# :(
-# To workaround this, I (Guilhem) add a (empty) rpl_log-slave.opt (because when
-# mysql-test-run finds such a file it restarts the slave before doing the
-# test). That's not very elegant but I could find no better way, sorry.
+start slave;
+--source include/wait_for_slave_to_start.inc
 
 let $VERSION=`select version()`;
 
 connection master;
-reset master;
 eval create table t1(n int not null auto_increment primary key)ENGINE=$engine_type;
 insert into t1 values (NULL);
 drop table t1;
@@ -79,7 +72,6 @@ connection slave;
 # Note that the above 'slave start' will cause a 3rd rotate event (a fake one)
 # to go into the relay log (the master always sends a fake one when replication
 # starts). 
-start slave;
 let $result_pattern= '%127.0.0.1%root%master-bin.000002%slave-relay-bin.000005%Yes%Yes%0%0%None%';
 --source include/wait_slave_status.inc
 sync_with_master;
@@ -87,6 +79,7 @@ sync_with_master;
 select * from t1 order by 1 asc;
 flush logs;
 stop slave;
+--source include/wait_for_slave_to_stop.inc
 connection master;
 
 # Create some entries for second log
@@ -95,6 +88,7 @@ eval create table t2 (n int)ENGINE=$engi
 insert into t2 values (1);
 source include/show_binlog_events.inc;
 --replace_result $VERSION VERSION
+--replace_regex /file_id=[0-9]+/file_id=#/ /block_len=[0-9]+/block_len=#/ /infile '.+'/infile 'words.dat'/
 --replace_column 2 # 5 #
 --replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
 show binlog events in 'master-bin.000002';
@@ -102,10 +96,12 @@ show binary logs;
 save_master_pos;
 connection slave;
 start slave;
+--source include/wait_for_slave_to_start.inc
 sync_with_master;
 show binary logs;
 --replace_result $MASTER_MYPORT MASTER_PORT $VERSION VERSION
 --replace_column 2 # 5 #
+--replace_regex /file_id=[0-9]+/file_id=#/ /block_len=[0-9]+/block_len=#/ /INFILE '.+'/INFILE 'words.dat'/
 --replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
 show binlog events in 'slave-bin.000001' from 4;
 --replace_result $MASTER_MYPORT MASTER_PORT $VERSION VERSION

=== modified file 'mysql-test/extra/rpl_tests/rpl_row_basic.test'
--- a/mysql-test/extra/rpl_tests/rpl_row_basic.test	2008-08-14 08:27:28 +0000
+++ b/mysql-test/extra/rpl_tests/rpl_row_basic.test	2008-09-03 20:04:07 +0000
@@ -451,3 +451,23 @@ 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;

=== modified file 'mysql-test/include/grant_cache.inc'
--- a/mysql-test/include/grant_cache.inc	2007-05-24 20:13:49 +0000
+++ b/mysql-test/include/grant_cache.inc	2008-09-03 14:45:40 +0000
@@ -136,7 +136,7 @@ connect (user3,localhost,mysqltest_3,,my
 connection user3;
 select "user3";
 --replace_result 127.0.0.1 localhost
---error ER_COLUMNACCESS_DENIED_ERROR
+--error ER_TABLEACCESS_DENIED_ERROR
 select * from t1;
 select a from t1;
 --replace_result 127.0.0.1 localhost

=== modified file 'mysql-test/r/create.result'
--- a/mysql-test/r/create.result	2008-05-13 12:06:32 +0000
+++ b/mysql-test/r/create.result	2008-09-05 09:06:24 +0000
@@ -1559,6 +1559,17 @@ SHOW INDEX FROM t1;
 Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment
 t1	1	c1	1	c1	A	NULL	NULL	NULL	YES	BTREE	
 DROP TABLE t1;
+CREATE TABLE t1 (a INTEGER AUTO_INCREMENT PRIMARY KEY, b INTEGER NOT NULL);
+INSERT IGNORE INTO t1 (b) VALUES (5);
+CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
+SELECT a FROM t1;
+CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
+SELECT a FROM t1;
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
+SELECT a FROM t1;
+ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
+DROP TABLE t1, t2;
 End of 5.0 tests
 CREATE TABLE t1 (a int, b int);
 insert into t1 values (1,1),(1,2);

=== modified file 'mysql-test/r/default.result'
--- a/mysql-test/r/default.result	2007-09-20 09:10:05 +0000
+++ b/mysql-test/r/default.result	2008-09-03 08:06:03 +0000
@@ -205,4 +205,19 @@ Warnings:
 Warning	1364	Field 'id' doesn't have a default value
 drop view v1;
 drop table t1;
+create table t1 (a int unique);
+create table t2 (b int default 10);
+insert into t1 (a) values (1);
+insert into t2 (b) values (1);
+insert into t1 (a) select b from t2 on duplicate key update a=default;
+select * from t1;
+a
+NULL
+insert into t1 (a) values (1);
+insert into t1 (a) select b from t2 on duplicate key update a=default(b);
+select * from t1;
+a
+NULL
+10
+drop table t1, t2;
 End of 5.0 tests.

=== modified file 'mysql-test/r/func_regexp.result'
--- a/mysql-test/r/func_regexp.result	2008-08-15 05:53:25 +0000
+++ b/mysql-test/r/func_regexp.result	2008-09-05 08:36:02 +0000
@@ -114,6 +114,18 @@ End of 4.1 tests
 SELECT 1 REGEXP NULL;
 1 REGEXP NULL
 NULL
+SELECT '' REGEXP BINARY NULL;
+'' REGEXP BINARY NULL
+NULL
+SELECT NULL REGEXP BINARY NULL;
+NULL REGEXP BINARY NULL
+NULL
+SELECT 'A' REGEXP BINARY NULL;
+'A' REGEXP BINARY NULL
+NULL
+SELECT "ABC" REGEXP BINARY NULL;
+"ABC" REGEXP BINARY NULL
+NULL
 End of 5.0 tests
 CREATE TABLE t1(a INT, b CHAR(4));
 INSERT INTO t1 VALUES (1, '6.1'), (1, '7.0'), (1, '8.0');

=== modified file 'mysql-test/r/grant2.result'
--- a/mysql-test/r/grant2.result	2007-09-27 09:32:59 +0000
+++ b/mysql-test/r/grant2.result	2008-09-03 14:45:40 +0000
@@ -434,7 +434,7 @@ USE db1;
 SELECT c FROM t2;
 ERROR 42000: SELECT command denied to user 'mysqltest1'@'localhost' for column 'c' in table 't2'
 SELECT * FROM t2;
-ERROR 42000: SELECT command denied to user 'mysqltest1'@'localhost' for column 'c' in table 't2'
+ERROR 42000: SELECT command denied to user 'mysqltest1'@'localhost' for table 't2'
 SELECT * FROM t1 JOIN t2 USING (b);
 ERROR 42000: SELECT command denied to user 'mysqltest1'@'localhost' for column 'c' in table 't2'
 DROP TABLE db1.t1, db1.t2;

=== modified file 'mysql-test/r/grant_cache_no_prot.result'
--- a/mysql-test/r/grant_cache_no_prot.result	2007-05-24 20:13:49 +0000
+++ b/mysql-test/r/grant_cache_no_prot.result	2008-09-03 14:45:40 +0000
@@ -155,7 +155,7 @@ select "user3";
 user3
 user3
 select * from t1;
-ERROR 42000: SELECT command denied to user 'mysqltest_3'@'localhost' for column 'b' in table 't1'
+ERROR 42000: SELECT command denied to user 'mysqltest_3'@'localhost' for table 't1'
 select a from t1;
 a
 1

=== modified file 'mysql-test/r/grant_cache_ps_prot.result'
--- a/mysql-test/r/grant_cache_ps_prot.result	2007-05-24 20:13:49 +0000
+++ b/mysql-test/r/grant_cache_ps_prot.result	2008-09-03 14:45:40 +0000
@@ -155,7 +155,7 @@ select "user3";
 user3
 user3
 select * from t1;
-ERROR 42000: SELECT command denied to user 'mysqltest_3'@'localhost' for column 'b' in table 't1'
+ERROR 42000: SELECT command denied to user 'mysqltest_3'@'localhost' for table 't1'
 select a from t1;
 a
 1

=== added file 'mysql-test/r/skip_log_bin.result'
--- a/mysql-test/r/skip_log_bin.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/r/skip_log_bin.result	2008-08-29 14:20:08 +0000
@@ -0,0 +1,6 @@
+DROP TABLE IF EXISTS t1, t2;
+set @@session.binlog_format=row;
+create table t1 (a int);
+insert into t1 values (1);
+create table t2 select * from t1;
+drop table t1, t2;

=== modified file 'mysql-test/r/status.result'
--- a/mysql-test/r/status.result	2008-05-21 15:34:14 +0000
+++ b/mysql-test/r/status.result	2008-09-05 10:44:16 +0000
@@ -180,3 +180,21 @@ Variable_name	Value
 Com_alter_function	0
 Com_create_function	1
 Com_drop_function	1
+create database db37908;
+create table db37908.t1(f1 int);
+insert into db37908.t1 values(1);
+grant usage,execute on test.* to mysqltest_1@localhost;
+create procedure proc37908() begin select 1; end |
+create function func37908() returns int sql security invoker 
+return (select * from db37908.t1 limit 1)|
+select * from db37908.t1;
+ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 't1'
+show status where variable_name ='uptime' and 2 in (select * from db37908.t1);
+ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 't1'
+show procedure status where name ='proc37908' and 1 in (select f1 from db37908.t1);
+ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 't1'
+show function status where name ='func37908' and 1 in (select func37908());
+ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 't1'
+drop database db37908;
+drop procedure proc37908;
+drop function func37908;

=== modified file 'mysql-test/r/type_datetime.result'
--- a/mysql-test/r/type_datetime.result	2007-12-08 21:54:07 +0000
+++ b/mysql-test/r/type_datetime.result	2008-09-09 15:52:38 +0000
@@ -560,6 +560,29 @@ select * from t2
 where id in (select id from t2 as x1 where (t2.cur_date is null));
 id	cur_date
 drop table t1,t2;
+SELECT 
+CAST('NULL' AS DATE) <=> CAST('2008-01-01' AS DATE) n1, 
+CAST('2008-01-01' AS DATE) <=> CAST('NULL' AS DATE) n2,
+CAST('NULL' AS DATE) <=> CAST('NULL' AS DATE) n3,
+CAST('NULL' AS DATE) <> CAST('2008-01-01' AS DATE) n4, 
+CAST('2008-01-01' AS DATE) <> CAST('NULL' AS DATE) n5,
+CAST('NULL' AS DATE) <> CAST('NULL' AS DATE) n6,
+CAST('NULL' AS DATE) < CAST('2008-01-01' AS DATE) n7, 
+CAST('2008-01-01' AS DATE) < CAST('NULL' AS DATE) n8,
+CAST('NULL' AS DATE) < CAST('NULL' AS DATE) n9;
+n1	n2	n3	n4	n5	n6	n7	n8	n9
+0	0	1	NULL	NULL	NULL	NULL	NULL	NULL
+Warnings:
+Warning	1292	Incorrect datetime value: 'NULL'
+Warning	1292	Incorrect datetime value: 'NULL'
+Warning	1292	Incorrect datetime value: 'NULL'
+Warning	1292	Incorrect datetime value: 'NULL'
+Warning	1292	Incorrect datetime value: 'NULL'
+Warning	1292	Incorrect datetime value: 'NULL'
+Warning	1292	Incorrect datetime value: 'NULL'
+Warning	1292	Incorrect datetime value: 'NULL'
+Warning	1292	Incorrect datetime value: 'NULL'
+Warning	1292	Incorrect datetime value: 'NULL'
 End of 5.0 tests
 set @org_mode=@@sql_mode;
 create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03');

=== modified file 'mysql-test/r/type_set.result'
--- a/mysql-test/r/type_set.result	2008-03-14 20:40:21 +0000
+++ b/mysql-test/r/type_set.result	2008-09-05 15:21:59 +0000
@@ -93,4 +93,14 @@ c
 1,2,3
 64
 DROP TABLE t1;
+CREATE TABLE t1 (
+set_unique_utf8 set ('a','b','c','d','e','f','g','h','i','j','k','l',
+'m','n','o','p','q','r','s','t','u','v','w','x',
+'y','z') CHARACTER SET utf8,
+unique (set_unique_utf8)
+);
+INSERT INTO t1 ( set_unique_utf8 ) VALUES ( '' );
+INSERT INTO t1 ( set_unique_utf8 ) VALUES ( '' );
+ERROR 23000: Duplicate entry '' for key 'set_unique_utf8'
+DROP TABLE t1;
 End of 5.0 tests

=== modified file 'mysql-test/r/view_grant.result'
--- a/mysql-test/r/view_grant.result	2008-03-22 08:01:31 +0000
+++ b/mysql-test/r/view_grant.result	2008-09-09 10:49:08 +0000
@@ -957,3 +957,42 @@ Warning	1356	View 'test.v1' references i
 DROP VIEW v1;
 DROP TABLE t1;
 End of 5.1 tests.
+CREATE USER mysqluser1@localhost;
+CREATE DATABASE mysqltest1;
+USE mysqltest1;
+CREATE TABLE t1 ( a INT, b INT );
+CREATE TABLE t2 ( a INT, b INT );
+CREATE VIEW v1 AS SELECT a, b FROM t1;
+GRANT SELECT( a ) ON v1 TO mysqluser1@localhost;
+GRANT UPDATE( b ) ON t2 TO mysqluser1@localhost;
+SELECT * FROM mysqltest1.v1;
+ERROR 42000: SELECT command denied to user 'mysqluser1'@'localhost' for table 'v1'
+CREATE VIEW v1 AS SELECT * FROM mysqltest1.t2;
+ERROR 42000: ANY command denied to user 'mysqluser1'@'localhost' for table 't2'
+DROP TABLE t1, t2;
+DROP VIEW v1;
+DROP DATABASE mysqltest1;
+DROP USER mysqluser1@localhost;
+CREATE USER mysqluser1@localhost;
+CREATE DATABASE mysqltest1;
+USE mysqltest1;
+CREATE VIEW v1 AS SELECT * FROM information_schema.tables LIMIT 1;
+CREATE ALGORITHM = TEMPTABLE VIEW v2 AS SELECT 1 AS A;
+CREATE VIEW test.v3 AS SELECT 1 AS a;
+GRANT SELECT ON mysqltest1.* to mysqluser1@localhost;
+GRANT ALL ON test.* TO mysqluser1@localhost;
+PREPARE stmt_v1     FROM "SELECT * FROM mysqltest1.v1";
+PREPARE stmt_v2 FROM "SELECT * FROM mysqltest1.v2";
+REVOKE SELECT ON mysqltest1.* FROM mysqluser1@localhost;
+EXECUTE stmt_v1;
+ERROR 42000: SELECT command denied to user 'mysqluser1'@'localhost' for table 'v1'
+EXECUTE stmt_v2;
+ERROR 42000: SELECT command denied to user 'mysqluser1'@'localhost' for table 'v2'
+PREPARE stmt FROM "SELECT a FROM v3";
+EXECUTE stmt;
+a
+1
+DROP VIEW v1, v2;
+DROP DATABASE mysqltest1;
+DROP VIEW test.v3;
+DROP USER mysqluser1@localhost;

=== added file 'mysql-test/suite/binlog/r/binlog_grant.result'
--- a/mysql-test/suite/binlog/r/binlog_grant.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/binlog/r/binlog_grant.result	2008-09-09 10:19:31 +0000
@@ -0,0 +1,28 @@
+reset master;
+set @saved_binlog_format = @@global.binlog_format;
+create user mysqltest_1@localhost;
+show grants for mysqltest_1@localhost;
+Grants for mysqltest_1@localhost
+GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
+**** Variable SQL_LOG_BIN ****
+[root]
+set global sql_log_bin = 1;
+ERROR HY000: Variable 'sql_log_bin' is a SESSION variable and can't be used with SET GLOBAL
+set session sql_log_bin = 1;
+[plain]
+set global sql_log_bin = 1;
+ERROR HY000: Variable 'sql_log_bin' is a SESSION variable and can't be used with SET GLOBAL
+set session sql_log_bin = 1;
+ERROR 42000: Access denied; you need the SUPER privilege for this operation
+**** Variable BINLOG_FORMAT ****
+[root]
+set global binlog_format = row;
+set session binlog_format = row;
+[plain]
+set global binlog_format = row;
+ERROR 42000: Access denied; you need the SUPER privilege for this operation
+set session binlog_format = row;
+ERROR 42000: Access denied; you need the SUPER privilege for this operation
+**** Clean up ****
+set global binlog_format = @saved_binlog_format;
+drop user mysqltest_1@localhost;

=== added file 'mysql-test/suite/binlog/t/binlog_grant.test'
--- a/mysql-test/suite/binlog/t/binlog_grant.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/binlog/t/binlog_grant.test	2008-09-09 10:19:31 +0000
@@ -0,0 +1,60 @@
+# Test grants for various objects (especially variables) related to
+# the binary log
+
+source include/have_log_bin.inc;
+
+connection default;
+--disable_warnings
+reset master;
+--enable_warnings
+
+set @saved_binlog_format = @@global.binlog_format;
+create user mysqltest_1@localhost;
+show grants for mysqltest_1@localhost;
+
+connect (plain,localhost,mysqltest_1,,test);
+connect (root,localhost,root,,test);
+
+# Testing setting both session and global SQL_LOG_BIN variable both as
+# root and as plain user.
+
+--echo **** Variable SQL_LOG_BIN ****
+
+connection root;
+--echo [root]
+--error ER_LOCAL_VARIABLE
+set global sql_log_bin = 1;
+set session sql_log_bin = 1;
+
+connection plain;
+--echo [plain]
+--error ER_LOCAL_VARIABLE
+set global sql_log_bin = 1;
+--error ER_SPECIFIC_ACCESS_DENIED_ERROR
+set session sql_log_bin = 1;
+
+
+# Testing setting both session and global BINLOG_FORMAT variable both
+# as root and as plain user.
+
+--echo **** Variable BINLOG_FORMAT ****
+
+connection root;
+--echo [root]
+set global binlog_format = row;
+set session binlog_format = row;
+
+connection plain;
+--echo [plain]
+--error ER_SPECIFIC_ACCESS_DENIED_ERROR
+set global binlog_format = row;
+--error ER_SPECIFIC_ACCESS_DENIED_ERROR
+set session binlog_format = row;
+
+--echo **** Clean up ****
+disconnect plain;
+disconnect root;
+
+connection default;
+set global binlog_format = @saved_binlog_format;
+drop user mysqltest_1@localhost;

=== modified file 'mysql-test/suite/funcs_1/datadict/processlist_priv.inc'
--- a/mysql-test/suite/funcs_1/datadict/processlist_priv.inc	2008-04-26 23:52:43 +0000
+++ b/mysql-test/suite/funcs_1/datadict/processlist_priv.inc	2008-08-21 14:38:49 +0000
@@ -16,7 +16,7 @@
 #        That means our SHOW PROCESSLIST can come too early.           #
 #     Solution:                                                        #
 #        Close the connections at the end of the test.                 #
-#     Example2:                                                        #
+#     Example2 (2008-08-14 again observed):                            #
 #     1. connection X: SHOW PROCESSLIST/GRANT ... etc.                 #
 #     2. Switch to connection  Y                                       #
 #     3. SHOW PROCESSLIST might present a record like                  #
@@ -53,9 +53,11 @@
 #                    WL#3982 Test information_schema.processlist       #
 #                                                                      #
 # Last update:                                                         #
-# 2008-04-14 pcrews  replace HOST to account for Windows' use of       #
-#                    localhost (host:<port> causing diffs on Windows   #
-#                    test runs                                         #
+# 2008-08-14 mleich  Bug#38270 Test "processlist_priv_ps" fails on     #
+#                              varying "processlist" output            #
+#                    - Replace one sleep by a poll routines            #
+#                    - Remove or disable superfluous sleeps            #
+#                                                                      #
 ########################################################################
 
 # The following variables are used in "datadict_priv.inc" and here.
@@ -87,15 +89,28 @@ USE information_schema;
 --echo 1 Prepare test.
 --echo   connection default (user=root)
 --echo ####################################################################################
+if (`SELECT COUNT(*) <> 1 FROM processlist`)
+{
+   --echo This test expects one connection to the server.
+   --echo Expectation: USER  HOST       DB                  COMMAND  STATE      INFO
+   --echo Expectation: root  localhost  information_schema  Query    executing  SELECT USER,HOST,DB,COMMAND,STATE,INFO FROM processlist ORDER BY ID
+   --echo But we found in the moment:
+   SELECT USER,HOST,DB,COMMAND,STATE,INFO FROM processlist ORDER BY ID;
+   --echo Maybe
+   --echo - the base configuration (no of parallel auxiliary sessions) of the server has changed
+   --echo - a parallel test intended for another server accidently connected to our current one
+   --echo We cannot proceed in this situation. Abort
+   exit;
+}
 
 --echo ####################################################################################
 --echo 1.1 Create two user
 --echo ####################################################################################
 # access to info tables as normal user
---disable_abort_on_error
+--error 0, ER_CANNOT_USER
 DROP USER ddicttestuser1@'localhost';
+--error 0, ER_CANNOT_USER
 DROP USER ddicttestuser2@'localhost';
---enable_abort_on_error
 CREATE USER ddicttestuser1@'localhost';
 CREATE USER ddicttestuser2@'localhost';
 SET PASSWORD FOR ddicttestuser1@'localhost' = PASSWORD('ddictpass');
@@ -112,6 +127,14 @@ connect (con100,localhost,ddicttestuser1
 --echo   SHOW/SELECT shows all processes/threads.
 --echo ####################################################################################
 connection default;
+# Avoid Bug#38270 Test "processlist_priv_ps" fails on varying "processlist" output
+#    This subtest expects that the connection con100 is in state 'Sleep'.
+#    Poll till the connection con100 is in state COMMAND = 'Sleep'.
+let $wait_timeout= 10;
+let $wait_condition=
+SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST
+WHERE DB = 'information_schema' AND COMMAND = 'Sleep' AND USER = 'ddicttestuser1';
+--source include/wait_condition.inc
 eval SHOW CREATE TABLE $table;
 --replace_column 1 ID 3 HOST_NAME 6 TIME
 eval SHOW $table;
@@ -120,7 +143,6 @@ eval SELECT * FROM $table $select_where 
 --replace_column 1 ID 3 HOST_NAME 6 TIME
 eval SELECT $columns FROM $table $select_where ORDER BY id;
 --source suite/funcs_1/datadict/datadict_priv.inc
---real_sleep 0.3
 
 
 --echo ####################################################################################
@@ -128,6 +150,9 @@ eval SELECT $columns FROM $table $select
 connection con100;
 --echo   SHOW/SELECT shows only the processes (1) of the user.
 --echo ####################################################################################
+# No need for poll routine here.
+# The current state of the default session might depend on load of testing box
+# but "ddicttestuser1" must not see anything of the root session.
 eval SHOW CREATE TABLE $table;
 --replace_column 1 ID 3 HOST_NAME 6 TIME
 eval SHOW $table;
@@ -219,7 +244,7 @@ SELECT * FROM information_schema.process
 
 
 --echo ####################################################################################
---echo 7 Revoke PROCESS privilege from anonymous user + disconnect ddicttestuser1
+--echo 7 Revoke PROCESS privilege from anonymous user
 --echo   connection default (user=root)
 --echo ####################################################################################
 connection default;

=== modified file 'mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result'
--- a/mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result	2008-04-26 23:52:43 +0000
+++ b/mysql-test/suite/funcs_1/r/processlist_priv_no_prot.result	2008-08-21 14:38:49 +0000
@@ -7,9 +7,7 @@ connection default (user=root)
 1.1 Create two user
 ####################################################################################
 DROP USER ddicttestuser1@'localhost';
-ERROR HY000: Operation DROP USER failed for 'ddicttestuser1'@'localhost'
 DROP USER ddicttestuser2@'localhost';
-ERROR HY000: Operation DROP USER failed for 'ddicttestuser2'@'localhost'
 CREATE USER ddicttestuser1@'localhost';
 CREATE USER ddicttestuser2@'localhost';
 SET PASSWORD FOR ddicttestuser1@'localhost' = PASSWORD('ddictpass');
@@ -240,7 +238,7 @@ ID	ddicttestuser1	HOST_NAME	information_
 ID	ddicttestuser1	HOST_NAME	information_schema	Sleep	TIME		NULL
 ID	ddicttestuser1	HOST_NAME	information_schema	Sleep	TIME		NULL
 ####################################################################################
-7 Revoke PROCESS privilege from anonymous user + disconnect ddicttestuser1
+7 Revoke PROCESS privilege from anonymous user
 connection default (user=root)
 ####################################################################################
 REVOKE PROCESS ON *.* FROM ''@'localhost';

=== modified file 'mysql-test/suite/funcs_1/r/processlist_priv_ps.result'
--- a/mysql-test/suite/funcs_1/r/processlist_priv_ps.result	2008-04-26 23:52:43 +0000
+++ b/mysql-test/suite/funcs_1/r/processlist_priv_ps.result	2008-08-21 14:38:49 +0000
@@ -7,9 +7,7 @@ connection default (user=root)
 1.1 Create two user
 ####################################################################################
 DROP USER ddicttestuser1@'localhost';
-ERROR HY000: Operation DROP USER failed for 'ddicttestuser1'@'localhost'
 DROP USER ddicttestuser2@'localhost';
-ERROR HY000: Operation DROP USER failed for 'ddicttestuser2'@'localhost'
 CREATE USER ddicttestuser1@'localhost';
 CREATE USER ddicttestuser2@'localhost';
 SET PASSWORD FOR ddicttestuser1@'localhost' = PASSWORD('ddictpass');
@@ -240,7 +238,7 @@ ID	ddicttestuser1	HOST_NAME	information_
 ID	ddicttestuser1	HOST_NAME	information_schema	Sleep	TIME		NULL
 ID	ddicttestuser1	HOST_NAME	information_schema	Sleep	TIME		NULL
 ####################################################################################
-7 Revoke PROCESS privilege from anonymous user + disconnect ddicttestuser1
+7 Revoke PROCESS privilege from anonymous user
 connection default (user=root)
 ####################################################################################
 REVOKE PROCESS ON *.* FROM ''@'localhost';

=== added file 'mysql-test/suite/rpl/r/rpl_binlog_query_filter_rules.result'
--- a/mysql-test/suite/rpl/r/rpl_binlog_query_filter_rules.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/r/rpl_binlog_query_filter_rules.result	2008-09-03 10:01:18 +0000
@@ -0,0 +1,11 @@
+drop table if exists t1;
+reset master;
+create table t1 (a int);
+insert into t1 values (1);
+flush logs;
+drop table t1;
+*** must be 1 ***
+select * from t1;
+a
+1
+drop table t1;

=== modified file 'mysql-test/suite/rpl/r/rpl_row_basic_2myisam.result'
--- a/mysql-test/suite/rpl/r/rpl_row_basic_2myisam.result	2008-08-12 09:09:36 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_basic_2myisam.result	2008-09-03 20:04:07 +0000
@@ -520,3 +520,10 @@ INSERT INTO t7 VALUES (1, "", 1);
 INSERT INTO t7 VALUES (2, repeat(_utf8'a', 255), 2);
 Comparing tables master:test.t7 and slave:test.t7
 drop table t1, t2, t3, t4, t5, t6, t7;
+CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE='MYISAM' ;
+INSERT INTO t1 VALUES (1), (2), (3);
+UPDATE t1 SET a = 10;
+ERROR 23000: Duplicate entry '10' for key 'PRIMARY'
+INSERT INTO t1 VALUES (4);
+Comparing tables master:test.t1 and slave:test.t1
+drop table t1;

=== modified file 'mysql-test/suite/rpl/r/rpl_row_basic_3innodb.result'
--- a/mysql-test/suite/rpl/r/rpl_row_basic_3innodb.result	2008-08-12 09:09:36 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_basic_3innodb.result	2008-09-03 20:04:07 +0000
@@ -520,3 +520,10 @@ INSERT INTO t7 VALUES (1, "", 1);
 INSERT INTO t7 VALUES (2, repeat(_utf8'a', 255), 2);
 Comparing tables master:test.t7 and slave:test.t7
 drop table t1, t2, t3, t4, t5, t6, t7;
+CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE='INNODB' ;
+INSERT INTO t1 VALUES (1), (2), (3);
+UPDATE t1 SET a = 10;
+ERROR 23000: Duplicate entry '10' for key 'PRIMARY'
+INSERT INTO t1 VALUES (4);
+Comparing tables master:test.t1 and slave:test.t1
+drop table t1;

=== modified file 'mysql-test/suite/rpl/r/rpl_row_log.result'
--- a/mysql-test/suite/rpl/r/rpl_row_log.result	2008-03-28 12:16:41 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_log.result	2008-09-01 09:27:41 +0000
@@ -7,7 +7,7 @@ start slave;
 stop slave;
 reset master;
 reset slave;
-reset master;
+start slave;
 create table t1(n int not null auto_increment primary key)ENGINE=MyISAM;
 insert into t1 values (NULL);
 drop table t1;
@@ -113,7 +113,6 @@ Aberdeen
 Abernathy
 aberrant
 aberration
-start slave;
 
 let $result_pattern= '%127.0.0.1%root%master-bin.000002%slave-relay-bin.000005%Yes%Yes%0%0%None%' ;
 

=== modified file 'mysql-test/suite/rpl/r/rpl_row_log_innodb.result'
--- a/mysql-test/suite/rpl/r/rpl_row_log_innodb.result	2008-03-28 12:16:41 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_log_innodb.result	2008-09-01 09:27:41 +0000
@@ -7,7 +7,7 @@ start slave;
 stop slave;
 reset master;
 reset slave;
-reset master;
+start slave;
 create table t1(n int not null auto_increment primary key)ENGINE=InnoDB;
 insert into t1 values (NULL);
 drop table t1;
@@ -113,7 +113,6 @@ Aberdeen
 Abernathy
 aberrant
 aberration
-start slave;
 
 let $result_pattern= '%127.0.0.1%root%master-bin.000002%slave-relay-bin.000005%Yes%Yes%0%0%None%' ;
 

=== modified file 'mysql-test/suite/rpl/r/rpl_stm_log.result'
--- a/mysql-test/suite/rpl/r/rpl_stm_log.result	2008-07-29 15:36:13 +0000
+++ b/mysql-test/suite/rpl/r/rpl_stm_log.result	2008-09-01 09:00:52 +0000
@@ -7,7 +7,7 @@ start slave;
 stop slave;
 reset master;
 reset slave;
-reset master;
+start slave;
 create table t1(n int not null auto_increment primary key)ENGINE=MyISAM;
 insert into t1 values (NULL);
 drop table t1;
@@ -109,7 +109,6 @@ Aberdeen
 Abernathy
 aberrant
 aberration
-start slave;
 
 let $result_pattern= '%127.0.0.1%root%master-bin.000002%slave-relay-bin.000005%Yes%Yes%0%0%None%' ;
 

=== added file 'mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules-master.opt'
--- a/mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules-master.opt	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules-master.opt	2008-09-03 10:01:18 +0000
@@ -0,0 +1 @@
+--replicate-do-db='impossible_database'

=== added file 'mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules.test'
--- a/mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules.test	2008-09-03 10:01:18 +0000
@@ -0,0 +1,31 @@
+# regression test for
+# Bug#36099 replicate-do-db affects replaying RBR events with mysqlbinlog
+# The test verifies that the slave side filtering rule does not affect
+# applying of row-events on master via mysqlbinlog
+
+-- source include/have_log_bin.inc
+-- source include/not_embedded.inc
+-- source include/have_binlog_format_row.inc
+
+--disable_warnings
+drop table if exists t1;
+--enable_warnings
+
+reset master;
+
+create table t1 (a int);
+insert into t1 values (1);
+
+flush logs;
+--exec $MYSQL_BINLOG  $MYSQLTEST_VARDIR/log/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/bug36099.sql
+
+drop table t1;
+--exec $MYSQL -e "source $MYSQLTEST_VARDIR/tmp/bug36099.sql"
+
+--echo *** must be 1 ***
+select * from t1;
+
+# cleanup
+
+drop table t1;
+remove_file $MYSQLTEST_VARDIR/tmp/bug36099.sql;

=== modified file 'mysql-test/suite/rpl/t/rpl_stm_log-slave.opt'
--- a/mysql-test/suite/rpl/t/rpl_stm_log-slave.opt	2007-06-27 12:28:02 +0000
+++ b/mysql-test/suite/rpl/t/rpl_stm_log-slave.opt	2008-09-01 09:00:52 +0000
@@ -1 +1 @@
-
+--log-slave-updates

=== removed file 'mysql-test/suite/rpl/t/rpl_view-slave.opt'
--- a/mysql-test/suite/rpl/t/rpl_view-slave.opt	2007-06-27 12:28:02 +0000
+++ b/mysql-test/suite/rpl/t/rpl_view-slave.opt	1970-01-01 00:00:00 +0000
@@ -1 +0,0 @@
---replicate-ignore-table=test.foo

=== modified file 'mysql-test/suite/rpl_ndb/r/rpl_ndb_log.result'
--- a/mysql-test/suite/rpl_ndb/r/rpl_ndb_log.result	2008-03-28 12:16:41 +0000
+++ b/mysql-test/suite/rpl_ndb/r/rpl_ndb_log.result	2008-09-03 10:27:01 +0000
@@ -7,7 +7,7 @@ start slave;
 stop slave;
 reset master;
 reset slave;
-reset master;
+start slave;
 create table t1(n int not null auto_increment primary key)ENGINE=NDB;
 insert into t1 values (NULL);
 drop table t1;
@@ -117,7 +117,6 @@ Aberdeen
 Abernathy
 aberrant
 aberration
-start slave;
 
 let $result_pattern= '%127.0.0.1%root%master-bin.000002%slave-relay-bin.000005%Yes%Yes%0%0%None%' ;
 

=== modified file 'mysql-test/suite/rpl_ndb/r/rpl_row_basic_7ndb.result'
--- a/mysql-test/suite/rpl_ndb/r/rpl_row_basic_7ndb.result	2008-08-12 09:09:36 +0000
+++ b/mysql-test/suite/rpl_ndb/r/rpl_row_basic_7ndb.result	2008-09-03 20:52:54 +0000
@@ -520,3 +520,10 @@ INSERT INTO t7 VALUES (1, "", 1);
 INSERT INTO t7 VALUES (2, repeat(_utf8'a', 255), 2);
 Comparing tables master:test.t7 and slave:test.t7
 drop table t1, t2, t3, t4, t5, t6, t7;
+CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE='NDB' ;
+INSERT INTO t1 VALUES (1), (2), (3);
+UPDATE t1 SET a = 10;
+ERROR 23000: Duplicate entry '10' for key 'PRIMARY'
+INSERT INTO t1 VALUES (4);
+Comparing tables master:test.t1 and slave:test.t1
+drop table t1;

=== modified file 'mysql-test/t/create.test'
--- a/mysql-test/t/create.test	2008-05-13 12:06:32 +0000
+++ b/mysql-test/t/create.test	2008-09-05 08:36:02 +0000
@@ -1176,6 +1176,24 @@ SHOW INDEX FROM t1;
 DROP TABLE t1;
 
 
+#
+# Bug#38821: Assert table->auto_increment_field_not_null failed in open_table()
+#
+CREATE TABLE t1 (a INTEGER AUTO_INCREMENT PRIMARY KEY, b INTEGER NOT NULL);
+INSERT IGNORE INTO t1 (b) VALUES (5);
+
+CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
+  SELECT a FROM t1;
+--error 1062
+CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
+  SELECT a FROM t1;
+--error 1062
+CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
+  SELECT a FROM t1;
+
+DROP TABLE t1, t2;
+
+
 --echo End of 5.0 tests
 
 #

=== modified file 'mysql-test/t/default.test'
--- a/mysql-test/t/default.test	2007-02-12 11:41:36 +0000
+++ b/mysql-test/t/default.test	2008-09-03 07:32:43 +0000
@@ -145,5 +145,24 @@ insert into t1 values(default);
 drop view v1;
 drop table t1;
 
+#
+# Bug #39002: crash with
+#             INSERT ... SELECT ... ON DUPLICATE KEY UPDATE col=DEFAULT
+#
+
+create table t1 (a int unique);
+create table t2 (b int default 10);
+insert into t1 (a) values (1);
+insert into t2 (b) values (1);
+
+insert into t1 (a) select b from t2 on duplicate key update a=default;
+select * from t1;
+
+insert into t1 (a) values (1);
+insert into t1 (a) select b from t2 on duplicate key update a=default(b);
+select * from t1;
+
+drop table t1, t2;
+
 --echo End of 5.0 tests.
 

=== modified file 'mysql-test/t/func_regexp.test'
--- a/mysql-test/t/func_regexp.test	2008-08-15 05:53:25 +0000
+++ b/mysql-test/t/func_regexp.test	2008-09-05 08:36:02 +0000
@@ -64,6 +64,16 @@ drop table t1;
 
 SELECT 1 REGEXP NULL;
 
+
+#
+# Bug #39021: SELECT REGEXP BINARY NULL never returns
+#
+
+SELECT '' REGEXP BINARY NULL;
+SELECT NULL REGEXP BINARY NULL;
+SELECT 'A' REGEXP BINARY NULL;
+SELECT "ABC" REGEXP BINARY NULL;
+
 --echo End of 5.0 tests
 
 

=== modified file 'mysql-test/t/grant2.test'
--- a/mysql-test/t/grant2.test	2007-09-27 09:32:59 +0000
+++ b/mysql-test/t/grant2.test	2008-09-03 14:45:40 +0000
@@ -605,7 +605,7 @@ connection conn1;
 USE db1;
 --error ER_COLUMNACCESS_DENIED_ERROR
 SELECT c FROM t2;
---error ER_COLUMNACCESS_DENIED_ERROR
+--error ER_TABLEACCESS_DENIED_ERROR
 SELECT * FROM t2;
 --error ER_COLUMNACCESS_DENIED_ERROR
 SELECT * FROM t1 JOIN t2 USING (b);

=== modified file 'mysql-test/t/partition_not_windows.test'
--- a/mysql-test/t/partition_not_windows.test	2008-03-17 15:11:26 +0000
+++ b/mysql-test/t/partition_not_windows.test	2008-08-28 14:59:22 +0000
@@ -3,6 +3,8 @@
 --source include/have_partition.inc
 # DATA DIRECTORY/INDEX DIRECTORY require symbolic link support
 --source include/have_symlink.inc
+# realpath is not compiled in when building with valgrind
+--source include/not_valgrind.inc
 
 # The test for Bug 20770 is disabled on Windows due to BUG#19107; it
 # should be moved into partition.test once the bug has been resolved.

=== added file 'mysql-test/t/skip_log_bin-master.opt'
--- a/mysql-test/t/skip_log_bin-master.opt	1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/skip_log_bin-master.opt	2008-08-29 14:20:08 +0000
@@ -0,0 +1 @@
+--loose-skip-log-bin

=== added file 'mysql-test/t/skip_log_bin.test'
--- a/mysql-test/t/skip_log_bin.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/skip_log_bin.test	2008-08-29 14:20:08 +0000
@@ -0,0 +1,25 @@
+#
+# binlog_off.test purpose is to verify that the --skip-log-bin flag
+# works correctly
+#
+
+--disable_warnings
+DROP TABLE IF EXISTS t1, t2;
+--enable_warnings
+
+#
+# Bug #38798 Assertion mysql_bin_log.is_open() failed in 
+#            binlog_trans_log_savepos()
+# Testing that there is no crash.
+# Before BUG#38798, the code for CREATE...SELECT called an internal function to
+# binlog the statement, even with --skip-log-bin. This caused an assertion
+# to be thrown since the binlog was not open.
+
+set @@session.binlog_format=row;
+
+create table t1 (a int);
+insert into t1 values (1);
+create table t2 select * from t1;
+
+# clean-up
+drop table t1, t2;

=== modified file 'mysql-test/t/status.test'
--- a/mysql-test/t/status.test	2008-05-21 15:34:14 +0000
+++ b/mysql-test/t/status.test	2008-09-05 10:44:16 +0000
@@ -261,4 +261,37 @@ drop function f1;
 
 show status like 'Com%function';
 
+#
+# Bug#37908: Skipped access right check caused server crash.
+#
+connect (root, localhost, root,,test);
+connection root;
+--disable_warnings
+create database db37908;
+--enable_warnings
+create table db37908.t1(f1 int);
+insert into db37908.t1 values(1);
+grant usage,execute on test.* to mysqltest_1@localhost;
+delimiter |;
+create procedure proc37908() begin select 1; end |
+create function func37908() returns int sql security invoker 
+  return (select * from db37908.t1 limit 1)|
+delimiter ;|
+  
+connect (user1,localhost,mysqltest_1,,test);
+connection user1;
+
+--error 1142
+select * from db37908.t1;
+--error 1142
+show status where variable_name ='uptime' and 2 in (select * from db37908.t1);
+--error 1142
+show procedure status where name ='proc37908' and 1 in (select f1 from db37908.t1);
+--error 1142
+show function status where name ='func37908' and 1 in (select func37908());
+
+connection root;
+drop database db37908;
+drop procedure proc37908;
+drop function func37908;
 # End of 5.1 tests

=== modified file 'mysql-test/t/type_datetime.test'
--- a/mysql-test/t/type_datetime.test	2007-12-13 12:10:57 +0000
+++ b/mysql-test/t/type_datetime.test	2008-09-09 15:52:38 +0000
@@ -388,6 +388,22 @@ where id in (select id from t2 as x1 whe
 
 drop table t1,t2;
 
+
+#
+# Bug #37526: asymertic operator <=> in trigger
+#
+SELECT 
+  CAST('NULL' AS DATE) <=> CAST('2008-01-01' AS DATE) n1, 
+  CAST('2008-01-01' AS DATE) <=> CAST('NULL' AS DATE) n2,
+  CAST('NULL' AS DATE) <=> CAST('NULL' AS DATE) n3,
+  CAST('NULL' AS DATE) <> CAST('2008-01-01' AS DATE) n4, 
+  CAST('2008-01-01' AS DATE) <> CAST('NULL' AS DATE) n5,
+  CAST('NULL' AS DATE) <> CAST('NULL' AS DATE) n6,
+  CAST('NULL' AS DATE) < CAST('2008-01-01' AS DATE) n7, 
+  CAST('2008-01-01' AS DATE) < CAST('NULL' AS DATE) n8,
+  CAST('NULL' AS DATE) < CAST('NULL' AS DATE) n9;
+
+
 --echo End of 5.0 tests
 #
 # Test of storing datetime into date fields

=== modified file 'mysql-test/t/type_set.test'
--- a/mysql-test/t/type_set.test	2008-03-14 20:40:21 +0000
+++ b/mysql-test/t/type_set.test	2008-09-05 15:21:59 +0000
@@ -75,4 +75,23 @@ INSERT INTO t1 VALUES(922337203685477580
 SELECT * FROM t1;
 DROP TABLE t1;
 
+#
+# Bug #38701: Crash in String::append when inserting duplicate empty strings
+# an uft8 SET col
+#
+
+CREATE TABLE t1 (
+        set_unique_utf8 set ('a','b','c','d','e','f','g','h','i','j','k','l',
+                             'm','n','o','p','q','r','s','t','u','v','w','x',
+                             'y','z') CHARACTER SET utf8,
+        unique (set_unique_utf8)
+);
+
+INSERT INTO t1 ( set_unique_utf8 ) VALUES ( '' );
+--error ER_DUP_ENTRY 
+INSERT INTO t1 ( set_unique_utf8 ) VALUES ( '' );
+
+DROP TABLE t1;
+
+
 --echo End of 5.0 tests

=== modified file 'mysql-test/t/view_grant.test'
--- a/mysql-test/t/view_grant.test	2008-02-21 09:24:40 +0000
+++ b/mysql-test/t/view_grant.test	2008-09-09 10:49:08 +0000
@@ -1219,3 +1219,80 @@ DROP VIEW v1;
 DROP TABLE t1;
 
 --echo End of 5.1 tests.
+
+#
+# Bug#36086: SELECT * from views don't check column grants
+#
+CREATE USER mysqluser1@localhost;
+CREATE DATABASE mysqltest1;
+
+USE mysqltest1;
+
+CREATE TABLE t1 ( a INT, b INT );
+CREATE TABLE t2 ( a INT, b INT );
+
+CREATE VIEW v1 AS SELECT a, b FROM t1;
+
+GRANT SELECT( a ) ON v1 TO mysqluser1@localhost;
+GRANT UPDATE( b ) ON t2 TO mysqluser1@localhost;
+
+--connect (connection1, localhost, mysqluser1, , test)
+
+--error ER_TABLEACCESS_DENIED_ERROR
+SELECT * FROM mysqltest1.v1;
+
+--error ER_TABLEACCESS_DENIED_ERROR
+CREATE VIEW v1 AS SELECT * FROM mysqltest1.t2;
+
+--disconnect connection1
+
+--connection default
+
+DROP TABLE t1, t2;
+DROP VIEW v1;
+DROP DATABASE mysqltest1;
+DROP USER mysqluser1@localhost;
+
+#
+# Bug#35600: Security breach via view, I_S table and prepared 
+# statement/stored procedure
+#
+CREATE USER mysqluser1@localhost;
+CREATE DATABASE mysqltest1;
+
+USE mysqltest1;
+
+CREATE VIEW v1 AS SELECT * FROM information_schema.tables LIMIT 1;
+CREATE ALGORITHM = TEMPTABLE VIEW v2 AS SELECT 1 AS A;
+
+CREATE VIEW test.v3 AS SELECT 1 AS a;
+
+--connection default
+GRANT SELECT ON mysqltest1.* to mysqluser1@localhost;
+GRANT ALL ON test.* TO mysqluser1@localhost;
+
+--connect (connection1, localhost, mysqluser1, , test)
+PREPARE stmt_v1     FROM "SELECT * FROM mysqltest1.v1";
+PREPARE stmt_v2 FROM "SELECT * FROM mysqltest1.v2";
+
+--connection default
+REVOKE SELECT ON mysqltest1.* FROM mysqluser1@localhost;
+
+--connection connection1
+
+--error ER_TABLEACCESS_DENIED_ERROR
+EXECUTE stmt_v1;
+--error ER_TABLEACCESS_DENIED_ERROR
+EXECUTE stmt_v2;
+--disconnect connection1
+
+--connect (connection2, localhost, mysqluser1,,)
+PREPARE stmt FROM "SELECT a FROM v3";
+EXECUTE stmt;
+--disconnect connection2
+
+--connection default
+DROP VIEW v1, v2;
+DROP DATABASE mysqltest1;
+DROP VIEW test.v3;
+DROP USER mysqluser1@localhost;

=== modified file 'scripts/mysql_install_db.sh'
--- a/scripts/mysql_install_db.sh	2007-12-13 02:14:28 +0000
+++ b/scripts/mysql_install_db.sh	2008-09-02 08:53:30 +0000
@@ -339,6 +339,7 @@ mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$my
 mysqld_install_cmd_line="$mysqld_bootstrap $defaults $mysqld_opt --bootstrap \
   --basedir=$basedir --datadir=$ldata --log-warnings=0 --loose-skip-innodb \
   --loose-skip-ndbcluster $args --max_allowed_packet=8M \
+  --default-storage-engine=myisam \
   --net_buffer_length=16K"
 
 # Create the system and help tables by passing them to "mysqld --bootstrap"

=== removed file 'server-tools/instance-manager/mysqlmanager.vcproj'
--- a/server-tools/instance-manager/mysqlmanager.vcproj	2007-03-19 15:18:10 +0000
+++ b/server-tools/instance-manager/mysqlmanager.vcproj	1970-01-01 00:00:00 +0000
@@ -1,382 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="7.10"
-	Name="mysqlmanager"
-	ProjectGUID="{6D524B3E-210A-4FCD-8D41-FEC0D21E83AC}"
-	Keyword="Win32Proj">
-	<Platforms>
-		<Platform
-			Name="Win32"/>
-	</Platforms>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory=".\debug_obj"
-			IntermediateDirectory=".\debug_obj"
-			ConfigurationType="1"
-			CharacterSet="2">
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				OptimizeForProcessor="2"
-				AdditionalIncludeDirectories="..\..\include,../../extra/yassl/include"
-				PreprocessorDefinitions="MYSQL_INSTANCE_MANAGER;MYSQL_SERVER;_DEBUG;SAFEMALLOC;SAFE_MUTEX;_WINDOWS;CONSOLE"
-				MinimalRebuild="TRUE"
-				ExceptionHandling="FALSE"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="TRUE"
-				DebugInformationFormat="4"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="wsock32.lib"
-				OutputFile=".\debug/mysqlmanager.exe"
-				LinkIncremental="1"
-				GenerateDebugInformation="TRUE"
-				ProgramDatabaseFile=".\debug/mysqlmanager.pdb"
-				GenerateMapFile="TRUE"
-				MapFileName=".\debug/mysqlmanager.map"
-				SubSystem="1"
-				TargetMachine="1"/>
-			<Tool
-				Name="VCMIDLTool"/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory=".\release_obj"
-			IntermediateDirectory=".\release_obj"
-			ConfigurationType="1"
-			CharacterSet="2">
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="2"
-				InlineFunctionExpansion="1"
-				OptimizeForProcessor="2"
-				AdditionalIncludeDirectories="..\..\include,../../extra/yassl/include"
-				PreprocessorDefinitions="MYSQL_INSTANCE_MANAGER;MYSQL_SERVER;_WINDOWS;CONSOLE"
-				ExceptionHandling="FALSE"
-				RuntimeLibrary="0"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="TRUE"
-				DebugInformationFormat="3"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="wsock32.lib"
-				OutputFile=".\release/mysqlmanager.exe"
-				LinkIncremental="1"
-				GenerateDebugInformation="TRUE"
-				ProgramDatabaseFile=".\release/mysqlmanager.pdb"
-				GenerateMapFile="TRUE"
-				MapFileName=".\release/mysqlmanager.map"
-				SubSystem="1"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				TargetMachine="1"/>
-			<Tool
-				Name="VCMIDLTool"/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
-			<File
-				RelativePath=".\buffer.cpp">
-			</File>
-			<File
-				RelativePath="..\..\sql\client.c">
-				<FileConfiguration
-					Name="Debug|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath=".\command.cpp">
-			</File>
-			<File
-				RelativePath=".\commands.cpp">
-			</File>
-			<File
-				RelativePath="..\..\libmysql\get_password.c">
-				<FileConfiguration
-					Name="Debug|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath=".\guardian.cpp">
-			</File>
-			<File
-				RelativePath=".\IMService.cpp">
-			</File>
-			<File
-				RelativePath=".\instance.cpp">
-			</File>
-			<File
-				RelativePath=".\instance_map.cpp">
-			</File>
-			<File
-				RelativePath=".\instance_options.cpp">
-			</File>
-			<File
-				RelativePath=".\listener.cpp">
-			</File>
-			<File
-				RelativePath=".\log.cpp">
-			</File>
-			<File
-				RelativePath=".\manager.cpp">
-			</File>
-			<File
-				RelativePath=".\messages.cpp">
-			</File>
-			<File
-				RelativePath="..\..\sql\mini_client_errors.c">
-				<FileConfiguration
-					Name="Debug|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath=".\mysql_connection.cpp">
-				<FileConfiguration
-					Name="Debug|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath=".\mysqlmanager.cpp">
-			</File>
-			<File
-				RelativePath="..\..\sql\net_serv.cpp">
-				<FileConfiguration
-					Name="Debug|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath=".\options.cpp">
-			</File>
-			<File
-				RelativePath="..\..\sql\pack.c">
-				<FileConfiguration
-					Name="Debug|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath=".\parse.cpp">
-			</File>
-			<File
-				RelativePath=".\parse_output.cpp">
-			</File>
-			<File
-				RelativePath="..\..\sql\password.c">
-				<FileConfiguration
-					Name="Debug|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath=".\priv.cpp">
-			</File>
-			<File
-				RelativePath=".\protocol.cpp">
-			</File>
-			<File
-				RelativePath="..\..\sql\sql_state.c">
-			</File>
-			<File
-				RelativePath=".\thread_registry.cpp">
-			</File>
-			<File
-				RelativePath=".\user_map.cpp">
-			</File>
-			<File
-				RelativePath=".\WindowsService.cpp">
-			</File>
-		</Filter>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
-			<File
-				RelativePath=".\buffer.h">
-			</File>
-			<File
-				RelativePath=".\command.h">
-			</File>
-			<File
-				RelativePath=".\commands.h">
-			</File>
-			<File
-				RelativePath=".\factory.h">
-			</File>
-			<File
-				RelativePath=".\guardian.h">
-			</File>
-			<File
-				RelativePath=".\IMService.h">
-			</File>
-			<File
-				RelativePath=".\instance.h">
-			</File>
-			<File
-				RelativePath=".\instance_map.h">
-			</File>
-			<File
-				RelativePath=".\instance_options.h">
-			</File>
-			<File
-				RelativePath=".\listener.h">
-			</File>
-			<File
-				RelativePath=".\log.h">
-			</File>
-			<File
-				RelativePath=".\manager.h">
-			</File>
-			<File
-				RelativePath=".\messages.h">
-			</File>
-			<File
-				RelativePath=".\mysql_connection.h">
-			</File>
-			<File
-				RelativePath=".\mysql_manager_error.h">
-			</File>
-			<File
-				RelativePath=".\options.h">
-			</File>
-			<File
-				RelativePath=".\parse.h">
-			</File>
-			<File
-				RelativePath=".\parse_output.h">
-			</File>
-			<File
-				RelativePath=".\portability.h">
-			</File>
-			<File
-				RelativePath=".\priv.h">
-			</File>
-			<File
-				RelativePath=".\protocol.h">
-			</File>
-			<File
-				RelativePath=".\thread_registry.h">
-			</File>
-			<File
-				RelativePath=".\user_map.h">
-			</File>
-			<File
-				RelativePath=".\WindowsService.h">
-			</File>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>

=== modified file 'sql/handler.cc'
--- a/sql/handler.cc	2008-08-12 10:26:23 +0000
+++ b/sql/handler.cc	2008-09-05 15:21:59 +0000
@@ -2496,7 +2496,7 @@ void handler::print_keydup_error(uint ke
       str.append(STRING_WITH_LEN("..."));
     }
     my_printf_error(ER_DUP_ENTRY, msg,
-		    MYF(0), str.c_ptr(), table->key_info[key_nr].name);
+		    MYF(0), str.c_ptr_safe(), table->key_info[key_nr].name);
   }
 }
 
@@ -2564,7 +2564,7 @@ void handler::print_error(int error, myf
         str.append(STRING_WITH_LEN("..."));
       }
       my_error(ER_FOREIGN_DUPLICATE_KEY, MYF(0), table_share->table_name.str,
-        str.c_ptr(), key_nr+1);
+        str.c_ptr_safe(), key_nr+1);
       DBUG_VOID_RETURN;
     }
     textno= ER_DUP_KEY;

=== modified file 'sql/item.cc'
--- a/sql/item.cc	2008-08-20 11:42:01 +0000
+++ b/sql/item.cc	2008-09-08 10:04:42 +0000
@@ -4120,16 +4120,8 @@ bool Item_field::fix_fields(THD *thd, It
   if (any_privileges)
   {
     char *db, *tab;
-    if (cached_table->view)
-    {
-      db= cached_table->view_db.str;
-      tab= cached_table->view_name.str;
-    }
-    else
-    {
-      db= cached_table->db;
-      tab= cached_table->table_name;
-    }
+    db= cached_table->get_db_name();
+    tab= cached_table->get_table_name();
     if (!(have_privileges= (get_column_grant(thd, &field->table->grant,
                                              db, tab, field_name) &
                             VIEW_ANY_ACL)))
@@ -6210,6 +6202,13 @@ Item *Item_default_value::transform(Item
 {
   DBUG_ASSERT(!current_thd->is_stmt_prepare());
 
+  /*
+    If the value of arg is NULL, then this object represents a constant,
+    so further transformation is unnecessary (and impossible).
+  */
+  if (!arg)
+    return 0;
+
   Item *new_item= arg->transform(transformer, args);
   if (!new_item)
     return 0;

=== modified file 'sql/item_cmpfunc.cc'
--- a/sql/item_cmpfunc.cc	2008-08-15 05:53:25 +0000
+++ b/sql/item_cmpfunc.cc	2008-09-09 15:52:38 +0000
@@ -1029,19 +1029,24 @@ get_datetime_value(THD *thd, Item ***ite
        1    if items are equal or both are null
        0    otherwise
     If is_nulls_eq is FALSE:
-      -1   a < b or one of items is null
+      -1   a < b or at least one item is null
        0   a == b
        1   a > b
+    See the table:
+    is_nulls_eq | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
+    a_is_null   | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
+    b_is_null   | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
+    result      | 1 | 0 | 0 |0/1|-1 |-1 |-1 |-1/0/1|
 */
 
 int Arg_comparator::compare_datetime()
 {
-  bool is_null= FALSE;
+  bool a_is_null, b_is_null;
   ulonglong a_value, b_value;
 
   /* Get DATE/DATETIME/TIME value of the 'a' item. */
-  a_value= (*get_value_func)(thd, &a, &a_cache, *b, &is_null);
-  if (!is_nulls_eq && is_null)
+  a_value= (*get_value_func)(thd, &a, &a_cache, *b, &a_is_null);
+  if (!is_nulls_eq && a_is_null)
   {
     if (owner)
       owner->null_value= 1;
@@ -1049,14 +1054,15 @@ int Arg_comparator::compare_datetime()
   }
 
   /* Get DATE/DATETIME/TIME value of the 'b' item. */
-  b_value= (*get_value_func)(thd, &b, &b_cache, *a, &is_null);
-  if (is_null)
+  b_value= (*get_value_func)(thd, &b, &b_cache, *a, &b_is_null);
+  if (a_is_null || b_is_null)
   {
     if (owner)
       owner->null_value= is_nulls_eq ? 0 : 1;
-    return is_nulls_eq ? 1 : -1;
+    return is_nulls_eq ? (a_is_null == b_is_null) : -1;
   }
 
+  /* Here we have two not-NULL values. */
   if (owner)
     owner->null_value= 0;
 
@@ -4460,8 +4466,20 @@ void Item_func_like::cleanup()
 
 #ifdef USE_REGEX
 
-bool
-Item_func_regex::regcomp(bool send_error)
+/**
+  @brief Compile regular expression.
+
+  @param[in]    send_error     send error message if any.
+
+  @details Make necessary character set conversion then 
+  compile regular expression passed in the args[1].
+
+  @retval    0     success.
+  @retval    1     error occurred.
+  @retval   -1     given null regular expression.
+ */
+
+int Item_func_regex::regcomp(bool send_error)
 {
   char buff[MAX_FIELD_WIDTH];
   String tmp(buff,sizeof(buff),&my_charset_bin);
@@ -4469,12 +4487,12 @@ Item_func_regex::regcomp(bool send_error
   int error;
 
   if (args[1]->null_value)
-    return TRUE;
+    return -1;
 
   if (regex_compiled)
   {
     if (!stringcmp(res, &prev_regexp))
-      return FALSE;
+      return 0;
     prev_regexp.copy(*res);
     my_regfree(&preg);
     regex_compiled= 0;
@@ -4486,7 +4504,7 @@ Item_func_regex::regcomp(bool send_error
     uint dummy_errors;
     if (conv.copy(res->ptr(), res->length(), res->charset(),
                   regex_lib_charset, &dummy_errors))
-      return TRUE;
+      return 1;
     res= &conv;
   }
 
@@ -4498,10 +4516,10 @@ Item_func_regex::regcomp(bool send_error
       (void) my_regerror(error, &preg, buff, sizeof(buff));
       my_error(ER_REGEXP_ERROR, MYF(0), buff);
     }
-    return TRUE;
+    return 1;
   }
   regex_compiled= 1;
-  return FALSE;
+  return 0;
 }
 
 
@@ -4539,13 +4557,14 @@ Item_func_regex::fix_fields(THD *thd, It
   const_item_cache=args[0]->const_item() && args[1]->const_item();
   if (!regex_compiled && args[1]->const_item())
   {
-    if (args[1]->null_value)
+    int comp_res= regcomp(TRUE);
+    if (comp_res == -1)
     {						// Will always return NULL
       maybe_null=1;
       fixed= 1;
       return FALSE;
     }
-    if (regcomp(TRUE))
+    else if (comp_res)
       return TRUE;
     regex_is_const= 1;
     maybe_null= args[0]->maybe_null;

=== modified file 'sql/item_cmpfunc.h'
--- a/sql/item_cmpfunc.h	2008-02-22 10:30:33 +0000
+++ b/sql/item_cmpfunc.h	2008-09-05 08:36:02 +0000
@@ -1401,7 +1401,7 @@ class Item_func_regex :public Item_bool_
   CHARSET_INFO *regex_lib_charset;
   int regex_lib_flags;
   String conv;
-  bool regcomp(bool send_error);
+  int regcomp(bool send_error);
 public:
   Item_func_regex(Item *a,Item *b) :Item_bool_func(a,b),
     regex_compiled(0),regex_is_const(0) {}

=== modified file 'sql/log.cc'
--- a/sql/log.cc	2008-07-22 10:41:55 +0000
+++ b/sql/log.cc	2008-09-03 20:04:07 +0000
@@ -1421,6 +1421,7 @@ binlog_end_trans(THD *thd, binlog_trx_da
       If rolling back a statement in a transaction, we truncate the
       transaction cache to remove the statement.
      */
+    thd->binlog_remove_pending_rows_event(TRUE);
     if (all || !(thd->options & (OPTION_BEGIN | OPTION_NOT_AUTOCOMMIT)))
       trx_data->reset();
     else                                        // ...statement
@@ -3769,6 +3770,31 @@ THD::binlog_set_pending_rows_event(Rows_
 }
 
 
+/**
+  Remove the pending rows event, discarding any outstanding rows.
+
+  If there is no pending rows event available, this is effectively a
+  no-op.
+ */
+int
+MYSQL_BIN_LOG::remove_pending_rows_event(THD *thd)
+{
+  DBUG_ENTER(__FUNCTION__);
+
+  binlog_trx_data *const trx_data=
+    (binlog_trx_data*) thd_get_ha_data(thd, binlog_hton);
+
+  DBUG_ASSERT(trx_data);
+
+  if (Rows_log_event* pending= trx_data->pending())
+  {
+    delete pending;
+    trx_data->set_pending(NULL);
+  }
+
+  DBUG_RETURN(0);
+}
+
 /*
   Moves the last bunch of rows from the pending Rows event to the binlog
   (either cached binlog if transaction, or disk binlog). Sets a new pending

=== modified file 'sql/log.h'
--- a/sql/log.h	2007-10-30 08:03:34 +0000
+++ b/sql/log.h	2008-09-03 20:04:07 +0000
@@ -307,6 +307,7 @@ public:
   void update_table_map_version() { ++m_table_map_version; }
 
   int flush_and_set_pending_rows_event(THD *thd, Rows_log_event* event);
+  int remove_pending_rows_event(THD *thd);
 
 #endif /* !defined(MYSQL_CLIENT) */
   void reset_bytes_written()

=== modified file 'sql/log_event.cc'
--- a/sql/log_event.cc	2008-08-27 18:52:44 +0000
+++ b/sql/log_event.cc	2008-09-03 10:01:18 +0000
@@ -7843,8 +7843,9 @@ int Table_map_log_event::do_apply_event(
 
   int error= 0;
 
-  if (!rpl_filter->db_ok(table_list->db) ||
-      (rpl_filter->is_on() && !rpl_filter->tables_ok("", table_list)))
+  if (rli->sql_thd->slave_thread /* filtering is for slave only */ &&
+      (!rpl_filter->db_ok(table_list->db) ||
+       (rpl_filter->is_on() && !rpl_filter->tables_ok("", table_list))))
   {
     my_free(memory, MYF(MY_WME));
   }

=== added file 'sql/mysql_priv.h.pp'
--- a/sql/mysql_priv.h.pp	1970-01-01 00:00:00 +0000
+++ b/sql/mysql_priv.h.pp	2008-06-17 12:27:04 +0000
@@ -0,0 +1,10978 @@
+#include <my_global.h>
+#include <my_config.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <math.h>
+#include <limits.h>
+#include <float.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/timeb.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+#include <alloca.h>
+#include <errno.h>
+#include <crypt.h>
+#include <assert.h>
+#include <my_attribute.h>
+int __cxa_pure_virtual () __attribute__ ((weak));
+#include <my_dbug.h>
+struct _db_code_state_;
+extern int _db_keyword_(struct _db_code_state_ *cs, const char *keyword);
+extern int _db_strict_keyword_(const char *keyword);
+extern int _db_explain_(struct _db_code_state_ *cs, char *buf, size_t len);
+extern int _db_explain_init_(char *buf, size_t len);
+extern void _db_setjmp_(void);
+extern void _db_longjmp_(void);
+extern void _db_process_(const char *name);
+extern void _db_push_(const char *control);
+extern void _db_pop_(void);
+extern void _db_set_(struct _db_code_state_ *cs, const char *control);
+extern void _db_set_init_(const char *control);
+extern void _db_enter_(const char *_func_,const char *_file_,uint _line_,
+   const char **_sfunc_,const char **_sfile_,
+   uint *_slevel_, char ***);
+extern void _db_return_(uint _line_,const char **_sfunc_,const char **_sfile_,
+    uint *_slevel_);
+extern void _db_pargs_(uint _line_,const char *keyword);
+extern void _db_doprnt_ (const char *format,...)
+  __attribute__((format(printf, 1, 2)));
+extern void _db_dump_(uint _line_,const char *keyword,
+                       const unsigned char *memory, size_t length);
+extern void _db_end_(void);
+extern void _db_lock_file_(void);
+extern void _db_unlock_file_(void);
+extern FILE *_db_fp_(void);
+typedef int File;
+typedef int my_socket;
+typedef void (*sig_return)();
+typedef char pchar;
+typedef char puchar;
+typedef char pbool;
+typedef short pshort;
+typedef float pfloat;
+typedef int (*qsort_cmp)(const void *,const void *);
+typedef int (*qsort_cmp2)(void*, const void *,const void *);
+#include <sys/socket.h>
+typedef socklen_t size_socket;
+typedef long my_ptrdiff_t;
+typedef unsigned char uchar;
+typedef signed char int8;
+typedef unsigned char uint8;
+typedef short int16;
+typedef unsigned short uint16;
+typedef int int32;
+typedef unsigned int uint32;
+typedef unsigned long long int ulonglong;
+typedef long long int longlong;
+typedef longlong int64;
+typedef ulonglong uint64;
+typedef unsigned long long my_ulonglong;
+typedef int intptr;
+typedef ulonglong my_off_t;
+typedef off_t os_off_t;
+typedef uint8 int7;
+typedef short int15;
+typedef int myf;
+typedef char my_bool;
+typedef char bool;
+typedef union {
+  double v;
+  long m[2];
+} doubleget_union;
+#include <dlfcn.h>
+#include <mysql_version.h>
+#include <mysql_embed.h>
+#include <my_sys.h>
+#include <my_pthread.h>
+#include <pthread.h>
+#include <sched.h>
+extern int my_pthread_getprio(pthread_t thread_id);
+typedef void *(* pthread_handler)(void *);
+extern void my_pthread_setprio(pthread_t thread_id,int prior);
+extern void my_pthread_attr_setprio(pthread_attr_t *attr, int priority);
+typedef struct st_safe_mutex_t
+{
+  pthread_mutex_t global,mutex;
+  const char *file;
+  uint line,count;
+  pthread_t thread;
+} safe_mutex_t;
+int safe_mutex_init(safe_mutex_t *mp, const pthread_mutexattr_t *attr,
+                    const char *file, uint line);
+int safe_mutex_lock(safe_mutex_t *mp, my_bool try_lock, const char *file, uint line);
+int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line);
+int safe_mutex_destroy(safe_mutex_t *mp,const char *file, uint line);
+int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp,const char *file,
+     uint line);
+int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp,
+   struct timespec *abstime, const char *file, uint line);
+void safe_mutex_global_init(void);
+void safe_mutex_end(FILE *file);
+typedef ulong my_thread_id;
+extern my_bool my_thread_global_init(void);
+extern void my_thread_global_end(void);
+extern my_bool my_thread_init(void);
+extern void my_thread_end(void);
+extern const char *my_thread_name(void);
+extern my_thread_id my_thread_dbug_id(void);
+extern int pthread_no_free(void *);
+extern int pthread_dummy(int);
+struct st_my_thread_var
+{
+  int thr_errno;
+  pthread_cond_t suspend;
+  pthread_mutex_t mutex;
+  pthread_mutex_t * volatile current_mutex;
+  pthread_cond_t * volatile current_cond;
+  pthread_t pthread_self;
+  my_thread_id id;
+  int cmp_length;
+  int volatile abort;
+  my_bool init;
+  struct st_my_thread_var *next,**prev;
+  void *opt_info;
+  void *dbug;
+  char name[10 +1];
+};
+extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const));
+extern uint my_thread_end_wait_time;
+extern uint thd_lib_detected;
+#include <m_ctype.h>
+#include <my_attribute.h>
+typedef struct unicase_info_st
+{
+  uint16 toupper;
+  uint16 tolower;
+  uint16 sort;
+} MY_UNICASE_INFO;
+extern MY_UNICASE_INFO *my_unicase_default[256];
+extern MY_UNICASE_INFO *my_unicase_turkish[256];
+typedef struct uni_ctype_st
+{
+  uchar pctype;
+  uchar *ctype;
+} MY_UNI_CTYPE;
+extern MY_UNI_CTYPE my_uni_ctype[256];
+typedef struct my_uni_idx_st
+{
+  uint16 from;
+  uint16 to;
+  uchar *tab;
+} MY_UNI_IDX;
+typedef struct
+{
+  uint beg;
+  uint end;
+  uint mb_len;
+} my_match_t;
+enum my_lex_states
+{
+  MY_LEX_START, MY_LEX_CHAR, MY_LEX_IDENT,
+  MY_LEX_IDENT_SEP, MY_LEX_IDENT_START,
+  MY_LEX_REAL, MY_LEX_HEX_NUMBER, MY_LEX_BIN_NUMBER,
+  MY_LEX_CMP_OP, MY_LEX_LONG_CMP_OP, MY_LEX_STRING, MY_LEX_COMMENT, MY_LEX_END,
+  MY_LEX_OPERATOR_OR_IDENT, MY_LEX_NUMBER_IDENT, MY_LEX_INT_OR_REAL,
+  MY_LEX_REAL_OR_POINT, MY_LEX_BOOL, MY_LEX_EOL, MY_LEX_ESCAPE,
+  MY_LEX_LONG_COMMENT, MY_LEX_END_LONG_COMMENT, MY_LEX_SEMICOLON,
+  MY_LEX_SET_VAR, MY_LEX_USER_END, MY_LEX_HOSTNAME, MY_LEX_SKIP,
+  MY_LEX_USER_VARIABLE_DELIMITER, MY_LEX_SYSTEM_VAR,
+  MY_LEX_IDENT_OR_KEYWORD,
+  MY_LEX_IDENT_OR_HEX, MY_LEX_IDENT_OR_BIN, MY_LEX_IDENT_OR_NCHAR,
+  MY_LEX_STRING_OR_DELIMITER
+};
+struct charset_info_st;
+typedef struct my_collation_handler_st
+{
+  my_bool (*init)(struct charset_info_st *, void *(*alloc)(size_t));
+  int (*strnncoll)(struct charset_info_st *,
+         const uchar *, size_t, const uchar *, size_t, my_bool);
+  int (*strnncollsp)(struct charset_info_st *,
+                         const uchar *, size_t, const uchar *, size_t,
+                         my_bool diff_if_only_endspace_difference);
+  size_t (*strnxfrm)(struct charset_info_st *,
+                         uchar *, size_t, const uchar *, size_t);
+  size_t (*strnxfrmlen)(struct charset_info_st *, size_t);
+  my_bool (*like_range)(struct charset_info_st *,
+   const char *s, size_t s_length,
+   pchar w_prefix, pchar w_one, pchar w_many,
+   size_t res_length,
+   char *min_str, char *max_str,
+   size_t *min_len, size_t *max_len);
+  int (*wildcmp)(struct charset_info_st *,
+         const char *str,const char *str_end,
+                     const char *wildstr,const char *wildend,
+                     int escape,int w_one, int w_many);
+  int (*strcasecmp)(struct charset_info_st *, const char *, const char *);
+  uint (*instr)(struct charset_info_st *,
+                const char *b, size_t b_length,
+                const char *s, size_t s_length,
+                my_match_t *match, uint nmatch);
+  void (*hash_sort)(struct charset_info_st *cs, const uchar *key, size_t len,
+      ulong *nr1, ulong *nr2);
+  my_bool (*propagate)(struct charset_info_st *cs, const uchar *str, size_t len);
+} MY_COLLATION_HANDLER;
+extern MY_COLLATION_HANDLER my_collation_mb_bin_handler;
+extern MY_COLLATION_HANDLER my_collation_8bit_bin_handler;
+extern MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler;
+extern MY_COLLATION_HANDLER my_collation_ucs2_uca_handler;
+typedef int (*my_charset_conv_mb_wc)(struct charset_info_st *, ulong *,
+                                     const uchar *, const uchar *);
+typedef int (*my_charset_conv_wc_mb)(struct charset_info_st *, ulong,
+                                     uchar *, uchar *);
+typedef size_t (*my_charset_conv_case)(struct charset_info_st *,
+                                       char *, size_t, char *, size_t);
+typedef struct my_charset_handler_st
+{
+  my_bool (*init)(struct charset_info_st *, void *(*alloc)(size_t));
+  uint (*ismbchar)(struct charset_info_st *, const char *, const char *);
+  uint (*mbcharlen)(struct charset_info_st *, uint c);
+  size_t (*numchars)(struct charset_info_st *, const char *b, const char *e);
+  size_t (*charpos)(struct charset_info_st *, const char *b, const char *e,
+                     size_t pos);
+  size_t (*well_formed_len)(struct charset_info_st *,
+                             const char *b,const char *e,
+                             size_t nchars, int *error);
+  size_t (*lengthsp)(struct charset_info_st *, const char *ptr, size_t length);
+  size_t (*numcells)(struct charset_info_st *, const char *b, const char *e);
+  my_charset_conv_mb_wc mb_wc;
+  my_charset_conv_wc_mb wc_mb;
+  int (*ctype)(struct charset_info_st *cs, int *ctype,
+               const uchar *s, const uchar *e);
+  size_t (*caseup_str)(struct charset_info_st *, char *);
+  size_t (*casedn_str)(struct charset_info_st *, char *);
+  my_charset_conv_case caseup;
+  my_charset_conv_case casedn;
+  size_t (*snprintf)(struct charset_info_st *, char *to, size_t n,
+                     const char *fmt,
+                     ...) __attribute__((format(printf, 4, 5)));
+  size_t (*long10_to_str)(struct charset_info_st *, char *to, size_t n,
+                          int radix, long int val);
+  size_t (*longlong10_to_str)(struct charset_info_st *, char *to, size_t n,
+                              int radix, longlong val);
+  void (*fill)(struct charset_info_st *, char *to, size_t len, int fill);
+  long (*strntol)(struct charset_info_st *, const char *s, size_t l,
+    int base, char **e, int *err);
+  ulong (*strntoul)(struct charset_info_st *, const char *s, size_t l,
+    int base, char **e, int *err);
+  longlong (*strntoll)(struct charset_info_st *, const char *s, size_t l,
+    int base, char **e, int *err);
+  ulonglong (*strntoull)(struct charset_info_st *, const char *s, size_t l,
+    int base, char **e, int *err);
+  double (*strntod)(struct charset_info_st *, char *s, size_t l, char **e,
+    int *err);
+  longlong (*strtoll10)(struct charset_info_st *cs,
+                           const char *nptr, char **endptr, int *error);
+  ulonglong (*strntoull10rnd)(struct charset_info_st *cs,
+                                const char *str, size_t length,
+                                int unsigned_fl,
+                                char **endptr, int *error);
+  size_t (*scan)(struct charset_info_st *, const char *b, const char *e,
+                        int sq);
+} MY_CHARSET_HANDLER;
+extern MY_CHARSET_HANDLER my_charset_8bit_handler;
+extern MY_CHARSET_HANDLER my_charset_ucs2_handler;
+typedef struct charset_info_st
+{
+  uint number;
+  uint primary_number;
+  uint binary_number;
+  uint state;
+  const char *csname;
+  const char *name;
+  const char *comment;
+  const char *tailoring;
+  uchar *ctype;
+  uchar *to_lower;
+  uchar *to_upper;
+  uchar *sort_order;
+  uint16 *contractions;
+  uint16 **sort_order_big;
+  uint16 *tab_to_uni;
+  MY_UNI_IDX *tab_from_uni;
+  MY_UNICASE_INFO **caseinfo;
+  uchar *state_map;
+  uchar *ident_map;
+  uint strxfrm_multiply;
+  uchar caseup_multiply;
+  uchar casedn_multiply;
+  uint mbminlen;
+  uint mbmaxlen;
+  uint16 min_sort_char;
+  uint16 max_sort_char;
+  uchar pad_char;
+  my_bool escape_with_backslash_is_dangerous;
+  MY_CHARSET_HANDLER *cset;
+  MY_COLLATION_HANDLER *coll;
+} CHARSET_INFO;
+extern CHARSET_INFO my_charset_bin;
+extern CHARSET_INFO my_charset_big5_chinese_ci;
+extern CHARSET_INFO my_charset_big5_bin;
+extern CHARSET_INFO my_charset_cp932_japanese_ci;
+extern CHARSET_INFO my_charset_cp932_bin;
+extern CHARSET_INFO my_charset_eucjpms_japanese_ci;
+extern CHARSET_INFO my_charset_eucjpms_bin;
+extern CHARSET_INFO my_charset_euckr_korean_ci;
+extern CHARSET_INFO my_charset_euckr_bin;
+extern CHARSET_INFO my_charset_gb2312_chinese_ci;
+extern CHARSET_INFO my_charset_gb2312_bin;
+extern CHARSET_INFO my_charset_gbk_chinese_ci;
+extern CHARSET_INFO my_charset_gbk_bin;
+extern CHARSET_INFO my_charset_latin1;
+extern CHARSET_INFO my_charset_latin1_german2_ci;
+extern CHARSET_INFO my_charset_latin1_bin;
+extern CHARSET_INFO my_charset_latin2_czech_ci;
+extern CHARSET_INFO my_charset_sjis_japanese_ci;
+extern CHARSET_INFO my_charset_sjis_bin;
+extern CHARSET_INFO my_charset_tis620_thai_ci;
+extern CHARSET_INFO my_charset_tis620_bin;
+extern CHARSET_INFO my_charset_ucs2_general_ci;
+extern CHARSET_INFO my_charset_ucs2_bin;
+extern CHARSET_INFO my_charset_ucs2_unicode_ci;
+extern CHARSET_INFO my_charset_ujis_japanese_ci;
+extern CHARSET_INFO my_charset_ujis_bin;
+extern CHARSET_INFO my_charset_utf8_general_ci;
+extern CHARSET_INFO my_charset_utf8_unicode_ci;
+extern CHARSET_INFO my_charset_utf8_bin;
+extern CHARSET_INFO my_charset_cp1250_czech_ci;
+extern CHARSET_INFO my_charset_filename;
+extern size_t my_strnxfrm_simple(CHARSET_INFO *, uchar *, size_t,
+                                 const uchar *, size_t);
+size_t my_strnxfrmlen_simple(CHARSET_INFO *, size_t);
+extern int my_strnncoll_simple(CHARSET_INFO *, const uchar *, size_t,
+    const uchar *, size_t, my_bool);
+extern int my_strnncollsp_simple(CHARSET_INFO *, const uchar *, size_t,
+                                  const uchar *, size_t,
+                                  my_bool diff_if_only_endspace_difference);
+extern void my_hash_sort_simple(CHARSET_INFO *cs,
+    const uchar *key, size_t len,
+    ulong *nr1, ulong *nr2);
+extern size_t my_lengthsp_8bit(CHARSET_INFO *cs, const char *ptr, size_t length);
+extern uint my_instr_simple(struct charset_info_st *,
+                            const char *b, size_t b_length,
+                            const char *s, size_t s_length,
+                            my_match_t *match, uint nmatch);
+extern size_t my_caseup_str_8bit(CHARSET_INFO *, char *);
+extern size_t my_casedn_str_8bit(CHARSET_INFO *, char *);
+extern size_t my_caseup_8bit(CHARSET_INFO *, char *src, size_t srclen,
+                             char *dst, size_t dstlen);
+extern size_t my_casedn_8bit(CHARSET_INFO *, char *src, size_t srclen,
+                             char *dst, size_t dstlen);
+extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *);
+int my_mb_wc_8bit(CHARSET_INFO *cs,ulong *wc, const uchar *s,const uchar *e);
+int my_wc_mb_8bit(CHARSET_INFO *cs,ulong wc, uchar *s, uchar *e);
+int my_mb_ctype_8bit(CHARSET_INFO *,int *, const uchar *,const uchar *);
+int my_mb_ctype_mb(CHARSET_INFO *,int *, const uchar *,const uchar *);
+size_t my_scan_8bit(CHARSET_INFO *cs, const char *b, const char *e, int sq);
+size_t my_snprintf_8bit(struct charset_info_st *, char *to, size_t n,
+                        const char *fmt, ...)
+  __attribute__((format(printf, 4, 5)));
+long my_strntol_8bit(CHARSET_INFO *, const char *s, size_t l, int base,
+                           char **e, int *err);
+ulong my_strntoul_8bit(CHARSET_INFO *, const char *s, size_t l, int base,
+       char **e, int *err);
+longlong my_strntoll_8bit(CHARSET_INFO *, const char *s, size_t l, int base,
+       char **e, int *err);
+ulonglong my_strntoull_8bit(CHARSET_INFO *, const char *s, size_t l, int base,
+       char **e, int *err);
+double my_strntod_8bit(CHARSET_INFO *, char *s, size_t l,char **e,
+       int *err);
+size_t my_long10_to_str_8bit(CHARSET_INFO *, char *to, size_t l, int radix,
+                             long int val);
+size_t my_longlong10_to_str_8bit(CHARSET_INFO *, char *to, size_t l, int radix,
+                                 longlong val);
+longlong my_strtoll10_8bit(CHARSET_INFO *cs,
+                           const char *nptr, char **endptr, int *error);
+longlong my_strtoll10_ucs2(CHARSET_INFO *cs,
+                           const char *nptr, char **endptr, int *error);
+ulonglong my_strntoull10rnd_8bit(CHARSET_INFO *cs,
+                                 const char *str, size_t length, int
+                                 unsigned_fl, char **endptr, int *error);
+ulonglong my_strntoull10rnd_ucs2(CHARSET_INFO *cs,
+                                 const char *str, size_t length,
+                                 int unsigned_fl, char **endptr, int *error);
+void my_fill_8bit(CHARSET_INFO *cs, char* to, size_t l, int fill);
+my_bool my_like_range_simple(CHARSET_INFO *cs,
+         const char *ptr, size_t ptr_length,
+         pbool escape, pbool w_one, pbool w_many,
+         size_t res_length,
+         char *min_str, char *max_str,
+         size_t *min_length, size_t *max_length);
+my_bool my_like_range_mb(CHARSET_INFO *cs,
+     const char *ptr, size_t ptr_length,
+     pbool escape, pbool w_one, pbool w_many,
+     size_t res_length,
+     char *min_str, char *max_str,
+     size_t *min_length, size_t *max_length);
+my_bool my_like_range_ucs2(CHARSET_INFO *cs,
+       const char *ptr, size_t ptr_length,
+       pbool escape, pbool w_one, pbool w_many,
+       size_t res_length,
+       char *min_str, char *max_str,
+       size_t *min_length, size_t *max_length);
+int my_wildcmp_8bit(CHARSET_INFO *,
+      const char *str,const char *str_end,
+      const char *wildstr,const char *wildend,
+      int escape, int w_one, int w_many);
+int my_wildcmp_bin(CHARSET_INFO *,
+     const char *str,const char *str_end,
+     const char *wildstr,const char *wildend,
+     int escape, int w_one, int w_many);
+size_t my_numchars_8bit(CHARSET_INFO *, const char *b, const char *e);
+size_t my_numcells_8bit(CHARSET_INFO *, const char *b, const char *e);
+size_t my_charpos_8bit(CHARSET_INFO *, const char *b, const char *e, size_t pos);
+size_t my_well_formed_len_8bit(CHARSET_INFO *, const char *b, const char *e,
+                             size_t pos, int *error);
+uint my_mbcharlen_8bit(CHARSET_INFO *, uint c);
+extern size_t my_caseup_str_mb(CHARSET_INFO *, char *);
+extern size_t my_casedn_str_mb(CHARSET_INFO *, char *);
+extern size_t my_caseup_mb(CHARSET_INFO *, char *src, size_t srclen,
+                                         char *dst, size_t dstlen);
+extern size_t my_casedn_mb(CHARSET_INFO *, char *src, size_t srclen,
+                                         char *dst, size_t dstlen);
+extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *);
+int my_wildcmp_mb(CHARSET_INFO *,
+    const char *str,const char *str_end,
+    const char *wildstr,const char *wildend,
+    int escape, int w_one, int w_many);
+size_t my_numchars_mb(CHARSET_INFO *, const char *b, const char *e);
+size_t my_numcells_mb(CHARSET_INFO *, const char *b, const char *e);
+size_t my_charpos_mb(CHARSET_INFO *, const char *b, const char *e, size_t pos);
+size_t my_well_formed_len_mb(CHARSET_INFO *, const char *b, const char *e,
+                             size_t pos, int *error);
+uint my_instr_mb(struct charset_info_st *,
+                 const char *b, size_t b_length,
+                 const char *s, size_t s_length,
+                 my_match_t *match, uint nmatch);
+int my_wildcmp_unicode(CHARSET_INFO *cs,
+                       const char *str, const char *str_end,
+                       const char *wildstr, const char *wildend,
+                       int escape, int w_one, int w_many,
+                       MY_UNICASE_INFO **weights);
+extern my_bool my_parse_charset_xml(const char *bug, size_t len,
+        int (*add)(CHARSET_INFO *cs));
+extern char *my_strchr(CHARSET_INFO *cs, const char *str, const char *end,
+                       pchar c);
+my_bool my_propagate_simple(CHARSET_INFO *cs, const uchar *str, size_t len);
+my_bool my_propagate_complex(CHARSET_INFO *cs, const uchar *str, size_t len);
+uint my_string_repertoire(CHARSET_INFO *cs, const char *str, ulong len);
+my_bool my_charset_is_ascii_based(CHARSET_INFO *cs);
+my_bool my_charset_is_8bit_pure_ascii(CHARSET_INFO *cs);
+#include <stdarg.h>
+#include <typelib.h>
+#include "my_alloc.h"
+typedef struct st_used_mem
+{
+  struct st_used_mem *next;
+  unsigned int left;
+  unsigned int size;
+} USED_MEM;
+typedef struct st_mem_root
+{
+  USED_MEM *free;
+  USED_MEM *used;
+  USED_MEM *pre_alloc;
+  size_t min_malloc;
+  size_t block_size;
+  unsigned int block_num;
+  unsigned int first_block_usage;
+  void (*error_handler)(void);
+} MEM_ROOT;
+typedef struct st_typelib {
+  unsigned int count;
+  const char *name;
+  const char **type_names;
+  unsigned int *type_lengths;
+} TYPELIB;
+extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position);
+extern int find_type_or_exit(const char *x, TYPELIB *typelib,
+                             const char *option);
+extern int find_type(char *x, const TYPELIB *typelib, unsigned int full_name);
+extern void make_type(char *to,unsigned int nr,TYPELIB *typelib);
+extern const char *get_type(TYPELIB *typelib,unsigned int nr);
+extern TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from);
+extern TYPELIB sql_protocol_typelib;
+extern void *my_malloc(size_t Size,myf MyFlags);
+extern void *my_realloc(void *oldpoint, size_t Size, myf MyFlags);
+extern void my_no_flags_free(void *ptr);
+extern void *my_memdup(const void *from,size_t length,myf MyFlags);
+extern char *my_strdup(const char *from,myf MyFlags);
+extern char *my_strndup(const char *from, size_t length,
+       myf MyFlags);
+extern uint my_get_large_page_size(void);
+extern uchar * my_large_malloc(size_t size, myf my_flags);
+extern void my_large_free(uchar * ptr, myf my_flags);
+extern int errno;
+extern char errbuff[(2)][(256)];
+extern char *home_dir;
+extern const char *my_progname;
+extern char curr_dir[];
+extern int (*error_handler_hook)(uint my_err, const char *str,myf MyFlags);
+extern int (*fatal_error_handler_hook)(uint my_err, const char *str,
+           myf MyFlags);
+extern uint my_file_limit;
+extern ulong my_thread_stack_size;
+extern my_bool my_use_large_pages;
+extern uint my_large_page_size;
+extern CHARSET_INFO *default_charset_info;
+extern CHARSET_INFO *all_charsets[256];
+extern CHARSET_INFO compiled_charsets[];
+extern ulong my_file_opened,my_stream_opened, my_tmp_file_created;
+extern ulong my_file_total_opened;
+extern uint mysys_usage_id;
+extern my_bool my_init_done;
+extern void (*my_sigtstp_cleanup)(void),
+     (*my_sigtstp_restart)(void),
+     (*my_abort_hook)(int);
+extern int my_umask,
+    my_umask_dir,
+    my_recived_signals,
+    my_safe_to_handle_signal,
+    my_dont_interrupt;
+extern my_bool mysys_uses_curses, my_use_symdir;
+extern ulong sf_malloc_cur_memory, sf_malloc_max_memory;
+extern ulong my_default_record_cache_size;
+extern my_bool my_disable_locking, my_disable_async_io,
+               my_disable_flush_key_blocks, my_disable_symlinks;
+extern char wild_many,wild_one,wild_prefix;
+extern const char *charsets_dir;
+extern char *my_defaults_extra_file;
+extern const char *my_defaults_group_suffix;
+extern const char *my_defaults_file;
+extern my_bool timed_mutexes;
+typedef struct wild_file_pack
+{
+  uint wilds;
+  uint not_pos;
+  char * *wild;
+} WF_PACK;
+enum loglevel {
+   ERROR_LEVEL,
+   WARNING_LEVEL,
+   INFORMATION_LEVEL
+};
+enum cache_type
+{
+  TYPE_NOT_SET= 0, READ_CACHE, WRITE_CACHE,
+  SEQ_READ_APPEND ,
+  READ_FIFO, READ_NET,WRITE_NET};
+enum flush_type
+{
+  FLUSH_KEEP,
+  FLUSH_RELEASE,
+  FLUSH_IGNORE_CHANGED,
+  FLUSH_FORCE_WRITE
+};
+typedef struct st_record_cache
+{
+  File file;
+  int rc_seek,error,inited;
+  uint rc_length,read_length,reclength;
+  my_off_t rc_record_pos,end_of_file;
+  uchar *rc_buff,*rc_buff2,*rc_pos,*rc_end,*rc_request_pos;
+  enum cache_type type;
+} RECORD_CACHE;
+enum file_type
+{
+  UNOPEN = 0, FILE_BY_OPEN, FILE_BY_CREATE, STREAM_BY_FOPEN, STREAM_BY_FDOPEN,
+  FILE_BY_MKSTEMP, FILE_BY_DUP
+};
+struct st_my_file_info
+{
+  char * name;
+  enum file_type type;
+};
+extern struct st_my_file_info *my_file_info;
+typedef struct st_dynamic_array
+{
+  uchar *buffer;
+  uint elements,max_element;
+  uint alloc_increment;
+  uint size_of_element;
+} DYNAMIC_ARRAY;
+typedef struct st_my_tmpdir
+{
+  DYNAMIC_ARRAY full_list;
+  char **list;
+  uint cur, max;
+  pthread_mutex_t mutex;
+} MY_TMPDIR;
+typedef struct st_dynamic_string
+{
+  char *str;
+  size_t length,max_length,alloc_increment;
+} DYNAMIC_STRING;
+struct st_io_cache;
+typedef int (*IO_CACHE_CALLBACK)(struct st_io_cache*);
+typedef struct st_io_cache_share
+{
+  pthread_mutex_t mutex;
+  pthread_cond_t cond;
+  pthread_cond_t cond_writer;
+  my_off_t pos_in_file;
+  struct st_io_cache *source_cache;
+  uchar *buffer;
+  uchar *read_end;
+  int running_threads;
+  int total_threads;
+  int error;
+} IO_CACHE_SHARE;
+typedef struct st_io_cache
+{
+  my_off_t pos_in_file;
+  my_off_t end_of_file;
+  uchar *read_pos;
+  uchar *read_end;
+  uchar *buffer;
+  uchar *request_pos;
+  uchar *write_buffer;
+  uchar *append_read_pos;
+  uchar *write_pos;
+  uchar *write_end;
+  uchar **current_pos, **current_end;
+  pthread_mutex_t append_buffer_lock;
+  IO_CACHE_SHARE *share;
+  int (*read_function)(struct st_io_cache *,uchar *,size_t);
+  int (*write_function)(struct st_io_cache *,const uchar *,size_t);
+  enum cache_type type;
+  IO_CACHE_CALLBACK pre_read;
+  IO_CACHE_CALLBACK post_read;
+  IO_CACHE_CALLBACK pre_close;
+  ulong disk_writes;
+  void* arg;
+  char *file_name;
+  char *dir,*prefix;
+  File file;
+  int seek_not_done,error;
+  size_t buffer_length;
+  size_t read_length;
+  myf myflags;
+  my_bool alloced_buffer;
+} IO_CACHE;
+typedef int (*qsort2_cmp)(const void *, const void *, const void *);
+int my_b_copy_to_file(IO_CACHE *cache, FILE *file);
+my_off_t my_b_append_tell(IO_CACHE* info);
+my_off_t my_b_safe_tell(IO_CACHE* info);
+typedef uint32 ha_checksum;
+typedef int (*Process_option_func)(void *ctx, const char *group_name,
+                                   const char *option);
+#include <my_alloc.h>
+extern int my_copy(const char *from,const char *to,myf MyFlags);
+extern int my_append(const char *from,const char *to,myf MyFlags);
+extern int my_delete(const char *name,myf MyFlags);
+extern int my_getwd(char * buf,size_t size,myf MyFlags);
+extern int my_setwd(const char *dir,myf MyFlags);
+extern int my_lock(File fd,int op,my_off_t start, my_off_t length,myf MyFlags);
+extern void *my_once_alloc(size_t Size,myf MyFlags);
+extern void my_once_free(void);
+extern char *my_once_strdup(const char *src,myf myflags);
+extern void *my_once_memdup(const void *src, size_t len, myf myflags);
+extern File my_open(const char *FileName,int Flags,myf MyFlags);
+extern File my_register_filename(File fd, const char *FileName,
+     enum file_type type_of_file,
+     uint error_message_number, myf MyFlags);
+extern File my_create(const char *FileName,int CreateFlags,
+        int AccessFlags, myf MyFlags);
+extern int my_close(File Filedes,myf MyFlags);
+extern File my_dup(File file, myf MyFlags);
+extern int my_mkdir(const char *dir, int Flags, myf MyFlags);
+extern int my_readlink(char *to, const char *filename, myf MyFlags);
+extern int my_realpath(char *to, const char *filename, myf MyFlags);
+extern File my_create_with_symlink(const char *linkname, const char *filename,
+       int createflags, int access_flags,
+       myf MyFlags);
+extern int my_delete_with_symlink(const char *name, myf MyFlags);
+extern int my_rename_with_symlink(const char *from,const char *to,myf MyFlags);
+extern int my_symlink(const char *content, const char *linkname, myf MyFlags);
+extern size_t my_read(File Filedes,uchar *Buffer,size_t Count,myf MyFlags);
+extern size_t my_pread(File Filedes,uchar *Buffer,size_t Count,my_off_t offset,
+       myf MyFlags);
+extern int my_rename(const char *from,const char *to,myf MyFlags);
+extern my_off_t my_seek(File fd,my_off_t pos,int whence,myf MyFlags);
+extern my_off_t my_tell(File fd,myf MyFlags);
+extern size_t my_write(File Filedes,const uchar *Buffer,size_t Count,
+       myf MyFlags);
+extern size_t my_pwrite(File Filedes,const uchar *Buffer,size_t Count,
+        my_off_t offset,myf MyFlags);
+extern size_t my_fread(FILE *stream,uchar *Buffer,size_t Count,myf MyFlags);
+extern size_t my_fwrite(FILE *stream,const uchar *Buffer,size_t Count,
+        myf MyFlags);
+extern my_off_t my_fseek(FILE *stream,my_off_t pos,int whence,myf MyFlags);
+extern my_off_t my_ftell(FILE *stream,myf MyFlags);
+extern void *_mymalloc(size_t uSize,const char *sFile,
+                       uint uLine, myf MyFlag);
+extern void *_myrealloc(void *pPtr,size_t uSize,const char *sFile,
+         uint uLine, myf MyFlag);
+extern void * my_multi_malloc (myf MyFlags, ...);
+extern void _myfree(void *pPtr,const char *sFile,uint uLine, myf MyFlag);
+extern int _sanity(const char *sFile, uint uLine);
+extern void *_my_memdup(const void *from, size_t length,
+                        const char *sFile, uint uLine,myf MyFlag);
+extern char * _my_strdup(const char *from, const char *sFile, uint uLine,
+                         myf MyFlag);
+extern char *_my_strndup(const char *from, size_t length,
+                         const char *sFile, uint uLine,
+                         myf MyFlag);
+extern void *my_memmem(const void *haystack, size_t haystacklen,
+                       const void *needle, size_t needlelen);
+extern int check_if_legal_filename(const char *path);
+extern int check_if_legal_tablename(const char *path);
+extern void init_glob_errs(void);
+extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags);
+extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags);
+extern int my_fclose(FILE *fd,myf MyFlags);
+extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags);
+extern int my_sync(File fd, myf my_flags);
+extern int my_sync_dir(const char *dir_name, myf my_flags);
+extern int my_sync_dir_by_file(const char *file_name, myf my_flags);
+extern int my_error (int nr,myf MyFlags, ...);
+extern int my_printf_error (uint my_err, const char *format, myf MyFlags, ...)
+        __attribute__((format(printf, 2, 4)));
+extern int my_error_register(const char **errmsgs, int first, int last);
+extern const char **my_error_unregister(int first, int last);
+extern int my_message(uint my_err, const char *str,myf MyFlags);
+extern int my_message_no_curses(uint my_err, const char *str,myf MyFlags);
+extern int my_message_curses(uint my_err, const char *str,myf MyFlags);
+extern my_bool my_init(void);
+extern void my_end(int infoflag);
+extern int my_redel(const char *from, const char *to, int MyFlags);
+extern int my_copystat(const char *from, const char *to, int MyFlags);
+extern char * my_filename(File fd);
+extern my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist);
+extern char *my_tmpdir(MY_TMPDIR *tmpdir);
+extern void free_tmpdir(MY_TMPDIR *tmpdir);
+extern void my_remember_signal(int signal_number,void (*func)(int));
+extern size_t dirname_part(char * to,const char *name, size_t *to_res_length);
+extern size_t dirname_length(const char *name);
+extern int test_if_hard_path(const char *dir_name);
+extern my_bool has_path(const char *name);
+extern char *convert_dirname(char *to, const char *from, const char *from_end);
+extern void to_unix_path(char * name);
+extern char * fn_ext(const char *name);
+extern char * fn_same(char * toname,const char *name,int flag);
+extern char * fn_format(char * to,const char *name,const char *dir,
+      const char *form, uint flag);
+extern size_t strlength(const char *str);
+extern void pack_dirname(char * to,const char *from);
+extern size_t unpack_dirname(char * to,const char *from);
+extern size_t cleanup_dirname(char * to,const char *from);
+extern size_t system_filename(char * to,const char *from);
+extern size_t unpack_filename(char * to,const char *from);
+extern char * intern_filename(char * to,const char *from);
+extern char * directory_file_name(char * dst, const char *src);
+extern int pack_filename(char * to, const char *name, size_t max_length);
+extern char * my_path(char * to,const char *progname,
+    const char *own_pathname_part);
+extern char * my_load_path(char * to, const char *path,
+         const char *own_path_prefix);
+extern int wild_compare(const char *str,const char *wildstr,
+                        pbool str_is_pattern);
+extern WF_PACK *wf_comp(char * str);
+extern int wf_test(struct wild_file_pack *wf_pack,const char *name);
+extern void wf_end(struct wild_file_pack *buffer);
+extern size_t strip_sp(char * str);
+extern my_bool array_append_string_unique(const char *str,
+                                          const char **array, size_t size);
+extern void get_date(char * to,int timeflag,time_t use_time);
+extern void soundex(CHARSET_INFO *, char * out_pntr, char * in_pntr,
+                    pbool remove_garbage);
+extern int init_record_cache(RECORD_CACHE *info,size_t cachesize,File file,
+        size_t reclength,enum cache_type type,
+        pbool use_async_io);
+extern int read_cache_record(RECORD_CACHE *info,uchar *to);
+extern int end_record_cache(RECORD_CACHE *info);
+extern int write_cache_record(RECORD_CACHE *info,my_off_t filepos,
+         const uchar *record,size_t length);
+extern int flush_write_cache(RECORD_CACHE *info);
+extern long my_clock(void);
+extern void sigtstp_handler(int signal_number);
+extern void handle_recived_signals(void);
+extern void my_set_alarm_variable(int signo);
+extern void my_string_ptr_sort(uchar *base,uint items,size_t size);
+extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements,
+      size_t size_of_element,uchar *buffer[]);
+extern void my_qsort(void *base_ptr, size_t total_elems, size_t size,
+                        qsort_cmp cmp);
+extern void my_qsort2(void *base_ptr, size_t total_elems, size_t size,
+                         qsort2_cmp cmp, void *cmp_argument);
+extern qsort2_cmp get_ptr_compare(size_t);
+void my_store_ptr(uchar *buff, size_t pack_length, my_off_t pos);
+my_off_t my_get_ptr(uchar *ptr, size_t pack_length);
+extern int init_io_cache(IO_CACHE *info,File file,size_t cachesize,
+    enum cache_type type,my_off_t seek_offset,
+    pbool use_async_io, myf cache_myflags);
+extern my_bool reinit_io_cache(IO_CACHE *info,enum cache_type type,
+          my_off_t seek_offset,pbool use_async_io,
+          pbool clear_cache);
+extern void setup_io_cache(IO_CACHE* info);
+extern int _my_b_read(IO_CACHE *info,uchar *Buffer,size_t Count);
+extern int _my_b_read_r(IO_CACHE *info,uchar *Buffer,size_t Count);
+extern void init_io_cache_share(IO_CACHE *read_cache, IO_CACHE_SHARE *cshare,
+                                IO_CACHE *write_cache, uint num_threads);
+extern void remove_io_thread(IO_CACHE *info);
+extern int _my_b_seq_read(IO_CACHE *info,uchar *Buffer,size_t Count);
+extern int _my_b_net_read(IO_CACHE *info,uchar *Buffer,size_t Count);
+extern int _my_b_get(IO_CACHE *info);
+extern int _my_b_async_read(IO_CACHE *info,uchar *Buffer,size_t Count);
+extern int _my_b_write(IO_CACHE *info,const uchar *Buffer,size_t Count);
+extern int my_b_append(IO_CACHE *info,const uchar *Buffer,size_t Count);
+extern int my_b_safe_write(IO_CACHE *info,const uchar *Buffer,size_t Count);
+extern int my_block_write(IO_CACHE *info, const uchar *Buffer,
+     size_t Count, my_off_t pos);
+extern int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock);
+extern int end_io_cache(IO_CACHE *info);
+extern size_t my_b_fill(IO_CACHE *info);
+extern void my_b_seek(IO_CACHE *info,my_off_t pos);
+extern size_t my_b_gets(IO_CACHE *info, char *to, size_t max_length);
+extern my_off_t my_b_filelength(IO_CACHE *info);
+extern size_t my_b_printf(IO_CACHE *info, const char* fmt, ...);
+extern size_t my_b_vprintf(IO_CACHE *info, const char* fmt, va_list ap);
+extern my_bool open_cached_file(IO_CACHE *cache,const char *dir,
+     const char *prefix, size_t cache_size,
+     myf cache_myflags);
+extern my_bool real_open_cached_file(IO_CACHE *cache);
+extern void close_cached_file(IO_CACHE *cache);
+File create_temp_file(char *to, const char *dir, const char *pfx,
+        int mode, myf MyFlags);
+extern my_bool init_dynamic_array2(DYNAMIC_ARRAY *array,uint element_size,
+                                   void *init_buffer, uint init_alloc,
+                                   uint alloc_increment
+                                   );
+extern my_bool init_dynamic_array(DYNAMIC_ARRAY *array,uint element_size,
+                                  uint init_alloc,uint alloc_increment
+                                  );
+extern my_bool insert_dynamic(DYNAMIC_ARRAY *array,uchar * element);
+extern uchar *alloc_dynamic(DYNAMIC_ARRAY *array);
+extern uchar *pop_dynamic(DYNAMIC_ARRAY*);
+extern my_bool set_dynamic(DYNAMIC_ARRAY *array,uchar * element,uint array_index);
+extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements);
+extern void get_dynamic(DYNAMIC_ARRAY *array,uchar * element,uint array_index);
+extern void delete_dynamic(DYNAMIC_ARRAY *array);
+extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index);
+extern void freeze_size(DYNAMIC_ARRAY *array);
+extern int get_index_dynamic(DYNAMIC_ARRAY *array, uchar * element);
+extern my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str,
+       size_t init_alloc,size_t alloc_increment);
+extern my_bool dynstr_append(DYNAMIC_STRING *str, const char *append);
+my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append,
+     size_t length);
+extern my_bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append,
+                                       ...);
+extern my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str);
+extern my_bool dynstr_realloc(DYNAMIC_STRING *str, size_t additional_size);
+extern my_bool dynstr_trunc(DYNAMIC_STRING *str, size_t n);
+extern void dynstr_free(DYNAMIC_STRING *str);
+extern void init_alloc_root(MEM_ROOT *mem_root, size_t block_size,
+       size_t pre_alloc_size);
+extern void *alloc_root(MEM_ROOT *mem_root, size_t Size);
+extern void *multi_alloc_root(MEM_ROOT *mem_root, ...);
+extern void free_root(MEM_ROOT *root, myf MyFLAGS);
+extern void set_prealloc_root(MEM_ROOT *root, char *ptr);
+extern void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size,
+                                size_t prealloc_size);
+extern char *strdup_root(MEM_ROOT *root,const char *str);
+extern char *strmake_root(MEM_ROOT *root,const char *str,size_t len);
+extern void *memdup_root(MEM_ROOT *root,const void *str, size_t len);
+extern int get_defaults_options(int argc, char **argv,
+                                char **defaults, char **extra_defaults,
+                                char **group_suffix);
+extern int load_defaults(const char *conf_file, const char **groups,
+    int *argc, char ***argv);
+extern int modify_defaults_file(const char *file_location, const char *option,
+                                const char *option_value,
+                                const char *section_name, int remove_option);
+extern int my_search_option_files(const char *conf_file, int *argc,
+                                  char ***argv, uint *args_used,
+                                  Process_option_func func, void *func_ctx);
+extern void free_defaults(char **argv);
+extern void my_print_default_files(const char *conf_file);
+extern void print_defaults(const char *conf_file, const char **groups);
+extern my_bool my_compress(uchar *, size_t *, size_t *);
+extern my_bool my_uncompress(uchar *, size_t , size_t *);
+extern uchar *my_compress_alloc(const uchar *packet, size_t *len,
+                                size_t *complen);
+extern int packfrm(uchar *, size_t, uchar **, size_t *);
+extern int unpackfrm(uchar **, size_t *, const uchar *);
+extern ha_checksum my_checksum(ha_checksum crc, const uchar *mem,
+                               size_t count);
+extern void my_sleep(ulong m_seconds);
+extern ulong crc32(ulong crc, const uchar *buf, uint len);
+extern uint my_set_max_open_files(uint files);
+void my_free_open_file_info(void);
+extern time_t my_time(myf flags);
+extern ulonglong my_getsystime(void);
+extern ulonglong my_micro_time();
+extern ulonglong my_micro_time_and_time(time_t *time_arg);
+time_t my_time_possible_from_micro(ulonglong microtime);
+extern my_bool my_gethwaddr(uchar *to);
+extern int my_getncpus();
+#include <sys/mman.h>
+int my_msync(int, void *, size_t, int);
+extern uint get_charset_number(const char *cs_name, uint cs_flags);
+extern uint get_collation_number(const char *name);
+extern const char *get_charset_name(uint cs_number);
+extern CHARSET_INFO *get_charset(uint cs_number, myf flags);
+extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags);
+extern CHARSET_INFO *get_charset_by_csname(const char *cs_name,
+        uint cs_flags, myf my_flags);
+extern my_bool resolve_charset(const char *cs_name,
+                               CHARSET_INFO *default_cs,
+                               CHARSET_INFO **cs);
+extern my_bool resolve_collation(const char *cl_name,
+                                 CHARSET_INFO *default_cl,
+                                 CHARSET_INFO **cl);
+extern void free_charsets(void);
+extern char *get_charsets_dir(char *buf);
+extern my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2);
+extern my_bool init_compiled_charsets(myf flags);
+extern void add_compiled_collation(CHARSET_INFO *cs);
+extern size_t escape_string_for_mysql(CHARSET_INFO *charset_info,
+                                      char *to, size_t to_length,
+                                      const char *from, size_t length);
+extern size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
+                                      char *to, size_t to_length,
+                                      const char *from, size_t length);
+extern void thd_increment_bytes_sent(ulong length);
+extern void thd_increment_bytes_received(ulong length);
+extern void thd_increment_net_big_packet_count(ulong length);
+#include <my_time.h>
+#include "my_global.h"
+#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;
+extern ulonglong log_10_int[20];
+extern uchar days_in_month[];
+typedef long my_time_t;
+my_bool check_date(const MYSQL_TIME *ltime, my_bool not_zero_date,
+                   ulong flags, int *was_cut);
+enum enum_mysql_timestamp_type
+str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
+                uint flags, int *was_cut);
+longlong number_to_datetime(longlong nr, MYSQL_TIME *time_res,
+                            uint flags, int *was_cut);
+ulonglong TIME_to_ulonglong_datetime(const MYSQL_TIME *);
+ulonglong TIME_to_ulonglong_date(const MYSQL_TIME *);
+ulonglong TIME_to_ulonglong_time(const MYSQL_TIME *);
+ulonglong TIME_to_ulonglong(const MYSQL_TIME *);
+my_bool str_to_time(const char *str,uint length, MYSQL_TIME *l_time,
+                    int *warning);
+int check_time_range(struct st_mysql_time *, int *warning);
+long calc_daynr(uint year,uint month,uint day);
+uint calc_days_in_year(uint year);
+uint year_2000_handling(uint year);
+void my_init_time(void);
+static inline my_bool validate_timestamp_range(const MYSQL_TIME *t)
+{
+  if ((t->year > 2038 || t->year < (1900 + 70 - 1)) ||
+      (t->year == 2038 && (t->month > 1 || t->day > 19)) ||
+      (t->year == (1900 + 70 - 1) && (t->month < 12 || t->day < 31)))
+    return (0);
+  return (1);
+}
+my_time_t
+my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone,
+                  my_bool *in_dst_time_gap);
+void set_zero_time(MYSQL_TIME *tm, enum enum_mysql_timestamp_type time_type);
+int my_time_to_str(const MYSQL_TIME *l_time, char *to);
+int my_date_to_str(const MYSQL_TIME *l_time, char *to);
+int my_datetime_to_str(const MYSQL_TIME *l_time, char *to);
+int my_TIME_to_str(const MYSQL_TIME *l_time, char *to);
+enum interval_type
+{
+  INTERVAL_YEAR, INTERVAL_QUARTER, INTERVAL_MONTH, INTERVAL_WEEK, INTERVAL_DAY,
+  INTERVAL_HOUR, INTERVAL_MINUTE, INTERVAL_SECOND, INTERVAL_MICROSECOND,
+  INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE,
+  INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND,
+  INTERVAL_MINUTE_SECOND, INTERVAL_DAY_MICROSECOND, INTERVAL_HOUR_MICROSECOND,
+  INTERVAL_MINUTE_MICROSECOND, INTERVAL_SECOND_MICROSECOND, INTERVAL_LAST
+};
+#include <m_string.h>
+#include <strings.h>
+#include <string.h>
+#include <stdarg.h>
+#include <strings.h>
+#include <memory.h>
+extern void *(*my_str_malloc)(size_t);
+extern void (*my_str_free)(void *);
+extern char *stpcpy(char *, const char *);
+extern char _dig_vec_upper[];
+extern char _dig_vec_lower[];
+extern const double log_10[309];
+extern void bmove512(uchar *dst,const uchar *src,size_t len);
+extern void bmove_upp(uchar *dst,const uchar *src,size_t len);
+extern void bchange(uchar *dst,size_t old_len,const uchar *src,
+       size_t new_len,size_t tot_len);
+extern void strappend(char *s,size_t len,pchar fill);
+extern char *strend(const char *s);
+extern char *strcend(const char *, pchar);
+extern char *strfield(char *src,int fields,int chars,int blanks,
+      int tabch);
+extern char *strfill(char * s,size_t len,pchar fill);
+extern size_t strinstr(const char *str,const char *search);
+extern size_t r_strinstr(const char *str, size_t from, const char *search);
+extern char *strkey(char *dst,char *head,char *tail,char *flags);
+extern char *strmake(char *dst,const char *src,size_t length);
+extern char *strnmov(char *dst,const char *src,size_t n);
+extern char *strsuff(const char *src,const char *suffix);
+extern char *strcont(const char *src,const char *set);
+extern char *strxcat (char *dst,const char *src, ...);
+extern char *strxmov (char *dst,const char *src, ...);
+extern char *strxcpy (char *dst,const char *src, ...);
+extern char *strxncat (char *dst,size_t len, const char *src, ...);
+extern char *strxnmov (char *dst,size_t len, const char *src, ...);
+extern char *strxncpy (char *dst,size_t len, const char *src, ...);
+extern int is_prefix(const char *, const char *);
+double my_strtod(const char *str, char **end, int *error);
+double my_atof(const char *nptr);
+extern char *llstr(longlong value,char *buff);
+extern char *ullstr(longlong value,char *buff);
+extern char *int2str(long val, char *dst, int radix, int upcase);
+extern char *int10_to_str(long val,char *dst,int radix);
+extern char *str2int(const char *src,int radix,long lower,long upper,
+    long *val);
+longlong my_strtoll10(const char *nptr, char **endptr, int *error);
+extern char *longlong2str(longlong val,char *dst,int radix);
+extern char *longlong10_to_str(longlong val,char *dst,int radix);
+extern size_t my_vsnprintf(char *str, size_t n,
+                           const char *format, va_list ap);
+extern size_t my_snprintf(char *to, size_t n, const char *fmt, ...)
+  __attribute__((format(printf, 3, 4)));
+struct st_mysql_lex_string
+{
+  char *str;
+  size_t length;
+};
+typedef struct st_mysql_lex_string LEX_STRING;
+#include <hash.h>
+typedef uchar *(*hash_get_key)(const uchar *,size_t*,my_bool);
+typedef void (*hash_free_key)(void *);
+typedef struct st_hash {
+  size_t key_offset,key_length;
+  size_t blength;
+  ulong records;
+  uint flags;
+  DYNAMIC_ARRAY array;
+  hash_get_key get_key;
+  void (*free)(void *);
+  CHARSET_INFO *charset;
+} HASH;
+typedef uint HASH_SEARCH_STATE;
+my_bool _hash_init(HASH *hash, uint growth_size,CHARSET_INFO *charset,
+     ulong default_array_elements, size_t key_offset,
+     size_t key_length, hash_get_key get_key,
+     void (*free_element)(void*), uint flags );
+void hash_free(HASH *tree);
+void my_hash_reset(HASH *hash);
+uchar *hash_element(HASH *hash,ulong idx);
+uchar *hash_search(const HASH *info, const uchar *key, size_t length);
+uchar *hash_first(const HASH *info, const uchar *key, size_t length,
+                HASH_SEARCH_STATE *state);
+uchar *hash_next(const HASH *info, const uchar *key, size_t length,
+                 HASH_SEARCH_STATE *state);
+my_bool my_hash_insert(HASH *info,const uchar *data);
+my_bool hash_delete(HASH *hash,uchar *record);
+my_bool hash_update(HASH *hash,uchar *record,uchar *old_key,size_t old_key_length);
+void hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row);
+my_bool hash_check(HASH *hash);
+#include <signal.h>
+#include <thr_lock.h>
+#include <my_pthread.h>
+#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);
+struct st_thr_lock;
+extern ulong locks_immediate,locks_waited ;
+enum thr_lock_type { TL_IGNORE=-1,
+       TL_UNLOCK,
+       TL_READ,
+       TL_READ_WITH_SHARED_LOCKS,
+       TL_READ_HIGH_PRIORITY,
+       TL_READ_NO_INSERT,
+       TL_WRITE_ALLOW_WRITE,
+       TL_WRITE_ALLOW_READ,
+       TL_WRITE_CONCURRENT_INSERT,
+       TL_WRITE_DELAYED,
+                     TL_WRITE_DEFAULT,
+       TL_WRITE_LOW_PRIORITY,
+       TL_WRITE,
+       TL_WRITE_ONLY};
+enum enum_thr_lock_result { THR_LOCK_SUCCESS= 0, THR_LOCK_ABORTED= 1,
+                            THR_LOCK_WAIT_TIMEOUT= 2, THR_LOCK_DEADLOCK= 3 };
+extern ulong max_write_lock_count;
+extern ulong table_lock_wait_timeout;
+extern my_bool thr_lock_inited;
+extern enum thr_lock_type thr_upgraded_concurrent_insert_lock;
+typedef struct st_thr_lock_info
+{
+  pthread_t thread;
+  my_thread_id thread_id;
+  ulong n_cursors;
+} THR_LOCK_INFO;
+typedef struct st_thr_lock_owner
+{
+  THR_LOCK_INFO *info;
+} THR_LOCK_OWNER;
+typedef struct st_thr_lock_data {
+  THR_LOCK_OWNER *owner;
+  struct st_thr_lock_data *next,**prev;
+  struct st_thr_lock *lock;
+  pthread_cond_t *cond;
+  enum thr_lock_type type;
+  void *status_param;
+  void *debug_print_param;
+} THR_LOCK_DATA;
+struct st_lock_list {
+  THR_LOCK_DATA *data,**last;
+};
+typedef struct st_thr_lock {
+  LIST list;
+  pthread_mutex_t mutex;
+  struct st_lock_list read_wait;
+  struct st_lock_list read;
+  struct st_lock_list write_wait;
+  struct st_lock_list write;
+  ulong write_lock_count;
+  uint read_no_write_count;
+  void (*get_status)(void*, int);
+  void (*copy_status)(void*,void*);
+  void (*update_status)(void*);
+  void (*restore_status)(void*);
+  my_bool (*check_status)(void *);
+} THR_LOCK;
+extern LIST *thr_lock_thread_list;
+extern pthread_mutex_t THR_LOCK_lock;
+my_bool init_thr_lock(void);
+void thr_lock_info_init(THR_LOCK_INFO *info);
+void thr_lock_init(THR_LOCK *lock);
+void thr_lock_delete(THR_LOCK *lock);
+void thr_lock_data_init(THR_LOCK *lock,THR_LOCK_DATA *data,
+   void *status_param);
+enum enum_thr_lock_result thr_lock(THR_LOCK_DATA *data,
+                                   THR_LOCK_OWNER *owner,
+                                   enum thr_lock_type lock_type);
+void thr_unlock(THR_LOCK_DATA *data);
+enum enum_thr_lock_result thr_multi_lock(THR_LOCK_DATA **data,
+                                         uint count, THR_LOCK_OWNER *owner);
+void thr_multi_unlock(THR_LOCK_DATA **data,uint count);
+void thr_abort_locks(THR_LOCK *lock, my_bool upgrade_lock);
+my_bool thr_abort_locks_for_thread(THR_LOCK *lock, my_thread_id thread);
+void thr_print_locks(void);
+my_bool thr_upgrade_write_delay_lock(THR_LOCK_DATA *data);
+void thr_downgrade_write_lock(THR_LOCK_DATA *data,
+                                 enum thr_lock_type new_lock_type);
+my_bool thr_reschedule_write_lock(THR_LOCK_DATA *data);
+#include <my_base.h>
+#include <my_global.h>
+#include <my_dir.h>
+#include <sys/stat.h>
+typedef struct fileinfo
+{
+  char *name;
+  struct stat *mystat;
+} FILEINFO;
+typedef struct st_my_dir
+{
+  struct fileinfo *dir_entry;
+  uint number_off_files;
+} MY_DIR;
+extern MY_DIR *my_dir(const char *path,myf MyFlags);
+extern void my_dirend(MY_DIR *buffer);
+extern struct stat *my_stat(const char *path, struct stat *stat_area, myf my_flags);
+extern int my_fstat(int filenr, struct stat *stat_area, myf MyFlags);
+#include <my_sys.h>
+#include <m_string.h>
+#include <errno.h>
+#include <my_list.h>
+enum ha_rkey_function {
+  HA_READ_KEY_EXACT,
+  HA_READ_KEY_OR_NEXT,
+  HA_READ_KEY_OR_PREV,
+  HA_READ_AFTER_KEY,
+  HA_READ_BEFORE_KEY,
+  HA_READ_PREFIX,
+  HA_READ_PREFIX_LAST,
+  HA_READ_PREFIX_LAST_OR_PREV,
+  HA_READ_MBR_CONTAIN,
+  HA_READ_MBR_INTERSECT,
+  HA_READ_MBR_WITHIN,
+  HA_READ_MBR_DISJOINT,
+  HA_READ_MBR_EQUAL
+};
+enum ha_key_alg {
+  HA_KEY_ALG_UNDEF= 0,
+  HA_KEY_ALG_BTREE= 1,
+  HA_KEY_ALG_RTREE= 2,
+  HA_KEY_ALG_HASH= 3,
+  HA_KEY_ALG_FULLTEXT= 4
+};
+enum ha_storage_media {
+  HA_SM_DEFAULT= 0,
+  HA_SM_DISK= 1,
+  HA_SM_MEMORY= 2
+};
+enum ha_extra_function {
+  HA_EXTRA_NORMAL=0,
+  HA_EXTRA_QUICK=1,
+  HA_EXTRA_NOT_USED=2,
+  HA_EXTRA_CACHE=3,
+  HA_EXTRA_NO_CACHE=4,
+  HA_EXTRA_NO_READCHECK=5,
+  HA_EXTRA_READCHECK=6,
+  HA_EXTRA_KEYREAD=7,
+  HA_EXTRA_NO_KEYREAD=8,
+  HA_EXTRA_NO_USER_CHANGE=9,
+  HA_EXTRA_KEY_CACHE=10,
+  HA_EXTRA_NO_KEY_CACHE=11,
+  HA_EXTRA_WAIT_LOCK=12,
+  HA_EXTRA_NO_WAIT_LOCK=13,
+  HA_EXTRA_WRITE_CACHE=14,
+  HA_EXTRA_FLUSH_CACHE=15,
+  HA_EXTRA_NO_KEYS=16,
+  HA_EXTRA_KEYREAD_CHANGE_POS=17,
+  HA_EXTRA_REMEMBER_POS=18,
+  HA_EXTRA_RESTORE_POS=19,
+  HA_EXTRA_REINIT_CACHE=20,
+  HA_EXTRA_FORCE_REOPEN=21,
+  HA_EXTRA_FLUSH,
+  HA_EXTRA_NO_ROWS,
+  HA_EXTRA_RESET_STATE,
+  HA_EXTRA_IGNORE_DUP_KEY,
+  HA_EXTRA_NO_IGNORE_DUP_KEY,
+  HA_EXTRA_PREPARE_FOR_DROP,
+  HA_EXTRA_PREPARE_FOR_UPDATE,
+  HA_EXTRA_PRELOAD_BUFFER_SIZE,
+  HA_EXTRA_CHANGE_KEY_TO_UNIQUE,
+  HA_EXTRA_CHANGE_KEY_TO_DUP,
+  HA_EXTRA_KEYREAD_PRESERVE_FIELDS,
+  HA_EXTRA_MMAP,
+  HA_EXTRA_IGNORE_NO_KEY,
+  HA_EXTRA_NO_IGNORE_NO_KEY,
+  HA_EXTRA_MARK_AS_LOG_TABLE,
+  HA_EXTRA_WRITE_CAN_REPLACE,
+  HA_EXTRA_WRITE_CANNOT_REPLACE,
+  HA_EXTRA_DELETE_CANNOT_BATCH,
+  HA_EXTRA_UPDATE_CANNOT_BATCH,
+  HA_EXTRA_INSERT_WITH_UPDATE,
+  HA_EXTRA_PREPARE_FOR_RENAME,
+  HA_EXTRA_ATTACH_CHILDREN,
+  HA_EXTRA_DETACH_CHILDREN
+};
+enum ha_panic_function {
+  HA_PANIC_CLOSE,
+  HA_PANIC_WRITE,
+  HA_PANIC_READ
+};
+enum ha_base_keytype {
+  HA_KEYTYPE_END=0,
+  HA_KEYTYPE_TEXT=1,
+  HA_KEYTYPE_BINARY=2,
+  HA_KEYTYPE_SHORT_INT=3,
+  HA_KEYTYPE_LONG_INT=4,
+  HA_KEYTYPE_FLOAT=5,
+  HA_KEYTYPE_DOUBLE=6,
+  HA_KEYTYPE_NUM=7,
+  HA_KEYTYPE_USHORT_INT=8,
+  HA_KEYTYPE_ULONG_INT=9,
+  HA_KEYTYPE_LONGLONG=10,
+  HA_KEYTYPE_ULONGLONG=11,
+  HA_KEYTYPE_INT24=12,
+  HA_KEYTYPE_UINT24=13,
+  HA_KEYTYPE_INT8=14,
+  HA_KEYTYPE_VARTEXT1=15,
+  HA_KEYTYPE_VARBINARY1=16,
+  HA_KEYTYPE_VARTEXT2=17,
+  HA_KEYTYPE_VARBINARY2=18,
+  HA_KEYTYPE_BIT=19
+};
+typedef ulong key_part_map;
+enum en_fieldtype {
+  FIELD_LAST=-1,FIELD_NORMAL,FIELD_SKIP_ENDSPACE,FIELD_SKIP_PRESPACE,
+  FIELD_SKIP_ZERO,FIELD_BLOB,FIELD_CONSTANT,FIELD_INTERVALL,FIELD_ZERO,
+  FIELD_VARCHAR,FIELD_CHECK,
+  FIELD_enum_val_count
+};
+enum data_file_type {
+  STATIC_RECORD, DYNAMIC_RECORD, COMPRESSED_RECORD, BLOCK_RECORD
+};
+typedef struct st_key_range
+{
+  const uchar *key;
+  uint length;
+  key_part_map keypart_map;
+  enum ha_rkey_function flag;
+} key_range;
+typedef struct st_key_multi_range
+{
+  key_range start_key;
+  key_range end_key;
+  char *ptr;
+  uint range_flag;
+} KEY_MULTI_RANGE;
+typedef my_off_t ha_rows;
+typedef void (* invalidator_by_filename)(const char * filename);
+#include <queues.h>
+typedef struct st_queue {
+  uchar **root;
+  void *first_cmp_arg;
+  uint elements;
+  uint max_elements;
+  uint offset_to_key;
+  int max_at_top;
+  int (*compare)(void *, uchar *,uchar *);
+  uint auto_extent;
+} QUEUE;
+typedef int (*queue_compare)(void *,uchar *, uchar *);
+int init_queue(QUEUE *queue,uint max_elements,uint offset_to_key,
+        pbool max_at_top, queue_compare compare,
+        void *first_cmp_arg);
+int init_queue_ex(QUEUE *queue,uint max_elements,uint offset_to_key,
+        pbool max_at_top, queue_compare compare,
+        void *first_cmp_arg, uint auto_extent);
+int reinit_queue(QUEUE *queue,uint max_elements,uint offset_to_key,
+                 pbool max_at_top, queue_compare compare,
+                 void *first_cmp_arg);
+int resize_queue(QUEUE *queue, uint max_elements);
+void delete_queue(QUEUE *queue);
+void queue_insert(QUEUE *queue,uchar *element);
+int queue_insert_safe(QUEUE *queue, uchar *element);
+uchar *queue_remove(QUEUE *queue,uint idx);
+void _downheap(QUEUE *queue,uint idx);
+void queue_fix(QUEUE *queue);
+#include "sql_bitmap.h"
+#include <my_bitmap.h>
+#include <m_string.h>
+typedef uint32 my_bitmap_map;
+typedef struct st_bitmap
+{
+  my_bitmap_map *bitmap;
+  uint n_bits;
+  my_bitmap_map last_word_mask;
+  my_bitmap_map *last_word_ptr;
+  pthread_mutex_t *mutex;
+} MY_BITMAP;
+extern void create_last_word_mask(MY_BITMAP *map);
+extern my_bool bitmap_init(MY_BITMAP *map, my_bitmap_map *buf, uint n_bits,
+                           my_bool thread_safe);
+extern my_bool bitmap_is_clear_all(const MY_BITMAP *map);
+extern my_bool bitmap_is_prefix(const MY_BITMAP *map, uint prefix_size);
+extern my_bool bitmap_is_set_all(const MY_BITMAP *map);
+extern my_bool bitmap_is_subset(const MY_BITMAP *map1, const MY_BITMAP *map2);
+extern my_bool bitmap_is_overlapping(const MY_BITMAP *map1,
+                                     const MY_BITMAP *map2);
+extern my_bool bitmap_test_and_set(MY_BITMAP *map, uint bitmap_bit);
+extern my_bool bitmap_test_and_clear(MY_BITMAP *map, uint bitmap_bit);
+extern my_bool bitmap_fast_test_and_set(MY_BITMAP *map, uint bitmap_bit);
+extern uint bitmap_set_next(MY_BITMAP *map);
+extern uint bitmap_get_first(const MY_BITMAP *map);
+extern uint bitmap_get_first_set(const MY_BITMAP *map);
+extern uint bitmap_bits_set(const MY_BITMAP *map);
+extern void bitmap_free(MY_BITMAP *map);
+extern void bitmap_set_above(MY_BITMAP *map, uint from_byte, uint use_bit);
+extern void bitmap_set_prefix(MY_BITMAP *map, uint prefix_size);
+extern void bitmap_intersect(MY_BITMAP *map, const MY_BITMAP *map2);
+extern void bitmap_subtract(MY_BITMAP *map, const MY_BITMAP *map2);
+extern void bitmap_union(MY_BITMAP *map, const MY_BITMAP *map2);
+extern void bitmap_xor(MY_BITMAP *map, const MY_BITMAP *map2);
+extern void bitmap_invert(MY_BITMAP *map);
+extern void bitmap_copy(MY_BITMAP *map, const MY_BITMAP *map2);
+extern uint bitmap_lock_set_next(MY_BITMAP *map);
+extern void bitmap_lock_clear_bit(MY_BITMAP *map, uint bitmap_bit);
+static inline void
+bitmap_set_bit(MY_BITMAP *map,uint bit)
+{
+  assert(bit < (map)->n_bits);
+  (((uchar*)(map)->bitmap)[(bit) / 8] |= (1 << ((bit) & 7)));
+}
+static inline void
+bitmap_flip_bit(MY_BITMAP *map,uint bit)
+{
+  assert(bit < (map)->n_bits);
+  (((uchar*)(map)->bitmap)[(bit) / 8] ^= (1 << ((bit) & 7)));
+}
+static inline void
+bitmap_clear_bit(MY_BITMAP *map,uint bit)
+{
+  assert(bit < (map)->n_bits);
+  (((uchar*)(map)->bitmap)[(bit) / 8] &= ~ (1 << ((bit) & 7)));
+}
+static inline uint
+bitmap_is_set(const MY_BITMAP *map,uint bit)
+{
+  assert(bit < (map)->n_bits);
+  return (uint) (((uchar*)(map)->bitmap)[(bit) / 8] & (1 << ((bit) & 7)));
+}
+static inline my_bool bitmap_cmp(const MY_BITMAP *map1, const MY_BITMAP *map2)
+{
+  *(map1)->last_word_ptr|= (map1)->last_word_mask;
+  *(map2)->last_word_ptr|= (map2)->last_word_mask;
+  return memcmp((map1)->bitmap, (map2)->bitmap, 4*((((map1))->n_bits + 31)/32))==0;
+}
+template <uint default_width> class Bitmap
+{
+  MY_BITMAP map;
+  uint32 buffer[(default_width+31)/32];
+public:
+  Bitmap() { init(); }
+  Bitmap(const Bitmap& from) { *this=from; }
+  explicit Bitmap(uint prefix_to_set) { init(prefix_to_set); }
+  void init() { bitmap_init(&map, buffer, default_width, 0); }
+  void init(uint prefix_to_set) { init(); set_prefix(prefix_to_set); }
+  uint length() const { return default_width; }
+  Bitmap& operator=(const Bitmap& map2)
+  {
+    init();
+    memcpy(buffer, map2.buffer, sizeof(buffer));
+    return *this;
+  }
+  void set_bit(uint n) { bitmap_set_bit(&map, n); }
+  void clear_bit(uint n) { bitmap_clear_bit(&map, n); }
+  void set_prefix(uint n) { bitmap_set_prefix(&map, n); }
+  void set_all() { (memset((&map)->bitmap, 0xFF, 4*((((&map))->n_bits + 31)/32))); }
+  void clear_all() { { memset((&map)->bitmap, 0, 4*((((&map))->n_bits + 31)/32)); }; }
+  void intersect(Bitmap& map2) { bitmap_intersect(&map, &map2.map); }
+  void intersect(ulonglong map2buff)
+  {
+    MY_BITMAP map2;
+    bitmap_init(&map2, (uint32 *)&map2buff, sizeof(ulonglong)*8, 0);
+    bitmap_intersect(&map, &map2);
+  }
+  void intersect_extended(ulonglong map2buff)
+  {
+    intersect(map2buff);
+    if (map.n_bits > sizeof(ulonglong) * 8)
+      bitmap_set_above(&map, sizeof(ulonglong),
+                       ((map2buff & (1LL << (sizeof(ulonglong) * 8 - 1))) ? 1 : 0));
+  }
+  void subtract(Bitmap& map2) { bitmap_subtract(&map, &map2.map); }
+  void merge(Bitmap& map2) { bitmap_union(&map, &map2.map); }
+  my_bool is_set(uint n) const { return bitmap_is_set(&map, n); }
+  my_bool is_prefix(uint n) const { return bitmap_is_prefix(&map, n); }
+  my_bool is_clear_all() const { return bitmap_is_clear_all(&map); }
+  my_bool is_set_all() const { return bitmap_is_set_all(&map); }
+  my_bool is_subset(const Bitmap& map2) const { return bitmap_is_subset(&map, &map2.map); }
+  my_bool is_overlapping(const Bitmap& map2) const { return bitmap_is_overlapping(&map, &map2.map); }
+  my_bool operator==(const Bitmap& map2) const { return bitmap_cmp(&map, &map2.map); }
+  char *print(char *buf) const
+  {
+    char *s=buf;
+    const uchar *e=(uchar *)buffer, *b=e+sizeof(buffer)-1;
+    while (!*b && b>e)
+      b--;
+    if ((*s=_dig_vec_upper[*b >> 4]) != '0')
+        s++;
+    *s++=_dig_vec_upper[*b & 15];
+    while (--b>=e)
+    {
+      *s++=_dig_vec_upper[*b >> 4];
+      *s++=_dig_vec_upper[*b & 15];
+    }
+    *s=0;
+    return buf;
+  }
+  ulonglong to_ulonglong() const
+  {
+    if (sizeof(buffer) >= 8)
+      return (*((ulonglong *) (buffer)));
+    assert(sizeof(buffer) >= 4);
+    return (ulonglong) (*((uint32 *) (buffer)));
+  }
+};
+template <> class Bitmap<64>
+{
+  ulonglong map;
+public:
+  Bitmap<64>() { }
+  explicit Bitmap<64>(uint prefix_to_set) { set_prefix(prefix_to_set); }
+  void init() { }
+  void init(uint prefix_to_set) { set_prefix(prefix_to_set); }
+  uint length() const { return 64; }
+  void set_bit(uint n) { map|= ((ulonglong)1) << n; }
+  void clear_bit(uint n) { map&= ~(((ulonglong)1) << n); }
+  void set_prefix(uint n)
+  {
+    if (n >= length())
+      set_all();
+    else
+      map= (((ulonglong)1) << n)-1;
+  }
+  void set_all() { map=~(ulonglong)0; }
+  void clear_all() { map=(ulonglong)0; }
+  void intersect(Bitmap<64>& map2) { map&= map2.map; }
+  void intersect(ulonglong map2) { map&= map2; }
+  void intersect_extended(ulonglong map2) { map&= map2; }
+  void subtract(Bitmap<64>& map2) { map&= ~map2.map; }
+  void merge(Bitmap<64>& map2) { map|= map2.map; }
+  my_bool is_set(uint n) const { return ((map & (((ulonglong)1) << n)) ? 1 : 0); }
+  my_bool is_prefix(uint n) const { return map == (((ulonglong)1) << n)-1; }
+  my_bool is_clear_all() const { return map == (ulonglong)0; }
+  my_bool is_set_all() const { return map == ~(ulonglong)0; }
+  my_bool is_subset(const Bitmap<64>& map2) const { return !(map & ~map2.map); }
+  my_bool is_overlapping(const Bitmap<64>& map2) const { return (map & map2.map)!= 0; }
+  my_bool operator==(const Bitmap<64>& map2) const { return map == map2.map; }
+  char *print(char *buf) const { longlong2str(map,buf,16); return buf; }
+  ulonglong to_ulonglong() const { return map; }
+};
+#include "sql_array.h"
+#include <my_sys.h>
+template <class Elem> class Dynamic_array
+{
+  DYNAMIC_ARRAY array;
+public:
+  Dynamic_array(uint prealloc=16, uint increment=16)
+  {
+    init_dynamic_array2(&array,sizeof(Elem),NULL,prealloc,increment );
+  }
+  Elem& at(int idx)
+  {
+    return *(((Elem*)array.buffer) + idx);
+  }
+  Elem *front()
+  {
+    return (Elem*)array.buffer;
+  }
+  Elem *back()
+  {
+    return ((Elem*)array.buffer) + array.elements;
+  }
+  In_C_you_should_use_my_bool_instead() append(Elem &el)
+  {
+    return (insert_dynamic(&array, (uchar*)&el));
+  }
+  int elements()
+  {
+    return array.elements;
+  }
+  ~Dynamic_array()
+  {
+    delete_dynamic(&array);
+  }
+  typedef int (*CMP_FUNC)(const Elem *el1, const Elem *el2);
+  void sort(CMP_FUNC cmp_func)
+  {
+    my_qsort(array.buffer, array.elements, sizeof(Elem), (qsort_cmp)cmp_func);
+  }
+};
+#include "sql_plugin.h"
+class sys_var;
+#include <mysql/plugin.h>
+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_KEY_CACHE_LONG, SHOW_KEY_CACHE_LONGLONG, SHOW_LONG_STATUS, SHOW_DOUBLE_STATUS, SHOW_HAVE, SHOW_MY_BOOL, SHOW_HA_ROWS, SHOW_SYS, SHOW_LONG_NOFLUSH, SHOW_LONGLONG_STATUS, SHOW_DOUBLE
+};
+struct st_mysql_show_var {
+  const char *name;
+  char *value;
+  enum enum_mysql_show_type type;
+};
+typedef int (*mysql_show_var_func)(void*, struct st_mysql_show_var*, char *);
+struct st_mysql_sys_var;
+struct st_mysql_value;
+typedef int (*mysql_var_check_func)(void* thd,
+                                    struct st_mysql_sys_var *var,
+                                    void *save, struct st_mysql_value *value);
+typedef void (*mysql_var_update_func)(void* thd,
+                                      struct st_mysql_sys_var *var,
+                                      void *var_ptr, const void *save);
+struct st_mysql_plugin
+{
+  int type;
+  void *info;
+  const char *name;
+  const char *author;
+  const char *descr;
+  int license;
+  int (*init)(void *);
+  int (*deinit)(void *);
+  unsigned int version;
+  struct st_mysql_show_var *status_vars;
+  struct st_mysql_sys_var **system_vars;
+  void * __reserved1;
+};
+enum enum_ftparser_mode
+{
+  MYSQL_FTPARSER_SIMPLE_MODE= 0,
+  MYSQL_FTPARSER_WITH_STOPWORDS= 1,
+  MYSQL_FTPARSER_FULL_BOOLEAN_INFO= 2
+};
+enum enum_ft_token_type
+{
+  FT_TOKEN_EOF= 0,
+  FT_TOKEN_WORD= 1,
+  FT_TOKEN_LEFT_PAREN= 2,
+  FT_TOKEN_RIGHT_PAREN= 3,
+  FT_TOKEN_STOPWORD= 4
+};
+typedef struct st_mysql_ftparser_boolean_info
+{
+  enum enum_ft_token_type type;
+  int yesno;
+  int weight_adjust;
+  char wasign;
+  char trunc;
+  char prev;
+  char *quot;
+} MYSQL_FTPARSER_BOOLEAN_INFO;
+typedef struct st_mysql_ftparser_param
+{
+  int (*mysql_parse)(struct st_mysql_ftparser_param *,
+                     char *doc, int doc_len);
+  int (*mysql_add_word)(struct st_mysql_ftparser_param *,
+                        char *word, int word_len,
+                        MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info);
+  void *ftparser_state;
+  void *mysql_ftparam;
+  struct charset_info_st *cs;
+  char *doc;
+  int length;
+  int flags;
+  enum enum_ftparser_mode mode;
+} MYSQL_FTPARSER_PARAM;
+struct st_mysql_ftparser
+{
+  int interface_version;
+  int (*parse)(MYSQL_FTPARSER_PARAM *param);
+  int (*init)(MYSQL_FTPARSER_PARAM *param);
+  int (*deinit)(MYSQL_FTPARSER_PARAM *param);
+};
+struct st_mysql_storage_engine
+{
+  int interface_version;
+};
+struct handlerton;
+struct st_mysql_daemon
+{
+  int interface_version;
+};
+struct st_mysql_information_schema
+{
+  int interface_version;
+};
+struct st_mysql_value
+{
+  int (*value_type)(struct st_mysql_value *);
+  const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length);
+  int (*val_real)(struct st_mysql_value *, double *realbuf);
+  int (*val_int)(struct st_mysql_value *, long long *intbuf);
+};
+int thd_in_lock_tables(const void* thd);
+int thd_tablespace_op(const void* thd);
+long long thd_test_options(const void* thd, long long test_options);
+int thd_sql_command(const void* thd);
+const char *thd_proc_info(void* thd, const char *info);
+void **thd_ha_data(const void* thd, const struct handlerton *hton);
+int thd_tx_isolation(const void* thd);
+char *thd_security_context(void* thd, char *buffer, unsigned int length,
+                           unsigned int max_query_len);
+void thd_inc_row_count(void* thd);
+int mysql_tmpfile(const char *prefix);
+int thd_killed(const void* thd);
+unsigned long thd_get_thread_id(const void* thd);
+void *thd_alloc(void* thd, unsigned int size);
+void *thd_calloc(void* thd, unsigned int size);
+char *thd_strdup(void* thd, const char *str);
+char *thd_strmake(void* thd, const char *str, unsigned int size);
+void *thd_memdup(void* thd, const void* str, unsigned int size);
+MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str,
+                                      const char *str, unsigned int size,
+                                      int allocate_lex_string);
+void thd_get_xid(const void* thd, MYSQL_XID *xid);
+void mysql_query_cache_invalidate4(void* thd,
+                                   const char *key, unsigned int key_length,
+                                   int using_trx);
+typedef enum enum_mysql_show_type SHOW_TYPE;
+typedef struct st_mysql_show_var SHOW_VAR;
+struct st_plugin_dl
+{
+  LEX_STRING dl;
+  void *handle;
+  struct st_mysql_plugin *plugins;
+  int version;
+  uint ref_count;
+};
+struct st_plugin_int
+{
+  LEX_STRING name;
+  struct st_mysql_plugin *plugin;
+  struct st_plugin_dl *plugin_dl;
+  uint state;
+  uint ref_count;
+  void *data;
+  MEM_ROOT mem_root;
+  sys_var *system_vars;
+};
+typedef struct st_plugin_int **plugin_ref;
+typedef int (*plugin_type_init)(struct st_plugin_int *);
+extern char *opt_plugin_load;
+extern char *opt_plugin_dir_ptr;
+extern char opt_plugin_dir[512];
+extern const LEX_STRING plugin_type_names[];
+extern int plugin_init(int *argc, char **argv, int init_flags);
+extern void plugin_shutdown(void);
+extern void my_print_help_inc_plugins(struct my_option *options, uint size);
+extern In_C_you_should_use_my_bool_instead() plugin_is_ready(const LEX_STRING *name, int type);
+extern plugin_ref plugin_lock(THD *thd, plugin_ref *ptr );
+extern plugin_ref plugin_lock_by_name(THD *thd, const LEX_STRING *name,
+                                      int type );
+extern void plugin_unlock(THD *thd, plugin_ref plugin);
+extern void plugin_unlock_list(THD *thd, plugin_ref *list, uint count);
+extern In_C_you_should_use_my_bool_instead() mysql_install_plugin(THD *thd, const LEX_STRING *name,
+                                 const LEX_STRING *dl);
+extern In_C_you_should_use_my_bool_instead() mysql_uninstall_plugin(THD *thd, const LEX_STRING *name);
+extern In_C_you_should_use_my_bool_instead() plugin_register_builtin(struct st_mysql_plugin *plugin);
+extern void plugin_thdvar_init(THD *thd);
+extern void plugin_thdvar_cleanup(THD *thd);
+typedef my_bool (plugin_foreach_func)(THD *thd,
+                                      plugin_ref plugin,
+                                      void *arg);
+extern In_C_you_should_use_my_bool_instead() plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func,
+                                     int type, uint state_mask, void *arg);
+#include "scheduler.h"
+class THD;
+class scheduler_functions
+{
+public:
+  uint max_threads;
+  In_C_you_should_use_my_bool_instead() (*init)(void);
+  In_C_you_should_use_my_bool_instead() (*init_new_connection_thread)(void);
+  void (*add_connection)(THD *thd);
+  void (*post_kill_notification)(THD *thd);
+  In_C_you_should_use_my_bool_instead() (*end_thread)(THD *thd, In_C_you_should_use_my_bool_instead() cache_thread);
+  void (*end)(void);
+  scheduler_functions();
+};
+enum scheduler_types
+{
+  SCHEDULER_ONE_THREAD_PER_CONNECTION=0,
+  SCHEDULER_NO_THREADS,
+  SCHEDULER_POOL_OF_THREADS
+};
+void one_thread_per_connection_scheduler(scheduler_functions* func);
+void one_thread_scheduler(scheduler_functions* func);
+enum pool_command_op
+{
+  NOT_IN_USE_OP= 0, NORMAL_OP= 1, CONNECT_OP, KILL_OP, DIE_OP
+};
+class thd_scheduler
+{};
+enum enum_query_type
+{
+  QT_ORDINARY,
+  QT_IS
+};
+typedef ulonglong table_map;
+typedef Bitmap<64> key_map;
+typedef ulong nesting_map;
+typedef ulonglong nested_join_map;
+typedef ulonglong query_id_t;
+extern query_id_t global_query_id;
+inline query_id_t next_query_id() { return global_query_id++; }
+extern const key_map key_map_empty;
+extern key_map key_map_full;
+extern const char *primary_key_name;
+#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);
+void my_net_set_write_timeout(NET *net, uint timeout);
+void my_net_set_read_timeout(NET *net, uint timeout);
+struct sockaddr;
+int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen,
+        unsigned int timeout);
+struct rand_struct {
+  unsigned long seed1,seed2,max_value;
+  double max_value_dbl;
+};
+enum Item_result {STRING_RESULT=0, REAL_RESULT, INT_RESULT, ROW_RESULT,
+                  DECIMAL_RESULT};
+typedef struct st_udf_args
+{
+  unsigned int arg_count;
+  enum Item_result *arg_type;
+  char **args;
+  unsigned long *lengths;
+  char *maybe_null;
+  char **attributes;
+  unsigned long *attribute_lengths;
+  void *extension;
+} UDF_ARGS;
+typedef struct st_udf_init
+{
+  my_bool maybe_null;
+  unsigned int decimals;
+  unsigned long max_length;
+  char *ptr;
+  my_bool const_item;
+  void *extension;
+} UDF_INIT;
+void randominit(struct rand_struct *, unsigned long seed1,
+                unsigned long seed2);
+double my_rnd(struct rand_struct *);
+void create_random_string(char *to, unsigned int length, struct rand_struct *rand_st);
+void hash_password(unsigned long *to, const char *password, unsigned int password_len);
+void make_scrambled_password_323(char *to, const char *password);
+void scramble_323(char *to, const char *message, const char *password);
+my_bool check_scramble_323(const char *, const char *message,
+                           unsigned long *salt);
+void get_salt_from_password_323(unsigned long *res, const char *password);
+void make_password_from_salt_323(char *to, const unsigned long *salt);
+void make_scrambled_password(char *to, const char *password);
+void scramble(char *to, const char *message, const char *password);
+my_bool check_scramble(const char *reply, const char *message,
+                       const unsigned char *hash_stage2);
+void get_salt_from_password(unsigned char *res, const char *password);
+void make_password_from_salt(char *to, const unsigned char *hash_stage2);
+char *octet2hex(char *to, const char *str, unsigned int len);
+char *get_tty_password(const char *opt_message);
+const char *mysql_errno_to_sqlstate(unsigned int mysql_errno);
+my_bool my_thread_init(void);
+void my_thread_end(void);
+ulong net_field_length(uchar **packet);
+my_ulonglong net_field_length_ll(uchar **packet);
+uchar *net_store_length(uchar *pkg, ulonglong length);
+#include <violite.h>
+#include "my_net.h"
+#include <errno.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/poll.h>
+#include <sys/ioctl.h>
+#include <netinet/in_systm.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+void my_inet_ntoa(struct in_addr in, char *buf);
+struct hostent;
+struct hostent *my_gethostbyname_r(const char *name,
+       struct hostent *result, char *buffer,
+       int buflen, int *h_errnop);
+enum enum_vio_type
+{
+  VIO_CLOSED, VIO_TYPE_TCPIP, VIO_TYPE_SOCKET, VIO_TYPE_NAMEDPIPE,
+  VIO_TYPE_SSL, VIO_TYPE_SHARED_MEMORY
+};
+Vio* vio_new(my_socket sd, enum enum_vio_type type, uint flags);
+void vio_delete(Vio* vio);
+int vio_close(Vio* vio);
+void vio_reset(Vio* vio, enum enum_vio_type type,
+                  my_socket sd, void * hPipe, uint flags);
+size_t vio_read(Vio *vio, uchar * buf, size_t size);
+size_t vio_read_buff(Vio *vio, uchar * buf, size_t size);
+size_t vio_write(Vio *vio, const uchar * buf, size_t size);
+int vio_blocking(Vio *vio, my_bool onoff, my_bool *old_mode);
+my_bool vio_is_blocking(Vio *vio);
+int vio_fastsend(Vio *vio);
+int vio_keepalive(Vio *vio, my_bool onoff);
+my_bool vio_should_retry(Vio *vio);
+my_bool vio_was_interrupted(Vio *vio);
+const char* vio_description(Vio *vio);
+enum enum_vio_type vio_type(Vio* vio);
+int vio_errno(Vio*vio);
+my_socket vio_fd(Vio*vio);
+my_bool vio_peer_addr(Vio* vio, char *buf, uint16 *port);
+void vio_in_addr(Vio *vio, struct in_addr *in);
+my_bool vio_poll_read(Vio *vio,uint timeout);
+void vio_end(void);
+enum SSL_type
+{
+  SSL_TYPE_NOT_SPECIFIED= -1,
+  SSL_TYPE_NONE,
+  SSL_TYPE_ANY,
+  SSL_TYPE_X509,
+  SSL_TYPE_SPECIFIED
+};
+struct st_vio
+{
+  my_socket sd;
+  void * hPipe;
+  my_bool localhost;
+  int fcntl_mode;
+  struct sockaddr_in local;
+  struct sockaddr_in remote;
+  enum enum_vio_type type;
+  char desc[30];
+  char *read_buffer;
+  char *read_pos;
+  char *read_end;
+  void (*viodelete)(Vio*);
+  int (*vioerrno)(Vio*);
+  size_t (*read)(Vio*, uchar *, size_t);
+  size_t (*write)(Vio*, const uchar *, size_t);
+  int (*vioblocking)(Vio*, my_bool, my_bool *);
+  my_bool (*is_blocking)(Vio*);
+  int (*viokeepalive)(Vio*, my_bool);
+  int (*fastsend)(Vio*);
+  my_bool (*peer_addr)(Vio*, char *, uint16*);
+  void (*in_addr)(Vio*, struct in_addr*);
+  my_bool (*should_retry)(Vio*);
+  my_bool (*was_interrupted)(Vio*);
+  int (*vioclose)(Vio*);
+  void (*timeout)(Vio*, unsigned int which, unsigned int timeout);
+};
+#include "unireg.h"
+#include "mysqld_error.h"
+#include "structs.h"
+struct st_table;
+class Field;
+typedef struct st_date_time_format {
+  uchar positions[8];
+  char time_separator;
+  uint flag;
+  LEX_STRING format;
+} DATE_TIME_FORMAT;
+typedef struct st_keyfile_info {
+  uchar ref[8];
+  uchar dupp_ref[8];
+  uint ref_length;
+  uint block_size;
+  File filenr;
+  ha_rows records;
+  ha_rows deleted;
+  ulonglong data_file_length;
+  ulonglong max_data_file_length;
+  ulonglong index_file_length;
+  ulonglong max_index_file_length;
+  ulonglong delete_length;
+  ulonglong auto_increment_value;
+  int errkey,sortkey;
+  time_t create_time;
+  time_t check_time;
+  time_t update_time;
+  ulong mean_rec_length;
+} KEYFILE_INFO;
+typedef struct st_key_part_info {
+  Field *field;
+  uint offset;
+  uint null_offset;
+  uint16 length;
+  uint16 store_length;
+  uint16 key_type;
+  uint16 fieldnr;
+  uint16 key_part_flag;
+  uint8 type;
+  uint8 null_bit;
+} KEY_PART_INFO ;
+typedef struct st_key {
+  uint key_length;
+  ulong flags;
+  uint key_parts;
+  uint extra_length;
+  uint usable_key_parts;
+  uint block_size;
+  enum ha_key_alg algorithm;
+  union
+  {
+    plugin_ref parser;
+    LEX_STRING *parser_name;
+  };
+  KEY_PART_INFO *key_part;
+  char *name;
+  ulong *rec_per_key;
+  union {
+    int bdb_return_if_eq;
+  } handler;
+  struct st_table *table;
+} KEY;
+struct st_join_table;
+typedef struct st_reginfo {
+  struct st_join_table *join_tab;
+  enum thr_lock_type lock_type;
+  In_C_you_should_use_my_bool_instead() not_exists_optimize;
+  In_C_you_should_use_my_bool_instead() impossible_range;
+} REGINFO;
+struct st_read_record;
+class SQL_SELECT;
+class THD;
+class handler;
+typedef struct st_read_record {
+  struct st_table *table;
+  handler *file;
+  struct st_table **forms;
+  int (*read_record)(struct st_read_record *);
+  THD *thd;
+  SQL_SELECT *select;
+  uint cache_records;
+  uint ref_length,struct_length,reclength,rec_cache_size,error_offset;
+  uint index;
+  uchar *ref_pos;
+  uchar *record;
+  uchar *rec_buf;
+  uchar *cache,*cache_pos,*cache_end,*read_positions;
+  IO_CACHE *io_cache;
+  In_C_you_should_use_my_bool_instead() print_error, ignore_not_found_rows;
+} READ_RECORD;
+typedef enum enum_mysql_timestamp_type timestamp_type;
+typedef struct {
+  ulong year,month,day,hour;
+  ulonglong minute,second,second_part;
+  In_C_you_should_use_my_bool_instead() neg;
+} INTERVAL;
+typedef struct st_known_date_time_format {
+  const char *format_name;
+  const char *date_format;
+  const char *datetime_format;
+  const char *time_format;
+} KNOWN_DATE_TIME_FORMAT;
+enum SHOW_COMP_OPTION { SHOW_OPTION_YES, SHOW_OPTION_NO, SHOW_OPTION_DISABLED};
+extern const char *show_comp_option_name[];
+typedef int *(*update_var)(THD *, struct st_mysql_show_var *);
+typedef struct st_lex_user {
+  LEX_STRING user, host, password;
+} LEX_USER;
+typedef struct user_resources {
+  uint questions;
+  uint updates;
+  uint conn_per_hour;
+  uint user_conn;
+  enum {QUERIES_PER_HOUR= 1, UPDATES_PER_HOUR= 2, CONNECTIONS_PER_HOUR= 4,
+        USER_CONNECTIONS= 8};
+  uint specified_limits;
+} USER_RESOURCES;
+typedef struct user_conn {
+  char *user;
+  char *host;
+  ulonglong reset_utime;
+  uint len;
+  uint connections;
+  uint conn_per_hour, updates, questions;
+  USER_RESOURCES user_resources;
+} USER_CONN;
+class Discrete_interval {
+private:
+  ulonglong interval_min;
+  ulonglong interval_values;
+  ulonglong interval_max;
+public:
+  Discrete_interval *next;
+  void replace(ulonglong start, ulonglong val, ulonglong incr)
+  {
+    interval_min= start;
+    interval_values= val;
+    interval_max= (val == ((unsigned long long)(~0ULL))) ? val : start + val * incr;
+  }
+  Discrete_interval(ulonglong start, ulonglong val, ulonglong incr) :
+    next(NULL) { replace(start, val, incr); };
+  Discrete_interval() : next(NULL) { replace(0, 0, 0); };
+  ulonglong minimum() const { return interval_min; };
+  ulonglong values() const { return interval_values; };
+  ulonglong maximum() const { return interval_max; };
+  In_C_you_should_use_my_bool_instead() merge_if_contiguous(ulonglong start, ulonglong val, ulonglong incr)
+  {
+    if (interval_max == start)
+    {
+      if (val == ((unsigned long long)(~0ULL)))
+      {
+        interval_values= interval_max= val;
+      }
+      else
+      {
+        interval_values+= val;
+        interval_max= start + val * incr;
+      }
+      return 0;
+    }
+    return 1;
+  };
+};
+class Discrete_intervals_list {
+private:
+  Discrete_interval *head;
+  Discrete_interval *tail;
+  Discrete_interval *current;
+  uint elements;
+  void copy_(const Discrete_intervals_list& from)
+  {
+    for (Discrete_interval *i= from.head; i; i= i->next)
+    {
+      Discrete_interval j= *i;
+      append(&j);
+    }
+  }
+public:
+  Discrete_intervals_list() : head(NULL), current(NULL), elements(0) {};
+  Discrete_intervals_list(const Discrete_intervals_list& from)
+  {
+    copy_(from);
+  }
+  void operator=(const Discrete_intervals_list& from)
+  {
+    empty();
+    copy_(from);
+  }
+  void empty_no_free()
+  {
+    head= current= NULL;
+    elements= 0;
+  }
+  void empty()
+  {
+    for (Discrete_interval *i= head; i;)
+    {
+      Discrete_interval *next= i->next;
+      delete i;
+      i= next;
+    }
+    empty_no_free();
+  }
+  const Discrete_interval* get_next()
+  {
+    Discrete_interval *tmp= current;
+    if (current != NULL)
+      current= current->next;
+    return tmp;
+  }
+  ~Discrete_intervals_list() { empty(); };
+  In_C_you_should_use_my_bool_instead() append(ulonglong start, ulonglong val, ulonglong incr);
+  In_C_you_should_use_my_bool_instead() append(Discrete_interval *interval);
+  ulonglong minimum() const { return (head ? head->minimum() : 0); };
+  ulonglong maximum() const { return (head ? tail->maximum() : 0); };
+  uint nb_elements() const { return elements; }
+};
+void init_sql_alloc(MEM_ROOT *root, uint block_size, uint pre_alloc_size);
+void *sql_alloc(size_t);
+void *sql_calloc(size_t);
+char *sql_strdup(const char *str);
+char *sql_strmake(const char *str, size_t len);
+void *sql_memdup(const void * ptr, size_t size);
+void sql_element_free(void *ptr);
+char *sql_strmake_with_convert(const char *str, size_t arg_length,
+          CHARSET_INFO *from_cs,
+          size_t max_res_length,
+          CHARSET_INFO *to_cs, size_t *result_length);
+uint kill_one_thread(THD *thd, ulong id, In_C_you_should_use_my_bool_instead() only_kill_query);
+void sql_kill(THD *thd, ulong id, In_C_you_should_use_my_bool_instead() only_kill_query);
+In_C_you_should_use_my_bool_instead() net_request_file(NET* net, const char* fname);
+char* query_table_status(THD *thd,const char *db,const char *table_name);
+extern CHARSET_INFO *system_charset_info, *files_charset_info ;
+extern CHARSET_INFO *national_charset_info, *table_alias_charset;
+enum Derivation
+{
+  DERIVATION_IGNORABLE= 5,
+  DERIVATION_COERCIBLE= 4,
+  DERIVATION_SYSCONST= 3,
+  DERIVATION_IMPLICIT= 2,
+  DERIVATION_NONE= 1,
+  DERIVATION_EXPLICIT= 0
+};
+typedef struct my_locale_st
+{
+  uint number;
+  const char *name;
+  const char *description;
+  const In_C_you_should_use_my_bool_instead() is_ascii;
+  TYPELIB *month_names;
+  TYPELIB *ab_month_names;
+  TYPELIB *day_names;
+  TYPELIB *ab_day_names;
+} MY_LOCALE;
+extern MY_LOCALE my_locale_en_US;
+extern MY_LOCALE *my_locales[];
+extern MY_LOCALE *my_default_lc_time_names;
+MY_LOCALE *my_locale_by_name(const char *name);
+MY_LOCALE *my_locale_by_number(uint number);
+class Object_creation_ctx
+{
+public:
+  Object_creation_ctx *set_n_backup(THD *thd);
+  void restore_env(THD *thd, Object_creation_ctx *backup_ctx);
+protected:
+  Object_creation_ctx() {}
+  virtual Object_creation_ctx *create_backup_ctx(THD *thd) const = 0;
+  virtual void change_env(THD *thd) const = 0;
+public:
+  virtual ~Object_creation_ctx()
+  { }
+};
+class Default_object_creation_ctx : public Object_creation_ctx
+{
+public:
+  CHARSET_INFO *get_client_cs()
+  {
+    return m_client_cs;
+  }
+  CHARSET_INFO *get_connection_cl()
+  {
+    return m_connection_cl;
+  }
+protected:
+  Default_object_creation_ctx(THD *thd);
+  Default_object_creation_ctx(CHARSET_INFO *client_cs,
+                              CHARSET_INFO *connection_cl);
+protected:
+  virtual Object_creation_ctx *create_backup_ctx(THD *thd) const;
+  virtual void change_env(THD *thd) const;
+protected:
+  CHARSET_INFO *m_client_cs;
+  CHARSET_INFO *m_connection_cl;
+};
+struct TABLE_LIST;
+class String;
+void view_store_options(THD *thd, TABLE_LIST *table, String *buff);
+enum enum_parsing_place
+{
+  NO_MATTER,
+  IN_HAVING,
+  SELECT_LIST,
+  IN_WHERE,
+  IN_ON
+};
+struct st_table;
+class THD;
+enum enum_check_fields
+{
+  CHECK_FIELD_IGNORE,
+  CHECK_FIELD_WARN,
+  CHECK_FIELD_ERROR_FOR_NULL
+};
+typedef struct st_sql_list {
+  uint elements;
+  uchar *first;
+  uchar **next;
+  st_sql_list() {}
+  inline void empty()
+  {
+    elements=0;
+    first=0;
+    next= &first;
+  }
+  inline void link_in_list(uchar *element,uchar **next_ptr)
+  {
+    elements++;
+    (*next)=element;
+    next= next_ptr;
+    *next=0;
+  }
+  inline void save_and_clear(struct st_sql_list *save)
+  {
+    *save= *this;
+    empty();
+  }
+  inline void push_front(struct st_sql_list *save)
+  {
+    *save->next= first;
+    first= save->first;
+    elements+= save->elements;
+  }
+  inline void push_back(struct st_sql_list *save)
+  {
+    if (save->first)
+    {
+      *next= save->first;
+      next= save->next;
+      elements+= save->elements;
+    }
+  }
+} SQL_LIST;
+extern pthread_key_t THR_THD;
+inline THD *_current_thd(void)
+{
+  return ((THD*) pthread_getspecific((THR_THD)));
+}
+extern "C"
+const char *set_thd_proc_info(THD *thd, const char *info,
+                              const char *calling_func,
+                              const char *calling_file,
+                              const unsigned int calling_line);
+enum enum_table_ref_type
+{
+  TABLE_REF_NULL= 0,
+  TABLE_REF_VIEW,
+  TABLE_REF_BASE_TABLE,
+  TABLE_REF_I_S_TABLE,
+  TABLE_REF_TMP_TABLE
+};
+extern ulong server_id, concurrency;
+typedef my_bool (*qc_engine_callback)(THD *thd, char *table_key,
+                                      uint key_length,
+                                      ulonglong *engine_data);
+#include "sql_string.h"
+class String;
+int sortcmp(const String *a,const String *b, CHARSET_INFO *cs);
+String *copy_if_not_alloced(String *a,String *b,uint32 arg_length);
+uint32 copy_and_convert(char *to, uint32 to_length, CHARSET_INFO *to_cs,
+   const char *from, uint32 from_length,
+   CHARSET_INFO *from_cs, uint *errors);
+uint32 well_formed_copy_nchars(CHARSET_INFO *to_cs,
+                               char *to, uint to_length,
+                               CHARSET_INFO *from_cs,
+                               const char *from, uint from_length,
+                               uint nchars,
+                               const char **well_formed_error_pos,
+                               const char **cannot_convert_error_pos,
+                               const char **from_end_pos);
+size_t my_copy_with_hex_escaping(CHARSET_INFO *cs,
+                                 char *dst, size_t dstlen,
+                                 const char *src, size_t srclen);
+class String
+{
+  char *Ptr;
+  uint32 str_length,Alloced_length;
+  In_C_you_should_use_my_bool_instead() alloced;
+  CHARSET_INFO *str_charset;
+public:
+  String()
+  {
+    Ptr=0; str_length=Alloced_length=0; alloced=0;
+    str_charset= &my_charset_bin;
+  }
+  String(uint32 length_arg)
+  {
+    alloced=0; Alloced_length=0; (void) real_alloc(length_arg);
+    str_charset= &my_charset_bin;
+  }
+  String(const char *str, CHARSET_INFO *cs)
+  {
+    Ptr=(char*) str; str_length=(uint) strlen(str); Alloced_length=0; alloced=0;
+    str_charset=cs;
+  }
+  String(const char *str,uint32 len, CHARSET_INFO *cs)
+  {
+    Ptr=(char*) str; str_length=len; Alloced_length=0; alloced=0;
+    str_charset=cs;
+  }
+  String(char *str,uint32 len, CHARSET_INFO *cs)
+  {
+    Ptr=(char*) str; Alloced_length=str_length=len; alloced=0;
+    str_charset=cs;
+  }
+  String(const String &str)
+  {
+    Ptr=str.Ptr ; str_length=str.str_length ;
+    Alloced_length=str.Alloced_length; alloced=0;
+    str_charset=str.str_charset;
+  }
+  static void *operator new(size_t size, MEM_ROOT *mem_root)
+  { return (void*) alloc_root(mem_root, (uint) size); }
+  static void operator delete(void *ptr_arg,size_t size)
+  { ; }
+  static void operator delete(void *ptr_arg, MEM_ROOT *mem_root)
+  { }
+  ~String() { free(); }
+  inline void set_charset(CHARSET_INFO *charset_arg)
+  { str_charset= charset_arg; }
+  inline CHARSET_INFO *charset() const { return str_charset; }
+  inline uint32 length() const { return str_length;}
+  inline uint32 alloced_length() const { return Alloced_length;}
+  inline char& operator [] (uint32 i) const { return Ptr[i]; }
+  inline void length(uint32 len) { str_length=len ; }
+  inline In_C_you_should_use_my_bool_instead() is_empty() { return (str_length == 0); }
+  inline void mark_as_const() { Alloced_length= 0;}
+  inline const char *ptr() const { return Ptr; }
+  inline char *c_ptr()
+  {
+    if (!Ptr || Ptr[str_length])
+      (void) realloc(str_length);
+    return Ptr;
+  }
+  inline char *c_ptr_quick()
+  {
+    if (Ptr && str_length < Alloced_length)
+      Ptr[str_length]=0;
+    return Ptr;
+  }
+  inline char *c_ptr_safe()
+  {
+    if (Ptr && str_length < Alloced_length)
+      Ptr[str_length]=0;
+    else
+      (void) realloc(str_length);
+    return Ptr;
+  }
+  void set(String &str,uint32 offset,uint32 arg_length)
+  {
+    assert(&str != this);
+    free();
+    Ptr=(char*) str.ptr()+offset; str_length=arg_length; alloced=0;
+    if (str.Alloced_length)
+      Alloced_length=str.Alloced_length-offset;
+    else
+      Alloced_length=0;
+    str_charset=str.str_charset;
+  }
+  inline void set(char *str,uint32 arg_length, CHARSET_INFO *cs)
+  {
+    free();
+    Ptr=(char*) str; str_length=Alloced_length=arg_length ; alloced=0;
+    str_charset=cs;
+  }
+  inline void set(const char *str,uint32 arg_length, CHARSET_INFO *cs)
+  {
+    free();
+    Ptr=(char*) str; str_length=arg_length; Alloced_length=0 ; alloced=0;
+    str_charset=cs;
+  }
+  In_C_you_should_use_my_bool_instead() set_ascii(const char *str, uint32 arg_length);
+  inline void set_quick(char *str,uint32 arg_length, CHARSET_INFO *cs)
+  {
+    if (!alloced)
+    {
+      Ptr=(char*) str; str_length=Alloced_length=arg_length;
+    }
+    str_charset=cs;
+  }
+  In_C_you_should_use_my_bool_instead() set_int(longlong num, In_C_you_should_use_my_bool_instead() unsigned_flag, CHARSET_INFO *cs);
+  In_C_you_should_use_my_bool_instead() set(longlong num, CHARSET_INFO *cs)
+  { return set_int(num, false, cs); }
+  In_C_you_should_use_my_bool_instead() set(ulonglong num, CHARSET_INFO *cs)
+  { return set_int((longlong)num, true, cs); }
+  In_C_you_should_use_my_bool_instead() set_real(double num,uint decimals, CHARSET_INFO *cs);
+  inline void chop()
+  {
+    Ptr[str_length--]= '\0';
+  }
+  inline void free()
+  {
+    if (alloced)
+    {
+      alloced=0;
+      Alloced_length=0;
+      ((void)(myf) (0),my_no_flags_free(Ptr));
+      Ptr=0;
+      str_length=0;
+    }
+  }
+  inline In_C_you_should_use_my_bool_instead() alloc(uint32 arg_length)
+  {
+    if (arg_length < Alloced_length)
+      return 0;
+    return real_alloc(arg_length);
+  }
+  In_C_you_should_use_my_bool_instead() real_alloc(uint32 arg_length);
+  In_C_you_should_use_my_bool_instead() realloc(uint32 arg_length);
+  inline void shrink(uint32 arg_length)
+  {
+    if (arg_length < Alloced_length)
+    {
+      char *new_ptr;
+      if (!(new_ptr=(char*) my_realloc(Ptr,arg_length,(myf) (0))))
+      {
+ Alloced_length = 0;
+ real_alloc(arg_length);
+      }
+      else
+      {
+ Ptr=new_ptr;
+ Alloced_length=arg_length;
+      }
+    }
+  }
+  In_C_you_should_use_my_bool_instead() is_alloced() { return alloced; }
+  inline String& operator = (const String &s)
+  {
+    if (&s != this)
+    {
+      assert(!s.uses_buffer_owned_by(this));
+      free();
+      Ptr=s.Ptr ; str_length=s.str_length ; Alloced_length=s.Alloced_length;
+      alloced=0;
+    }
+    return *this;
+  }
+  In_C_you_should_use_my_bool_instead() copy();
+  In_C_you_should_use_my_bool_instead() copy(const String &s);
+  In_C_you_should_use_my_bool_instead() copy(const char *s,uint32 arg_length, CHARSET_INFO *cs);
+  static In_C_you_should_use_my_bool_instead() needs_conversion(uint32 arg_length,
+            CHARSET_INFO *cs_from, CHARSET_INFO *cs_to,
+          uint32 *offset);
+  In_C_you_should_use_my_bool_instead() copy_aligned(const char *s, uint32 arg_length, uint32 offset,
+      CHARSET_INFO *cs);
+  In_C_you_should_use_my_bool_instead() set_or_copy_aligned(const char *s, uint32 arg_length, CHARSET_INFO *cs);
+  In_C_you_should_use_my_bool_instead() copy(const char*s,uint32 arg_length, CHARSET_INFO *csfrom,
+     CHARSET_INFO *csto, uint *errors);
+  In_C_you_should_use_my_bool_instead() append(const String &s);
+  In_C_you_should_use_my_bool_instead() append(const char *s);
+  In_C_you_should_use_my_bool_instead() append(const char *s,uint32 arg_length);
+  In_C_you_should_use_my_bool_instead() append(const char *s,uint32 arg_length, CHARSET_INFO *cs);
+  In_C_you_should_use_my_bool_instead() append(IO_CACHE* file, uint32 arg_length);
+  In_C_you_should_use_my_bool_instead() append_with_prefill(const char *s, uint32 arg_length,
+      uint32 full_length, char fill_char);
+  int strstr(const String &search,uint32 offset=0);
+  int strrstr(const String &search,uint32 offset=0);
+  In_C_you_should_use_my_bool_instead() replace(uint32 offset,uint32 arg_length,const char *to,uint32 length);
+  In_C_you_should_use_my_bool_instead() replace(uint32 offset,uint32 arg_length,const String &to);
+  inline In_C_you_should_use_my_bool_instead() append(char chr)
+  {
+    if (str_length < Alloced_length)
+    {
+      Ptr[str_length++]=chr;
+    }
+    else
+    {
+      if (realloc(str_length+1))
+ return 1;
+      Ptr[str_length++]=chr;
+    }
+    return 0;
+  }
+  In_C_you_should_use_my_bool_instead() fill(uint32 max_length,char fill);
+  void strip_sp();
+  friend int sortcmp(const String *a,const String *b, CHARSET_INFO *cs);
+  friend int stringcmp(const String *a,const String *b);
+  friend String *copy_if_not_alloced(String *a,String *b,uint32 arg_length);
+  uint32 numchars();
+  int charpos(int i,uint32 offset=0);
+  int reserve(uint32 space_needed)
+  {
+    return realloc(str_length + space_needed);
+  }
+  int reserve(uint32 space_needed, uint32 grow_by);
+  void q_append(const char c)
+  {
+    Ptr[str_length++] = c;
+  }
+  void q_append(const uint32 n)
+  {
+    *((long *) (Ptr + str_length))= (long) (n);
+    str_length += 4;
+  }
+  void q_append(double d)
+  {
+    do { *((long *) (Ptr + str_length)) = ((doubleget_union *)&(d))->m[0]; *(((long *) (Ptr + str_length))+1) = ((doubleget_union *)&(d))->m[1]; } while (0);
+    str_length += 8;
+  }
+  void q_append(double *d)
+  {
+    do { *((long *) (Ptr + str_length)) = ((doubleget_union *)&(*d))->m[0]; *(((long *) (Ptr + str_length))+1) = ((doubleget_union *)&(*d))->m[1]; } while (0);
+    str_length += 8;
+  }
+  void q_append(const char *data, uint32 data_len)
+  {
+    memcpy(Ptr + str_length, data, data_len);
+    str_length += data_len;
+  }
+  void write_at_position(int position, uint32 value)
+  {
+    *((long *) (Ptr + position))= (long) (value);
+  }
+  void qs_append(const char *str, uint32 len);
+  void qs_append(double d);
+  void qs_append(double *d);
+  inline void qs_append(const char c)
+  {
+     Ptr[str_length]= c;
+     str_length++;
+  }
+  void qs_append(int i);
+  void qs_append(uint i);
+  inline char *prep_append(uint32 arg_length, uint32 step_alloc)
+  {
+    uint32 new_length= arg_length + str_length;
+    if (new_length > Alloced_length)
+    {
+      if (realloc(new_length + step_alloc))
+        return 0;
+    }
+    uint32 old_length= str_length;
+    str_length+= arg_length;
+    return Ptr+ old_length;
+  }
+  inline In_C_you_should_use_my_bool_instead() append(const char *s, uint32 arg_length, uint32 step_alloc)
+  {
+    uint32 new_length= arg_length + str_length;
+    if (new_length > Alloced_length && realloc(new_length + step_alloc))
+      return (1);
+    memcpy(Ptr+str_length, s, arg_length);
+    str_length+= arg_length;
+    return (0);
+  }
+  void print(String *print);
+  void swap(String &s);
+  inline In_C_you_should_use_my_bool_instead() uses_buffer_owned_by(const String *s) const
+  {
+    return (s->alloced && Ptr >= s->Ptr && Ptr < s->Ptr + s->str_length);
+  }
+};
+static inline In_C_you_should_use_my_bool_instead() check_if_only_end_space(CHARSET_INFO *cs, char *str,
+                                           char *end)
+{
+  return str+ cs->cset->scan(cs, str, end, 2) == end;
+}
+#include "sql_list.h"
+class Sql_alloc
+{
+public:
+  static void *operator new(size_t size) throw ()
+  {
+    return sql_alloc(size);
+  }
+  static void *operator new[](size_t size)
+  {
+    return sql_alloc(size);
+  }
+  static void *operator new[](size_t size, MEM_ROOT *mem_root) throw ()
+  { return alloc_root(mem_root, size); }
+  static void *operator new(size_t size, MEM_ROOT *mem_root) throw ()
+  { return alloc_root(mem_root, size); }
+  static void operator delete(void *ptr, size_t size) { ; }
+  static void operator delete(void *ptr, MEM_ROOT *mem_root)
+  { }
+  static void operator delete[](void *ptr, MEM_ROOT *mem_root)
+  { }
+  static void operator delete[](void *ptr, size_t size) { ; }
+  inline Sql_alloc() {}
+  inline ~Sql_alloc() {}
+};
+struct list_node :public Sql_alloc
+{
+  list_node *next;
+  void *info;
+  list_node(void *info_par,list_node *next_par)
+    :next(next_par),info(info_par)
+  {}
+  list_node()
+  {
+    info= 0;
+    next= this;
+  }
+};
+extern list_node end_of_list;
+class base_list :public Sql_alloc
+{
+protected:
+  list_node *first,**last;
+public:
+  uint elements;
+  inline void empty() { elements=0; first= &end_of_list; last=&first;}
+  inline base_list() { empty(); }
+  inline base_list(const base_list &tmp) :Sql_alloc()
+  {
+    elements= tmp.elements;
+    first= tmp.first;
+    last= elements ? tmp.last : &first;
+  }
+  base_list(const base_list &rhs, MEM_ROOT *mem_root);
+  inline base_list(In_C_you_should_use_my_bool_instead() error) { }
+  inline In_C_you_should_use_my_bool_instead() push_back(void *info)
+  {
+    if (((*last)=new list_node(info, &end_of_list)))
+    {
+      last= &(*last)->next;
+      elements++;
+      return 0;
+    }
+    return 1;
+  }
+  inline In_C_you_should_use_my_bool_instead() push_back(void *info, MEM_ROOT *mem_root)
+  {
+    if (((*last)=new (mem_root) list_node(info, &end_of_list)))
+    {
+      last= &(*last)->next;
+      elements++;
+      return 0;
+    }
+    return 1;
+  }
+  inline In_C_you_should_use_my_bool_instead() push_front(void *info)
+  {
+    list_node *node=new list_node(info,first);
+    if (node)
+    {
+      if (last == &first)
+ last= &node->next;
+      first=node;
+      elements++;
+      return 0;
+    }
+    return 1;
+  }
+  void remove(list_node **prev)
+  {
+    list_node *node=(*prev)->next;
+    if (!--elements)
+      last= &first;
+    else if (last == &(*prev)->next)
+      last= prev;
+    delete *prev;
+    *prev=node;
+  }
+  inline void concat(base_list *list)
+  {
+    if (!list->is_empty())
+    {
+      *last= list->first;
+      last= list->last;
+      elements+= list->elements;
+    }
+  }
+  inline void *pop(void)
+  {
+    if (first == &end_of_list) return 0;
+    list_node *tmp=first;
+    first=first->next;
+    if (!--elements)
+      last= &first;
+    return tmp->info;
+  }
+  inline void disjoin(base_list *list)
+  {
+    list_node **prev= &first;
+    list_node *node= first;
+    list_node *list_first= list->first;
+    elements=0;
+    while (node && node != list_first)
+    {
+      prev= &node->next;
+      node= node->next;
+      elements++;
+    }
+    *prev= *last;
+    last= prev;
+  }
+  inline void prepand(base_list *list)
+  {
+    if (!list->is_empty())
+    {
+      *list->last= first;
+      first= list->first;
+      elements+= list->elements;
+    }
+  }
+  inline void swap(base_list &rhs)
+  {
+    { list_node * dummy; dummy= first; first= rhs.first; rhs.first= dummy; };
+    { list_node ** dummy; dummy= last; last= rhs.last; rhs.last= dummy; };
+    { uint dummy; dummy= elements; elements= rhs.elements; rhs.elements= dummy; };
+  }
+  inline list_node* last_node() { return *last; }
+  inline list_node* first_node() { return first;}
+  inline void *head() { return first->info; }
+  inline void **head_ref() { return first != &end_of_list ? &first->info : 0; }
+  inline In_C_you_should_use_my_bool_instead() is_empty() { return first == &end_of_list ; }
+  inline list_node *last_ref() { return &end_of_list; }
+  friend class base_list_iterator;
+  friend class error_list;
+  friend class error_list_iterator;
+protected:
+  void after(void *info,list_node *node)
+  {
+    list_node *new_node=new list_node(info,node->next);
+    node->next=new_node;
+    elements++;
+    if (last == &(node->next))
+      last= &new_node->next;
+  }
+};
+class base_list_iterator
+{
+protected:
+  base_list *list;
+  list_node **el,**prev,*current;
+  void sublist(base_list &ls, uint elm)
+  {
+    ls.first= *el;
+    ls.last= list->last;
+    ls.elements= elm;
+  }
+public:
+  base_list_iterator()
+    :list(0), el(0), prev(0), current(0)
+  {}
+  base_list_iterator(base_list &list_par)
+  { init(list_par); }
+  inline void init(base_list &list_par)
+  {
+    list= &list_par;
+    el= &list_par.first;
+    prev= 0;
+    current= 0;
+  }
+  inline void *next(void)
+  {
+    prev=el;
+    current= *el;
+    el= &current->next;
+    return current->info;
+  }
+  inline void *next_fast(void)
+  {
+    list_node *tmp;
+    tmp= *el;
+    el= &tmp->next;
+    return tmp->info;
+  }
+  inline void rewind(void)
+  {
+    el= &list->first;
+  }
+  inline void *replace(void *element)
+  {
+    void *tmp=current->info;
+    assert(current->info != 0);
+    current->info=element;
+    return tmp;
+  }
+  void *replace(base_list &new_list)
+  {
+    void *ret_value=current->info;
+    if (!new_list.is_empty())
+    {
+      *new_list.last=current->next;
+      current->info=new_list.first->info;
+      current->next=new_list.first->next;
+      if ((list->last == &current->next) && (new_list.elements > 1))
+ list->last= new_list.last;
+      list->elements+=new_list.elements-1;
+    }
+    return ret_value;
+  }
+  inline void remove(void)
+  {
+    list->remove(prev);
+    el=prev;
+    current=0;
+  }
+  void after(void *element)
+  {
+    list->after(element,current);
+    current=current->next;
+    el= &current->next;
+  }
+  inline void **ref(void)
+  {
+    return &current->info;
+  }
+  inline In_C_you_should_use_my_bool_instead() is_last(void)
+  {
+    return el == &list->last_ref()->next;
+  }
+  friend class error_list_iterator;
+};
+template <class T> class List :public base_list
+{
+public:
+  inline List() :base_list() {}
+  inline List(const List<T> &tmp) :base_list(tmp) {}
+  inline List(const List<T> &tmp, MEM_ROOT *mem_root) :
+    base_list(tmp, mem_root) {}
+  inline In_C_you_should_use_my_bool_instead() push_back(T *a) { return base_list::push_back(a); }
+  inline In_C_you_should_use_my_bool_instead() push_back(T *a, MEM_ROOT *mem_root)
+  { return base_list::push_back(a, mem_root); }
+  inline In_C_you_should_use_my_bool_instead() push_front(T *a) { return base_list::push_front(a); }
+  inline T* head() {return (T*) base_list::head(); }
+  inline T** head_ref() {return (T**) base_list::head_ref(); }
+  inline T* pop() {return (T*) base_list::pop(); }
+  inline void concat(List<T> *list) { base_list::concat(list); }
+  inline void disjoin(List<T> *list) { base_list::disjoin(list); }
+  inline void prepand(List<T> *list) { base_list::prepand(list); }
+  void delete_elements(void)
+  {
+    list_node *element,*next;
+    for (element=first; element != &end_of_list; element=next)
+    {
+      next=element->next;
+      delete (T*) element->info;
+    }
+    empty();
+  }
+};
+template <class T> class List_iterator :public base_list_iterator
+{
+public:
+  List_iterator(List<T> &a) : base_list_iterator(a) {}
+  List_iterator() : base_list_iterator() {}
+  inline void init(List<T> &a) { base_list_iterator::init(a); }
+  inline T* operator++(int) { return (T*) base_list_iterator::next(); }
+  inline T *replace(T *a) { return (T*) base_list_iterator::replace(a); }
+  inline T *replace(List<T> &a) { return (T*) base_list_iterator::replace(a); }
+  inline void rewind(void) { base_list_iterator::rewind(); }
+  inline void remove() { base_list_iterator::remove(); }
+  inline void after(T *a) { base_list_iterator::after(a); }
+  inline T** ref(void) { return (T**) base_list_iterator::ref(); }
+};
+template <class T> class List_iterator_fast :public base_list_iterator
+{
+protected:
+  inline T *replace(T *a) { return (T*) 0; }
+  inline T *replace(List<T> &a) { return (T*) 0; }
+  inline void remove(void) { }
+  inline void after(T *a) { }
+  inline T** ref(void) { return (T**) 0; }
+public:
+  inline List_iterator_fast(List<T> &a) : base_list_iterator(a) {}
+  inline List_iterator_fast() : base_list_iterator() {}
+  inline void init(List<T> &a) { base_list_iterator::init(a); }
+  inline T* operator++(int) { return (T*) base_list_iterator::next_fast(); }
+  inline void rewind(void) { base_list_iterator::rewind(); }
+  void sublist(List<T> &list_arg, uint el_arg)
+  {
+    base_list_iterator::sublist(list_arg, el_arg);
+  }
+};
+struct ilink
+{
+  struct ilink **prev,*next;
+  static void *operator new(size_t size)
+  {
+    return (void*)my_malloc((uint)size, (myf) (16 | 8));
+  }
+  static void operator delete(void* ptr_arg, size_t size)
+  {
+     ((void)(myf) (16|64),my_no_flags_free((uchar*)ptr_arg));
+  }
+  inline ilink()
+  {
+    prev=0; next=0;
+  }
+  inline void unlink()
+  {
+    if (prev) *prev= next;
+    if (next) next->prev=prev;
+    prev=0 ; next=0;
+  }
+  virtual ~ilink() { unlink(); }
+};
+class i_string: public ilink
+{
+public:
+  const char* ptr;
+  i_string():ptr(0) { }
+  i_string(const char* s) : ptr(s) {}
+};
+class i_string_pair: public ilink
+{
+public:
+  const char* key;
+  const char* val;
+  i_string_pair():key(0),val(0) { }
+  i_string_pair(const char* key_arg, const char* val_arg) :
+    key(key_arg),val(val_arg) {}
+};
+template <class T> class I_List_iterator;
+class base_ilist
+{
+public:
+  struct ilink *first,last;
+  inline void empty() { first= &last; last.prev= &first; }
+  base_ilist() { empty(); }
+  inline In_C_you_should_use_my_bool_instead() is_empty() { return first == &last; }
+  inline void append(ilink *a)
+  {
+    first->prev= &a->next;
+    a->next=first; a->prev= &first; first=a;
+  }
+  inline void push_back(ilink *a)
+  {
+    *last.prev= a;
+    a->next= &last;
+    a->prev= last.prev;
+    last.prev= &a->next;
+  }
+  inline struct ilink *get()
+  {
+    struct ilink *first_link=first;
+    if (first_link == &last)
+      return 0;
+    first_link->unlink();
+    return first_link;
+  }
+  inline struct ilink *head()
+  {
+    return (first != &last) ? first : 0;
+  }
+  friend class base_list_iterator;
+};
+class base_ilist_iterator
+{
+  base_ilist *list;
+  struct ilink **el,*current;
+public:
+  base_ilist_iterator(base_ilist &list_par) :list(&list_par),
+    el(&list_par.first),current(0) {}
+  void *next(void)
+  {
+    current= *el;
+    if (current == &list->last) return 0;
+    el= &current->next;
+    return current;
+  }
+};
+template <class T>
+class I_List :private base_ilist
+{
+public:
+  I_List() :base_ilist() {}
+  inline void empty() { base_ilist::empty(); }
+  inline In_C_you_should_use_my_bool_instead() is_empty() { return base_ilist::is_empty(); }
+  inline void append(T* a) { base_ilist::append(a); }
+  inline void push_back(T* a) { base_ilist::push_back(a); }
+  inline T* get() { return (T*) base_ilist::get(); }
+  inline T* head() { return (T*) base_ilist::head(); }
+  friend class I_List_iterator<T>;
+};
+template <class T> class I_List_iterator :public base_ilist_iterator
+{
+public:
+  I_List_iterator(I_List<T> &a) : base_ilist_iterator(a) {}
+  inline T* operator++(int) { return (T*) base_ilist_iterator::next(); }
+};
+template <typename T>
+inline
+void
+list_copy_and_replace_each_value(List<T> &list, MEM_ROOT *mem_root)
+{
+  List_iterator<T> it(list);
+  T *el;
+  while ((el= it++))
+    it.replace(el->clone(mem_root));
+}
+#include "sql_map.h"
+class mapped_files;
+mapped_files *map_file(const char * name,uchar *magic,uint magic_length);
+void unmap_file(mapped_files *map);
+class mapped_files :public ilink {
+  uchar *map;
+  ha_rows size;
+  char *name;
+  File file;
+  int error;
+  uint use_count;
+public:
+  mapped_files(const char * name,uchar *magic,uint magic_length);
+  ~mapped_files();
+  friend class mapped_file;
+  friend mapped_files *map_file(const char * name,uchar *magic,
+    uint magic_length);
+  friend void unmap_file(mapped_files *map);
+};
+class mapped_file
+{
+  mapped_files *file;
+public:
+  mapped_file(const char * name,uchar *magic,uint magic_length)
+  {
+    file=map_file(name,magic,magic_length);
+  }
+  ~mapped_file()
+  {
+    unmap_file(file);
+  }
+  uchar *map()
+  {
+    return file->map;
+  }
+};
+#include "my_decimal.h"
+#include <decimal.h>
+typedef enum
+{TRUNCATE=0, HALF_EVEN, HALF_UP, CEILING, FLOOR}
+  decimal_round_mode;
+typedef int32 decimal_digit_t;
+typedef struct st_decimal_t {
+  int intg, frac, len;
+  my_bool sign;
+  decimal_digit_t *buf;
+} decimal_t;
+int internal_str2dec(const char *from, decimal_t *to, char **end,
+                     my_bool fixed);
+int decimal2string(decimal_t *from, char *to, int *to_len,
+                   int fixed_precision, int fixed_decimals,
+                   char filler);
+int decimal2ulonglong(decimal_t *from, ulonglong *to);
+int ulonglong2decimal(ulonglong from, decimal_t *to);
+int decimal2longlong(decimal_t *from, longlong *to);
+int longlong2decimal(longlong from, decimal_t *to);
+int decimal2double(decimal_t *from, double *to);
+int double2decimal(double from, decimal_t *to);
+int decimal_actual_fraction(decimal_t *from);
+int decimal2bin(decimal_t *from, uchar *to, int precision, int scale);
+int bin2decimal(const uchar *from, decimal_t *to, int precision, int scale);
+int decimal_size(int precision, int scale);
+int decimal_bin_size(int precision, int scale);
+int decimal_result_size(decimal_t *from1, decimal_t *from2, char op,
+                        int param);
+int decimal_intg(decimal_t *from);
+int decimal_add(decimal_t *from1, decimal_t *from2, decimal_t *to);
+int decimal_sub(decimal_t *from1, decimal_t *from2, decimal_t *to);
+int decimal_cmp(decimal_t *from1, decimal_t *from2);
+int decimal_mul(decimal_t *from1, decimal_t *from2, decimal_t *to);
+int decimal_div(decimal_t *from1, decimal_t *from2, decimal_t *to,
+                int scale_incr);
+int decimal_mod(decimal_t *from1, decimal_t *from2, decimal_t *to);
+int decimal_round(decimal_t *from, decimal_t *to, int new_scale,
+                  decimal_round_mode mode);
+int decimal_is_zero(decimal_t *from);
+void max_decimal(int precision, int frac, decimal_t *to);
+inline uint my_decimal_size(uint precision, uint scale)
+{
+  return decimal_size(precision, scale) + 1;
+}
+inline int my_decimal_int_part(uint precision, uint decimals)
+{
+  return precision - ((decimals == 31) ? 0 : decimals);
+}
+class my_decimal :public decimal_t
+{
+  decimal_digit_t buffer[9];
+public:
+  void init()
+  {
+    len= 9;
+    buf= buffer;
+    for (uint i= 0; i < 9; i++)
+      buffer[i]= i;
+  }
+  my_decimal()
+  {
+    init();
+  }
+  void fix_buffer_pointer() { buf= buffer; }
+  In_C_you_should_use_my_bool_instead() sign() const { return decimal_t::sign; }
+  void sign(In_C_you_should_use_my_bool_instead() s) { decimal_t::sign= s; }
+  uint precision() const { return intg + frac; }
+  void swap(my_decimal &rhs)
+  {
+    { my_decimal dummy; dummy= *this; *this= rhs; rhs= dummy; };
+    { decimal_digit_t * dummy; dummy= buf; buf= rhs.buf; rhs.buf= dummy; };
+  }
+};
+void print_decimal(const my_decimal *dec);
+void print_decimal_buff(const my_decimal *dec, const uchar* ptr, int length);
+const char *dbug_decimal_as_string(char *buff, const my_decimal *val);
+int decimal_operation_results(int result);
+inline
+void max_my_decimal(my_decimal *to, int precision, int frac)
+{
+  assert((precision <= ((9 * 9) - 8*2))&& (frac <= 30));
+  max_decimal(precision, frac, (decimal_t*) to);
+}
+inline void max_internal_decimal(my_decimal *to)
+{
+  max_my_decimal(to, ((9 * 9) - 8*2), 0);
+}
+inline int check_result(uint mask, int result)
+{
+  if (result & mask)
+    decimal_operation_results(result);
+  return result;
+}
+inline int check_result_and_overflow(uint mask, int result, my_decimal *val)
+{
+  if (check_result(mask, result) & 2)
+  {
+    In_C_you_should_use_my_bool_instead() sign= val->sign();
+    val->fix_buffer_pointer();
+    max_internal_decimal(val);
+    val->sign(sign);
+  }
+  return result;
+}
+inline uint my_decimal_length_to_precision(uint length, uint scale,
+                                           In_C_you_should_use_my_bool_instead() unsigned_flag)
+{
+  assert(length || !scale);
+  return (uint) (length - (scale>0 ? 1:0) -
+                 (unsigned_flag || !length ? 0:1));
+}
+inline uint32 my_decimal_precision_to_length(uint precision, uint8 scale,
+                                             In_C_you_should_use_my_bool_instead() unsigned_flag)
+{
+  assert(precision || !scale);
+  do { if ((precision) > (((9 * 9) - 8*2))) (precision)=(((9 * 9) - 8*2)); } while(0);
+  return (uint32)(precision + (scale>0 ? 1:0) +
+                  (unsigned_flag || !precision ? 0:1));
+}
+inline
+int my_decimal_string_length(const my_decimal *d)
+{
+  return (((d)->intg ? (d)->intg : 1) + (d)->frac + ((d)->frac > 0) + 2);
+}
+inline
+int my_decimal_max_length(const my_decimal *d)
+{
+  return (((d)->intg ? (d)->intg : 1) + (d)->frac + ((d)->frac > 0) + 2) - 1;
+}
+inline
+int my_decimal_get_binary_size(uint precision, uint scale)
+{
+  return decimal_bin_size((int)precision, (int)scale);
+}
+inline
+void my_decimal2decimal(const my_decimal *from, my_decimal *to)
+{
+  *to= *from;
+  to->fix_buffer_pointer();
+}
+int my_decimal2binary(uint mask, const my_decimal *d, uchar *bin, int prec,
+        int scale);
+inline
+int binary2my_decimal(uint mask, const uchar *bin, my_decimal *d, int prec,
+        int scale)
+{
+  return check_result(mask, bin2decimal(bin, (decimal_t*) d, prec, scale));
+}
+inline
+int my_decimal_set_zero(my_decimal *d)
+{
+  do { (((decimal_t*) d))->buf[0]=0; (((decimal_t*) d))->intg=1; (((decimal_t*) d))->frac=0; (((decimal_t*) d))->sign=0; } while(0);
+  return 0;
+}
+inline
+In_C_you_should_use_my_bool_instead() my_decimal_is_zero(const my_decimal *decimal_value)
+{
+  return decimal_is_zero((decimal_t*) decimal_value);
+}
+inline
+int my_decimal_round(uint mask, const my_decimal *from, int scale,
+                     In_C_you_should_use_my_bool_instead() truncate, my_decimal *to)
+{
+  return check_result(mask, decimal_round((decimal_t*) from, to, scale,
+       (truncate ? TRUNCATE : HALF_UP)));
+}
+inline
+int my_decimal_floor(uint mask, const my_decimal *from, my_decimal *to)
+{
+  return check_result(mask, decimal_round((decimal_t*) from, to, 0, FLOOR));
+}
+inline
+int my_decimal_ceiling(uint mask, const my_decimal *from, my_decimal *to)
+{
+  return check_result(mask, decimal_round((decimal_t*) from, to, 0, CEILING));
+}
+int my_decimal2string(uint mask, const my_decimal *d, uint fixed_prec,
+        uint fixed_dec, char filler, String *str);
+inline
+int my_decimal2int(uint mask, const my_decimal *d, my_bool unsigned_flag,
+     longlong *l)
+{
+  my_decimal rounded;
+  decimal_round((decimal_t*)d, &rounded, 0, HALF_UP);
+  return check_result(mask, (unsigned_flag ?
+        decimal2ulonglong(&rounded, (ulonglong *)l) :
+        decimal2longlong(&rounded, l)));
+}
+inline
+int my_decimal2double(uint mask, const my_decimal *d, double *result)
+{
+  return decimal2double((decimal_t*) d, result);
+}
+inline
+int str2my_decimal(uint mask, const char *str, my_decimal *d, char **end)
+{
+  return check_result_and_overflow(mask, internal_str2dec((str), ((decimal_t*)d), (end), 0),
+                                   d);
+}
+int str2my_decimal(uint mask, const char *from, uint length,
+                   CHARSET_INFO *charset, my_decimal *decimal_value);
+inline
+int double2my_decimal(uint mask, double val, my_decimal *d)
+{
+  return check_result_and_overflow(mask, double2decimal(val, (decimal_t*)d), d);
+}
+inline
+int int2my_decimal(uint mask, longlong i, my_bool unsigned_flag, my_decimal *d)
+{
+  return check_result(mask, (unsigned_flag ?
+        ulonglong2decimal((ulonglong)i, d) :
+        longlong2decimal(i, d)));
+}
+inline
+void my_decimal_neg(decimal_t *arg)
+{
+  if (decimal_is_zero(arg))
+  {
+    arg->sign= 0;
+    return;
+  }
+  do { (arg)->sign^=1; } while(0);
+}
+inline
+int my_decimal_add(uint mask, my_decimal *res, const my_decimal *a,
+     const my_decimal *b)
+{
+  return check_result_and_overflow(mask,
+                                   decimal_add((decimal_t*)a,(decimal_t*)b,res),
+                                   res);
+}
+inline
+int my_decimal_sub(uint mask, my_decimal *res, const my_decimal *a,
+     const my_decimal *b)
+{
+  return check_result_and_overflow(mask,
+                                   decimal_sub((decimal_t*)a,(decimal_t*)b,res),
+                                   res);
+}
+inline
+int my_decimal_mul(uint mask, my_decimal *res, const my_decimal *a,
+     const my_decimal *b)
+{
+  return check_result_and_overflow(mask,
+                                   decimal_mul((decimal_t*)a,(decimal_t*)b,res),
+                                   res);
+}
+inline
+int my_decimal_div(uint mask, my_decimal *res, const my_decimal *a,
+     const my_decimal *b, int div_scale_inc)
+{
+  return check_result_and_overflow(mask,
+                                   decimal_div((decimal_t*)a,(decimal_t*)b,res,
+                                               div_scale_inc),
+                                   res);
+}
+inline
+int my_decimal_mod(uint mask, my_decimal *res, const my_decimal *a,
+     const my_decimal *b)
+{
+  return check_result_and_overflow(mask,
+                                   decimal_mod((decimal_t*)a,(decimal_t*)b,res),
+                                   res);
+}
+inline
+int my_decimal_cmp(const my_decimal *a, const my_decimal *b)
+{
+  return decimal_cmp((decimal_t*) a, (decimal_t*) b);
+}
+inline
+int my_decimal_intg(const my_decimal *a)
+{
+  return decimal_intg((decimal_t*) a);
+}
+void my_decimal_trim(ulong *precision, uint *scale);
+#include "handler.h"
+#include <my_handler.h>
+#include "myisampack.h"
+typedef struct st_HA_KEYSEG
+{
+  CHARSET_INFO *charset;
+  uint32 start;
+  uint32 null_pos;
+  uint16 bit_pos;
+  uint16 flag;
+  uint16 length;
+  uint8 type;
+  uint8 language;
+  uint8 null_bit;
+  uint8 bit_start,bit_end;
+  uint8 bit_length;
+} HA_KEYSEG;
+extern int ha_compare_text(CHARSET_INFO *, uchar *, uint, uchar *, uint ,
+      my_bool, my_bool);
+extern int ha_key_cmp(register HA_KEYSEG *keyseg, register uchar *a,
+        register uchar *b, uint key_length, uint nextflag,
+        uint *diff_pos);
+extern HA_KEYSEG *ha_find_null(HA_KEYSEG *keyseg, uchar *a);
+extern void my_handler_error_register(void);
+extern void my_handler_error_unregister(void);
+#include <ft_global.h>
+typedef struct st_ft_info FT_INFO;
+struct _ft_vft
+{
+  int (*read_next)(FT_INFO *, char *);
+  float (*find_relevance)(FT_INFO *, uchar *, uint);
+  void (*close_search)(FT_INFO *);
+  float (*get_relevance)(FT_INFO *);
+  void (*reinit_search)(FT_INFO *);
+};
+struct st_ft_info
+{
+  struct _ft_vft *please;
+};
+extern const char *ft_stopword_file;
+extern const char *ft_precompiled_stopwords[];
+extern ulong ft_min_word_len;
+extern ulong ft_max_word_len;
+extern ulong ft_query_expansion_limit;
+extern char ft_boolean_syntax[15];
+extern struct st_mysql_ftparser ft_default_parser;
+int ft_init_stopwords(void);
+void ft_free_stopwords(void);
+FT_INFO *ft_init_search(uint,void *, uint, uchar *, uint,CHARSET_INFO *, uchar *);
+my_bool ft_boolean_check_syntax_string(const uchar *);
+#include <keycache.h>
+struct st_block_link;
+typedef struct st_block_link BLOCK_LINK;
+struct st_keycache_page;
+typedef struct st_keycache_page KEYCACHE_PAGE;
+struct st_hash_link;
+typedef struct st_hash_link HASH_LINK;
+typedef struct st_keycache_wqueue
+{
+  struct st_my_thread_var *last_thread;
+} KEYCACHE_WQUEUE;
+typedef struct st_key_cache
+{
+  my_bool key_cache_inited;
+  my_bool in_resize;
+  my_bool resize_in_flush;
+  my_bool can_be_used;
+  size_t key_cache_mem_size;
+  uint key_cache_block_size;
+  ulong min_warm_blocks;
+  ulong age_threshold;
+  ulonglong keycache_time;
+  uint hash_entries;
+  int hash_links;
+  int hash_links_used;
+  int disk_blocks;
+  ulong blocks_used;
+  ulong blocks_unused;
+  ulong blocks_changed;
+  ulong warm_blocks;
+  ulong cnt_for_resize_op;
+  long blocks_available;
+  HASH_LINK **hash_root;
+  HASH_LINK *hash_link_root;
+  HASH_LINK *free_hash_list;
+  BLOCK_LINK *free_block_list;
+  BLOCK_LINK *block_root;
+  uchar *block_mem;
+  BLOCK_LINK *used_last;
+  BLOCK_LINK *used_ins;
+  pthread_mutex_t cache_lock;
+  KEYCACHE_WQUEUE resize_queue;
+  KEYCACHE_WQUEUE waiting_for_resize_cnt;
+  KEYCACHE_WQUEUE waiting_for_hash_link;
+  KEYCACHE_WQUEUE waiting_for_block;
+  BLOCK_LINK *changed_blocks[128];
+  BLOCK_LINK *file_blocks[128];
+  ulonglong param_buff_size;
+  ulong param_block_size;
+  ulong param_division_limit;
+  ulong param_age_threshold;
+  ulong global_blocks_changed;
+  ulonglong global_cache_w_requests;
+  ulonglong global_cache_write;
+  ulonglong global_cache_r_requests;
+  ulonglong global_cache_read;
+  int blocks;
+  my_bool in_init;
+} KEY_CACHE;
+extern KEY_CACHE dflt_key_cache_var, *dflt_key_cache;
+extern int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
+     size_t use_mem, uint division_limit,
+     uint age_threshold);
+extern int resize_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
+       size_t use_mem, uint division_limit,
+       uint age_threshold);
+extern void change_key_cache_param(KEY_CACHE *keycache, uint division_limit,
+       uint age_threshold);
+extern uchar *key_cache_read(KEY_CACHE *keycache,
+                            File file, my_off_t filepos, int level,
+                            uchar *buff, uint length,
+       uint block_length,int return_buffer);
+extern int key_cache_insert(KEY_CACHE *keycache,
+                            File file, my_off_t filepos, int level,
+                            uchar *buff, uint length);
+extern int key_cache_write(KEY_CACHE *keycache,
+                           File file, my_off_t filepos, int level,
+                           uchar *buff, uint length,
+      uint block_length,int force_write);
+extern int flush_key_blocks(KEY_CACHE *keycache,
+                            int file, enum flush_type type);
+extern void end_key_cache(KEY_CACHE *keycache, my_bool cleanup);
+extern my_bool multi_keycache_init(void);
+extern void multi_keycache_free(void);
+extern KEY_CACHE *multi_key_cache_search(uchar *key, uint length);
+extern my_bool multi_key_cache_set(const uchar *key, uint length,
+       KEY_CACHE *key_cache);
+extern void multi_key_cache_change(KEY_CACHE *old_data,
+       KEY_CACHE *new_data);
+extern int reset_key_cache_counters(const char *name,
+                                    KEY_CACHE *key_cache);
+enum legacy_db_type
+{
+  DB_TYPE_UNKNOWN=0,DB_TYPE_DIAB_ISAM=1,
+  DB_TYPE_HASH,DB_TYPE_MISAM,DB_TYPE_PISAM,
+  DB_TYPE_RMS_ISAM, DB_TYPE_HEAP, DB_TYPE_ISAM,
+  DB_TYPE_MRG_ISAM, DB_TYPE_MYISAM, DB_TYPE_MRG_MYISAM,
+  DB_TYPE_BERKELEY_DB, DB_TYPE_INNODB,
+  DB_TYPE_GEMINI, DB_TYPE_NDBCLUSTER,
+  DB_TYPE_EXAMPLE_DB, DB_TYPE_ARCHIVE_DB, DB_TYPE_CSV_DB,
+  DB_TYPE_FEDERATED_DB,
+  DB_TYPE_BLACKHOLE_DB,
+  DB_TYPE_PARTITION_DB,
+  DB_TYPE_BINLOG,
+  DB_TYPE_SOLID,
+  DB_TYPE_PBXT,
+  DB_TYPE_TABLE_FUNCTION,
+  DB_TYPE_MEMCACHE,
+  DB_TYPE_FALCON,
+  DB_TYPE_MARIA,
+  DB_TYPE_FIRST_DYNAMIC=42,
+  DB_TYPE_DEFAULT=127
+};
+enum row_type { ROW_TYPE_NOT_USED=-1, ROW_TYPE_DEFAULT, ROW_TYPE_FIXED,
+  ROW_TYPE_DYNAMIC, ROW_TYPE_COMPRESSED,
+  ROW_TYPE_REDUNDANT, ROW_TYPE_COMPACT, ROW_TYPE_PAGE };
+enum enum_binlog_func {
+  BFN_RESET_LOGS= 1,
+  BFN_RESET_SLAVE= 2,
+  BFN_BINLOG_WAIT= 3,
+  BFN_BINLOG_END= 4,
+  BFN_BINLOG_PURGE_FILE= 5
+};
+enum enum_binlog_command {
+  LOGCOM_CREATE_TABLE,
+  LOGCOM_ALTER_TABLE,
+  LOGCOM_RENAME_TABLE,
+  LOGCOM_DROP_TABLE,
+  LOGCOM_CREATE_DB,
+  LOGCOM_ALTER_DB,
+  LOGCOM_DROP_DB
+};
+typedef ulonglong my_xid;
+struct xid_t {
+  long formatID;
+  long gtrid_length;
+  long bqual_length;
+  char data[128];
+  xid_t() {}
+  In_C_you_should_use_my_bool_instead() eq(struct xid_t *xid)
+  { return eq(xid->gtrid_length, xid->bqual_length, xid->data); }
+  In_C_you_should_use_my_bool_instead() eq(long g, long b, const char *d)
+  { return g == gtrid_length && b == bqual_length && !memcmp(d, data, g+b); }
+  void set(struct xid_t *xid)
+  { memcpy(this, xid, xid->length()); }
+  void set(long f, const char *g, long gl, const char *b, long bl)
+  {
+    formatID= f;
+    memcpy(data, g, gtrid_length= gl);
+    memcpy(data+gl, b, bqual_length= bl);
+  }
+  void set(ulonglong xid)
+  {
+    my_xid tmp;
+    formatID= 1;
+    set(8, 0, "MySQLXid");
+    memcpy(data+8, &server_id, sizeof(server_id));
+    tmp= xid;
+    memcpy(data+(8 +sizeof(server_id)), &tmp, sizeof(tmp));
+    gtrid_length=((8 +sizeof(server_id))+sizeof(my_xid));
+  }
+  void set(long g, long b, const char *d)
+  {
+    formatID= 1;
+    gtrid_length= g;
+    bqual_length= b;
+    memcpy(data, d, g+b);
+  }
+  In_C_you_should_use_my_bool_instead() is_null() { return formatID == -1; }
+  void null() { formatID= -1; }
+  my_xid quick_get_my_xid()
+  {
+    my_xid tmp;
+    memcpy(&tmp, data+(8 +sizeof(server_id)), sizeof(tmp));
+    return tmp;
+  }
+  my_xid get_my_xid()
+  {
+    return gtrid_length == ((8 +sizeof(server_id))+sizeof(my_xid)) && bqual_length == 0 &&
+           !memcmp(data+8, &server_id, sizeof(server_id)) &&
+           !memcmp(data, "MySQLXid", 8) ?
+           quick_get_my_xid() : 0;
+  }
+  uint length()
+  {
+    return sizeof(formatID)+sizeof(gtrid_length)+sizeof(bqual_length)+
+           gtrid_length+bqual_length;
+  }
+  uchar *key()
+  {
+    return (uchar *)&gtrid_length;
+  }
+  uint key_length()
+  {
+    return sizeof(gtrid_length)+sizeof(bqual_length)+gtrid_length+bqual_length;
+  }
+};
+typedef struct xid_t XID;
+enum ts_command_type
+{
+  TS_CMD_NOT_DEFINED = -1,
+  CREATE_TABLESPACE = 0,
+  ALTER_TABLESPACE = 1,
+  CREATE_LOGFILE_GROUP = 2,
+  ALTER_LOGFILE_GROUP = 3,
+  DROP_TABLESPACE = 4,
+  DROP_LOGFILE_GROUP = 5,
+  CHANGE_FILE_TABLESPACE = 6,
+  ALTER_ACCESS_MODE_TABLESPACE = 7
+};
+enum ts_alter_tablespace_type
+{
+  TS_ALTER_TABLESPACE_TYPE_NOT_DEFINED = -1,
+  ALTER_TABLESPACE_ADD_FILE = 1,
+  ALTER_TABLESPACE_DROP_FILE = 2
+};
+enum tablespace_access_mode
+{
+  TS_NOT_DEFINED= -1,
+  TS_READ_ONLY = 0,
+  TS_READ_WRITE = 1,
+  TS_NOT_ACCESSIBLE = 2
+};
+struct handlerton;
+class st_alter_tablespace : public Sql_alloc
+{
+  public:
+  const char *tablespace_name;
+  const char *logfile_group_name;
+  enum ts_command_type ts_cmd_type;
+  enum ts_alter_tablespace_type ts_alter_tablespace_type;
+  const char *data_file_name;
+  const char *undo_file_name;
+  const char *redo_file_name;
+  ulonglong extent_size;
+  ulonglong undo_buffer_size;
+  ulonglong redo_buffer_size;
+  ulonglong initial_size;
+  ulonglong autoextend_size;
+  ulonglong max_size;
+  uint nodegroup_id;
+  handlerton *storage_engine;
+  In_C_you_should_use_my_bool_instead() wait_until_completed;
+  const char *ts_comment;
+  enum tablespace_access_mode ts_access_mode;
+  st_alter_tablespace()
+  {
+    tablespace_name= NULL;
+    logfile_group_name= "DEFAULT_LG";
+    ts_cmd_type= TS_CMD_NOT_DEFINED;
+    data_file_name= NULL;
+    undo_file_name= NULL;
+    redo_file_name= NULL;
+    extent_size= 1024*1024;
+    undo_buffer_size= 8*1024*1024;
+    redo_buffer_size= 8*1024*1024;
+    initial_size= 128*1024*1024;
+    autoextend_size= 0;
+    max_size= 0;
+    storage_engine= NULL;
+    nodegroup_id= 65535;
+    wait_until_completed= (1);
+    ts_comment= NULL;
+    ts_access_mode= TS_NOT_DEFINED;
+  }
+};
+struct st_table;
+typedef struct st_table TABLE;
+typedef struct st_table_share TABLE_SHARE;
+struct st_foreign_key_info;
+typedef struct st_foreign_key_info FOREIGN_KEY_INFO;
+typedef In_C_you_should_use_my_bool_instead() (stat_print_fn)(THD *thd, const char *type, uint type_len,
+                             const char *file, uint file_len,
+                             const char *status, uint status_len);
+enum ha_stat_type { HA_ENGINE_STATUS, HA_ENGINE_LOGS, HA_ENGINE_MUTEX };
+extern st_plugin_int *hton2plugin[15];
+enum log_status
+{
+  HA_LOG_STATUS_FREE= 0,
+  HA_LOG_STATUS_INUSE= 1,
+  HA_LOG_STATUS_NOSUCHLOG= 2
+};
+void signal_log_not_needed(struct handlerton, char *log_file);
+struct handler_log_file_data {
+  LEX_STRING filename;
+  enum log_status status;
+};
+enum handler_iterator_type
+{
+  HA_TRANSACTLOG_ITERATOR= 1
+};
+enum handler_create_iterator_result
+{
+  HA_ITERATOR_OK,
+  HA_ITERATOR_UNSUPPORTED,
+  HA_ITERATOR_ERROR
+};
+struct handler_iterator {
+  int (*next)(struct handler_iterator *, void *iterator_object);
+  void (*destroy)(struct handler_iterator *);
+  void *buffer;
+};
+struct handlerton
+{
+  SHOW_COMP_OPTION state;
+  enum legacy_db_type db_type;
+   uint slot;
+   uint savepoint_offset;
+   int (*close_connection)(handlerton *hton, THD *thd);
+   int (*savepoint_set)(handlerton *hton, THD *thd, void *sv);
+   int (*savepoint_rollback)(handlerton *hton, THD *thd, void *sv);
+   int (*savepoint_release)(handlerton *hton, THD *thd, void *sv);
+   int (*commit)(handlerton *hton, THD *thd, In_C_you_should_use_my_bool_instead() all);
+   int (*rollback)(handlerton *hton, THD *thd, In_C_you_should_use_my_bool_instead() all);
+   int (*prepare)(handlerton *hton, THD *thd, In_C_you_should_use_my_bool_instead() all);
+   int (*recover)(handlerton *hton, XID *xid_list, uint len);
+   int (*commit_by_xid)(handlerton *hton, XID *xid);
+   int (*rollback_by_xid)(handlerton *hton, XID *xid);
+   void *(*create_cursor_read_view)(handlerton *hton, THD *thd);
+   void (*set_cursor_read_view)(handlerton *hton, THD *thd, void *read_view);
+   void (*close_cursor_read_view)(handlerton *hton, THD *thd, void *read_view);
+   handler *(*create)(handlerton *hton, TABLE_SHARE *table, MEM_ROOT *mem_root);
+   void (*drop_database)(handlerton *hton, char* path);
+   int (*panic)(handlerton *hton, enum ha_panic_function flag);
+   int (*start_consistent_snapshot)(handlerton *hton, THD *thd);
+   In_C_you_should_use_my_bool_instead() (*flush_logs)(handlerton *hton);
+   In_C_you_should_use_my_bool_instead() (*show_status)(handlerton *hton, THD *thd, stat_print_fn *print, enum ha_stat_type stat);
+   uint (*partition_flags)();
+   uint (*alter_table_flags)(uint flags);
+   int (*alter_tablespace)(handlerton *hton, THD *thd, st_alter_tablespace *ts_info);
+   int (*fill_files_table)(handlerton *hton, THD *thd,
+                           TABLE_LIST *tables,
+                           class Item *cond);
+   uint32 flags;
+   int (*binlog_func)(handlerton *hton, THD *thd, enum_binlog_func fn, void *arg);
+   void (*binlog_log_query)(handlerton *hton, THD *thd,
+                            enum_binlog_command binlog_command,
+                            const char *query, uint query_length,
+                            const char *db, const char *table_name);
+   int (*release_temporary_latches)(handlerton *hton, THD *thd);
+   enum log_status (*get_log_status)(handlerton *hton, char *log);
+   enum handler_create_iterator_result
+     (*create_iterator)(handlerton *hton, enum handler_iterator_type type,
+                        struct handler_iterator *fill_this_in);
+   int (*discover)(handlerton *hton, THD* thd, const char *db,
+                   const char *name,
+                   uchar **frmblob,
+                   size_t *frmlen);
+   int (*find_files)(handlerton *hton, THD *thd,
+                     const char *db,
+                     const char *path,
+                     const char *wild, In_C_you_should_use_my_bool_instead() dir, List<LEX_STRING> *files);
+   int (*table_exists_in_engine)(handlerton *hton, THD* thd, const char *db,
+                                 const char *name);
+   uint32 license;
+   void *data;
+};
+class Ha_trx_info;
+struct THD_TRANS
+{
+  In_C_you_should_use_my_bool_instead() no_2pc;
+  Ha_trx_info *ha_list;
+  In_C_you_should_use_my_bool_instead() modified_non_trans_table;
+  void reset() { no_2pc= (0); modified_non_trans_table= (0); }
+};
+class Ha_trx_info
+{
+public:
+  void register_ha(THD_TRANS *trans, handlerton *ht_arg)
+  {
+    assert(m_flags == 0);
+    assert(m_ht == NULL);
+    assert(m_next == NULL);
+    m_ht= ht_arg;
+    m_flags= (int) TRX_READ_ONLY;
+    m_next= trans->ha_list;
+    trans->ha_list= this;
+  }
+  void reset()
+  {
+    m_next= NULL;
+    m_ht= NULL;
+    m_flags= 0;
+  }
+  Ha_trx_info() { reset(); }
+  void set_trx_read_write()
+  {
+    assert(is_started());
+    m_flags|= (int) TRX_READ_WRITE;
+  }
+  In_C_you_should_use_my_bool_instead() is_trx_read_write() const
+  {
+    assert(is_started());
+    return m_flags & (int) TRX_READ_WRITE;
+  }
+  In_C_you_should_use_my_bool_instead() is_started() const { return m_ht != NULL; }
+  void coalesce_trx_with(const Ha_trx_info *stmt_trx)
+  {
+    assert(is_started());
+    if (stmt_trx->is_trx_read_write())
+      set_trx_read_write();
+  }
+  Ha_trx_info *next() const
+  {
+    assert(is_started());
+    return m_next;
+  }
+  handlerton *ht() const
+  {
+    assert(is_started());
+    return m_ht;
+  }
+private:
+  enum { TRX_READ_ONLY= 0, TRX_READ_WRITE= 1 };
+  Ha_trx_info *m_next;
+  handlerton *m_ht;
+  uchar m_flags;
+};
+enum enum_tx_isolation { ISO_READ_UNCOMMITTED, ISO_READ_COMMITTED,
+    ISO_REPEATABLE_READ, ISO_SERIALIZABLE};
+enum ndb_distribution { ND_KEYHASH= 0, ND_LINHASH= 1 };
+typedef struct {
+  ulonglong data_file_length;
+  ulonglong max_data_file_length;
+  ulonglong index_file_length;
+  ulonglong delete_length;
+  ha_rows records;
+  ulong mean_rec_length;
+  time_t create_time;
+  time_t check_time;
+  time_t update_time;
+  ulonglong check_sum;
+} PARTITION_INFO;
+class Item;
+struct st_table_log_memory_entry;
+class partition_info;
+struct st_partition_iter;
+enum ha_choice { HA_CHOICE_UNDEF, HA_CHOICE_NO, HA_CHOICE_YES };
+typedef struct st_ha_create_information
+{
+  CHARSET_INFO *table_charset, *default_table_charset;
+  LEX_STRING connect_string;
+  const char *password, *tablespace;
+  LEX_STRING comment;
+  const char *data_file_name, *index_file_name;
+  const char *alias;
+  ulonglong max_rows,min_rows;
+  ulonglong auto_increment_value;
+  ulong table_options;
+  ulong avg_row_length;
+  ulong used_fields;
+  ulong key_block_size;
+  SQL_LIST merge_list;
+  handlerton *db_type;
+  enum row_type row_type;
+  uint null_bits;
+  uint options;
+  uint merge_insert_method;
+  uint extra_size;
+  enum ha_choice transactional;
+  In_C_you_should_use_my_bool_instead() table_existed;
+  In_C_you_should_use_my_bool_instead() frm_only;
+  In_C_you_should_use_my_bool_instead() varchar;
+  enum ha_storage_media storage_media;
+  enum ha_choice page_checksum;
+} HA_CREATE_INFO;
+typedef struct st_key_create_information
+{
+  enum ha_key_alg algorithm;
+  ulong block_size;
+  LEX_STRING parser_name;
+} KEY_CREATE_INFO;
+class TABLEOP_HOOKS
+{
+public:
+  TABLEOP_HOOKS() {}
+  virtual ~TABLEOP_HOOKS() {}
+  inline void prelock(TABLE **tables, uint count)
+  {
+    do_prelock(tables, count);
+  }
+  inline int postlock(TABLE **tables, uint count)
+  {
+    return do_postlock(tables, count);
+  }
+private:
+  virtual void do_prelock(TABLE **tables, uint count)
+  {
+  }
+  virtual int do_postlock(TABLE **tables, uint count)
+  {
+    return 0;
+  }
+};
+typedef struct st_savepoint SAVEPOINT;
+extern ulong savepoint_alloc_size;
+extern KEY_CREATE_INFO default_key_create_info;
+typedef class Item COND;
+typedef struct st_ha_check_opt
+{
+  st_ha_check_opt() {}
+  ulong sort_buffer_size;
+  uint flags;
+  uint sql_flags;
+  KEY_CACHE *key_cache;
+  void init();
+} HA_CHECK_OPT;
+typedef struct st_handler_buffer
+{
+  const uchar *buffer;
+  const uchar *buffer_end;
+  uchar *end_of_used_area;
+} HANDLER_BUFFER;
+typedef struct system_status_var SSV;
+class ha_statistics
+{
+public:
+  ulonglong data_file_length;
+  ulonglong max_data_file_length;
+  ulonglong index_file_length;
+  ulonglong max_index_file_length;
+  ulonglong delete_length;
+  ulonglong auto_increment_value;
+  ha_rows records;
+  ha_rows deleted;
+  ulong mean_rec_length;
+  time_t create_time;
+  time_t check_time;
+  time_t update_time;
+  uint block_size;
+  ha_statistics():
+    data_file_length(0), max_data_file_length(0),
+    index_file_length(0), delete_length(0), auto_increment_value(0),
+    records(0), deleted(0), mean_rec_length(0), create_time(0),
+    check_time(0), update_time(0), block_size(0)
+  {}
+};
+uint calculate_key_len(TABLE *, uint, const uchar *, key_part_map);
+class handler :public Sql_alloc
+{
+public:
+  typedef ulonglong Table_flags;
+protected:
+  struct st_table_share *table_share;
+  struct st_table *table;
+  Table_flags cached_table_flags;
+  ha_rows estimation_rows_to_insert;
+public:
+  handlerton *ht;