mirror of
https://github.com/MariaDB/server.git
synced 2026-10-23 18:49:29 +03:00
Merge 13.1 to main
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -271,6 +271,8 @@ support-files/mariadb-extra.socket
|
||||
support-files/mariadb@.service
|
||||
support-files/mariadb@.socket
|
||||
support-files/mariadb-extra@.socket
|
||||
support-files/mariadb-plugin-config.cmake
|
||||
support-files/mariadb-plugin-defines.cmake
|
||||
support-files/mini-benchmark
|
||||
support-files/my-huge.cnf
|
||||
support-files/my-innodb-heavy-4G.cnf
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Copyright (c) 2006, 2017, Oracle and/or its affiliates.
|
||||
# Copyright (c) 2008, 2022, MariaDB Corporation.
|
||||
# Copyright (c) 2008, 2026, MariaDB Corporation.
|
||||
#
|
||||
# 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
|
||||
@@ -500,7 +500,18 @@ SET(PYTHON_SHEBANG "/usr/bin/env python3" CACHE STRING "python shebang")
|
||||
MARK_AS_ADVANCED(PYTHON_SHEBANG)
|
||||
|
||||
# Add storage engines and plugins.
|
||||
CONFIGURE_PLUGINS()
|
||||
IF(NOT WITHOUT_SERVER)
|
||||
FILE(GLOB dirs_storage ${CMAKE_SOURCE_DIR}/storage/*)
|
||||
ENDIF()
|
||||
|
||||
FILE(GLOB dirs_plugin ${CMAKE_SOURCE_DIR}/plugin/*)
|
||||
FOREACH(dir ${dirs_storage} ${dirs_plugin})
|
||||
IF (EXISTS ${dir}/CMakeLists.txt)
|
||||
ADD_SUBDIRECTORY(${dir})
|
||||
ENDIF()
|
||||
ENDFOREACH()
|
||||
|
||||
VERIFY_PLUGINS()
|
||||
|
||||
ADD_SUBDIRECTORY(include)
|
||||
ADD_SUBDIRECTORY(dbug)
|
||||
|
||||
@@ -57,7 +57,7 @@ build_script:
|
||||
- set PATH=%OPENSSL_ROOT_DIR%;%PATH%
|
||||
- set GENERATOR=-GNinja
|
||||
- call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
|
||||
- cmake -E time cmake %GENERATOR% .. -DWITH_SSL=system -DHAVE_OPENSSL_APPLINK_C=1 -DOPENSSL_ROOT_DIR=%OPENSSL_ROOT_DIR% -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DMYSQL_MAINTAINER_MODE=ERR -DFAST_BUILD=1 -DBISON_EXECUTABLE=C:\cygwin64\bin\bison.exe -DPLUGIN_PERFSCHEMA=NO -DPLUGIN_FEEDBACK=NO
|
||||
- cmake -E time cmake %GENERATOR% .. -DWITH_SSL=system -DHAVE_OPENSSL_APPLINK_C=1 -DOPENSSL_ROOT_DIR=%OPENSSL_ROOT_DIR% -DCMAKE_BUILD_TYPE=%BUILD_TYPE% -DMYSQL_MAINTAINER_MODE=ERR -DFAST_BUILD=1 -DBISON_EXECUTABLE=C:\cygwin64\bin\bison.exe -DPLUGIN_PERFSCHEMA=NO -DPLUGIN_FEEDBACK=NO -DPLUGIN_ROCKSDB=NO
|
||||
- set /A jobs=2*%NUMBER_OF_PROCESSORS%
|
||||
- cmake -E time cmake --build . -j %jobs% --config %BUILD_TYPE% --target minbuild
|
||||
|
||||
|
||||
@@ -50,8 +50,6 @@ static bool sql_log_bin_off= false;
|
||||
static uint opt_protocol=0;
|
||||
static myf error_flags; /* flags to pass to my_printf_error, like ME_BELL */
|
||||
|
||||
static my_bool ex_status_printed = 0; /* First output is not relative. */
|
||||
|
||||
#include <sslopt-vars.h>
|
||||
|
||||
static void print_version(void);
|
||||
@@ -926,7 +924,6 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv)
|
||||
(*func)(res, row, rownr++);
|
||||
print_top(res);
|
||||
|
||||
ex_status_printed = 1; /* From now on the output will be relative */
|
||||
mysql_free_result(res);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1170,8 +1170,7 @@ chunk_reader_mysqlbinlog::seek(uint64_t file_no, uint64_t offset)
|
||||
|
||||
bool
|
||||
open_engine_binlog(handler_binlog_reader *generic_reader,
|
||||
ulonglong start_position,
|
||||
const char *filename, IO_CACHE *opened_cache)
|
||||
ulonglong start_position, const char *filename)
|
||||
{
|
||||
binlog_reader_innodb *reader= (binlog_reader_innodb *)generic_reader;
|
||||
if (!reader->is_valid())
|
||||
@@ -1185,7 +1184,15 @@ open_engine_binlog(handler_binlog_reader *generic_reader,
|
||||
dirname_part(binlog_dir, filename, &dummy);
|
||||
if (!strlen(binlog_dir))
|
||||
strncpy(binlog_dir, ".", sizeof(binlog_dir) - 1);
|
||||
return reader->init_from_fd_pos(dup(opened_cache->file), start_position);
|
||||
if (!filename || strcmp(filename, "-") == 0)
|
||||
{
|
||||
error("InnoDB binlog file cannot be dumped from stdin");
|
||||
return true;
|
||||
}
|
||||
File fd= my_open(filename, O_RDONLY | O_BINARY, MYF(MY_WME));
|
||||
if (fd < 0)
|
||||
return 1;
|
||||
return reader->init_from_fd_pos(fd, start_position);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -25,8 +25,7 @@ extern const char *INNODB_BINLOG_MAGIC;
|
||||
|
||||
extern handler_binlog_reader *get_binlog_reader_innodb();
|
||||
extern bool open_engine_binlog(handler_binlog_reader *reader,
|
||||
ulonglong start_position,
|
||||
const char *filename, IO_CACHE *opened_cache);
|
||||
ulonglong start_position, const char *filename);
|
||||
|
||||
|
||||
/* Shared functions defined in mysqlbinlog.cc */
|
||||
|
||||
@@ -128,7 +128,7 @@ static my_bool print_row_count_used= 0, print_row_event_positions_used= 0;
|
||||
static my_bool debug_info_flag, debug_check_flag;
|
||||
static my_bool force_if_open_opt= 1;
|
||||
static my_bool opt_raw_mode= 0, opt_stop_never= 0;
|
||||
my_bool opt_gtid_strict_mode= true;
|
||||
my_bool opt_gtid_strict_mode= false;
|
||||
static ulong opt_stop_never_slave_server_id= 0;
|
||||
static my_bool opt_verify_binlog_checksum= 1;
|
||||
static ulonglong offset = 0;
|
||||
@@ -1756,7 +1756,7 @@ static struct my_option my_options[] =
|
||||
"start < stop comparison condition. Sequence numbers of any gtid domain "
|
||||
"must comprise monotically growing sequence",
|
||||
&opt_gtid_strict_mode, &opt_gtid_strict_mode, 0,
|
||||
GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"stop-datetime", OPT_STOP_DATETIME,
|
||||
"Stop reading the binlog at first event having a datetime equal or "
|
||||
"posterior to the argument; the argument must be a date and time "
|
||||
@@ -3367,7 +3367,7 @@ static Exit_status dump_local_log_entries(PRINT_EVENT_INFO *print_event_info,
|
||||
}
|
||||
if (binlog_format == INNODB_BINLOG_FORMAT)
|
||||
{
|
||||
if (open_engine_binlog(engine_binlog_reader, start_position, logname, file))
|
||||
if (open_engine_binlog(engine_binlog_reader, start_position, logname))
|
||||
goto err;
|
||||
}
|
||||
for (;;)
|
||||
|
||||
@@ -18,6 +18,25 @@ FUNCTION (EXTRACT_REPO_NAME_AND_USER repo_url repo_name_var repo_user_var)
|
||||
SET(${repo_user_var} ${repo_user} PARENT_SCOPE)
|
||||
ENDFUNCTION()
|
||||
|
||||
# Extract a valid RFC 5322 email address out of CPACK_PACKAGE_CONTACT.
|
||||
# CPACK_PACKAGE_CONTACT is normally in the "Display Name <email@domain>" form,
|
||||
# but a bare "email@domain" is also accepted. FATAL_ERROR if no valid email
|
||||
# can be found, since the SBOM schema requires the author's email to be a
|
||||
# real address.
|
||||
FUNCTION(SBOM_GET_CONTACT_EMAIL varname)
|
||||
SET(email_regex "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]+$")
|
||||
STRING(REGEX MATCH "<([^>]+)>" bracketed "${CPACK_PACKAGE_CONTACT}")
|
||||
IF(bracketed)
|
||||
SET(email "${CMAKE_MATCH_1}")
|
||||
ELSE()
|
||||
SET(email "${CPACK_PACKAGE_CONTACT}")
|
||||
ENDIF()
|
||||
IF(NOT email MATCHES "${email_regex}")
|
||||
MESSAGE(FATAL_ERROR "CPACK_PACKAGE_CONTACT ('${CPACK_PACKAGE_CONTACT}') does not contain a valid email address")
|
||||
ENDIF()
|
||||
SET(${varname} "${email}" PARENT_SCOPE)
|
||||
ENDFUNCTION()
|
||||
|
||||
# Add a known 3rd party dependency for SBOM generation
|
||||
# Currently used for "vendored" (part of our repository) source code we know about
|
||||
# such as zlib, as well ExternalProject_Add() projects
|
||||
@@ -303,7 +322,8 @@ FUNCTION(GENERATE_SBOM)
|
||||
STRING(APPEND reflist ",\n {\"ref\": \"${bom_ref}\"}")
|
||||
ENDFOREACH()
|
||||
STRING(APPEND sbom_dependencies "\n ]\n }${reflist}\n")
|
||||
STRING(UUID UUID NAMESPACE ee390ca3-e70f-4b35-808e-a512489156f5 NAME SBOM TYPE SHA1)
|
||||
STRING(RANDOM LENGTH 20 rnd)
|
||||
STRING(UUID UUID NAMESPACE ee390ca3-e70f-4b35-808e-a512489156f5 NAME SBOM-${rnd} TYPE SHA1)
|
||||
STRING(TIMESTAMP TIMESTAMP "%Y-%m-%dT%H:%M:%SZ" UTC)
|
||||
EXTRACT_REPO_NAME_AND_USER("${GIT_REMOTE_ORIGIN_URL}" GITHUB_REPO_NAME GITHUB_REPO_USER)
|
||||
#github-purl needs lowercased user and project names
|
||||
@@ -313,5 +333,6 @@ FUNCTION(GENERATE_SBOM)
|
||||
SET(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
|
||||
ENDIF()
|
||||
STRING(TIMESTAMP CURRENT_YEAR "%Y")
|
||||
SBOM_GET_CONTACT_EMAIL(SBOM_AUTHOR_EMAIL)
|
||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/cmake/sbom.json.in ${CMAKE_BINARY_DIR}/sbom.json)
|
||||
ENDFUNCTION()
|
||||
|
||||
@@ -300,36 +300,3 @@ ENDFUNCTION()
|
||||
# For Makefile generators we default Debug build directory to ${buildroot}/../debug.
|
||||
GET_FILENAME_COMPONENT(BINARY_PARENTDIR ${CMAKE_BINARY_DIR} PATH)
|
||||
SET(DEBUGBUILDDIR "${BINARY_PARENTDIR}/debug" CACHE INTERNAL "Directory of debug build")
|
||||
|
||||
FUNCTION(INSTALL_MYSQL_TEST from to)
|
||||
IF(INSTALL_MYSQLTESTDIR)
|
||||
IF(NOT WITH_WSREP)
|
||||
SET(EXCL_GALERA "(suite/(galera|wsrep|sys_vars/[rt]/(sysvars_)?wsrep).*|std_data/(galera|wsrep).*)")
|
||||
ELSE()
|
||||
SET(EXCL_GALERA "^DOES_NOT_EXIST$")
|
||||
ENDIF()
|
||||
INSTALL(
|
||||
DIRECTORY ${from}
|
||||
DESTINATION "${INSTALL_MYSQLTESTDIR}/${to}"
|
||||
USE_SOURCE_PERMISSIONS
|
||||
COMPONENT Test
|
||||
PATTERN "var" EXCLUDE
|
||||
PATTERN "lib/My/SafeProcess" EXCLUDE
|
||||
PATTERN "lib/t*" EXCLUDE
|
||||
PATTERN "CPack" EXCLUDE
|
||||
PATTERN "CMake*" EXCLUDE
|
||||
PATTERN "cmake_install.cmake" EXCLUDE
|
||||
PATTERN "mtr.out*" EXCLUDE
|
||||
PATTERN ".cvsignore" EXCLUDE
|
||||
PATTERN "*.am" EXCLUDE
|
||||
PATTERN "*.in" EXCLUDE
|
||||
PATTERN "Makefile" EXCLUDE
|
||||
PATTERN "*.vcxproj" EXCLUDE
|
||||
PATTERN "*.vcxproj.filters" EXCLUDE
|
||||
PATTERN "*.vcxproj.user" EXCLUDE
|
||||
PATTERN "CTest*" EXCLUDE
|
||||
PATTERN "*~" EXCLUDE
|
||||
REGEX "${EXCL_GALERA}" EXCLUDE
|
||||
)
|
||||
ENDIF()
|
||||
ENDFUNCTION()
|
||||
|
||||
@@ -107,6 +107,13 @@ IF(NOT GIT_EXECUTABLE)
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
# DuckDB uses these symbolic links only to test globbing behavior. They cause
|
||||
# source package extraction failures with tar on Windows.
|
||||
FILE(REMOVE
|
||||
"${PACKAGE_DIR}/storage/duckdb/third_parties/duckdb/data/csv/glob/crawl/.symbolic_link/link_to_file"
|
||||
"${PACKAGE_DIR}/storage/duckdb/third_parties/duckdb/data/csv/glob/crawl/.symbolic_link/mydir/link_to_upper_dir"
|
||||
)
|
||||
|
||||
# Copy bison output
|
||||
CONFIGURE_FILE(${CMAKE_BINARY_DIR}/sql/yy_mariadb.hh
|
||||
${PACKAGE_DIR}/sql/yy_mariadb.hh COPYONLY)
|
||||
|
||||
@@ -98,14 +98,11 @@ FUNCTION (MYSQL_ADD_EXECUTABLE)
|
||||
IF(link)
|
||||
IF(UNIX)
|
||||
ADD_CUSTOM_COMMAND(TARGET ${target} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E create_symlink
|
||||
${target} ${link}
|
||||
COMMAND ${CMAKE_COMMAND} -E create_symlink ${target} ${link}
|
||||
COMMENT "Creating ${link} link"
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
|
||||
INSTALL(PROGRAMS
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${link}
|
||||
DESTINATION
|
||||
${ARG_DESTINATION}
|
||||
WORKING_DIRECTORY $<TARGET_FILE_DIR:${target}>/)
|
||||
INSTALL(PROGRAMS $<TARGET_FILE_DIR:${target}>/${link}
|
||||
DESTINATION ${ARG_DESTINATION}
|
||||
COMPONENT ${COMP}Symlinks)
|
||||
ELSE()
|
||||
# Windows note:
|
||||
|
||||
@@ -14,10 +14,46 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
|
||||
|
||||
IF(NOT EXTERNAL_PLUGIN)
|
||||
STRING(CONCAT PARENT_SCOPE PARENT_SCOPE) # cannot use SET here
|
||||
ENDIF()
|
||||
|
||||
FUNCTION(INSTALL_MYSQL_TEST from to)
|
||||
IF(INSTALL_MYSQLTESTDIR)
|
||||
IF(NOT WITH_WSREP)
|
||||
SET(EXCL_GALERA "(suite/(galera|wsrep|sys_vars/[rt]/(sysvars_)?wsrep).*|std_data/(galera|wsrep).*)")
|
||||
ELSE()
|
||||
SET(EXCL_GALERA "^DOES_NOT_EXIST$")
|
||||
ENDIF()
|
||||
INSTALL(
|
||||
DIRECTORY ${from}
|
||||
DESTINATION "${INSTALL_MYSQLTESTDIR}/${to}"
|
||||
USE_SOURCE_PERMISSIONS
|
||||
COMPONENT Test
|
||||
PATTERN "var" EXCLUDE
|
||||
PATTERN "lib/My/SafeProcess" EXCLUDE
|
||||
PATTERN "lib/t*" EXCLUDE
|
||||
PATTERN "CPack" EXCLUDE
|
||||
PATTERN "CMake*" EXCLUDE
|
||||
PATTERN "cmake_install.cmake" EXCLUDE
|
||||
PATTERN "mtr.out*" EXCLUDE
|
||||
PATTERN ".cvsignore" EXCLUDE
|
||||
PATTERN "*.am" EXCLUDE
|
||||
PATTERN "*.in" EXCLUDE
|
||||
PATTERN "Makefile" EXCLUDE
|
||||
PATTERN "*.vcxproj" EXCLUDE
|
||||
PATTERN "*.vcxproj.filters" EXCLUDE
|
||||
PATTERN "*.vcxproj.user" EXCLUDE
|
||||
PATTERN "CTest*" EXCLUDE
|
||||
PATTERN "*~" EXCLUDE
|
||||
REGEX "${EXCL_GALERA}" EXCLUDE
|
||||
)
|
||||
ENDIF()
|
||||
ENDFUNCTION()
|
||||
|
||||
INCLUDE(CMakeParseArguments)
|
||||
|
||||
# MYSQL_ADD_PLUGIN(plugin_name source1...sourceN
|
||||
# MARIADB_ADD_PLUGIN(plugin_name source1...sourceN
|
||||
# [STORAGE_ENGINE]
|
||||
# [STATIC_ONLY|MODULE_ONLY]
|
||||
# [MANDATORY|DEFAULT]
|
||||
@@ -32,10 +68,10 @@ INCLUDE(CMakeParseArguments)
|
||||
# [LINK_LIBRARIES lib1...libN]
|
||||
# [DEPENDS target1...targetN]
|
||||
|
||||
MACRO(MYSQL_ADD_PLUGIN)
|
||||
MACRO(MARIADB_ADD_PLUGIN)
|
||||
CMAKE_PARSE_ARGUMENTS(ARG
|
||||
"STORAGE_ENGINE;STATIC_ONLY;MODULE_ONLY;MANDATORY;DEFAULT;DISABLED;NOT_EMBEDDED;RECOMPILE_FOR_EMBEDDED;CLIENT"
|
||||
"MODULE_OUTPUT_NAME;STATIC_OUTPUT_NAME;COMPONENT;CONFIG;VERSION"
|
||||
"MODULE_OUTPUT_NAME;STATIC_OUTPUT_NAME;COMPONENT;CONFIG;VERSION;AUTHOR;DESCRIPTION"
|
||||
"LINK_LIBRARIES;DEPENDS"
|
||||
${ARGN}
|
||||
)
|
||||
@@ -108,6 +144,10 @@ MACRO(MYSQL_ADD_PLUGIN)
|
||||
MESSAGE(FATAL_ERROR "Invalid value for PLUGIN_${plugin}")
|
||||
ENDIF()
|
||||
|
||||
IF(EXTERNAL_PLUGIN)
|
||||
EXTERNAL_PLUGIN_PRE()
|
||||
ENDIF()
|
||||
|
||||
# Validate that the requested build mode is compatible with what the
|
||||
# plugin actually supports. STATIC_ONLY plugins cannot be built as
|
||||
# dynamic modules, and MODULE_ONLY plugins cannot be linked statically.
|
||||
@@ -129,11 +169,24 @@ MACRO(MYSQL_ADD_PLUGIN)
|
||||
IF(NOT ARG_DEPENDS)
|
||||
SET(ARG_DEPENDS)
|
||||
ENDIF()
|
||||
|
||||
IF(ARG_VERSION)
|
||||
SET(version_string ";PLUGIN_${plugin}_VERSION=\"${ARG_VERSION}\"")
|
||||
IF(NOT EXTERNAL_PLUGIN)
|
||||
SET(ARG_DEPENDS GenError ${ARG_DEPENDS})
|
||||
ENDIF()
|
||||
|
||||
|
||||
SET(definitions ";PLUGIN_NAME=\"${target}\";PLUGIN_LICENSE=PLUGIN_LICENSE_GPL")
|
||||
IF(ARG_VERSION)
|
||||
IF(NOT ARG_VERSION MATCHES "^([0-9]+)\\.([0-9]+)" OR CMAKE_MATCH_2 GREATER 255)
|
||||
MESSAGE(FATAL_ERROR "Plugin ${plugin} has invalid VERSION")
|
||||
ENDIF()
|
||||
SET(definitions "${definitions};PLUGIN_VERSION=\"${ARG_VERSION}\";PLUGIN_HEX_VERSION=${CMAKE_MATCH_1}*256+${CMAKE_MATCH_2}")
|
||||
ENDIF()
|
||||
IF(ARG_AUTHOR)
|
||||
SET(definitions "${definitions};PLUGIN_AUTHOR=\"${ARG_AUTHOR}\"")
|
||||
ENDIF()
|
||||
IF(ARG_DESCRIPTION)
|
||||
SET(definitions "${definitions};PLUGIN_DESCRIPTION=\"${ARG_DESCRIPTION}\"")
|
||||
ENDIF()
|
||||
|
||||
IF(NOT ARG_MODULE_OUTPUT_NAME)
|
||||
IF(ARG_STORAGE_ENGINE)
|
||||
SET(ARG_MODULE_OUTPUT_NAME "ha_${target}")
|
||||
@@ -157,7 +210,7 @@ MACRO(MYSQL_ADD_PLUGIN)
|
||||
|
||||
ADD_LIBRARY(${target} STATIC ${SOURCES})
|
||||
DTRACE_INSTRUMENT(${target})
|
||||
ADD_DEPENDENCIES(${target} GenError ${ARG_DEPENDS})
|
||||
ADD_DEPENDENCIES(${target} ${ARG_DEPENDS})
|
||||
RESTRICT_SYMBOL_EXPORTS(${target})
|
||||
IF(WITH_EMBEDDED_SERVER AND (NOT ARG_NOT_EMBEDDED))
|
||||
# Embedded library should contain PIC code and be linkable
|
||||
@@ -169,9 +222,9 @@ MACRO(MYSQL_ADD_PLUGIN)
|
||||
DTRACE_INSTRUMENT(${target}_embedded)
|
||||
IF(ARG_RECOMPILE_FOR_EMBEDDED)
|
||||
SET_TARGET_PROPERTIES(${target}_embedded
|
||||
PROPERTIES COMPILE_DEFINITIONS "EMBEDDED_LIBRARY${version_string}")
|
||||
PROPERTIES COMPILE_DEFINITIONS "EMBEDDED_LIBRARY${definitions}")
|
||||
ENDIF()
|
||||
ADD_DEPENDENCIES(${target}_embedded GenError ${ARG_DEPENDS})
|
||||
ADD_DEPENDENCIES(${target}_embedded ${ARG_DEPENDS})
|
||||
IF(ARG_LINK_LIBRARIES)
|
||||
TARGET_LINK_LIBRARIES (${target}_embedded ${ARG_LINK_LIBRARIES})
|
||||
ENDIF()
|
||||
@@ -207,11 +260,11 @@ MACRO(MYSQL_ADD_PLUGIN)
|
||||
IF(ARG_MANDATORY)
|
||||
SET (mysql_mandatory_plugins
|
||||
"${mysql_mandatory_plugins}${builtin_entry}\n")
|
||||
SET (mysql_mandatory_plugins ${mysql_mandatory_plugins} PARENT_SCOPE)
|
||||
SET (mysql_mandatory_plugins ${mysql_mandatory_plugins} ${PARENT_SCOPE})
|
||||
ELSE()
|
||||
SET (mysql_optional_plugins
|
||||
"${mysql_optional_plugins}${builtin_entry}\n")
|
||||
SET (mysql_optional_plugins ${mysql_optional_plugins} PARENT_SCOPE)
|
||||
SET (mysql_optional_plugins ${mysql_optional_plugins} ${PARENT_SCOPE})
|
||||
ENDIF()
|
||||
ELSEIF(PLUGIN_${plugin} MATCHES "(DYNAMIC|AUTO|YES)"
|
||||
AND NOT ARG_STATIC_ONLY AND NOT WITHOUT_DYNAMIC_PLUGINS)
|
||||
@@ -223,7 +276,7 @@ MACRO(MYSQL_ADD_PLUGIN)
|
||||
SET_TARGET_PROPERTIES (${target} PROPERTIES PREFIX "")
|
||||
IF (NOT ARG_CLIENT)
|
||||
SET_TARGET_PROPERTIES (${target} PROPERTIES
|
||||
COMPILE_DEFINITIONS "MYSQL_DYNAMIC_PLUGIN${version_string}")
|
||||
COMPILE_DEFINITIONS "MYSQL_DYNAMIC_PLUGIN${definitions}")
|
||||
ENDIF()
|
||||
|
||||
TARGET_LINK_LIBRARIES (${target} mysqlservices ${ARG_LINK_LIBRARIES})
|
||||
@@ -254,7 +307,9 @@ MACRO(MYSQL_ADD_PLUGIN)
|
||||
TARGET_LINK_LIBRARIES (${target} "-Wl,--no-undefined")
|
||||
ENDIF()
|
||||
|
||||
ADD_DEPENDENCIES(${target} GenError ${ARG_DEPENDS})
|
||||
IF (ARG_DEPENDS)
|
||||
ADD_DEPENDENCIES(${target} ${ARG_DEPENDS})
|
||||
ENDIF()
|
||||
|
||||
SET_TARGET_PROPERTIES(${target} PROPERTIES
|
||||
OUTPUT_NAME "${ARG_MODULE_OUTPUT_NAME}")
|
||||
@@ -263,24 +318,29 @@ MACRO(MYSQL_ADD_PLUGIN)
|
||||
IF(CPACK_COMPONENTS_ALL AND
|
||||
NOT CPACK_COMPONENTS_ALL MATCHES ${ARG_COMPONENT}
|
||||
AND INSTALL_SYSCONF2DIR)
|
||||
IF (ARG_STORAGE_ENGINE)
|
||||
STRING(REPLACE "-" "_" ver ${SERVER_VERSION})
|
||||
SET(ver " = ${ver}-%{release}")
|
||||
IF (ARG_STORAGE_ENGINE OR ARG_RECOMPILE_FOR_EMBEDDED)
|
||||
IF(RPM)
|
||||
STRING(REPLACE "-" "_" ver ${SERVER_VERSION})
|
||||
SET(ver " = ${ver}-%{release}")
|
||||
ELSE() # DEB
|
||||
SET(ver " (= 1:${SERVER_VERSION}+maria~${DEBIAN_ABBR})")
|
||||
ENDIF()
|
||||
ELSE()
|
||||
SET(ver "")
|
||||
ENDIF()
|
||||
STRING(TOUPPER ${ARG_COMPONENT} ARG_COMPONENT_UPPER)
|
||||
SET(CPACK_COMPONENT_${ARG_COMPONENT_UPPER}SYMLINKS_GROUP ${ARG_COMPONENT} PARENT_SCOPE)
|
||||
SET(CPACK_COMPONENT_${ARG_COMPONENT_UPPER}_GROUP ${ARG_COMPONENT} PARENT_SCOPE)
|
||||
SET(CPACK_COMPONENT_${ARG_COMPONENT_UPPER}SYMLINKS_GROUP ${ARG_COMPONENT} ${PARENT_SCOPE})
|
||||
SET(CPACK_COMPONENT_${ARG_COMPONENT_UPPER}_GROUP ${ARG_COMPONENT} ${PARENT_SCOPE})
|
||||
SET(CPACK_COMPONENTS_ALL ${CPACK_COMPONENTS_ALL} ${ARG_COMPONENT} ${ARG_COMPONENT}Symlinks)
|
||||
SET(CPACK_COMPONENTS_ALL ${CPACK_COMPONENTS_ALL} PARENT_SCOPE)
|
||||
SET(CPACK_COMPONENTS_ALL ${CPACK_COMPONENTS_ALL} ${PARENT_SCOPE})
|
||||
|
||||
IF (NOT ARG_CLIENT AND NOT CPACK_RPM_${ARG_COMPONENT}_PACKAGE_REQUIRES)
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_PACKAGE_REQUIRES "MariaDB-server${ver}" PARENT_SCOPE)
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_PACKAGE_REQUIRES "MariaDB-server${ver}" ${PARENT_SCOPE})
|
||||
SET(CPACK_DEBIAN_PACKAGE_DEPENDS "mariadb-server${ver}")
|
||||
ENDIF()
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_USER_FILELIST ${ignored} PARENT_SCOPE)
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_USER_FILELIST ${ignored} ${PARENT_SCOPE})
|
||||
IF (ARG_VERSION)
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_PACKAGE_VERSION ${SERVER_VERSION}_${ARG_VERSION} PARENT_SCOPE)
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_PACKAGE_VERSION ${SERVER_VERSION}_${ARG_VERSION} ${PARENT_SCOPE})
|
||||
SET_PLUGIN_DEB_VERSION(${target} ${SERVER_VERSION}-${ARG_VERSION})
|
||||
ENDIF()
|
||||
IF(NOT ARG_CLIENT AND UNIX)
|
||||
@@ -288,9 +348,9 @@ MACRO(MYSQL_ADD_PLUGIN)
|
||||
SET(ARG_CONFIG "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target}.cnf")
|
||||
FILE(WRITE ${ARG_CONFIG} "[mariadb]\nplugin-load-add=${ARG_MODULE_OUTPUT_NAME}.so\n")
|
||||
ENDIF()
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_USER_FILELIST ${ignored} "%config(noreplace) ${INSTALL_SYSCONF2DIR}/*" PARENT_SCOPE)
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_POST_INSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/rpm/plugin-postin.sh PARENT_SCOPE)
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_POST_TRANS_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/rpm/server-posttrans.sh PARENT_SCOPE)
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_USER_FILELIST ${ignored} "%config(noreplace) ${INSTALL_SYSCONF2DIR}/*" ${PARENT_SCOPE})
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_POST_INSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/rpm/plugin-postin.sh ${PARENT_SCOPE})
|
||||
SET(CPACK_RPM_${ARG_COMPONENT}_POST_TRANS_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/rpm/server-posttrans.sh ${PARENT_SCOPE})
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
ELSE()
|
||||
@@ -307,9 +367,8 @@ MACRO(MYSQL_ADD_PLUGIN)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
GET_FILENAME_COMPONENT(subpath ${CMAKE_CURRENT_SOURCE_DIR} NAME)
|
||||
IF(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/mysql-test")
|
||||
INSTALL_MYSQL_TEST("${CMAKE_CURRENT_SOURCE_DIR}/mysql-test/" "plugin/${subpath}")
|
||||
INSTALL_MYSQL_TEST("${CMAKE_CURRENT_SOURCE_DIR}/mysql-test/" "plugin/${target}")
|
||||
ENDIF()
|
||||
|
||||
IF(TARGET ${target})
|
||||
@@ -327,24 +386,18 @@ MACRO(MYSQL_ADD_PLUGIN)
|
||||
ELSE()
|
||||
ADD_FEATURE_INFO(${plugin} ${have_target} "Server plugin ${plugin_type}")
|
||||
ENDIF()
|
||||
IF (EXTERNAL_PLUGIN)
|
||||
EXTERNAL_PLUGIN_POST()
|
||||
ENDIF()
|
||||
ENDIF(NOT WITHOUT_SERVER OR ARG_CLIENT)
|
||||
ENDMACRO()
|
||||
|
||||
MACRO(MYSQL_ADD_PLUGIN)
|
||||
MARIADB_ADD_PLUGIN(${ARGV})
|
||||
ENDMACRO()
|
||||
|
||||
# Add all CMake projects under storage and plugin
|
||||
# subdirectories, configure sql_builtins.cc
|
||||
MACRO(CONFIGURE_PLUGINS)
|
||||
IF(NOT WITHOUT_SERVER)
|
||||
FILE(GLOB dirs_storage ${CMAKE_SOURCE_DIR}/storage/*)
|
||||
ENDIF()
|
||||
|
||||
FILE(GLOB dirs_plugin ${CMAKE_SOURCE_DIR}/plugin/*)
|
||||
FOREACH(dir ${dirs_storage} ${dirs_plugin})
|
||||
IF (EXISTS ${dir}/CMakeLists.txt)
|
||||
ADD_SUBDIRECTORY(${dir})
|
||||
ENDIF()
|
||||
ENDFOREACH()
|
||||
|
||||
# verify that all -DPLUGIN_xxx=YES plugins are being built
|
||||
MACRO(VERIFY_PLUGINS)
|
||||
GET_CMAKE_PROPERTY(ALL_VARS VARIABLES)
|
||||
FOREACH (V ${ALL_VARS})
|
||||
IF (V MATCHES "^PLUGIN_")
|
||||
|
||||
@@ -32,10 +32,19 @@
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"email": "info@mariadb.com",
|
||||
"name": "MariaDB"
|
||||
"email": "@SBOM_AUTHOR_EMAIL@",
|
||||
"name": "@CPACK_PACKAGE_VENDOR@"
|
||||
}
|
||||
],
|
||||
"tools": {
|
||||
"components": [
|
||||
{
|
||||
"type": "application",
|
||||
"name": "generate_sbom.cmake",
|
||||
"version": "@CPACK_PACKAGE_VERSION@"
|
||||
}
|
||||
]
|
||||
},
|
||||
"properties": [
|
||||
{
|
||||
"name": "package_name",
|
||||
|
||||
@@ -577,6 +577,8 @@ CHECK_C_SOURCE_COMPILES("
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
/* macOS declares select() here and nowhere else that this test includes */
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
int main()
|
||||
{
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
# * Galera-related settings
|
||||
#
|
||||
# See the examples of server wsrep.cnf files in /usr/share/mariadb and read
|
||||
# more at https://mariadb.com/kb/en/galera-cluster/ and
|
||||
# https://mariadb.com/kb/en/configuring-mariadb-galera-cluster/
|
||||
# more at https://mariadb.com/docs/galera-cluster and
|
||||
# https://mariadb.com/docs/galera-cluster/galera-management/configuration/configuring-mariadb-galera-cluster
|
||||
|
||||
[galera]
|
||||
#wsrep_cluster_name = "MariaDB Galera Cluster"
|
||||
|
||||
2
debian/autobake-deb.sh
vendored
2
debian/autobake-deb.sh
vendored
@@ -142,7 +142,7 @@ in
|
||||
"noble"|"oracular"|"plucky")
|
||||
remove_columnstore_boost_deps
|
||||
;&
|
||||
"questing"|"resolute")
|
||||
"questing"|"resolute"|"stonking")
|
||||
# mariadb-plugin-rocksdb s390x not supported by us (yet)
|
||||
# ubuntu doesn't support mips64el yet, so keep this just
|
||||
# in case something changes.
|
||||
|
||||
9
debian/libmariadb-dev.install
vendored
9
debian/libmariadb-dev.install
vendored
@@ -4,8 +4,7 @@ usr/include/mariadb/errmsg.h
|
||||
usr/include/mariadb/ma_list.h
|
||||
usr/include/mariadb/ma_pvio.h
|
||||
usr/include/mariadb/ma_tls.h
|
||||
usr/include/mariadb/mariadb/
|
||||
usr/include/mariadb/mariadb/ma_io.h
|
||||
usr/include/mariadb/mariadb
|
||||
usr/include/mariadb/mariadb_com.h
|
||||
usr/include/mariadb/mariadb_ctype.h
|
||||
usr/include/mariadb/mariadb_dyncol.h
|
||||
@@ -16,13 +15,12 @@ usr/include/mariadb/my_alloca.h
|
||||
usr/include/mariadb/my_config.h
|
||||
usr/include/mariadb/my_global.h
|
||||
usr/include/mariadb/my_sys.h
|
||||
usr/include/mariadb/mysql
|
||||
usr/include/mariadb/mysql.h
|
||||
usr/include/mariadb/mysql/
|
||||
usr/include/mariadb/mysql/client_plugin.h
|
||||
usr/include/mariadb/mysql/plugin_auth.h
|
||||
usr/include/mariadb/mysql_com.h
|
||||
usr/include/mariadb/mysql_version.h
|
||||
usr/include/mariadb/mysqld_error.h
|
||||
usr/include/mariadb/server
|
||||
usr/lib/*/libmariadb.a
|
||||
usr/lib/*/libmariadb.so
|
||||
usr/lib/*/libmariadbclient.a
|
||||
@@ -31,6 +29,7 @@ usr/lib/*/libmysqlservices.a
|
||||
usr/lib/*/pkgconfig/libmariadb.pc
|
||||
usr/lib/*/pkgconfig/mariadb.pc
|
||||
usr/share/aclocal/mysql.m4
|
||||
usr/share/cmake/mariadb-plugin
|
||||
usr/share/man/man1/mariadb_config.1
|
||||
usr/share/man/man1/mysql_config.1
|
||||
usr/share/man/man3/*.3
|
||||
|
||||
1
debian/libmariadbd-dev.install
vendored
1
debian/libmariadbd-dev.install
vendored
@@ -1,4 +1,3 @@
|
||||
usr/include/mariadb/server
|
||||
usr/lib/*/libmariadbd.a
|
||||
usr/lib/*/libmariadbd.so
|
||||
usr/lib/*/libmysqld.a
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2026, MariaDB plc
|
||||
#
|
||||
# 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
|
||||
@@ -28,7 +29,16 @@ ENDIF()
|
||||
# mysqld_error.h results in rebuild of the almost whole server)
|
||||
# To preserve timestamp, first generate a temp header file, then copy it
|
||||
# to mysqld_error.h using cmake -E copy_if_different
|
||||
ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/include/mysqld_error.h.tmp
|
||||
SET(GENERATED_ERROR_HEADERS
|
||||
${CMAKE_BINARY_DIR}/include/mysqld_error.h
|
||||
${CMAKE_BINARY_DIR}/include/mysqld_ername.h
|
||||
${CMAKE_BINARY_DIR}/include/sql_state.h)
|
||||
|
||||
ADD_CUSTOM_COMMAND(OUTPUT ${GENERATED_ERROR_HEADERS}
|
||||
BYPRODUCTS
|
||||
${CMAKE_BINARY_DIR}/include/mysqld_error.h.tmp
|
||||
${CMAKE_BINARY_DIR}/include/mysqld_ername.h.tmp
|
||||
${CMAKE_BINARY_DIR}/include/sql_state.h.tmp
|
||||
COMMAND comp_err
|
||||
--charset=${PROJECT_SOURCE_DIR}/sql/share/charsets
|
||||
--out-dir=${CMAKE_BINARY_DIR}/sql/share/
|
||||
@@ -44,7 +54,7 @@ ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/include/mysqld_error.h.tmp
|
||||
ADD_CUSTOM_TARGET(GenError
|
||||
ALL
|
||||
DEPENDS
|
||||
${CMAKE_BINARY_DIR}/include/mysqld_error.h.tmp)
|
||||
${GENERATED_ERROR_HEADERS})
|
||||
|
||||
# this approach doesn't work with cross-compiing (runs mariadbd)
|
||||
# and doesn't work with ASAN, because LSAN complains about RocksDB (MDEV-36345).
|
||||
@@ -66,18 +76,19 @@ IF(NOT CMAKE_CROSSCOMPILING AND NOT WITH_ASAN AND TARGET mariadbd)
|
||||
COMMAND ${CMAKE_COMMAND} -E rm -rf "${my_plugin_dir}"
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${my_plugin_dir}"
|
||||
)
|
||||
|
||||
# Symlinks need a privilege not granted by default on Windows; use hardlinks there.
|
||||
IF(WIN32)
|
||||
SET(linktype hard)
|
||||
ELSE()
|
||||
SET(linktype sym)
|
||||
ENDIF()
|
||||
FOREACH(target ${dynamic_plugins})
|
||||
LIST(APPEND plugin_load "$<TARGET_FILE_NAME:${target}>")
|
||||
IF(WIN32)
|
||||
SET(maybe_create_hardlink || ${CMAKE_COMMAND} -E create_hardlink
|
||||
$<TARGET_FILE:${target}>
|
||||
"${my_plugin_dir}/$<TARGET_FILE_NAME:${target}>")
|
||||
ENDIF()
|
||||
LIST(APPEND populate_plugin_dir
|
||||
COMMAND ${CMAKE_COMMAND} -E create_symlink
|
||||
$<TARGET_FILE:${target}>
|
||||
"${my_plugin_dir}/$<TARGET_FILE_NAME:${target}>"
|
||||
${maybe_create_hardlink})
|
||||
LIST(APPEND populate_plugin_dir
|
||||
COMMAND ${CMAKE_COMMAND} -E create_${linktype}link
|
||||
$<TARGET_FILE:${target}>
|
||||
"${my_plugin_dir}/$<TARGET_FILE_NAME:${target}>")
|
||||
ENDFOREACH()
|
||||
|
||||
IF(NOT plugin_load)
|
||||
|
||||
@@ -242,6 +242,10 @@ datadir_iter_new(const char *path, bool skip_first_level = true)
|
||||
return(it);
|
||||
|
||||
error:
|
||||
if (it) {
|
||||
pthread_mutex_destroy(&it->mutex);
|
||||
free(it->datadir_path);
|
||||
}
|
||||
free(it);
|
||||
|
||||
return(NULL);
|
||||
|
||||
@@ -89,12 +89,23 @@ xb_write_galera_info(bool incremental_prepare)
|
||||
*/
|
||||
if (my_stat(MB_GALERA_INFO_FILENAME, &statinfo, MYF(0))) {
|
||||
FILE* fp_in = fopen(MB_GALERA_INFO_FILENAME, "r");
|
||||
if (!fp_in) {
|
||||
die("could not open " MB_GALERA_INFO_FILENAME
|
||||
", errno = %d\n", errno);
|
||||
}
|
||||
FILE* fp_out = fopen(MB_GALERA_INFO_FILENAME_SST, "w");
|
||||
if (!fp_out) {
|
||||
fclose(fp_in);
|
||||
die("could not open " MB_GALERA_INFO_FILENAME_SST
|
||||
", errno = %d\n", errno);
|
||||
}
|
||||
|
||||
char buf[BUFSIZ] = {'\0'};
|
||||
size_t size;
|
||||
while ((size = fread(buf, 1, BUFSIZ, fp_in))) {
|
||||
if (fwrite(buf, 1, size, fp_out) != strlen(buf)) {
|
||||
fclose(fp_out);
|
||||
fclose(fp_in);
|
||||
die(
|
||||
"could not write to "
|
||||
MB_GALERA_INFO_FILENAME_SST
|
||||
@@ -103,6 +114,8 @@ xb_write_galera_info(bool incremental_prepare)
|
||||
}
|
||||
}
|
||||
if (!feof(fp_in)) {
|
||||
fclose(fp_out);
|
||||
fclose(fp_in);
|
||||
die(
|
||||
MB_GALERA_INFO_FILENAME_SST
|
||||
" not fully copied\n"
|
||||
|
||||
@@ -4877,6 +4877,7 @@ xb_load_list_file(
|
||||
if (p) {
|
||||
*p = '\0';
|
||||
} else {
|
||||
fclose(fp);
|
||||
die("`%s...` name is too long", name_buf);
|
||||
}
|
||||
|
||||
@@ -6804,7 +6805,7 @@ next_file_item_1:
|
||||
/* single table tablespaces */
|
||||
dir = os_file_opendir(path);
|
||||
|
||||
if (UNIV_UNLIKELY(dbdir == IF_WIN(INVALID_HANDLE_VALUE, nullptr))) {
|
||||
if (UNIV_UNLIKELY(dir == IF_WIN(INVALID_HANDLE_VALUE, nullptr))) {
|
||||
msg("Can't open dir %s", path);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ INSTALL(DIRECTORY mysql/
|
||||
PATTERN "${EXCL_SERVICE_WSREP}" EXCLUDE
|
||||
)
|
||||
|
||||
STRING(REPLACE "." "\\." EXCL_RE "${HEADERS};${HEADERS_GEN_CONFIGURE}")
|
||||
STRING(REPLACE "." "\\." EXCL_RE "${HEADERS};${HEADERS_GEN_CONFIGURE};config.h")
|
||||
STRING(REPLACE ";" "|" EXCL_RE "${EXCL_RE}")
|
||||
|
||||
MACRO(INSTALL_PRIVATE DIR)
|
||||
|
||||
@@ -49,4 +49,10 @@ SET(MYSQLSERVICES_SOURCES
|
||||
)
|
||||
|
||||
ADD_CONVENIENCE_LIBRARY(mysqlservices ${MYSQLSERVICES_SOURCES})
|
||||
INSTALL(TARGETS mysqlservices DESTINATION ${INSTALL_LIBDIR} COMPONENT Development)
|
||||
IF(MSVC)
|
||||
# thin C API, no CRT state crosses it - don't force a CRT match on plugins
|
||||
TARGET_COMPILE_OPTIONS(mysqlservices PRIVATE /Zl)
|
||||
ENDIF()
|
||||
|
||||
INSTALL(TARGETS mysqlservices EXPORT mariadb-plugin-targets
|
||||
DESTINATION ${INSTALL_LIBDIR} COMPONENT Development)
|
||||
|
||||
@@ -3,6 +3,7 @@ perl mysql-test-run.pl --force --suite-timeout=120 --max-test-fail=10 --retry=3
|
||||
vcol,gcol,period,perfschema,parts,^
|
||||
main,^
|
||||
innodb,^
|
||||
binlog_in_engine,^
|
||||
versioning,^
|
||||
plugins,^
|
||||
mariabackup,^
|
||||
|
||||
55
mysql-test/include/have_sparse_files.inc
Normal file
55
mysql-test/include/have_sparse_files.inc
Normal file
@@ -0,0 +1,55 @@
|
||||
# Skip the test unless the filesystem holding $sparse_file_dir stores files
|
||||
# with holes. The caller sets $sparse_file_dir to a directory on the
|
||||
# filesystem where it builds its own sparse file, because vardir and datadir
|
||||
# can be on different filesystems.
|
||||
#
|
||||
# A test that builds a large file by seeking past its end and writing a
|
||||
# single byte relies on the skipped range staying unallocated. HFS on
|
||||
# macOS allocates every block of that range, so the file consumes its full
|
||||
# apparent size and the write fails with ENOSPC once the range exceeds the
|
||||
# free space on the volume.
|
||||
#
|
||||
# The probe writes one byte 64MB past the start of an empty file and compares
|
||||
# the allocated block count against that offset. A filesystem that leaves a
|
||||
# hole allocates only the block holding the byte. The offset has to stay well
|
||||
# above 16MB, since APFS fills the range of a file smaller than that rather
|
||||
# than recording a hole.
|
||||
|
||||
if (!$sparse_file_dir)
|
||||
{
|
||||
--die have_sparse_files.inc requires the caller to set sparse_file_dir
|
||||
}
|
||||
# The probe cannot tell a directory it may not write from a filesystem
|
||||
# without holes, thus a missing directory ends the test rather than skipping
|
||||
# it.
|
||||
--file_exists $sparse_file_dir
|
||||
# mysqltest keeps variables in a case insensitive hash and exports a value
|
||||
# under whichever spelling created the entry, so the exported name has to
|
||||
# differ from $sparse_file_dir by more than case.
|
||||
--let SPARSE_PROBE_DIR= $sparse_file_dir
|
||||
|
||||
--error 0,1
|
||||
perl;
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
my $probe= "$ENV{SPARSE_PROBE_DIR}/sparse_probe";
|
||||
my $offset= 64 * 1024 * 1024;
|
||||
my $sparse= 0;
|
||||
|
||||
if (open(my $fh, '>', $probe))
|
||||
{
|
||||
binmode $fh;
|
||||
if (seek($fh, $offset, 0) and print($fh chr(0)) and close($fh))
|
||||
{
|
||||
my $blocks= (stat $probe)[12];
|
||||
$sparse= 1 if defined($blocks) and $blocks * 512 < $offset;
|
||||
}
|
||||
}
|
||||
unlink $probe;
|
||||
exit($sparse ? 0 : 1);
|
||||
EOF
|
||||
if ($errno)
|
||||
{
|
||||
--skip Requires a filesystem that stores files with holes
|
||||
}
|
||||
@@ -148,6 +148,7 @@ INSERT INTO global_suppressions VALUES
|
||||
("Slave: .*Duplicate entry"),
|
||||
|
||||
("Statement may not be safe to log in statement format"),
|
||||
("slave_connections_needed_for_purge"),
|
||||
|
||||
/* innodb foreign key tests that fail in ALTER or RENAME produce this */
|
||||
("InnoDB: Error: in ALTER TABLE `test`.`t[123]`"),
|
||||
|
||||
4
mysql-test/include/not_mac.inc
Normal file
4
mysql-test/include/not_mac.inc
Normal file
@@ -0,0 +1,4 @@
|
||||
#
|
||||
# suite.pm will make sure that all tests including this file
|
||||
# will be skipped if run under macOS
|
||||
#
|
||||
@@ -1,8 +0,0 @@
|
||||
# This file should only be used with test that finds bugs in ASan that can not
|
||||
# be overcome. In normal cases one should fix the bug server/test case or in
|
||||
# the worst case add a (temporary?) suppression in asan.supp or lsan.supp
|
||||
|
||||
if (`select count(*) from information_schema.system_variables where variable_name='have_sanitizer' and global_value LIKE "%UBSAN"`)
|
||||
{
|
||||
--skip Can't be run with UBSAN
|
||||
}
|
||||
@@ -1277,6 +1277,8 @@ ALTER TABLE t1
|
||||
DROP i,
|
||||
ADD i INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
AUTO_INCREMENT = 1;
|
||||
Warnings:
|
||||
Note 4190 ALTER TABLE is implicitly changing the value of 'AUTO_INCREMENT' from '1' to '4'
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a CHAR(1), PRIMARY KEY (a(255)));
|
||||
ERROR HY000: Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys
|
||||
@@ -3214,6 +3216,29 @@ Tp4 CREATE TABLE `Tp4`-ok (
|
||||
drop table Another.Tp4;
|
||||
drop database Another;
|
||||
#
|
||||
# MDEV-35732: Failed ALTER TABLE causes inconsistency, changes behavior of the next statement
|
||||
#
|
||||
# It should be impossible for a failed rename index to affect
|
||||
# a subsequent duplicate name check for a foreign key.
|
||||
#
|
||||
create table t1 (f1 int, f2 int, key(f1), key(f2)) engine=innodb;
|
||||
create table t2 (pk int primary key, a int, b int, key ind1(a),
|
||||
foreign key fk1 (b) references t1 (f1)) engine=innodb;
|
||||
alter table t2 rename index fk1 to fk, algorithm=instant, order by a;
|
||||
ERROR 0A000: ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY
|
||||
alter table t2 add foreign key ind1 (b) references t1 (f2);
|
||||
ERROR 42000: Duplicate key name 'ind1'
|
||||
drop table t2, t1;
|
||||
#
|
||||
# It should be impossible to add a foreign key with a duplicate name.
|
||||
#
|
||||
create table t1 (f1 int, f2 int, key(f1), key(f2)) engine=innodb;
|
||||
create table t2 (pk int primary key, a int, b int, key ind1(a),
|
||||
foreign key fk1 (b) references t1 (f1)) engine=innodb;
|
||||
alter table t2 add foreign key ind1 (b) references t1 (f2);
|
||||
ERROR 42000: Duplicate key name 'ind1'
|
||||
drop table t2, t1;
|
||||
#
|
||||
# End of 11.4 tests
|
||||
#
|
||||
#
|
||||
@@ -3253,5 +3278,13 @@ ERROR HY000: Can't create table `test`.`cluster_t` (errno: 150 "Foreign key cons
|
||||
# Clean up
|
||||
DROP TABLE utilisateur;
|
||||
#
|
||||
# MDEV-41221 memcpy() source and target overlap in dict_table_rename_in_cache
|
||||
# (only fails without the fix on a libc that checks memcpy overlap, e.g. OpenBSD)
|
||||
#
|
||||
CREATE TABLE loader_test7(id INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
CREATE TABLE loader_test6(id INT PRIMARY KEY, loader_test7_id INT UNIQUE) ENGINE=InnoDB;
|
||||
ALTER TABLE loader_test6 ADD CONSTRAINT loader_test6_to_7_fk FOREIGN KEY(loader_test7_id) REFERENCES loader_test7(id);
|
||||
DROP TABLE loader_test6, loader_test7;
|
||||
#
|
||||
# End of 12.3 tests
|
||||
#
|
||||
|
||||
@@ -2504,6 +2504,36 @@ show create table Another.Tp4;
|
||||
drop table Another.Tp4;
|
||||
drop database Another;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-35732: Failed ALTER TABLE causes inconsistency, changes behavior of the next statement
|
||||
--echo #
|
||||
--echo # It should be impossible for a failed rename index to affect
|
||||
--echo # a subsequent duplicate name check for a foreign key.
|
||||
--echo #
|
||||
create table t1 (f1 int, f2 int, key(f1), key(f2)) engine=innodb;
|
||||
create table t2 (pk int primary key, a int, b int, key ind1(a),
|
||||
foreign key fk1 (b) references t1 (f1)) engine=innodb;
|
||||
|
||||
--error ER_ALTER_OPERATION_NOT_SUPPORTED
|
||||
alter table t2 rename index fk1 to fk, algorithm=instant, order by a;
|
||||
|
||||
--error ER_DUP_KEYNAME
|
||||
alter table t2 add foreign key ind1 (b) references t1 (f2);
|
||||
|
||||
drop table t2, t1;
|
||||
|
||||
--echo #
|
||||
--echo # It should be impossible to add a foreign key with a duplicate name.
|
||||
--echo #
|
||||
create table t1 (f1 int, f2 int, key(f1), key(f2)) engine=innodb;
|
||||
create table t2 (pk int primary key, a int, b int, key ind1(a),
|
||||
foreign key fk1 (b) references t1 (f1)) engine=innodb;
|
||||
|
||||
--error ER_DUP_KEYNAME
|
||||
alter table t2 add foreign key ind1 (b) references t1 (f2);
|
||||
|
||||
drop table t2, t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 11.4 tests
|
||||
--echo #
|
||||
@@ -2552,6 +2582,16 @@ CREATE TABLE cluster_t (
|
||||
--echo # Clean up
|
||||
DROP TABLE utilisateur;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-41221 memcpy() source and target overlap in dict_table_rename_in_cache
|
||||
--echo # (only fails without the fix on a libc that checks memcpy overlap, e.g. OpenBSD)
|
||||
--echo #
|
||||
|
||||
CREATE TABLE loader_test7(id INT PRIMARY KEY) ENGINE=InnoDB;
|
||||
CREATE TABLE loader_test6(id INT PRIMARY KEY, loader_test7_id INT UNIQUE) ENGINE=InnoDB;
|
||||
ALTER TABLE loader_test6 ADD CONSTRAINT loader_test6_to_7_fk FOREIGN KEY(loader_test7_id) REFERENCES loader_test7(id);
|
||||
DROP TABLE loader_test6, loader_test7;
|
||||
|
||||
--echo #
|
||||
--echo # End of 12.3 tests
|
||||
--echo #
|
||||
|
||||
@@ -2,6 +2,8 @@ create table t1(a int(10)unsigned not null auto_increment primary key,
|
||||
b varchar(255) not null) engine=innodb default charset=utf8;
|
||||
insert into t1 values(1,'aaa'),(2,'bbb');
|
||||
alter table t1 auto_increment=1;
|
||||
Warnings:
|
||||
Note 4190 ALTER TABLE is implicitly changing the value of 'AUTO_INCREMENT' from '1' to '3'
|
||||
insert into t1 values(NULL, 'ccc');
|
||||
select * from t1;
|
||||
a b
|
||||
|
||||
@@ -423,5 +423,34 @@ COUNT(*)
|
||||
0
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-40573 Assertion `del_table == table_being_deleted' failed in
|
||||
# multi_delete::send_data on DELETE w/ index hint + window function
|
||||
#
|
||||
CREATE TABLE t1 (c INT PRIMARY KEY);
|
||||
INSERT INTO t1 (c) VALUES (1),(2),(3),(4);
|
||||
DELETE FROM t1 USE KEY() WHERE 0
|
||||
ORDER BY PERCENTILE_CONT(COUNT(*)) WITHIN GROUP(ORDER BY c) OVER();
|
||||
SELECT * FROM t1;
|
||||
c
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
DELETE t1 FROM t1, t1 AS t2 WHERE 0
|
||||
ORDER BY PERCENTILE_CONT(COUNT(*)) WITHIN GROUP(ORDER BY t1.c) OVER();
|
||||
SELECT * FROM t1;
|
||||
c
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
4
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End 11.8 tests
|
||||
#
|
||||
|
||||
@@ -228,6 +228,22 @@ DELETE FROM a3,a1 USING t1 AS a1 JOIN t1 AS a2 JOIN t1 AS a3;
|
||||
SELECT COUNT(*) from t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-40573 Assertion `del_table == table_being_deleted' failed in
|
||||
--echo # multi_delete::send_data on DELETE w/ index hint + window function
|
||||
--echo #
|
||||
CREATE TABLE t1 (c INT PRIMARY KEY);
|
||||
INSERT INTO t1 (c) VALUES (1),(2),(3),(4);
|
||||
DELETE FROM t1 USE KEY() WHERE 0
|
||||
ORDER BY PERCENTILE_CONT(COUNT(*)) WITHIN GROUP(ORDER BY c) OVER();
|
||||
SELECT * FROM t1;
|
||||
SELECT COUNT(*) FROM t1;
|
||||
DELETE t1 FROM t1, t1 AS t2 WHERE 0
|
||||
ORDER BY PERCENTILE_CONT(COUNT(*)) WITHIN GROUP(ORDER BY t1.c) OVER();
|
||||
SELECT * FROM t1;
|
||||
SELECT COUNT(*) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # End 11.8 tests
|
||||
--echo #
|
||||
|
||||
@@ -5797,6 +5797,13 @@ SELECT JSON_SCHEMA_VALID(@schema, @value);
|
||||
JSON_SCHEMA_VALID(@schema, @value)
|
||||
1
|
||||
#
|
||||
# MDEV-41181: ASAN heap-buffer-overflow after SELECT JSON_SCHEMA_VALID
|
||||
#
|
||||
SELECT JSON_SCHEMA_VALID( '{"enum": ["x"]}', CONVERT(CONCAT('"', REPEAT('e', 100000), '"') USING ucs2)) AS r;
|
||||
r
|
||||
0
|
||||
# End of 11.4 tests
|
||||
#
|
||||
# MDEV-38702 Behaviour of IF() with boolean JSON_EXTRACT as expression is wrong
|
||||
#
|
||||
SELECT JSON_TYPE(JSON_EXTRACT(x.val, '$.booleanValue')) AS json_type,
|
||||
@@ -6217,4 +6224,10 @@ SET @value= '
|
||||
SELECT JSON_SCHEMA_VALID(@schema, @value);
|
||||
JSON_SCHEMA_VALID(@schema, @value)
|
||||
1
|
||||
#
|
||||
# MDEV-41156 ASAN use-after-poison in json_skip_array_and_count/Item_func_json_contains_path::val_bool
|
||||
#
|
||||
SELECT JSON_CONTAINS_PATH('[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,2,3]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]', 'one', '$[last]') AS r;
|
||||
r
|
||||
1
|
||||
# End of 12.3 tests
|
||||
|
||||
@@ -4453,6 +4453,14 @@ SET @value= '
|
||||
|
||||
SELECT JSON_SCHEMA_VALID(@schema, @value);
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-41181: ASAN heap-buffer-overflow after SELECT JSON_SCHEMA_VALID
|
||||
--echo #
|
||||
|
||||
SELECT JSON_SCHEMA_VALID( '{"enum": ["x"]}', CONVERT(CONCAT('"', REPEAT('e', 100000), '"') USING ucs2)) AS r;
|
||||
|
||||
--echo # End of 11.4 tests
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-38702 Behaviour of IF() with boolean JSON_EXTRACT as expression is wrong
|
||||
--echo #
|
||||
@@ -4766,4 +4774,10 @@ SET @value= '
|
||||
|
||||
SELECT JSON_SCHEMA_VALID(@schema, @value);
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-41156 ASAN use-after-poison in json_skip_array_and_count/Item_func_json_contains_path::val_bool
|
||||
--echo #
|
||||
|
||||
SELECT JSON_CONTAINS_PATH('[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,1,1,1,1,1,[1,2,3]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]', 'one', '$[last]') AS r;
|
||||
|
||||
--echo # End of 12.3 tests
|
||||
|
||||
@@ -23,8 +23,8 @@ SELECT JSON_EQUALS('"A"', '"\\u0041"');
|
||||
JSON_EQUALS('"A"', '"\\u0041"')
|
||||
1
|
||||
# JSON_UNQUOTE correctly resolves the escape (proving they are the same)
|
||||
SELECT JSON_UNQUOTE('"A"') = JSON_UNQUOTE('"\\u0041"');
|
||||
JSON_UNQUOTE('"A"') = JSON_UNQUOTE('"\\u0041"')
|
||||
SELECT JSON_UNQUOTE('"A"') = JSON_UNQUOTE('"\\u0041"') AS result;
|
||||
result
|
||||
1
|
||||
#
|
||||
# Additional test from MDEV-39995 comment:
|
||||
@@ -33,29 +33,28 @@ JSON_UNQUOTE('"A"') = JSON_UNQUOTE('"\\u0041"')
|
||||
SELECT JSON_UNQUOTE('"A"');
|
||||
JSON_UNQUOTE('"A"')
|
||||
A
|
||||
SELECT JSON_UNQUOTE(CAST(0x225C753030343122 AS CHAR));
|
||||
JSON_UNQUOTE(CAST(0x225C753030343122 AS CHAR))
|
||||
SELECT JSON_UNQUOTE(CAST(0x225C753030343122 AS CHAR)) AS result;
|
||||
result
|
||||
A
|
||||
SELECT JSON_CONTAINS('"A"', CAST(0x225C753030343122 AS CHAR));
|
||||
JSON_CONTAINS('"A"', CAST(0x225C753030343122 AS CHAR))
|
||||
SELECT JSON_CONTAINS('"A"', CAST(0x225C753030343122 AS CHAR)) AS result;
|
||||
result
|
||||
1
|
||||
SELECT JSON_CONTAINS(JSON_QUOTE(JSON_UNQUOTE('"A"')),
|
||||
JSON_QUOTE(JSON_UNQUOTE(CAST(0x225C753030343122 AS CHAR))));
|
||||
JSON_CONTAINS(JSON_QUOTE(JSON_UNQUOTE('"A"')),
|
||||
JSON_QUOTE(JSON_UNQUOTE(CAST(0x225C753030343122 AS CHAR))))
|
||||
JSON_QUOTE(JSON_UNQUOTE(CAST(0x225C753030343122 AS CHAR)))) AS result;
|
||||
result
|
||||
1
|
||||
#
|
||||
# More Unicode escape equivalences
|
||||
#
|
||||
# \u0048\u0065\u006C\u006C\u006F = "Hello"
|
||||
SELECT JSON_CONTAINS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"');
|
||||
JSON_CONTAINS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"')
|
||||
SELECT JSON_CONTAINS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"') AS result;
|
||||
result
|
||||
1
|
||||
SELECT JSON_EQUALS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"');
|
||||
JSON_EQUALS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"')
|
||||
SELECT JSON_EQUALS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"') AS result;
|
||||
result
|
||||
1
|
||||
SELECT JSON_OVERLAPS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"');
|
||||
JSON_OVERLAPS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"')
|
||||
SELECT JSON_OVERLAPS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"') AS result;
|
||||
result
|
||||
1
|
||||
# Mixed literal and escape in the same string: "H\u0065llo" = "Hello"
|
||||
SELECT JSON_EQUALS('"Hello"', '"H\\u0065llo"');
|
||||
@@ -94,20 +93,20 @@ JSON_OVERLAPS('"?"', '"\\uD83D\\uDE00"')
|
||||
SELECT JSON_EQUALS('"😊"', '"\\uD83D\\uDE0A"');
|
||||
JSON_EQUALS('"?"', '"\\uD83D\\uDE0A"')
|
||||
1
|
||||
SELECT JSON_CONTAINS('["😀", "hello"]', '["\\uD83D\\uDE00"]');
|
||||
JSON_CONTAINS('["?", "hello"]', '["\\uD83D\\uDE00"]')
|
||||
SELECT JSON_CONTAINS('["😀", "hello"]', '["\\uD83D\\uDE00"]') AS result;
|
||||
result
|
||||
1
|
||||
SELECT JSON_EQUALS('{"emoji": "😀"}', '{"emoji": "\\uD83D\\uDE00"}');
|
||||
JSON_EQUALS('{"emoji": "?"}', '{"emoji": "\\uD83D\\uDE00"}')
|
||||
SELECT JSON_EQUALS('{"emoji": "😀"}', '{"emoji": "\\uD83D\\uDE00"}') AS result;
|
||||
result
|
||||
1
|
||||
#
|
||||
# Escaped object keys: \u006B\u0065\u0079 = "key"
|
||||
#
|
||||
SELECT JSON_EQUALS('{"key":"A"}', '{"\\u006B\\u0065\\u0079":"A"}');
|
||||
JSON_EQUALS('{"key":"A"}', '{"\\u006B\\u0065\\u0079":"A"}')
|
||||
SELECT JSON_EQUALS('{"key":"A"}', '{"\\u006B\\u0065\\u0079":"A"}') AS result;
|
||||
result
|
||||
1
|
||||
SELECT JSON_CONTAINS('{"key":"A"}', '{"\\u006B\\u0065\\u0079":"A"}');
|
||||
JSON_CONTAINS('{"key":"A"}', '{"\\u006B\\u0065\\u0079":"A"}')
|
||||
SELECT JSON_CONTAINS('{"key":"A"}', '{"\\u006B\\u0065\\u0079":"A"}') AS result;
|
||||
result
|
||||
1
|
||||
#
|
||||
# BMP non-ASCII: é = U+00E9, literal UTF-8 vs escape
|
||||
|
||||
@@ -20,18 +20,18 @@ SELECT JSON_OVERLAPS('"A"', '"\\u0041"');
|
||||
SELECT JSON_EQUALS('"A"', '"\\u0041"');
|
||||
|
||||
--echo # JSON_UNQUOTE correctly resolves the escape (proving they are the same)
|
||||
SELECT JSON_UNQUOTE('"A"') = JSON_UNQUOTE('"\\u0041"');
|
||||
SELECT JSON_UNQUOTE('"A"') = JSON_UNQUOTE('"\\u0041"') AS result;
|
||||
|
||||
--echo #
|
||||
--echo # Additional test from MDEV-39995 comment:
|
||||
--echo # Using hex literal that represents the bytes of '"\u0041"'
|
||||
--echo #
|
||||
SELECT JSON_UNQUOTE('"A"');
|
||||
SELECT JSON_UNQUOTE(CAST(0x225C753030343122 AS CHAR));
|
||||
SELECT JSON_CONTAINS('"A"', CAST(0x225C753030343122 AS CHAR));
|
||||
SELECT JSON_UNQUOTE(CAST(0x225C753030343122 AS CHAR)) AS result;
|
||||
SELECT JSON_CONTAINS('"A"', CAST(0x225C753030343122 AS CHAR)) AS result;
|
||||
--disable_view_protocol
|
||||
SELECT JSON_CONTAINS(JSON_QUOTE(JSON_UNQUOTE('"A"')),
|
||||
JSON_QUOTE(JSON_UNQUOTE(CAST(0x225C753030343122 AS CHAR))));
|
||||
JSON_QUOTE(JSON_UNQUOTE(CAST(0x225C753030343122 AS CHAR)))) AS result;
|
||||
--enable_view_protocol
|
||||
|
||||
--echo #
|
||||
@@ -39,9 +39,9 @@ SELECT JSON_CONTAINS(JSON_QUOTE(JSON_UNQUOTE('"A"')),
|
||||
--echo #
|
||||
--echo # \u0048\u0065\u006C\u006C\u006F = "Hello"
|
||||
--disable_view_protocol
|
||||
SELECT JSON_CONTAINS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"');
|
||||
SELECT JSON_EQUALS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"');
|
||||
SELECT JSON_OVERLAPS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"');
|
||||
SELECT JSON_CONTAINS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"') AS result;
|
||||
SELECT JSON_EQUALS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"') AS result;
|
||||
SELECT JSON_OVERLAPS('"Hello"', '"\\u0048\\u0065\\u006C\\u006C\\u006F"') AS result;
|
||||
--enable_view_protocol
|
||||
|
||||
--echo # Mixed literal and escape in the same string: "H\u0065llo" = "Hello"
|
||||
@@ -66,14 +66,14 @@ SELECT JSON_EQUALS('"😀"', '"\\uD83D\\uDE00"');
|
||||
SELECT JSON_CONTAINS('"😀"', '"\\uD83D\\uDE00"');
|
||||
SELECT JSON_OVERLAPS('"😀"', '"\\uD83D\\uDE00"');
|
||||
SELECT JSON_EQUALS('"😊"', '"\\uD83D\\uDE0A"');
|
||||
SELECT JSON_CONTAINS('["😀", "hello"]', '["\\uD83D\\uDE00"]');
|
||||
SELECT JSON_EQUALS('{"emoji": "😀"}', '{"emoji": "\\uD83D\\uDE00"}');
|
||||
SELECT JSON_CONTAINS('["😀", "hello"]', '["\\uD83D\\uDE00"]') AS result;
|
||||
SELECT JSON_EQUALS('{"emoji": "😀"}', '{"emoji": "\\uD83D\\uDE00"}') AS result;
|
||||
|
||||
--echo #
|
||||
--echo # Escaped object keys: \u006B\u0065\u0079 = "key"
|
||||
--echo #
|
||||
SELECT JSON_EQUALS('{"key":"A"}', '{"\\u006B\\u0065\\u0079":"A"}');
|
||||
SELECT JSON_CONTAINS('{"key":"A"}', '{"\\u006B\\u0065\\u0079":"A"}');
|
||||
SELECT JSON_EQUALS('{"key":"A"}', '{"\\u006B\\u0065\\u0079":"A"}') AS result;
|
||||
SELECT JSON_CONTAINS('{"key":"A"}', '{"\\u006B\\u0065\\u0079":"A"}') AS result;
|
||||
|
||||
--echo #
|
||||
--echo # BMP non-ASCII: é = U+00E9, literal UTF-8 vs escape
|
||||
|
||||
@@ -161,3 +161,64 @@ ERROR 42000: Incorrect parameter count in the call to native function 'kdf'
|
||||
#
|
||||
# End of 11.3 tests
|
||||
#
|
||||
#
|
||||
# MDEV-40385 use-of-uninitialized-value in Binary_string::c_ptr()
|
||||
#
|
||||
SELECT KDF('','',1000,256);
|
||||
KDF('','',1000,256)
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 3047 Invalid argument error: '256' in function kdf.
|
||||
SELECT KDF('secret','salt',1000,999);
|
||||
KDF('secret','salt',1000,999)
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 3047 Invalid argument error: '999' in function kdf.
|
||||
SELECT KDF('secret','salt',1000,'pbkdf2_hmac') IS NOT NULL;
|
||||
KDF('secret','salt',1000,'pbkdf2_hmac') IS NOT NULL
|
||||
1
|
||||
SELECT KDF('secret','salt') IS NOT NULL;
|
||||
KDF('secret','salt') IS NOT NULL
|
||||
1
|
||||
#
|
||||
# MDEV-41094 KDF() silently reduces large PBKDF2 iteration counts
|
||||
# and key widths to weak 32-bit aliases
|
||||
#
|
||||
SET @@block_encryption_mode=DEFAULT;
|
||||
SELECT HEX(KDF('foo', 'bar', 1000, 'pbkdf2_hmac'));
|
||||
HEX(KDF('foo', 'bar', 1000, 'pbkdf2_hmac'))
|
||||
76BA6DEC5C3F6A60704D730A2A4BAA1C
|
||||
SELECT KDF('foo', 'bar', 4294968296, 'pbkdf2_hmac');
|
||||
KDF('foo', 'bar', 4294968296, 'pbkdf2_hmac')
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 3047 Invalid argument error: 4294968296 in function kdf.
|
||||
SELECT KDF('foo', 'bar', 2147483648, 'pbkdf2_hmac');
|
||||
KDF('foo', 'bar', 2147483648, 'pbkdf2_hmac')
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 3047 Invalid argument error: 2147483648 in function kdf.
|
||||
SELECT HEX(KDF('foo', 'bar', 1000, 'pbkdf2_hmac', 256));
|
||||
HEX(KDF('foo', 'bar', 1000, 'pbkdf2_hmac', 256))
|
||||
76BA6DEC5C3F6A60704D730A2A4BAA1C596F278AE35408EE5D67ECE0942C14F4
|
||||
SELECT KDF('foo', 'bar', 1000, 'pbkdf2_hmac', 4294967552);
|
||||
KDF('foo', 'bar', 1000, 'pbkdf2_hmac', 4294967552)
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 3047 Invalid argument error: 4294967552 in function kdf.
|
||||
SELECT KDF('foo', 'bar', 1000, 'pbkdf2_hmac', -4294967040);
|
||||
KDF('foo', 'bar', 1000, 'pbkdf2_hmac', -4294967040)
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 3047 Invalid argument error: -4294967040 in function kdf.
|
||||
CREATE TABLE t1 (w BIGINT);
|
||||
INSERT INTO t1 VALUES (4294967552);
|
||||
SELECT KDF('foo', 'bar', 1000, 'pbkdf2_hmac', w) FROM t1;
|
||||
KDF('foo', 'bar', 1000, 'pbkdf2_hmac', w)
|
||||
NULL
|
||||
Warnings:
|
||||
Warning 3047 Invalid argument error: 4294967552 in function kdf.
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 11.4 tests
|
||||
#
|
||||
|
||||
@@ -62,3 +62,33 @@ select kdf();
|
||||
--echo # End of 11.3 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-40385 use-of-uninitialized-value in Binary_string::c_ptr()
|
||||
--echo #
|
||||
# MSAN only: this test verifies the fix behaviorally (warning + NULL); the
|
||||
# uninitialized read itself is only observable under an MSAN build.
|
||||
SELECT KDF('','',1000,256);
|
||||
SELECT KDF('secret','salt',1000,999);
|
||||
SELECT KDF('secret','salt',1000,'pbkdf2_hmac') IS NOT NULL;
|
||||
SELECT KDF('secret','salt') IS NOT NULL;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-41094 KDF() silently reduces large PBKDF2 iteration counts
|
||||
--echo # and key widths to weak 32-bit aliases
|
||||
--echo #
|
||||
SET @@block_encryption_mode=DEFAULT;
|
||||
SELECT HEX(KDF('foo', 'bar', 1000, 'pbkdf2_hmac'));
|
||||
SELECT KDF('foo', 'bar', 4294968296, 'pbkdf2_hmac');
|
||||
SELECT KDF('foo', 'bar', 2147483648, 'pbkdf2_hmac');
|
||||
SELECT HEX(KDF('foo', 'bar', 1000, 'pbkdf2_hmac', 256));
|
||||
SELECT KDF('foo', 'bar', 1000, 'pbkdf2_hmac', 4294967552);
|
||||
SELECT KDF('foo', 'bar', 1000, 'pbkdf2_hmac', -4294967040);
|
||||
CREATE TABLE t1 (w BIGINT);
|
||||
INSERT INTO t1 VALUES (4294967552);
|
||||
SELECT KDF('foo', 'bar', 1000, 'pbkdf2_hmac', w) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 11.4 tests
|
||||
--echo #
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
--- ./main/innodb_ext_key.result
|
||||
+++ ./main/innodb_ext_key.reject
|
||||
--- ./innodb_ext_key.result
|
||||
+++ innodb_ext_key,covering,on.result
|
||||
@@ -244,7 +244,7 @@
|
||||
Variable_name Value
|
||||
Handler_read_first 0
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
--- main/innodb_ext_key.result
|
||||
+++ main/innodb_ext_key,off.reject
|
||||
--- ./innodb_ext_key.result
|
||||
+++ innodb_ext_key,on.result
|
||||
@@ -9,7 +9,7 @@
|
||||
explain
|
||||
select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
--- ./main/innodb_ext_key.result
|
||||
+++ ./main/innodb_ext_key.reject
|
||||
--- ./innodb_ext_key.result
|
||||
+++ innodb_ext_key,on,unoptimized.result
|
||||
@@ -244,7 +244,7 @@
|
||||
Variable_name Value
|
||||
Handler_read_first 0
|
||||
|
||||
@@ -5,11 +5,15 @@
|
||||
# making writing tests that depend on reaching
|
||||
# the depth hard.
|
||||
#
|
||||
source include/not_asan.inc;
|
||||
source include/not_embedded.inc;
|
||||
source include/not_ubsan.inc;
|
||||
# MSAN with debug exceeds the stack early.
|
||||
source include/not_msan_with_debug.inc;
|
||||
if (`select count(*) from information_schema.system_variables
|
||||
where variable_name='have_sanitizer'
|
||||
and global_value REGEXP '(A|UB)SAN'`)
|
||||
{
|
||||
--skip Can't be run in UBSAN/ASAN (stack size predictability)
|
||||
}
|
||||
|
||||
#
|
||||
# Bug#10100 function (and stored procedure?) recursivity problem
|
||||
|
||||
1
mysql-test/main/lowercase_routines.opt
Normal file
1
mysql-test/main/lowercase_routines.opt
Normal file
@@ -0,0 +1 @@
|
||||
--lower-case-table-names=2
|
||||
46
mysql-test/main/lowercase_routines.result
Normal file
46
mysql-test/main/lowercase_routines.result
Normal file
@@ -0,0 +1,46 @@
|
||||
#
|
||||
# MDEV-33616 Routines of a mixed case database are not listed when
|
||||
# lower_case_table_names is 2
|
||||
#
|
||||
CREATE DATABASE Db1;
|
||||
USE Db1;
|
||||
CREATE FUNCTION f1(a INT) RETURNS INT RETURN a;
|
||||
CREATE PROCEDURE p1(b INT) BEGIN END;
|
||||
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='Db1';
|
||||
SCHEMA_NAME
|
||||
Db1
|
||||
SELECT db, name FROM mysql.proc WHERE name IN ('f1','p1');
|
||||
db name
|
||||
db1 f1
|
||||
db1 p1
|
||||
SELECT ROUTINE_NAME FROM information_schema.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA='Db1';
|
||||
ROUTINE_NAME
|
||||
f1
|
||||
p1
|
||||
SELECT SPECIFIC_NAME, ORDINAL_POSITION, PARAMETER_NAME
|
||||
FROM information_schema.PARAMETERS WHERE SPECIFIC_SCHEMA='Db1';
|
||||
SPECIFIC_NAME ORDINAL_POSITION PARAMETER_NAME
|
||||
f1 0 NULL
|
||||
f1 1 a
|
||||
p1 1 b
|
||||
SHOW FUNCTION STATUS WHERE Db='Db1';
|
||||
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
||||
db1 f1 FUNCTION root@localhost # # DEFINER latin1 latin1_swedish_ci utf8mb4_uca1400_ai_ci
|
||||
SHOW PROCEDURE STATUS WHERE Db='Db1';
|
||||
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
||||
db1 p1 PROCEDURE root@localhost # # DEFINER latin1 latin1_swedish_ci utf8mb4_uca1400_ai_ci
|
||||
SELECT ROUTINE_NAME FROM information_schema.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA='Db1' ORDER BY ROUTINE_NAME;
|
||||
ROUTINE_NAME
|
||||
f1
|
||||
p1
|
||||
SELECT SPECIFIC_NAME, ORDINAL_POSITION, PARAMETER_NAME
|
||||
FROM information_schema.PARAMETERS WHERE SPECIFIC_SCHEMA='Db1'
|
||||
ORDER BY SPECIFIC_NAME, ORDINAL_POSITION;
|
||||
SPECIFIC_NAME ORDINAL_POSITION PARAMETER_NAME
|
||||
f1 0 NULL
|
||||
f1 1 a
|
||||
p1 1 b
|
||||
USE test;
|
||||
DROP DATABASE Db1;
|
||||
47
mysql-test/main/lowercase_routines.test
Normal file
47
mysql-test/main/lowercase_routines.test
Normal file
@@ -0,0 +1,47 @@
|
||||
#
|
||||
# Tests that require lower_case_table_names to be 2
|
||||
# (the default when the data directory is on a case insensitive file system)
|
||||
#
|
||||
--source include/have_lowercase2.inc
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-33616 Routines of a mixed case database are not listed when
|
||||
--echo # lower_case_table_names is 2
|
||||
--echo #
|
||||
|
||||
CREATE DATABASE Db1;
|
||||
USE Db1;
|
||||
CREATE FUNCTION f1(a INT) RETURNS INT RETURN a;
|
||||
CREATE PROCEDURE p1(b INT) BEGIN END;
|
||||
|
||||
# The database keeps the case it was created with, mysql.proc does not.
|
||||
SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='Db1';
|
||||
--sorted_result
|
||||
SELECT db, name FROM mysql.proc WHERE name IN ('f1','p1');
|
||||
|
||||
# The name from the WHERE clause becomes the key of an index read on
|
||||
# mysql.proc. mysql.proc.db is utf8mb3_bin and holds the folded name, so
|
||||
# an unfolded key finds nothing.
|
||||
--sorted_result
|
||||
SELECT ROUTINE_NAME FROM information_schema.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA='Db1';
|
||||
--sorted_result
|
||||
SELECT SPECIFIC_NAME, ORDINAL_POSITION, PARAMETER_NAME
|
||||
FROM information_schema.PARAMETERS WHERE SPECIFIC_SCHEMA='Db1';
|
||||
--replace_column 5 # 6 #
|
||||
SHOW FUNCTION STATUS WHERE Db='Db1';
|
||||
--replace_column 5 # 6 #
|
||||
SHOW PROCEDURE STATUS WHERE Db='Db1';
|
||||
|
||||
# ORDER BY keeps the condition from reaching the routine that fills the
|
||||
# table, so mysql.proc is read in full and the WHERE is applied afterwards
|
||||
# over a utf8mb3_general_ci column. That shape returned the rows even
|
||||
# while the queries above returned none.
|
||||
SELECT ROUTINE_NAME FROM information_schema.ROUTINES
|
||||
WHERE ROUTINE_SCHEMA='Db1' ORDER BY ROUTINE_NAME;
|
||||
SELECT SPECIFIC_NAME, ORDINAL_POSITION, PARAMETER_NAME
|
||||
FROM information_schema.PARAMETERS WHERE SPECIFIC_SCHEMA='Db1'
|
||||
ORDER BY SPECIFIC_NAME, ORDINAL_POSITION;
|
||||
|
||||
USE test;
|
||||
DROP DATABASE Db1;
|
||||
46
mysql-test/main/lowercase_routines0.result
Normal file
46
mysql-test/main/lowercase_routines0.result
Normal file
@@ -0,0 +1,46 @@
|
||||
#
|
||||
# MDEV-33616 A statement cannot reference two routines whose databases
|
||||
# differ only in case
|
||||
#
|
||||
CREATE DATABASE Db1;
|
||||
CREATE DATABASE db1;
|
||||
CREATE FUNCTION Db1.f1() RETURNS INT RETURN 1;
|
||||
CREATE FUNCTION db1.f1() RETURNS INT RETURN 2;
|
||||
CREATE PROCEDURE test.p1() SELECT Db1.f1(), db1.f1();
|
||||
SELECT Db1.f1();
|
||||
Db1.f1()
|
||||
1
|
||||
SELECT db1.f1();
|
||||
db1.f1()
|
||||
2
|
||||
connect con1,localhost,root,,test;
|
||||
SELECT Db1.f1(), db1.f1();
|
||||
Db1.f1() db1.f1()
|
||||
1 2
|
||||
disconnect con1;
|
||||
connect con2,localhost,root,,test;
|
||||
SELECT db1.f1(), Db1.f1();
|
||||
db1.f1() Db1.f1()
|
||||
2 1
|
||||
disconnect con2;
|
||||
connect con3,localhost,root,,test;
|
||||
CALL test.p1();
|
||||
Db1.f1() db1.f1()
|
||||
1 2
|
||||
disconnect con3;
|
||||
connect con4,localhost,root,,test;
|
||||
SELECT db1.f1();
|
||||
db1.f1()
|
||||
2
|
||||
connection default;
|
||||
DROP FUNCTION db1.f1;
|
||||
CREATE FUNCTION db1.f1() RETURNS INT RETURN 99;
|
||||
connection con4;
|
||||
SELECT Db1.f1(), db1.f1();
|
||||
Db1.f1() db1.f1()
|
||||
1 99
|
||||
disconnect con4;
|
||||
connection default;
|
||||
DROP PROCEDURE test.p1;
|
||||
DROP DATABASE Db1;
|
||||
DROP DATABASE db1;
|
||||
65
mysql-test/main/lowercase_routines0.test
Normal file
65
mysql-test/main/lowercase_routines0.test
Normal file
@@ -0,0 +1,65 @@
|
||||
#
|
||||
# Tests that require lower_case_table_names to be 0
|
||||
# (the default when the data directory is on a case sensitive file system)
|
||||
#
|
||||
--source include/have_lowercase0.inc
|
||||
--source include/have_case_sensitive_file_system.inc
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-33616 A statement cannot reference two routines whose databases
|
||||
--echo # differ only in case
|
||||
--echo #
|
||||
|
||||
CREATE DATABASE Db1;
|
||||
CREATE DATABASE db1;
|
||||
CREATE FUNCTION Db1.f1() RETURNS INT RETURN 1;
|
||||
CREATE FUNCTION db1.f1() RETURNS INT RETURN 2;
|
||||
CREATE PROCEDURE test.p1() SELECT Db1.f1(), db1.f1();
|
||||
|
||||
SELECT Db1.f1();
|
||||
SELECT db1.f1();
|
||||
|
||||
# Every routine a statement names joins one set, keyed by the database and
|
||||
# the routine name. The database name is case sensitive here, so the two
|
||||
# routines have to stay apart and each reference has to reach its own. A
|
||||
# connection that already holds one of them in its routine cache resolves
|
||||
# both either way, so every check below starts from a connection that holds
|
||||
# neither.
|
||||
connect (con1,localhost,root,,test);
|
||||
# A view compares its column names without regard to case, so under the
|
||||
# view protocol the second column of a query like this one is given a
|
||||
# generated name.
|
||||
--disable_view_protocol
|
||||
SELECT Db1.f1(), db1.f1();
|
||||
--enable_view_protocol
|
||||
disconnect con1;
|
||||
|
||||
connect (con2,localhost,root,,test);
|
||||
--disable_view_protocol
|
||||
SELECT db1.f1(), Db1.f1();
|
||||
--enable_view_protocol
|
||||
disconnect con2;
|
||||
|
||||
# A statement inside a routine body builds the same set.
|
||||
connect (con3,localhost,root,,test);
|
||||
CALL test.p1();
|
||||
disconnect con3;
|
||||
|
||||
# A routine missing from the set is neither locked nor checked against the
|
||||
# version of the routine cache, so it could execute a definition that
|
||||
# another connection had already replaced.
|
||||
connect (con4,localhost,root,,test);
|
||||
SELECT db1.f1();
|
||||
connection default;
|
||||
DROP FUNCTION db1.f1;
|
||||
CREATE FUNCTION db1.f1() RETURNS INT RETURN 99;
|
||||
connection con4;
|
||||
--disable_view_protocol
|
||||
SELECT Db1.f1(), db1.f1();
|
||||
--enable_view_protocol
|
||||
disconnect con4;
|
||||
connection default;
|
||||
|
||||
DROP PROCEDURE test.p1;
|
||||
DROP DATABASE Db1;
|
||||
DROP DATABASE db1;
|
||||
@@ -114,7 +114,7 @@ mysql.help_topic: Records: 839 Deleted: 0 Skipped: 0 Warnings: 0
|
||||
Loading data from LOCAL file: vardir/tmp/dump/mysql/time_zone_transition.txt into time_zone_transition
|
||||
mysql.time_zone_transition: Records: 394 Deleted: 0 Skipped: 0 Warnings: 0
|
||||
Loading data from LOCAL file: vardir/tmp/dump/mtr/global_suppressions.txt into global_suppressions
|
||||
mtr.global_suppressions: Records: 99 Deleted: 0 Skipped: 0 Warnings: 0
|
||||
mtr.global_suppressions: Records: 100 Deleted: 0 Skipped: 0 Warnings: 0
|
||||
Loading data from LOCAL file: vardir/tmp/dump/mysql/help_keyword.txt into help_keyword
|
||||
mysql.help_keyword: Records: 106 Deleted: 0 Skipped: 0 Warnings: 0
|
||||
Loading data from LOCAL file: vardir/tmp/dump/mysql/help_relation.txt into help_relation
|
||||
|
||||
@@ -156,7 +156,7 @@ drop database db2;
|
||||
create database db2;
|
||||
use db2;
|
||||
|
||||
# Test with triggers (using https://mariadb.com/kb/en/trigger-overview/ example)
|
||||
# Test with triggers (using https://mariadb.com/docs/server/server-usage/triggers-events/triggers/trigger-overview example)
|
||||
CREATE TABLE animals (id mediumint(9)
|
||||
NOT NULL AUTO_INCREMENT,
|
||||
name char(30) NOT NULL,
|
||||
|
||||
207
mysql-test/main/mysql_upgrade_sys_routine_grants.result
Normal file
207
mysql-test/main/mysql_upgrade_sys_routine_grants.result
Normal file
@@ -0,0 +1,207 @@
|
||||
#
|
||||
# MDEV-39993 mariadb-upgrade Drops Existing EXECUTE Grants on sys
|
||||
# Stored Routines During Upgrade
|
||||
#
|
||||
CREATE USER mdev39993_user@localhost;
|
||||
GRANT EXECUTE ON PROCEDURE sys.table_exists TO mdev39993_user@localhost;
|
||||
GRANT EXECUTE ON FUNCTION sys.quote_identifier TO mdev39993_user@localhost;
|
||||
SHOW GRANTS FOR mdev39993_user@localhost;
|
||||
Grants for mdev39993_user@localhost
|
||||
GRANT USAGE ON *.* TO `mdev39993_user`@`localhost`
|
||||
GRANT EXECUTE ON PROCEDURE `sys`.`table_exists` TO `mdev39993_user`@`localhost`
|
||||
GRANT EXECUTE ON FUNCTION `sys`.`quote_identifier` TO `mdev39993_user`@`localhost`
|
||||
# Overwrite the routine bodies with a marker so that a passing test
|
||||
# below actually proves the routines were reinstalled by the
|
||||
# upgrade, rather than merely left untouched (i.e. sys schema
|
||||
# install skipped).
|
||||
CREATE OR REPLACE DEFINER='mariadb.sys'@'localhost' FUNCTION sys.quote_identifier(in_identifier TEXT)
|
||||
RETURNS TEXT
|
||||
SQL SECURITY INVOKER
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN 'stale_body_marker';
|
||||
END|
|
||||
CREATE OR REPLACE DEFINER='mariadb.sys'@'localhost' PROCEDURE sys.table_exists (
|
||||
IN in_db VARCHAR(64), IN in_table VARCHAR(64),
|
||||
OUT out_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY', 'SEQUENCE', 'SYSTEM VIEW', 'TEMPORARY SEQUENCE')
|
||||
)
|
||||
SQL SECURITY INVOKER
|
||||
BEGIN
|
||||
SET out_exists = '';
|
||||
END|
|
||||
SELECT sys.quote_identifier('abc') AS qi;
|
||||
qi
|
||||
stale_body_marker
|
||||
CALL sys.table_exists('mysql', 'user', @exists);
|
||||
SELECT @exists;
|
||||
@exists
|
||||
|
||||
Phase 1/8: Checking and upgrading mysql database
|
||||
Processing databases
|
||||
mysql
|
||||
mysql.column_stats OK
|
||||
mysql.columns_priv OK
|
||||
mysql.db OK
|
||||
mysql.event OK
|
||||
mysql.func OK
|
||||
mysql.global_priv OK
|
||||
mysql.gtid_slave_pos OK
|
||||
mysql.help_category OK
|
||||
mysql.help_keyword OK
|
||||
mysql.help_relation OK
|
||||
mysql.help_topic OK
|
||||
mysql.index_stats OK
|
||||
mysql.innodb_index_stats OK
|
||||
mysql.innodb_table_stats OK
|
||||
mysql.plugin OK
|
||||
mysql.proc OK
|
||||
mysql.procs_priv OK
|
||||
mysql.proxies_priv OK
|
||||
mysql.roles_mapping OK
|
||||
mysql.servers OK
|
||||
mysql.table_stats OK
|
||||
mysql.tables_priv OK
|
||||
mysql.time_zone OK
|
||||
mysql.time_zone_leap_second OK
|
||||
mysql.time_zone_name OK
|
||||
mysql.time_zone_transition OK
|
||||
mysql.time_zone_transition_type OK
|
||||
mysql.transaction_registry OK
|
||||
Phase 2/8: Installing used storage engines... Skipped
|
||||
Phase 3/8: Running 'mysql_fix_privilege_tables'
|
||||
Phase 4/8: Fixing views
|
||||
mysql.user OK
|
||||
sys.host_summary OK
|
||||
sys.host_summary_by_file_io OK
|
||||
sys.host_summary_by_file_io_type OK
|
||||
sys.host_summary_by_stages OK
|
||||
sys.host_summary_by_statement_latency OK
|
||||
sys.host_summary_by_statement_type OK
|
||||
sys.innodb_buffer_stats_by_schema OK
|
||||
sys.innodb_buffer_stats_by_table OK
|
||||
sys.innodb_lock_waits OK
|
||||
sys.io_by_thread_by_latency OK
|
||||
sys.io_global_by_file_by_bytes OK
|
||||
sys.io_global_by_file_by_latency OK
|
||||
sys.io_global_by_wait_by_bytes OK
|
||||
sys.io_global_by_wait_by_latency OK
|
||||
sys.latest_file_io OK
|
||||
sys.memory_by_host_by_current_bytes OK
|
||||
sys.memory_by_thread_by_current_bytes OK
|
||||
sys.memory_by_user_by_current_bytes OK
|
||||
sys.memory_global_by_current_bytes OK
|
||||
sys.memory_global_total OK
|
||||
sys.metrics OK
|
||||
sys.privileges_by_table_by_level OK
|
||||
sys.processlist OK
|
||||
sys.ps_check_lost_instrumentation OK
|
||||
sys.schema_auto_increment_columns OK
|
||||
sys.schema_index_statistics OK
|
||||
sys.schema_object_overview OK
|
||||
sys.schema_redundant_indexes OK
|
||||
sys.schema_table_lock_waits OK
|
||||
sys.schema_table_statistics OK
|
||||
sys.schema_table_statistics_with_buffer OK
|
||||
sys.schema_tables_with_full_table_scans OK
|
||||
sys.schema_unused_indexes OK
|
||||
sys.session OK
|
||||
sys.session_ssl_status OK
|
||||
sys.statement_analysis OK
|
||||
sys.statements_with_errors_or_warnings OK
|
||||
sys.statements_with_full_table_scans OK
|
||||
sys.statements_with_runtimes_in_95th_percentile OK
|
||||
sys.statements_with_sorting OK
|
||||
sys.statements_with_temp_tables OK
|
||||
sys.user_summary OK
|
||||
sys.user_summary_by_file_io OK
|
||||
sys.user_summary_by_file_io_type OK
|
||||
sys.user_summary_by_stages OK
|
||||
sys.user_summary_by_statement_latency OK
|
||||
sys.user_summary_by_statement_type OK
|
||||
sys.version OK
|
||||
sys.wait_classes_global_by_avg_latency OK
|
||||
sys.wait_classes_global_by_latency OK
|
||||
sys.waits_by_host_by_latency OK
|
||||
sys.waits_by_user_by_latency OK
|
||||
sys.waits_global_by_latency OK
|
||||
sys.x$host_summary OK
|
||||
sys.x$host_summary_by_file_io OK
|
||||
sys.x$host_summary_by_file_io_type OK
|
||||
sys.x$host_summary_by_stages OK
|
||||
sys.x$host_summary_by_statement_latency OK
|
||||
sys.x$host_summary_by_statement_type OK
|
||||
sys.x$innodb_buffer_stats_by_schema OK
|
||||
sys.x$innodb_buffer_stats_by_table OK
|
||||
sys.x$innodb_lock_waits OK
|
||||
sys.x$io_by_thread_by_latency OK
|
||||
sys.x$io_global_by_file_by_bytes OK
|
||||
sys.x$io_global_by_file_by_latency OK
|
||||
sys.x$io_global_by_wait_by_bytes OK
|
||||
sys.x$io_global_by_wait_by_latency OK
|
||||
sys.x$latest_file_io OK
|
||||
sys.x$memory_by_host_by_current_bytes OK
|
||||
sys.x$memory_by_thread_by_current_bytes OK
|
||||
sys.x$memory_by_user_by_current_bytes OK
|
||||
sys.x$memory_global_by_current_bytes OK
|
||||
sys.x$memory_global_total OK
|
||||
sys.x$processlist OK
|
||||
sys.x$ps_digest_95th_percentile_by_avg_us OK
|
||||
sys.x$ps_digest_avg_latency_distribution OK
|
||||
sys.x$ps_schema_table_statistics_io OK
|
||||
sys.x$schema_flattened_keys OK
|
||||
sys.x$schema_index_statistics OK
|
||||
sys.x$schema_table_lock_waits OK
|
||||
sys.x$schema_table_statistics OK
|
||||
sys.x$schema_table_statistics_with_buffer OK
|
||||
sys.x$schema_tables_with_full_table_scans OK
|
||||
sys.x$session OK
|
||||
sys.x$statement_analysis OK
|
||||
sys.x$statements_with_errors_or_warnings OK
|
||||
sys.x$statements_with_full_table_scans OK
|
||||
sys.x$statements_with_runtimes_in_95th_percentile OK
|
||||
sys.x$statements_with_sorting OK
|
||||
sys.x$statements_with_temp_tables OK
|
||||
sys.x$user_summary OK
|
||||
sys.x$user_summary_by_file_io OK
|
||||
sys.x$user_summary_by_file_io_type OK
|
||||
sys.x$user_summary_by_stages OK
|
||||
sys.x$user_summary_by_statement_latency OK
|
||||
sys.x$user_summary_by_statement_type OK
|
||||
sys.x$wait_classes_global_by_avg_latency OK
|
||||
sys.x$wait_classes_global_by_latency OK
|
||||
sys.x$waits_by_host_by_latency OK
|
||||
sys.x$waits_by_user_by_latency OK
|
||||
sys.x$waits_global_by_latency OK
|
||||
Phase 5/8: Fixing table and database names
|
||||
Phase 6/8: Checking and upgrading tables
|
||||
Processing databases
|
||||
information_schema
|
||||
mtr
|
||||
mtr.global_suppressions OK
|
||||
mtr.test_suppressions OK
|
||||
performance_schema
|
||||
sys
|
||||
sys.sys_config OK
|
||||
test
|
||||
Phase 7/8: uninstalling plugins
|
||||
Phase 8/8: Running 'FLUSH PRIVILEGES'
|
||||
OK
|
||||
# The EXECUTE grants on sys.table_exists and sys.quote_identifier
|
||||
# must survive the reinstall of the sys schema.
|
||||
SHOW GRANTS FOR mdev39993_user@localhost;
|
||||
Grants for mdev39993_user@localhost
|
||||
GRANT USAGE ON *.* TO `mdev39993_user`@`localhost`
|
||||
GRANT EXECUTE ON PROCEDURE `sys`.`table_exists` TO `mdev39993_user`@`localhost`
|
||||
GRANT EXECUTE ON FUNCTION `sys`.`quote_identifier` TO `mdev39993_user`@`localhost`
|
||||
# The routine bodies must have been replaced back to their real
|
||||
# definitions (proves the sys schema was actually reinstalled by
|
||||
# the upgrade, not merely skipped).
|
||||
SELECT sys.quote_identifier('abc') AS qi;
|
||||
qi
|
||||
`abc`
|
||||
CALL sys.table_exists('mysql', 'user', @exists);
|
||||
SELECT @exists;
|
||||
@exists
|
||||
VIEW
|
||||
DROP USER mdev39993_user@localhost;
|
||||
# End of 11.4 tests
|
||||
61
mysql-test/main/mysql_upgrade_sys_routine_grants.test
Normal file
61
mysql-test/main/mysql_upgrade_sys_routine_grants.test
Normal file
@@ -0,0 +1,61 @@
|
||||
--source include/mysql_upgrade_preparation.inc
|
||||
--source include/have_innodb.inc
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-39993 mariadb-upgrade Drops Existing EXECUTE Grants on sys
|
||||
--echo # Stored Routines During Upgrade
|
||||
--echo #
|
||||
|
||||
CREATE USER mdev39993_user@localhost;
|
||||
GRANT EXECUTE ON PROCEDURE sys.table_exists TO mdev39993_user@localhost;
|
||||
GRANT EXECUTE ON FUNCTION sys.quote_identifier TO mdev39993_user@localhost;
|
||||
|
||||
SHOW GRANTS FOR mdev39993_user@localhost;
|
||||
|
||||
--echo # Overwrite the routine bodies with a marker so that a passing test
|
||||
--echo # below actually proves the routines were reinstalled by the
|
||||
--echo # upgrade, rather than merely left untouched (i.e. sys schema
|
||||
--echo # install skipped).
|
||||
DELIMITER |;
|
||||
CREATE OR REPLACE DEFINER='mariadb.sys'@'localhost' FUNCTION sys.quote_identifier(in_identifier TEXT)
|
||||
RETURNS TEXT
|
||||
SQL SECURITY INVOKER
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN 'stale_body_marker';
|
||||
END|
|
||||
|
||||
CREATE OR REPLACE DEFINER='mariadb.sys'@'localhost' PROCEDURE sys.table_exists (
|
||||
IN in_db VARCHAR(64), IN in_table VARCHAR(64),
|
||||
OUT out_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY', 'SEQUENCE', 'SYSTEM VIEW', 'TEMPORARY SEQUENCE')
|
||||
)
|
||||
SQL SECURITY INVOKER
|
||||
BEGIN
|
||||
SET out_exists = '';
|
||||
END|
|
||||
DELIMITER ;|
|
||||
|
||||
SELECT sys.quote_identifier('abc') AS qi;
|
||||
CALL sys.table_exists('mysql', 'user', @exists);
|
||||
SELECT @exists;
|
||||
|
||||
--exec $MYSQL_UPGRADE --force 2>&1
|
||||
|
||||
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||
--file_exists $MYSQLD_DATADIR/mariadb_upgrade_info
|
||||
--remove_file $MYSQLD_DATADIR/mariadb_upgrade_info
|
||||
|
||||
--echo # The EXECUTE grants on sys.table_exists and sys.quote_identifier
|
||||
--echo # must survive the reinstall of the sys schema.
|
||||
SHOW GRANTS FOR mdev39993_user@localhost;
|
||||
|
||||
--echo # The routine bodies must have been replaced back to their real
|
||||
--echo # definitions (proves the sys schema was actually reinstalled by
|
||||
--echo # the upgrade, not merely skipped).
|
||||
SELECT sys.quote_identifier('abc') AS qi;
|
||||
CALL sys.table_exists('mysql', 'user', @exists);
|
||||
SELECT @exists;
|
||||
|
||||
DROP USER mdev39993_user@localhost;
|
||||
|
||||
--echo # End of 11.4 tests
|
||||
@@ -1456,8 +1456,7 @@ The following specify which files/extra groups are read (specified before remain
|
||||
--slave-connections-needed-for-purge=#
|
||||
Minimum number of connected slaves required for automatic
|
||||
binary log purge with max_binlog_total_size,
|
||||
binlog_expire_logs_seconds or binlog_expire_logs_days.
|
||||
Default is 0 when Galera is enabled and 1 otherwise
|
||||
binlog_expire_logs_seconds or binlog_expire_logs_days
|
||||
--slave-ddl-exec-mode=name
|
||||
How replication events should be executed. Legal values
|
||||
are STRICT and IDEMPOTENT (default). In IDEMPOTENT mode,
|
||||
@@ -2125,7 +2124,7 @@ skip-show-database FALSE
|
||||
skip-slave-start FALSE
|
||||
slave-abort-blocking-timeout 31536000
|
||||
slave-compressed-protocol FALSE
|
||||
slave-connections-needed-for-purge 1
|
||||
slave-connections-needed-for-purge 0
|
||||
slave-ddl-exec-mode IDEMPOTENT
|
||||
slave-domain-parallel-threads 0
|
||||
slave-exec-mode STRICT
|
||||
|
||||
@@ -129,6 +129,8 @@ REPLACE INTO `innodb_index_stats` VALUES
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx01',5,1,'Time_zone_id'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx02',394,1,'Time_zone_id,Transition_time'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_leaf_pages',1,NULL,'Number of leaf pages in the index'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_nonnull_fld01',394,1,'Time_zone_id'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_nonnull_fld02',394,1,'Transition_time'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','size',1,NULL,'Number of pages in the index');
|
||||
/*!40000 ALTER TABLE `innodb_index_stats` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
@@ -753,6 +755,8 @@ REPLACE INTO `innodb_index_stats` VALUES
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx01',5,1,'Time_zone_id'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx02',394,1,'Time_zone_id,Transition_time'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_leaf_pages',1,NULL,'Number of leaf pages in the index'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_nonnull_fld01',394,1,'Time_zone_id'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_nonnull_fld02',394,1,'Transition_time'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','size',1,NULL,'Number of pages in the index');
|
||||
/*!40000 ALTER TABLE `innodb_index_stats` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
@@ -1353,6 +1357,8 @@ INSERT IGNORE INTO `innodb_index_stats` VALUES
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx01',5,1,'Time_zone_id'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx02',394,1,'Time_zone_id,Transition_time'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_leaf_pages',1,NULL,'Number of leaf pages in the index'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_nonnull_fld01',394,1,'Time_zone_id'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','n_nonnull_fld02',394,1,'Transition_time'),
|
||||
('test','tz','PRIMARY','2019-12-31 21:00:00','size',1,NULL,'Number of pages in the index');
|
||||
/*!40000 ALTER TABLE `innodb_index_stats` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
@@ -71,3 +71,27 @@ DROP TABLE t1, t2;
|
||||
#
|
||||
# End of 11.0 tests
|
||||
#
|
||||
#
|
||||
# MDEV-36096: Assertion partial_join_cost >= 0.0 failed when
|
||||
# sql_select_limit=1, and
|
||||
# optimizer_join_limit_pref_ratio=1
|
||||
#
|
||||
CREATE TABLE t (c INT NOT NULL UNIQUE) ENGINE=InnoDB;
|
||||
INSERT INTO t VALUES (0),(1),(2),(3),(4),(5);
|
||||
SET @save_sql_select_limit= @@sql_select_limit;
|
||||
SET sql_select_limit=1,optimizer_join_limit_pref_ratio=1;
|
||||
EXPLAIN
|
||||
SELECT * FROM t ORDER BY c;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t index NULL c 4 NULL 1
|
||||
SET sql_select_limit= @save_sql_select_limit;
|
||||
# similar issue with LIMIT 1 clause query
|
||||
EXPLAIN
|
||||
SELECT * FROM t ORDER BY c LIMIT 1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t index NULL c 4 NULL 1
|
||||
SET optimizer_join_limit_pref_ratio= default;
|
||||
DROP table t;
|
||||
#
|
||||
# End of 11.4 tests
|
||||
#
|
||||
|
||||
@@ -80,3 +80,31 @@ DROP TABLE t1, t2;
|
||||
--echo #
|
||||
--echo # End of 11.0 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-36096: Assertion partial_join_cost >= 0.0 failed when
|
||||
--echo # sql_select_limit=1, and
|
||||
--echo # optimizer_join_limit_pref_ratio=1
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t (c INT NOT NULL UNIQUE) ENGINE=InnoDB;
|
||||
INSERT INTO t VALUES (0),(1),(2),(3),(4),(5);
|
||||
|
||||
SET @save_sql_select_limit= @@sql_select_limit;
|
||||
|
||||
SET sql_select_limit=1,optimizer_join_limit_pref_ratio=1;
|
||||
EXPLAIN
|
||||
SELECT * FROM t ORDER BY c;
|
||||
|
||||
SET sql_select_limit= @save_sql_select_limit;
|
||||
|
||||
--echo # similar issue with LIMIT 1 clause query
|
||||
EXPLAIN
|
||||
SELECT * FROM t ORDER BY c LIMIT 1;
|
||||
|
||||
SET optimizer_join_limit_pref_ratio= default;
|
||||
DROP table t;
|
||||
|
||||
--echo #
|
||||
--echo # End of 11.4 tests
|
||||
--echo #
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
--- partition_index_scan.result
|
||||
+++ partition_index_scan,desc.reject
|
||||
@@ -1,7 +1,7 @@
|
||||
# Index scans with PARTITION BY RANGE
|
||||
CREATE TABLE t1 (
|
||||
@@ -477,3 +479,27 @@
|
||||
Handler_read_prev 0
|
||||
Handler_read_retry 0
|
||||
Handler_read_rnd 0
|
||||
@@ -1202,18 +1202,18 @@
|
||||
#
|
||||
# MDEV-40479: Reverse prefix scan across partitions
|
||||
#
|
||||
-CREATE TABLE t1 (a int, b int, c int, PRIMARY KEY (a, c), KEY (b, c ))
|
||||
+CREATE TABLE t1 (a int, b int, c int, PRIMARY KEY (a, c), KEY (b, c desc))
|
||||
PARTITION BY RANGE (c)
|
||||
(PARTITION p1 VALUES LESS THAN (10),
|
||||
PARTITION p2 VALUES LESS THAN (20));
|
||||
INSERT INTO t1 VALUES (1, 1, 15), (2, 1, 11), (3, 1, 6);
|
||||
explain
|
||||
-SELECT c FROM t1 WHERE b = 1 ORDER BY c desc;
|
||||
+SELECT c FROM t1 WHERE b = 1 ORDER BY c ;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref b b 5 const 3 Using where; Using index
|
||||
-SELECT c FROM t1 WHERE b = 1 ORDER BY c desc;
|
||||
+SELECT c FROM t1 WHERE b = 1 ORDER BY c ;
|
||||
c
|
||||
-15
|
||||
-11
|
||||
6
|
||||
+11
|
||||
+15
|
||||
DROP TABLE t1;
|
||||
|
||||
@@ -1199,3 +1199,21 @@ select json_extract(@js,'$**.partitions_index_scan_method');
|
||||
json_extract(@js,'$**.partitions_index_scan_method')
|
||||
NULL
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-40479: Reverse prefix scan across partitions
|
||||
#
|
||||
CREATE TABLE t1 (a int, b int, c int, PRIMARY KEY (a, c), KEY (b, c ))
|
||||
PARTITION BY RANGE (c)
|
||||
(PARTITION p1 VALUES LESS THAN (10),
|
||||
PARTITION p2 VALUES LESS THAN (20));
|
||||
INSERT INTO t1 VALUES (1, 1, 15), (2, 1, 11), (3, 1, 6);
|
||||
explain
|
||||
SELECT c FROM t1 WHERE b = 1 ORDER BY c desc;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ref b b 5 const 3 Using where; Using index
|
||||
SELECT c FROM t1 WHERE b = 1 ORDER BY c desc;
|
||||
c
|
||||
15
|
||||
11
|
||||
6
|
||||
DROP TABLE t1;
|
||||
|
||||
@@ -552,5 +552,25 @@ select json_extract(@js,'$**.partitions_index_scan_method');
|
||||
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-40479: Reverse prefix scan across partitions
|
||||
--echo #
|
||||
|
||||
eval
|
||||
CREATE TABLE t1 (a int, b int, c int, PRIMARY KEY (a, c), KEY (b, c $direction))
|
||||
PARTITION BY RANGE (c)
|
||||
(PARTITION p1 VALUES LESS THAN (10),
|
||||
PARTITION p2 VALUES LESS THAN (20));
|
||||
|
||||
INSERT INTO t1 VALUES (1, 1, 15), (2, 1, 11), (3, 1, 6);
|
||||
|
||||
eval
|
||||
explain
|
||||
SELECT c FROM t1 WHERE b = 1 ORDER BY c $opposite_direction;
|
||||
eval
|
||||
SELECT c FROM t1 WHERE b = 1 ORDER BY c $opposite_direction;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--enable_cursor_protocol
|
||||
--enable_ps2_protocol
|
||||
|
||||
1
mysql-test/main/plugin_checkpoint.opt
Normal file
1
mysql-test/main/plugin_checkpoint.opt
Normal file
@@ -0,0 +1 @@
|
||||
--log-bin
|
||||
16
mysql-test/main/plugin_checkpoint.result
Normal file
16
mysql-test/main/plugin_checkpoint.result
Normal file
@@ -0,0 +1,16 @@
|
||||
#
|
||||
# MDEV-40038 tp_foreach() crashes on a dying transaction participant
|
||||
#
|
||||
INSTALL SONAME 'ha_example';
|
||||
connect con1,localhost,root;
|
||||
SET DEBUG_SYNC= 'ha_finalize_handlerton_before_slot_clear SIGNAL deinit_started WAIT_FOR deinit_go';
|
||||
UNINSTALL SONAME 'ha_example';
|
||||
connection default;
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR deinit_started';
|
||||
RESET MASTER;
|
||||
SET DEBUG_SYNC= 'now SIGNAL deinit_go';
|
||||
connection con1;
|
||||
disconnect con1;
|
||||
connection default;
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
# End of 11.8 tests
|
||||
28
mysql-test/main/plugin_checkpoint.test
Normal file
28
mysql-test/main/plugin_checkpoint.test
Normal file
@@ -0,0 +1,28 @@
|
||||
--source include/have_debug_sync.inc
|
||||
--source include/have_log_bin.inc
|
||||
--source include/have_example_plugin.inc
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-40038 tp_foreach() crashes on a dying transaction participant
|
||||
--echo #
|
||||
|
||||
INSTALL SONAME 'ha_example';
|
||||
|
||||
--connect con1,localhost,root
|
||||
SET DEBUG_SYNC= 'ha_finalize_handlerton_before_slot_clear SIGNAL deinit_started WAIT_FOR deinit_go';
|
||||
--send UNINSTALL SONAME 'ha_example'
|
||||
|
||||
--connection default
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR deinit_started';
|
||||
# The engine is PLUGIN_IS_DYING but hton2plugin[] still points to it.
|
||||
RESET MASTER;
|
||||
SET DEBUG_SYNC= 'now SIGNAL deinit_go';
|
||||
|
||||
--connection con1
|
||||
--reap
|
||||
--disconnect con1
|
||||
|
||||
--connection default
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
|
||||
--echo # End of 11.8 tests
|
||||
@@ -137,4 +137,85 @@ CALL p1;
|
||||
ERROR HY000: Row variable 'r0' does not have a field 'b1_non_existing'
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-41265 SELECT/ UPDATE RETURNING INTO a single row-field fails with ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, even though the column count matches
|
||||
#
|
||||
# One scalar column into one field of an explicit ROW variable
|
||||
CREATE TABLE t1 (a INT, b VARCHAR(10));
|
||||
INSERT INTO t1 VALUES (1,'b1');
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE r0 ROW (a INT, b VARCHAR(10));
|
||||
SELECT a INTO r0.a FROM t1;
|
||||
SELECT r0.a;
|
||||
END;
|
||||
$$
|
||||
CREATE PROCEDURE p2()
|
||||
BEGIN
|
||||
DECLARE r0 ROW (a INT, b VARCHAR(10));
|
||||
SELECT a,b INTO r0.a FROM t1;
|
||||
END;
|
||||
$$
|
||||
CALL p1;
|
||||
r0.a
|
||||
1
|
||||
CALL p2;
|
||||
ERROR 21000: The used SELECT statements have a different number of columns
|
||||
DROP PROCEDURE p1;
|
||||
DROP PROCEDURE p2;
|
||||
DROP TABLE t1;
|
||||
# One scalar column into one field of a `ROW TYPE OF table1` variable
|
||||
CREATE TABLE t1 (a INT, b VARCHAR(10));
|
||||
INSERT INTO t1 VALUES (1,'b1');
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE r0 ROW TYPE OF t1;
|
||||
SELECT a INTO r0.a FROM t1;
|
||||
SELECT r0.a;
|
||||
END;
|
||||
$$
|
||||
CREATE PROCEDURE p2()
|
||||
BEGIN
|
||||
DECLARE r0 ROW TYPE OF t1;
|
||||
SELECT a,b INTO r0.a FROM t1;
|
||||
END;
|
||||
$$
|
||||
CALL p1;
|
||||
r0.a
|
||||
1
|
||||
CALL p2;
|
||||
ERROR 21000: The used SELECT statements have a different number of columns
|
||||
DROP PROCEDURE p1;
|
||||
DROP PROCEDURE p2;
|
||||
DROP TABLE t1;
|
||||
# One scalar column into one field of a `ROW TYPE OF cursor1` variable
|
||||
CREATE TABLE t1 (a INT, b VARCHAR(10));
|
||||
INSERT INTO t1 VALUES (1,'b1');
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE c1 CURSOR FOR SELECT * FROM t1;
|
||||
BEGIN
|
||||
DECLARE r0 ROW TYPE OF c1;
|
||||
SELECT a INTO r0.a FROM t1;
|
||||
SELECT r0.a;
|
||||
END;
|
||||
END;
|
||||
$$
|
||||
CREATE PROCEDURE p2()
|
||||
BEGIN
|
||||
DECLARE c1 CURSOR FOR SELECT * FROM t1;
|
||||
BEGIN
|
||||
DECLARE r0 ROW TYPE OF c1;
|
||||
SELECT a,b INTO r0.a FROM t1;
|
||||
END;
|
||||
END;
|
||||
$$
|
||||
CALL p1;
|
||||
r0.a
|
||||
1
|
||||
CALL p2;
|
||||
ERROR 21000: The used SELECT statements have a different number of columns
|
||||
DROP PROCEDURE p1;
|
||||
DROP PROCEDURE p2;
|
||||
DROP TABLE t1;
|
||||
# End of 12.3 tests
|
||||
|
||||
@@ -171,4 +171,92 @@ CALL p1;
|
||||
DROP PROCEDURE p1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-41265 SELECT/ UPDATE RETURNING INTO a single row-field fails with ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT, even though the column count matches
|
||||
--echo #
|
||||
|
||||
--echo # One scalar column into one field of an explicit ROW variable
|
||||
|
||||
CREATE TABLE t1 (a INT, b VARCHAR(10));
|
||||
INSERT INTO t1 VALUES (1,'b1');
|
||||
DELIMITER $$;
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE r0 ROW (a INT, b VARCHAR(10));
|
||||
SELECT a INTO r0.a FROM t1;
|
||||
SELECT r0.a;
|
||||
END;
|
||||
$$
|
||||
CREATE PROCEDURE p2()
|
||||
BEGIN
|
||||
DECLARE r0 ROW (a INT, b VARCHAR(10));
|
||||
SELECT a,b INTO r0.a FROM t1;
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
CALL p1;
|
||||
--error ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT
|
||||
CALL p2;
|
||||
DROP PROCEDURE p1;
|
||||
DROP PROCEDURE p2;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # One scalar column into one field of a `ROW TYPE OF table1` variable
|
||||
|
||||
CREATE TABLE t1 (a INT, b VARCHAR(10));
|
||||
INSERT INTO t1 VALUES (1,'b1');
|
||||
DELIMITER $$;
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE r0 ROW TYPE OF t1;
|
||||
SELECT a INTO r0.a FROM t1;
|
||||
SELECT r0.a;
|
||||
END;
|
||||
$$
|
||||
CREATE PROCEDURE p2()
|
||||
BEGIN
|
||||
DECLARE r0 ROW TYPE OF t1;
|
||||
SELECT a,b INTO r0.a FROM t1;
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
CALL p1;
|
||||
--error ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT
|
||||
CALL p2;
|
||||
DROP PROCEDURE p1;
|
||||
DROP PROCEDURE p2;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # One scalar column into one field of a `ROW TYPE OF cursor1` variable
|
||||
|
||||
CREATE TABLE t1 (a INT, b VARCHAR(10));
|
||||
INSERT INTO t1 VALUES (1,'b1');
|
||||
DELIMITER $$;
|
||||
CREATE PROCEDURE p1()
|
||||
BEGIN
|
||||
DECLARE c1 CURSOR FOR SELECT * FROM t1;
|
||||
BEGIN
|
||||
DECLARE r0 ROW TYPE OF c1;
|
||||
SELECT a INTO r0.a FROM t1;
|
||||
SELECT r0.a;
|
||||
END;
|
||||
END;
|
||||
$$
|
||||
CREATE PROCEDURE p2()
|
||||
BEGIN
|
||||
DECLARE c1 CURSOR FOR SELECT * FROM t1;
|
||||
BEGIN
|
||||
DECLARE r0 ROW TYPE OF c1;
|
||||
SELECT a,b INTO r0.a FROM t1;
|
||||
END;
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
CALL p1;
|
||||
--error ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT
|
||||
CALL p2;
|
||||
DROP PROCEDURE p1;
|
||||
DROP PROCEDURE p2;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # End of 12.3 tests
|
||||
|
||||
@@ -149,3 +149,21 @@ set session authorization root@localhost;
|
||||
--
|
||||
|
||||
# End of 12.0 tests
|
||||
#
|
||||
# MDEV-40336 SET AUTHORIZATION un-expired passwords
|
||||
#
|
||||
create user u1@localhost;
|
||||
alter user u1@localhost password expire;
|
||||
connect con1,localhost,u1;
|
||||
select 1;
|
||||
ERROR HY000: You must SET PASSWORD before executing this statement
|
||||
set session authorization u1@localhost;
|
||||
ERROR HY000: You must SET PASSWORD before executing this statement
|
||||
set password=password('');
|
||||
select 2;
|
||||
2
|
||||
2
|
||||
disconnect con1;
|
||||
connection default;
|
||||
drop user u1@localhost;
|
||||
# End of 12.3 tests
|
||||
|
||||
@@ -144,3 +144,23 @@ set session authorization root@localhost;
|
||||
disable_session_track_info;
|
||||
|
||||
--echo # End of 12.0 tests
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-40336 SET AUTHORIZATION un-expired passwords
|
||||
--echo #
|
||||
|
||||
create user u1@localhost;
|
||||
alter user u1@localhost password expire;
|
||||
connect con1,localhost,u1;
|
||||
--error ER_MUST_CHANGE_PASSWORD
|
||||
select 1;
|
||||
--error ER_MUST_CHANGE_PASSWORD
|
||||
set session authorization u1@localhost;
|
||||
set password=password('');
|
||||
select 2;
|
||||
disconnect con1;
|
||||
connection default;
|
||||
drop user u1@localhost;
|
||||
|
||||
--echo # End of 12.3 tests
|
||||
|
||||
|
||||
@@ -400,6 +400,69 @@ DROP FUNCTION f;
|
||||
# End of 10.5 tests
|
||||
#
|
||||
#
|
||||
# MDEV-38861 heap-use-after-free in Prepared_statement::execute()
|
||||
#
|
||||
# A routine must not be removed from the SP cache while it is executing.
|
||||
#
|
||||
# DROP of the running routine
|
||||
create procedure p0()
|
||||
begin
|
||||
prepare stmt from "drop procedure p0";
|
||||
execute stmt;
|
||||
end$$
|
||||
call p0();
|
||||
call p0();
|
||||
ERROR 42000: PROCEDURE test.p0 does not exist
|
||||
deallocate prepare stmt;
|
||||
# CREATE OR REPLACE of the running routine
|
||||
create procedure p0()
|
||||
begin
|
||||
prepare stmt from "create or replace procedure p0() begin select 1 as replaced; end";
|
||||
execute stmt;
|
||||
end$$
|
||||
call p0();
|
||||
call p0();
|
||||
replaced
|
||||
1
|
||||
deallocate prepare stmt;
|
||||
drop procedure p0;
|
||||
# Recursive call after the self-DROP, with the default recursion depth
|
||||
set @save_depth=@@max_sp_recursion_depth;
|
||||
set @@max_sp_recursion_depth=0;
|
||||
create procedure p0()
|
||||
begin
|
||||
prepare stmt from "drop procedure p0";
|
||||
execute stmt;
|
||||
call p0();
|
||||
end$$
|
||||
call p0();
|
||||
ERROR HY000: Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine p0
|
||||
call p0();
|
||||
ERROR 42000: PROCEDURE test.p0 does not exist
|
||||
deallocate prepare stmt;
|
||||
set @@max_sp_recursion_depth=@save_depth;
|
||||
# DROP of the caller, which then keeps running
|
||||
create procedure outer_p()
|
||||
begin
|
||||
call inner_p();
|
||||
select 'outer survived' as state;
|
||||
end$$
|
||||
create procedure inner_p()
|
||||
begin
|
||||
prepare stmt from "drop procedure outer_p";
|
||||
execute stmt;
|
||||
end$$
|
||||
call outer_p();
|
||||
state
|
||||
outer survived
|
||||
call outer_p();
|
||||
ERROR 42000: PROCEDURE test.outer_p does not exist
|
||||
deallocate prepare stmt;
|
||||
drop procedure inner_p;
|
||||
#
|
||||
# End of 11.4 tests
|
||||
#
|
||||
#
|
||||
# MDEV-36876 Crash during the Item_subselect::init - outer_select is NULL
|
||||
#
|
||||
# Vectors are not allowed for SOME/ANY
|
||||
|
||||
@@ -438,6 +438,79 @@ DROP FUNCTION f;
|
||||
--echo # End of 10.5 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-38861 heap-use-after-free in Prepared_statement::execute()
|
||||
--echo #
|
||||
--echo # A routine must not be removed from the SP cache while it is executing.
|
||||
--echo #
|
||||
|
||||
--echo # DROP of the running routine
|
||||
delimiter $$;
|
||||
create procedure p0()
|
||||
begin
|
||||
prepare stmt from "drop procedure p0";
|
||||
execute stmt;
|
||||
end$$
|
||||
delimiter ;$$
|
||||
call p0();
|
||||
--error ER_SP_DOES_NOT_EXIST
|
||||
call p0();
|
||||
deallocate prepare stmt;
|
||||
|
||||
--echo # CREATE OR REPLACE of the running routine
|
||||
delimiter $$;
|
||||
create procedure p0()
|
||||
begin
|
||||
prepare stmt from "create or replace procedure p0() begin select 1 as replaced; end";
|
||||
execute stmt;
|
||||
end$$
|
||||
delimiter ;$$
|
||||
call p0();
|
||||
call p0();
|
||||
deallocate prepare stmt;
|
||||
drop procedure p0;
|
||||
|
||||
--echo # Recursive call after the self-DROP, with the default recursion depth
|
||||
set @save_depth=@@max_sp_recursion_depth;
|
||||
set @@max_sp_recursion_depth=0;
|
||||
delimiter $$;
|
||||
create procedure p0()
|
||||
begin
|
||||
prepare stmt from "drop procedure p0";
|
||||
execute stmt;
|
||||
call p0();
|
||||
end$$
|
||||
delimiter ;$$
|
||||
--error ER_SP_RECURSION_LIMIT
|
||||
call p0();
|
||||
--error ER_SP_DOES_NOT_EXIST
|
||||
call p0();
|
||||
deallocate prepare stmt;
|
||||
set @@max_sp_recursion_depth=@save_depth;
|
||||
|
||||
--echo # DROP of the caller, which then keeps running
|
||||
delimiter $$;
|
||||
create procedure outer_p()
|
||||
begin
|
||||
call inner_p();
|
||||
select 'outer survived' as state;
|
||||
end$$
|
||||
create procedure inner_p()
|
||||
begin
|
||||
prepare stmt from "drop procedure outer_p";
|
||||
execute stmt;
|
||||
end$$
|
||||
delimiter ;$$
|
||||
call outer_p();
|
||||
--error ER_SP_DOES_NOT_EXIST
|
||||
call outer_p();
|
||||
deallocate prepare stmt;
|
||||
drop procedure inner_p;
|
||||
|
||||
--echo #
|
||||
--echo # End of 11.4 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-36876 Crash during the Item_subselect::init - outer_select is NULL
|
||||
--echo #
|
||||
|
||||
@@ -28,3 +28,31 @@ INSERT INTO t2 SELECT * FROM t1;
|
||||
ERROR 01000: Data truncated for column 'b' at row 1
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
#
|
||||
# MDEV-40422: MSAN use-of-uninitialized-value in my_convert
|
||||
#
|
||||
SET @old_collation_database= @@collation_database;
|
||||
SET @@time_zone='+00:00';
|
||||
SET timestamp=UNIX_TIMESTAMP('2001-02-03 10:20:30');
|
||||
SET collation_database= 'latin1_swedish_ci';
|
||||
SET CHARACTER SET DEFAULT;
|
||||
SELECT CAST(MD5(NOW()) AS CHAR),COUNT(*);
|
||||
CAST(MD5(NOW()) AS CHAR) COUNT(*)
|
||||
ffe52811dba9ccadb1763d2c15eb88ae 1
|
||||
SET NAMES latin1;
|
||||
SELECT CAST(MD5(NOW()) AS CHAR),COUNT(*);
|
||||
CAST(MD5(NOW()) AS CHAR) COUNT(*)
|
||||
ffe52811dba9ccadb1763d2c15eb88ae 1
|
||||
SELECT CAST(MD5(NOW()) AS CHAR(5)),COUNT(*);
|
||||
CAST(MD5(NOW()) AS CHAR(5)) COUNT(*)
|
||||
ffe52 1
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect CHAR(5) value: 'ffe52811dba9ccadb1763d2c15eb88ae'
|
||||
SELECT RIGHT(CAST(MD5(NOW()) AS CHAR),1),COUNT(*);
|
||||
RIGHT(CAST(MD5(NOW()) AS CHAR),1) COUNT(*)
|
||||
e 1
|
||||
SET @@collation_database= @old_collation_database;
|
||||
SET timestamp=DEFAULT;
|
||||
SET time_zone=DEFAULT;
|
||||
SET NAMES DEFAULT;
|
||||
# End of 11.8 tests
|
||||
|
||||
@@ -36,3 +36,27 @@ CREATE TABLE t2 (b SET('South Carolina', 'Vermont', 'Texas', 'New Mexico', 'Wisc
|
||||
INSERT INTO t2 SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-40422: MSAN use-of-uninitialized-value in my_convert
|
||||
--echo #
|
||||
|
||||
SET @old_collation_database= @@collation_database;
|
||||
SET @@time_zone='+00:00';
|
||||
SET timestamp=UNIX_TIMESTAMP('2001-02-03 10:20:30');
|
||||
|
||||
SET collation_database= 'latin1_swedish_ci';
|
||||
SET CHARACTER SET DEFAULT;
|
||||
SELECT CAST(MD5(NOW()) AS CHAR),COUNT(*);
|
||||
|
||||
SET NAMES latin1;
|
||||
SELECT CAST(MD5(NOW()) AS CHAR),COUNT(*);
|
||||
SELECT CAST(MD5(NOW()) AS CHAR(5)),COUNT(*);
|
||||
SELECT RIGHT(CAST(MD5(NOW()) AS CHAR),1),COUNT(*);
|
||||
|
||||
SET @@collation_database= @old_collation_database;
|
||||
SET timestamp=DEFAULT;
|
||||
SET time_zone=DEFAULT;
|
||||
SET NAMES DEFAULT;
|
||||
|
||||
--echo # End of 11.8 tests
|
||||
|
||||
@@ -3933,3 +3933,28 @@ drop table t1,t2,t3,t4;
|
||||
SET optimizer_switch=@save_optimizer_switch;
|
||||
# restore default
|
||||
set @@optimizer_switch= default;
|
||||
#
|
||||
# MDEV-38801 implement Item_cache_year shallow_copy()
|
||||
#
|
||||
CREATE TABLE t1 (c YEAR KEY);
|
||||
INSERT INTO t1 VALUES (2000),(2001);
|
||||
SELECT
|
||||
c,
|
||||
(c IN (SELECT *
|
||||
FROM
|
||||
(SELECT * FROM t1 GROUP BY c) AS d
|
||||
NATURAL JOIN
|
||||
(SELECT * FROM t1) AS e
|
||||
)
|
||||
) FROM t1;
|
||||
c (c IN (SELECT *
|
||||
FROM
|
||||
(SELECT * FROM t1 GROUP BY c) AS d
|
||||
NATURAL JOIN
|
||||
(SELECT * FROM t1) AS e
|
||||
)
|
||||
)
|
||||
2000 1
|
||||
2001 1
|
||||
DROP TABLE t1;
|
||||
# end of 10.11 tests
|
||||
|
||||
@@ -1743,3 +1743,23 @@ SET optimizer_switch=@save_optimizer_switch;
|
||||
|
||||
--echo # restore default
|
||||
set @@optimizer_switch= default;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-38801 implement Item_cache_year shallow_copy()
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (c YEAR KEY);
|
||||
INSERT INTO t1 VALUES (2000),(2001);
|
||||
SELECT
|
||||
c,
|
||||
(c IN (SELECT *
|
||||
FROM
|
||||
(SELECT * FROM t1 GROUP BY c) AS d
|
||||
NATURAL JOIN
|
||||
(SELECT * FROM t1) AS e
|
||||
)
|
||||
) FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # end of 10.11 tests
|
||||
|
||||
@@ -2752,6 +2752,46 @@ c
|
||||
0
|
||||
DROP TABLE t1;
|
||||
# end of 10.11 tests
|
||||
#
|
||||
# MDEV-41303 rand() in a semi-join subquery is checked on outer rows
|
||||
#
|
||||
create table t1 (a int);
|
||||
insert into t1 values (1),(2),(3),(100);
|
||||
create table t2 (c int, d int);
|
||||
insert into t2 select 1, 1 from seq_1_to_80;
|
||||
set @save_optimizer_switch= @@optimizer_switch;
|
||||
set optimizer_switch='firstmatch=off';
|
||||
# The subquery must check rand(1) < 0.09 on the 80 rows of t2.
|
||||
# Must produce count(*)=1, not 0.
|
||||
select count(*) from t1
|
||||
where t1.a in (select c from t2 where rand(1) < 0.09);
|
||||
count(*)
|
||||
1
|
||||
# Warning must have "<materialize>(...) JOIN..." and not
|
||||
# "`test`.`t1` semi join (`test`.`t2`)"
|
||||
explain extended
|
||||
select count(*) from t1
|
||||
where t1.a in (select c from t2 where rand(1) < 0.09);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 test.t1.a 1 100.00
|
||||
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 80 100.00 Using where
|
||||
Warnings:
|
||||
Note 1003 /* select#1 */ select count(0) AS `count(*)` from <materialize> (/* select#2 */ select `test`.`t2`.`c` from `test`.`t2` where rand(1) < 0.09) join `test`.`t1` where `<subquery2>`.`c` = `test`.`t1`.`a`
|
||||
# rand() in the outer WHERE does not prevent the conversion to a
|
||||
# semi-join.
|
||||
explain extended
|
||||
select count(*) from t1
|
||||
where rand(1) < 2 and t1.a in (select c from t2);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 100.00
|
||||
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 80 100.00
|
||||
Warnings:
|
||||
Note 1003 select count(0) AS `count(*)` from `test`.`t1` semi join (`test`.`t2`) where rand(1) < 2
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
drop table t1, t2;
|
||||
# end of 11.4 tests
|
||||
set @subselect_mat_test_optimizer_switch_value=null;
|
||||
set @@optimizer_switch='materialization=on,in_to_exists=off,semijoin=off';
|
||||
set optimizer_switch='mrr=on,mrr_sort_keys=on,index_condition_pushdown=on';
|
||||
|
||||
@@ -2778,3 +2778,43 @@ c
|
||||
0
|
||||
DROP TABLE t1;
|
||||
# end of 10.11 tests
|
||||
#
|
||||
# MDEV-41303 rand() in a semi-join subquery is checked on outer rows
|
||||
#
|
||||
create table t1 (a int);
|
||||
insert into t1 values (1),(2),(3),(100);
|
||||
create table t2 (c int, d int);
|
||||
insert into t2 select 1, 1 from seq_1_to_80;
|
||||
set @save_optimizer_switch= @@optimizer_switch;
|
||||
set optimizer_switch='firstmatch=off';
|
||||
# The subquery must check rand(1) < 0.09 on the 80 rows of t2.
|
||||
# Must produce count(*)=1, not 0.
|
||||
select count(*) from t1
|
||||
where t1.a in (select c from t2 where rand(1) < 0.09);
|
||||
count(*)
|
||||
1
|
||||
# Warning must have "<materialize>(...) JOIN..." and not
|
||||
# "`test`.`t1` semi join (`test`.`t2`)"
|
||||
explain extended
|
||||
select count(*) from t1
|
||||
where t1.a in (select c from t2 where rand(1) < 0.09);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 test.t1.a 1 100.00
|
||||
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 80 100.00 Using where
|
||||
Warnings:
|
||||
Note 1003 /* select#1 */ select count(0) AS `count(*)` from <materialize> (/* select#2 */ select `test`.`t2`.`c` from `test`.`t2` where rand(1) < 0.09) join `test`.`t1` where `<subquery2>`.`c` = `test`.`t1`.`a`
|
||||
# rand() in the outer WHERE does not prevent the conversion to a
|
||||
# semi-join.
|
||||
explain extended
|
||||
select count(*) from t1
|
||||
where rand(1) < 2 and t1.a in (select c from t2);
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 100.00 Using where
|
||||
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 100.00
|
||||
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 80 100.00
|
||||
Warnings:
|
||||
Note 1003 select count(0) AS `count(*)` from `test`.`t1` semi join (`test`.`t2`) where rand(1) < 2
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
drop table t1, t2;
|
||||
# end of 11.4 tests
|
||||
|
||||
@@ -2478,3 +2478,36 @@ SELECT * FROM t1 WHERE (0,0) IN (SELECT MAX(c),MIN(c) FROM t1);
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # end of 10.11 tests
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-41303 rand() in a semi-join subquery is checked on outer rows
|
||||
--echo #
|
||||
|
||||
create table t1 (a int);
|
||||
insert into t1 values (1),(2),(3),(100);
|
||||
create table t2 (c int, d int);
|
||||
insert into t2 select 1, 1 from seq_1_to_80;
|
||||
|
||||
set @save_optimizer_switch= @@optimizer_switch;
|
||||
set optimizer_switch='firstmatch=off';
|
||||
|
||||
--echo # The subquery must check rand(1) < 0.09 on the 80 rows of t2.
|
||||
--echo # Must produce count(*)=1, not 0.
|
||||
select count(*) from t1
|
||||
where t1.a in (select c from t2 where rand(1) < 0.09);
|
||||
--echo # Warning must have "<materialize>(...) JOIN..." and not
|
||||
--echo # "`test`.`t1` semi join (`test`.`t2`)"
|
||||
explain extended
|
||||
select count(*) from t1
|
||||
where t1.a in (select c from t2 where rand(1) < 0.09);
|
||||
|
||||
--echo # rand() in the outer WHERE does not prevent the conversion to a
|
||||
--echo # semi-join.
|
||||
explain extended
|
||||
select count(*) from t1
|
||||
where rand(1) < 2 and t1.a in (select c from t2);
|
||||
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
drop table t1, t2;
|
||||
|
||||
--echo # end of 11.4 tests
|
||||
|
||||
@@ -39,7 +39,9 @@ select * from t1;
|
||||
connection default;
|
||||
disconnect mqph;
|
||||
disconnect mqph2;
|
||||
--disable_warnings
|
||||
drop user mysqltest_1@localhost;
|
||||
--enable_warnings
|
||||
|
||||
# Test of MAX_UPDATES_PER_HOUR limit
|
||||
create user mysqltest_1@localhost;
|
||||
@@ -64,7 +66,9 @@ select * from t1;
|
||||
connection default;
|
||||
disconnect muph;
|
||||
disconnect muph2;
|
||||
--disable_warnings
|
||||
drop user mysqltest_1@localhost;
|
||||
--enable_warnings
|
||||
|
||||
# Test of MAX_CONNECTIONS_PER_HOUR limit
|
||||
create user mysqltest_1@localhost;
|
||||
@@ -233,6 +237,8 @@ select current_user();
|
||||
--disconnect con3
|
||||
--disconnect con1
|
||||
--connection default
|
||||
--disable_warnings
|
||||
drop user foo@'%';
|
||||
--enable_warnings
|
||||
|
||||
--echo # End of 10.2 tests
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
--- a/mysql-test/main/vector.result
|
||||
+++ b/mysql-test/main/vector.result
|
||||
--- vector.result
|
||||
+++ vector,aria.result
|
||||
@@ -1,5 +1,5 @@
|
||||
create temporary table t1 (id int auto_increment primary key, v vector(5) not null, vector index (v));
|
||||
-ERROR HY000: Cannot create VECTOR index on temporary MyISAM table
|
||||
@@ -581,6 +581,22 @@
|
||||
drop table t;
|
||||
#
|
||||
# MDEV-35821 - vector index sizes are not in INDEX_LENGTH
|
||||
@@ -903,13 +893,13 @@
|
||||
from information_schema.tables
|
||||
where table_schema = database() and table_name = 't1';
|
||||
index_length
|
||||
-49152
|
||||
+57344
|
||||
flush tables;
|
||||
select index_length
|
||||
from information_schema.tables
|
||||
where table_schema = database() and table_name = 't1';
|
||||
index_length
|
||||
-49152
|
||||
+57344
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-34805 INFORMATION_SCHEMA.VECTOR_INDEXES
|
||||
@@ -929,8 +919,8 @@
|
||||
TABLE_NAME t_vec
|
||||
INDEX_NAME vi
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
--- a/mysql-test/main/vector.result
|
||||
+++ b/mysql-test/main/vector.result
|
||||
--- vector.result
|
||||
+++ vector,myisam.result
|
||||
@@ -391,8 +391,30 @@
|
||||
create table t1 (id int auto_increment primary key, v vector(5) not null, vector index (v));
|
||||
insert t1 (id, v) values (1, x'e360d63ebe554f3fcdbc523f4522193f5236083d');
|
||||
@@ -520,6 +520,22 @@
|
||||
drop table t;
|
||||
#
|
||||
# MDEV-35821 - vector index sizes are not in INDEX_LENGTH
|
||||
@@ -903,13 +891,13 @@
|
||||
from information_schema.tables
|
||||
where table_schema = database() and table_name = 't1';
|
||||
index_length
|
||||
-49152
|
||||
+5144
|
||||
flush tables;
|
||||
select index_length
|
||||
from information_schema.tables
|
||||
where table_schema = database() and table_name = 't1';
|
||||
index_length
|
||||
-49152
|
||||
+5144
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-34805 INFORMATION_SCHEMA.VECTOR_INDEXES
|
||||
@@ -929,8 +917,8 @@
|
||||
TABLE_NAME t_vec
|
||||
INDEX_NAME vi
|
||||
|
||||
@@ -899,17 +899,17 @@ drop table t;
|
||||
#
|
||||
create table t1 (id int primary key, v vector(1) not null, vector index (v));
|
||||
insert into t1 values (1, vec_fromtext('[1]'));
|
||||
select index_length > 0 as has_index_length
|
||||
select index_length
|
||||
from information_schema.tables
|
||||
where table_schema = database() and table_name = 't1';
|
||||
has_index_length
|
||||
1
|
||||
index_length
|
||||
49152
|
||||
flush tables;
|
||||
select index_length > 0 as has_index_length
|
||||
select index_length
|
||||
from information_schema.tables
|
||||
where table_schema = database() and table_name = 't1';
|
||||
has_index_length
|
||||
1
|
||||
index_length
|
||||
49152
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-34805 INFORMATION_SCHEMA.VECTOR_INDEXES
|
||||
|
||||
@@ -448,13 +448,13 @@ drop table t;
|
||||
create table t1 (id int primary key, v vector(1) not null, vector index (v));
|
||||
insert into t1 values (1, vec_fromtext('[1]'));
|
||||
|
||||
select index_length > 0 as has_index_length
|
||||
select index_length
|
||||
from information_schema.tables
|
||||
where table_schema = database() and table_name = 't1';
|
||||
|
||||
flush tables;
|
||||
|
||||
select index_length > 0 as has_index_length
|
||||
select index_length
|
||||
from information_schema.tables
|
||||
where table_schema = database() and table_name = 't1';
|
||||
|
||||
|
||||
@@ -4841,5 +4841,36 @@ c1 c2
|
||||
2 2
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-28509: Access null pointer during add_key_field call
|
||||
#
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (1),(5),(7),(1);
|
||||
WITH cte AS (SELECT i FROM (SELECT i FROM t1 GROUP BY i) dt WINDOW w AS (PARTITION BY i))
|
||||
SELECT a.i FROM cte a JOIN cte b ON a.i=b.i WHERE a.i != 5;
|
||||
i
|
||||
1
|
||||
7
|
||||
# The same crash occurs when the WHERE uses < instead of !=.
|
||||
WITH cte AS (SELECT i FROM (SELECT i FROM t1 GROUP BY i) dt WINDOW w AS (PARTITION BY i))
|
||||
SELECT a.i FROM cte a JOIN cte b ON a.i=b.i WHERE a.i < 5;
|
||||
i
|
||||
1
|
||||
SET @save_sql_mode= @@sql_mode;
|
||||
SET sql_mode= ONLY_FULL_GROUP_BY;
|
||||
WITH cte AS (SELECT i FROM (SELECT i FROM t1 GROUP BY i) dt WINDOW w AS (PARTITION BY i))
|
||||
SELECT a.i FROM cte a JOIN cte b ON a.i=b.i WHERE a.i != 5;
|
||||
i
|
||||
1
|
||||
7
|
||||
WITH cte AS (SELECT i FROM (SELECT i FROM t1 GROUP BY i) dt WINDOW w AS (PARTITION BY i))
|
||||
SELECT a.i FROM cte a JOIN cte b ON a.i=b.i WHERE a.i < 5;
|
||||
i
|
||||
1
|
||||
# An unreferenced WINDOW does not exempt b.i from ONLY_FULL_GROUP_BY.
|
||||
SELECT b.i FROM t1 a, t1 b GROUP BY a.i WINDOW w AS (PARTITION BY a.i);
|
||||
ERROR 42000: 'test.b.i' isn't in GROUP BY
|
||||
SET @@sql_mode= @save_sql_mode;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 10.11 tests
|
||||
#
|
||||
|
||||
@@ -3120,6 +3120,33 @@ from t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-28509: Access null pointer during add_key_field call
|
||||
--echo #
|
||||
CREATE TABLE t1 (i INT);
|
||||
INSERT INTO t1 VALUES (1),(5),(7),(1);
|
||||
|
||||
WITH cte AS (SELECT i FROM (SELECT i FROM t1 GROUP BY i) dt WINDOW w AS (PARTITION BY i))
|
||||
SELECT a.i FROM cte a JOIN cte b ON a.i=b.i WHERE a.i != 5;
|
||||
|
||||
--echo # The same crash occurs when the WHERE uses < instead of !=.
|
||||
WITH cte AS (SELECT i FROM (SELECT i FROM t1 GROUP BY i) dt WINDOW w AS (PARTITION BY i))
|
||||
SELECT a.i FROM cte a JOIN cte b ON a.i=b.i WHERE a.i < 5;
|
||||
|
||||
SET @save_sql_mode= @@sql_mode;
|
||||
SET sql_mode= ONLY_FULL_GROUP_BY;
|
||||
WITH cte AS (SELECT i FROM (SELECT i FROM t1 GROUP BY i) dt WINDOW w AS (PARTITION BY i))
|
||||
SELECT a.i FROM cte a JOIN cte b ON a.i=b.i WHERE a.i != 5;
|
||||
WITH cte AS (SELECT i FROM (SELECT i FROM t1 GROUP BY i) dt WINDOW w AS (PARTITION BY i))
|
||||
SELECT a.i FROM cte a JOIN cte b ON a.i=b.i WHERE a.i < 5;
|
||||
|
||||
--echo # An unreferenced WINDOW does not exempt b.i from ONLY_FULL_GROUP_BY.
|
||||
--error ER_WRONG_FIELD_WITH_GROUP
|
||||
SELECT b.i FROM t1 a, t1 b GROUP BY a.i WINDOW w AS (PARTITION BY a.i);
|
||||
|
||||
SET @@sql_mode= @save_sql_mode;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.11 tests
|
||||
--echo #
|
||||
|
||||
@@ -115,3 +115,24 @@ pk a b bit_or bit_and bit_xor
|
||||
8 2 16 208 0 192
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
#
|
||||
# MDEV-40689: Sliding bit aggregates with NULL inputs
|
||||
#
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY,a INT,b INT);
|
||||
INSERT INTO t1 VALUES (1,0,NULL),(2,0,1),(3,0,2),(4,0,NULL),(5,0,3),(6,1,7),(7,1,NULL),(8,1,6),(9,1,0),(10,1,5),(11,1,NULL),(12,1,NULL);
|
||||
SELECT pk,b,BIT_AND(b) OVER w AS bit_and,BIT_OR(b) OVER w AS bit_or,BIT_XOR(b) OVER w AS bit_xor FROM t1 WINDOW w AS (ORDER BY pk ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) ORDER BY pk;
|
||||
pk b bit_and bit_or bit_xor
|
||||
1 NULL 18446744073709551615 0 0
|
||||
2 1 1 1 1
|
||||
3 2 0 3 3
|
||||
4 NULL 2 2 2
|
||||
5 3 3 3 3
|
||||
6 7 3 7 4
|
||||
7 NULL 7 7 7
|
||||
8 6 6 6 6
|
||||
9 0 0 6 6
|
||||
10 5 0 5 5
|
||||
11 NULL 5 5 5
|
||||
12 NULL 18446744073709551615 0 0
|
||||
DROP TABLE t1;
|
||||
# End of 11.4 tests
|
||||
|
||||
@@ -87,3 +87,12 @@ from t2;
|
||||
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-40689: Sliding bit aggregates with NULL inputs
|
||||
--echo #
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY,a INT,b INT);
|
||||
INSERT INTO t1 VALUES (1,0,NULL),(2,0,1),(3,0,2),(4,0,NULL),(5,0,3),(6,1,7),(7,1,NULL),(8,1,6),(9,1,0),(10,1,5),(11,1,NULL),(12,1,NULL);
|
||||
SELECT pk,b,BIT_AND(b) OVER w AS bit_and,BIT_OR(b) OVER w AS bit_or,BIT_XOR(b) OVER w AS bit_xor FROM t1 WINDOW w AS (ORDER BY pk ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) ORDER BY pk;
|
||||
DROP TABLE t1;
|
||||
--echo # End of 11.4 tests
|
||||
|
||||
@@ -49,6 +49,7 @@ sub skip_combinations {
|
||||
|
||||
$skip{'include/not_windows.inc'} = 'Requires not Windows' if IS_WINDOWS;
|
||||
$skip{'include/not_aix.inc'} = 'Requires not AIX' if IS_AIX;
|
||||
$skip{'include/not_mac.inc'} = 'Requires not macOS' if IS_MAC;
|
||||
$skip{'include/not_ssl.inc'} = 'Skipped if --ssl' if $::opt_ssl;
|
||||
|
||||
$skip{'main/plugin_loaderr.test'} = 'needs compiled-in innodb'
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
RESET MASTER;
|
||||
"engine: aria crash point: ddl_log_drop_after_drop_tables position: 1"
|
||||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `tABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB`,`tACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC`,`tADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD`,`tAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE`,`tAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF`,`tAGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG`,`tAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH`,`tAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII`,`tAJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ`,`tAKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK`,`tALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL` /* generated by ddl recovery */
|
||||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `tABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBv`,`tACCCCCCCCCCCCCCCCCCCCCCCCCCCCCCv`,`tADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDv`,`tAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEv`,`tAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFv`,`tAGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGv`,`tAHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHv`,`tAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIv`,`tAJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJv`,`tAKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKv` /* generated by ddl recovery */
|
||||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `tAMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM`,`tANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN`,`tAOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO`,`tAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP`,`tAQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ`,`tARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR`,`tASSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS`,`tATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT`,`tAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU`,`tAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV`,`tAWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW` /* generated by ddl recovery */
|
||||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `tALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLv`,`tAMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMv`,`tANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNv`,`tAOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOv`,`tAPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPv`,`tAQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQv`,`tARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRv`,`tASSSSSSSSSSSSSSSSSSSSSSSSSSSSSSv`,`tATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTv`,`tAUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUv`,`tAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVv` /* generated by ddl recovery */
|
||||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `tAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`,`tAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY`,`tAZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ`,`tBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA`,`tBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB`,`tBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC`,`tBDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD`,`tBEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE` /* generated by ddl recovery */
|
||||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `tAWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWv`,`tAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXv`,`tAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYv`,`tAZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZv`,`tBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv`,`tBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBv`,`tBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCv`,`tBDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDv`,`tBEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEv` /* generated by ddl recovery */
|
||||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `tabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`,`tacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`,`tadddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`,`taeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`,`taffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`,`tagggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg`,`tahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh`,`taiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii`,`tajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj`,`takkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk`,`tallllllllllllllllllllllllllllllllllllllllllllllllllllllllllll` /* generated by ddl recovery */
|
||||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `tabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbv`,`taccccccccccccccccccccccccccccccv`,`taddddddddddddddddddddddddddddddv`,`taeeeeeeeeeeeeeeeeeeeeeeeeeeeeeev`,`taffffffffffffffffffffffffffffffv`,`taggggggggggggggggggggggggggggggv`,`tahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhv`,`taiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiv`,`tajjjjjjjjjjjjjjjjjjjjjjjjjjjjjjv`,`takkkkkkkkkkkkkkkkkkkkkkkkkkkkkkv` /* generated by ddl recovery */
|
||||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `tammmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm`,`tannnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn`,`taoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo`,`tapppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp`,`taqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`,`tarrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr`,`tassssssssssssssssssssssssssssssssssssssssssssssssssssssssssss`,`tatttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt`,`tauuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu`,`tavvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv`,`tawwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww` /* generated by ddl recovery */
|
||||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `tallllllllllllllllllllllllllllllv`,`tammmmmmmmmmmmmmmmmmmmmmmmmmmmmmv`,`tannnnnnnnnnnnnnnnnnnnnnnnnnnnnnv`,`taoooooooooooooooooooooooooooooov`,`tappppppppppppppppppppppppppppppv`,`taqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv`,`tarrrrrrrrrrrrrrrrrrrrrrrrrrrrrrv`,`tassssssssssssssssssssssssssssssv`,`tattttttttttttttttttttttttttttttv`,`tauuuuuuuuuuuuuuuuuuuuuuuuuuuuuuv`,`tavvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv`,`tawwwwwwwwwwwwwwwwwwwwwwwwwwwwwwv` /* generated by ddl recovery */
|
||||
master-bin.000002 # Query # # use `test2`; DROP TABLE IF EXISTS `taxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`,`tayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy`,`tazzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz`,`tbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa`,`tbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb`,`tbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`,`tbdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd`,`tbeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee` /* generated by ddl recovery */
|
||||
master-bin.000002 # Query # # use `test2`; DROP VIEW IF EXISTS `taxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxv`,`tayyyyyyyyyyyyyyyyyyyyyyyyyyyyyyv`,`tazzzzzzzzzzzzzzzzzzzzzzzzzzzzzzv`,`tbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaav`,`tbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbv`,`tbccccccccccccccccccccccccccccccv`,`tbddddddddddddddddddddddddddddddv`,`tbeeeeeeeeeeeeeeeeeeeeeeeeeeeeeev` /* generated by ddl recovery */
|
||||
"engine: aria crash point: ddl_log_drop_before_binlog position: 1"
|
||||
master-bin.000002 # Query # # DROP DATABASE IF EXISTS `test2` /* generated by ddl recovery */
|
||||
Warnings:
|
||||
|
||||
@@ -58,8 +58,10 @@ while ($e < $engine_count)
|
||||
while ($t < $max_tables)
|
||||
{
|
||||
inc $t;
|
||||
let $name=`select concat("t",char(floor(65+$t/26)),repeat(char(65+mod($t,26)),60))`;
|
||||
let $view=`select concat("t",char(floor(65+$t/26)),repeat(char(65+mod($t,26)),30),'v')`;
|
||||
# Generate the names in lower case so that they are unchanged by a
|
||||
# lower_case_table_names setting of 1 or 2.
|
||||
let $name=`select concat("t",char(floor(ascii('a')+$t/26)),repeat(char(ascii('a')+mod($t,26)),60))`;
|
||||
let $view=`select concat("t",char(floor(ascii('a')+$t/26)),repeat(char(ascii('a')+mod($t,26)),30),'v')`;
|
||||
--eval create table $name (a int not null) $extra_option
|
||||
--eval create view $view as select * from $name
|
||||
}
|
||||
|
||||
@@ -198,8 +198,8 @@ INSERT INTO t1 values (3), (4);
|
||||
--let test6_t1_mid_checksum= `CHECKSUM TABLE t1`
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a int);
|
||||
--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 | MYSQL
|
||||
--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-2 | $MYSQL
|
||||
--echo # MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 --gtid-strict-mode | MYSQL
|
||||
--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM --start-position=0-1-2 --gtid-strict-mode | $MYSQL
|
||||
if ($test6_t1_mid_checksum != `CHECKSUM TABLE t1`)
|
||||
{
|
||||
die $data_inconsistent_err;
|
||||
@@ -468,8 +468,8 @@ if ($is_remote == 1)
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t3;
|
||||
}
|
||||
--echo # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 | MYSQL
|
||||
--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 | $MYSQL
|
||||
--echo # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 --gtid-strict-mode | MYSQL
|
||||
--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 --gtid-strict-mode | $MYSQL
|
||||
if ($t3_final_checksum != `CHECKSUM TABLE t3`)
|
||||
{
|
||||
die $data_inconsistent_err;
|
||||
@@ -578,9 +578,9 @@ if ($is_remote == 0)
|
||||
--echo # Error Case 3:
|
||||
--echo # A GTID --start-position with any sequence numbers that are not
|
||||
--echo # eventually processed results in error
|
||||
--echo # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 > tmp_out_ 2> err_out_
|
||||
--echo # MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 --gtid-strict-mode > tmp_out_ 2> err_out_
|
||||
--error 1
|
||||
--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 > $tmp_out_ 2> $err_out_
|
||||
--exec $MYSQL_BINLOG $BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 --gtid-strict-mode > $tmp_out_ 2> $err_out_
|
||||
if ($is_remote == 1)
|
||||
{
|
||||
--let SEARCH_PATTERN=ERROR: Got error reading packet from server
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
!include include/default_my.cnf
|
||||
|
||||
[mariadbd]
|
||||
slave_connections_needed_for_purge=0
|
||||
@@ -1,10 +0,0 @@
|
||||
CREATE TABLE t1(id INT);
|
||||
SHOW TABLES;
|
||||
Tables_in_test
|
||||
t1
|
||||
FLUSH LOGS;
|
||||
DROP TABLE t1;
|
||||
SHOW TABLES;
|
||||
Tables_in_test
|
||||
t1
|
||||
DROP TABLE t1;
|
||||
21
mysql-test/suite/binlog/r/binlog_bugs.result
Normal file
21
mysql-test/suite/binlog/r/binlog_bugs.result
Normal file
@@ -0,0 +1,21 @@
|
||||
CREATE TABLE t1(id INT);
|
||||
SHOW TABLES;
|
||||
Tables_in_test
|
||||
t1
|
||||
FLUSH LOGS;
|
||||
DROP TABLE t1;
|
||||
SHOW TABLES;
|
||||
Tables_in_test
|
||||
t1
|
||||
DROP TABLE t1;
|
||||
SET sql_mode='';
|
||||
CREATE TEMPORARY TABLE t ENGINE=MyISAM AS SELECT @a AS c;
|
||||
INSERT INTO t VALUES (0xABB0);
|
||||
SET autocommit=OFF;
|
||||
CREATE TABLE t (c INT PRIMARY KEY) ENGINE=MyISAM SELECT * FROM t FOR UPDATE;
|
||||
ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
|
||||
SET autocommit=ON;
|
||||
DROP TEMPORARY TABLE IF EXISTS t;
|
||||
DROP TABLE IF EXISTS t;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 'test.t'
|
||||
@@ -87,7 +87,7 @@ CREATE TABLE t1 (a int);
|
||||
INSERT INTO t1 values (3), (4);
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a int);
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 | MYSQL
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 --gtid-strict-mode | MYSQL
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
#
|
||||
@@ -181,7 +181,7 @@ DROP TABLE t1;
|
||||
# Successive binary logs (e.g. logs with previous logs that have been
|
||||
# purged) will write events when the --start-position matches their
|
||||
# Gtid_list_log_event state
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 | MYSQL
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 --gtid-strict-mode | MYSQL
|
||||
DROP TABLE t3;
|
||||
#
|
||||
# Test Case 22:
|
||||
@@ -208,7 +208,7 @@ FOUND 1 /ERROR: Binary logs are missing data for domain 0/ in err.out
|
||||
# Error Case 3:
|
||||
# A GTID --start-position with any sequence numbers that are not
|
||||
# eventually processed results in error
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 > tmp_out_ 2> err_out_
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 --gtid-strict-mode > tmp_out_ 2> err_out_
|
||||
FOUND 2 /ERROR: Binary logs never reached expected GTID state/ in err.out
|
||||
######################################
|
||||
# Test Group 2
|
||||
@@ -295,7 +295,7 @@ CREATE TABLE t1 (a int);
|
||||
INSERT INTO t1 values (3), (4);
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a int);
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 | MYSQL
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM --start-position=0-1-2 --gtid-strict-mode | MYSQL
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
#
|
||||
@@ -398,7 +398,7 @@ PURGE BINARY LOGS TO "master-bin.000002";
|
||||
DROP TABLE t1;
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t3;
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 | MYSQL
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-3,1-2-5 --gtid-strict-mode | MYSQL
|
||||
DROP TABLE t3;
|
||||
#
|
||||
# Test Case 22:
|
||||
@@ -440,7 +440,7 @@ FOUND 1 /ERROR: Got error reading packet from server/ in err.out
|
||||
# Error Case 3:
|
||||
# A GTID --start-position with any sequence numbers that are not
|
||||
# eventually processed results in error
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 > tmp_out_ 2> err_out_
|
||||
# MYSQL_BINLOG BINLOG_FILE_PARAM2 --start-position=0-1-8,1-2-6 --gtid-strict-mode > tmp_out_ 2> err_out_
|
||||
FOUND 1 /ERROR: Got error reading packet from server/ in err.out
|
||||
#
|
||||
# Remote-only cleanup from error cases
|
||||
|
||||
@@ -120,4 +120,4 @@ show status like "binlog_disk_use";
|
||||
Variable_name Value
|
||||
Binlog_disk_use 1228
|
||||
DROP TABLE IF EXISTS t1;
|
||||
set @@global.slave_connections_needed_for_purge= default;
|
||||
set @@global.slave_connections_needed_for_purge= 1;
|
||||
|
||||
9
mysql-test/suite/binlog/r/mdev_29803.result
Normal file
9
mysql-test/suite/binlog/r/mdev_29803.result
Normal file
@@ -0,0 +1,9 @@
|
||||
reset master;
|
||||
create table t1 (a int);
|
||||
create table t2 (a int);
|
||||
drop table t1, t2;
|
||||
flush binary logs;
|
||||
drop table if exists t1, t2;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 'test.t1,test.t2'
|
||||
flush binary logs;
|
||||
@@ -7,11 +7,11 @@
|
||||
# like \G or \C (which in turn leads to BUG#36391: "mysqlbinlog creates invalid charset statements".
|
||||
#
|
||||
# The test executes simple commands that are stored in the binary log and
|
||||
# re-execute them through the mysql client which should have to process
|
||||
# re-execute them through the mysql client which should have to process
|
||||
# some command shortcuts. The backslashes within strings is disabled in the file
|
||||
# rpl_bug36391-master.opt by the option --sql_mode=NO_BACKSLASH_ESCAPES.
|
||||
#
|
||||
#
|
||||
#
|
||||
|
||||
--source include/have_log_bin.inc
|
||||
--source include/have_binlog_format_mixed.inc
|
||||
@@ -28,3 +28,18 @@ SHOW TABLES;
|
||||
|
||||
# Clean up
|
||||
DROP TABLE t1;
|
||||
|
||||
# Test case for MDEV-38839
|
||||
# Assertion `(thd->state_flags & Open_tables_state::BACKUPS_AVAIL) ||
|
||||
# !thd->has_pending_row_events()' failed in close_thread_tables
|
||||
# on CREATE TABLE ... SELECT * FROM temp_table FOR UPDATE in MIXED binlog mode
|
||||
|
||||
SET sql_mode='';
|
||||
CREATE TEMPORARY TABLE t ENGINE=MyISAM AS SELECT @a AS c;
|
||||
INSERT INTO t VALUES (0xABB0);
|
||||
SET autocommit=OFF;
|
||||
--error ER_DUP_ENTRY
|
||||
CREATE TABLE t (c INT PRIMARY KEY) ENGINE=MyISAM SELECT * FROM t FOR UPDATE;
|
||||
SET autocommit=ON;
|
||||
DROP TEMPORARY TABLE IF EXISTS t;
|
||||
DROP TABLE IF EXISTS t;
|
||||
@@ -120,6 +120,17 @@ use warnings;
|
||||
use Fcntl qw(:DEFAULT :seek);
|
||||
sysopen F, $ENV{FILE_TO_CORRUPT}, O_RDWR
|
||||
or die "Cannot open file $ENV{FILE_TO_CORRUPT}: $!\n";
|
||||
|
||||
# Wait for the index file to be written (this happens asynchronously).
|
||||
my @s;
|
||||
for (1 .. 500) {
|
||||
@s= stat F;
|
||||
last if $s[7] >= 17; # Check file size
|
||||
select(undef, undef, undef, 0.1); # Portable sub-second sleep
|
||||
}
|
||||
die "Index file $ENV{FILE_TO_CORRUPT} never grew past $s[7] bytes\n"
|
||||
unless $s[7] >= 17;
|
||||
|
||||
# Corrupt the flag byte with an unused flag.
|
||||
sysseek(F, 16, SEEK_SET)
|
||||
or die "Cannot seek file: $!\n";
|
||||
|
||||
@@ -90,5 +90,5 @@ show status like "binlog_disk_use";
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--enable_warnings
|
||||
|
||||
set @@global.slave_connections_needed_for_purge= default;
|
||||
set @@global.slave_connections_needed_for_purge= 1;
|
||||
# End of 11.4 tests
|
||||
|
||||
36
mysql-test/suite/binlog/t/mdev_29803.test
Normal file
36
mysql-test/suite/binlog/t/mdev_29803.test
Normal file
@@ -0,0 +1,36 @@
|
||||
--source include/have_log_bin.inc
|
||||
|
||||
#
|
||||
# MDEV-29803: Unexpected ERROR: Found out of order GTID after replaying
|
||||
# binlog read from remote server, then reading the resulting local binlog.
|
||||
#
|
||||
# When mysqlbinlog replays a remote binlog into a server, and we then
|
||||
# read back the local binlog files, the replayed events reset the GTID
|
||||
# sequence, which causes a "Found out of order GTID" error if
|
||||
# --gtid-strict-mode is enabled.
|
||||
#
|
||||
# The fix is to change the default of --gtid-strict-mode to OFF so that
|
||||
# mysqlbinlog does not refuse to display events by default.
|
||||
#
|
||||
|
||||
reset master;
|
||||
create table t1 (a int);
|
||||
create table t2 (a int);
|
||||
drop table t1, t2;
|
||||
flush binary logs;
|
||||
|
||||
# Replay remote binlog into this server
|
||||
--exec $MYSQL_BINLOG --read-from-remote-server -uroot --protocol=tcp --port=$MASTER_MYPORT master-bin.000001 | $MYSQL test 2>&1
|
||||
|
||||
drop table if exists t1, t2;
|
||||
flush binary logs;
|
||||
|
||||
--let $datadir= `select @@datadir`
|
||||
|
||||
# With the fix, the default --gtid-strict-mode=OFF allows reading both binlog
|
||||
# files without error, even though replayed events create out-of-order GTIDs.
|
||||
--exec $MYSQL_BINLOG $datadir/master-bin.000001 $datadir/master-bin.000002 > /dev/null 2>&1
|
||||
|
||||
# Explicitly enabling --gtid-strict-mode should still produce an error
|
||||
--error 1
|
||||
--exec $MYSQL_BINLOG --gtid-strict-mode $datadir/master-bin.000001 $datadir/master-bin.000002 > /dev/null 2>&1
|
||||
@@ -1 +0,0 @@
|
||||
--slave_connections_needed_for_purge=0
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user