mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge 10.3 into 10.4
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@ -94,7 +94,6 @@ packaging/rpm-oel/mysql.spec
|
|||||||
packaging/rpm-uln/mysql.10.0.11.spec
|
packaging/rpm-uln/mysql.10.0.11.spec
|
||||||
packaging/solaris/postinstall-solaris
|
packaging/solaris/postinstall-solaris
|
||||||
pcre/config.h
|
pcre/config.h
|
||||||
pcre/pcre*test.sh
|
|
||||||
pcre/pcre.h
|
pcre/pcre.h
|
||||||
pcre/pcre_chartables.c
|
pcre/pcre_chartables.c
|
||||||
pcre/pcregrep
|
pcre/pcregrep
|
||||||
|
@ -14,22 +14,10 @@
|
|||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.3)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7)
|
||||||
|
|
||||||
# explicitly set the policy to OLD
|
|
||||||
# (cannot use NEW, not everyone is on cmake-2.8.12 yet)
|
|
||||||
IF(POLICY CMP0022)
|
IF(POLICY CMP0022)
|
||||||
CMAKE_POLICY(SET CMP0022 OLD)
|
CMAKE_POLICY(SET CMP0022 NEW)
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
# We use the LOCATION target property (CMP0026)
|
|
||||||
# and get_target_property() for non-existent targets (CMP0045)
|
|
||||||
# and INSTALL_NAME_DIR (CMP0042)
|
|
||||||
IF(CMAKE_VERSION VERSION_EQUAL "3.0.0" OR
|
|
||||||
CMAKE_VERSION VERSION_GREATER "3.0.0")
|
|
||||||
CMAKE_POLICY(SET CMP0026 OLD)
|
|
||||||
CMAKE_POLICY(SET CMP0045 OLD)
|
|
||||||
CMAKE_POLICY(SET CMP0042 OLD)
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(POLICY CMP0054)
|
IF(POLICY CMP0054)
|
||||||
CMAKE_POLICY(SET CMP0054 NEW)
|
CMAKE_POLICY(SET CMP0054 NEW)
|
||||||
@ -181,6 +169,12 @@ IF(UNIX)
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
OPTION (WITH_UNIT_TESTS "Compile MySQL with unit tests" ON)
|
OPTION (WITH_UNIT_TESTS "Compile MySQL with unit tests" ON)
|
||||||
|
|
||||||
|
IF (WITHOUT_SERVER)
|
||||||
|
SET (SKIP_COMPONENTS "Server|IniFiles|SuportFiles|Readme")
|
||||||
|
ELSE()
|
||||||
|
SET (SKIP_COMPONENTS "N-O-N-E")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
OPTION(NOT_FOR_DISTRIBUTION "Allow linking with GPLv2-incompatible system libraries. Only set it you never plan to distribute the resulting binaries" OFF)
|
OPTION(NOT_FOR_DISTRIBUTION "Allow linking with GPLv2-incompatible system libraries. Only set it you never plan to distribute the resulting binaries" OFF)
|
||||||
|
|
||||||
INCLUDE(check_compiler_flag)
|
INCLUDE(check_compiler_flag)
|
||||||
@ -445,7 +439,7 @@ CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/include/mysql_version.h.in
|
|||||||
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/sql/sql_builtin.cc.in
|
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/sql/sql_builtin.cc.in
|
||||||
${CMAKE_BINARY_DIR}/sql/sql_builtin.cc)
|
${CMAKE_BINARY_DIR}/sql/sql_builtin.cc)
|
||||||
|
|
||||||
IF(GIT_EXECUTABLE)
|
IF(GIT_EXECUTABLE AND EXISTS ${PROJECT_SOURCE_DIR}/.git)
|
||||||
EXECUTE_PROCESS(
|
EXECUTE_PROCESS(
|
||||||
COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
|
COMMAND ${GIT_EXECUTABLE} rev-parse HEAD
|
||||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||||
|
@ -82,7 +82,7 @@ ulong bytes_sent = 0L, bytes_received = 0L;
|
|||||||
ulong mysqld_net_retry_count = 10L;
|
ulong mysqld_net_retry_count = 10L;
|
||||||
ulong open_files_limit;
|
ulong open_files_limit;
|
||||||
ulong opt_binlog_rows_event_max_size;
|
ulong opt_binlog_rows_event_max_size;
|
||||||
uint test_flags = 0;
|
ulonglong test_flags = 0;
|
||||||
static uint opt_protocol= 0;
|
static uint opt_protocol= 0;
|
||||||
static FILE *result_file;
|
static FILE *result_file;
|
||||||
static char *result_file_name= 0;
|
static char *result_file_name= 0;
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
find_path(
|
|
||||||
ZSTD_INCLUDE_DIR
|
|
||||||
NAMES "zstd.h"
|
|
||||||
)
|
|
||||||
|
|
||||||
find_library(
|
|
||||||
ZSTD_LIBRARY
|
|
||||||
NAMES zstd
|
|
||||||
)
|
|
||||||
|
|
||||||
set(ZSTD_LIBRARIES ${ZSTD_LIBRARY})
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(
|
|
||||||
ZSTD DEFAULT_MSG ZSTD_INCLUDE_DIR ZSTD_LIBRARIES)
|
|
||||||
|
|
||||||
mark_as_advanced(ZSTD_INCLUDE_DIR ZSTD_LIBRARIES ZSTD_FOUND)
|
|
||||||
|
|
25
cmake/Findzstd.cmake
Normal file
25
cmake/Findzstd.cmake
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# - Find zstd
|
||||||
|
# Find the zstd compression library and includes
|
||||||
|
#
|
||||||
|
# ZSTD_INCLUDE_DIR - where to find zstd.h, etc.
|
||||||
|
# ZSTD_LIBRARIES - List of libraries when using zstd.
|
||||||
|
# ZSTD_FOUND - True if zstd found.
|
||||||
|
|
||||||
|
if (DEFINED ZSTD_LIBRARIES)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_path(ZSTD_INCLUDE_DIR
|
||||||
|
NAMES zstd.h
|
||||||
|
HINTS ${ZSTD_ROOT_DIR}/include)
|
||||||
|
|
||||||
|
find_library(ZSTD_LIBRARIES
|
||||||
|
NAMES zstd
|
||||||
|
HINTS ${ZSTD_ROOT_DIR}/lib)
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(zstd DEFAULT_MSG ZSTD_LIBRARIES ZSTD_INCLUDE_DIR)
|
||||||
|
|
||||||
|
mark_as_advanced(
|
||||||
|
ZSTD_LIBRARIES
|
||||||
|
ZSTD_INCLUDE_DIR)
|
@ -14,11 +14,6 @@
|
|||||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
# This script creates initial database for packaging on Windows
|
# This script creates initial database for packaging on Windows
|
||||||
SET(CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@")
|
|
||||||
SET(CMAKE_CURRENT_BINARY_DIR "@CMAKE_CURRENT_BINARY_DIR@")
|
|
||||||
SET(MYSQLD_EXECUTABLE "@MYSQLD_EXECUTABLE@")
|
|
||||||
SET(CMAKE_CFG_INTDIR "@CMAKE_CFG_INTDIR@")
|
|
||||||
SET(WIN32 "@WIN32@")
|
|
||||||
# Force Visual Studio to output to stdout
|
# Force Visual Studio to output to stdout
|
||||||
IF(ENV{VS_UNICODE_OUTPUT})
|
IF(ENV{VS_UNICODE_OUTPUT})
|
||||||
SET ($ENV{VS_UNICODE_OUTPUT})
|
SET ($ENV{VS_UNICODE_OUTPUT})
|
||||||
@ -32,30 +27,27 @@ ENDIF()
|
|||||||
# Create bootstrapper SQL script
|
# Create bootstrapper SQL script
|
||||||
FILE(WRITE bootstrap.sql "use mysql;\n" )
|
FILE(WRITE bootstrap.sql "use mysql;\n" )
|
||||||
FOREACH(FILENAME mysql_system_tables.sql mysql_system_tables_data.sql mysql_performance_tables.sql)
|
FOREACH(FILENAME mysql_system_tables.sql mysql_system_tables_data.sql mysql_performance_tables.sql)
|
||||||
FILE(STRINGS ${CMAKE_SOURCE_DIR}/scripts/${FILENAME} CONTENTS)
|
FILE(STRINGS ${TOP_SRCDIR}/scripts/${FILENAME} CONTENTS)
|
||||||
FOREACH(STR ${CONTENTS})
|
FOREACH(STR ${CONTENTS})
|
||||||
IF(NOT STR MATCHES "@current_hostname")
|
IF(NOT STR MATCHES "@current_hostname")
|
||||||
FILE(APPEND bootstrap.sql "${STR}\n")
|
FILE(APPEND bootstrap.sql "${STR}\n")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDFOREACH()
|
ENDFOREACH()
|
||||||
ENDFOREACH()
|
ENDFOREACH()
|
||||||
FILE(READ ${CMAKE_SOURCE_DIR}/scripts/fill_help_tables.sql CONTENTS)
|
FILE(READ ${TOP_SRCDIR}/scripts/fill_help_tables.sql CONTENTS)
|
||||||
FILE(APPEND bootstrap.sql "${CONTENTS}")
|
FILE(APPEND bootstrap.sql "${CONTENTS}")
|
||||||
|
|
||||||
FILE(REMOVE_RECURSE mysql performance_schema)
|
FILE(REMOVE_RECURSE mysql performance_schema)
|
||||||
FILE(REMOVE ibdata1 ib_logfile0 ib_logfile1)
|
FILE(REMOVE ibdata1 ib_logfile0 ib_logfile1)
|
||||||
|
|
||||||
MAKE_DIRECTORY(mysql)
|
MAKE_DIRECTORY(mysql)
|
||||||
IF(WIN32)
|
|
||||||
SET(CONSOLE --console)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
SET(BOOTSTRAP_COMMAND
|
SET(BOOTSTRAP_COMMAND
|
||||||
${MYSQLD_EXECUTABLE}
|
${MYSQLD_EXECUTABLE}
|
||||||
--no-defaults
|
--no-defaults
|
||||||
${CONSOLE}
|
--console
|
||||||
--bootstrap
|
--bootstrap
|
||||||
--lc-messages-dir=${CMAKE_CURRENT_BINARY_DIR}/share
|
--lc-messages-dir=${BINDIR}/share
|
||||||
--basedir=.
|
--basedir=.
|
||||||
--datadir=.
|
--datadir=.
|
||||||
--default-storage-engine=MyISAM
|
--default-storage-engine=MyISAM
|
||||||
@ -65,10 +57,10 @@ SET(BOOTSTRAP_COMMAND
|
|||||||
|
|
||||||
GET_FILENAME_COMPONENT(CWD . ABSOLUTE)
|
GET_FILENAME_COMPONENT(CWD . ABSOLUTE)
|
||||||
EXECUTE_PROCESS(
|
EXECUTE_PROCESS(
|
||||||
COMMAND "@CMAKE_COMMAND@" -E echo Executing ${BOOTSTRAP_COMMAND}
|
COMMAND "${CMAKE_COMMAND}" -E echo Executing ${BOOTSTRAP_COMMAND}
|
||||||
)
|
)
|
||||||
EXECUTE_PROCESS (
|
EXECUTE_PROCESS (
|
||||||
COMMAND "@CMAKE_COMMAND@" -E
|
COMMAND "${CMAKE_COMMAND}" -E
|
||||||
echo input file bootstrap.sql, current directory ${CWD}
|
echo input file bootstrap.sql, current directory ${CWD}
|
||||||
)
|
)
|
||||||
EXECUTE_PROCESS (
|
EXECUTE_PROCESS (
|
@ -46,6 +46,10 @@ MACRO(CHECK_DTRACE)
|
|||||||
AND NOT CMAKE_SYSTEM_NAME MATCHES "SunOS")
|
AND NOT CMAKE_SYSTEM_NAME MATCHES "SunOS")
|
||||||
SET(ENABLE_DTRACE ON CACHE BOOL "Enable dtrace")
|
SET(ENABLE_DTRACE ON CACHE BOOL "Enable dtrace")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
# On GNU/Hurd, dtrace is not supported
|
||||||
|
IF(DTRACE AND CMAKE_SYSTEM_NAME MATCHES "GNU")
|
||||||
|
SET(ENABLE_DTRACE OFF CACHE BOOL "Disable dtrace")
|
||||||
|
ENDIF()
|
||||||
SET(HAVE_DTRACE ${ENABLE_DTRACE})
|
SET(HAVE_DTRACE ${ENABLE_DTRACE})
|
||||||
IF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
|
IF(CMAKE_SYSTEM_NAME MATCHES "SunOS")
|
||||||
IF(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
IF(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||||||
|
@ -11,9 +11,6 @@ SET(LIBS "")
|
|||||||
IF(POLICY CMP0011)
|
IF(POLICY CMP0011)
|
||||||
CMAKE_POLICY(SET CMP0011 NEW)
|
CMAKE_POLICY(SET CMP0011 NEW)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(POLICY CMP0007)
|
|
||||||
CMAKE_POLICY(SET CMP0007 OLD)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
# Extract dependencies using CMake's internal ${target}_LIB_DEPENDS variable
|
# Extract dependencies using CMake's internal ${target}_LIB_DEPENDS variable
|
||||||
# returned string in ${var} is can be passed to linker's command line
|
# returned string in ${var} is can be passed to linker's command line
|
||||||
|
@ -115,7 +115,12 @@ FUNCTION(INSTALL_SCRIPT)
|
|||||||
SET(COMP)
|
SET(COMP)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF (COMP MATCHES ${SKIP_COMPONENTS})
|
||||||
|
RETURN()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
INSTALL(PROGRAMS ${script} DESTINATION ${ARG_DESTINATION} ${COMP})
|
INSTALL(PROGRAMS ${script} DESTINATION ${ARG_DESTINATION} ${COMP})
|
||||||
|
|
||||||
INSTALL_MANPAGE(${script})
|
INSTALL_MANPAGE(${script})
|
||||||
ENDFUNCTION()
|
ENDFUNCTION()
|
||||||
|
|
||||||
@ -132,6 +137,10 @@ FUNCTION(INSTALL_DOCUMENTATION)
|
|||||||
SET(destination ${INSTALL_DOCDIR})
|
SET(destination ${INSTALL_DOCDIR})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
IF (ARG_COMPONENT MATCHES ${SKIP_COMPONENTS})
|
||||||
|
RETURN()
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
STRING(TOUPPER ${ARG_COMPONENT} COMPUP)
|
STRING(TOUPPER ${ARG_COMPONENT} COMPUP)
|
||||||
IF(CPACK_COMPONENT_${COMPUP}_GROUP)
|
IF(CPACK_COMPONENT_${COMPUP}_GROUP)
|
||||||
SET(group ${CPACK_COMPONENT_${COMPUP}_GROUP})
|
SET(group ${CPACK_COMPONENT_${COMPUP}_GROUP})
|
||||||
@ -150,21 +159,17 @@ ENDFUNCTION()
|
|||||||
|
|
||||||
|
|
||||||
# Install symbolic link to CMake target.
|
# Install symbolic link to CMake target.
|
||||||
# the link is created in the same directory as target
|
# the link is created in the current build directory
|
||||||
# and extension will be the same as for target file.
|
# and extension will be the same as for target file.
|
||||||
MACRO(INSTALL_SYMLINK linkname target destination component)
|
MACRO(INSTALL_SYMLINK linkname target destination component)
|
||||||
IF(UNIX)
|
IF(UNIX)
|
||||||
GET_TARGET_PROPERTY(location ${target} LOCATION)
|
SET(output ${CMAKE_CURRENT_BINARY_DIR}/${linkname})
|
||||||
GET_FILENAME_COMPONENT(path ${location} PATH)
|
|
||||||
GET_FILENAME_COMPONENT(name ${location} NAME)
|
|
||||||
SET(output ${path}/${linkname})
|
|
||||||
ADD_CUSTOM_COMMAND(
|
ADD_CUSTOM_COMMAND(
|
||||||
OUTPUT ${output}
|
OUTPUT ${output}
|
||||||
COMMAND ${CMAKE_COMMAND} ARGS -E remove -f ${output}
|
COMMAND ${CMAKE_COMMAND} ARGS -E remove -f ${linkname}
|
||||||
COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink
|
COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink
|
||||||
${name}
|
$<TARGET_FILE_NAME:${target}>
|
||||||
${linkname}
|
${linkname}
|
||||||
WORKING_DIRECTORY ${path}
|
|
||||||
DEPENDS ${target}
|
DEPENDS ${target}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -250,8 +255,7 @@ FUNCTION(MYSQL_INSTALL_TARGETS)
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
# Install man pages on Unix
|
# Install man pages on Unix
|
||||||
IF(UNIX)
|
IF(UNIX)
|
||||||
GET_TARGET_PROPERTY(target_location ${target} LOCATION)
|
INSTALL_MANPAGE($<TARGET_FILE:${target}>)
|
||||||
INSTALL_MANPAGE(${target_location})
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDFOREACH()
|
ENDFOREACH()
|
||||||
|
|
||||||
@ -268,6 +272,7 @@ SET(DEBUGBUILDDIR "${BINARY_PARENTDIR}/debug" CACHE INTERNAL "Directory of debug
|
|||||||
|
|
||||||
|
|
||||||
FUNCTION(INSTALL_DEBUG_TARGET target)
|
FUNCTION(INSTALL_DEBUG_TARGET target)
|
||||||
|
RETURN() # XXX unused?
|
||||||
CMAKE_PARSE_ARGUMENTS(ARG
|
CMAKE_PARSE_ARGUMENTS(ARG
|
||||||
""
|
""
|
||||||
"DESTINATION;RENAME;PDB_DESTINATION;COMPONENT"
|
"DESTINATION;RENAME;PDB_DESTINATION;COMPONENT"
|
||||||
|
@ -139,17 +139,17 @@ MACRO(MERGE_STATIC_LIBS TARGET OUTPUT_NAME LIBS_TO_MERGE)
|
|||||||
|
|
||||||
SET(OSLIBS)
|
SET(OSLIBS)
|
||||||
FOREACH(LIB ${LIBS_TO_MERGE})
|
FOREACH(LIB ${LIBS_TO_MERGE})
|
||||||
GET_TARGET_PROPERTY(LIB_LOCATION ${LIB} LOCATION)
|
IF(NOT TARGET ${LIB})
|
||||||
GET_TARGET_PROPERTY(LIB_TYPE ${LIB} TYPE)
|
|
||||||
IF(NOT LIB_LOCATION)
|
|
||||||
# 3rd party library like libz.so. Make sure that everything
|
# 3rd party library like libz.so. Make sure that everything
|
||||||
# that links to our library links to this one as well.
|
# that links to our library links to this one as well.
|
||||||
LIST(APPEND OSLIBS ${LIB})
|
LIST(APPEND OSLIBS ${LIB})
|
||||||
ELSE()
|
ELSE()
|
||||||
|
GET_TARGET_PROPERTY(LIB_TYPE ${LIB} TYPE)
|
||||||
# This is a target in current project
|
# This is a target in current project
|
||||||
# (can be a static or shared lib)
|
# (can be a static or shared lib)
|
||||||
IF(LIB_TYPE STREQUAL "STATIC_LIBRARY")
|
IF(LIB_TYPE STREQUAL "STATIC_LIBRARY")
|
||||||
SET(STATIC_LIBS ${STATIC_LIBS} ${LIB_LOCATION})
|
SET(STATIC_TGTS ${STATIC_TGTS} ${LIB})
|
||||||
|
SET(STATIC_LIBS ${STATIC_LIBS} $<TARGET_FILE:${LIB}>)
|
||||||
ADD_DEPENDENCIES(${TARGET} ${LIB})
|
ADD_DEPENDENCIES(${TARGET} ${LIB})
|
||||||
# Extract dependent OS libraries
|
# Extract dependent OS libraries
|
||||||
GET_DEPENDEND_OS_LIBS(${LIB} LIB_OSLIBS)
|
GET_DEPENDEND_OS_LIBS(${LIB} LIB_OSLIBS)
|
||||||
@ -171,7 +171,7 @@ MACRO(MERGE_STATIC_LIBS TARGET OUTPUT_NAME LIBS_TO_MERGE)
|
|||||||
ADD_CUSTOM_COMMAND(
|
ADD_CUSTOM_COMMAND(
|
||||||
OUTPUT ${SOURCE_FILE}
|
OUTPUT ${SOURCE_FILE}
|
||||||
COMMAND ${CMAKE_COMMAND} -E touch ${SOURCE_FILE}
|
COMMAND ${CMAKE_COMMAND} -E touch ${SOURCE_FILE}
|
||||||
DEPENDS ${STATIC_LIBS})
|
DEPENDS ${STATIC_TGTS})
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
# To merge libs, just pass them to lib.exe command line.
|
# To merge libs, just pass them to lib.exe command line.
|
||||||
@ -182,29 +182,27 @@ MACRO(MERGE_STATIC_LIBS TARGET OUTPUT_NAME LIBS_TO_MERGE)
|
|||||||
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES STATIC_LIBRARY_FLAGS
|
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES STATIC_LIBRARY_FLAGS
|
||||||
"${LINKER_EXTRA_FLAGS}")
|
"${LINKER_EXTRA_FLAGS}")
|
||||||
ELSE()
|
ELSE()
|
||||||
GET_TARGET_PROPERTY(TARGET_LOCATION ${TARGET} LOCATION)
|
|
||||||
IF(APPLE)
|
IF(APPLE)
|
||||||
# Use OSX's libtool to merge archives (ihandles universal
|
# Use OSX's libtool to merge archives (ihandles universal
|
||||||
# binaries properly)
|
# binaries properly)
|
||||||
ADD_CUSTOM_COMMAND(TARGET ${TARGET} POST_BUILD
|
ADD_CUSTOM_COMMAND(TARGET ${TARGET} POST_BUILD
|
||||||
COMMAND rm ${TARGET_LOCATION}
|
COMMAND rm $<TARGET_FILE:${TARGET}>
|
||||||
COMMAND libtool -static -o ${TARGET_LOCATION}
|
COMMAND libtool -static -o $<TARGET_FILE:${TARGET}>
|
||||||
${STATIC_LIBS}
|
${STATIC_LIBS}
|
||||||
)
|
)
|
||||||
ELSE()
|
ELSE()
|
||||||
# Generic Unix, Cygwin or MinGW. In post-build step, call
|
# Generic Unix, Cygwin or MinGW. In post-build step, call
|
||||||
# script, that extracts objects from archives with "ar x"
|
# script, that extracts objects from archives with "ar x"
|
||||||
# and repacks them with "ar r"
|
# and repacks them with "ar r"
|
||||||
SET(TARGET ${TARGET})
|
|
||||||
CONFIGURE_FILE(
|
|
||||||
${MYSQL_CMAKE_SCRIPT_DIR}/merge_archives_unix.cmake.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/merge_archives_${TARGET}.cmake
|
|
||||||
@ONLY
|
|
||||||
)
|
|
||||||
ADD_CUSTOM_COMMAND(TARGET ${TARGET} POST_BUILD
|
ADD_CUSTOM_COMMAND(TARGET ${TARGET} POST_BUILD
|
||||||
COMMAND rm ${TARGET_LOCATION}
|
COMMAND ${CMAKE_COMMAND}
|
||||||
COMMAND ${CMAKE_COMMAND} -P
|
-DTARGET_LOCATION="$<TARGET_FILE:${TARGET}>"
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/merge_archives_${TARGET}.cmake
|
-DTARGET="${TARGET}"
|
||||||
|
-DSTATIC_LIBS="${STATIC_LIBS}"
|
||||||
|
-DCMAKE_CURRENT_BINARY_DIR="${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
-DCMAKE_AR="${CMAKE_AR}"
|
||||||
|
-DCMAKE_RANLIB="${CMAKE_RANLIB}"
|
||||||
|
-P "${MYSQL_CMAKE_SCRIPT_DIR}/merge_archives_unix.cmake"
|
||||||
)
|
)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
@ -269,7 +267,7 @@ MACRO(MERGE_LIBRARIES)
|
|||||||
IF (ARG_SOVERSION)
|
IF (ARG_SOVERSION)
|
||||||
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES SOVERSION ${ARG_VERSION})
|
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES SOVERSION ${ARG_VERSION})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
TARGET_LINK_LIBRARIES(${TARGET} ${LIBS})
|
TARGET_LINK_LIBRARIES(${TARGET} LINK_PRIVATE ${LIBS})
|
||||||
IF(ARG_OUTPUT_NAME)
|
IF(ARG_OUTPUT_NAME)
|
||||||
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES OUTPUT_NAME "${ARG_OUTPUT_NAME}")
|
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES OUTPUT_NAME "${ARG_OUTPUT_NAME}")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
@ -282,7 +280,6 @@ MACRO(MERGE_LIBRARIES)
|
|||||||
ENDIF()
|
ENDIF()
|
||||||
MYSQL_INSTALL_TARGETS(${TARGET} DESTINATION "${INSTALL_LIBDIR}" ${COMP})
|
MYSQL_INSTALL_TARGETS(${TARGET} DESTINATION "${INSTALL_LIBDIR}" ${COMP})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_INTERFACE_LIBRARIES "")
|
|
||||||
IF(ARG_SHARED AND LINK_FLAG_NO_UNDEFINED)
|
IF(ARG_SHARED AND LINK_FLAG_NO_UNDEFINED)
|
||||||
# Do not allow undefined symbols in shared libraries
|
# Do not allow undefined symbols in shared libraries
|
||||||
GET_TARGET_PROPERTY(TARGET_LINK_FLAGS ${TARGET} LINK_FLAGS)
|
GET_TARGET_PROPERTY(TARGET_LINK_FLAGS ${TARGET} LINK_FLAGS)
|
||||||
@ -295,18 +292,11 @@ MACRO(MERGE_LIBRARIES)
|
|||||||
ENDMACRO()
|
ENDMACRO()
|
||||||
|
|
||||||
FUNCTION(GET_DEPENDEND_OS_LIBS target result)
|
FUNCTION(GET_DEPENDEND_OS_LIBS target result)
|
||||||
SET(deps ${${target}_LIB_DEPENDS})
|
FOREACH(lib ${${target}_LIB_DEPENDS})
|
||||||
IF(deps)
|
IF(NOT TARGET ${lib})
|
||||||
FOREACH(lib ${deps})
|
SET(ret ${ret} ${lib})
|
||||||
# Filter out keywords for used for debug vs optimized builds
|
|
||||||
IF(NOT lib MATCHES "general" AND NOT lib MATCHES "debug" AND NOT lib MATCHES "optimized")
|
|
||||||
GET_TARGET_PROPERTY(lib_location ${lib} LOCATION)
|
|
||||||
IF(NOT lib_location)
|
|
||||||
SET(ret ${ret} ${lib})
|
|
||||||
ENDIF()
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDFOREACH()
|
ENDFOREACH()
|
||||||
ENDIF()
|
|
||||||
SET(${result} ${ret} PARENT_SCOPE)
|
SET(${result} ${ret} PARENT_SCOPE)
|
||||||
ENDFUNCTION()
|
ENDFUNCTION()
|
||||||
|
|
||||||
|
@ -14,19 +14,12 @@
|
|||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
# This script merges many static libraries into
|
FILE(REMOVE "${TARGET_LOCATION}")
|
||||||
# one big library on Unix.
|
|
||||||
SET(TARGET_LOCATION "@TARGET_LOCATION@")
|
|
||||||
SET(TARGET "@TARGET@")
|
|
||||||
SET(STATIC_LIBS "@STATIC_LIBS@")
|
|
||||||
SET(CMAKE_CURRENT_BINARY_DIR "@CMAKE_CURRENT_BINARY_DIR@")
|
|
||||||
SET(CMAKE_AR "@CMAKE_AR@")
|
|
||||||
SET(CMAKE_RANLIB "@CMAKE_RANLIB@")
|
|
||||||
|
|
||||||
|
|
||||||
SET(TEMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/merge_archives_${TARGET})
|
SET(TEMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/merge_archives_${TARGET})
|
||||||
MAKE_DIRECTORY(${TEMP_DIR})
|
MAKE_DIRECTORY(${TEMP_DIR})
|
||||||
# Extract each archive to its own subdirectory(avoid object filename clashes)
|
# Extract each archive to its own subdirectory(avoid object filename clashes)
|
||||||
|
SEPARATE_ARGUMENTS(STATIC_LIBS UNIX_COMMAND "${STATIC_LIBS}")
|
||||||
FOREACH(LIB ${STATIC_LIBS})
|
FOREACH(LIB ${STATIC_LIBS})
|
||||||
GET_FILENAME_COMPONENT(NAME_NO_EXT ${LIB} NAME_WE)
|
GET_FILENAME_COMPONENT(NAME_NO_EXT ${LIB} NAME_WE)
|
||||||
SET(TEMP_SUBDIR ${TEMP_DIR}/${NAME_NO_EXT})
|
SET(TEMP_SUBDIR ${TEMP_DIR}/${NAME_NO_EXT})
|
@ -75,6 +75,9 @@ FUNCTION (MYSQL_ADD_EXECUTABLE)
|
|||||||
ELSE()
|
ELSE()
|
||||||
SET(COMP COMPONENT Client)
|
SET(COMP COMPONENT Client)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
IF (COMP MATCHES ${SKIP_COMPONENTS})
|
||||||
|
RETURN()
|
||||||
|
ENDIF()
|
||||||
MYSQL_INSTALL_TARGETS(${target} DESTINATION ${ARG_DESTINATION} ${COMP})
|
MYSQL_INSTALL_TARGETS(${target} DESTINATION ${ARG_DESTINATION} ${COMP})
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDFUNCTION()
|
ENDFUNCTION()
|
||||||
|
@ -77,6 +77,9 @@ IF(NOT VERSION)
|
|||||||
SET(DEFAULT_MACHINE "i386")
|
SET(DEFAULT_MACHINE "i386")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "GNU")
|
||||||
|
SET(DEFAULT_PLATFORM "GNU")
|
||||||
|
SET(DEFAULT_MACHINE "i386")
|
||||||
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
||||||
IF(CMAKE_OSX_DEPLOYMENT_TARGET)
|
IF(CMAKE_OSX_DEPLOYMENT_TARGET)
|
||||||
SET(DEFAULT_PLATFORM "osx${CMAKE_OSX_DEPLOYMENT_TARGET}")
|
SET(DEFAULT_PLATFORM "osx${CMAKE_OSX_DEPLOYMENT_TARGET}")
|
||||||
@ -132,7 +135,7 @@ IF(NOT VERSION)
|
|||||||
|
|
||||||
SET(package_name "mariadb${PRODUCT_TAG}-${VERSION}-${SYSTEM_NAME_AND_PROCESSOR}")
|
SET(package_name "mariadb${PRODUCT_TAG}-${VERSION}-${SYSTEM_NAME_AND_PROCESSOR}")
|
||||||
|
|
||||||
MESSAGE(STATUS "Packaging as: ${package_name}")
|
MESSAGE_ONCE(package_name "Packaging as: ${package_name}")
|
||||||
|
|
||||||
# Sometimes package suffix is added (something like "-icc-glibc23")
|
# Sometimes package suffix is added (something like "-icc-glibc23")
|
||||||
IF(PACKAGE_SUFFIX)
|
IF(PACKAGE_SUFFIX)
|
||||||
|
@ -20,10 +20,12 @@ MACRO(CHECK_SYSTEMD)
|
|||||||
SET(WITH_SYSTEMD "auto" CACHE STRING "Enable systemd scripts and notification support")
|
SET(WITH_SYSTEMD "auto" CACHE STRING "Enable systemd scripts and notification support")
|
||||||
IF(WITH_SYSTEMD STREQUAL "yes" OR WITH_SYSTEMD STREQUAL "auto")
|
IF(WITH_SYSTEMD STREQUAL "yes" OR WITH_SYSTEMD STREQUAL "auto")
|
||||||
IF(PKG_CONFIG_FOUND)
|
IF(PKG_CONFIG_FOUND)
|
||||||
IF(WITH_SYSTEMD STREQUAL "yes")
|
IF (NOT DEFINED LIBSYSTEMD_FOUND)
|
||||||
pkg_search_module(LIBSYSTEMD REQUIRED libsystemd libsystemd-daemon)
|
IF(WITH_SYSTEMD STREQUAL "yes")
|
||||||
ELSE()
|
pkg_search_module(LIBSYSTEMD REQUIRED libsystemd libsystemd-daemon)
|
||||||
pkg_search_module(LIBSYSTEMD libsystemd libsystemd-daemon)
|
ELSE()
|
||||||
|
pkg_search_module(LIBSYSTEMD libsystemd libsystemd-daemon)
|
||||||
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
IF(HAVE_DLOPEN)
|
IF(HAVE_DLOPEN)
|
||||||
SET(LIBSYSTEMD ${LIBSYSTEMD_LIBRARIES})
|
SET(LIBSYSTEMD ${LIBSYSTEMD_LIBRARIES})
|
||||||
|
2
debian/additions/innotop/changelog.innotop
vendored
2
debian/additions/innotop/changelog.innotop
vendored
@ -77,7 +77,7 @@ Changelog for innotop:
|
|||||||
* remove cxn from $meta->{group_by} if there's only one connection displayed
|
* remove cxn from $meta->{group_by} if there's only one connection displayed
|
||||||
* fix for issue 19 - cxn column won't become visible when viewing two
|
* fix for issue 19 - cxn column won't become visible when viewing two
|
||||||
connections after having viewed one connection
|
connections after having viewed one connection
|
||||||
* supress errors resulting from the addition of a 'BACKGROUND THREAD'
|
* suppress errors resulting from the addition of a 'BACKGROUND THREAD'
|
||||||
section in the output of 'show innodb status'
|
section in the output of 'show innodb status'
|
||||||
* possible fix for issue 22 - Useless use of a constant in void context
|
* possible fix for issue 22 - Useless use of a constant in void context
|
||||||
* small change to set_to_tbl() around hiding the cxn column if there
|
* small change to set_to_tbl() around hiding the cxn column if there
|
||||||
|
14
debian/additions/innotop/innotop
vendored
14
debian/additions/innotop/innotop
vendored
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
# You should have received a copy of the GNU General Public License along with
|
# You should have received a copy of the GNU General Public License along with
|
||||||
# this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
|
# this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
|
||||||
# Street, Fifth Floor, Boston, MA 02110-1301 USA
|
# Street, Fifth Floor, Boston, MA 02111-1301 USA
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings FATAL => 'all';
|
use warnings FATAL => 'all';
|
||||||
@ -1438,8 +1438,8 @@ systems, you can issue `man perlgpl' or `man perlartistic' to read these
|
|||||||
licenses.
|
licenses.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
You should have received a copy of the GNU General Public License along with
|
||||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
|
||||||
Place, Suite 330, Boston, MA 02111-1307 USA.
|
Street, Fifth Floor, Boston, MA 02111-1301 USA.
|
||||||
LICENSE
|
LICENSE
|
||||||
|
|
||||||
# Configuration information and global setup {{{1
|
# Configuration information and global setup {{{1
|
||||||
@ -4657,7 +4657,7 @@ my %stmt_maker_for = (
|
|||||||
my $sth;
|
my $sth;
|
||||||
eval { # This can fail if the table doesn't exist, INFORMATION_SCHEMA doesn't exist, etc.
|
eval { # This can fail if the table doesn't exist, INFORMATION_SCHEMA doesn't exist, etc.
|
||||||
my $cols = $dbh->selectall_arrayref(q{SHOW /*innotop*/ COLUMNS FROM INFORMATION_SCHEMA.PROCESSLIST LIKE 'TIME_MS'});
|
my $cols = $dbh->selectall_arrayref(q{SHOW /*innotop*/ COLUMNS FROM INFORMATION_SCHEMA.PROCESSLIST LIKE 'TIME_MS'});
|
||||||
if ( @$cols ) { # The TIME_MS colum exists
|
if ( @$cols ) { # The TIME_MS column exists
|
||||||
$sth = $dbh->prepare(q{SELECT /*innotop*/ ID, USER, HOST, DB, COMMAND, CASE WHEN TIME_MS/1000 > 365*86400 THEN TIME ELSE TIME_MS/1000 END AS TIME, STATE, INFO FROM INFORMATION_SCHEMA.PROCESSLIST});
|
$sth = $dbh->prepare(q{SELECT /*innotop*/ ID, USER, HOST, DB, COMMAND, CASE WHEN TIME_MS/1000 > 365*86400 THEN TIME ELSE TIME_MS/1000 END AS TIME, STATE, INFO FROM INFORMATION_SCHEMA.PROCESSLIST});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -11653,7 +11653,7 @@ show you something like this:
|
|||||||
pages_modified Dirty Pages Pages modified (dirty IB_bp_pages_m
|
pages_modified Dirty Pages Pages modified (dirty IB_bp_pages_m
|
||||||
buf_pool_hit_rate Hit Rate Buffer pool hit rate IB_bp_buf_poo
|
buf_pool_hit_rate Hit Rate Buffer pool hit rate IB_bp_buf_poo
|
||||||
total_mem_alloc Memory Total memory allocate IB_bp_total_m
|
total_mem_alloc Memory Total memory allocate IB_bp_total_m
|
||||||
add_pool_alloc Add'l Pool Additonal pool alloca IB_bp_add_poo
|
add_pool_alloc Add'l Pool Additional pool alloca IB_bp_add_poo
|
||||||
|
|
||||||
The first line shows which table you're editing, and reminds you again to press
|
The first line shows which table you're editing, and reminds you again to press
|
||||||
'?' for a list of key mappings. The rest is a tabular representation of the
|
'?' for a list of key mappings. The rest is a tabular representation of the
|
||||||
@ -12233,8 +12233,8 @@ systems, you can issue `man perlgpl' or `man perlartistic' to read these
|
|||||||
licenses.
|
licenses.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along with
|
You should have received a copy of the GNU General Public License along with
|
||||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
|
||||||
Place, Suite 330, Boston, MA 02111-1307 USA.
|
Street, Fifth Floor, Boston, MA 02111-1301 USA.
|
||||||
|
|
||||||
Execute innotop and press '!' to see this information at any time.
|
Execute innotop and press '!' to see this information at any time.
|
||||||
|
|
||||||
|
6
debian/additions/innotop/innotop.1
vendored
6
debian/additions/innotop/innotop.1
vendored
@ -1678,7 +1678,7 @@ show you something like this:
|
|||||||
\& pages_modified Dirty Pages Pages modified (dirty IB_bp_pages_m
|
\& pages_modified Dirty Pages Pages modified (dirty IB_bp_pages_m
|
||||||
\& buf_pool_hit_rate Hit Rate Buffer pool hit rate IB_bp_buf_poo
|
\& buf_pool_hit_rate Hit Rate Buffer pool hit rate IB_bp_buf_poo
|
||||||
\& total_mem_alloc Memory Total memory allocate IB_bp_total_m
|
\& total_mem_alloc Memory Total memory allocate IB_bp_total_m
|
||||||
\& add_pool_alloc Add\*(Aql Pool Additonal pool alloca IB_bp_add_poo
|
\& add_pool_alloc Add\*(Aql Pool Additional pool alloca IB_bp_add_poo
|
||||||
.Ve
|
.Ve
|
||||||
.PP
|
.PP
|
||||||
The first line shows which table you're editing, and reminds you again to press
|
The first line shows which table you're editing, and reminds you again to press
|
||||||
@ -2183,8 +2183,8 @@ systems, you can issue `man perlgpl' or `man perlartistic' to read these
|
|||||||
licenses.
|
licenses.
|
||||||
.PP
|
.PP
|
||||||
You should have received a copy of the \s-1GNU\s0 General Public License along with
|
You should have received a copy of the \s-1GNU\s0 General Public License along with
|
||||||
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
|
||||||
Place, Suite 330, Boston, \s-1MA 02111\-1307 USA.\s0
|
Street, Fifth Floor, Boston, \s-1MA\s0 02111\-1301 \s-1USA\s0.
|
||||||
.PP
|
.PP
|
||||||
Execute innotop and press '!' to see this information at any time.
|
Execute innotop and press '!' to see this information at any time.
|
||||||
.SH "AUTHOR"
|
.SH "AUTHOR"
|
||||||
|
@ -471,6 +471,21 @@ struct datafile_cur_t {
|
|||||||
size_t buf_size;
|
size_t buf_size;
|
||||||
size_t buf_read;
|
size_t buf_read;
|
||||||
size_t buf_offset;
|
size_t buf_offset;
|
||||||
|
|
||||||
|
explicit datafile_cur_t(const char* filename = NULL) :
|
||||||
|
file(), thread_n(0), orig_buf(NULL), buf(NULL), buf_size(0),
|
||||||
|
buf_read(0), buf_offset(0)
|
||||||
|
{
|
||||||
|
memset(rel_path, 0, sizeof rel_path);
|
||||||
|
if (filename) {
|
||||||
|
strncpy(abs_path, filename, sizeof abs_path);
|
||||||
|
abs_path[(sizeof abs_path) - 1] = 0;
|
||||||
|
} else {
|
||||||
|
abs_path[0] = '\0';
|
||||||
|
}
|
||||||
|
rel_path[0] = '\0';
|
||||||
|
memset(&statinfo, 0, sizeof statinfo);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static
|
static
|
||||||
@ -489,9 +504,7 @@ datafile_open(const char *file, datafile_cur_t *cursor, uint thread_n)
|
|||||||
{
|
{
|
||||||
bool success;
|
bool success;
|
||||||
|
|
||||||
memset(cursor, 0, sizeof(datafile_cur_t));
|
new (cursor) datafile_cur_t(file);
|
||||||
|
|
||||||
strncpy(cursor->abs_path, file, sizeof(cursor->abs_path));
|
|
||||||
|
|
||||||
/* Get the relative path for the destination tablespace name, i.e. the
|
/* Get the relative path for the destination tablespace name, i.e. the
|
||||||
one that can be appended to the backup root directory. Non-system
|
one that can be appended to the backup root directory. Non-system
|
||||||
@ -630,32 +643,36 @@ static
|
|||||||
int
|
int
|
||||||
mkdirp(const char *pathname, int Flags, myf MyFlags)
|
mkdirp(const char *pathname, int Flags, myf MyFlags)
|
||||||
{
|
{
|
||||||
char parent[PATH_MAX], *p;
|
char *parent, *p;
|
||||||
|
|
||||||
/* make a parent directory path */
|
/* make a parent directory path */
|
||||||
strncpy(parent, pathname, sizeof(parent));
|
if (!(parent= strdup(pathname)))
|
||||||
parent[sizeof(parent) - 1] = 0;
|
return(-1);
|
||||||
|
|
||||||
for (p = parent + strlen(parent);
|
for (p = parent + strlen(parent);
|
||||||
!is_path_separator(*p) && p != parent; p--);
|
!is_path_separator(*p) && p != parent; p--) ;
|
||||||
|
|
||||||
*p = 0;
|
*p = 0;
|
||||||
|
|
||||||
/* try to make parent directory */
|
/* try to make parent directory */
|
||||||
if (p != parent && mkdirp(parent, Flags, MyFlags) != 0) {
|
if (p != parent && mkdirp(parent, Flags, MyFlags) != 0) {
|
||||||
|
free(parent);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* make this one if parent has been made */
|
/* make this one if parent has been made */
|
||||||
if (my_mkdir(pathname, Flags, MyFlags) == 0) {
|
if (my_mkdir(pathname, Flags, MyFlags) == 0) {
|
||||||
|
free(parent);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if it already exists that is fine */
|
/* if it already exists that is fine */
|
||||||
if (errno == EEXIST) {
|
if (errno == EEXIST) {
|
||||||
|
free(parent);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(parent);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -665,17 +682,24 @@ bool
|
|||||||
equal_paths(const char *first, const char *second)
|
equal_paths(const char *first, const char *second)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_REALPATH
|
#ifdef HAVE_REALPATH
|
||||||
char real_first[PATH_MAX];
|
char *real_first, *real_second;
|
||||||
char real_second[PATH_MAX];
|
int result;
|
||||||
|
|
||||||
if (realpath(first, real_first) == NULL) {
|
real_first = realpath(first, 0);
|
||||||
return false;
|
if (real_first == NULL) {
|
||||||
}
|
|
||||||
if (realpath(second, real_second) == NULL) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (strcmp(real_first, real_second) == 0);
|
real_second = realpath(second, 0);
|
||||||
|
if (real_second == NULL) {
|
||||||
|
free(real_first);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = strcmp(real_first, real_second);
|
||||||
|
free(real_first);
|
||||||
|
free(real_second);
|
||||||
|
return result == 0;
|
||||||
#else
|
#else
|
||||||
return strcmp(first, second) == 0;
|
return strcmp(first, second) == 0;
|
||||||
#endif
|
#endif
|
||||||
@ -1360,6 +1384,30 @@ out:
|
|||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void backup_fix_ddl(void);
|
||||||
|
|
||||||
|
#define LSN_PREFIX_IN_SHOW_STATUS "\nLog sequence number "
|
||||||
|
static lsn_t get_current_lsn(MYSQL *connection) {
|
||||||
|
MYSQL_RES *res = xb_mysql_query(connection, "SHOW ENGINE INNODB STATUS", true, false);
|
||||||
|
if (!res)
|
||||||
|
return 0;
|
||||||
|
MYSQL_ROW row = mysql_fetch_row(res);
|
||||||
|
DBUG_ASSERT(row);
|
||||||
|
if (row) {
|
||||||
|
const char *p = strstr(row[2],LSN_PREFIX_IN_SHOW_STATUS);
|
||||||
|
DBUG_ASSERT(p);
|
||||||
|
if (p)
|
||||||
|
{
|
||||||
|
p += sizeof(LSN_PREFIX_IN_SHOW_STATUS) - 1;
|
||||||
|
return (lsn_t)strtoll(p, NULL, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mysql_free_result(res);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
lsn_t server_lsn_after_lock;
|
||||||
|
extern void backup_wait_for_lsn(lsn_t lsn);
|
||||||
/** Start --backup */
|
/** Start --backup */
|
||||||
bool backup_start()
|
bool backup_start()
|
||||||
{
|
{
|
||||||
@ -1379,6 +1427,7 @@ bool backup_start()
|
|||||||
if (!lock_tables(mysql_connection)) {
|
if (!lock_tables(mysql_connection)) {
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
server_lsn_after_lock = get_current_lsn(mysql_connection);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!backup_files(fil_path_to_mysql_datadir, false)) {
|
if (!backup_files(fil_path_to_mysql_datadir, false)) {
|
||||||
@ -1393,6 +1442,10 @@ bool backup_start()
|
|||||||
rocksdb_create_checkpoint();
|
rocksdb_create_checkpoint();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msg_ts("Waiting for log copy thread to read lsn %llu\n", (ulonglong)server_lsn_after_lock);
|
||||||
|
backup_wait_for_lsn(server_lsn_after_lock);
|
||||||
|
backup_fix_ddl();
|
||||||
|
|
||||||
// There is no need to stop slave thread before coping non-Innodb data when
|
// There is no need to stop slave thread before coping non-Innodb data when
|
||||||
// --no-lock option is used because --no-lock option requires that no DDL or
|
// --no-lock option is used because --no-lock option requires that no DDL or
|
||||||
// DML to non-transaction tables can occur.
|
// DML to non-transaction tables can occur.
|
||||||
@ -2202,6 +2255,7 @@ static void rocksdb_lock_checkpoint()
|
|||||||
msg_ts("Could not obtain rocksdb checkpont lock\n");
|
msg_ts("Could not obtain rocksdb checkpont lock\n");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
mysql_free_result(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rocksdb_unlock_checkpoint()
|
static void rocksdb_unlock_checkpoint()
|
||||||
|
@ -1795,7 +1795,12 @@ mdl_lock_table(ulint space_id)
|
|||||||
std::ostringstream lock_query;
|
std::ostringstream lock_query;
|
||||||
lock_query << "SELECT 1 FROM " << full_table_name << " LIMIT 0";
|
lock_query << "SELECT 1 FROM " << full_table_name << " LIMIT 0";
|
||||||
msg_ts("Locking MDL for %s\n", full_table_name.c_str());
|
msg_ts("Locking MDL for %s\n", full_table_name.c_str());
|
||||||
xb_mysql_query(mdl_con, lock_query.str().c_str(), false, true);
|
if (mysql_query(mdl_con, lock_query.str().c_str())) {
|
||||||
|
msg_ts("Warning : locking MDL failed for space id %zu, name %s\n", space_id, full_table_name.c_str());
|
||||||
|
} else {
|
||||||
|
MYSQL_RES *r = mysql_store_result(mdl_con);
|
||||||
|
mysql_free_result(r);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&mdl_lock_con_mutex);
|
pthread_mutex_unlock(&mdl_lock_con_mutex);
|
||||||
|
@ -109,6 +109,9 @@ Write to a datasink file.
|
|||||||
int
|
int
|
||||||
ds_write(ds_file_t *file, const void *buf, size_t len)
|
ds_write(ds_file_t *file, const void *buf, size_t len)
|
||||||
{
|
{
|
||||||
|
if (len == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return file->datasink->write(file, (const uchar *)buf, len);
|
return file->datasink->write(file, (const uchar *)buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,14 +130,15 @@ Open a source file cursor and initialize the associated read filter.
|
|||||||
be skipped and XB_FIL_CUR_ERROR on error. */
|
be skipped and XB_FIL_CUR_ERROR on error. */
|
||||||
xb_fil_cur_result_t
|
xb_fil_cur_result_t
|
||||||
xb_fil_cur_open(
|
xb_fil_cur_open(
|
||||||
/*============*/
|
/*============*/
|
||||||
xb_fil_cur_t* cursor, /*!< out: source file cursor */
|
xb_fil_cur_t* cursor, /*!< out: source file cursor */
|
||||||
xb_read_filt_t* read_filter, /*!< in/out: the read filter */
|
xb_read_filt_t* read_filter, /*!< in/out: the read filter */
|
||||||
fil_node_t* node, /*!< in: source tablespace node */
|
fil_node_t* node, /*!< in: source tablespace node */
|
||||||
uint thread_n) /*!< thread number for diagnostics */
|
uint thread_n, /*!< thread number for diagnostics */
|
||||||
|
ulonglong max_file_size)
|
||||||
{
|
{
|
||||||
bool success;
|
bool success;
|
||||||
|
int err;
|
||||||
/* Initialize these first so xb_fil_cur_close() handles them correctly
|
/* Initialize these first so xb_fil_cur_close() handles them correctly
|
||||||
in case of error */
|
in case of error */
|
||||||
cursor->orig_buf = NULL;
|
cursor->orig_buf = NULL;
|
||||||
@ -172,7 +173,7 @@ xb_fil_cur_open(
|
|||||||
"tablespace %s\n",
|
"tablespace %s\n",
|
||||||
thread_n, cursor->abs_path);
|
thread_n, cursor->abs_path);
|
||||||
|
|
||||||
return(XB_FIL_CUR_ERROR);
|
return(XB_FIL_CUR_SKIP);
|
||||||
}
|
}
|
||||||
mutex_enter(&fil_system.mutex);
|
mutex_enter(&fil_system.mutex);
|
||||||
|
|
||||||
@ -193,14 +194,31 @@ xb_fil_cur_open(
|
|||||||
|
|
||||||
cursor->node = node;
|
cursor->node = node;
|
||||||
cursor->file = node->handle;
|
cursor->file = node->handle;
|
||||||
|
#ifdef _WIN32
|
||||||
if (stat(cursor->abs_path, &cursor->statinfo)) {
|
HANDLE hDup;
|
||||||
msg("[%02u] mariabackup: error: cannot stat %s\n",
|
DuplicateHandle(GetCurrentProcess(),cursor->file.m_file,
|
||||||
|
GetCurrentProcess(), &hDup, 0, FALSE, DUPLICATE_SAME_ACCESS);
|
||||||
|
int filenr = _open_osfhandle((intptr_t)hDup, 0);
|
||||||
|
if (filenr < 0) {
|
||||||
|
err = EINVAL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
err = _fstat64(filenr, &cursor->statinfo);
|
||||||
|
close(filenr);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
err = fstat(cursor->file.m_file, &cursor->statinfo);
|
||||||
|
#endif
|
||||||
|
if (max_file_size < (ulonglong)cursor->statinfo.st_size) {
|
||||||
|
cursor->statinfo.st_size = (ulonglong)max_file_size;
|
||||||
|
}
|
||||||
|
if (err) {
|
||||||
|
msg("[%02u] mariabackup: error: cannot fstat %s\n",
|
||||||
thread_n, cursor->abs_path);
|
thread_n, cursor->abs_path);
|
||||||
|
|
||||||
xb_fil_cur_close(cursor);
|
xb_fil_cur_close(cursor);
|
||||||
|
|
||||||
return(XB_FIL_CUR_ERROR);
|
return(XB_FIL_CUR_SKIP);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srv_file_flush_method == SRV_O_DIRECT
|
if (srv_file_flush_method == SRV_O_DIRECT
|
||||||
@ -373,7 +391,9 @@ xb_fil_cur_close(
|
|||||||
/*=============*/
|
/*=============*/
|
||||||
xb_fil_cur_t *cursor) /*!< in/out: source file cursor */
|
xb_fil_cur_t *cursor) /*!< in/out: source file cursor */
|
||||||
{
|
{
|
||||||
cursor->read_filter->deinit(&cursor->read_filter_ctxt);
|
if (cursor->read_filter) {
|
||||||
|
cursor->read_filter->deinit(&cursor->read_filter_ctxt);
|
||||||
|
}
|
||||||
|
|
||||||
free(cursor->orig_buf);
|
free(cursor->orig_buf);
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ struct xb_fil_cur_t {
|
|||||||
ulint space_size; /*!< space size in pages */
|
ulint space_size; /*!< space size in pages */
|
||||||
|
|
||||||
/** TODO: remove this default constructor */
|
/** TODO: remove this default constructor */
|
||||||
xb_fil_cur_t() : page_size(0), read_filter_ctxt() {}
|
xb_fil_cur_t() : page_size(0), read_filter(0), read_filter_ctxt() {}
|
||||||
|
|
||||||
/** @return whether this is not a file-per-table tablespace */
|
/** @return whether this is not a file-per-table tablespace */
|
||||||
bool is_system() const
|
bool is_system() const
|
||||||
@ -87,7 +87,8 @@ xb_fil_cur_open(
|
|||||||
xb_fil_cur_t* cursor, /*!< out: source file cursor */
|
xb_fil_cur_t* cursor, /*!< out: source file cursor */
|
||||||
xb_read_filt_t* read_filter, /*!< in/out: the read filter */
|
xb_read_filt_t* read_filter, /*!< in/out: the read filter */
|
||||||
fil_node_t* node, /*!< in: source tablespace node */
|
fil_node_t* node, /*!< in: source tablespace node */
|
||||||
uint thread_n); /*!< thread number for diagnostics */
|
uint thread_n, /*!< thread number for diagnostics */
|
||||||
|
ulonglong max_file_size = ULLONG_MAX);
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
Reads and verifies the next block of pages from the source
|
Reads and verifies the next block of pages from the source
|
||||||
|
@ -75,8 +75,7 @@ xb_write_galera_info(bool incremental_prepare)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&xid, 0, sizeof(xid));
|
xid.null();
|
||||||
xid.formatID = -1;
|
|
||||||
|
|
||||||
if (!trx_rseg_read_wsrep_checkpoint(xid)) {
|
if (!trx_rseg_read_wsrep_checkpoint(xid)) {
|
||||||
|
|
||||||
|
@ -344,6 +344,25 @@ const char *opt_history = NULL;
|
|||||||
char mariabackup_exe[FN_REFLEN];
|
char mariabackup_exe[FN_REFLEN];
|
||||||
char orig_argv1[FN_REFLEN];
|
char orig_argv1[FN_REFLEN];
|
||||||
|
|
||||||
|
pthread_mutex_t backup_mutex;
|
||||||
|
pthread_cond_t scanned_lsn_cond;
|
||||||
|
|
||||||
|
typedef std::map<space_id_t,std::string> space_id_to_name_t;
|
||||||
|
|
||||||
|
struct ddl_tracker_t {
|
||||||
|
/** Tablspaces with their ID and name, as they were copied to backup.*/
|
||||||
|
space_id_to_name_t tables_in_backup;
|
||||||
|
/** Tablespaces for that optimized DDL without redo log was found.*/
|
||||||
|
std::set<space_id_t> optimized_ddl;
|
||||||
|
/** Drop operations found in redo log. */
|
||||||
|
std::set<space_id_t> drops;
|
||||||
|
/* For DDL operation found in redo log, */
|
||||||
|
space_id_to_name_t id_to_name;
|
||||||
|
};
|
||||||
|
const space_id_t REMOVED_SPACE_ID = ULINT_MAX;
|
||||||
|
static ddl_tracker_t ddl_tracker;
|
||||||
|
|
||||||
|
|
||||||
/* Whether xtrabackup_binlog_info should be created on recovery */
|
/* Whether xtrabackup_binlog_info should be created on recovery */
|
||||||
static bool recover_binlog_info;
|
static bool recover_binlog_info;
|
||||||
|
|
||||||
@ -536,49 +555,79 @@ void mdl_lock_all()
|
|||||||
mdl_lock_table(node->space->id);
|
mdl_lock_table(node->space->id);
|
||||||
}
|
}
|
||||||
datafiles_iter_free(it);
|
datafiles_iter_free(it);
|
||||||
|
|
||||||
DBUG_EXECUTE_IF("check_mdl_lock_works",
|
|
||||||
dbug_alter_thread_done =
|
|
||||||
dbug_start_query_thread("ALTER TABLE test.t ADD COLUMN mdl_lock_column int",
|
|
||||||
"Waiting for table metadata lock",1, ER_QUERY_INTERRUPTED););
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Check if the space id belongs to the table which name should
|
|
||||||
be skipped based on the --tables, --tables-file and --table-exclude
|
// Convert non-null terminated filename to space name
|
||||||
options.
|
std::string filename_to_spacename(const byte *filename, size_t len)
|
||||||
@param[in] space_id space id to check
|
|
||||||
@return true if the space id belongs to skip table/database list. */
|
|
||||||
static bool backup_includes(space_id_t space_id)
|
|
||||||
{
|
{
|
||||||
datafiles_iter_t *it = datafiles_iter_new();
|
// null- terminate filename
|
||||||
if (!it)
|
char *f = (char *)malloc(len + 1);
|
||||||
return true;
|
ut_a(f);
|
||||||
|
memcpy(f, filename, len);
|
||||||
|
f[len] = 0;
|
||||||
|
for (size_t i = 0; i < len; i++)
|
||||||
|
if (f[i] == '\\')
|
||||||
|
f[i] = '/';
|
||||||
|
char *p = strrchr(f, '.');
|
||||||
|
ut_a(p);
|
||||||
|
*p = 0;
|
||||||
|
char *table = strrchr(f, '/');
|
||||||
|
ut_a(table);
|
||||||
|
*table = 0;
|
||||||
|
char *db = strrchr(f, '/');
|
||||||
|
ut_a(db);
|
||||||
|
*table = '/';
|
||||||
|
return std::string(db+1);
|
||||||
|
}
|
||||||
|
|
||||||
while (fil_node_t *node = datafiles_iter_next(it)){
|
/** Report an operation to create, delete, or rename a file during backup.
|
||||||
if (space_id == 0
|
@param[in] space_id tablespace identifier
|
||||||
|| (node->space->id == space_id
|
@param[in] flags tablespace flags (NULL if not create)
|
||||||
&& !check_if_skip_table(node->space->name))) {
|
@param[in] name file name (not NUL-terminated)
|
||||||
|
@param[in] len length of name, in bytes
|
||||||
|
@param[in] new_name new file name (NULL if not rename)
|
||||||
|
@param[in] new_len length of new_name, in bytes (0 if NULL) */
|
||||||
|
void backup_file_op(ulint space_id, const byte* flags,
|
||||||
|
const byte* name, ulint len,
|
||||||
|
const byte* new_name, ulint new_len)
|
||||||
|
{
|
||||||
|
|
||||||
msg("mariabackup: Unsupported redo log detected "
|
ut_ad(!flags || !new_name);
|
||||||
"and it belongs to %s\n",
|
ut_ad(name);
|
||||||
space_id ? node->name: "the InnoDB system tablespace");
|
ut_ad(len);
|
||||||
|
ut_ad(!new_name == !new_len);
|
||||||
|
pthread_mutex_lock(&backup_mutex);
|
||||||
|
|
||||||
msg("mariabackup: ALTER TABLE or OPTIMIZE TABLE "
|
if (flags) {
|
||||||
"was being executed during the backup.\n");
|
ddl_tracker.id_to_name[space_id] = filename_to_spacename(name, len);
|
||||||
|
msg("DDL tracking : create %zu \"%.*s\": %x\n",
|
||||||
if (!opt_lock_ddl_per_table) {
|
space_id, int(len), name, mach_read_from_4(flags));
|
||||||
msg("mariabackup: Use --lock-ddl-per-table "
|
|
||||||
"parameter to lock all the table before "
|
|
||||||
"backup operation.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
datafiles_iter_free(it);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else if (new_name) {
|
||||||
|
ddl_tracker.id_to_name[space_id] = filename_to_spacename(new_name, new_len);
|
||||||
|
msg("DDL tracking : rename %zu \"%.*s\",\"%.*s\"\n",
|
||||||
|
space_id, int(len), name, int(new_len), new_name);
|
||||||
|
} else {
|
||||||
|
ddl_tracker.drops.insert(space_id);
|
||||||
|
msg("DDL tracking : delete %zu \"%.*s\"\n", space_id, int(len), name);
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&backup_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
datafiles_iter_free(it);
|
|
||||||
return true;
|
/** Callback whenever MLOG_INDEX_LOAD happens.
|
||||||
|
@param[in] space_id space id to check
|
||||||
|
@return false */
|
||||||
|
void backup_optimized_ddl_op(ulint space_id)
|
||||||
|
{
|
||||||
|
// TODO : handle incremental
|
||||||
|
if (xtrabackup_incremental)
|
||||||
|
return;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&backup_mutex);
|
||||||
|
ddl_tracker.optimized_ddl.insert(space_id);
|
||||||
|
pthread_mutex_unlock(&backup_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ======== Date copying thread context ======== */
|
/* ======== Date copying thread context ======== */
|
||||||
@ -1363,7 +1412,7 @@ static int prepare_export()
|
|||||||
// which is* unfortunately* still necessary to get mysqld up
|
// which is* unfortunately* still necessary to get mysqld up
|
||||||
if (strncmp(orig_argv1,"--defaults-file=",16) == 0)
|
if (strncmp(orig_argv1,"--defaults-file=",16) == 0)
|
||||||
{
|
{
|
||||||
sprintf(cmdline,
|
snprintf(cmdline, sizeof cmdline,
|
||||||
IF_WIN("\"","") "\"%s\" --mysqld \"%s\" "
|
IF_WIN("\"","") "\"%s\" --mysqld \"%s\" "
|
||||||
" --defaults-extra-file=./backup-my.cnf --defaults-group-suffix=%s --datadir=."
|
" --defaults-extra-file=./backup-my.cnf --defaults-group-suffix=%s --datadir=."
|
||||||
" --innodb --innodb-fast-shutdown=0"
|
" --innodb --innodb-fast-shutdown=0"
|
||||||
@ -2326,7 +2375,7 @@ xb_get_copy_action(const char *dflt)
|
|||||||
|
|
||||||
static
|
static
|
||||||
my_bool
|
my_bool
|
||||||
xtrabackup_copy_datafile(fil_node_t* node, uint thread_n)
|
xtrabackup_copy_datafile(fil_node_t* node, uint thread_n, const char *dest_name=0, ulonglong max_size=ULLONG_MAX)
|
||||||
{
|
{
|
||||||
char dst_name[FN_REFLEN];
|
char dst_name[FN_REFLEN];
|
||||||
ds_file_t *dstfile = NULL;
|
ds_file_t *dstfile = NULL;
|
||||||
@ -2356,20 +2405,35 @@ xtrabackup_copy_datafile(fil_node_t* node, uint thread_n)
|
|||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool was_dropped;
|
||||||
|
pthread_mutex_lock(&backup_mutex);
|
||||||
|
was_dropped = (ddl_tracker.drops.find(node->space->id) != ddl_tracker.drops.end());
|
||||||
|
pthread_mutex_unlock(&backup_mutex);
|
||||||
|
if (was_dropped) {
|
||||||
|
if (node->is_open()) {
|
||||||
|
mutex_enter(&fil_system.mutex);
|
||||||
|
node->close();
|
||||||
|
mutex_exit(&fil_system.mutex);
|
||||||
|
}
|
||||||
|
goto skip;
|
||||||
|
}
|
||||||
|
|
||||||
if (!changed_page_bitmap) {
|
if (!changed_page_bitmap) {
|
||||||
read_filter = &rf_pass_through;
|
read_filter = &rf_pass_through;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
read_filter = &rf_bitmap;
|
read_filter = &rf_bitmap;
|
||||||
}
|
}
|
||||||
res = xb_fil_cur_open(&cursor, read_filter, node, thread_n);
|
|
||||||
|
res = xb_fil_cur_open(&cursor, read_filter, node, thread_n,max_size);
|
||||||
if (res == XB_FIL_CUR_SKIP) {
|
if (res == XB_FIL_CUR_SKIP) {
|
||||||
goto skip;
|
goto skip;
|
||||||
} else if (res == XB_FIL_CUR_ERROR) {
|
} else if (res == XB_FIL_CUR_ERROR) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(dst_name, cursor.rel_path, sizeof(dst_name));
|
strncpy(dst_name, (dest_name)?dest_name : cursor.rel_path, sizeof(dst_name));
|
||||||
|
|
||||||
|
|
||||||
/* Setup the page write filter */
|
/* Setup the page write filter */
|
||||||
if (xtrabackup_incremental) {
|
if (xtrabackup_incremental) {
|
||||||
@ -2421,6 +2485,10 @@ xtrabackup_copy_datafile(fil_node_t* node, uint thread_n)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_mutex_lock(&backup_mutex);
|
||||||
|
ddl_tracker.tables_in_backup[node->space->id] = node_name;
|
||||||
|
pthread_mutex_unlock(&backup_mutex);
|
||||||
|
|
||||||
/* close */
|
/* close */
|
||||||
msg_ts("[%02u] ...done\n", thread_n);
|
msg_ts("[%02u] ...done\n", thread_n);
|
||||||
xb_fil_cur_close(&cursor);
|
xb_fil_cur_close(&cursor);
|
||||||
@ -2583,7 +2651,7 @@ static bool xtrabackup_copy_logfile(bool last = false)
|
|||||||
if (!start_lsn) {
|
if (!start_lsn) {
|
||||||
msg("mariabackup: Error: xtrabackup_copy_logfile()"
|
msg("mariabackup: Error: xtrabackup_copy_logfile()"
|
||||||
" failed.\n");
|
" failed.\n");
|
||||||
return(true);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
} while (start_lsn == end_lsn);
|
} while (start_lsn == end_lsn);
|
||||||
|
|
||||||
@ -2592,12 +2660,30 @@ static bool xtrabackup_copy_logfile(bool last = false)
|
|||||||
msg_ts(">> log scanned up to (" LSN_PF ")\n", start_lsn);
|
msg_ts(">> log scanned up to (" LSN_PF ")\n", start_lsn);
|
||||||
|
|
||||||
/* update global variable*/
|
/* update global variable*/
|
||||||
|
pthread_mutex_lock(&backup_mutex);
|
||||||
log_copy_scanned_lsn = start_lsn;
|
log_copy_scanned_lsn = start_lsn;
|
||||||
|
pthread_cond_broadcast(&scanned_lsn_cond);
|
||||||
|
pthread_mutex_unlock(&backup_mutex);
|
||||||
|
|
||||||
debug_sync_point("xtrabackup_copy_logfile_pause");
|
debug_sync_point("xtrabackup_copy_logfile_pause");
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Wait until redo log copying thread processes given lsn
|
||||||
|
*/
|
||||||
|
void backup_wait_for_lsn(lsn_t lsn) {
|
||||||
|
bool completed = false;
|
||||||
|
pthread_mutex_lock(&backup_mutex);
|
||||||
|
do {
|
||||||
|
pthread_cond_wait(&scanned_lsn_cond, &backup_mutex);
|
||||||
|
completed = log_copy_scanned_lsn >= lsn;
|
||||||
|
} while (!completed);
|
||||||
|
pthread_mutex_unlock(&backup_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern lsn_t server_lsn_after_lock;
|
||||||
|
|
||||||
static os_thread_ret_t DECLARE_THREAD(log_copying_thread)(void*)
|
static os_thread_ret_t DECLARE_THREAD(log_copying_thread)(void*)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -2654,6 +2740,42 @@ static os_thread_ret_t DECLARE_THREAD(io_watching_thread)(void*)
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef DBUG_OFF
|
||||||
|
/*
|
||||||
|
In debug mode, execute SQL statement that was passed via environment.
|
||||||
|
To use this facility, you need to
|
||||||
|
|
||||||
|
1. Add code DBUG_EXECUTE_MARIABACKUP_EVENT("my_event_name", key););
|
||||||
|
to the code. key is usually a table name
|
||||||
|
2. Set environment variable my_event_name_$key SQL statement you want to execute
|
||||||
|
when event occurs, in DBUG_EXECUTE_IF from above.
|
||||||
|
In mtr , you can set environment via 'let' statement (do not use $ as the first char
|
||||||
|
for the variable)
|
||||||
|
3. start mariabackup with --dbug=+d,debug_mariabackup_events
|
||||||
|
*/
|
||||||
|
static void dbug_mariabackup_event(const char *event,const char *key)
|
||||||
|
{
|
||||||
|
char envvar[FN_REFLEN];
|
||||||
|
if (key) {
|
||||||
|
snprintf(envvar, sizeof(envvar), "%s_%s", event, key);
|
||||||
|
char *slash = strchr(envvar, '/');
|
||||||
|
if (slash)
|
||||||
|
*slash = '_';
|
||||||
|
} else {
|
||||||
|
strncpy(envvar, event, sizeof(envvar));
|
||||||
|
}
|
||||||
|
char *sql = getenv(envvar);
|
||||||
|
if (sql) {
|
||||||
|
msg("dbug_mariabackup_event : executing '%s'\n", sql);
|
||||||
|
xb_mysql_query(mysql_connection, sql, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#define DBUG_MARIABACKUP_EVENT(A, B) DBUG_EXECUTE_IF("mariabackup_events", dbug_mariabackup_event(A,B););
|
||||||
|
#else
|
||||||
|
#define DBUG_MARIABACKUP_EVENT(A,B)
|
||||||
|
#endif
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
Datafiles copying thread.*/
|
Datafiles copying thread.*/
|
||||||
static
|
static
|
||||||
@ -2676,12 +2798,18 @@ DECLARE_THREAD(data_copy_thread_func)(
|
|||||||
|
|
||||||
while ((node = datafiles_iter_next(ctxt->it)) != NULL) {
|
while ((node = datafiles_iter_next(ctxt->it)) != NULL) {
|
||||||
|
|
||||||
|
DBUG_MARIABACKUP_EVENT("before_copy", node->space->name);
|
||||||
|
|
||||||
|
|
||||||
/* copy the datafile */
|
/* copy the datafile */
|
||||||
if(xtrabackup_copy_datafile(node, num)) {
|
if(xtrabackup_copy_datafile(node, num)) {
|
||||||
msg("[%02u] mariabackup: Error: "
|
msg("[%02u] mariabackup: Error: "
|
||||||
"failed to copy datafile.\n", num);
|
"failed to copy datafile.\n", num);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBUG_MARIABACKUP_EVENT("after_copy", node->space->name);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&ctxt->count_mutex);
|
pthread_mutex_lock(&ctxt->count_mutex);
|
||||||
@ -2853,6 +2981,7 @@ xb_load_single_table_tablespace(
|
|||||||
Datafile *file = xb_new_datafile(name, is_remote);
|
Datafile *file = xb_new_datafile(name, is_remote);
|
||||||
|
|
||||||
if (file->open_read_only(true) != DB_SUCCESS) {
|
if (file->open_read_only(true) != DB_SUCCESS) {
|
||||||
|
msg("Can't open datafile %s\n", name);
|
||||||
ut_free(name);
|
ut_free(name);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
@ -3170,7 +3299,7 @@ xb_load_tablespaces()
|
|||||||
}
|
}
|
||||||
|
|
||||||
debug_sync_point("xtrabackup_load_tablespaces_pause");
|
debug_sync_point("xtrabackup_load_tablespaces_pause");
|
||||||
|
DBUG_MARIABACKUP_EVENT("after_load_tablespaces", 0);
|
||||||
return(DB_SUCCESS);
|
return(DB_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3765,6 +3894,8 @@ xtrabackup_backup_func()
|
|||||||
uint count;
|
uint count;
|
||||||
pthread_mutex_t count_mutex;
|
pthread_mutex_t count_mutex;
|
||||||
data_thread_ctxt_t *data_threads;
|
data_thread_ctxt_t *data_threads;
|
||||||
|
pthread_mutex_init(&backup_mutex, NULL);
|
||||||
|
pthread_cond_init(&scanned_lsn_cond, NULL);
|
||||||
|
|
||||||
#ifdef USE_POSIX_FADVISE
|
#ifdef USE_POSIX_FADVISE
|
||||||
msg("mariabackup: uses posix_fadvise().\n");
|
msg("mariabackup: uses posix_fadvise().\n");
|
||||||
@ -3778,7 +3909,7 @@ xtrabackup_backup_func()
|
|||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
msg("mariabackup: cd to %s\n", mysql_real_data_home);
|
msg("mariabackup: cd to %s\n", mysql_real_data_home);
|
||||||
|
encryption_plugin_backup_init(mysql_connection);
|
||||||
msg("mariabackup: open files limit requested %u, set to %u\n",
|
msg("mariabackup: open files limit requested %u, set to %u\n",
|
||||||
(uint) xb_open_files_limit,
|
(uint) xb_open_files_limit,
|
||||||
xb_set_max_open_files(xb_open_files_limit));
|
xb_set_max_open_files(xb_open_files_limit));
|
||||||
@ -3791,6 +3922,7 @@ xtrabackup_backup_func()
|
|||||||
srv_read_only_mode = TRUE;
|
srv_read_only_mode = TRUE;
|
||||||
|
|
||||||
srv_operation = SRV_OPERATION_BACKUP;
|
srv_operation = SRV_OPERATION_BACKUP;
|
||||||
|
log_file_op = backup_file_op;
|
||||||
metadata_to_lsn = 0;
|
metadata_to_lsn = 0;
|
||||||
|
|
||||||
if (xb_close_files)
|
if (xb_close_files)
|
||||||
@ -3804,6 +3936,7 @@ xtrabackup_backup_func()
|
|||||||
fail:
|
fail:
|
||||||
metadata_to_lsn = log_copying_running;
|
metadata_to_lsn = log_copying_running;
|
||||||
stop_backup_threads();
|
stop_backup_threads();
|
||||||
|
log_file_op = NULL;
|
||||||
if (dst_log_file) {
|
if (dst_log_file) {
|
||||||
ds_close(dst_log_file);
|
ds_close(dst_log_file);
|
||||||
dst_log_file = NULL;
|
dst_log_file = NULL;
|
||||||
@ -4053,6 +4186,7 @@ fail_before_log_copying_thread_start:
|
|||||||
goto fail_before_log_copying_thread_start;
|
goto fail_before_log_copying_thread_start;
|
||||||
|
|
||||||
log_copying_stop = os_event_create(0);
|
log_copying_stop = os_event_create(0);
|
||||||
|
log_optimized_ddl_op = backup_optimized_ddl_op;
|
||||||
os_thread_create(log_copying_thread, NULL, &log_copying_thread_id);
|
os_thread_create(log_copying_thread, NULL, &log_copying_thread_id);
|
||||||
|
|
||||||
/* FLUSH CHANGED_PAGE_BITMAPS call */
|
/* FLUSH CHANGED_PAGE_BITMAPS call */
|
||||||
@ -4084,6 +4218,11 @@ fail_before_log_copying_thread_start:
|
|||||||
|
|
||||||
if (opt_lock_ddl_per_table) {
|
if (opt_lock_ddl_per_table) {
|
||||||
mdl_lock_all();
|
mdl_lock_all();
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("check_mdl_lock_works",
|
||||||
|
dbug_alter_thread_done =
|
||||||
|
dbug_start_query_thread("ALTER TABLE test.t ADD COLUMN mdl_lock_column int",
|
||||||
|
"Waiting for table metadata lock", 1, ER_QUERY_INTERRUPTED););
|
||||||
}
|
}
|
||||||
|
|
||||||
it = datafiles_iter_new();
|
it = datafiles_iter_new();
|
||||||
@ -4121,10 +4260,6 @@ fail_before_log_copying_thread_start:
|
|||||||
pthread_mutex_destroy(&count_mutex);
|
pthread_mutex_destroy(&count_mutex);
|
||||||
free(data_threads);
|
free(data_threads);
|
||||||
datafiles_iter_free(it);
|
datafiles_iter_free(it);
|
||||||
|
|
||||||
if (changed_page_bitmap) {
|
|
||||||
xb_page_bitmap_deinit(changed_page_bitmap);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ok = backup_start();
|
bool ok = backup_start();
|
||||||
@ -4148,6 +4283,9 @@ fail_before_log_copying_thread_start:
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (changed_page_bitmap) {
|
||||||
|
xb_page_bitmap_deinit(changed_page_bitmap);
|
||||||
|
}
|
||||||
xtrabackup_destroy_datasinks();
|
xtrabackup_destroy_datasinks();
|
||||||
|
|
||||||
msg("mariabackup: Redo log (from LSN " LSN_PF " to " LSN_PF
|
msg("mariabackup: Redo log (from LSN " LSN_PF " to " LSN_PF
|
||||||
@ -4165,9 +4303,182 @@ fail_before_log_copying_thread_start:
|
|||||||
}
|
}
|
||||||
|
|
||||||
innodb_shutdown();
|
innodb_shutdown();
|
||||||
|
log_file_op = NULL;
|
||||||
|
pthread_mutex_destroy(&backup_mutex);
|
||||||
|
pthread_cond_destroy(&scanned_lsn_cond);
|
||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function handles DDL changes at the end of backup, under protection of
|
||||||
|
FTWRL. This ensures consistent backup in presence of DDL.
|
||||||
|
|
||||||
|
- New tables, that were created during backup, are now copied into backup.
|
||||||
|
Also, tablespaces with optimized (no redo loggin DDL) are re-copied into
|
||||||
|
backup. This tablespaces will get the extension ".new" in the backup
|
||||||
|
|
||||||
|
- Tables that were renamed during backup, are marked as renamed
|
||||||
|
For these, file <old_name>.ren will be created.
|
||||||
|
The content of the file is the new tablespace name.
|
||||||
|
|
||||||
|
- Tables that were deleted during backup, are marked as deleted
|
||||||
|
For these , an empty file <name>.del will be created
|
||||||
|
|
||||||
|
It is the responsibility of the prepare phase to deal with .new, .ren, and .del
|
||||||
|
files.
|
||||||
|
*/
|
||||||
|
void backup_fix_ddl(void)
|
||||||
|
{
|
||||||
|
std::set<std::string> new_tables;
|
||||||
|
std::set<std::string> dropped_tables;
|
||||||
|
std::map<std::string, std::string> renamed_tables;
|
||||||
|
|
||||||
|
for (space_id_to_name_t::iterator iter = ddl_tracker.tables_in_backup.begin();
|
||||||
|
iter != ddl_tracker.tables_in_backup.end();
|
||||||
|
iter++) {
|
||||||
|
|
||||||
|
const std::string name = iter->second;
|
||||||
|
ulint id = iter->first;
|
||||||
|
|
||||||
|
if (ddl_tracker.drops.find(id) != ddl_tracker.drops.end()) {
|
||||||
|
dropped_tables.insert(name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool has_optimized_ddl =
|
||||||
|
ddl_tracker.optimized_ddl.find(id) != ddl_tracker.optimized_ddl.end();
|
||||||
|
|
||||||
|
if (ddl_tracker.id_to_name.find(id) == ddl_tracker.id_to_name.end()) {
|
||||||
|
if (has_optimized_ddl) {
|
||||||
|
new_tables.insert(name);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tablespace was affected by DDL. */
|
||||||
|
const std::string new_name = ddl_tracker.id_to_name[id];
|
||||||
|
if (new_name != name) {
|
||||||
|
if (has_optimized_ddl) {
|
||||||
|
/* table was renamed, but we need a full copy
|
||||||
|
of it because of optimized DDL. We emulate a drop/create.*/
|
||||||
|
dropped_tables.insert(name);
|
||||||
|
new_tables.insert(new_name);
|
||||||
|
} else {
|
||||||
|
/* Renamed, and no optimized DDL*/
|
||||||
|
renamed_tables[name] = new_name;
|
||||||
|
}
|
||||||
|
} else if (has_optimized_ddl) {
|
||||||
|
/* Table was recreated, or optimized DDL ran.
|
||||||
|
In both cases we need a full copy in the backup.*/
|
||||||
|
new_tables.insert(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find tables that were created during backup (and not removed).*/
|
||||||
|
for(space_id_to_name_t::iterator iter = ddl_tracker.id_to_name.begin();
|
||||||
|
iter != ddl_tracker.id_to_name.end();
|
||||||
|
iter++) {
|
||||||
|
|
||||||
|
ulint id = iter->first;
|
||||||
|
std::string name = iter->second;
|
||||||
|
|
||||||
|
if (ddl_tracker.tables_in_backup.find(id) != ddl_tracker.tables_in_backup.end()) {
|
||||||
|
/* already processed above */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ddl_tracker.drops.find(id) == ddl_tracker.drops.end()) {
|
||||||
|
dropped_tables.erase(name);
|
||||||
|
new_tables.insert(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark tablespaces for rename
|
||||||
|
for (std::map<std::string, std::string>::iterator iter = renamed_tables.begin();
|
||||||
|
iter != renamed_tables.end(); ++iter) {
|
||||||
|
const std::string old_name = iter->first;
|
||||||
|
std::string new_name = iter->second;
|
||||||
|
backup_file_printf((old_name + ".ren").c_str(), "%s", new_name.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark tablespaces for drop
|
||||||
|
for (std::set<std::string>::iterator iter = dropped_tables.begin();
|
||||||
|
iter != dropped_tables.end();
|
||||||
|
iter++) {
|
||||||
|
const std::string name(*iter);
|
||||||
|
backup_file_printf((name + ".del").c_str(), "%s", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load and copy new tables.
|
||||||
|
// Close all datanodes first, reload only new tables.
|
||||||
|
std::vector<fil_node_t *> all_nodes;
|
||||||
|
datafiles_iter_t *it = datafiles_iter_new();
|
||||||
|
if (!it)
|
||||||
|
return;
|
||||||
|
while (fil_node_t *node = datafiles_iter_next(it)) {
|
||||||
|
all_nodes.push_back(node);
|
||||||
|
}
|
||||||
|
for (size_t i = 0; i < all_nodes.size(); i++) {
|
||||||
|
fil_node_t *n = all_nodes[i];
|
||||||
|
if (n->space->id == 0)
|
||||||
|
continue;
|
||||||
|
if (n->is_open()) {
|
||||||
|
mutex_enter(&fil_system.mutex);
|
||||||
|
n->close();
|
||||||
|
mutex_exit(&fil_system.mutex);
|
||||||
|
}
|
||||||
|
fil_space_free(n->space->id, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (std::set<std::string>::iterator iter = new_tables.begin();
|
||||||
|
iter != new_tables.end(); iter++) {
|
||||||
|
const char *space_name = iter->c_str();
|
||||||
|
if (check_if_skip_table(space_name))
|
||||||
|
continue;
|
||||||
|
std::string name(*iter);
|
||||||
|
bool is_remote = access((name + ".ibd").c_str(), R_OK) != 0;
|
||||||
|
const char *extension = is_remote ? ".isl" : ".ibd";
|
||||||
|
name.append(extension);
|
||||||
|
char buf[FN_REFLEN];
|
||||||
|
strncpy(buf, name.c_str(), sizeof(buf));
|
||||||
|
const char *dbname = buf;
|
||||||
|
char *p = strchr(buf, '/');
|
||||||
|
if (p == 0) {
|
||||||
|
msg("Unexpected tablespace %s filename %s\n", space_name, name.c_str());
|
||||||
|
ut_a(0);
|
||||||
|
}
|
||||||
|
ut_a(p);
|
||||||
|
*p = 0;
|
||||||
|
const char *tablename = p + 1;
|
||||||
|
xb_load_single_table_tablespace(dbname, tablename, is_remote);
|
||||||
|
}
|
||||||
|
|
||||||
|
it = datafiles_iter_new();
|
||||||
|
if (!it)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (fil_node_t *node = datafiles_iter_next(it)) {
|
||||||
|
fil_space_t * space = node->space;
|
||||||
|
if (!fil_is_user_tablespace_id(space->id))
|
||||||
|
continue;
|
||||||
|
std::string dest_name(node->space->name);
|
||||||
|
dest_name.append(".new");
|
||||||
|
#if 0
|
||||||
|
bool do_full_copy = ddl_tracker.optimized_ddl.find(n->space->id) != ddl_tracker.optimized_ddl.end();
|
||||||
|
if (do_full_copy) {
|
||||||
|
msg(
|
||||||
|
"Performing a full copy of the tablespace %s, because optimized (without redo logging) DDL operation"
|
||||||
|
"ran during backup. You can use set innodb_log_optimize_ddl=OFF to improve backup performance"
|
||||||
|
"in the future.\n",
|
||||||
|
n->space->name);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
xtrabackup_copy_datafile(node, 0, dest_name.c_str()/*, do_full_copy ? ULONGLONG_MAX:UNIV_PAGE_SIZE */);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ================= prepare ================= */
|
/* ================= prepare ================= */
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
@ -4680,6 +4991,27 @@ error:
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string change_extension(std::string filename, std::string new_ext) {
|
||||||
|
DBUG_ASSERT(new_ext.size() == 3);
|
||||||
|
std::string new_name(filename);
|
||||||
|
new_name.resize(new_name.size() - new_ext.size());
|
||||||
|
new_name.append(new_ext);
|
||||||
|
return new_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void rename_file(const char *from,const char *to) {
|
||||||
|
msg("Renaming %s to %s\n", from, to);
|
||||||
|
if (my_rename(from, to, MY_WME)) {
|
||||||
|
msg("Cannot rename %s to %s errno %d", from, to, errno);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rename_file(const std::string& from, const std::string &to) {
|
||||||
|
rename_file(from.c_str(), to.c_str());
|
||||||
|
}
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
Callback to handle datadir entry. Function of this type will be called
|
Callback to handle datadir entry. Function of this type will be called
|
||||||
for each entry which matches the mask by xb_process_datadir.
|
for each entry which matches the mask by xb_process_datadir.
|
||||||
@ -4691,6 +5023,37 @@ typedef ibool (*handle_datadir_entry_func_t)(
|
|||||||
const char* file_name, /*!<in: file name with suffix */
|
const char* file_name, /*!<in: file name with suffix */
|
||||||
void* arg); /*!<in: caller-provided data */
|
void* arg); /*!<in: caller-provided data */
|
||||||
|
|
||||||
|
/** Rename, and replace destination file, if exists */
|
||||||
|
static void rename_force(const char *from, const char *to) {
|
||||||
|
if (access(to, R_OK) == 0) {
|
||||||
|
msg("Removing %s\n", to);
|
||||||
|
if (my_delete(to, MYF(MY_WME))) {
|
||||||
|
msg("Can't remove %s, errno %d", to, errno);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rename_file(from,to);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* During prepare phase, rename ".new" files , that were created in backup_fix_ddl(),
|
||||||
|
to ".ibd".*/
|
||||||
|
static ibool prepare_handle_new_files(
|
||||||
|
const char* data_home_dir, /*!<in: path to datadir */
|
||||||
|
const char* db_name, /*!<in: database name */
|
||||||
|
const char* file_name, /*!<in: file name with suffix */
|
||||||
|
void *)
|
||||||
|
{
|
||||||
|
|
||||||
|
std::string src_path = std::string(data_home_dir) + '/' + std::string(db_name) + '/' + file_name;
|
||||||
|
std::string dest_path = src_path;
|
||||||
|
|
||||||
|
size_t index = dest_path.find(".new");
|
||||||
|
DBUG_ASSERT(index != std::string::npos);
|
||||||
|
dest_path.replace(index, 4, ".ibd");
|
||||||
|
rename_force(src_path.c_str(),dest_path.c_str());
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
Callback to handle datadir entry. Deletes entry if it has no matching
|
Callback to handle datadir entry. Deletes entry if it has no matching
|
||||||
fil_space in fil_system directory.
|
fil_space in fil_system directory.
|
||||||
@ -4896,6 +5259,103 @@ store_binlog_info(const char* filename, const char* name, ulonglong pos)
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Check if file exists*/
|
||||||
|
static bool file_exists(std::string name)
|
||||||
|
{
|
||||||
|
return access(name.c_str(), R_OK) == 0 ;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Read file content into STL string */
|
||||||
|
static std::string read_file_as_string(const std::string file) {
|
||||||
|
char content[FN_REFLEN];
|
||||||
|
FILE *f = fopen(file.c_str(), "r");
|
||||||
|
if (!f) {
|
||||||
|
msg("Can not open %s\n", file.c_str());
|
||||||
|
}
|
||||||
|
size_t len = fread(content, 1, FN_REFLEN, f);
|
||||||
|
fclose(f);
|
||||||
|
return std::string(content, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Delete file- Provide verbose diagnostics and exit, if operation fails. */
|
||||||
|
static void delete_file(const std::string& file, bool if_exists = false) {
|
||||||
|
if (if_exists && !file_exists(file))
|
||||||
|
return;
|
||||||
|
if (my_delete(file.c_str(), MYF(MY_WME))) {
|
||||||
|
msg("Can't remove %s, errno %d", file.c_str(), errno);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Rename tablespace during prepare.
|
||||||
|
Backup in its end phase may generate some .ren files, recording
|
||||||
|
tablespaces that should be renamed in --prepare.
|
||||||
|
*/
|
||||||
|
static void rename_table_in_prepare(const std::string &datadir, const std::string& from , const std::string& to,
|
||||||
|
const char *extension=0) {
|
||||||
|
if (!extension) {
|
||||||
|
static const char *extensions_nonincremental[] = { ".ibd", 0 };
|
||||||
|
static const char *extensions_incremental[] = { ".ibd.delta", ".ibd.meta", 0 };
|
||||||
|
const char **extensions = xtrabackup_incremental_dir ?
|
||||||
|
extensions_incremental : extensions_nonincremental;
|
||||||
|
for (size_t i = 0; extensions[i]; i++) {
|
||||||
|
rename_table_in_prepare(datadir, from, to, extensions[i]);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
std::string src = std::string(datadir) + "/" + from + extension;
|
||||||
|
std::string dest = std::string(datadir) + "/" + to + extension;
|
||||||
|
std::string ren2, tmp;
|
||||||
|
if (file_exists(dest)) {
|
||||||
|
ren2= std::string(datadir) + "/" + to + ".ren";
|
||||||
|
if (!file_exists(ren2)) {
|
||||||
|
msg("ERROR : File %s was not found, but expected during rename processing\n", ren2.c_str());
|
||||||
|
ut_a(0);
|
||||||
|
}
|
||||||
|
tmp = to + "#";
|
||||||
|
rename_table_in_prepare(datadir, to, tmp);
|
||||||
|
}
|
||||||
|
rename_file(src, dest);
|
||||||
|
if (ren2.size()) {
|
||||||
|
// Make sure the temp. renamed file is processed.
|
||||||
|
std::string to2 = read_file_as_string(ren2);
|
||||||
|
rename_table_in_prepare(datadir, tmp, to2);
|
||||||
|
delete_file(ren2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static ibool prepare_handle_ren_files(const char *datadir, const char *db, const char *filename, void *) {
|
||||||
|
|
||||||
|
std::string ren_file = std::string(datadir) + "/" + db + "/" + filename;
|
||||||
|
if (!file_exists(ren_file))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
std::string to = read_file_as_string(ren_file);
|
||||||
|
std::string source_space_name = std::string(db) + "/" + filename;
|
||||||
|
source_space_name.resize(source_space_name.size() - 4); // remove extension
|
||||||
|
|
||||||
|
rename_table_in_prepare(datadir, source_space_name.c_str(), to.c_str());
|
||||||
|
delete_file(ren_file);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove tablespaces during backup, based on */
|
||||||
|
static ibool prepare_handle_del_files(const char *datadir, const char *db, const char *filename, void *) {
|
||||||
|
std::string del_file = std::string(datadir) + "/" + db + "/" + filename;
|
||||||
|
std::string path(del_file);
|
||||||
|
path.resize(path.size() - 4); // remove extension;
|
||||||
|
if (xtrabackup_incremental) {
|
||||||
|
delete_file(path + ".ibd.delta", true);
|
||||||
|
delete_file(path + ".ibd.meta", true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
delete_file(path + ".ibd", true);
|
||||||
|
}
|
||||||
|
delete_file(del_file);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/** Implement --prepare
|
/** Implement --prepare
|
||||||
@return whether the operation succeeded */
|
@return whether the operation succeeded */
|
||||||
static bool
|
static bool
|
||||||
@ -4913,6 +5373,21 @@ xtrabackup_prepare_func(char** argv)
|
|||||||
}
|
}
|
||||||
msg("mariabackup: cd to %s\n", xtrabackup_real_target_dir);
|
msg("mariabackup: cd to %s\n", xtrabackup_real_target_dir);
|
||||||
|
|
||||||
|
fil_path_to_mysql_datadir = ".";
|
||||||
|
|
||||||
|
if (xtrabackup_incremental_dir) {
|
||||||
|
xb_process_datadir(xtrabackup_incremental_dir, ".new.meta", prepare_handle_new_files);
|
||||||
|
xb_process_datadir(xtrabackup_incremental_dir, ".new.delta", prepare_handle_new_files);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
xb_process_datadir(".", ".new", prepare_handle_new_files);
|
||||||
|
}
|
||||||
|
xb_process_datadir(xtrabackup_incremental_dir? xtrabackup_incremental_dir:".",
|
||||||
|
".ren", prepare_handle_ren_files);
|
||||||
|
xb_process_datadir(xtrabackup_incremental_dir ? xtrabackup_incremental_dir : ".",
|
||||||
|
".del", prepare_handle_del_files);
|
||||||
|
|
||||||
|
|
||||||
int argc; for (argc = 0; argv[argc]; argc++) {}
|
int argc; for (argc = 0; argv[argc]; argc++) {}
|
||||||
encryption_plugin_prepare_init(argc, argv);
|
encryption_plugin_prepare_init(argc, argv);
|
||||||
|
|
||||||
@ -5203,7 +5678,6 @@ xb_init()
|
|||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
encryption_plugin_backup_init(mysql_connection);
|
|
||||||
history_start_time = time(NULL);
|
history_start_time = time(NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -5261,7 +5735,7 @@ handle_options(int argc, char **argv, char ***argv_client, char ***argv_server)
|
|||||||
srv_operation = SRV_OPERATION_RESTORE;
|
srv_operation = SRV_OPERATION_RESTORE;
|
||||||
|
|
||||||
files_charset_info = &my_charset_utf8_general_ci;
|
files_charset_info = &my_charset_utf8_general_ci;
|
||||||
check_if_backup_includes = backup_includes;
|
|
||||||
|
|
||||||
setup_error_messages();
|
setup_error_messages();
|
||||||
sys_var_init();
|
sys_var_init();
|
||||||
|
@ -105,11 +105,13 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||||||
break;
|
break;
|
||||||
case 'V':
|
case 'V':
|
||||||
print_version();
|
print_version();
|
||||||
|
my_end(0);
|
||||||
exit(0);
|
exit(0);
|
||||||
break;
|
break;
|
||||||
case 'I':
|
case 'I':
|
||||||
case '?':
|
case '?':
|
||||||
usage();
|
usage();
|
||||||
|
my_end(0);
|
||||||
exit(0);
|
exit(0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -122,7 +124,10 @@ static int get_options(int *argc,char ***argv)
|
|||||||
int ho_error;
|
int ho_error;
|
||||||
|
|
||||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||||
|
{
|
||||||
|
my_end(0);
|
||||||
exit(ho_error);
|
exit(ho_error);
|
||||||
|
}
|
||||||
|
|
||||||
if (!*argc && !print_all_codes)
|
if (!*argc && !print_all_codes)
|
||||||
{
|
{
|
||||||
@ -260,7 +265,10 @@ int main(int argc,char *argv[])
|
|||||||
MY_INIT(argv[0]);
|
MY_INIT(argv[0]);
|
||||||
|
|
||||||
if (get_options(&argc,&argv))
|
if (get_options(&argc,&argv))
|
||||||
|
{
|
||||||
|
my_end(0);
|
||||||
exit(1);
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
my_handler_error_register();
|
my_handler_error_register();
|
||||||
|
|
||||||
|
@ -79,6 +79,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||||||
case 'I':
|
case 'I':
|
||||||
case '?':
|
case '?':
|
||||||
usage();
|
usage();
|
||||||
|
my_end(0);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -91,7 +92,10 @@ static int get_options(int *argc,char ***argv)
|
|||||||
int ho_error;
|
int ho_error;
|
||||||
|
|
||||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||||
|
{
|
||||||
|
my_end(0);
|
||||||
exit(ho_error);
|
exit(ho_error);
|
||||||
|
}
|
||||||
|
|
||||||
if (*argc == 0)
|
if (*argc == 0)
|
||||||
{
|
{
|
||||||
@ -113,10 +117,14 @@ int main(int argc, char **argv)
|
|||||||
MY_INIT(argv[0]);
|
MY_INIT(argv[0]);
|
||||||
|
|
||||||
if (get_options(&argc,&argv))
|
if (get_options(&argc,&argv))
|
||||||
|
{
|
||||||
|
my_end(0);
|
||||||
exit(1);
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
while (argc--)
|
while (argc--)
|
||||||
{
|
{
|
||||||
|
my_bool do_more;
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
#endif
|
#endif
|
||||||
@ -125,13 +133,13 @@ int main(int argc, char **argv)
|
|||||||
/* Not compatible with IPv6! Probably should use getnameinfo(). */
|
/* Not compatible with IPv6! Probably should use getnameinfo(). */
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
taddr = inet_addr(ip);
|
taddr = inet_addr(ip);
|
||||||
if(taddr != INADDR_NONE)
|
do_more= (taddr != INADDR_NONE);
|
||||||
{
|
|
||||||
#else
|
#else
|
||||||
if (inet_aton(ip, &addr) != 0)
|
if ((do_more= (inet_aton(ip, &addr) != 0)))
|
||||||
{
|
|
||||||
taddr= addr.s_addr;
|
taddr= addr.s_addr;
|
||||||
#endif
|
#endif
|
||||||
|
if (do_more)
|
||||||
|
{
|
||||||
if (taddr == htonl(INADDR_BROADCAST))
|
if (taddr == htonl(INADDR_BROADCAST))
|
||||||
{
|
{
|
||||||
puts("Broadcast");
|
puts("Broadcast");
|
||||||
@ -205,5 +213,6 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
my_end(0);
|
||||||
exit(error);
|
exit(error);
|
||||||
}
|
}
|
||||||
|
@ -20,9 +20,6 @@ INCLUDE_DIRECTORIES(
|
|||||||
${CMAKE_SOURCE_DIR}/extra/yassl/taocrypt/mySTL)
|
${CMAKE_SOURCE_DIR}/extra/yassl/taocrypt/mySTL)
|
||||||
|
|
||||||
ADD_DEFINITIONS(${SSL_DEFINES})
|
ADD_DEFINITIONS(${SSL_DEFINES})
|
||||||
#Remove -fno-implicit-templates
|
|
||||||
#(yassl sources cannot be compiled with it)
|
|
||||||
STRING(REPLACE "-fno-implicit-templates" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
|
|
||||||
SET(YASSL_SOURCES src/buffer.cpp src/cert_wrapper.cpp src/crypto_wrapper.cpp src/handshake.cpp src/lock.cpp
|
SET(YASSL_SOURCES src/buffer.cpp src/cert_wrapper.cpp src/crypto_wrapper.cpp src/handshake.cpp src/lock.cpp
|
||||||
src/log.cpp src/socket_wrapper.cpp src/ssl.cpp src/timer.cpp src/yassl_error.cpp
|
src/log.cpp src/socket_wrapper.cpp src/ssl.cpp src/timer.cpp src/yassl_error.cpp
|
||||||
src/yassl_imp.cpp src/yassl_int.cpp)
|
src/yassl_imp.cpp src/yassl_int.cpp)
|
||||||
|
@ -370,7 +370,7 @@ typedef int (*my_charset_conv_mb_wc)(CHARSET_INFO *, my_wc_t *,
|
|||||||
typedef int (*my_charset_conv_wc_mb)(CHARSET_INFO *, my_wc_t,
|
typedef int (*my_charset_conv_wc_mb)(CHARSET_INFO *, my_wc_t,
|
||||||
uchar *, uchar *);
|
uchar *, uchar *);
|
||||||
typedef size_t (*my_charset_conv_case)(CHARSET_INFO *,
|
typedef size_t (*my_charset_conv_case)(CHARSET_INFO *,
|
||||||
char *, size_t, char *, size_t);
|
const char *, size_t, char *, size_t);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
A structure to return the statistics of a native string copying,
|
A structure to return the statistics of a native string copying,
|
||||||
@ -725,9 +725,11 @@ size_t my_copy_fix_mb(CHARSET_INFO *cs,
|
|||||||
/* Functions for 8bit */
|
/* Functions for 8bit */
|
||||||
extern size_t my_caseup_str_8bit(CHARSET_INFO *, char *);
|
extern size_t my_caseup_str_8bit(CHARSET_INFO *, char *);
|
||||||
extern size_t my_casedn_str_8bit(CHARSET_INFO *, char *);
|
extern size_t my_casedn_str_8bit(CHARSET_INFO *, char *);
|
||||||
extern size_t my_caseup_8bit(CHARSET_INFO *, char *src, size_t srclen,
|
extern size_t my_caseup_8bit(CHARSET_INFO *,
|
||||||
|
const char *src, size_t srclen,
|
||||||
char *dst, size_t dstlen);
|
char *dst, size_t dstlen);
|
||||||
extern size_t my_casedn_8bit(CHARSET_INFO *, char *src, size_t srclen,
|
extern size_t my_casedn_8bit(CHARSET_INFO *,
|
||||||
|
const char *src, size_t srclen,
|
||||||
char *dst, size_t dstlen);
|
char *dst, size_t dstlen);
|
||||||
|
|
||||||
extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *);
|
extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *);
|
||||||
@ -821,17 +823,17 @@ int my_charlen_8bit(CHARSET_INFO *, const uchar *str, const uchar *end);
|
|||||||
/* Functions for multibyte charsets */
|
/* Functions for multibyte charsets */
|
||||||
extern size_t my_caseup_str_mb(CHARSET_INFO *, char *);
|
extern size_t my_caseup_str_mb(CHARSET_INFO *, char *);
|
||||||
extern size_t my_casedn_str_mb(CHARSET_INFO *, char *);
|
extern size_t my_casedn_str_mb(CHARSET_INFO *, char *);
|
||||||
extern size_t my_caseup_mb(CHARSET_INFO *, char *src, size_t srclen,
|
extern size_t my_caseup_mb(CHARSET_INFO *,
|
||||||
char *dst, size_t dstlen);
|
const char *src, size_t srclen,
|
||||||
extern size_t my_casedn_mb(CHARSET_INFO *, char *src, size_t srclen,
|
char *dst, size_t dstlen);
|
||||||
char *dst, size_t dstlen);
|
extern size_t my_casedn_mb(CHARSET_INFO *,
|
||||||
extern size_t my_caseup_mb_varlen(CHARSET_INFO *, char *src, size_t srclen,
|
const char *src, size_t srclen,
|
||||||
char *dst, size_t dstlen);
|
char *dst, size_t dstlen);
|
||||||
extern size_t my_casedn_mb_varlen(CHARSET_INFO *, char *src, size_t srclen,
|
extern size_t my_caseup_ujis(CHARSET_INFO *,
|
||||||
char *dst, size_t dstlen);
|
const char *src, size_t srclen,
|
||||||
extern size_t my_caseup_ujis(CHARSET_INFO *, char *src, size_t srclen,
|
|
||||||
char *dst, size_t dstlen);
|
char *dst, size_t dstlen);
|
||||||
extern size_t my_casedn_ujis(CHARSET_INFO *, char *src, size_t srclen,
|
extern size_t my_casedn_ujis(CHARSET_INFO *,
|
||||||
|
const char *src, size_t srclen,
|
||||||
char *dst, size_t dstlen);
|
char *dst, size_t dstlen);
|
||||||
extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *);
|
extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *);
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#ifndef SQL_COMMON_INCLUDED
|
#ifndef SQL_COMMON_INCLUDED
|
||||||
#define SQL_COMMON_INCLUDED
|
#define SQL_COMMON_INCLUDED
|
||||||
/* Copyright (c) 2003, 2012, Oracle and/or its affiliates.
|
/* Copyright (c) 2003, 2018, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2010, 2012, Monty Program Ab
|
Copyright (c) 2010, 2018, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
Submodule libmariadb updated: ebf5db6cd0...b948553b34
@ -155,8 +155,7 @@ SET(LIBS
|
|||||||
# (with corresponding target ${engine}_embedded)
|
# (with corresponding target ${engine}_embedded)
|
||||||
SET(EMBEDDED_LIBS)
|
SET(EMBEDDED_LIBS)
|
||||||
FOREACH(LIB ${LIBS})
|
FOREACH(LIB ${LIBS})
|
||||||
GET_TARGET_PROPERTY(EMBEDDED_LOCATION ${LIB}_embedded LOCATION)
|
IF(TARGET ${LIB}_embedded)
|
||||||
IF(EMBEDDED_LOCATION)
|
|
||||||
LIST(APPEND EMBEDDED_LIBS ${LIB}_embedded)
|
LIST(APPEND EMBEDDED_LIBS ${LIB}_embedded)
|
||||||
ELSE()
|
ELSE()
|
||||||
LIST(APPEND EMBEDDED_LIBS ${LIB})
|
LIST(APPEND EMBEDDED_LIBS ${LIB})
|
||||||
|
15
mysql-test/include/ctype_mdev13118.inc
Normal file
15
mysql-test/include/ctype_mdev13118.inc
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
--sorted_result
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
--sorted_result
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
@ -112,6 +112,8 @@ sub check_socket_path_length {
|
|||||||
return 0 if ($^O eq 'aix');
|
return 0 if ($^O eq 'aix');
|
||||||
# See Debian bug #670722 - failing on kFreeBSD even after setting short path
|
# See Debian bug #670722 - failing on kFreeBSD even after setting short path
|
||||||
return 0 if $^O eq 'gnukfreebsd' and length $path < 40;
|
return 0 if $^O eq 'gnukfreebsd' and length $path < 40;
|
||||||
|
# GNU/Hurd doesn't have hostpath(), but no limitation either
|
||||||
|
return 0 if $^O eq 'gnu';
|
||||||
|
|
||||||
require IO::Socket::UNIX;
|
require IO::Socket::UNIX;
|
||||||
|
|
||||||
|
@ -114,4 +114,14 @@ EOF
|
|||||||
--source include/kill_mysqld.inc
|
--source include/kill_mysqld.inc
|
||||||
--exec $MYSQLD_BOOTSTRAP_CMD --ignore-db-dirs='some_dir' --ignore-db-dirs='some_dir' < $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1
|
--exec $MYSQLD_BOOTSTRAP_CMD --ignore-db-dirs='some_dir' --ignore-db-dirs='some_dir' < $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1
|
||||||
--remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql
|
--remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-13397 MariaDB upgrade fail when using default_time_zone
|
||||||
|
#
|
||||||
|
--write_file $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql
|
||||||
|
use test;
|
||||||
|
EOF
|
||||||
|
--exec $MYSQLD_BOOTSTRAP_CMD --default-time-zone=Europe/Moscow < $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1
|
||||||
|
--remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql
|
||||||
|
|
||||||
--source include/start_mysqld.inc
|
--source include/start_mysqld.inc
|
||||||
|
@ -3048,6 +3048,29 @@ DROP TABLE t1;
|
|||||||
SELECT _binary 0x7E, _binary X'7E', _binary B'01111110';
|
SELECT _binary 0x7E, _binary X'7E', _binary B'01111110';
|
||||||
_binary 0x7E _binary X'7E' _binary B'01111110'
|
_binary 0x7E _binary X'7E' _binary B'01111110'
|
||||||
~ ~ ~
|
~ ~ ~
|
||||||
|
SET NAMES utf8, character_set_connection=binary;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varbinary(10) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -24,6 +24,9 @@ SET NAMES binary;
|
|||||||
--echo #
|
--echo #
|
||||||
SELECT _binary 0x7E, _binary X'7E', _binary B'01111110';
|
SELECT _binary 0x7E, _binary X'7E', _binary B'01111110';
|
||||||
|
|
||||||
|
SET NAMES utf8, character_set_connection=binary;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.0 tests
|
--echo # End of 10.0 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -33844,6 +33844,29 @@ HEX(a) CHAR_LENGTH(a)
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SELECT _eucjpms 0x8EA0;
|
SELECT _eucjpms 0x8EA0;
|
||||||
ERROR HY000: Invalid eucjpms character string: '8EA0'
|
ERROR HY000: Invalid eucjpms character string: '8EA0'
|
||||||
|
SET NAMES eucjpms;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varchar(10) CHARACTER SET eucjpms DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -537,6 +537,8 @@ DROP TABLE t1;
|
|||||||
--error ER_INVALID_CHARACTER_STRING
|
--error ER_INVALID_CHARACTER_STRING
|
||||||
SELECT _eucjpms 0x8EA0;
|
SELECT _eucjpms 0x8EA0;
|
||||||
|
|
||||||
|
SET NAMES eucjpms;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.0 tests
|
--echo # End of 10.0 tests
|
||||||
|
@ -25405,6 +25405,35 @@ A1A1A1A1A1A120202020202020202020202020202020202020
|
|||||||
# End of 5.6 tests
|
# End of 5.6 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
# Start of 10.0 tests
|
||||||
|
#
|
||||||
|
SET NAMES utf8, character_set_connection=euckr;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varchar(10) CHARACTER SET euckr DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
|
#
|
||||||
|
# End of 10.0 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
# Start of 10.2 tests
|
# Start of 10.2 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -197,6 +197,16 @@ set collation_connection=euckr_bin;
|
|||||||
--echo # End of 5.6 tests
|
--echo # End of 5.6 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.0 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8, character_set_connection=euckr;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.0 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Start of 10.2 tests
|
--echo # Start of 10.2 tests
|
||||||
|
@ -5081,6 +5081,29 @@ E05C5B
|
|||||||
E05B
|
E05B
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
# Start of ctype_E05C.inc
|
# Start of ctype_E05C.inc
|
||||||
|
SET NAMES utf8, character_set_connection=gbk;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varchar(10) CHARACTER SET gbk DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
# MDEV-9886 Illegal mix of collations with a view comparing a field to a binary constant
|
# MDEV-9886 Illegal mix of collations with a view comparing a field to a binary constant
|
||||||
#
|
#
|
||||||
|
@ -199,6 +199,9 @@ let $ctype_unescape_combinations=selected;
|
|||||||
SET NAMES gbk;
|
SET NAMES gbk;
|
||||||
--source include/ctype_E05C.inc
|
--source include/ctype_E05C.inc
|
||||||
|
|
||||||
|
SET NAMES utf8, character_set_connection=gbk;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-9886 Illegal mix of collations with a view comparing a field to a binary constant
|
--echo # MDEV-9886 Illegal mix of collations with a view comparing a field to a binary constant
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -8022,6 +8022,29 @@ a
|
|||||||
0
|
0
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
SET NAMES latin1;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varchar(10) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -262,6 +262,9 @@ SELECT * FROM v1;
|
|||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
SET NAMES latin1;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.0 tests
|
--echo # End of 10.0 tests
|
||||||
|
@ -5690,6 +5690,29 @@ c2
|
|||||||
YWJjZGVmZ2hp-YWJjZGVmZ2hp
|
YWJjZGVmZ2hp-YWJjZGVmZ2hp
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET optimizer_switch=@save_optimizer_switch;
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
|
SET NAMES utf8, character_set_connection=ucs2;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varchar(10) CHARACTER SET ucs2 DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -992,6 +992,10 @@ DROP TABLE t1;
|
|||||||
SET optimizer_switch=@save_optimizer_switch;
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
|
|
||||||
|
|
||||||
|
SET NAMES utf8, character_set_connection=ucs2;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.0 tests
|
--echo # End of 10.0 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -26149,6 +26149,29 @@ HEX(a) CHAR_LENGTH(a)
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SELECT _ujis 0x8EA0;
|
SELECT _ujis 0x8EA0;
|
||||||
ERROR HY000: Invalid ujis character string: '8EA0'
|
ERROR HY000: Invalid ujis character string: '8EA0'
|
||||||
|
SET NAMES ujis;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varchar(10) CHARACTER SET ujis DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -1368,6 +1368,10 @@ DROP TABLE t1;
|
|||||||
SELECT _ujis 0x8EA0;
|
SELECT _ujis 0x8EA0;
|
||||||
|
|
||||||
|
|
||||||
|
SET NAMES ujis;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.0 tests
|
--echo # End of 10.0 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -2142,6 +2142,29 @@ EXECUTE stmt USING @arg00;
|
|||||||
CONCAT(_utf16'a' COLLATE utf16_unicode_ci, ?)
|
CONCAT(_utf16'a' COLLATE utf16_unicode_ci, ?)
|
||||||
aÿ
|
aÿ
|
||||||
DEALLOCATE PREPARE stmt;
|
DEALLOCATE PREPARE stmt;
|
||||||
|
SET NAMES utf8, character_set_connection=utf16;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varchar(10) CHARACTER SET utf16 DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -870,6 +870,11 @@ SET @arg00=_binary 0x00FF;
|
|||||||
EXECUTE stmt USING @arg00;
|
EXECUTE stmt USING @arg00;
|
||||||
DEALLOCATE PREPARE stmt;
|
DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
|
||||||
|
SET NAMES utf8, character_set_connection=utf16;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.0 tests
|
--echo # End of 10.0 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -2326,6 +2326,35 @@ DFFFFFDFFFFF9CFFFF9DFFFF9EFFFF
|
|||||||
# End of 5.6 tests
|
# End of 5.6 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
# Start of 10.0 tests
|
||||||
|
#
|
||||||
|
SET NAMES utf8, character_set_connection=utf16le;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varchar(10) CHARACTER SET utf16le DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
|
#
|
||||||
|
# Start of 10.0 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
# Start of 10.1 tests
|
# Start of 10.1 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -747,6 +747,19 @@ SET NAMES utf8, collation_connection=utf16le_bin;
|
|||||||
--echo # End of 5.6 tests
|
--echo # End of 5.6 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.0 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
|
||||||
|
SET NAMES utf8, character_set_connection=utf16le;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.0 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Start of 10.1 tests
|
--echo # Start of 10.1 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -2241,6 +2241,29 @@ EXECUTE stmt USING @arg00;
|
|||||||
CONCAT(_utf32'a' COLLATE utf32_unicode_ci, ?)
|
CONCAT(_utf32'a' COLLATE utf32_unicode_ci, ?)
|
||||||
aÿ
|
aÿ
|
||||||
DEALLOCATE PREPARE stmt;
|
DEALLOCATE PREPARE stmt;
|
||||||
|
SET NAMEs utf8, character_set_connection=utf32;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varchar(10) CHARACTER SET utf32 DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -983,6 +983,14 @@ SET @arg00=_binary 0x00FF;
|
|||||||
EXECUTE stmt USING @arg00;
|
EXECUTE stmt USING @arg00;
|
||||||
DEALLOCATE PREPARE stmt;
|
DEALLOCATE PREPARE stmt;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET NAMEs utf8, character_set_connection=utf32;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.0 tests
|
--echo # End of 10.0 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -10286,6 +10286,29 @@ SELECT * FROM v1;
|
|||||||
c
|
c
|
||||||
ß
|
ß
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
|
SET NAMES utf8;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varchar(10) CHARACTER SET utf8 DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -1890,6 +1890,13 @@ SELECT * FROM v1;
|
|||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET NAMES utf8;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.0 tests
|
--echo # End of 10.0 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -3478,6 +3478,29 @@ t1 CREATE TABLE `t1` (
|
|||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET NAMES default;
|
SET NAMES default;
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch=_latin1'derived_merge=on';
|
||||||
|
CREATE TABLE t1 AS SELECT REPEAT('a', 10) AS t LIMIT 0;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`t` varchar(10) CHARACTER SET utf8mb4 DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES ('abcdefghi'),('ABCDEFGHI');
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT LOWER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
abcdefghi-abcdefghi
|
||||||
|
SELECT CONCAT(t2,'-',t2) c2 FROM (SELECT UPPER(t) t2 FROM t1) sub;
|
||||||
|
c2
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
ABCDEFGHI-ABCDEFGHI
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -1959,6 +1959,14 @@ DROP TABLE t1;
|
|||||||
|
|
||||||
SET NAMES default;
|
SET NAMES default;
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-13118 Wrong results with LOWER and UPPER and subquery
|
||||||
|
#
|
||||||
|
SET NAMES utf8mb4;
|
||||||
|
--source include/ctype_mdev13118.inc
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.0 tests
|
--echo # End of 10.0 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -1053,6 +1053,7 @@ INSERT INTO t2 VALUES (NULL),(NULL);
|
|||||||
CREATE TABLE t3 (c VARCHAR(1024) CHARACTER SET utf8, d INT) ENGINE=MyISAM;
|
CREATE TABLE t3 (c VARCHAR(1024) CHARACTER SET utf8, d INT) ENGINE=MyISAM;
|
||||||
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t3;
|
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t3;
|
||||||
INSERT INTO t3 VALUES ('abc',NULL),('def',4);
|
INSERT INTO t3 VALUES ('abc',NULL),('def',4);
|
||||||
|
set @save_join_cache_level= @@join_cache_level;
|
||||||
SET join_cache_level= 8;
|
SET join_cache_level= 8;
|
||||||
explain
|
explain
|
||||||
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
|
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
|
||||||
@ -1082,6 +1083,38 @@ i
|
|||||||
drop procedure pr;
|
drop procedure pr;
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
set @@join_cache_level= @save_join_cache_level;
|
||||||
|
#
|
||||||
|
# MDEV-16307: Incorrect results when using BNLH join instead of BNL join with views
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (c1 text, c2 int);
|
||||||
|
INSERT INTO t1 VALUES ('a',1), ('c',3), ('g',7), ('d',4), ('c',3);
|
||||||
|
CREATE TABLE t2 (c1 text, c2 int);
|
||||||
|
INSERT INTO t2 VALUES ('b',2), ('c',3);
|
||||||
|
CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||||
|
explain SELECT v1.c1, v1.c2, t2.c1, t2.c2 FROM v1, t2 WHERE v1.c1=t2.c1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 2
|
||||||
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 5 Using where; Using join buffer (flat, BNL join)
|
||||||
|
2 DERIVED t1 ALL NULL NULL NULL NULL 5
|
||||||
|
SELECT v1.c1, v1.c2, t2.c1, t2.c2 FROM v1, t2 WHERE v1.c1=t2.c1;
|
||||||
|
c1 c2 c1 c2
|
||||||
|
c 3 c 3
|
||||||
|
c 3 c 3
|
||||||
|
set @save_join_cache_level= @@join_cache_level;
|
||||||
|
set @@join_cache_level=4;
|
||||||
|
explain SELECT v1.c1, v1.c2, t2.c1, t2.c2 FROM v1, t2 WHERE v1.c1=t2.c1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
1 PRIMARY <derived2> hash_ALL NULL #hash#$hj 3 test.t2.c1 5 Using where; Using join buffer (flat, BNLH join)
|
||||||
|
2 DERIVED t1 ALL NULL NULL NULL NULL 5
|
||||||
|
SELECT v1.c1, v1.c2, t2.c1, t2.c2 FROM v1, t2 WHERE v1.c1=t2.c1;
|
||||||
|
c1 c2 c1 c2
|
||||||
|
c 3 c 3
|
||||||
|
c 3 c 3
|
||||||
|
drop table t1,t2;
|
||||||
|
drop view v1;
|
||||||
|
set @@join_cache_level= @save_join_cache_level;
|
||||||
# end of 5.5
|
# end of 5.5
|
||||||
#
|
#
|
||||||
# Start of 10.1 tests
|
# Start of 10.1 tests
|
||||||
|
@ -913,6 +913,7 @@ CREATE TABLE t3 (c VARCHAR(1024) CHARACTER SET utf8, d INT) ENGINE=MyISAM;
|
|||||||
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t3;
|
CREATE OR REPLACE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t3;
|
||||||
INSERT INTO t3 VALUES ('abc',NULL),('def',4);
|
INSERT INTO t3 VALUES ('abc',NULL),('def',4);
|
||||||
|
|
||||||
|
set @save_join_cache_level= @@join_cache_level;
|
||||||
SET join_cache_level= 8;
|
SET join_cache_level= 8;
|
||||||
explain
|
explain
|
||||||
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
|
SELECT * FROM v1, t2, v3 WHERE a = c AND b = d;
|
||||||
@ -935,7 +936,27 @@ call pr(2);
|
|||||||
drop procedure pr;
|
drop procedure pr;
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
set @@join_cache_level= @save_join_cache_level;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16307: Incorrect results when using BNLH join instead of BNL join with views
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (c1 text, c2 int);
|
||||||
|
INSERT INTO t1 VALUES ('a',1), ('c',3), ('g',7), ('d',4), ('c',3);
|
||||||
|
CREATE TABLE t2 (c1 text, c2 int);
|
||||||
|
INSERT INTO t2 VALUES ('b',2), ('c',3);
|
||||||
|
CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||||
|
|
||||||
|
explain SELECT v1.c1, v1.c2, t2.c1, t2.c2 FROM v1, t2 WHERE v1.c1=t2.c1;
|
||||||
|
SELECT v1.c1, v1.c2, t2.c1, t2.c2 FROM v1, t2 WHERE v1.c1=t2.c1;
|
||||||
|
set @save_join_cache_level= @@join_cache_level;
|
||||||
|
set @@join_cache_level=4;
|
||||||
|
explain SELECT v1.c1, v1.c2, t2.c1, t2.c2 FROM v1, t2 WHERE v1.c1=t2.c1;
|
||||||
|
SELECT v1.c1, v1.c2, t2.c1, t2.c2 FROM v1, t2 WHERE v1.c1=t2.c1;
|
||||||
|
drop table t1,t2;
|
||||||
|
drop view v1;
|
||||||
|
set @@join_cache_level= @save_join_cache_level;
|
||||||
--echo # end of 5.5
|
--echo # end of 5.5
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -15960,3 +15960,123 @@ f c
|
|||||||
9 1
|
9 1
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# MDEV-15087: error from inexpensive subquery before check
|
||||||
|
# for condition pushdown into derived
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (i1 int, v1 varchar(1));
|
||||||
|
INSERT INTO t1 VALUES (7,'x');
|
||||||
|
CREATE TABLE t2 (i1 int);
|
||||||
|
INSERT INTO t2 VALUES (8);
|
||||||
|
CREATE TABLE t3 (i1 int ,v1 varchar(1), v2 varchar(1));
|
||||||
|
INSERT INTO t3 VALUES (4, 'v','v'),(62,'v','k'),(7, 'n', NULL);
|
||||||
|
SELECT 1
|
||||||
|
FROM (t1 AS a1
|
||||||
|
JOIN (((SELECT DISTINCT t3.*
|
||||||
|
FROM t3) AS a2
|
||||||
|
JOIN t1 ON (t1.v1 = a2.v2))) ON (t1.v1 = a2.v1))
|
||||||
|
WHERE (SELECT BIT_COUNT(t2.i1)
|
||||||
|
FROM (t2 JOIN t3)) IS NULL;
|
||||||
|
ERROR 21000: Subquery returns more than 1 row
|
||||||
|
DROP TABLE t1, t2, t3;
|
||||||
|
#
|
||||||
|
# MDEV-16614 signal 7 after calling stored procedure, that uses regexp
|
||||||
|
#
|
||||||
|
CREATE PROCEDURE p1(m1 varchar(5), m2 varchar(5))
|
||||||
|
BEGIN
|
||||||
|
SELECT a FROM
|
||||||
|
(SELECT "aa" a) t
|
||||||
|
JOIN (SELECT "aa" b) t1 on t.a=t1.b
|
||||||
|
WHERE t.a regexp m1 and t1.b regexp m2
|
||||||
|
GROUP BY a;
|
||||||
|
END$$
|
||||||
|
CALL p1('a','a');
|
||||||
|
a
|
||||||
|
aa
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
CREATE PROCEDURE p1(m1 varchar(5))
|
||||||
|
BEGIN
|
||||||
|
SELECT a FROM (SELECT "aa" a) t WHERE t.a regexp m1;
|
||||||
|
END$$
|
||||||
|
CALL p1('a');
|
||||||
|
a
|
||||||
|
aa
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
SELECT a FROM (SELECT "aa" a) t WHERE REGEXP_INSTR(t.a, (SELECT MAX('aa') FROM DUAL LIMIT 1));
|
||||||
|
a
|
||||||
|
aa
|
||||||
|
CREATE OR REPLACE FUNCTION f1(a VARCHAR(10), b VARCHAR(10)) RETURNS INT
|
||||||
|
BEGIN
|
||||||
|
RETURN 1;
|
||||||
|
END;$$
|
||||||
|
CREATE OR REPLACE PROCEDURE p1(m1 varchar(5))
|
||||||
|
BEGIN
|
||||||
|
SELECT a FROM (SELECT "aa" a) t WHERE f1(t.a, m1);
|
||||||
|
END$$
|
||||||
|
CALL p1('a');
|
||||||
|
a
|
||||||
|
aa
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
CREATE OR REPLACE FUNCTION f1(a VARCHAR(10), b VARCHAR(10)) RETURNS INT
|
||||||
|
BEGIN
|
||||||
|
RETURN 1;
|
||||||
|
END;$$
|
||||||
|
SELECT a FROM (SELECT "aa" a) t WHERE f1(t.a, (SELECT MAX('aa') FROM DUAL LIMIT 1));
|
||||||
|
a
|
||||||
|
aa
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
#
|
||||||
|
# MDEV-16801: splittable materialized derived/views with
|
||||||
|
# one grouping field from table without keys
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a int, b int, INDEX idx_a(a), INDEX idx_b(b)) ENGINE=MYISAM;
|
||||||
|
CREATE TABLE t2 (c int) ENGINE=MYISAM;
|
||||||
|
CREATE TABLE t3 (d int) ENGINE=MYISAM;
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(77,7), (11,1), (33,3), (44,4), (8,88),
|
||||||
|
(78,7), (98,9), (38,3), (28,2), (79,7),
|
||||||
|
(58,5), (42,4), (71,7), (27,2), (91,9);
|
||||||
|
INSERT INTO t1 SELECT a+100, b+10 FROM t1;
|
||||||
|
INSERT INTO t2 VALUES
|
||||||
|
(100), (700), (200), (100), (200);
|
||||||
|
INSERT INTO t3 VALUES
|
||||||
|
(3), (4), (1), (8), (3);
|
||||||
|
ANALYZE tables t1,t2,t3;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status OK
|
||||||
|
test.t2 analyze status OK
|
||||||
|
test.t3 analyze status OK
|
||||||
|
SELECT *
|
||||||
|
FROM t3,
|
||||||
|
(SELECT t1.b, t2.c
|
||||||
|
FROM t1, t2
|
||||||
|
GROUP BY t1.b,t2.c) dt
|
||||||
|
WHERE t3.d = dt.b;
|
||||||
|
d b c
|
||||||
|
3 3 700
|
||||||
|
3 3 200
|
||||||
|
3 3 100
|
||||||
|
4 4 700
|
||||||
|
4 4 200
|
||||||
|
4 4 100
|
||||||
|
1 1 700
|
||||||
|
1 1 200
|
||||||
|
1 1 100
|
||||||
|
3 3 700
|
||||||
|
3 3 200
|
||||||
|
3 3 100
|
||||||
|
EXPLAIN EXTENDED SELECT *
|
||||||
|
FROM t3,
|
||||||
|
(SELECT t1.b, t2.c
|
||||||
|
FROM t1, t2
|
||||||
|
GROUP BY t1.b,t2.c) dt
|
||||||
|
WHERE t3.d = dt.b;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY t3 ALL NULL NULL NULL NULL 5 100.00 Using where
|
||||||
|
1 PRIMARY <derived2> ref key0 key0 5 test.t3.d 2 100.00
|
||||||
|
2 LATERAL DERIVED t1 ref idx_b idx_b 5 test.t3.d 2 100.00 Using index; Using temporary; Using filesort
|
||||||
|
2 LATERAL DERIVED t2 ALL NULL NULL NULL NULL 5 100.00 Using join buffer (flat, BNL join)
|
||||||
|
Warnings:
|
||||||
|
Note 1003 /* select#1 */ select `test`.`t3`.`d` AS `d`,`dt`.`b` AS `b`,`dt`.`c` AS `c` from `test`.`t3` join (/* select#2 */ select `test`.`t1`.`b` AS `b`,`test`.`t2`.`c` AS `c` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`b` = `test`.`t3`.`d` group by `test`.`t1`.`b`,`test`.`t2`.`c`) `dt` where `dt`.`b` = `test`.`t3`.`d`
|
||||||
|
DROP TABLE t1,t2,t3;
|
||||||
|
@ -2906,3 +2906,116 @@ SELECT * FROM ( SELECT STRAIGHT_JOIN f, COUNT(*) as c FROM v1 GROUP BY f ) AS s;
|
|||||||
|
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-15087: error from inexpensive subquery before check
|
||||||
|
--echo # for condition pushdown into derived
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i1 int, v1 varchar(1));
|
||||||
|
INSERT INTO t1 VALUES (7,'x');
|
||||||
|
|
||||||
|
CREATE TABLE t2 (i1 int);
|
||||||
|
INSERT INTO t2 VALUES (8);
|
||||||
|
|
||||||
|
CREATE TABLE t3 (i1 int ,v1 varchar(1), v2 varchar(1));
|
||||||
|
INSERT INTO t3 VALUES (4, 'v','v'),(62,'v','k'),(7, 'n', NULL);
|
||||||
|
|
||||||
|
--error ER_SUBQUERY_NO_1_ROW
|
||||||
|
SELECT 1
|
||||||
|
FROM (t1 AS a1
|
||||||
|
JOIN (((SELECT DISTINCT t3.*
|
||||||
|
FROM t3) AS a2
|
||||||
|
JOIN t1 ON (t1.v1 = a2.v2))) ON (t1.v1 = a2.v1))
|
||||||
|
WHERE (SELECT BIT_COUNT(t2.i1)
|
||||||
|
FROM (t2 JOIN t3)) IS NULL;
|
||||||
|
|
||||||
|
DROP TABLE t1, t2, t3;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16614 signal 7 after calling stored procedure, that uses regexp
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
CREATE PROCEDURE p1(m1 varchar(5), m2 varchar(5))
|
||||||
|
BEGIN
|
||||||
|
SELECT a FROM
|
||||||
|
(SELECT "aa" a) t
|
||||||
|
JOIN (SELECT "aa" b) t1 on t.a=t1.b
|
||||||
|
WHERE t.a regexp m1 and t1.b regexp m2
|
||||||
|
GROUP BY a;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
CALL p1('a','a');
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
CREATE PROCEDURE p1(m1 varchar(5))
|
||||||
|
BEGIN
|
||||||
|
SELECT a FROM (SELECT "aa" a) t WHERE t.a regexp m1;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
CALL p1('a');
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
|
||||||
|
|
||||||
|
SELECT a FROM (SELECT "aa" a) t WHERE REGEXP_INSTR(t.a, (SELECT MAX('aa') FROM DUAL LIMIT 1));
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
CREATE OR REPLACE FUNCTION f1(a VARCHAR(10), b VARCHAR(10)) RETURNS INT
|
||||||
|
BEGIN
|
||||||
|
RETURN 1;
|
||||||
|
END;$$
|
||||||
|
CREATE OR REPLACE PROCEDURE p1(m1 varchar(5))
|
||||||
|
BEGIN
|
||||||
|
SELECT a FROM (SELECT "aa" a) t WHERE f1(t.a, m1);
|
||||||
|
END$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
CALL p1('a');
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
CREATE OR REPLACE FUNCTION f1(a VARCHAR(10), b VARCHAR(10)) RETURNS INT
|
||||||
|
BEGIN
|
||||||
|
RETURN 1;
|
||||||
|
END;$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
SELECT a FROM (SELECT "aa" a) t WHERE f1(t.a, (SELECT MAX('aa') FROM DUAL LIMIT 1));
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16801: splittable materialized derived/views with
|
||||||
|
--echo # one grouping field from table without keys
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a int, b int, INDEX idx_a(a), INDEX idx_b(b)) ENGINE=MYISAM;
|
||||||
|
CREATE TABLE t2 (c int) ENGINE=MYISAM;
|
||||||
|
CREATE TABLE t3 (d int) ENGINE=MYISAM;
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(77,7), (11,1), (33,3), (44,4), (8,88),
|
||||||
|
(78,7), (98,9), (38,3), (28,2), (79,7),
|
||||||
|
(58,5), (42,4), (71,7), (27,2), (91,9);
|
||||||
|
INSERT INTO t1 SELECT a+100, b+10 FROM t1;
|
||||||
|
INSERT INTO t2 VALUES
|
||||||
|
(100), (700), (200), (100), (200);
|
||||||
|
INSERT INTO t3 VALUES
|
||||||
|
(3), (4), (1), (8), (3);
|
||||||
|
|
||||||
|
ANALYZE tables t1,t2,t3;
|
||||||
|
|
||||||
|
let $q=
|
||||||
|
SELECT *
|
||||||
|
FROM t3,
|
||||||
|
(SELECT t1.b, t2.c
|
||||||
|
FROM t1, t2
|
||||||
|
GROUP BY t1.b,t2.c) dt
|
||||||
|
WHERE t3.d = dt.b;
|
||||||
|
|
||||||
|
eval $q;
|
||||||
|
eval EXPLAIN EXTENDED $q;
|
||||||
|
|
||||||
|
DROP TABLE t1,t2,t3;
|
||||||
|
@ -761,6 +761,36 @@ t1 CREATE TABLE `t1` (
|
|||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-16054 simple json functions flatline cpu on garbage input.
|
||||||
|
#
|
||||||
|
select json_array(1,uuid(),compress(5.140264e+307));
|
||||||
|
json_array(1,uuid(),compress(5.140264e+307))
|
||||||
|
NULL
|
||||||
|
#
|
||||||
|
# MDEV-16869 String functions don't respect character set of JSON_VALUE.
|
||||||
|
#
|
||||||
|
create table t1(json_col TEXT) DEFAULT CHARSET=latin1;
|
||||||
|
insert into t1 values (_latin1 X'7B226B657931223A2253EC227D');
|
||||||
|
select JSON_VALUE(json_col, '$.key1')= _latin1 X'53EC' from t1;
|
||||||
|
JSON_VALUE(json_col, '$.key1')= _latin1 X'53EC'
|
||||||
|
1
|
||||||
|
select REPLACE(JSON_VALUE(json_col, '$.key1'), 'null', '') = _latin1 X'53EC' from t1;
|
||||||
|
REPLACE(JSON_VALUE(json_col, '$.key1'), 'null', '') = _latin1 X'53EC'
|
||||||
|
1
|
||||||
|
drop table t1;
|
||||||
|
#
|
||||||
|
# MDEV-16750 JSON_SET mishandles unicode every second pair of arguments.
|
||||||
|
#
|
||||||
|
SELECT JSON_SET('{}', '$.a', _utf8 0xC3B6);
|
||||||
|
JSON_SET('{}', '$.a', _utf8 0xC3B6)
|
||||||
|
{"a": "<22>"}
|
||||||
|
SELECT JSON_SET('{}', '$.a', _utf8 0xC3B6, '$.b', _utf8 0xC3B6);
|
||||||
|
JSON_SET('{}', '$.a', _utf8 0xC3B6, '$.b', _utf8 0xC3B6)
|
||||||
|
{"a": "<22>", "b": "<22>"}
|
||||||
|
SELECT JSON_SET('{}', '$.a', _utf8 X'C3B6', '$.x', 1, '$.b', _utf8 X'C3B6');
|
||||||
|
JSON_SET('{}', '$.a', _utf8 X'C3B6', '$.x', 1, '$.b', _utf8 X'C3B6')
|
||||||
|
{"a": "<22>", "x": 1, "b": "<22>"}
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -422,6 +422,30 @@ CREATE TABLE t1 AS SELECT
|
|||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16054 simple json functions flatline cpu on garbage input.
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
select json_array(1,uuid(),compress(5.140264e+307));
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16869 String functions don't respect character set of JSON_VALUE.
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create table t1(json_col TEXT) DEFAULT CHARSET=latin1;
|
||||||
|
insert into t1 values (_latin1 X'7B226B657931223A2253EC227D');
|
||||||
|
select JSON_VALUE(json_col, '$.key1')= _latin1 X'53EC' from t1;
|
||||||
|
select REPLACE(JSON_VALUE(json_col, '$.key1'), 'null', '') = _latin1 X'53EC' from t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16750 JSON_SET mishandles unicode every second pair of arguments.
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SELECT JSON_SET('{}', '$.a', _utf8 0xC3B6);
|
||||||
|
SELECT JSON_SET('{}', '$.a', _utf8 0xC3B6, '$.b', _utf8 0xC3B6);
|
||||||
|
SELECT JSON_SET('{}', '$.a', _utf8 X'C3B6', '$.x', 1, '$.b', _utf8 X'C3B6');
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -3554,6 +3554,38 @@ DROP FUNCTION fn_sleep_before_now;
|
|||||||
DROP TRIGGER trg_insert_t_ts;
|
DROP TRIGGER trg_insert_t_ts;
|
||||||
DROP TABLE t_ts, t_trig;
|
DROP TABLE t_ts, t_trig;
|
||||||
#
|
#
|
||||||
|
# MDEV-16878 Functions ADDTIME and SUBTIME get wrongly removed from WHERE by the equal expression optimizer
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a TIME);
|
||||||
|
INSERT INTO t1 VALUES ('00:00:10'),('00:00:20');
|
||||||
|
SELECT a, SUBTIME(a,TIME'00:00:01'), ADDTIME(a,TIME'00:00:01') FROM t1;
|
||||||
|
a SUBTIME(a,TIME'00:00:01') ADDTIME(a,TIME'00:00:01')
|
||||||
|
00:00:10 00:00:09 00:00:11
|
||||||
|
00:00:20 00:00:19 00:00:21
|
||||||
|
SELECT * FROM t1 WHERE SUBTIME(a,TIME'00:00:01')=TIME'00:00:09';
|
||||||
|
a
|
||||||
|
00:00:10
|
||||||
|
SELECT * FROM t1 WHERE ADDTIME(a,TIME'00:00:01')<=TIME'00:00:09';
|
||||||
|
a
|
||||||
|
SELECT * FROM t1 WHERE SUBTIME(a,TIME'00:00:01')=TIME'00:00:09' AND ADDTIME(a,TIME'00:00:01')<=TIME'00:00:09';
|
||||||
|
a
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE SUBTIME(a,TIME'00:00:01')=TIME'00:00:09' AND ADDTIME(a,TIME'00:00:01')<=TIME'00:00:09';
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where subtime(`test`.`t1`.`a`,TIME'00:00:01') = TIME'00:00:09' and addtime(`test`.`t1`.`a`,TIME'00:00:01') <= TIME'00:00:09'
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# MDEV-15363 Wrong result for CAST(LAST_DAY(TIME'00:00:00') AS TIME)
|
||||||
|
#
|
||||||
|
SELECT
|
||||||
|
LAST_DAY(TIME'00:00:00') AS c1,
|
||||||
|
CAST(CAST(LAST_DAY(TIME'00:00:00') AS DATE) AS TIME) AS c2,
|
||||||
|
CAST(LAST_DAY(TIME'00:00:00') AS TIME) AS c3;
|
||||||
|
c1 c2 c3
|
||||||
|
2018-08-31 00:00:00 00:00:00
|
||||||
|
# End of 10.3 tests
|
||||||
|
#
|
||||||
# MDEV-14032 SEC_TO_TIME executes side effect two times
|
# MDEV-14032 SEC_TO_TIME executes side effect two times
|
||||||
#
|
#
|
||||||
SET @a=10000000;
|
SET @a=10000000;
|
||||||
|
@ -2140,6 +2140,31 @@ DROP TABLE t_ts, t_trig;
|
|||||||
###################
|
###################
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16878 Functions ADDTIME and SUBTIME get wrongly removed from WHERE by the equal expression optimizer
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a TIME);
|
||||||
|
INSERT INTO t1 VALUES ('00:00:10'),('00:00:20');
|
||||||
|
SELECT a, SUBTIME(a,TIME'00:00:01'), ADDTIME(a,TIME'00:00:01') FROM t1;
|
||||||
|
SELECT * FROM t1 WHERE SUBTIME(a,TIME'00:00:01')=TIME'00:00:09';
|
||||||
|
SELECT * FROM t1 WHERE ADDTIME(a,TIME'00:00:01')<=TIME'00:00:09';
|
||||||
|
SELECT * FROM t1 WHERE SUBTIME(a,TIME'00:00:01')=TIME'00:00:09' AND ADDTIME(a,TIME'00:00:01')<=TIME'00:00:09';
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM t1 WHERE SUBTIME(a,TIME'00:00:01')=TIME'00:00:09' AND ADDTIME(a,TIME'00:00:01')<=TIME'00:00:09';
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-15363 Wrong result for CAST(LAST_DAY(TIME'00:00:00') AS TIME)
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
LAST_DAY(TIME'00:00:00') AS c1,
|
||||||
|
CAST(CAST(LAST_DAY(TIME'00:00:00') AS DATE) AS TIME) AS c2,
|
||||||
|
CAST(LAST_DAY(TIME'00:00:00') AS TIME) AS c3;
|
||||||
|
|
||||||
|
--echo # End of 10.3 tests
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-14032 SEC_TO_TIME executes side effect two times
|
--echo # MDEV-14032 SEC_TO_TIME executes side effect two times
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -1759,6 +1759,7 @@ drop user mysqltest@localhost;
|
|||||||
disconnect user1;
|
disconnect user1;
|
||||||
drop database mysqltest;
|
drop database mysqltest;
|
||||||
use test;
|
use test;
|
||||||
|
call mtr.add_suppression("Can't open and lock privilege tables");
|
||||||
FLUSH PRIVILEGES without procs_priv table.
|
FLUSH PRIVILEGES without procs_priv table.
|
||||||
RENAME TABLE mysql.procs_priv TO mysql.procs_gone;
|
RENAME TABLE mysql.procs_priv TO mysql.procs_gone;
|
||||||
FLUSH PRIVILEGES;
|
FLUSH PRIVILEGES;
|
||||||
@ -1852,8 +1853,6 @@ BEGIN
|
|||||||
SET @x = 0;
|
SET @x = 0;
|
||||||
REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
|
REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
|
||||||
END ;||
|
END ;||
|
||||||
Warnings:
|
|
||||||
Warning 1404 Failed to grant EXECUTE and ALTER ROUTINE privileges
|
|
||||||
connection default;
|
connection default;
|
||||||
SHOW GRANTS FOR 'user1'@'localhost';
|
SHOW GRANTS FOR 'user1'@'localhost';
|
||||||
Grants for user1@localhost
|
Grants for user1@localhost
|
||||||
@ -1864,6 +1863,7 @@ SHOW GRANTS FOR 'user2';
|
|||||||
Grants for user2@%
|
Grants for user2@%
|
||||||
GRANT USAGE ON *.* TO 'user2'@'%'
|
GRANT USAGE ON *.* TO 'user2'@'%'
|
||||||
GRANT CREATE, CREATE ROUTINE ON `db1`.* TO 'user2'@'%'
|
GRANT CREATE, CREATE ROUTINE ON `db1`.* TO 'user2'@'%'
|
||||||
|
GRANT EXECUTE, ALTER ROUTINE ON PROCEDURE `db1`.`proc2` TO 'user2'@'%'
|
||||||
disconnect con1;
|
disconnect con1;
|
||||||
disconnect con2;
|
disconnect con2;
|
||||||
DROP PROCEDURE db1.proc1;
|
DROP PROCEDURE db1.proc1;
|
||||||
|
@ -1598,6 +1598,9 @@ use test;
|
|||||||
#
|
#
|
||||||
# Bug#16470 crash on grant if old grant tables
|
# Bug#16470 crash on grant if old grant tables
|
||||||
#
|
#
|
||||||
|
|
||||||
|
call mtr.add_suppression("Can't open and lock privilege tables");
|
||||||
|
|
||||||
--echo FLUSH PRIVILEGES without procs_priv table.
|
--echo FLUSH PRIVILEGES without procs_priv table.
|
||||||
RENAME TABLE mysql.procs_priv TO mysql.procs_gone;
|
RENAME TABLE mysql.procs_priv TO mysql.procs_gone;
|
||||||
FLUSH PRIVILEGES;
|
FLUSH PRIVILEGES;
|
||||||
|
@ -369,3 +369,8 @@ t1 1 invisible 1 c A NULL NULL NULL YES BTREE
|
|||||||
t1 1 invisible_2 1 invisible A NULL NULL NULL YES BTREE
|
t1 1 invisible_2 1 invisible A NULL NULL NULL YES BTREE
|
||||||
drop table t1;
|
drop table t1;
|
||||||
set @old_debug= @@debug_dbug;
|
set @old_debug= @@debug_dbug;
|
||||||
|
CREATE TABLE t1 (i INT );
|
||||||
|
SET debug_dbug="+d,test_completely_invisible,test_invisible_index";
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
SET debug_dbug= DEFAULT;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
@ -270,3 +270,9 @@ explain select * from t1 where invisible =9;
|
|||||||
show indexes in t1;
|
show indexes in t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
set @old_debug= @@debug_dbug;
|
set @old_debug= @@debug_dbug;
|
||||||
|
## MDEV 15127
|
||||||
|
CREATE TABLE t1 (i INT );
|
||||||
|
SET debug_dbug="+d,test_completely_invisible,test_invisible_index";
|
||||||
|
CREATE TABLE t2 LIKE t1;
|
||||||
|
SET debug_dbug= DEFAULT;
|
||||||
|
DROP TABLE t1, t2;
|
||||||
|
@ -1506,6 +1506,46 @@ DROP VIEW v2;
|
|||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
SET optimizer_switch=@save_optimizer_switch;
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
#
|
#
|
||||||
|
# MDEV-16512
|
||||||
|
# Server crashes in find_field_in_table_ref on 2nd execution of SP referring to
|
||||||
|
# non-existing field
|
||||||
|
#
|
||||||
|
CREATE TABLE t (i INT);
|
||||||
|
CREATE PROCEDURE p() SELECT t1.f FROM t AS t1 JOIN t AS t2 USING (f);
|
||||||
|
CALL p;
|
||||||
|
ERROR 42S22: Unknown column 'f' in 'from clause'
|
||||||
|
CALL p;
|
||||||
|
ERROR 42S22: Unknown column 'f' in 'from clause'
|
||||||
|
FLUSH TABLES;
|
||||||
|
CALL p;
|
||||||
|
ERROR 42S22: Unknown column 'f' in 'from clause'
|
||||||
|
DROP TABLE t;
|
||||||
|
CREATE TABLE t (f INT);
|
||||||
|
CALL p;
|
||||||
|
ERROR 42S22: Unknown column 'f' in 'from clause'
|
||||||
|
DROP TABLE t;
|
||||||
|
CREATE TABLE t (i INT);
|
||||||
|
CALL p;
|
||||||
|
ERROR 42S22: Unknown column 'f' in 'from clause'
|
||||||
|
DROP PROCEDURE p;
|
||||||
|
DROP TABLE t;
|
||||||
|
CREATE TABLE t1 (a INT, b INT);
|
||||||
|
CREATE TABLE t2 (a INT);
|
||||||
|
CREATE TABLE t3 (a INT, c INT);
|
||||||
|
CREATE TABLE t4 (a INT, c INT);
|
||||||
|
CREATE TABLE t5 (a INT, c INT);
|
||||||
|
CREATE PROCEDURE p1() SELECT c FROM t1 JOIN (t2 LEFT JOIN t3 USING (a) LEFT JOIN t4 USING (a)
|
||||||
|
LEFT JOIN t5 USING (a)) USING (a);
|
||||||
|
CALL p1;
|
||||||
|
ERROR 23000: Column 'c' in field list is ambiguous
|
||||||
|
CALL p1;
|
||||||
|
ERROR 23000: Column 'c' in field list is ambiguous
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
DROP TABLE t1,t2,t3,t4,t5;
|
||||||
|
#
|
||||||
|
# End of MariaDB 5.5 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
# Bug #35268: Parser can't handle STRAIGHT_JOIN with USING
|
# Bug #35268: Parser can't handle STRAIGHT_JOIN with USING
|
||||||
#
|
#
|
||||||
CREATE TABLE t1 (a int);
|
CREATE TABLE t1 (a int);
|
||||||
|
@ -1160,6 +1160,59 @@ DROP TABLE t1,t2;
|
|||||||
|
|
||||||
SET optimizer_switch=@save_optimizer_switch;
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16512
|
||||||
|
--echo # Server crashes in find_field_in_table_ref on 2nd execution of SP referring to
|
||||||
|
--echo # non-existing field
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t (i INT);
|
||||||
|
CREATE PROCEDURE p() SELECT t1.f FROM t AS t1 JOIN t AS t2 USING (f);
|
||||||
|
--error ER_BAD_FIELD_ERROR
|
||||||
|
CALL p;
|
||||||
|
--error ER_BAD_FIELD_ERROR
|
||||||
|
CALL p;
|
||||||
|
FLUSH TABLES;
|
||||||
|
--error ER_BAD_FIELD_ERROR
|
||||||
|
CALL p;
|
||||||
|
DROP TABLE t;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Fix the table definition to match the using
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t (f INT);
|
||||||
|
#
|
||||||
|
# The following shouldn't fail as the table is now matching the using
|
||||||
|
#
|
||||||
|
--error ER_BAD_FIELD_ERROR
|
||||||
|
CALL p;
|
||||||
|
DROP TABLE t;
|
||||||
|
CREATE TABLE t (i INT);
|
||||||
|
--error ER_BAD_FIELD_ERROR
|
||||||
|
CALL p;
|
||||||
|
DROP PROCEDURE p;
|
||||||
|
DROP TABLE t;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT, b INT);
|
||||||
|
CREATE TABLE t2 (a INT);
|
||||||
|
CREATE TABLE t3 (a INT, c INT);
|
||||||
|
CREATE TABLE t4 (a INT, c INT);
|
||||||
|
CREATE TABLE t5 (a INT, c INT);
|
||||||
|
CREATE PROCEDURE p1() SELECT c FROM t1 JOIN (t2 LEFT JOIN t3 USING (a) LEFT JOIN t4 USING (a)
|
||||||
|
LEFT JOIN t5 USING (a)) USING (a);
|
||||||
|
--error ER_NON_UNIQ_ERROR
|
||||||
|
CALL p1;
|
||||||
|
--error ER_NON_UNIQ_ERROR
|
||||||
|
CALL p1;
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
DROP TABLE t1,t2,t3,t4,t5;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of MariaDB 5.5 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Bug #35268: Parser can't handle STRAIGHT_JOIN with USING
|
--echo # Bug #35268: Parser can't handle STRAIGHT_JOIN with USING
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -5925,6 +5925,39 @@ SET join_buffer_space_limit= default;
|
|||||||
set optimizer_switch=@save_optimizer_switch;
|
set optimizer_switch=@save_optimizer_switch;
|
||||||
DROP TABLE t1,t4,t5,t2;
|
DROP TABLE t1,t4,t5,t2;
|
||||||
#
|
#
|
||||||
|
# MDEV-16603: BNLH for query with materialized semi-join
|
||||||
|
#
|
||||||
|
set join_cache_level=4;
|
||||||
|
CREATE TABLE t1 ( i1 int, v1 varchar(1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (7,'x');
|
||||||
|
CREATE TABLE t2 (i1 int, v1 varchar(1), KEY v1 (v1,i1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t2 VALUES
|
||||||
|
(NULL,'x'),(1,'x'),(3,'x'),(5,'x'),(8,'x'),(48,'x'),
|
||||||
|
(228,'x'),(3,'y'),(1,'z'),(9,'z');
|
||||||
|
CREATE TABLE temp
|
||||||
|
SELECT t1.i1 AS f1, t1.v1 AS f2 FROM (t2 JOIN t1 ON (t1.v1 = t2.v1));
|
||||||
|
SELECT * FROM temp
|
||||||
|
WHERE (f1,f2) IN (SELECT t1.i1, t1.v1 FROM (t2 JOIN t1 ON (t1.v1 = t2.v1)));
|
||||||
|
f1 f2
|
||||||
|
7 x
|
||||||
|
7 x
|
||||||
|
7 x
|
||||||
|
7 x
|
||||||
|
7 x
|
||||||
|
7 x
|
||||||
|
7 x
|
||||||
|
EXPLAIN EXTENDED SELECT * FROM temp
|
||||||
|
WHERE (f1,f2) IN (SELECT t1.i1, t1.v1 FROM (t2 JOIN t1 ON (t1.v1 = t2.v1)));
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 1 100.00
|
||||||
|
1 PRIMARY temp hash_ALL NULL #hash#$hj 9 test.t1.i1,test.t1.v1 7 100.00 Using where; Using join buffer (flat, BNLH join)
|
||||||
|
2 MATERIALIZED t1 ALL NULL NULL NULL NULL 1 100.00 Using where
|
||||||
|
2 MATERIALIZED t2 hash_index v1 #hash#v1:v1 4:9 test.t1.v1 10 10.00 Using index; Using join buffer (flat, BNLH join)
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select `test`.`temp`.`f1` AS `f1`,`test`.`temp`.`f2` AS `f2` from `test`.`temp` semi join (`test`.`t2` join `test`.`t1`) where `test`.`temp`.`f1` = `test`.`t1`.`i1` and `test`.`t2`.`v1` = `test`.`t1`.`v1` and `test`.`temp`.`f2` = `test`.`t1`.`v1`
|
||||||
|
DROP TABLE t1,t2,temp;
|
||||||
|
SET join_cache_level = default;
|
||||||
|
#
|
||||||
# MDEV-5123 Remove duplicated conditions pushed both to join_tab->select_cond and join_tab->cache_select->cond for blocked joins.
|
# MDEV-5123 Remove duplicated conditions pushed both to join_tab->select_cond and join_tab->cache_select->cond for blocked joins.
|
||||||
#
|
#
|
||||||
set join_cache_level=default;
|
set join_cache_level=default;
|
||||||
|
@ -3869,6 +3869,37 @@ set optimizer_switch=@save_optimizer_switch;
|
|||||||
|
|
||||||
DROP TABLE t1,t4,t5,t2;
|
DROP TABLE t1,t4,t5,t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16603: BNLH for query with materialized semi-join
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
set join_cache_level=4;
|
||||||
|
|
||||||
|
CREATE TABLE t1 ( i1 int, v1 varchar(1)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (7,'x');
|
||||||
|
|
||||||
|
CREATE TABLE t2 (i1 int, v1 varchar(1), KEY v1 (v1,i1)) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
INSERT INTO t2 VALUES
|
||||||
|
(NULL,'x'),(1,'x'),(3,'x'),(5,'x'),(8,'x'),(48,'x'),
|
||||||
|
(228,'x'),(3,'y'),(1,'z'),(9,'z');
|
||||||
|
|
||||||
|
CREATE TABLE temp
|
||||||
|
SELECT t1.i1 AS f1, t1.v1 AS f2 FROM (t2 JOIN t1 ON (t1.v1 = t2.v1));
|
||||||
|
|
||||||
|
let $q =
|
||||||
|
SELECT * FROM temp
|
||||||
|
WHERE (f1,f2) IN (SELECT t1.i1, t1.v1 FROM (t2 JOIN t1 ON (t1.v1 = t2.v1)));
|
||||||
|
|
||||||
|
eval $q;
|
||||||
|
eval EXPLAIN EXTENDED $q;
|
||||||
|
|
||||||
|
DROP TABLE t1,t2,temp;
|
||||||
|
|
||||||
|
SET join_cache_level = default;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-5123 Remove duplicated conditions pushed both to join_tab->select_cond and join_tab->cache_select->cond for blocked joins.
|
--echo # MDEV-5123 Remove duplicated conditions pushed both to join_tab->select_cond and join_tab->cache_select->cond for blocked joins.
|
||||||
--echo #
|
--echo #
|
||||||
@ -3958,5 +3989,4 @@ drop table t1, t2;
|
|||||||
set join_buffer_size = default;
|
set join_buffer_size = default;
|
||||||
|
|
||||||
# The following command must be the last one the file
|
# The following command must be the last one the file
|
||||||
# this must be the last command in the file
|
|
||||||
set @@optimizer_switch=@save_optimizer_switch;
|
set @@optimizer_switch=@save_optimizer_switch;
|
||||||
|
@ -2460,5 +2460,55 @@ id sid id
|
|||||||
1 NULL NULL
|
1 NULL NULL
|
||||||
2 NULL NULL
|
2 NULL NULL
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
#
|
||||||
|
# MDEV-16726: SELECT with STRAGHT JOIN containing NESTED RIGHT JOIN
|
||||||
|
# converted to INNER JOIN with first constant inner table
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
pk int PRIMARY KEY, i1 int, v1 varchar(1), v2 varchar(1), KEY v1 (v1,i1)
|
||||||
|
) engine=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(8,3,'c','c'),(9,4,'z','z'),(10,3,'i','i'),(11,186,'x','x'),
|
||||||
|
(14,226,'m','m'),(15,133,'p','p');
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
pk int PRIMARY KEY, i1 int, v1 varchar(1), v2 varchar(1)
|
||||||
|
) engine=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES (10,6,'p','p');
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT STRAIGHT_JOIN t2.v2
|
||||||
|
FROM
|
||||||
|
(t1 as tb1 LEFT JOIN t1 AS tb2 ON tb2.v1 = tb1.v2)
|
||||||
|
RIGHT JOIN
|
||||||
|
(t2,t1)
|
||||||
|
ON t1.pk = t2.pk AND t2.v2 = tb1.v1
|
||||||
|
WHERE tb1.pk = 40
|
||||||
|
ORDER BY tb1.i1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select straight_join 'p' AS `v2` from `test`.`t1` join `test`.`t1` `tb1` left join `test`.`t1` `tb2` on(multiple equal(NULL, NULL)) where 0 order by NULL
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT STRAIGHT_JOIN t2.v2
|
||||||
|
FROM
|
||||||
|
(t2,t1)
|
||||||
|
LEFT JOIN
|
||||||
|
(t1 as tb1 LEFT JOIN t1 AS tb2 ON tb2.v1 = tb1.v2)
|
||||||
|
ON t1.pk = t2.pk AND t2.v2 = tb1.v1
|
||||||
|
WHERE tb1.pk = 40
|
||||||
|
ORDER BY tb1.i1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select straight_join 'p' AS `v2` from `test`.`t1` join `test`.`t1` `tb1` left join `test`.`t1` `tb2` on(multiple equal(NULL, NULL)) where 0 order by NULL
|
||||||
|
SELECT STRAIGHT_JOIN DISTINCT t2.v2
|
||||||
|
FROM
|
||||||
|
(t1 as tb1 LEFT JOIN t1 AS tb2 ON tb2.v1 = tb1.v2)
|
||||||
|
RIGHT JOIN
|
||||||
|
(t2,t1)
|
||||||
|
ON t1.pk = t2.pk AND t2.v2 = tb1.v1
|
||||||
|
WHERE tb1.pk = 40
|
||||||
|
ORDER BY tb1.i1;
|
||||||
|
v2
|
||||||
|
DROP TABLE t1,t2;
|
||||||
# end of 5.5 tests
|
# end of 5.5 tests
|
||||||
SET optimizer_switch=@save_optimizer_switch;
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
|
@ -1992,6 +1992,54 @@ select * from t1 t
|
|||||||
on t.id=r.id ;
|
on t.id=r.id ;
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16726: SELECT with STRAGHT JOIN containing NESTED RIGHT JOIN
|
||||||
|
--echo # converted to INNER JOIN with first constant inner table
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
pk int PRIMARY KEY, i1 int, v1 varchar(1), v2 varchar(1), KEY v1 (v1,i1)
|
||||||
|
) engine=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(8,3,'c','c'),(9,4,'z','z'),(10,3,'i','i'),(11,186,'x','x'),
|
||||||
|
(14,226,'m','m'),(15,133,'p','p');
|
||||||
|
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
pk int PRIMARY KEY, i1 int, v1 varchar(1), v2 varchar(1)
|
||||||
|
) engine=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES (10,6,'p','p');
|
||||||
|
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT STRAIGHT_JOIN t2.v2
|
||||||
|
FROM
|
||||||
|
(t1 as tb1 LEFT JOIN t1 AS tb2 ON tb2.v1 = tb1.v2)
|
||||||
|
RIGHT JOIN
|
||||||
|
(t2,t1)
|
||||||
|
ON t1.pk = t2.pk AND t2.v2 = tb1.v1
|
||||||
|
WHERE tb1.pk = 40
|
||||||
|
ORDER BY tb1.i1;
|
||||||
|
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT STRAIGHT_JOIN t2.v2
|
||||||
|
FROM
|
||||||
|
(t2,t1)
|
||||||
|
LEFT JOIN
|
||||||
|
(t1 as tb1 LEFT JOIN t1 AS tb2 ON tb2.v1 = tb1.v2)
|
||||||
|
ON t1.pk = t2.pk AND t2.v2 = tb1.v1
|
||||||
|
WHERE tb1.pk = 40
|
||||||
|
ORDER BY tb1.i1;
|
||||||
|
|
||||||
|
SELECT STRAIGHT_JOIN DISTINCT t2.v2
|
||||||
|
FROM
|
||||||
|
(t1 as tb1 LEFT JOIN t1 AS tb2 ON tb2.v1 = tb1.v2)
|
||||||
|
RIGHT JOIN
|
||||||
|
(t2,t1)
|
||||||
|
ON t1.pk = t2.pk AND t2.v2 = tb1.v1
|
||||||
|
WHERE tb1.pk = 40
|
||||||
|
ORDER BY tb1.i1;
|
||||||
|
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
--echo # end of 5.5 tests
|
--echo # end of 5.5 tests
|
||||||
|
|
||||||
SET optimizer_switch=@save_optimizer_switch;
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
|
@ -2471,6 +2471,56 @@ id sid id
|
|||||||
1 NULL NULL
|
1 NULL NULL
|
||||||
2 NULL NULL
|
2 NULL NULL
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
#
|
||||||
|
# MDEV-16726: SELECT with STRAGHT JOIN containing NESTED RIGHT JOIN
|
||||||
|
# converted to INNER JOIN with first constant inner table
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
pk int PRIMARY KEY, i1 int, v1 varchar(1), v2 varchar(1), KEY v1 (v1,i1)
|
||||||
|
) engine=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(8,3,'c','c'),(9,4,'z','z'),(10,3,'i','i'),(11,186,'x','x'),
|
||||||
|
(14,226,'m','m'),(15,133,'p','p');
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
pk int PRIMARY KEY, i1 int, v1 varchar(1), v2 varchar(1)
|
||||||
|
) engine=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES (10,6,'p','p');
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT STRAIGHT_JOIN t2.v2
|
||||||
|
FROM
|
||||||
|
(t1 as tb1 LEFT JOIN t1 AS tb2 ON tb2.v1 = tb1.v2)
|
||||||
|
RIGHT JOIN
|
||||||
|
(t2,t1)
|
||||||
|
ON t1.pk = t2.pk AND t2.v2 = tb1.v1
|
||||||
|
WHERE tb1.pk = 40
|
||||||
|
ORDER BY tb1.i1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select straight_join 'p' AS `v2` from `test`.`t1` join `test`.`t1` `tb1` left join `test`.`t1` `tb2` on(multiple equal(NULL, NULL)) where 0 order by NULL
|
||||||
|
EXPLAIN EXTENDED
|
||||||
|
SELECT STRAIGHT_JOIN t2.v2
|
||||||
|
FROM
|
||||||
|
(t2,t1)
|
||||||
|
LEFT JOIN
|
||||||
|
(t1 as tb1 LEFT JOIN t1 AS tb2 ON tb2.v1 = tb1.v2)
|
||||||
|
ON t1.pk = t2.pk AND t2.v2 = tb1.v1
|
||||||
|
WHERE tb1.pk = 40
|
||||||
|
ORDER BY tb1.i1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
Warnings:
|
||||||
|
Note 1003 select straight_join 'p' AS `v2` from `test`.`t1` join `test`.`t1` `tb1` left join `test`.`t1` `tb2` on(multiple equal(NULL, NULL)) where 0 order by NULL
|
||||||
|
SELECT STRAIGHT_JOIN DISTINCT t2.v2
|
||||||
|
FROM
|
||||||
|
(t1 as tb1 LEFT JOIN t1 AS tb2 ON tb2.v1 = tb1.v2)
|
||||||
|
RIGHT JOIN
|
||||||
|
(t2,t1)
|
||||||
|
ON t1.pk = t2.pk AND t2.v2 = tb1.v1
|
||||||
|
WHERE tb1.pk = 40
|
||||||
|
ORDER BY tb1.i1;
|
||||||
|
v2
|
||||||
|
DROP TABLE t1,t2;
|
||||||
# end of 5.5 tests
|
# end of 5.5 tests
|
||||||
SET optimizer_switch=@save_optimizer_switch;
|
SET optimizer_switch=@save_optimizer_switch;
|
||||||
set join_cache_level=default;
|
set join_cache_level=default;
|
||||||
|
@ -144,3 +144,7 @@ select * from t2;
|
|||||||
a
|
a
|
||||||
1
|
1
|
||||||
drop table tmp,t2;
|
drop table tmp,t2;
|
||||||
|
create table t1 (a int) engine=memory;
|
||||||
|
rename table t1 to non_existent.t2;
|
||||||
|
ERROR 42000: Unknown database 'non_existent'
|
||||||
|
drop table t1;
|
||||||
|
@ -141,3 +141,10 @@ select * from tmp;
|
|||||||
select * from t2;
|
select * from t2;
|
||||||
drop table tmp,t2;
|
drop table tmp,t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-11741 handler::ha_reset(): Assertion `bitmap_is_set_all(&table->s->all_set)' failed or server crash in mi_reset or buffer overrun or unexpected ER_CANT_REMOVE_ALL_FIELDS
|
||||||
|
#
|
||||||
|
create table t1 (a int) engine=memory;
|
||||||
|
--error ER_BAD_DB_ERROR
|
||||||
|
rename table t1 to non_existent.t2;
|
||||||
|
drop table t1;
|
||||||
|
@ -2,7 +2,13 @@
|
|||||||
# MDEV-15477: SESSION_SYSVARS_TRACKER does not track last_gtid
|
# MDEV-15477: SESSION_SYSVARS_TRACKER does not track last_gtid
|
||||||
#
|
#
|
||||||
SET gtid_seq_no=1000;
|
SET gtid_seq_no=1000;
|
||||||
|
-- Tracker : SESSION_TRACK_SCHEMA
|
||||||
|
-- test
|
||||||
|
|
||||||
SET @@session.session_track_system_variables='last_gtid';
|
SET @@session.session_track_system_variables='last_gtid';
|
||||||
|
-- Tracker : SESSION_TRACK_SCHEMA
|
||||||
|
-- test
|
||||||
|
|
||||||
create table t1 (a int) engine=innodb;
|
create table t1 (a int) engine=innodb;
|
||||||
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
|
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
|
||||||
-- last_gtid
|
-- last_gtid
|
||||||
|
@ -228,8 +228,6 @@ FLUSH PRIVILEGES;
|
|||||||
connect con1, localhost, mysqltest_1,,;
|
connect con1, localhost, mysqltest_1,,;
|
||||||
connection con1;
|
connection con1;
|
||||||
CREATE PROCEDURE p1(i INT) BEGIN END;
|
CREATE PROCEDURE p1(i INT) BEGIN END;
|
||||||
Warnings:
|
|
||||||
Warning 1404 Failed to grant EXECUTE and ALTER ROUTINE privileges
|
|
||||||
disconnect con1;
|
disconnect con1;
|
||||||
connection default;
|
connection default;
|
||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
|
@ -516,4 +516,133 @@ use test;
|
|||||||
drop database db1;
|
drop database db1;
|
||||||
drop database db2;
|
drop database db2;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# MDEV-16552: [10.0] ASAN global-buffer-overflow in is_stat_table / statistics_for_tables_is_needed
|
||||||
|
#
|
||||||
|
SET use_stat_tables = PREFERABLY;
|
||||||
|
SELECT CONVERT_TZ( '1991-09-20 10:11:02', '+00:00', 'GMT' );
|
||||||
|
CONVERT_TZ( '1991-09-20 10:11:02', '+00:00', 'GMT' )
|
||||||
|
NULL
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# MDEV-16757: manual addition of min/max statistics for BLOB
|
||||||
|
#
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
CREATE TABLE t1 (pk INT PRIMARY KEY, t TEXT);
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze Warning Engine-independent statistics are not collected for column 't'
|
||||||
|
test.t1 analyze status OK
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
DELETE FROM mysql.column_stats
|
||||||
|
WHERE db_name='test' AND table_name='t1' AND column_name='t';
|
||||||
|
INSERT INTO mysql.column_stats VALUES
|
||||||
|
('test','t1','t','bar','foo', 0.0, 3.0, 1.0, 0, NULL, NULL);
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
test t1 t bar foo 0.0000 3.0000 1.0000 0 NULL NULL
|
||||||
|
SELECT pk FROM t1;
|
||||||
|
pk
|
||||||
|
1
|
||||||
|
2
|
||||||
|
DROP TABLE t1;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# MDEV-16760: CREATE OR REPLACE TABLE after ANALYZE TABLE
|
||||||
|
#
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
CREATE TABLE t1 (pk int PRIMARY KEY, c varchar(32));
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze status OK
|
||||||
|
SELECT * FROM t1;
|
||||||
|
pk c
|
||||||
|
1 foo
|
||||||
|
2 bar
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
test t1 c bar foo 0.0000 3.0000 1.0000 0 NULL NULL
|
||||||
|
CREATE OR REPLACE TABLE t1 (pk int PRIMARY KEY, a char(7));
|
||||||
|
SELECT * FROM t1;
|
||||||
|
pk a
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
DROP TABLE t1;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# MDEV-16757: manual addition of min/max statistics for BLOB
|
||||||
|
#
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
CREATE TABLE t1 (pk INT PRIMARY KEY, t TEXT);
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze Warning Engine-independent statistics are not collected for column 't'
|
||||||
|
test.t1 analyze status OK
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
DELETE FROM mysql.column_stats
|
||||||
|
WHERE db_name='test' AND table_name='t1' AND column_name='t';
|
||||||
|
INSERT INTO mysql.column_stats VALUES
|
||||||
|
('test','t1','t','bar','foo', 0.0, 3.0, 1.0, 0, NULL, NULL);
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
test t1 t bar foo 0.0000 3.0000 1.0000 0 NULL NULL
|
||||||
|
SELECT pk FROM t1;
|
||||||
|
pk
|
||||||
|
1
|
||||||
|
2
|
||||||
|
DROP TABLE t1;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# MDEV-16760: CREATE OR REPLACE TABLE after ANALYZE TABLE
|
||||||
|
#
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
CREATE TABLE t1 (pk int PRIMARY KEY, c varchar(32));
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze status OK
|
||||||
|
SELECT * FROM t1;
|
||||||
|
pk c
|
||||||
|
1 foo
|
||||||
|
2 bar
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
test t1 c bar foo 0.0000 3.0000 1.0000 0 NULL NULL
|
||||||
|
CREATE OR REPLACE TABLE t1 (pk int PRIMARY KEY, a char(7));
|
||||||
|
SELECT * FROM t1;
|
||||||
|
pk a
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
DROP TABLE t1;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# MDEV-16711:CREATE OR REPLACE TABLE introducing BLOB column
|
||||||
|
#
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
CREATE TABLE t1 (pk INT PRIMARY KEY, t CHAR(60));
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze status OK
|
||||||
|
CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY, t TEXT);
|
||||||
|
SELECT MAX(pk) FROM t1;
|
||||||
|
MAX(pk)
|
||||||
|
NULL
|
||||||
|
DROP TABLE t1;
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
@ -305,4 +305,116 @@ drop database db1;
|
|||||||
drop database db2;
|
drop database db2;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16552: [10.0] ASAN global-buffer-overflow in is_stat_table / statistics_for_tables_is_needed
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET use_stat_tables = PREFERABLY;
|
||||||
|
SELECT CONVERT_TZ( '1991-09-20 10:11:02', '+00:00', 'GMT' );
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16757: manual addition of min/max statistics for BLOB
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (pk INT PRIMARY KEY, t TEXT);
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
--sorted_result
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
DELETE FROM mysql.column_stats
|
||||||
|
WHERE db_name='test' AND table_name='t1' AND column_name='t';
|
||||||
|
INSERT INTO mysql.column_stats VALUES
|
||||||
|
('test','t1','t','bar','foo', 0.0, 3.0, 1.0, 0, NULL, NULL);
|
||||||
|
--sorted_result
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
|
||||||
|
SELECT pk FROM t1;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16760: CREATE OR REPLACE TABLE after ANALYZE TABLE
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (pk int PRIMARY KEY, c varchar(32));
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
|
||||||
|
CREATE OR REPLACE TABLE t1 (pk int PRIMARY KEY, a char(7));
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16757: manual addition of min/max statistics for BLOB
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (pk INT PRIMARY KEY, t TEXT);
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
--sorted_result
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
DELETE FROM mysql.column_stats
|
||||||
|
WHERE db_name='test' AND table_name='t1' AND column_name='t';
|
||||||
|
INSERT INTO mysql.column_stats VALUES
|
||||||
|
('test','t1','t','bar','foo', 0.0, 3.0, 1.0, 0, NULL, NULL);
|
||||||
|
--sorted_result
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
|
||||||
|
SELECT pk FROM t1;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16760: CREATE OR REPLACE TABLE after ANALYZE TABLE
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (pk int PRIMARY KEY, c varchar(32));
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
|
||||||
|
CREATE OR REPLACE TABLE t1 (pk int PRIMARY KEY, a char(7));
|
||||||
|
SELECT * FROM t1;
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16711:CREATE OR REPLACE TABLE introducing BLOB column
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (pk INT PRIMARY KEY, t CHAR(60));
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY, t TEXT);
|
||||||
|
|
||||||
|
SELECT MAX(pk) FROM t1;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
@ -543,6 +543,135 @@ use test;
|
|||||||
drop database db1;
|
drop database db1;
|
||||||
drop database db2;
|
drop database db2;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# MDEV-16552: [10.0] ASAN global-buffer-overflow in is_stat_table / statistics_for_tables_is_needed
|
||||||
|
#
|
||||||
|
SET use_stat_tables = PREFERABLY;
|
||||||
|
SELECT CONVERT_TZ( '1991-09-20 10:11:02', '+00:00', 'GMT' );
|
||||||
|
CONVERT_TZ( '1991-09-20 10:11:02', '+00:00', 'GMT' )
|
||||||
|
NULL
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# MDEV-16757: manual addition of min/max statistics for BLOB
|
||||||
|
#
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
CREATE TABLE t1 (pk INT PRIMARY KEY, t TEXT);
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze Warning Engine-independent statistics are not collected for column 't'
|
||||||
|
test.t1 analyze status OK
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
DELETE FROM mysql.column_stats
|
||||||
|
WHERE db_name='test' AND table_name='t1' AND column_name='t';
|
||||||
|
INSERT INTO mysql.column_stats VALUES
|
||||||
|
('test','t1','t','bar','foo', 0.0, 3.0, 1.0, 0, NULL, NULL);
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
test t1 t bar foo 0.0000 3.0000 1.0000 0 NULL NULL
|
||||||
|
SELECT pk FROM t1;
|
||||||
|
pk
|
||||||
|
1
|
||||||
|
2
|
||||||
|
DROP TABLE t1;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# MDEV-16760: CREATE OR REPLACE TABLE after ANALYZE TABLE
|
||||||
|
#
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
CREATE TABLE t1 (pk int PRIMARY KEY, c varchar(32));
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze status OK
|
||||||
|
SELECT * FROM t1;
|
||||||
|
pk c
|
||||||
|
1 foo
|
||||||
|
2 bar
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
test t1 c bar foo 0.0000 3.0000 1.0000 0 NULL NULL
|
||||||
|
CREATE OR REPLACE TABLE t1 (pk int PRIMARY KEY, a char(7));
|
||||||
|
SELECT * FROM t1;
|
||||||
|
pk a
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
DROP TABLE t1;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# MDEV-16757: manual addition of min/max statistics for BLOB
|
||||||
|
#
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
CREATE TABLE t1 (pk INT PRIMARY KEY, t TEXT);
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze Warning Engine-independent statistics are not collected for column 't'
|
||||||
|
test.t1 analyze status OK
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
DELETE FROM mysql.column_stats
|
||||||
|
WHERE db_name='test' AND table_name='t1' AND column_name='t';
|
||||||
|
INSERT INTO mysql.column_stats VALUES
|
||||||
|
('test','t1','t','bar','foo', 0.0, 3.0, 1.0, 0, NULL, NULL);
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
test t1 t bar foo 0.0000 3.0000 1.0000 0 NULL NULL
|
||||||
|
SELECT pk FROM t1;
|
||||||
|
pk
|
||||||
|
1
|
||||||
|
2
|
||||||
|
DROP TABLE t1;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# MDEV-16760: CREATE OR REPLACE TABLE after ANALYZE TABLE
|
||||||
|
#
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
CREATE TABLE t1 (pk int PRIMARY KEY, c varchar(32));
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze status OK
|
||||||
|
SELECT * FROM t1;
|
||||||
|
pk c
|
||||||
|
1 foo
|
||||||
|
2 bar
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
test t1 pk 1 2 0.0000 4.0000 1.0000 0 NULL NULL
|
||||||
|
test t1 c bar foo 0.0000 3.0000 1.0000 0 NULL NULL
|
||||||
|
CREATE OR REPLACE TABLE t1 (pk int PRIMARY KEY, a char(7));
|
||||||
|
SELECT * FROM t1;
|
||||||
|
pk a
|
||||||
|
SELECT * FROM mysql.column_stats;
|
||||||
|
db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram
|
||||||
|
DROP TABLE t1;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# MDEV-16711:CREATE OR REPLACE TABLE introducing BLOB column
|
||||||
|
#
|
||||||
|
SET use_stat_tables= PREFERABLY;
|
||||||
|
CREATE TABLE t1 (pk INT PRIMARY KEY, t CHAR(60));
|
||||||
|
INSERT INTO t1 VALUES (1,'foo'),(2,'bar');
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status Engine-independent statistics collected
|
||||||
|
test.t1 analyze status OK
|
||||||
|
CREATE OR REPLACE TABLE t1 (pk INT PRIMARY KEY, t TEXT);
|
||||||
|
SELECT MAX(pk) FROM t1;
|
||||||
|
MAX(pk)
|
||||||
|
NULL
|
||||||
|
DROP TABLE t1;
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
set optimizer_switch=@save_optimizer_switch_for_stat_tables_test;
|
set optimizer_switch=@save_optimizer_switch_for_stat_tables_test;
|
||||||
SET SESSION STORAGE_ENGINE=DEFAULT;
|
SET SESSION STORAGE_ENGINE=DEFAULT;
|
||||||
|
@ -7237,6 +7237,22 @@ a
|
|||||||
5
|
5
|
||||||
SET @@optimizer_switch= @optimiser_switch_save;
|
SET @@optimizer_switch= @optimiser_switch_save;
|
||||||
DROP TABLE t1, t2, t3;
|
DROP TABLE t1, t2, t3;
|
||||||
|
#
|
||||||
|
# MDEV-16820: impossible where with inexpensive subquery
|
||||||
|
#
|
||||||
|
create table t1 (a int) engine=myisam;
|
||||||
|
insert into t1 values (3), (1), (7);
|
||||||
|
create table t2 (b int, index idx(b));
|
||||||
|
insert into t2 values (2), (5), (3), (2);
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10 and t1.a > 3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
drop table t1,t2;
|
||||||
End of 5.5 tests
|
End of 5.5 tests
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -6098,6 +6098,21 @@ and t1.a in (select `test`.`t3`.`c` from `test`.`t3`);
|
|||||||
SET @@optimizer_switch= @optimiser_switch_save;
|
SET @@optimizer_switch= @optimiser_switch_save;
|
||||||
DROP TABLE t1, t2, t3;
|
DROP TABLE t1, t2, t3;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16820: impossible where with inexpensive subquery
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create table t1 (a int) engine=myisam;
|
||||||
|
insert into t1 values (3), (1), (7);
|
||||||
|
|
||||||
|
create table t2 (b int, index idx(b));
|
||||||
|
insert into t2 values (2), (5), (3), (2);
|
||||||
|
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10;
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10 and t1.a > 3;
|
||||||
|
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
--echo End of 5.5 tests
|
--echo End of 5.5 tests
|
||||||
--echo # End of 10.0 tests
|
--echo # End of 10.0 tests
|
||||||
|
|
||||||
|
@ -2391,6 +2391,99 @@ ec70316637232000158bbfc8bcbe5d60
|
|||||||
ebb4620037332000158bbfc8bcbe5d89
|
ebb4620037332000158bbfc8bcbe5d89
|
||||||
DROP TABLE t1,t2,t3;
|
DROP TABLE t1,t2,t3;
|
||||||
set optimizer_switch=@save_optimizer_switch;
|
set optimizer_switch=@save_optimizer_switch;
|
||||||
|
#
|
||||||
|
# MDEV-16751: Server crashes in st_join_table::cleanup or
|
||||||
|
# TABLE_LIST::is_with_table_recursive_reference with join_cache_level>2
|
||||||
|
#
|
||||||
|
set @save_join_cache_level= @@join_cache_level;
|
||||||
|
set join_cache_level=4;
|
||||||
|
CREATE TABLE t1 ( id int NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19);
|
||||||
|
CREATE TABLE t2 (i1 int NOT NULL, i2 int NOT NULL) ;
|
||||||
|
INSERT INTO t2 VALUES (11,11),(12,12),(13,13);
|
||||||
|
explain
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 3
|
||||||
|
1 PRIMARY t1 hash_ALL NULL #hash#$hj 4 test.t2.i1 9 Using where; Using join buffer (flat, BNLH join)
|
||||||
|
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 Using where
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
set @@join_cache_level= @save_join_cache_level;
|
||||||
|
alter table t1 add key(id);
|
||||||
|
explain
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 3
|
||||||
|
1 PRIMARY t1 ref id id 4 test.t2.i1 2 Using index
|
||||||
|
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 Using where
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
drop table t1,t2;
|
||||||
|
#
|
||||||
|
# MDEV-15454: Nested SELECT IN returns wrong results
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 ( a int NOT NULL PRIMARY KEY);
|
||||||
|
CREATE TABLE t2 ( a int, b int );
|
||||||
|
INSERT INTO t2 VALUES (7878, 96),(3465, 96),(1403, 96),(4189, 96),(8732, 96), (5,96);
|
||||||
|
CREATE TABLE t3 (c int unsigned NOT NULL, b int unsigned NOT NULL, PRIMARY KEY (c,b));
|
||||||
|
INSERT INTO t3 (c, b) VALUES (27, 96);
|
||||||
|
CREATE PROCEDURE prepare_data()
|
||||||
|
BEGIN
|
||||||
|
DECLARE i INT DEFAULT 1;
|
||||||
|
WHILE i < 1000 DO
|
||||||
|
INSERT INTO t1 (a) VALUES (i);
|
||||||
|
INSERT INTO t2 (a,b) VALUES (i,56);
|
||||||
|
INSERT INTO t3 (c,b) VALUES (i,i);
|
||||||
|
SET i = i + 1;
|
||||||
|
END WHILE;
|
||||||
|
END$$
|
||||||
|
CALL prepare_data();
|
||||||
|
SELECT t2.a FROM t2 WHERE t2.b IN (SELECT t3.b FROM t3 WHERE t3.c= 27);
|
||||||
|
a
|
||||||
|
7878
|
||||||
|
3465
|
||||||
|
1403
|
||||||
|
4189
|
||||||
|
8732
|
||||||
|
5
|
||||||
|
set @save_optimizer_switch= @@optimizer_switch;
|
||||||
|
SET optimizer_switch='materialization=off';
|
||||||
|
SELECT t1.a FROM t1
|
||||||
|
WHERE t1.a IN (SELECT t2.a FROM t2 WHERE t2.b IN (SELECT t3.b FROM t3 WHERE t3.c= 27)) LIMIT 5;
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SET optimizer_switch='materialization=on';
|
||||||
|
SELECT t1.a FROM t1
|
||||||
|
WHERE t1.a IN (SELECT t2.a FROM t2 WHERE t2.b IN (SELECT t3.b FROM t3 WHERE t3.c= 27)) LIMIT 5;
|
||||||
|
a
|
||||||
|
5
|
||||||
|
drop procedure prepare_data;
|
||||||
|
set @@optimizer_switch= @save_optimizer_switch;
|
||||||
|
drop table t1,t2,t3;
|
||||||
|
CREATE TABLE t1 ( id int NOT NULL, key(id));
|
||||||
|
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19);
|
||||||
|
CREATE TABLE t2 (i1 int NOT NULL, i2 int NOT NULL);
|
||||||
|
INSERT INTO t2 VALUES (11,11),(12,12),(13,13);
|
||||||
|
CREATE VIEW v1 AS SELECT t2.i1 FROM t2 where t2.i1 = t2.i2;
|
||||||
|
explain SELECT 1 FROM t1 where t1.id IN (SELECT v1.i1 from v1);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 3
|
||||||
|
1 PRIMARY t1 ref id id 4 test.t2.i1 2 Using index
|
||||||
|
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 Using where
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT v1.i1 from v1);
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
drop table t1,t2;
|
||||||
|
drop view v1;
|
||||||
# End of 5.5 tests
|
# End of 5.5 tests
|
||||||
#
|
#
|
||||||
# MDEV-7220: Materialization strategy is not used for REPLACE ... SELECT
|
# MDEV-7220: Materialization strategy is not used for REPLACE ... SELECT
|
||||||
|
@ -442,7 +442,7 @@ SELECT i2 FROM t2 RIGHT JOIN t3 ON (c3 = c2) WHERE pk3 = i1
|
|||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY t1 system NULL NULL NULL NULL 1
|
1 PRIMARY t1 system NULL NULL NULL NULL 1
|
||||||
2 DEPENDENT SUBQUERY t3 const PRIMARY PRIMARY 4 const 1
|
2 DEPENDENT SUBQUERY t3 const PRIMARY PRIMARY 4 const 1
|
||||||
2 DEPENDENT SUBQUERY t2 index NULL i2 11 NULL 2 Using where; Using index
|
2 DEPENDENT SUBQUERY t2 index i2 i2 11 NULL 2 Using where; Using index
|
||||||
DROP TABLE t1,t2,t3;
|
DROP TABLE t1,t2,t3;
|
||||||
#
|
#
|
||||||
# MDEV-7599: in-to-exists chosen after min/max optimization
|
# MDEV-7599: in-to-exists chosen after min/max optimization
|
||||||
|
@ -7237,6 +7237,22 @@ a
|
|||||||
5
|
5
|
||||||
SET @@optimizer_switch= @optimiser_switch_save;
|
SET @@optimizer_switch= @optimiser_switch_save;
|
||||||
DROP TABLE t1, t2, t3;
|
DROP TABLE t1, t2, t3;
|
||||||
|
#
|
||||||
|
# MDEV-16820: impossible where with inexpensive subquery
|
||||||
|
#
|
||||||
|
create table t1 (a int) engine=myisam;
|
||||||
|
insert into t1 values (3), (1), (7);
|
||||||
|
create table t2 (b int, index idx(b));
|
||||||
|
insert into t2 values (2), (5), (3), (2);
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10 and t1.a > 3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
drop table t1,t2;
|
||||||
End of 5.5 tests
|
End of 5.5 tests
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -7230,6 +7230,22 @@ a
|
|||||||
5
|
5
|
||||||
SET @@optimizer_switch= @optimiser_switch_save;
|
SET @@optimizer_switch= @optimiser_switch_save;
|
||||||
DROP TABLE t1, t2, t3;
|
DROP TABLE t1, t2, t3;
|
||||||
|
#
|
||||||
|
# MDEV-16820: impossible where with inexpensive subquery
|
||||||
|
#
|
||||||
|
create table t1 (a int) engine=myisam;
|
||||||
|
insert into t1 values (3), (1), (7);
|
||||||
|
create table t2 (b int, index idx(b));
|
||||||
|
insert into t2 values (2), (5), (3), (2);
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10 and t1.a > 3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
drop table t1,t2;
|
||||||
End of 5.5 tests
|
End of 5.5 tests
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -7228,6 +7228,22 @@ a
|
|||||||
5
|
5
|
||||||
SET @@optimizer_switch= @optimiser_switch_save;
|
SET @@optimizer_switch= @optimiser_switch_save;
|
||||||
DROP TABLE t1, t2, t3;
|
DROP TABLE t1, t2, t3;
|
||||||
|
#
|
||||||
|
# MDEV-16820: impossible where with inexpensive subquery
|
||||||
|
#
|
||||||
|
create table t1 (a int) engine=myisam;
|
||||||
|
insert into t1 values (3), (1), (7);
|
||||||
|
create table t2 (b int, index idx(b));
|
||||||
|
insert into t2 values (2), (5), (3), (2);
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10 and t1.a > 3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
drop table t1,t2;
|
||||||
End of 5.5 tests
|
End of 5.5 tests
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -7243,6 +7243,22 @@ a
|
|||||||
5
|
5
|
||||||
SET @@optimizer_switch= @optimiser_switch_save;
|
SET @@optimizer_switch= @optimiser_switch_save;
|
||||||
DROP TABLE t1, t2, t3;
|
DROP TABLE t1, t2, t3;
|
||||||
|
#
|
||||||
|
# MDEV-16820: impossible where with inexpensive subquery
|
||||||
|
#
|
||||||
|
create table t1 (a int) engine=myisam;
|
||||||
|
insert into t1 values (3), (1), (7);
|
||||||
|
create table t2 (b int, index idx(b));
|
||||||
|
insert into t2 values (2), (5), (3), (2);
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10 and t1.a > 3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
drop table t1,t2;
|
||||||
End of 5.5 tests
|
End of 5.5 tests
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -7228,6 +7228,22 @@ a
|
|||||||
5
|
5
|
||||||
SET @@optimizer_switch= @optimiser_switch_save;
|
SET @@optimizer_switch= @optimiser_switch_save;
|
||||||
DROP TABLE t1, t2, t3;
|
DROP TABLE t1, t2, t3;
|
||||||
|
#
|
||||||
|
# MDEV-16820: impossible where with inexpensive subquery
|
||||||
|
#
|
||||||
|
create table t1 (a int) engine=myisam;
|
||||||
|
insert into t1 values (3), (1), (7);
|
||||||
|
create table t2 (b int, index idx(b));
|
||||||
|
insert into t2 values (2), (5), (3), (2);
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
explain select * from t1 where (select max(b) from t2) = 10 and t1.a > 3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
|
drop table t1,t2;
|
||||||
End of 5.5 tests
|
End of 5.5 tests
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
|
@ -1728,6 +1728,57 @@ id
|
|||||||
13
|
13
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-15982: Incorrect results when subquery is materialized
|
||||||
|
#
|
||||||
|
CREATE TABLE `t1` (`id` int(32) NOT NULL primary key);
|
||||||
|
INSERT INTO `t1` VALUES
|
||||||
|
(45), (46), (47), (48), (49), (50), (51), (52), (53), (54), (55), (56), (57), (58), (59), (60), (61), (62),
|
||||||
|
(63), (64), (65), (66), (67), (68), (69), (70), (71), (72), (73), (74), (75), (76), (77), (78), (79), (80),
|
||||||
|
(81), (82), (83), (84), (85), (86), (87), (88), (89), (90), (91), (92),(93),(94),(95),(96), (97), (98),
|
||||||
|
(99), (100), (101), (102), (103), (104), (105), (106), (107), (108), (109), (110), (111), (112), (113),
|
||||||
|
(114), (115), (116), (117), (118), (119), (120), (121), (122), (123), (124), (125), (126), (127), (128),
|
||||||
|
(129), (130), (131), (132), (133), (134), (135), (136), (137), (138), (139), (140), (141), (142), (143), (144), (145), (146),
|
||||||
|
(147), (148), (149), (150), (151), (152), (153), (154), (155), (156), (157), (158), (159), (160), (161),
|
||||||
|
(162), (163), (164), (165), (166), (167), (168), (169), (170), (171), (172), (173),
|
||||||
|
(174), (175), (176), (177), (178), (179), (180), (181), (182), (183), (2), (3), (4), (5), (6), (19), (35),
|
||||||
|
(7), (20), (8), (36), (219), (22), (10), (23), (37), (11), (24);
|
||||||
|
CREATE TABLE `t2` (`type` int , `id` int(32) NOT NULL primary key);
|
||||||
|
INSERT INTO `t2` VALUES
|
||||||
|
(2,2),(2,3),(1,4),(2,5),(1,6),(1,19),(5,7),(1,20),(1,8),(1,21),(1,9),
|
||||||
|
(1,22),(2,10),(1,23),(2,11),(1,24),(1,12),(1,25),(2,13),(2,26),(2,14),
|
||||||
|
(2,27),(1,15),(1,28),(3,16),(1,29),(2,17),(1,30),(5,18),(2,1);
|
||||||
|
CREATE TABLE `t3` (`ref_id` int(32) unsigned ,`type` varchar(80),`id` int(32) NOT NULL );
|
||||||
|
INSERT INTO `t3` VALUES
|
||||||
|
(1,'incident',31),(2,'faux pas',32),
|
||||||
|
(5,'oopsies',33),(3,'deniable',34),
|
||||||
|
(11,'wasntme',35),(10,'wasntme',36),
|
||||||
|
(17,'faux pas',37),(13,'unlikely',38),
|
||||||
|
(13,'improbable',39),(14,'incident',40),
|
||||||
|
(26,'problem',41),(14,'problem',42),
|
||||||
|
(26,'incident',43),(27,'incident',44);
|
||||||
|
explain
|
||||||
|
SELECT t2.id FROM t2,t1
|
||||||
|
WHERE t2.id IN (SELECT t3.ref_id FROM t3,t1 where t3.id = t1.id) and t2.id = t1.id;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t2 index PRIMARY PRIMARY 4 NULL 30 Using index
|
||||||
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 Using where
|
||||||
|
1 PRIMARY t1 eq_ref PRIMARY PRIMARY 4 test.t2.id 1 Using index
|
||||||
|
2 MATERIALIZED t3 ALL NULL NULL NULL NULL 14
|
||||||
|
2 MATERIALIZED t1 eq_ref PRIMARY PRIMARY 4 test.t3.id 1 Using index
|
||||||
|
SELECT t2.id FROM t2,t1
|
||||||
|
WHERE t2.id IN (SELECT t3.ref_id FROM t3,t1 where t3.id = t1.id) and t2.id = t1.id;
|
||||||
|
id
|
||||||
|
10
|
||||||
|
11
|
||||||
|
set optimizer_switch='materialization=off';
|
||||||
|
SELECT t2.id FROM t2,t1
|
||||||
|
WHERE t2.id IN (SELECT t3.ref_id FROM t3,t1 where t3.id = t1.id) and t2.id = t1.id;
|
||||||
|
id
|
||||||
|
11
|
||||||
|
10
|
||||||
|
set optimizer_switch='materialization=on';
|
||||||
|
DROP TABLE t1,t2,t3;
|
||||||
|
#
|
||||||
# MDEV-15247: Crash when SET NAMES 'utf8' is set
|
# MDEV-15247: Crash when SET NAMES 'utf8' is set
|
||||||
#
|
#
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
|
@ -346,6 +346,55 @@ WHERE (
|
|||||||
);
|
);
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-15982: Incorrect results when subquery is materialized
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE `t1` (`id` int(32) NOT NULL primary key);
|
||||||
|
INSERT INTO `t1` VALUES
|
||||||
|
(45), (46), (47), (48), (49), (50), (51), (52), (53), (54), (55), (56), (57), (58), (59), (60), (61), (62),
|
||||||
|
(63), (64), (65), (66), (67), (68), (69), (70), (71), (72), (73), (74), (75), (76), (77), (78), (79), (80),
|
||||||
|
(81), (82), (83), (84), (85), (86), (87), (88), (89), (90), (91), (92),(93),(94),(95),(96), (97), (98),
|
||||||
|
(99), (100), (101), (102), (103), (104), (105), (106), (107), (108), (109), (110), (111), (112), (113),
|
||||||
|
(114), (115), (116), (117), (118), (119), (120), (121), (122), (123), (124), (125), (126), (127), (128),
|
||||||
|
(129), (130), (131), (132), (133), (134), (135), (136), (137), (138), (139), (140), (141), (142), (143), (144), (145), (146),
|
||||||
|
(147), (148), (149), (150), (151), (152), (153), (154), (155), (156), (157), (158), (159), (160), (161),
|
||||||
|
(162), (163), (164), (165), (166), (167), (168), (169), (170), (171), (172), (173),
|
||||||
|
(174), (175), (176), (177), (178), (179), (180), (181), (182), (183), (2), (3), (4), (5), (6), (19), (35),
|
||||||
|
(7), (20), (8), (36), (219), (22), (10), (23), (37), (11), (24);
|
||||||
|
|
||||||
|
CREATE TABLE `t2` (`type` int , `id` int(32) NOT NULL primary key);
|
||||||
|
INSERT INTO `t2` VALUES
|
||||||
|
(2,2),(2,3),(1,4),(2,5),(1,6),(1,19),(5,7),(1,20),(1,8),(1,21),(1,9),
|
||||||
|
(1,22),(2,10),(1,23),(2,11),(1,24),(1,12),(1,25),(2,13),(2,26),(2,14),
|
||||||
|
(2,27),(1,15),(1,28),(3,16),(1,29),(2,17),(1,30),(5,18),(2,1);
|
||||||
|
|
||||||
|
CREATE TABLE `t3` (`ref_id` int(32) unsigned ,`type` varchar(80),`id` int(32) NOT NULL );
|
||||||
|
INSERT INTO `t3` VALUES
|
||||||
|
(1,'incident',31),(2,'faux pas',32),
|
||||||
|
(5,'oopsies',33),(3,'deniable',34),
|
||||||
|
(11,'wasntme',35),(10,'wasntme',36),
|
||||||
|
(17,'faux pas',37),(13,'unlikely',38),
|
||||||
|
(13,'improbable',39),(14,'incident',40),
|
||||||
|
(26,'problem',41),(14,'problem',42),
|
||||||
|
(26,'incident',43),(27,'incident',44);
|
||||||
|
|
||||||
|
explain
|
||||||
|
SELECT t2.id FROM t2,t1
|
||||||
|
WHERE t2.id IN (SELECT t3.ref_id FROM t3,t1 where t3.id = t1.id) and t2.id = t1.id;
|
||||||
|
|
||||||
|
SELECT t2.id FROM t2,t1
|
||||||
|
WHERE t2.id IN (SELECT t3.ref_id FROM t3,t1 where t3.id = t1.id) and t2.id = t1.id;
|
||||||
|
|
||||||
|
set optimizer_switch='materialization=off';
|
||||||
|
|
||||||
|
SELECT t2.id FROM t2,t1
|
||||||
|
WHERE t2.id IN (SELECT t3.ref_id FROM t3,t1 where t3.id = t1.id) and t2.id = t1.id;
|
||||||
|
set optimizer_switch='materialization=on';
|
||||||
|
|
||||||
|
DROP TABLE t1,t2,t3;
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-15247: Crash when SET NAMES 'utf8' is set
|
--echo # MDEV-15247: Crash when SET NAMES 'utf8' is set
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -2431,6 +2431,99 @@ ec70316637232000158bbfc8bcbe5d60
|
|||||||
ebb4620037332000158bbfc8bcbe5d89
|
ebb4620037332000158bbfc8bcbe5d89
|
||||||
DROP TABLE t1,t2,t3;
|
DROP TABLE t1,t2,t3;
|
||||||
set optimizer_switch=@save_optimizer_switch;
|
set optimizer_switch=@save_optimizer_switch;
|
||||||
|
#
|
||||||
|
# MDEV-16751: Server crashes in st_join_table::cleanup or
|
||||||
|
# TABLE_LIST::is_with_table_recursive_reference with join_cache_level>2
|
||||||
|
#
|
||||||
|
set @save_join_cache_level= @@join_cache_level;
|
||||||
|
set join_cache_level=4;
|
||||||
|
CREATE TABLE t1 ( id int NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19);
|
||||||
|
CREATE TABLE t2 (i1 int NOT NULL, i2 int NOT NULL) ;
|
||||||
|
INSERT INTO t2 VALUES (11,11),(12,12),(13,13);
|
||||||
|
explain
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 3
|
||||||
|
1 PRIMARY t1 hash_ALL NULL #hash#$hj 4 test.t2.i1 9 Using where; Using join buffer (flat, BNLH join)
|
||||||
|
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 Using where
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
set @@join_cache_level= @save_join_cache_level;
|
||||||
|
alter table t1 add key(id);
|
||||||
|
explain
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 3
|
||||||
|
1 PRIMARY t1 ref id id 4 test.t2.i1 2 Using index
|
||||||
|
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 Using where
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
drop table t1,t2;
|
||||||
|
#
|
||||||
|
# MDEV-15454: Nested SELECT IN returns wrong results
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 ( a int NOT NULL PRIMARY KEY);
|
||||||
|
CREATE TABLE t2 ( a int, b int );
|
||||||
|
INSERT INTO t2 VALUES (7878, 96),(3465, 96),(1403, 96),(4189, 96),(8732, 96), (5,96);
|
||||||
|
CREATE TABLE t3 (c int unsigned NOT NULL, b int unsigned NOT NULL, PRIMARY KEY (c,b));
|
||||||
|
INSERT INTO t3 (c, b) VALUES (27, 96);
|
||||||
|
CREATE PROCEDURE prepare_data()
|
||||||
|
BEGIN
|
||||||
|
DECLARE i INT DEFAULT 1;
|
||||||
|
WHILE i < 1000 DO
|
||||||
|
INSERT INTO t1 (a) VALUES (i);
|
||||||
|
INSERT INTO t2 (a,b) VALUES (i,56);
|
||||||
|
INSERT INTO t3 (c,b) VALUES (i,i);
|
||||||
|
SET i = i + 1;
|
||||||
|
END WHILE;
|
||||||
|
END$$
|
||||||
|
CALL prepare_data();
|
||||||
|
SELECT t2.a FROM t2 WHERE t2.b IN (SELECT t3.b FROM t3 WHERE t3.c= 27);
|
||||||
|
a
|
||||||
|
7878
|
||||||
|
3465
|
||||||
|
1403
|
||||||
|
4189
|
||||||
|
8732
|
||||||
|
5
|
||||||
|
set @save_optimizer_switch= @@optimizer_switch;
|
||||||
|
SET optimizer_switch='materialization=off';
|
||||||
|
SELECT t1.a FROM t1
|
||||||
|
WHERE t1.a IN (SELECT t2.a FROM t2 WHERE t2.b IN (SELECT t3.b FROM t3 WHERE t3.c= 27)) LIMIT 5;
|
||||||
|
a
|
||||||
|
5
|
||||||
|
SET optimizer_switch='materialization=on';
|
||||||
|
SELECT t1.a FROM t1
|
||||||
|
WHERE t1.a IN (SELECT t2.a FROM t2 WHERE t2.b IN (SELECT t3.b FROM t3 WHERE t3.c= 27)) LIMIT 5;
|
||||||
|
a
|
||||||
|
5
|
||||||
|
drop procedure prepare_data;
|
||||||
|
set @@optimizer_switch= @save_optimizer_switch;
|
||||||
|
drop table t1,t2,t3;
|
||||||
|
CREATE TABLE t1 ( id int NOT NULL, key(id));
|
||||||
|
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19);
|
||||||
|
CREATE TABLE t2 (i1 int NOT NULL, i2 int NOT NULL);
|
||||||
|
INSERT INTO t2 VALUES (11,11),(12,12),(13,13);
|
||||||
|
CREATE VIEW v1 AS SELECT t2.i1 FROM t2 where t2.i1 = t2.i2;
|
||||||
|
explain SELECT 1 FROM t1 where t1.id IN (SELECT v1.i1 from v1);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 3
|
||||||
|
1 PRIMARY t1 ref id id 4 test.t2.i1 2 Using index
|
||||||
|
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 Using where
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT v1.i1 from v1);
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
1
|
||||||
|
drop table t1,t2;
|
||||||
|
drop view v1;
|
||||||
# End of 5.5 tests
|
# End of 5.5 tests
|
||||||
#
|
#
|
||||||
# MDEV-7220: Materialization strategy is not used for REPLACE ... SELECT
|
# MDEV-7220: Materialization strategy is not used for REPLACE ... SELECT
|
||||||
|
@ -2157,6 +2157,85 @@ eval $q;
|
|||||||
DROP TABLE t1,t2,t3;
|
DROP TABLE t1,t2,t3;
|
||||||
set optimizer_switch=@save_optimizer_switch;
|
set optimizer_switch=@save_optimizer_switch;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16751: Server crashes in st_join_table::cleanup or
|
||||||
|
--echo # TABLE_LIST::is_with_table_recursive_reference with join_cache_level>2
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
set @save_join_cache_level= @@join_cache_level;
|
||||||
|
set join_cache_level=4;
|
||||||
|
CREATE TABLE t1 ( id int NOT NULL);
|
||||||
|
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19);
|
||||||
|
|
||||||
|
CREATE TABLE t2 (i1 int NOT NULL, i2 int NOT NULL) ;
|
||||||
|
INSERT INTO t2 VALUES (11,11),(12,12),(13,13);
|
||||||
|
|
||||||
|
explain
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
|
||||||
|
set @@join_cache_level= @save_join_cache_level;
|
||||||
|
alter table t1 add key(id);
|
||||||
|
|
||||||
|
explain
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT t2.i1 FROM t2 WHERE t2.i1 = t2.i2);
|
||||||
|
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-15454: Nested SELECT IN returns wrong results
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 ( a int NOT NULL PRIMARY KEY);
|
||||||
|
|
||||||
|
CREATE TABLE t2 ( a int, b int );
|
||||||
|
INSERT INTO t2 VALUES (7878, 96),(3465, 96),(1403, 96),(4189, 96),(8732, 96), (5,96);
|
||||||
|
|
||||||
|
CREATE TABLE t3 (c int unsigned NOT NULL, b int unsigned NOT NULL, PRIMARY KEY (c,b));
|
||||||
|
INSERT INTO t3 (c, b) VALUES (27, 96);
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
CREATE PROCEDURE prepare_data()
|
||||||
|
BEGIN
|
||||||
|
DECLARE i INT DEFAULT 1;
|
||||||
|
WHILE i < 1000 DO
|
||||||
|
INSERT INTO t1 (a) VALUES (i);
|
||||||
|
INSERT INTO t2 (a,b) VALUES (i,56);
|
||||||
|
INSERT INTO t3 (c,b) VALUES (i,i);
|
||||||
|
SET i = i + 1;
|
||||||
|
END WHILE;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
|
||||||
|
CALL prepare_data();
|
||||||
|
|
||||||
|
SELECT t2.a FROM t2 WHERE t2.b IN (SELECT t3.b FROM t3 WHERE t3.c= 27);
|
||||||
|
|
||||||
|
set @save_optimizer_switch= @@optimizer_switch;
|
||||||
|
SET optimizer_switch='materialization=off';
|
||||||
|
|
||||||
|
SELECT t1.a FROM t1
|
||||||
|
WHERE t1.a IN (SELECT t2.a FROM t2 WHERE t2.b IN (SELECT t3.b FROM t3 WHERE t3.c= 27)) LIMIT 5;
|
||||||
|
|
||||||
|
SET optimizer_switch='materialization=on';
|
||||||
|
|
||||||
|
SELECT t1.a FROM t1
|
||||||
|
WHERE t1.a IN (SELECT t2.a FROM t2 WHERE t2.b IN (SELECT t3.b FROM t3 WHERE t3.c= 27)) LIMIT 5;
|
||||||
|
|
||||||
|
drop procedure prepare_data;
|
||||||
|
set @@optimizer_switch= @save_optimizer_switch;
|
||||||
|
drop table t1,t2,t3;
|
||||||
|
|
||||||
|
CREATE TABLE t1 ( id int NOT NULL, key(id));
|
||||||
|
INSERT INTO t1 VALUES (11),(12),(13),(14),(15),(16),(17),(18),(19);
|
||||||
|
CREATE TABLE t2 (i1 int NOT NULL, i2 int NOT NULL);
|
||||||
|
INSERT INTO t2 VALUES (11,11),(12,12),(13,13);
|
||||||
|
CREATE VIEW v1 AS SELECT t2.i1 FROM t2 where t2.i1 = t2.i2;
|
||||||
|
explain SELECT 1 FROM t1 where t1.id IN (SELECT v1.i1 from v1);
|
||||||
|
SELECT 1 FROM t1 where t1.id IN (SELECT v1.i1 from v1);
|
||||||
|
drop table t1,t2;
|
||||||
|
drop view v1;
|
||||||
--echo # End of 5.5 tests
|
--echo # End of 5.5 tests
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-7220: Materialization strategy is not used for REPLACE ... SELECT
|
--echo # MDEV-7220: Materialization strategy is not used for REPLACE ... SELECT
|
||||||
|
@ -2149,6 +2149,22 @@ DROP VIEW v1;
|
|||||||
UNION
|
UNION
|
||||||
(SELECT 2, 2);
|
(SELECT 2, 2);
|
||||||
ERROR 42S02: Table 'test.v1' doesn't exist
|
ERROR 42S02: Table 'test.v1' doesn't exist
|
||||||
|
#
|
||||||
|
# Bug#27197235 USER VARIABLE + UINON + DECIMAL COLUMN RETURNS
|
||||||
|
# WRONG VALUES
|
||||||
|
#
|
||||||
|
SET NAMES utf8;
|
||||||
|
SET @advertAcctId = 1000003;
|
||||||
|
select @advertAcctId as a from dual union all select 1.0 from dual;
|
||||||
|
a
|
||||||
|
1000003.0
|
||||||
|
1.0
|
||||||
|
SET NAMES latin1;
|
||||||
|
SET @advertAcctId = 1000003;
|
||||||
|
select @advertAcctId as a from dual union all select 1.0 from dual;
|
||||||
|
a
|
||||||
|
1000003.0
|
||||||
|
1.0
|
||||||
End of 5.5 tests
|
End of 5.5 tests
|
||||||
#
|
#
|
||||||
# WL#1763 Avoid creating temporary table in UNION ALL
|
# WL#1763 Avoid creating temporary table in UNION ALL
|
||||||
|
@ -1480,6 +1480,21 @@ DROP VIEW v1;
|
|||||||
UNION
|
UNION
|
||||||
(SELECT 2, 2);
|
(SELECT 2, 2);
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#27197235 USER VARIABLE + UINON + DECIMAL COLUMN RETURNS
|
||||||
|
--echo # WRONG VALUES
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
let $old_charset= `SELECT @@character_set_client`;
|
||||||
|
|
||||||
|
SET NAMES utf8;
|
||||||
|
SET @advertAcctId = 1000003;
|
||||||
|
select @advertAcctId as a from dual union all select 1.0 from dual;
|
||||||
|
|
||||||
|
eval SET NAMES $old_charset;
|
||||||
|
SET @advertAcctId = 1000003;
|
||||||
|
select @advertAcctId as a from dual union all select 1.0 from dual;
|
||||||
|
|
||||||
--echo End of 5.5 tests
|
--echo End of 5.5 tests
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
|
31
mysql-test/suite/binlog/include/check_binlog_size.inc
Normal file
31
mysql-test/suite/binlog/include/check_binlog_size.inc
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# This file runs the query and checks
|
||||||
|
# whether the size of binlog is increased or not
|
||||||
|
# If size is changed it issue die command
|
||||||
|
# Parameters
|
||||||
|
# $sql_query = query to run
|
||||||
|
|
||||||
|
#Only last row of show binlog events matter
|
||||||
|
--let $tmp= 0
|
||||||
|
--let $counter= 1
|
||||||
|
while ($tmp != "No such row")
|
||||||
|
{
|
||||||
|
--let $initial_binlog_size= $tmp
|
||||||
|
--let $tmp= query_get_value(show binary logs, File_size, $counter)
|
||||||
|
--inc $counter
|
||||||
|
}
|
||||||
|
|
||||||
|
--eval $sql_query
|
||||||
|
|
||||||
|
--let $tmp= 0
|
||||||
|
--let $counter= 1
|
||||||
|
while ($tmp != "No such row")
|
||||||
|
{
|
||||||
|
--let $current_binlog_size= $tmp
|
||||||
|
--let $tmp= query_get_value(show binary logs, File_size, $counter)
|
||||||
|
--inc $counter
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($initial_binlog_size != $current_binlog_size)
|
||||||
|
{
|
||||||
|
die "Binlog size changed";
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user