1
0
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:
Marko Mäkelä
2026-10-13 09:56:55 +03:00
456 changed files with 10475 additions and 3044 deletions

2
.gitignore vendored
View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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 */

View File

@@ -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 (;;)

View File

@@ -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()

View File

@@ -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()

View File

@@ -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)

View File

@@ -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:

View File

@@ -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_")

View File

@@ -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",

View File

@@ -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()
{

View File

@@ -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"

View File

@@ -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.

View File

@@ -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

View File

@@ -1,4 +1,3 @@
usr/include/mariadb/server
usr/lib/*/libmariadbd.a
usr/lib/*/libmariadbd.so
usr/lib/*/libmysqld.a

View File

@@ -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)

View File

@@ -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);

View File

@@ -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"

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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,^

View 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
}

View File

@@ -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]`"),

View File

@@ -0,0 +1,4 @@
#
# suite.pm will make sure that all tests including this file
# will be skipped if run under macOS
#

View File

@@ -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
}

View File

@@ -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
#

View File

@@ -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 #

View File

@@ -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

View File

@@ -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
#

View File

@@ -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 #

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
#

View File

@@ -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 #

View File

@@ -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

View File

@@ -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';

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1 @@
--lower-case-table-names=2

View 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;

View 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;

View 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;

View 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;

View File

@@ -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

View File

@@ -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,

View 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

View 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

View File

@@ -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

View File

@@ -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;

View File

@@ -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
#

View File

@@ -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 #

View File

@@ -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;

View File

@@ -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;

View File

@@ -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

View File

@@ -0,0 +1 @@
--log-bin

View 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

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 #

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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';

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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';

View File

@@ -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
#

View File

@@ -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 #

View File

@@ -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

View File

@@ -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

View File

@@ -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'

View File

@@ -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:

View File

@@ -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
}

View File

@@ -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

View File

@@ -1,4 +0,0 @@
!include include/default_my.cnf
[mariadbd]
slave_connections_needed_for_purge=0

View File

@@ -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;

View 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'

View File

@@ -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

View File

@@ -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;

View 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;

View File

@@ -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;

View File

@@ -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";

View File

@@ -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

View 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

View File

@@ -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