mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Merging 5.1 main into 5.1-rpl.
This commit is contained in:
commit
2974607a4b
81 changed files with 12912 additions and 2217 deletions
|
@ -108,18 +108,18 @@ SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DDBUG_OFF")
|
|||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4800 /wd4805")
|
||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4800 /wd4805")
|
||||
|
||||
IF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
# Disable warnings in Visual Studio 8 and above
|
||||
IF(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7")
|
||||
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4996")
|
||||
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /wd4996")
|
||||
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /wd4996")
|
||||
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /wd4996")
|
||||
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /wd4996")
|
||||
SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /wd4996")
|
||||
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
|
||||
IF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR
|
||||
CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
ENDIF(MSVC AND NOT CMAKE_GENERATOR MATCHES "Visual Studio 7")
|
||||
|
||||
# Settings for Visual Studio 7 and above.
|
||||
IF(MSVC)
|
||||
# replace /MDd with /MTd
|
||||
STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE ${CMAKE_C_FLAGS_RELEASE})
|
||||
STRING(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELWITHDEBINFO ${CMAKE_C_FLAGS_RELWITHDEBINFO})
|
||||
|
@ -149,9 +149,7 @@ IF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR
|
|||
IF(NOT tmp_manifest)
|
||||
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO")
|
||||
ENDIF(NOT tmp_manifest)
|
||||
|
||||
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 7" OR
|
||||
CMAKE_GENERATOR MATCHES "Visual Studio 8")
|
||||
ENDIF(MSVC)
|
||||
|
||||
IF(WIN32)
|
||||
ADD_DEFINITIONS("-D_WINDOWS -D__WIN__ -D_CRT_SECURE_NO_DEPRECATE")
|
||||
|
|
78
Makefile.am
78
Makefile.am
|
@ -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.%
|
||||
|
|
24
configure.in
24
configure.in
|
@ -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"
|
||||
# Enable the abi_check rule only if gcc is available
|
||||
|
||||
if expr "$CC" : ".*gcc.*"
|
||||
then
|
||||
AC_MSG_CHECKING(if $ICHECK works as expected)
|
||||
echo "int foo;" > conftest.h
|
||||
$ICHECK --canonify -o conftest.ic conftest.h 2>/dev/null
|
||||
if test -f "conftest.ic"
|
||||
then
|
||||
AC_MSG_RESULT(yes)
|
||||
ABI_CHECK="abi_check"
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
ICHECK=no
|
||||
ABI_CHECK=""
|
||||
fi
|
||||
rm -f conftest.ic conftest.h
|
||||
fi
|
||||
AC_SUBST(ICHECK)
|
||||
|
||||
AC_SUBST(ABI_CHECK)
|
||||
|
||||
# Lock for PS
|
||||
AC_PATH_PROG(PS, ps, ps)
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
SUBDIRS = taocrypt src testsuite
|
||||
EXTRA_DIST = yassl.dsp yassl.dsw yassl.vcproj \
|
||||
CMakeLists.txt
|
||||
EXTRA_DIST = CMakeLists.txt
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
SUBDIRS = src test benchmark
|
||||
EXTRA_DIST = taocrypt.dsw taocrypt.dsp taocrypt.vcproj CMakeLists.txt $(wildcard mySTL/*.hpp)
|
||||
EXTRA_DIST = CMakeLists.txt $(wildcard mySTL/*.hpp)
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
|
|
@ -1,268 +0,0 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="taocrypt"
|
||||
SccProjectName=""
|
||||
SccLocalPath="">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\debug_obj"
|
||||
IntermediateDirectory=".\debug_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,mySTL"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
|
||||
ExceptionHandling="FALSE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\debug_obj/taocrypt.pch"
|
||||
AssemblerListingLocation=".\debug_obj/"
|
||||
ObjectFile=".\debug_obj/"
|
||||
ProgramDataBaseFileName=".\debug_obj/"
|
||||
BrowseInformation="1"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\debug_obj\taocrypt.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\release_obj"
|
||||
IntermediateDirectory=".\release_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,mySTL"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\release_obj/taocrypt.pch"
|
||||
AssemblerListingLocation=".\release_obj/"
|
||||
ObjectFile=".\release_obj/"
|
||||
ProgramDataBaseFileName=".\release_obj/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\release_obj\taocrypt.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="src\aes.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\aestables.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\algebra.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\arc4.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\asn.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\coding.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\des.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\dh.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\dsa.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\file.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\hash.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\integer.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\md2.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\md4.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\md5.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\misc.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\random.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\ripemd.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\rsa.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\sha.cpp">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="include\aes.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\algebra.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\arc4.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\asn.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\block.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\coding.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\des.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\dh.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\dsa.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\error.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\file.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\hash.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\hmac.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\integer.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\md2.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\md4.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\md5.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\misc.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\modarith.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\modes.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\random.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\ripemd.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\rsa.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\sha.hpp">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
|
@ -1,211 +0,0 @@
|
|||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="7.10"
|
||||
Name="yassl"
|
||||
SccProjectName=""
|
||||
SccLocalPath="">
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"/>
|
||||
</Platforms>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
OutputDirectory=".\debug_obj"
|
||||
IntermediateDirectory=".\debug_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="0"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,taocrypt\include,taocrypt\mySTL"
|
||||
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;YASSL_PREFIX"
|
||||
ExceptionHandling="FALSE"
|
||||
BasicRuntimeChecks="3"
|
||||
RuntimeLibrary="1"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\debug_obj/yassl.pch"
|
||||
AssemblerListingLocation=".\debug_obj/"
|
||||
ObjectFile=".\debug_obj/"
|
||||
ProgramDataBaseFileName=".\debug_obj/"
|
||||
BrowseInformation="1"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
DebugInformationFormat="4"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\debug_obj\yassl.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="_DEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
OutputDirectory=".\release_obj"
|
||||
IntermediateDirectory=".\release_obj"
|
||||
ConfigurationType="4"
|
||||
UseOfMFC="0"
|
||||
ATLMinimizesCRunTimeLibraryUsage="FALSE"
|
||||
CharacterSet="2">
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
InlineFunctionExpansion="1"
|
||||
OptimizeForProcessor="2"
|
||||
AdditionalIncludeDirectories="include,taocrypt\include,taocrypt\mySTL"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;YASSL_PREFIX"
|
||||
StringPooling="TRUE"
|
||||
ExceptionHandling="FALSE"
|
||||
RuntimeLibrary="0"
|
||||
EnableFunctionLevelLinking="TRUE"
|
||||
UsePrecompiledHeader="2"
|
||||
PrecompiledHeaderFile=".\release_obj/yassl.pch"
|
||||
AssemblerListingLocation=".\release_obj/"
|
||||
ObjectFile=".\release_obj/"
|
||||
ProgramDataBaseFileName=".\release_obj/"
|
||||
WarningLevel="3"
|
||||
SuppressStartupBanner="TRUE"
|
||||
CompileAs="0"/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
OutputFile=".\release_obj\yassl.lib"
|
||||
SuppressStartupBanner="TRUE"/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
PreprocessorDefinitions="NDEBUG"
|
||||
Culture="1033"/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCManagedWrapperGeneratorTool"/>
|
||||
<Tool
|
||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
|
||||
<File
|
||||
RelativePath="src\buffer.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\cert_wrapper.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\crypto_wrapper.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\handshake.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\lock.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\log.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\socket_wrapper.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\ssl.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\timer.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\yassl_error.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\yassl_imp.cpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="src\yassl_int.cpp">
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl">
|
||||
<File
|
||||
RelativePath="include\buffer.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\cert_wrapper.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\crypto_wrapper.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\factory.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\handshake.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\lock.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\log.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\socket_wrapper.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\timer.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_error.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_imp.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_int.hpp">
|
||||
</File>
|
||||
<File
|
||||
RelativePath="include\yassl_types.hpp">
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
|
@ -38,10 +38,11 @@ noinst_HEADERS = config-win.h config-netware.h my_bit.h \
|
|||
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.%
|
||||
|
|
674
include/mysql.h.pp
Normal file
674
include/mysql.h.pp
Normal file
|
@ -0,0 +1,674 @@
|
|||
#include <sys/types.h>
|
||||
typedef char my_bool;
|
||||
typedef int my_socket;
|
||||
#include "mysql_version.h"
|
||||
#include "mysql_com.h"
|
||||
enum enum_server_command
|
||||
{
|
||||
COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY, COM_FIELD_LIST,
|
||||
COM_CREATE_DB, COM_DROP_DB, COM_REFRESH, COM_SHUTDOWN, COM_STATISTICS,
|
||||
COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL, COM_DEBUG, COM_PING,
|
||||
COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP,
|
||||
COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE,
|
||||
COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE,
|
||||
COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON,
|
||||
COM_END
|
||||
};
|
||||
struct st_vio;
|
||||
typedef struct st_vio Vio;
|
||||
typedef struct st_net {
|
||||
Vio *vio;
|
||||
unsigned char *buff,*buff_end,*write_pos,*read_pos;
|
||||
my_socket fd;
|
||||
unsigned long remain_in_buf,length, buf_length, where_b;
|
||||
unsigned long max_packet,max_packet_size;
|
||||
unsigned int pkt_nr,compress_pkt_nr;
|
||||
unsigned int write_timeout, read_timeout, retry_count;
|
||||
int fcntl;
|
||||
unsigned int *return_status;
|
||||
unsigned char reading_or_writing;
|
||||
char save_char;
|
||||
my_bool unused0;
|
||||
my_bool unused;
|
||||
my_bool compress;
|
||||
my_bool unused1;
|
||||
unsigned char *query_cache_query;
|
||||
unsigned int last_errno;
|
||||
unsigned char error;
|
||||
my_bool unused2;
|
||||
my_bool return_errno;
|
||||
char last_error[512];
|
||||
char sqlstate[5 +1];
|
||||
void *extension;
|
||||
} NET;
|
||||
enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
|
||||
MYSQL_TYPE_SHORT, MYSQL_TYPE_LONG,
|
||||
MYSQL_TYPE_FLOAT, MYSQL_TYPE_DOUBLE,
|
||||
MYSQL_TYPE_NULL, MYSQL_TYPE_TIMESTAMP,
|
||||
MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,
|
||||
MYSQL_TYPE_DATE, MYSQL_TYPE_TIME,
|
||||
MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
|
||||
MYSQL_TYPE_NEWDATE, MYSQL_TYPE_VARCHAR,
|
||||
MYSQL_TYPE_BIT,
|
||||
MYSQL_TYPE_NEWDECIMAL=246,
|
||||
MYSQL_TYPE_ENUM=247,
|
||||
MYSQL_TYPE_SET=248,
|
||||
MYSQL_TYPE_TINY_BLOB=249,
|
||||
MYSQL_TYPE_MEDIUM_BLOB=250,
|
||||
MYSQL_TYPE_LONG_BLOB=251,
|
||||
MYSQL_TYPE_BLOB=252,
|
||||
MYSQL_TYPE_VAR_STRING=253,
|
||||
MYSQL_TYPE_STRING=254,
|
||||
MYSQL_TYPE_GEOMETRY=255
|
||||
};
|
||||
enum mysql_enum_shutdown_level {
|
||||
SHUTDOWN_DEFAULT = 0,
|
||||
SHUTDOWN_WAIT_CONNECTIONS= (unsigned char)(1 << 0),
|
||||
SHUTDOWN_WAIT_TRANSACTIONS= (unsigned char)(1 << 1),
|
||||
SHUTDOWN_WAIT_UPDATES= (unsigned char)(1 << 3),
|
||||
SHUTDOWN_WAIT_ALL_BUFFERS= ((unsigned char)(1 << 3) << 1),
|
||||
SHUTDOWN_WAIT_CRITICAL_BUFFERS= ((unsigned char)(1 << 3) << 1) + 1,
|
||||
KILL_QUERY= 254,
|
||||
KILL_CONNECTION= 255
|
||||
};
|
||||
enum enum_cursor_type
|
||||
{
|
||||
CURSOR_TYPE_NO_CURSOR= 0,
|
||||
CURSOR_TYPE_READ_ONLY= 1,
|
||||
CURSOR_TYPE_FOR_UPDATE= 2,
|
||||
CURSOR_TYPE_SCROLLABLE= 4
|
||||
};
|
||||
enum enum_mysql_set_option
|
||||
{
|
||||
MYSQL_OPTION_MULTI_STATEMENTS_ON,
|
||||
MYSQL_OPTION_MULTI_STATEMENTS_OFF
|
||||
};
|
||||
my_bool my_net_init(NET *net, Vio* vio);
|
||||
void my_net_local_init(NET *net);
|
||||
void net_end(NET *net);
|
||||
void net_clear(NET *net, my_bool clear_buffer);
|
||||
my_bool net_realloc(NET *net, size_t length);
|
||||
my_bool net_flush(NET *net);
|
||||
my_bool my_net_write(NET *net,const unsigned char *packet, size_t len);
|
||||
my_bool net_write_command(NET *net,unsigned char command,
|
||||
const unsigned char *header, size_t head_len,
|
||||
const unsigned char *packet, size_t len);
|
||||
int net_real_write(NET *net,const unsigned char *packet, size_t len);
|
||||
unsigned long my_net_read(NET *net);
|
||||
struct sockaddr;
|
||||
int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen,
|
||||
unsigned int timeout);
|
||||
struct rand_struct {
|
||||
unsigned long seed1,seed2,max_value;
|
||||
double max_value_dbl;
|
||||
};
|
||||
enum Item_result {STRING_RESULT=0, REAL_RESULT, INT_RESULT, ROW_RESULT,
|
||||
DECIMAL_RESULT};
|
||||
typedef struct st_udf_args
|
||||
{
|
||||
unsigned int arg_count;
|
||||
enum Item_result *arg_type;
|
||||
char **args;
|
||||
unsigned long *lengths;
|
||||
char *maybe_null;
|
||||
char **attributes;
|
||||
unsigned long *attribute_lengths;
|
||||
void *extension;
|
||||
} UDF_ARGS;
|
||||
typedef struct st_udf_init
|
||||
{
|
||||
my_bool maybe_null;
|
||||
unsigned int decimals;
|
||||
unsigned long max_length;
|
||||
char *ptr;
|
||||
my_bool const_item;
|
||||
void *extension;
|
||||
} UDF_INIT;
|
||||
void randominit(struct rand_struct *, unsigned long seed1,
|
||||
unsigned long seed2);
|
||||
double my_rnd(struct rand_struct *);
|
||||
void create_random_string(char *to, unsigned int length, struct rand_struct *rand_st);
|
||||
void hash_password(unsigned long *to, const char *password, unsigned int password_len);
|
||||
void make_scrambled_password_323(char *to, const char *password);
|
||||
void scramble_323(char *to, const char *message, const char *password);
|
||||
my_bool check_scramble_323(const char *, const char *message,
|
||||
unsigned long *salt);
|
||||
void get_salt_from_password_323(unsigned long *res, const char *password);
|
||||
void make_password_from_salt_323(char *to, const unsigned long *salt);
|
||||
void make_scrambled_password(char *to, const char *password);
|
||||
void scramble(char *to, const char *message, const char *password);
|
||||
my_bool check_scramble(const char *reply, const char *message,
|
||||
const unsigned char *hash_stage2);
|
||||
void get_salt_from_password(unsigned char *res, const char *password);
|
||||
void make_password_from_salt(char *to, const unsigned char *hash_stage2);
|
||||
char *octet2hex(char *to, const char *str, unsigned int len);
|
||||
char *get_tty_password(const char *opt_message);
|
||||
const char *mysql_errno_to_sqlstate(unsigned int mysql_errno);
|
||||
my_bool my_thread_init(void);
|
||||
void my_thread_end(void);
|
||||
#include "mysql_time.h"
|
||||
enum enum_mysql_timestamp_type
|
||||
{
|
||||
MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1,
|
||||
MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2
|
||||
};
|
||||
typedef struct st_mysql_time
|
||||
{
|
||||
unsigned int year, month, day, hour, minute, second;
|
||||
unsigned long second_part;
|
||||
my_bool neg;
|
||||
enum enum_mysql_timestamp_type time_type;
|
||||
} MYSQL_TIME;
|
||||
#include "my_list.h"
|
||||
typedef struct st_list {
|
||||
struct st_list *prev,*next;
|
||||
void *data;
|
||||
} LIST;
|
||||
typedef int (*list_walk_action)(void *,void *);
|
||||
extern LIST *list_add(LIST *root,LIST *element);
|
||||
extern LIST *list_delete(LIST *root,LIST *element);
|
||||
extern LIST *list_cons(void *data,LIST *root);
|
||||
extern LIST *list_reverse(LIST *root);
|
||||
extern void list_free(LIST *root,unsigned int free_data);
|
||||
extern unsigned int list_length(LIST *);
|
||||
extern int list_walk(LIST *,list_walk_action action,unsigned char * argument);
|
||||
extern unsigned int mysql_port;
|
||||
extern char *mysql_unix_port;
|
||||
typedef struct st_mysql_field {
|
||||
char *name;
|
||||
char *org_name;
|
||||
char *table;
|
||||
char *org_table;
|
||||
char *db;
|
||||
char *catalog;
|
||||
char *def;
|
||||
unsigned long length;
|
||||
unsigned long max_length;
|
||||
unsigned int name_length;
|
||||
unsigned int org_name_length;
|
||||
unsigned int table_length;
|
||||
unsigned int org_table_length;
|
||||
unsigned int db_length;
|
||||
unsigned int catalog_length;
|
||||
unsigned int def_length;
|
||||
unsigned int flags;
|
||||
unsigned int decimals;
|
||||
unsigned int charsetnr;
|
||||
enum enum_field_types type;
|
||||
void *extension;
|
||||
} MYSQL_FIELD;
|
||||
typedef char **MYSQL_ROW;
|
||||
typedef unsigned int MYSQL_FIELD_OFFSET;
|
||||
typedef unsigned long long my_ulonglong;
|
||||
#include "typelib.h"
|
||||
#include "my_alloc.h"
|
||||
typedef struct st_used_mem
|
||||
{
|
||||
struct st_used_mem *next;
|
||||
unsigned int left;
|
||||
unsigned int size;
|
||||
} USED_MEM;
|
||||
typedef struct st_mem_root
|
||||
{
|
||||
USED_MEM *free;
|
||||
USED_MEM *used;
|
||||
USED_MEM *pre_alloc;
|
||||
size_t min_malloc;
|
||||
size_t block_size;
|
||||
unsigned int block_num;
|
||||
unsigned int first_block_usage;
|
||||
void (*error_handler)(void);
|
||||
} MEM_ROOT;
|
||||
typedef struct st_typelib {
|
||||
unsigned int count;
|
||||
const char *name;
|
||||
const char **type_names;
|
||||
unsigned int *type_lengths;
|
||||
} TYPELIB;
|
||||
extern my_ulonglong find_typeset(char *x, TYPELIB *typelib,int *error_position);
|
||||
extern int find_type_or_exit(const char *x, TYPELIB *typelib,
|
||||
const char *option);
|
||||
extern int find_type(char *x, const TYPELIB *typelib, unsigned int full_name);
|
||||
extern void make_type(char *to,unsigned int nr,TYPELIB *typelib);
|
||||
extern const char *get_type(TYPELIB *typelib,unsigned int nr);
|
||||
extern TYPELIB *copy_typelib(MEM_ROOT *root, TYPELIB *from);
|
||||
extern TYPELIB sql_protocol_typelib;
|
||||
typedef struct st_mysql_rows {
|
||||
struct st_mysql_rows *next;
|
||||
MYSQL_ROW data;
|
||||
unsigned long length;
|
||||
} MYSQL_ROWS;
|
||||
typedef MYSQL_ROWS *MYSQL_ROW_OFFSET;
|
||||
#include "my_alloc.h"
|
||||
typedef struct embedded_query_result EMBEDDED_QUERY_RESULT;
|
||||
typedef struct st_mysql_data {
|
||||
MYSQL_ROWS *data;
|
||||
struct embedded_query_result *embedded_info;
|
||||
MEM_ROOT alloc;
|
||||
my_ulonglong rows;
|
||||
unsigned int fields;
|
||||
void *extension;
|
||||
} MYSQL_DATA;
|
||||
enum mysql_option
|
||||
{
|
||||
MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE,
|
||||
MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
|
||||
MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE,
|
||||
MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT,
|
||||
MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT,
|
||||
MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
|
||||
MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH,
|
||||
MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT,
|
||||
MYSQL_OPT_SSL_VERIFY_SERVER_CERT
|
||||
};
|
||||
struct st_mysql_options {
|
||||
unsigned int connect_timeout, read_timeout, write_timeout;
|
||||
unsigned int port, protocol;
|
||||
unsigned long client_flag;
|
||||
char *host,*user,*password,*unix_socket,*db;
|
||||
struct st_dynamic_array *init_commands;
|
||||
char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name;
|
||||
char *ssl_key;
|
||||
char *ssl_cert;
|
||||
char *ssl_ca;
|
||||
char *ssl_capath;
|
||||
char *ssl_cipher;
|
||||
char *shared_memory_base_name;
|
||||
unsigned long max_allowed_packet;
|
||||
my_bool use_ssl;
|
||||
my_bool compress,named_pipe;
|
||||
my_bool rpl_probe;
|
||||
my_bool rpl_parse;
|
||||
my_bool no_master_reads;
|
||||
my_bool separate_thread;
|
||||
enum mysql_option methods_to_use;
|
||||
char *client_ip;
|
||||
my_bool secure_auth;
|
||||
my_bool report_data_truncation;
|
||||
int (*local_infile_init)(void **, const char *, void *);
|
||||
int (*local_infile_read)(void *, char *, unsigned int);
|
||||
void (*local_infile_end)(void *);
|
||||
int (*local_infile_error)(void *, char *, unsigned int);
|
||||
void *local_infile_userdata;
|
||||
void *extension;
|
||||
};
|
||||
enum mysql_status
|
||||
{
|
||||
MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,MYSQL_STATUS_USE_RESULT
|
||||
};
|
||||
enum mysql_protocol_type
|
||||
{
|
||||
MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
|
||||
MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
|
||||
};
|
||||
enum mysql_rpl_type
|
||||
{
|
||||
MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN
|
||||
};
|
||||
typedef struct character_set
|
||||
{
|
||||
unsigned int number;
|
||||
unsigned int state;
|
||||
const char *csname;
|
||||
const char *name;
|
||||
const char *comment;
|
||||
const char *dir;
|
||||
unsigned int mbminlen;
|
||||
unsigned int mbmaxlen;
|
||||
} MY_CHARSET_INFO;
|
||||
struct st_mysql_methods;
|
||||
struct st_mysql_stmt;
|
||||
typedef struct st_mysql
|
||||
{
|
||||
NET net;
|
||||
unsigned char *connector_fd;
|
||||
char *host,*user,*passwd,*unix_socket,*server_version,*host_info;
|
||||
char *info, *db;
|
||||
struct charset_info_st *charset;
|
||||
MYSQL_FIELD *fields;
|
||||
MEM_ROOT field_alloc;
|
||||
my_ulonglong affected_rows;
|
||||
my_ulonglong insert_id;
|
||||
my_ulonglong extra_info;
|
||||
unsigned long thread_id;
|
||||
unsigned long packet_length;
|
||||
unsigned int port;
|
||||
unsigned long client_flag,server_capabilities;
|
||||
unsigned int protocol_version;
|
||||
unsigned int field_count;
|
||||
unsigned int server_status;
|
||||
unsigned int server_language;
|
||||
unsigned int warning_count;
|
||||
struct st_mysql_options options;
|
||||
enum mysql_status status;
|
||||
my_bool free_me;
|
||||
my_bool reconnect;
|
||||
char scramble[20 +1];
|
||||
my_bool rpl_pivot;
|
||||
struct st_mysql* master, *next_slave;
|
||||
struct st_mysql* last_used_slave;
|
||||
struct st_mysql* last_used_con;
|
||||
LIST *stmts;
|
||||
const struct st_mysql_methods *methods;
|
||||
void *thd;
|
||||
my_bool *unbuffered_fetch_owner;
|
||||
char *info_buffer;
|
||||
void *extension;
|
||||
} MYSQL;
|
||||
typedef struct st_mysql_res {
|
||||
my_ulonglong row_count;
|
||||
MYSQL_FIELD *fields;
|
||||
MYSQL_DATA *data;
|
||||
MYSQL_ROWS *data_cursor;
|
||||
unsigned long *lengths;
|
||||
MYSQL *handle;
|
||||
const struct st_mysql_methods *methods;
|
||||
MYSQL_ROW row;
|
||||
MYSQL_ROW current_row;
|
||||
MEM_ROOT field_alloc;
|
||||
unsigned int field_count, current_field;
|
||||
my_bool eof;
|
||||
my_bool unbuffered_fetch_cancelled;
|
||||
void *extension;
|
||||
} MYSQL_RES;
|
||||
typedef struct st_mysql_manager
|
||||
{
|
||||
NET net;
|
||||
char *host, *user, *passwd;
|
||||
char *net_buf, *net_buf_pos, *net_data_end;
|
||||
unsigned int port;
|
||||
int cmd_status;
|
||||
int last_errno;
|
||||
int net_buf_size;
|
||||
my_bool free_me;
|
||||
my_bool eof;
|
||||
char last_error[256];
|
||||
void *extension;
|
||||
} MYSQL_MANAGER;
|
||||
typedef struct st_mysql_parameters
|
||||
{
|
||||
unsigned long *p_max_allowed_packet;
|
||||
unsigned long *p_net_buffer_length;
|
||||
void *extension;
|
||||
} MYSQL_PARAMETERS;
|
||||
int mysql_server_init(int argc, char **argv, char **groups);
|
||||
void mysql_server_end(void);
|
||||
MYSQL_PARAMETERS * mysql_get_parameters(void);
|
||||
my_bool mysql_thread_init(void);
|
||||
void mysql_thread_end(void);
|
||||
my_ulonglong mysql_num_rows(MYSQL_RES *res);
|
||||
unsigned int mysql_num_fields(MYSQL_RES *res);
|
||||
my_bool mysql_eof(MYSQL_RES *res);
|
||||
MYSQL_FIELD * mysql_fetch_field_direct(MYSQL_RES *res,
|
||||
unsigned int fieldnr);
|
||||
MYSQL_FIELD * mysql_fetch_fields(MYSQL_RES *res);
|
||||
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *res);
|
||||
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *res);
|
||||
unsigned int mysql_field_count(MYSQL *mysql);
|
||||
my_ulonglong mysql_affected_rows(MYSQL *mysql);
|
||||
my_ulonglong mysql_insert_id(MYSQL *mysql);
|
||||
unsigned int mysql_errno(MYSQL *mysql);
|
||||
const char * mysql_error(MYSQL *mysql);
|
||||
const char * mysql_sqlstate(MYSQL *mysql);
|
||||
unsigned int mysql_warning_count(MYSQL *mysql);
|
||||
const char * mysql_info(MYSQL *mysql);
|
||||
unsigned long mysql_thread_id(MYSQL *mysql);
|
||||
const char * mysql_character_set_name(MYSQL *mysql);
|
||||
int mysql_set_character_set(MYSQL *mysql, const char *csname);
|
||||
MYSQL * mysql_init(MYSQL *mysql);
|
||||
my_bool mysql_ssl_set(MYSQL *mysql, const char *key,
|
||||
const char *cert, const char *ca,
|
||||
const char *capath, const char *cipher);
|
||||
const char * mysql_get_ssl_cipher(MYSQL *mysql);
|
||||
my_bool mysql_change_user(MYSQL *mysql, const char *user,
|
||||
const char *passwd, const char *db);
|
||||
MYSQL * mysql_real_connect(MYSQL *mysql, const char *host,
|
||||
const char *user,
|
||||
const char *passwd,
|
||||
const char *db,
|
||||
unsigned int port,
|
||||
const char *unix_socket,
|
||||
unsigned long clientflag);
|
||||
int mysql_select_db(MYSQL *mysql, const char *db);
|
||||
int mysql_query(MYSQL *mysql, const char *q);
|
||||
int mysql_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
int mysql_real_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
MYSQL_RES * mysql_store_result(MYSQL *mysql);
|
||||
MYSQL_RES * mysql_use_result(MYSQL *mysql);
|
||||
my_bool mysql_master_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool mysql_master_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool mysql_slave_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool mysql_slave_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
void mysql_get_character_set_info(MYSQL *mysql,
|
||||
MY_CHARSET_INFO *charset);
|
||||
void
|
||||
mysql_set_local_infile_handler(MYSQL *mysql,
|
||||
int (*local_infile_init)(void **, const char *,
|
||||
void *),
|
||||
int (*local_infile_read)(void *, char *,
|
||||
unsigned int),
|
||||
void (*local_infile_end)(void *),
|
||||
int (*local_infile_error)(void *, char*,
|
||||
unsigned int),
|
||||
void *);
|
||||
void
|
||||
mysql_set_local_infile_default(MYSQL *mysql);
|
||||
void mysql_enable_rpl_parse(MYSQL* mysql);
|
||||
void mysql_disable_rpl_parse(MYSQL* mysql);
|
||||
int mysql_rpl_parse_enabled(MYSQL* mysql);
|
||||
void mysql_enable_reads_from_master(MYSQL* mysql);
|
||||
void mysql_disable_reads_from_master(MYSQL* mysql);
|
||||
my_bool mysql_reads_from_master_enabled(MYSQL* mysql);
|
||||
enum mysql_rpl_type mysql_rpl_query_type(const char* q, int len);
|
||||
my_bool mysql_rpl_probe(MYSQL* mysql);
|
||||
int mysql_set_master(MYSQL* mysql, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
const char* passwd);
|
||||
int mysql_add_slave(MYSQL* mysql, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
const char* passwd);
|
||||
int mysql_shutdown(MYSQL *mysql,
|
||||
enum mysql_enum_shutdown_level
|
||||
shutdown_level);
|
||||
int mysql_dump_debug_info(MYSQL *mysql);
|
||||
int mysql_refresh(MYSQL *mysql,
|
||||
unsigned int refresh_options);
|
||||
int mysql_kill(MYSQL *mysql,unsigned long pid);
|
||||
int mysql_set_server_option(MYSQL *mysql,
|
||||
enum enum_mysql_set_option
|
||||
option);
|
||||
int mysql_ping(MYSQL *mysql);
|
||||
const char * mysql_stat(MYSQL *mysql);
|
||||
const char * mysql_get_server_info(MYSQL *mysql);
|
||||
const char * mysql_get_client_info(void);
|
||||
unsigned long mysql_get_client_version(void);
|
||||
const char * mysql_get_host_info(MYSQL *mysql);
|
||||
unsigned long mysql_get_server_version(MYSQL *mysql);
|
||||
unsigned int mysql_get_proto_info(MYSQL *mysql);
|
||||
MYSQL_RES * mysql_list_dbs(MYSQL *mysql,const char *wild);
|
||||
MYSQL_RES * mysql_list_tables(MYSQL *mysql,const char *wild);
|
||||
MYSQL_RES * mysql_list_processes(MYSQL *mysql);
|
||||
int mysql_options(MYSQL *mysql,enum mysql_option option,
|
||||
const void *arg);
|
||||
void mysql_free_result(MYSQL_RES *result);
|
||||
void mysql_data_seek(MYSQL_RES *result,
|
||||
my_ulonglong offset);
|
||||
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result,
|
||||
MYSQL_ROW_OFFSET offset);
|
||||
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result,
|
||||
MYSQL_FIELD_OFFSET offset);
|
||||
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
|
||||
unsigned long * mysql_fetch_lengths(MYSQL_RES *result);
|
||||
MYSQL_FIELD * mysql_fetch_field(MYSQL_RES *result);
|
||||
MYSQL_RES * mysql_list_fields(MYSQL *mysql, const char *table,
|
||||
const char *wild);
|
||||
unsigned long mysql_escape_string(char *to,const char *from,
|
||||
unsigned long from_length);
|
||||
unsigned long mysql_hex_string(char *to,const char *from,
|
||||
unsigned long from_length);
|
||||
unsigned long mysql_real_escape_string(MYSQL *mysql,
|
||||
char *to,const char *from,
|
||||
unsigned long length);
|
||||
void mysql_debug(const char *debug);
|
||||
void myodbc_remove_escape(MYSQL *mysql,char *name);
|
||||
unsigned int mysql_thread_safe(void);
|
||||
my_bool mysql_embedded(void);
|
||||
MYSQL_MANAGER* mysql_manager_init(MYSQL_MANAGER* con);
|
||||
MYSQL_MANAGER* mysql_manager_connect(MYSQL_MANAGER* con,
|
||||
const char* host,
|
||||
const char* user,
|
||||
const char* passwd,
|
||||
unsigned int port);
|
||||
void mysql_manager_close(MYSQL_MANAGER* con);
|
||||
int mysql_manager_command(MYSQL_MANAGER* con,
|
||||
const char* cmd, int cmd_len);
|
||||
int mysql_manager_fetch_line(MYSQL_MANAGER* con,
|
||||
char* res_buf,
|
||||
int res_buf_size);
|
||||
my_bool mysql_read_query_result(MYSQL *mysql);
|
||||
enum enum_mysql_stmt_state
|
||||
{
|
||||
MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE,
|
||||
MYSQL_STMT_FETCH_DONE
|
||||
};
|
||||
typedef struct st_mysql_bind
|
||||
{
|
||||
unsigned long *length;
|
||||
my_bool *is_null;
|
||||
void *buffer;
|
||||
my_bool *error;
|
||||
unsigned char *row_ptr;
|
||||
void (*store_param_func)(NET *net, struct st_mysql_bind *param);
|
||||
void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *,
|
||||
unsigned char **row);
|
||||
void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *,
|
||||
unsigned char **row);
|
||||
unsigned long buffer_length;
|
||||
unsigned long offset;
|
||||
unsigned long length_value;
|
||||
unsigned int param_number;
|
||||
unsigned int pack_length;
|
||||
enum enum_field_types buffer_type;
|
||||
my_bool error_value;
|
||||
my_bool is_unsigned;
|
||||
my_bool long_data_used;
|
||||
my_bool is_null_value;
|
||||
void *extension;
|
||||
} MYSQL_BIND;
|
||||
typedef struct st_mysql_stmt
|
||||
{
|
||||
MEM_ROOT mem_root;
|
||||
LIST list;
|
||||
MYSQL *mysql;
|
||||
MYSQL_BIND *params;
|
||||
MYSQL_BIND *bind;
|
||||
MYSQL_FIELD *fields;
|
||||
MYSQL_DATA result;
|
||||
MYSQL_ROWS *data_cursor;
|
||||
int (*read_row_func)(struct st_mysql_stmt *stmt,
|
||||
unsigned char **row);
|
||||
my_ulonglong affected_rows;
|
||||
my_ulonglong insert_id;
|
||||
unsigned long stmt_id;
|
||||
unsigned long flags;
|
||||
unsigned long prefetch_rows;
|
||||
unsigned int server_status;
|
||||
unsigned int last_errno;
|
||||
unsigned int param_count;
|
||||
unsigned int field_count;
|
||||
enum enum_mysql_stmt_state state;
|
||||
char last_error[512];
|
||||
char sqlstate[5 +1];
|
||||
my_bool send_types_to_server;
|
||||
my_bool bind_param_done;
|
||||
unsigned char bind_result_done;
|
||||
my_bool unbuffered_fetch_cancelled;
|
||||
my_bool update_max_length;
|
||||
void *extension;
|
||||
} MYSQL_STMT;
|
||||
enum enum_stmt_attr_type
|
||||
{
|
||||
STMT_ATTR_UPDATE_MAX_LENGTH,
|
||||
STMT_ATTR_CURSOR_TYPE,
|
||||
STMT_ATTR_PREFETCH_ROWS
|
||||
};
|
||||
typedef struct st_mysql_methods
|
||||
{
|
||||
my_bool (*read_query_result)(MYSQL *mysql);
|
||||
my_bool (*advanced_command)(MYSQL *mysql,
|
||||
enum enum_server_command command,
|
||||
const unsigned char *header,
|
||||
unsigned long header_length,
|
||||
const unsigned char *arg,
|
||||
unsigned long arg_length,
|
||||
my_bool skip_check,
|
||||
MYSQL_STMT *stmt);
|
||||
MYSQL_DATA *(*read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
|
||||
unsigned int fields);
|
||||
MYSQL_RES * (*use_result)(MYSQL *mysql);
|
||||
void (*fetch_lengths)(unsigned long *to,
|
||||
MYSQL_ROW column, unsigned int field_count);
|
||||
void (*flush_use_result)(MYSQL *mysql);
|
||||
MYSQL_FIELD * (*list_fields)(MYSQL *mysql);
|
||||
my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
|
||||
int (*stmt_execute)(MYSQL_STMT *stmt);
|
||||
int (*read_binary_rows)(MYSQL_STMT *stmt);
|
||||
int (*unbuffered_fetch)(MYSQL *mysql, char **row);
|
||||
void (*free_embedded_thd)(MYSQL *mysql);
|
||||
const char *(*read_statistics)(MYSQL *mysql);
|
||||
my_bool (*next_result)(MYSQL *mysql);
|
||||
int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd);
|
||||
int (*read_rows_from_cursor)(MYSQL_STMT *stmt);
|
||||
} MYSQL_METHODS;
|
||||
MYSQL_STMT * mysql_stmt_init(MYSQL *mysql);
|
||||
int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query,
|
||||
unsigned long length);
|
||||
int mysql_stmt_execute(MYSQL_STMT *stmt);
|
||||
int mysql_stmt_fetch(MYSQL_STMT *stmt);
|
||||
int mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind_arg,
|
||||
unsigned int column,
|
||||
unsigned long offset);
|
||||
int mysql_stmt_store_result(MYSQL_STMT *stmt);
|
||||
unsigned long mysql_stmt_param_count(MYSQL_STMT * stmt);
|
||||
my_bool mysql_stmt_attr_set(MYSQL_STMT *stmt,
|
||||
enum enum_stmt_attr_type attr_type,
|
||||
const void *attr);
|
||||
my_bool mysql_stmt_attr_get(MYSQL_STMT *stmt,
|
||||
enum enum_stmt_attr_type attr_type,
|
||||
void *attr);
|
||||
my_bool mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
|
||||
my_bool mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
|
||||
my_bool mysql_stmt_close(MYSQL_STMT * stmt);
|
||||
my_bool mysql_stmt_reset(MYSQL_STMT * stmt);
|
||||
my_bool mysql_stmt_free_result(MYSQL_STMT *stmt);
|
||||
my_bool mysql_stmt_send_long_data(MYSQL_STMT *stmt,
|
||||
unsigned int param_number,
|
||||
const char *data,
|
||||
unsigned long length);
|
||||
MYSQL_RES * mysql_stmt_result_metadata(MYSQL_STMT *stmt);
|
||||
MYSQL_RES * mysql_stmt_param_metadata(MYSQL_STMT *stmt);
|
||||
unsigned int mysql_stmt_errno(MYSQL_STMT * stmt);
|
||||
const char * mysql_stmt_error(MYSQL_STMT * stmt);
|
||||
const char * mysql_stmt_sqlstate(MYSQL_STMT * stmt);
|
||||
MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT *stmt,
|
||||
MYSQL_ROW_OFFSET offset);
|
||||
MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt);
|
||||
void mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset);
|
||||
my_ulonglong mysql_stmt_num_rows(MYSQL_STMT *stmt);
|
||||
my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt);
|
||||
my_ulonglong mysql_stmt_insert_id(MYSQL_STMT *stmt);
|
||||
unsigned int mysql_stmt_field_count(MYSQL_STMT *stmt);
|
||||
my_bool mysql_commit(MYSQL * mysql);
|
||||
my_bool mysql_rollback(MYSQL * mysql);
|
||||
my_bool mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
|
||||
my_bool mysql_more_results(MYSQL *mysql);
|
||||
int mysql_next_result(MYSQL *mysql);
|
||||
void mysql_close(MYSQL *sock);
|
139
include/mysql/plugin.h.pp
Normal file
139
include/mysql/plugin.h.pp
Normal file
|
@ -0,0 +1,139 @@
|
|||
struct st_mysql_lex_string
|
||||
{
|
||||
char *str;
|
||||
unsigned int length;
|
||||
};
|
||||
typedef struct st_mysql_lex_string MYSQL_LEX_STRING;
|
||||
struct st_mysql_xid {
|
||||
long formatID;
|
||||
long gtrid_length;
|
||||
long bqual_length;
|
||||
char data[128];
|
||||
};
|
||||
typedef struct st_mysql_xid MYSQL_XID;
|
||||
enum enum_mysql_show_type
|
||||
{
|
||||
SHOW_UNDEF, SHOW_BOOL, SHOW_INT, SHOW_LONG,
|
||||
SHOW_LONGLONG, SHOW_CHAR, SHOW_CHAR_PTR,
|
||||
SHOW_ARRAY, SHOW_FUNC, SHOW_DOUBLE
|
||||
};
|
||||
struct st_mysql_show_var {
|
||||
const char *name;
|
||||
char *value;
|
||||
enum enum_mysql_show_type type;
|
||||
};
|
||||
typedef int (*mysql_show_var_func)(void*, struct st_mysql_show_var*, char *);
|
||||
struct st_mysql_sys_var;
|
||||
struct st_mysql_value;
|
||||
typedef int (*mysql_var_check_func)(void* thd,
|
||||
struct st_mysql_sys_var *var,
|
||||
void *save, struct st_mysql_value *value);
|
||||
typedef void (*mysql_var_update_func)(void* thd,
|
||||
struct st_mysql_sys_var *var,
|
||||
void *var_ptr, const void *save);
|
||||
struct st_mysql_plugin
|
||||
{
|
||||
int type;
|
||||
void *info;
|
||||
const char *name;
|
||||
const char *author;
|
||||
const char *descr;
|
||||
int license;
|
||||
int (*init)(void *);
|
||||
int (*deinit)(void *);
|
||||
unsigned int version;
|
||||
struct st_mysql_show_var *status_vars;
|
||||
struct st_mysql_sys_var **system_vars;
|
||||
void * __reserved1;
|
||||
};
|
||||
enum enum_ftparser_mode
|
||||
{
|
||||
MYSQL_FTPARSER_SIMPLE_MODE= 0,
|
||||
MYSQL_FTPARSER_WITH_STOPWORDS= 1,
|
||||
MYSQL_FTPARSER_FULL_BOOLEAN_INFO= 2
|
||||
};
|
||||
enum enum_ft_token_type
|
||||
{
|
||||
FT_TOKEN_EOF= 0,
|
||||
FT_TOKEN_WORD= 1,
|
||||
FT_TOKEN_LEFT_PAREN= 2,
|
||||
FT_TOKEN_RIGHT_PAREN= 3,
|
||||
FT_TOKEN_STOPWORD= 4
|
||||
};
|
||||
typedef struct st_mysql_ftparser_boolean_info
|
||||
{
|
||||
enum enum_ft_token_type type;
|
||||
int yesno;
|
||||
int weight_adjust;
|
||||
char wasign;
|
||||
char trunc;
|
||||
char prev;
|
||||
char *quot;
|
||||
} MYSQL_FTPARSER_BOOLEAN_INFO;
|
||||
typedef struct st_mysql_ftparser_param
|
||||
{
|
||||
int (*mysql_parse)(struct st_mysql_ftparser_param *,
|
||||
char *doc, int doc_len);
|
||||
int (*mysql_add_word)(struct st_mysql_ftparser_param *,
|
||||
char *word, int word_len,
|
||||
MYSQL_FTPARSER_BOOLEAN_INFO *boolean_info);
|
||||
void *ftparser_state;
|
||||
void *mysql_ftparam;
|
||||
struct charset_info_st *cs;
|
||||
char *doc;
|
||||
int length;
|
||||
int flags;
|
||||
enum enum_ftparser_mode mode;
|
||||
} MYSQL_FTPARSER_PARAM;
|
||||
struct st_mysql_ftparser
|
||||
{
|
||||
int interface_version;
|
||||
int (*parse)(MYSQL_FTPARSER_PARAM *param);
|
||||
int (*init)(MYSQL_FTPARSER_PARAM *param);
|
||||
int (*deinit)(MYSQL_FTPARSER_PARAM *param);
|
||||
};
|
||||
struct st_mysql_storage_engine
|
||||
{
|
||||
int interface_version;
|
||||
};
|
||||
struct handlerton;
|
||||
struct st_mysql_daemon
|
||||
{
|
||||
int interface_version;
|
||||
};
|
||||
struct st_mysql_information_schema
|
||||
{
|
||||
int interface_version;
|
||||
};
|
||||
struct st_mysql_value
|
||||
{
|
||||
int (*value_type)(struct st_mysql_value *);
|
||||
const char *(*val_str)(struct st_mysql_value *, char *buffer, int *length);
|
||||
int (*val_real)(struct st_mysql_value *, double *realbuf);
|
||||
int (*val_int)(struct st_mysql_value *, long long *intbuf);
|
||||
};
|
||||
int thd_in_lock_tables(const void* thd);
|
||||
int thd_tablespace_op(const void* thd);
|
||||
long long thd_test_options(const void* thd, long long test_options);
|
||||
int thd_sql_command(const void* thd);
|
||||
const char *thd_proc_info(void* thd, const char *info);
|
||||
void **thd_ha_data(const void* thd, const struct handlerton *hton);
|
||||
int thd_tx_isolation(const void* thd);
|
||||
char *thd_security_context(void* thd, char *buffer, unsigned int length,
|
||||
unsigned int max_query_len);
|
||||
void thd_inc_row_count(void* thd);
|
||||
int mysql_tmpfile(const char *prefix);
|
||||
int thd_killed(const void* thd);
|
||||
unsigned long thd_get_thread_id(const void* thd);
|
||||
void *thd_alloc(void* thd, unsigned int size);
|
||||
void *thd_calloc(void* thd, unsigned int size);
|
||||
char *thd_strdup(void* thd, const char *str);
|
||||
char *thd_strmake(void* thd, const char *str, unsigned int size);
|
||||
void *thd_memdup(void* thd, const void* str, unsigned int size);
|
||||
MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str,
|
||||
const char *str, unsigned int size,
|
||||
int allocate_lex_string);
|
||||
void thd_get_xid(const void* thd, MYSQL_XID *xid);
|
||||
void mysql_query_cache_invalidate4(void* thd,
|
||||
const char *key, unsigned int key_length,
|
||||
int using_trx);
|
1166
include/mysql_h.ic
1166
include/mysql_h.ic
File diff suppressed because it is too large
Load diff
|
@ -89,9 +89,20 @@ BOOL APIENTRY LibMain(HANDLE hInst,DWORD ul_reason_being_called,
|
|||
UNREFERENCED_PARAMETER(lpReserved);
|
||||
} /* LibMain */
|
||||
|
||||
|
||||
static BOOL do_libmain;
|
||||
int __stdcall DllMain(HANDLE hInst,DWORD ul_reason_being_called,LPVOID lpReserved)
|
||||
{
|
||||
/*
|
||||
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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -11,22 +11,15 @@
|
|||
# (otherwise RESET MASTER may come too early).
|
||||
sync_slave_with_master;
|
||||
source include/stop_slave.inc;
|
||||
--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;
|
||||
|
@ -95,14 +88,17 @@ eval create table t2 (n int)ENGINE=$engine_type;
|
|||
insert into t2 values (1);
|
||||
source include/show_binlog_events.inc;
|
||||
--replace_result $VERSION VERSION
|
||||
--replace_regex /file_id=[0-9]+/file_id=#/ /block_len=[0-9]+/block_len=#/ /infile '.+'/infile 'words.dat'/
|
||||
--replace_column 2 # 5 #
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/
|
||||
show binlog events in 'master-bin.000002';
|
||||
show binary logs;
|
||||
sync_slave_with_master;
|
||||
--source include/wait_for_slave_to_start.inc
|
||||
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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -136,7 +136,7 @@ connect (user3,localhost,mysqltest_3,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK);
|
|||
connection user3;
|
||||
select "user3";
|
||||
--replace_result 127.0.0.1 localhost
|
||||
--error ER_COLUMNACCESS_DENIED_ERROR
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
select * from t1;
|
||||
select a from t1;
|
||||
--replace_result 127.0.0.1 localhost
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -435,7 +435,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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
6
mysql-test/r/skip_log_bin.result
Normal file
6
mysql-test/r/skip_log_bin.result
Normal file
|
@ -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;
|
|
@ -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;
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -957,3 +957,42 @@ Warning 1356 View 'test.v1' references invalid table(s) or column(s) or function
|
|||
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;
|
||||
|
|
28
mysql-test/suite/binlog/r/binlog_grant.result
Normal file
28
mysql-test/suite/binlog/r/binlog_grant.result
Normal file
|
@ -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;
|
60
mysql-test/suite/binlog/t/binlog_grant.test
Normal file
60
mysql-test/suite/binlog/t/binlog_grant.test
Normal file
|
@ -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;
|
|
@ -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,ddictpass,information_schema);
|
|||
--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 ORDER BY id;
|
|||
--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_where ORDER BY id;
|
|||
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.processlist;
|
|||
|
||||
|
||||
--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;
|
||||
|
|
|
@ -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_schema Query TIME executing SELECT * FRO
|
|||
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';
|
||||
|
|
|
@ -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_schema Execute TIME executing SELECT * F
|
|||
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';
|
||||
|
|
11
mysql-test/suite/rpl/r/rpl_binlog_query_filter_rules.result
Normal file
11
mysql-test/suite/rpl/r/rpl_binlog_query_filter_rules.result
Normal file
|
@ -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;
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -7,7 +7,7 @@ start slave;
|
|||
include/stop_slave.inc
|
||||
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;
|
||||
|
|
|
@ -7,7 +7,7 @@ start slave;
|
|||
include/stop_slave.inc
|
||||
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;
|
||||
|
|
|
@ -7,7 +7,7 @@ start slave;
|
|||
include/stop_slave.inc
|
||||
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;
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
--replicate-do-db='impossible_database'
|
31
mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules.test
Normal file
31
mysql-test/suite/rpl/t/rpl_binlog_query_filter_rules.test
Normal file
|
@ -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;
|
|
@ -1 +1 @@
|
|||
|
||||
--log-slave-updates
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
--replicate-ignore-table=test.foo
|
|
@ -7,7 +7,7 @@ start slave;
|
|||
include/stop_slave.inc
|
||||
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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
#
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -606,7 +606,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);
|
||||
|
|
|
@ -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.
|
||||
|
|
1
mysql-test/t/skip_log_bin-master.opt
Normal file
1
mysql-test/t/skip_log_bin-master.opt
Normal file
|
@ -0,0 +1 @@
|
|||
--loose-skip-log-bin
|
25
mysql-test/t/skip_log_bin.test
Normal file
25
mysql-test/t/skip_log_bin.test
Normal file
|
@ -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;
|
|
@ -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
|
||||
|
|
|
@ -388,6 +388,22 @@ where id in (select id from t2 as x1 where (t2.cur_date is null));
|
|||
|
||||
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
|
||||
|
|
|
@ -75,4 +75,23 @@ INSERT INTO t1 VALUES(9223372036854775808);
|
|||
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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -339,6 +339,7 @@ mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}"
|
|||
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"
|
||||
|
|
|
@ -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>
|
|
@ -2496,7 +2496,7 @@ void handler::print_keydup_error(uint key_nr, const char *msg)
|
|||
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 errflag)
|
|||
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;
|
||||
|
|
19
sql/item.cc
19
sql/item.cc
|
@ -4120,16 +4120,8 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
|
|||
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_transformer transformer, uchar *args)
|
|||
{
|
||||
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;
|
||||
|
|
|
@ -1029,19 +1029,24 @@ get_datetime_value(THD *thd, Item ***item_arg, Item **cache_arg,
|
|||
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, Item **ref)
|
|||
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;
|
||||
|
|
|
@ -1401,7 +1401,7 @@ class Item_func_regex :public Item_bool_func
|
|||
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) {}
|
||||
|
|
26
sql/log.cc
26
sql/log.cc
|
@ -1421,6 +1421,7 @@ binlog_end_trans(THD *thd, binlog_trx_data *trx_data,
|
|||
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
|
||||
|
@ -3768,6 +3769,31 @@ THD::binlog_set_pending_rows_event(Rows_log_event* ev)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
|
|
|
@ -311,6 +311,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()
|
||||
|
|
|
@ -7843,8 +7843,9 @@ int Table_map_log_event::do_apply_event(Relay_log_info const *rli)
|
|||
|
||||
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));
|
||||
}
|
||||
|
|
10978
sql/mysql_priv.h.pp
Normal file
10978
sql/mysql_priv.h.pp
Normal file
File diff suppressed because it is too large
Load diff
|
@ -1162,6 +1162,21 @@ void fix_slave_exec_mode(enum_var_type type)
|
|||
bit_do_set(slave_exec_mode_options, SLAVE_EXEC_MODE_STRICT);
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_thd_binlog_format::check(THD *thd, set_var *var) {
|
||||
/*
|
||||
All variables that affect writing to binary log (either format or
|
||||
turning logging on and off) use the same checking. We call the
|
||||
superclass ::check function to assign the variable correctly, and
|
||||
then check the value.
|
||||
*/
|
||||
bool result= sys_var_thd_enum::check(thd, var);
|
||||
if (!result)
|
||||
result= check_log_update(thd, var);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
bool sys_var_thd_binlog_format::is_readonly() const
|
||||
{
|
||||
/*
|
||||
|
|
|
@ -1126,6 +1126,7 @@ public:
|
|||
&binlog_format_typelib,
|
||||
fix_binlog_format_after_update)
|
||||
{};
|
||||
bool check(THD *thd, set_var *var);
|
||||
bool is_readonly() const;
|
||||
};
|
||||
|
||||
|
|
|
@ -3092,12 +3092,8 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
|
|||
continue; // Add next user
|
||||
}
|
||||
|
||||
db_name= (table_list->view_db.length ?
|
||||
table_list->view_db.str :
|
||||
table_list->db);
|
||||
table_name= (table_list->view_name.length ?
|
||||
table_list->view_name.str :
|
||||
table_list->table_name);
|
||||
db_name= table_list->get_db_name();
|
||||
table_name= table_list->get_table_name();
|
||||
|
||||
/* Find/create cached table grant */
|
||||
grant_table= table_hash_search(Str->host.str, NullS, db_name,
|
||||
|
@ -3908,7 +3904,7 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
|||
continue; // ok
|
||||
|
||||
if (!(~table->grant.privilege & want_access) ||
|
||||
table->derived || table->schema_table)
|
||||
table->is_anonymous_derived_table() || table->schema_table)
|
||||
{
|
||||
/*
|
||||
It is subquery in the FROM clause. VIEW set table->derived after
|
||||
|
@ -3926,8 +3922,8 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
|||
continue;
|
||||
}
|
||||
if (!(grant_table= table_hash_search(sctx->host, sctx->ip,
|
||||
table->db, sctx->priv_user,
|
||||
table->table_name,0)))
|
||||
table->get_db_name(), sctx->priv_user,
|
||||
table->get_table_name(), FALSE)))
|
||||
{
|
||||
want_access &= ~table->grant.privilege;
|
||||
goto err; // No grants
|
||||
|
@ -3963,7 +3959,7 @@ err:
|
|||
command,
|
||||
sctx->priv_user,
|
||||
sctx->host_or_ip,
|
||||
table ? table->table_name : "unknown");
|
||||
table ? table->get_table_name() : "unknown");
|
||||
}
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
@ -4118,7 +4114,7 @@ bool check_column_grant_in_table_ref(THD *thd, TABLE_LIST * table_ref,
|
|||
@retval 1 Falure
|
||||
@details This function walks over the columns of a table reference
|
||||
The columns may originate from different tables, depending on the kind of
|
||||
table reference, e.g. join.
|
||||
table reference, e.g. join, view.
|
||||
For each table it will retrieve the grant information and will use it
|
||||
to check the required access privileges for the fields requested from it.
|
||||
*/
|
||||
|
@ -4133,6 +4129,11 @@ bool check_grant_all_columns(THD *thd, ulong want_access_arg,
|
|||
GRANT_INFO *grant;
|
||||
/* Initialized only to make gcc happy */
|
||||
GRANT_TABLE *grant_table= NULL;
|
||||
/*
|
||||
Flag that gets set if privilege checking has to be performed on column
|
||||
level.
|
||||
*/
|
||||
bool using_column_privileges= FALSE;
|
||||
|
||||
rw_rdlock(&LOCK_grant);
|
||||
|
||||
|
@ -4140,10 +4141,10 @@ bool check_grant_all_columns(THD *thd, ulong want_access_arg,
|
|||
{
|
||||
const char *field_name= fields->name();
|
||||
|
||||
if (table_name != fields->table_name())
|
||||
if (table_name != fields->get_table_name())
|
||||
{
|
||||
table_name= fields->table_name();
|
||||
db_name= fields->db_name();
|
||||
table_name= fields->get_table_name();
|
||||
db_name= fields->get_db_name();
|
||||
grant= fields->grant();
|
||||
/* get a fresh one for each table */
|
||||
want_access= want_access_arg & ~grant->privilege;
|
||||
|
@ -4169,6 +4170,8 @@ bool check_grant_all_columns(THD *thd, ulong want_access_arg,
|
|||
GRANT_COLUMN *grant_column=
|
||||
column_hash_search(grant_table, field_name,
|
||||
(uint) strlen(field_name));
|
||||
if (grant_column)
|
||||
using_column_privileges= TRUE;
|
||||
if (!grant_column || (~grant_column->rights & want_access))
|
||||
goto err;
|
||||
}
|
||||
|
@ -4181,6 +4184,15 @@ err:
|
|||
|
||||
char command[128];
|
||||
get_privilege_desc(command, sizeof(command), want_access);
|
||||
/*
|
||||
Do not give an error message listing a column name unless the user has
|
||||
privilege to see all columns.
|
||||
*/
|
||||
if (using_column_privileges)
|
||||
my_error(ER_TABLEACCESS_DENIED_ERROR, MYF(0),
|
||||
command, sctx->priv_user,
|
||||
sctx->host_or_ip, table_name);
|
||||
else
|
||||
my_error(ER_COLUMNACCESS_DENIED_ERROR, MYF(0),
|
||||
command,
|
||||
sctx->priv_user,
|
||||
|
|
|
@ -7620,9 +7620,34 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name,
|
|||
continue;
|
||||
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
/* Ensure that we have access rights to all fields to be inserted. */
|
||||
if (!((table && (table->grant.privilege & SELECT_ACL) ||
|
||||
tables->view && (tables->grant.privilege & SELECT_ACL))) &&
|
||||
/*
|
||||
Ensure that we have access rights to all fields to be inserted. Under
|
||||
some circumstances, this check may be skipped.
|
||||
|
||||
- If any_privileges is true, skip the check.
|
||||
|
||||
- If the SELECT privilege has been found as fulfilled already for both
|
||||
the TABLE and TABLE_LIST objects (and both of these exist, of
|
||||
course), the check is skipped.
|
||||
|
||||
- If the SELECT privilege has been found fulfilled for the TABLE object
|
||||
and the TABLE_LIST represents a derived table other than a view (see
|
||||
below), the check is skipped.
|
||||
|
||||
- If the TABLE_LIST object represents a view, we may skip checking if
|
||||
the SELECT privilege has been found fulfilled for it, regardless of
|
||||
the TABLE object.
|
||||
|
||||
- If there is no TABLE object, the test is skipped if either
|
||||
* the TABLE_LIST does not represent a view, or
|
||||
* the SELECT privilege has been found fulfilled.
|
||||
|
||||
A TABLE_LIST that is not a view may be a subquery, an
|
||||
information_schema table, or a nested table reference. See the comment
|
||||
for TABLE_LIST.
|
||||
*/
|
||||
if (!(table && !tables->view && (table->grant.privilege & SELECT_ACL) ||
|
||||
tables->view && (tables->grant.privilege & SELECT_ACL)) &&
|
||||
!any_privileges)
|
||||
{
|
||||
field_iterator.set(tables);
|
||||
|
@ -7676,19 +7701,19 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name,
|
|||
tables->is_natural_join);
|
||||
DBUG_ASSERT(item->type() == Item::FIELD_ITEM);
|
||||
Item_field *fld= (Item_field*) item;
|
||||
const char *field_table_name= field_iterator.table_name();
|
||||
const char *field_table_name= field_iterator.get_table_name();
|
||||
|
||||
if (!tables->schema_table &&
|
||||
!(fld->have_privileges=
|
||||
(get_column_grant(thd, field_iterator.grant(),
|
||||
field_iterator.db_name(),
|
||||
field_iterator.get_db_name(),
|
||||
field_table_name, fld->field_name) &
|
||||
VIEW_ANY_ACL)))
|
||||
{
|
||||
my_error(ER_COLUMNACCESS_DENIED_ERROR, MYF(0), "ANY",
|
||||
my_error(ER_TABLEACCESS_DENIED_ERROR, MYF(0), "ANY",
|
||||
thd->security_ctx->priv_user,
|
||||
thd->security_ctx->host_or_ip,
|
||||
fld->field_name, field_table_name);
|
||||
field_table_name);
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2633,7 +2633,7 @@ Query_cache::register_tables_from_list(TABLE_LIST *tables_used,
|
|||
tables_used;
|
||||
tables_used= tables_used->next_global, n++, block_table++)
|
||||
{
|
||||
if (tables_used->derived && !tables_used->view)
|
||||
if (tables_used->is_anonymous_derived_table())
|
||||
{
|
||||
DBUG_PRINT("qcache", ("derived table skipped"));
|
||||
n--;
|
||||
|
|
|
@ -3502,6 +3502,21 @@ int THD::binlog_delete_row(TABLE* table, bool is_trans,
|
|||
}
|
||||
|
||||
|
||||
int THD::binlog_remove_pending_rows_event(bool clear_maps)
|
||||
{
|
||||
DBUG_ENTER(__FUNCTION__);
|
||||
|
||||
if (!mysql_bin_log.is_open())
|
||||
DBUG_RETURN(0);
|
||||
|
||||
mysql_bin_log.remove_pending_rows_event(this);
|
||||
|
||||
if (clear_maps)
|
||||
binlog_table_maps= 0;
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
int THD::binlog_flush_pending_rows_event(bool stmt_end)
|
||||
{
|
||||
DBUG_ENTER("THD::binlog_flush_pending_rows_event");
|
||||
|
|
|
@ -1379,9 +1379,14 @@ public:
|
|||
Rows_log_event* binlog_get_pending_rows_event() const;
|
||||
void binlog_set_pending_rows_event(Rows_log_event* ev);
|
||||
int binlog_flush_pending_rows_event(bool stmt_end);
|
||||
int binlog_remove_pending_rows_event(bool clear_maps);
|
||||
|
||||
private:
|
||||
uint binlog_table_maps; // Number of table maps currently in the binlog
|
||||
/*
|
||||
Number of outstanding table maps, i.e., table maps in the
|
||||
transaction cache.
|
||||
*/
|
||||
uint binlog_table_maps;
|
||||
|
||||
enum enum_binlog_flag {
|
||||
BINLOG_FLAG_UNSAFE_STMT_PRINTED,
|
||||
|
|
|
@ -73,29 +73,59 @@ out:
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
Create temporary table structure (but do not fill it)
|
||||
/**
|
||||
@brief Create temporary table structure (but do not fill it).
|
||||
|
||||
SYNOPSIS
|
||||
mysql_derived_prepare()
|
||||
thd Thread handle
|
||||
lex LEX for this thread
|
||||
orig_table_list TABLE_LIST for the upper SELECT
|
||||
@param thd Thread handle
|
||||
@param lex LEX for this thread
|
||||
@param orig_table_list TABLE_LIST for the upper SELECT
|
||||
|
||||
IMPLEMENTATION
|
||||
Derived table is resolved with temporary table.
|
||||
@details
|
||||
|
||||
After table creation, the above TABLE_LIST is updated with a new table.
|
||||
This function is called before any command containing derived tables is
|
||||
executed. Currently the function is used for derived tables, i.e.
|
||||
|
||||
This function is called before any command containing derived table
|
||||
is executed.
|
||||
- Anonymous derived tables, or
|
||||
- Named derived tables (aka views) with the @c TEMPTABLE algorithm.
|
||||
|
||||
Derived tables is stored in thd->derived_tables and freed in
|
||||
close_thread_tables()
|
||||
The table reference, contained in @c orig_table_list, is updated with the
|
||||
fields of a new temporary table.
|
||||
|
||||
RETURN
|
||||
FALSE OK
|
||||
TRUE Error
|
||||
Derived tables are stored in @c thd->derived_tables and closed by
|
||||
close_thread_tables().
|
||||
|
||||
This function is part of the procedure that starts in
|
||||
open_and_lock_tables(), a procedure that - among other things - introduces
|
||||
new table and table reference objects (to represent derived tables) that
|
||||
don't exist in the privilege database. This means that normal privilege
|
||||
checking cannot handle them. Hence this function does some extra tricks in
|
||||
order to bypass normal privilege checking, by exploiting the fact that the
|
||||
current state of privilege verification is attached as GRANT_INFO structures
|
||||
on the relevant TABLE and TABLE_REF objects.
|
||||
|
||||
For table references, the current state of accrued access is stored inside
|
||||
TABLE_LIST::grant. Hence this function must update the state of fulfilled
|
||||
privileges for the new TABLE_LIST, an operation which is normally performed
|
||||
exclusively by the table and database access checking functions,
|
||||
check_access() and check_grant(), respectively. This modification is done
|
||||
for both views and anonymous derived tables: The @c SELECT privilege is set
|
||||
as fulfilled by the user. However, if a view is referenced and the table
|
||||
reference is queried against directly (see TABLE_LIST::referencing_view),
|
||||
the state of privilege checking (GRANT_INFO struct) is copied as-is to the
|
||||
temporary table.
|
||||
|
||||
This function implements a signature called "derived table processor", and
|
||||
is passed as a function pointer to mysql_handle_derived().
|
||||
|
||||
@note This function sets @c SELECT_ACL for @c TEMPTABLE views as well as
|
||||
anonymous derived tables, but this is ok since later access checking will
|
||||
distinguish between them.
|
||||
|
||||
@see mysql_handle_derived(), mysql_derived_filling(), GRANT_INFO
|
||||
|
||||
@return
|
||||
false OK
|
||||
true Error
|
||||
*/
|
||||
|
||||
bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *orig_table_list)
|
||||
|
|
|
@ -3067,6 +3067,7 @@ bool select_insert::send_data(List<Item> &values)
|
|||
}
|
||||
|
||||
error= write_record(thd, table, &info);
|
||||
table->auto_increment_field_not_null= FALSE;
|
||||
|
||||
if (!error)
|
||||
{
|
||||
|
@ -3523,7 +3524,8 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
|
|||
temporary table, we need to start a statement transaction.
|
||||
*/
|
||||
if ((thd->lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) == 0 &&
|
||||
thd->current_stmt_binlog_row_based)
|
||||
thd->current_stmt_binlog_row_based &&
|
||||
mysql_bin_log.is_open())
|
||||
{
|
||||
thd->binlog_start_trans_and_stmt();
|
||||
}
|
||||
|
@ -3620,6 +3622,7 @@ select_create::binlog_show_create_table(TABLE **tables, uint count)
|
|||
/* show_database */ TRUE);
|
||||
DBUG_ASSERT(result == 0); /* store_create_info() always return 0 */
|
||||
|
||||
if (mysql_bin_log.is_open())
|
||||
thd->binlog_query(THD::STMT_QUERY_TYPE,
|
||||
query.ptr(), query.length(),
|
||||
/* is_trans */ TRUE,
|
||||
|
|
|
@ -2083,12 +2083,14 @@ mysql_execute_command(THD *thd)
|
|||
#endif
|
||||
case SQLCOM_SHOW_STATUS_PROC:
|
||||
case SQLCOM_SHOW_STATUS_FUNC:
|
||||
if (!(res= check_table_access(thd, SELECT_ACL, all_tables, UINT_MAX, FALSE)))
|
||||
res= execute_sqlcom_select(thd, all_tables);
|
||||
break;
|
||||
case SQLCOM_SHOW_STATUS:
|
||||
{
|
||||
system_status_var old_status_var= thd->status_var;
|
||||
thd->initial_status_var= &old_status_var;
|
||||
if (!(res= check_table_access(thd, SELECT_ACL, all_tables, UINT_MAX, FALSE)))
|
||||
res= execute_sqlcom_select(thd, all_tables);
|
||||
/* Don't log SHOW STATUS commands to slow query log */
|
||||
thd->server_status&= ~(SERVER_QUERY_NO_INDEX_USED |
|
||||
|
@ -4872,6 +4874,8 @@ bool check_single_table_access(THD *thd, ulong privilege,
|
|||
/* Show only 1 table for check_grant */
|
||||
if (!(all_tables->belong_to_view &&
|
||||
(thd->lex->sql_command == SQLCOM_SHOW_FIELDS)) &&
|
||||
!(all_tables->view &&
|
||||
all_tables->effective_algorithm == VIEW_ALGORITHM_TMPTABLE) &&
|
||||
check_grant(thd, privilege, all_tables, 0, 1, no_errors))
|
||||
goto deny;
|
||||
|
||||
|
@ -5184,7 +5188,7 @@ check_table_access(THD *thd, ulong want_access,TABLE_LIST *tables,
|
|||
continue;
|
||||
}
|
||||
|
||||
if (tables->derived ||
|
||||
if (tables->is_anonymous_derived_table() ||
|
||||
(tables->table && (int)tables->table->s->tmp_table))
|
||||
continue;
|
||||
thd->security_ctx= sctx;
|
||||
|
@ -5194,12 +5198,14 @@ check_table_access(THD *thd, ulong want_access,TABLE_LIST *tables,
|
|||
tables->grant.privilege= want_access;
|
||||
else if (tables->db && thd->db && strcmp(tables->db, thd->db) == 0)
|
||||
{
|
||||
if (check_access(thd,want_access,tables->db,&tables->grant.privilege,
|
||||
0, no_errors, test(tables->schema_table)))
|
||||
if (check_access(thd, want_access, tables->get_db_name(),
|
||||
&tables->grant.privilege, 0, no_errors,
|
||||
test(tables->schema_table)))
|
||||
goto deny; // Access denied
|
||||
}
|
||||
else if (check_access(thd,want_access,tables->db,&tables->grant.privilege,
|
||||
0, no_errors, test(tables->schema_table)))
|
||||
else if (check_access(thd, want_access, tables->get_db_name(),
|
||||
&tables->grant.privilege, 0, no_errors,
|
||||
test(tables->schema_table)))
|
||||
goto deny;
|
||||
}
|
||||
thd->security_ctx= backup_ctx;
|
||||
|
|
|
@ -10105,8 +10105,6 @@ show_param:
|
|||
{
|
||||
LEX *lex= Lex;
|
||||
lex->sql_command= SQLCOM_SHOW_STATUS_PROC;
|
||||
if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ))
|
||||
MYSQL_YYABORT;
|
||||
if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
|
@ -10114,8 +10112,6 @@ show_param:
|
|||
{
|
||||
LEX *lex= Lex;
|
||||
lex->sql_command= SQLCOM_SHOW_STATUS_FUNC;
|
||||
if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ))
|
||||
MYSQL_YYABORT;
|
||||
if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
|
|
31
sql/table.cc
31
sql/table.cc
|
@ -2993,16 +2993,27 @@ void TABLE_LIST::calc_md5(char *buffer)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
set underlying TABLE for table place holder of VIEW
|
||||
/**
|
||||
@brief Set underlying table for table place holder of view.
|
||||
|
||||
DESCRIPTION
|
||||
Replace all views that only uses one table with the table itself.
|
||||
This allows us to treat the view as a simple table and even update
|
||||
it (it is a kind of optimisation)
|
||||
@details
|
||||
|
||||
SYNOPSIS
|
||||
TABLE_LIST::set_underlying_merge()
|
||||
Replace all views that only use one table with the table itself. This
|
||||
allows us to treat the view as a simple table and even update it (it is a
|
||||
kind of optimization).
|
||||
|
||||
@note
|
||||
|
||||
This optimization is potentially dangerous as it makes views
|
||||
masquerade as base tables: Views don't have the pointer TABLE_LIST::table
|
||||
set to non-@c NULL.
|
||||
|
||||
We may have the case where a view accesses tables not normally accessible
|
||||
in the current Security_context (only in the definer's
|
||||
Security_context). According to the table's GRANT_INFO (TABLE::grant),
|
||||
access is fulfilled, but this is implicitly meant in the definer's security
|
||||
context. Hence we must never look at only a TABLE's GRANT_INFO without
|
||||
looking at the one of the referring TABLE_LIST.
|
||||
*/
|
||||
|
||||
void TABLE_LIST::set_underlying_merge()
|
||||
|
@ -4082,7 +4093,7 @@ void Field_iterator_table_ref::next()
|
|||
}
|
||||
|
||||
|
||||
const char *Field_iterator_table_ref::table_name()
|
||||
const char *Field_iterator_table_ref::get_table_name()
|
||||
{
|
||||
if (table_ref->view)
|
||||
return table_ref->view_name.str;
|
||||
|
@ -4095,7 +4106,7 @@ const char *Field_iterator_table_ref::table_name()
|
|||
}
|
||||
|
||||
|
||||
const char *Field_iterator_table_ref::db_name()
|
||||
const char *Field_iterator_table_ref::get_db_name()
|
||||
{
|
||||
if (table_ref->view)
|
||||
return table_ref->view_db.str;
|
||||
|
|
117
sql/table.h
117
sql/table.h
|
@ -66,13 +66,63 @@ typedef struct st_order {
|
|||
table_map used, depend_map;
|
||||
} ORDER;
|
||||
|
||||
/**
|
||||
@brief The current state of the privilege checking process for the current
|
||||
user, SQL statement and SQL object.
|
||||
|
||||
@details The privilege checking process is divided into phases depending on
|
||||
the level of the privilege to be checked and the type of object to be
|
||||
accessed. Due to the mentioned scattering of privilege checking
|
||||
functionality, it is necessary to keep track of the state of the
|
||||
process. This information is stored in privilege, want_privilege, and
|
||||
orig_want_privilege.
|
||||
|
||||
A GRANT_INFO also serves as a cache of the privilege hash tables. Relevant
|
||||
members are grant_table and version.
|
||||
*/
|
||||
typedef struct st_grant_info
|
||||
{
|
||||
/**
|
||||
@brief A copy of the privilege information regarding the current host,
|
||||
database, object and user.
|
||||
|
||||
@details The version of this copy is found in GRANT_INFO::version.
|
||||
*/
|
||||
GRANT_TABLE *grant_table;
|
||||
/**
|
||||
@brief Used for cache invalidation when caching privilege information.
|
||||
|
||||
@details The privilege information is stored on disk, with dedicated
|
||||
caches residing in memory: table-level and column-level privileges,
|
||||
respectively, have their own dedicated caches.
|
||||
|
||||
The GRANT_INFO works as a level 1 cache with this member updated to the
|
||||
current value of the global variable @c grant_version (@c static variable
|
||||
in sql_acl.cc). It is updated Whenever the GRANT_INFO is refreshed from
|
||||
the level 2 cache. The level 2 cache is the @c column_priv_hash structure
|
||||
(@c static variable in sql_acl.cc)
|
||||
|
||||
@see grant_version
|
||||
*/
|
||||
uint version;
|
||||
/**
|
||||
@brief The set of privileges that the current user has fulfilled for a
|
||||
certain host, database, and object.
|
||||
|
||||
@details This field is continually updated throughout the access checking
|
||||
process. In each step the "wanted privilege" is checked against the
|
||||
fulfilled privileges. When/if the intersection of these sets is empty,
|
||||
access is granted.
|
||||
|
||||
The set is implemented as a bitmap, with the bits defined in sql_acl.h.
|
||||
*/
|
||||
ulong privilege;
|
||||
/**
|
||||
@brief the set of privileges that the current user needs to fulfil in
|
||||
order to carry out the requested operation.
|
||||
*/
|
||||
ulong want_privilege;
|
||||
/*
|
||||
/**
|
||||
Stores the requested access acl of top level tables list. Is used to
|
||||
check access rights to the underlying tables of a view.
|
||||
*/
|
||||
|
@ -1104,6 +1154,27 @@ struct TABLE_LIST
|
|||
can see this lists can't be merged)
|
||||
*/
|
||||
TABLE_LIST *correspondent_table;
|
||||
/**
|
||||
@brief Normally, this field is non-null for anonymous derived tables only.
|
||||
|
||||
@details This field is set to non-null for
|
||||
|
||||
- Anonymous derived tables, In this case it points to the SELECT_LEX_UNIT
|
||||
representing the derived table. E.g. for a query
|
||||
|
||||
@verbatim SELECT * FROM (SELECT a FROM t1) b @endverbatim
|
||||
|
||||
For the @c TABLE_LIST representing the derived table @c b, @c derived
|
||||
points to the SELECT_LEX_UNIT representing the result of the query within
|
||||
parenteses.
|
||||
|
||||
- Views. This is set for views with @verbatim ALGORITHM = TEMPTABLE
|
||||
@endverbatim by mysql_make_view().
|
||||
|
||||
@note Inside views, a subquery in the @c FROM clause is not allowed.
|
||||
@note Do not use this field to separate views/base tables/anonymous
|
||||
derived tables. Use TABLE_LIST::is_anonymous_derived_table().
|
||||
*/
|
||||
st_select_lex_unit *derived; /* SELECT_LEX_UNIT of derived table */
|
||||
ST_SCHEMA_TABLE *schema_table; /* Information_schema table */
|
||||
st_select_lex *schema_select_lex;
|
||||
|
@ -1169,7 +1240,15 @@ struct TABLE_LIST
|
|||
ulonglong file_version; /* version of file's field set */
|
||||
ulonglong updatable_view; /* VIEW can be updated */
|
||||
ulonglong revision; /* revision control number */
|
||||
ulonglong algorithm; /* 0 any, 1 tmp tables , 2 merging */
|
||||
/**
|
||||
@brief The declared algorithm, if this is a view.
|
||||
@details One of
|
||||
- VIEW_ALGORITHM_UNDEFINED
|
||||
- VIEW_ALGORITHM_TMPTABLE
|
||||
- VIEW_ALGORITHM_MERGE
|
||||
@to do Replace with an enum
|
||||
*/
|
||||
ulonglong algorithm;
|
||||
ulonglong view_suid; /* view is suid (TRUE dy default) */
|
||||
ulonglong with_check; /* WITH CHECK OPTION */
|
||||
/*
|
||||
|
@ -1177,7 +1256,15 @@ struct TABLE_LIST
|
|||
algorithm)
|
||||
*/
|
||||
uint8 effective_with_check;
|
||||
uint8 effective_algorithm; /* which algorithm was really used */
|
||||
/**
|
||||
@brief The view algorithm that is actually used, if this is a view.
|
||||
@details One of
|
||||
- VIEW_ALGORITHM_UNDEFINED
|
||||
- VIEW_ALGORITHM_TMPTABLE
|
||||
- VIEW_ALGORITHM_MERGE
|
||||
@to do Replace with an enum
|
||||
*/
|
||||
uint8 effective_algorithm;
|
||||
GRANT_INFO grant;
|
||||
/* data need by some engines in query cache*/
|
||||
ulonglong engine_data;
|
||||
|
@ -1362,6 +1449,26 @@ struct TABLE_LIST
|
|||
m_table_ref_version= s->get_table_ref_version();
|
||||
}
|
||||
|
||||
/**
|
||||
@brief True if this TABLE_LIST represents an anonymous derived table,
|
||||
i.e. the result of a subquery.
|
||||
*/
|
||||
bool is_anonymous_derived_table() const { return derived && !view; }
|
||||
|
||||
/**
|
||||
@brief Returns the name of the database that the referenced table belongs
|
||||
to.
|
||||
*/
|
||||
char *get_db_name() { return view != NULL ? view_db.str : db; }
|
||||
|
||||
/**
|
||||
@brief Returns the name of the table that this TABLE_LIST represents.
|
||||
|
||||
@details The unqualified table name or view name for a table or view,
|
||||
respectively.
|
||||
*/
|
||||
char *get_table_name() { return view != NULL ? view_name.str : table_name; }
|
||||
|
||||
private:
|
||||
bool prep_check_option(THD *thd, uint8 check_opt_type);
|
||||
bool prep_where(THD *thd, Item **conds, bool no_where_clause);
|
||||
|
@ -1491,8 +1598,8 @@ public:
|
|||
bool end_of_fields()
|
||||
{ return (table_ref == last_leaf && field_it->end_of_fields()); }
|
||||
const char *name() { return field_it->name(); }
|
||||
const char *table_name();
|
||||
const char *db_name();
|
||||
const char *get_table_name();
|
||||
const char *get_db_name();
|
||||
GRANT_INFO *grant();
|
||||
Item *create_item(THD *thd) { return field_it->create_item(thd); }
|
||||
Field *field() { return field_it->field(); }
|
||||
|
|
18
win/build-vs9.bat
Normal file
18
win/build-vs9.bat
Normal file
|
@ -0,0 +1,18 @@
|
|||
@echo off
|
||||
|
||||
REM Copyright (C) 2006 MySQL AB
|
||||
REM
|
||||
REM This program is free software; you can redistribute it and/or modify
|
||||
REM it under the terms of the GNU General Public License as published by
|
||||
REM the Free Software Foundation; version 2 of the License.
|
||||
REM
|
||||
REM This program is distributed in the hope that it will be useful,
|
||||
REM but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
REM GNU General Public License for more details.
|
||||
REM
|
||||
REM You should have received a copy of the GNU General Public License
|
||||
REM along with this program; if not, write to the Free Software
|
||||
REM Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
cmake -G "Visual Studio 9 2008"
|
||||
|
18
win/build-vs9_x64.bat
Normal file
18
win/build-vs9_x64.bat
Normal file
|
@ -0,0 +1,18 @@
|
|||
@echo off
|
||||
|
||||
REM Copyright (C) 2006 MySQL AB
|
||||
REM
|
||||
REM This program is free software; you can redistribute it and/or modify
|
||||
REM it under the terms of the GNU General Public License as published by
|
||||
REM the Free Software Foundation; version 2 of the License.
|
||||
REM
|
||||
REM This program is distributed in the hope that it will be useful,
|
||||
REM but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
REM GNU General Public License for more details.
|
||||
REM
|
||||
REM You should have received a copy of the GNU General Public License
|
||||
REM along with this program; if not, write to the Free Software
|
||||
REM Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
cmake -G "Visual Studio 9 2008 Win64"
|
||||
|
|
@ -194,7 +194,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
|||
# ifdef __TURBOC__
|
||||
# define NO_vsnprintf
|
||||
# endif
|
||||
# ifdef WIN32
|
||||
# if defined(WIN32) && (!defined(_MSC_VER) || _MSC_VER < 1500)
|
||||
/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
|
||||
# if !defined(vsnprintf) && !defined(NO_vsnprintf)
|
||||
# define vsnprintf _vsnprintf
|
||||
|
|
Loading…
Reference in a new issue