summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2019-06-18 11:30:06 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2019-06-18 11:30:06 +0300
commit3c88ce4cd112f696002d5f7461db68a3dafeb838 (patch)
tree8860f823877b8d816fbca45d9e6926bcbc8f012d
parent44d06cd39df2bdde6f7ac31d5340f1f683683c99 (diff)
parente85e4814eeca9123b23c23b40dd776416bfba2ca (diff)
downloadmariadb-git-3c88ce4cd112f696002d5f7461db68a3dafeb838.tar.gz
Merge 10.4 into 10.5
-rw-r--r--.clang-format18
-rw-r--r--.gitignore65
-rw-r--r--CMakeLists.txt13
-rw-r--r--client/CMakeLists.txt5
-rw-r--r--client/client_priv.h2
-rw-r--r--client/mysql.cc1
-rw-r--r--client/mysqladmin.cc1
-rw-r--r--client/mysqlbinlog.cc1
-rw-r--r--client/mysqldump.c1
-rw-r--r--client/mysqlimport.c1
-rw-r--r--client/mysqlshow.c1
-rw-r--r--client/mysqltest.cc1
-rw-r--r--cmake/check_compiler_flag.cmake3
-rw-r--r--cmake/install_macros.cmake15
-rw-r--r--cmake/mysql_add_executable.cmake12
-rw-r--r--cmake/ssl.cmake3
-rw-r--r--cmake/symlinks.cmake72
-rw-r--r--debian/additions/mysql.init (renamed from debian/mariadb-server-10.5.mysql.init)0
-rw-r--r--debian/mariadb-backup.install2
-rw-r--r--debian/mariadb-backup.links1
-rw-r--r--debian/mariadb-client-10.5.install11
-rw-r--r--debian/mariadb-client-10.5.links19
-rw-r--r--debian/mariadb-client-core-10.5.install2
-rw-r--r--debian/mariadb-client-core-10.5.links2
-rw-r--r--debian/mariadb-plugin-rocksdb.install2
-rw-r--r--debian/mariadb-plugin-rocksdb.links1
-rw-r--r--debian/mariadb-server-10.5.install12
-rw-r--r--debian/mariadb-server-10.5.links9
-rw-r--r--debian/mariadb-server-10.5.postinst6
-rw-r--r--debian/mariadb-server-10.5.postrm6
-rw-r--r--debian/mariadb-server-10.5.preinst11
-rw-r--r--debian/mariadb-server-core-10.5.install3
-rw-r--r--debian/mariadb-server-core-10.5.links3
-rw-r--r--debian/mariadb-test.install4
-rw-r--r--debian/mariadb-test.links4
-rw-r--r--extra/crc32-vpmsum/CMakeLists.txt2
-rw-r--r--extra/mariabackup/xtrabackup.cc2
-rw-r--r--extra/wolfssl/CMakeLists.txt51
-rw-r--r--extra/wolfssl/user_settings.h.in33
-rw-r--r--include/my_base.h1
-rw-r--r--include/sslopt-longopts.h5
-rw-r--r--include/sslopt-vars.h1
-rw-r--r--include/violite.h11
m---------libmariadb0
-rw-r--r--man/CMakeLists.txt40
-rw-r--r--mysql-test/main/ctype_utf8_def_upgrade.opt1
-rw-r--r--mysql-test/main/ctype_utf8_def_upgrade.result99
-rw-r--r--mysql-test/main/ctype_utf8_def_upgrade.test61
-rw-r--r--mysql-test/main/derived.result1
-rw-r--r--mysql-test/main/derived.test3
-rw-r--r--mysql-test/main/derived_view.result6
-rw-r--r--mysql-test/main/derived_view.test2
-rw-r--r--mysql-test/main/grant5.result25
-rw-r--r--mysql-test/main/grant5.test38
-rw-r--r--mysql-test/main/join.result2
-rw-r--r--mysql-test/main/join_nested.result33
-rw-r--r--mysql-test/main/join_nested.test34
-rw-r--r--mysql-test/main/join_nested_jcl6.result33
-rw-r--r--mysql-test/main/mdev13607.result30
-rw-r--r--mysql-test/main/multi_update.result30
-rw-r--r--mysql-test/main/multi_update.test38
-rw-r--r--mysql-test/main/multi_update_debug.result16
-rw-r--r--mysql-test/main/multi_update_debug.test27
-rw-r--r--mysql-test/main/multi_update_innodb.result17
-rw-r--r--mysql-test/main/multi_update_innodb.test22
-rw-r--r--mysql-test/main/mysqld--help.result2
-rw-r--r--mysql-test/main/mysqld--help.test2
-rw-r--r--mysql-test/main/openssl_6975.test24
-rw-r--r--mysql-test/main/plugin_auth_qa_1.result3
-rw-r--r--mysql-test/main/plugin_auth_qa_1.test4
-rw-r--r--mysql-test/main/range_innodb.result18
-rw-r--r--mysql-test/main/range_innodb.test19
-rw-r--r--mysql-test/main/subselect.result2
-rw-r--r--mysql-test/main/subselect_mat.result89
-rw-r--r--mysql-test/main/subselect_no_exists_to_in.result2
-rw-r--r--mysql-test/main/subselect_no_mat.result2
-rw-r--r--mysql-test/main/subselect_no_opts.result2
-rw-r--r--mysql-test/main/subselect_no_scache.result2
-rw-r--r--mysql-test/main/subselect_no_semijoin.result2
-rw-r--r--mysql-test/main/subselect_sj_mat.result89
-rw-r--r--mysql-test/main/subselect_sj_mat.test75
-rw-r--r--mysql-test/main/tls_version.opt1
-rw-r--r--mysql-test/main/tls_version.result14
-rw-r--r--mysql-test/main/tls_version.test24
-rw-r--r--mysql-test/suite/encryption/r/innodb_lotoftables.result1171
-rw-r--r--mysql-test/suite/encryption/t/innodb_lotoftables.opt3
-rw-r--r--mysql-test/suite/encryption/t/innodb_lotoftables.test207
-rw-r--r--mysql-test/suite/galera/disabled.def2
-rw-r--r--mysql-test/suite/heap/heap.result21
-rw-r--r--mysql-test/suite/heap/heap.test1
-rw-r--r--mysql-test/suite/innodb/r/innodb-64k-crash.result324
-rw-r--r--mysql-test/suite/innodb/t/innodb-64k-crash.test83
-rw-r--r--mysql-test/suite/innodb/t/leaf_page_corrupted_during_recovery.test3
-rw-r--r--mysql-test/suite/plugins/r/server_audit.result2
-rw-r--r--mysql-test/suite/plugins/r/thread_pool_server_audit.result2
-rw-r--r--mysql-test/suite/rpl/disabled.def1
-rw-r--r--mysql-test/suite/rpl/include/rpl_blackhole.test2
-rw-r--r--mysql-test/suite/rpl/include/rpl_blackhole_basic.test97
-rw-r--r--mysql-test/suite/rpl/r/rpl_blackhole.result9
-rw-r--r--mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result457
-rw-r--r--mysql-test/suite/rpl/t/rpl_blackhole.test77
-rw-r--r--mysql-test/suite/rpl/t/rpl_blackhole_row_annotate-master.opt1
-rw-r--r--mysql-test/suite/rpl/t/rpl_blackhole_row_annotate-slave.opt1
-rw-r--r--mysql-test/suite/rpl/t/rpl_blackhole_row_annotate.test49
-rw-r--r--mysql-test/suite/sys_vars/inc/sysvars_server.inc2
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_server_embedded.result12
-rw-r--r--mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result12
-rw-r--r--mysql-test/suite/versioning/r/create.result4
-rw-r--r--mysql-test/suite/versioning/r/simple.result127
-rw-r--r--mysql-test/suite/versioning/t/simple.test16
-rw-r--r--mysql-test/suite/wsrep/disabled.def15
-rw-r--r--mysql-test/unstable-tests1
-rw-r--r--plugin/auth_pam/auth_pam.c2
-rw-r--r--plugin/disks/information_schema_disks.cc2
-rw-r--r--scripts/CMakeLists.txt1
-rw-r--r--sql/handler.cc28
-rw-r--r--sql/item_sum.cc6
-rw-r--r--sql/my_json_writer.cc8
-rw-r--r--sql/my_json_writer.h1
-rw-r--r--sql/mysqld.cc10
-rw-r--r--sql/mysqld.h2
-rw-r--r--sql/opt_range.h10
-rw-r--r--sql/rpl_mi.cc2
-rw-r--r--sql/sql_acl.cc79
-rw-r--r--sql/sql_acl_getsort.ic205
-rw-r--r--sql/sql_alter.cc12
-rw-r--r--sql/sql_alter.h5
-rw-r--r--sql/sql_base.cc11
-rw-r--r--sql/sql_base.h14
-rw-r--r--sql/sql_cmd.h51
-rw-r--r--sql/sql_explain.cc6
-rw-r--r--sql/sql_join_cache.cc3
-rw-r--r--sql/sql_lex.cc5
-rw-r--r--sql/sql_parse.cc281
-rw-r--r--sql/sql_select.cc110
-rw-r--r--sql/sql_show.cc6
-rw-r--r--sql/sql_table.cc320
-rw-r--r--sql/sql_update.cc243
-rw-r--r--sql/sql_yacc.yy66
-rw-r--r--sql/sql_yacc_ora.yy66
-rw-r--r--sql/sys_vars.cc23
-rw-r--r--sql/table.cc21
-rw-r--r--storage/blackhole/ha_blackhole.cc30
-rw-r--r--storage/innobase/.clang-format10
-rw-r--r--storage/innobase/buf/buf0buf.cc24
-rw-r--r--storage/innobase/buf/buf0lru.cc26
-rw-r--r--storage/innobase/buf/buf0rea.cc5
-rw-r--r--storage/innobase/handler/ha_innodb.cc12
-rw-r--r--storage/innobase/include/buf0buf.ic2
-rw-r--r--storage/innobase/include/buf0lru.h14
-rw-r--r--storage/innobase/include/buf0types.h6
-rw-r--r--storage/innobase/row/row0row.cc14
-rw-r--r--storage/oqgraph/CMakeLists.txt2
-rw-r--r--storage/rocksdb/ha_rocksdb.cc2
-rw-r--r--storage/spider/spd_db_mysql.cc2
-rw-r--r--storage/spider/spd_table.cc162
-rw-r--r--storage/tokudb/PerconaFT/ft/logger/logger.cc8
-rw-r--r--support-files/CMakeLists.txt14
-rw-r--r--support-files/mariadb@.service.in210
-rw-r--r--tests/CMakeLists.txt4
-rw-r--r--vio/viosslfactories.c60
161 files changed, 3390 insertions, 2871 deletions
diff --git a/.clang-format b/.clang-format
new file mode 100644
index 00000000000..3b735b16d74
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,18 @@
+SpaceBeforeAssignmentOperators: false
+SpaceAfterCStyleCast: true
+
+BreakBeforeBraces: Custom
+BraceWrapping:
+ AfterClass: true
+ AfterControlStatement: true
+ AfterEnum: true
+ AfterFunction: true
+ AfterNamespace: true
+ AfterStruct: true
+ AfterUnion: true
+ AfterExternBlock: true
+ BeforeCatch: true
+ BeforeElse: true
+ SplitEmptyFunction: true
+ SplitEmptyRecord: true
+ SplitEmptyNamespace: true
diff --git a/.gitignore b/.gitignore
index 1739c9361d6..e0068c8f75f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -58,6 +58,7 @@ extra/perror
extra/replace
extra/resolve_stack_dump
extra/resolveip
+extra/wolfssl/user_settings.h
import_executables.cmake
include/*.h.tmp
include/config.h
@@ -524,3 +525,67 @@ compile_commands.json
# Clion && other JetBrains ides
.idea
+client/mariadb
+client/mariadb-admin
+client/mariadb-binlog
+client/mariadb-check
+client/mariadb-dump
+client/mariadb-import
+client/mariadb-plugin
+client/mariadb-show
+client/mariadb-slap
+client/mariadb-test
+client/mariadb-upgrade
+extra/mariabackup/mariadb-backup
+extra/mariadb-waitpid
+extra/mariadbd-safe-helper
+libmysqld/examples/mariadb-client-test-embedded
+libmysqld/examples/mariadb-embedded
+libmysqld/examples/mariadb-test-embedded
+man/mariadb-access.1
+man/mariadb-admin.1
+man/mariadb-backup.1
+man/mariadb-binlog.1
+man/mariadb-check.1
+man/mariadb-client-test-embedded.1
+man/mariadb-client-test.1
+man/mariadb-convert-table-format.1
+man/mariadb-dump.1
+man/mariadb-dumpslow.1
+man/mariadb-embedded.1
+man/mariadb-find-rows.1
+man/mariadb-fix-extensions.1
+man/mariadb-hotcopy.1
+man/mariadb-import.1
+man/mariadb-install-db.1
+man/mariadb-ldb.1
+man/mariadb-plugin.1
+man/mariadb-secure-installation.1
+man/mariadb-setpermission.1
+man/mariadb-show.1
+man/mariadb-slap.1
+man/mariadb-test-embedded.1
+man/mariadb-test.1
+man/mariadb-tzinfo-to-sql.1
+man/mariadb-upgrade.1
+man/mariadb-waitpid.1
+man/mariadb.1
+man/mariadbd-multi.1
+man/mariadbd-safe-helper.1
+man/mariadbd-safe.1
+man/mariadbd.8
+scripts/mariadb-access
+scripts/mariadb-convert-table-format
+scripts/mariadb-dumpslow
+scripts/mariadb-find-rows
+scripts/mariadb-fix-extensions
+scripts/mariadb-hotcopy
+scripts/mariadb-install-db
+scripts/mariadb-secure-installation
+scripts/mariadb-setpermission
+scripts/mariadbd-multi
+scripts/mariadbd-safe
+sql/mariadb-tzinfo-to-sql
+sql/mariadbd
+storage/rocksdb/mariadb-ldb
+tests/mariadb-client-test
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a327556d8d5..a3d38099262 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -165,6 +165,7 @@ INCLUDE(plugin)
INCLUDE(install_macros)
INCLUDE(systemd)
INCLUDE(mysql_add_executable)
+INCLUDE(symlinks)
INCLUDE(compile_flags)
INCLUDE(crc32)
@@ -194,6 +195,8 @@ INCLUDE(check_compiler_flag)
OPTION(WITH_ASAN "Enable address sanitizer" OFF)
IF (WITH_ASAN AND NOT MSVC)
+ # this flag might be set by default on some OS
+ MY_CHECK_AND_SET_COMPILER_FLAG("-U_FORTIFY_SOURCE" DEBUG RELWITHDEBINFO)
# gcc 4.8.1 and new versions of clang
MY_CHECK_AND_SET_COMPILER_FLAG("-fsanitize=address -fPIC"
DEBUG RELWITHDEBINFO)
@@ -227,22 +230,22 @@ ENDIF()
OPTION(WITH_UBSAN "Enable undefined behavior sanitizer" OFF)
IF (WITH_UBSAN)
- IF(SECURITY_HARDENED)
- MESSAGE(FATAL_ERROR "WITH_UBSAN and SECURITY_HARDENED are mutually exclusive")
- ENDIF()
- MY_CHECK_AND_SET_COMPILER_FLAG("-fsanitize=undefined -fno-sanitize=alignment" DEBUG RELWITHDEBINFO)
+ MY_CHECK_AND_SET_COMPILER_FLAG("-fsanitize=undefined -fno-sanitize=alignment -U_FORTIFY_SOURCE" DEBUG RELWITHDEBINFO)
ENDIF()
IF(NOT WITH_TSAN)
# enable security hardening features, like most distributions do
# in our benchmarks that costs about ~1% of performance, depending on the load
- IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "4.6")
+ IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "4.6" OR WITH_ASAN OR WITH_UBSAN)
SET(security_default OFF)
ELSE()
SET(security_default ON)
ENDIF()
OPTION(SECURITY_HARDENED "Use security-enhancing compiler features (stack protector, relro, etc)" ${security_default})
IF(SECURITY_HARDENED)
+ IF(WITH_ASAN OR WITH_UBSAN)
+ MESSAGE(FATAL_ERROR "WITH_ASAN/WITH_UBSAN and SECURITY_HARDENED are mutually exclusive")
+ ENDIF()
# security-enhancing flags
MY_CHECK_AND_SET_COMPILER_FLAG("-pie -fPIC")
MY_CHECK_AND_SET_COMPILER_FLAG("-Wl,-z,relro,-z,now")
diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt
index 37087b7c6c6..63e4cf36b00 100644
--- a/client/CMakeLists.txt
+++ b/client/CMakeLists.txt
@@ -56,7 +56,6 @@ TARGET_LINK_LIBRARIES(mysqlcheck ${CLIENT_LIB})
MYSQL_ADD_EXECUTABLE(mysqldump mysqldump.c ../sql-common/my_user.c)
TARGET_LINK_LIBRARIES(mysqldump ${CLIENT_LIB})
-
MYSQL_ADD_EXECUTABLE(mysqlimport mysqlimport.c)
SET_SOURCE_FILES_PROPERTIES(mysqlimport.c PROPERTIES COMPILE_FLAGS "-DTHREADS")
TARGET_LINK_LIBRARIES(mysqlimport ${CLIENT_LIB})
@@ -93,11 +92,9 @@ TARGET_LINK_LIBRARIES(async_example ${CLIENT_LIB})
SET_TARGET_PROPERTIES (mysqlcheck mysqldump mysqlimport mysql_upgrade mysqlshow mysqlslap mysql_plugin async_example
PROPERTIES HAS_CXX TRUE)
-
-FOREACH(t mysql mysqltest mysqltest mysqlcheck mysqldump mysqlimport mysql_upgrade mysqlshow mysql_plugin mysqlbinlog
+FOREACH(t mysql mysqltest mysqlcheck mysqldump mysqlimport mysql_upgrade mysqlshow mysql_plugin mysqlbinlog
mysqladmin mysqlslap async_example)
ADD_DEPENDENCIES(${t} GenError ${CLIENT_LIB})
ENDFOREACH()
ADD_DEFINITIONS(-DHAVE_DLOPEN)
-
diff --git a/client/client_priv.h b/client/client_priv.h
index 5b6b31ccda9..3ad46cf4b9b 100644
--- a/client/client_priv.h
+++ b/client/client_priv.h
@@ -46,7 +46,7 @@ enum options_client
OPT_MAX_ALLOWED_PACKET, OPT_NET_BUFFER_LENGTH,
OPT_SELECT_LIMIT, OPT_MAX_JOIN_SIZE, OPT_SSL_SSL,
OPT_SSL_KEY, OPT_SSL_CERT, OPT_SSL_CA, OPT_SSL_CAPATH,
- OPT_SSL_CIPHER, OPT_SHUTDOWN_TIMEOUT, OPT_LOCAL_INFILE,
+ OPT_SSL_CIPHER, OPT_TLS_VERSION, OPT_SHUTDOWN_TIMEOUT, OPT_LOCAL_INFILE,
OPT_DELETE_MASTER_LOGS, OPT_COMPACT,
OPT_PROMPT, OPT_IGN_LINES,OPT_TRANSACTION,OPT_MYSQL_PROTOCOL,
OPT_FRM, OPT_SKIP_OPTIMIZATION,
diff --git a/client/mysql.cc b/client/mysql.cc
index f1311991afe..c38ce6bc962 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -1363,6 +1363,7 @@ static bool do_connect(MYSQL *mysql, const char *host, const char *user,
opt_ssl_capath, opt_ssl_cipher);
mysql_options(mysql, MYSQL_OPT_SSL_CRL, opt_ssl_crl);
mysql_options(mysql, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath);
+ mysql_options(mysql, MARIADB_OPT_TLS_VERSION, opt_tls_version);
}
mysql_options(mysql,MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
(char*)&opt_ssl_verify_server_cert);
diff --git a/client/mysqladmin.cc b/client/mysqladmin.cc
index 3ad6ae40ab2..10b56f10228 100644
--- a/client/mysqladmin.cc
+++ b/client/mysqladmin.cc
@@ -359,6 +359,7 @@ int main(int argc,char *argv[])
opt_ssl_capath, opt_ssl_cipher);
mysql_options(&mysql, MYSQL_OPT_SSL_CRL, opt_ssl_crl);
mysql_options(&mysql, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath);
+ mysql_options(&mysql, MARIADB_OPT_TLS_VERSION, opt_tls_version);
}
mysql_options(&mysql,MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
(char*)&opt_ssl_verify_server_cert);
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc
index 090d743c61b..93e23b106c2 100644
--- a/client/mysqlbinlog.cc
+++ b/client/mysqlbinlog.cc
@@ -2126,6 +2126,7 @@ static Exit_status safe_connect()
opt_ssl_capath, opt_ssl_cipher);
mysql_options(mysql, MYSQL_OPT_SSL_CRL, opt_ssl_crl);
mysql_options(mysql, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath);
+ mysql_options(mysql, MARIADB_OPT_TLS_VERSION, opt_tls_version);
}
mysql_options(mysql,MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
(char*)&opt_ssl_verify_server_cert);
diff --git a/client/mysqldump.c b/client/mysqldump.c
index f1d59b449af..38db869c7ac 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -1709,6 +1709,7 @@ static int connect_to_db(char *host, char *user,char *passwd)
opt_ssl_capath, opt_ssl_cipher);
mysql_options(&mysql_connection, MYSQL_OPT_SSL_CRL, opt_ssl_crl);
mysql_options(&mysql_connection, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath);
+ mysql_options(&mysql_connection, MARIADB_OPT_TLS_VERSION, opt_tls_version);
}
mysql_options(&mysql_connection,MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
(char*)&opt_ssl_verify_server_cert);
diff --git a/client/mysqlimport.c b/client/mysqlimport.c
index 3e250bdd9ed..619def5f123 100644
--- a/client/mysqlimport.c
+++ b/client/mysqlimport.c
@@ -448,6 +448,7 @@ static MYSQL *db_connect(char *host, char *database,
opt_ssl_capath, opt_ssl_cipher);
mysql_options(mysql, MYSQL_OPT_SSL_CRL, opt_ssl_crl);
mysql_options(mysql, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath);
+ mysql_options(mysql, MARIADB_OPT_TLS_VERSION, opt_tls_version);
}
mysql_options(mysql,MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
(char*)&opt_ssl_verify_server_cert);
diff --git a/client/mysqlshow.c b/client/mysqlshow.c
index 54c2a6e39fa..9885b219171 100644
--- a/client/mysqlshow.c
+++ b/client/mysqlshow.c
@@ -122,6 +122,7 @@ int main(int argc, char **argv)
opt_ssl_capath, opt_ssl_cipher);
mysql_options(&mysql, MYSQL_OPT_SSL_CRL, opt_ssl_crl);
mysql_options(&mysql, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath);
+ mysql_options(&mysql, MARIADB_OPT_TLS_VERSION, opt_tls_version);
}
mysql_options(&mysql,MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
(char*)&opt_ssl_verify_server_cert);
diff --git a/client/mysqltest.cc b/client/mysqltest.cc
index 8145a478104..ffa22c80c3e 100644
--- a/client/mysqltest.cc
+++ b/client/mysqltest.cc
@@ -6068,6 +6068,7 @@ void do_connect(struct st_command *command)
opt_ssl_capath, ssl_cipher ? ssl_cipher : opt_ssl_cipher);
mysql_options(con_slot->mysql, MYSQL_OPT_SSL_CRL, opt_ssl_crl);
mysql_options(con_slot->mysql, MYSQL_OPT_SSL_CRLPATH, opt_ssl_crlpath);
+ mysql_options(con_slot->mysql, MARIADB_OPT_TLS_VERSION, opt_tls_version);
#if MYSQL_VERSION_ID >= 50000
/* Turn on ssl_verify_server_cert only if host is "localhost" */
opt_ssl_verify_server_cert= !strcmp(ds_host.str, "localhost");
diff --git a/cmake/check_compiler_flag.cmake b/cmake/check_compiler_flag.cmake
index ab5a15f8457..3c05c6bafd3 100644
--- a/cmake/check_compiler_flag.cmake
+++ b/cmake/check_compiler_flag.cmake
@@ -13,7 +13,8 @@ SET(fail_patterns
FAIL_REGEX "warning:.*redefined"
FAIL_REGEX "[Ww]arning: [Oo]ption"
)
-
+#The regex patterns above are not localized, thus LANG=C
+SET(ENV{LANG} C)
MACRO (MY_CHECK_C_COMPILER_FLAG flag)
STRING(REGEX REPLACE "[-,= +]" "_" result "have_C_${flag}")
SET(SAVE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
diff --git a/cmake/install_macros.cmake b/cmake/install_macros.cmake
index f28720e97bc..f04ab691af1 100644
--- a/cmake/install_macros.cmake
+++ b/cmake/install_macros.cmake
@@ -71,9 +71,10 @@ FUNCTION(INSTALL_MANPAGE file)
${MYSQL_DOC_DIR}/man/*${file}.8*
${GLOB_EXPR}
)
- ENDIF()
+ ENDIF()
FILE(GLOB_RECURSE MANPAGES ${GLOB_EXPR})
+
IF(MANPAGES)
LIST(GET MANPAGES 0 MANPAGE)
STRING(REPLACE "${file}man.1" "${file}.1" MANPAGE "${MANPAGE}")
@@ -100,19 +101,17 @@ FUNCTION(INSTALL_SCRIPT)
IF(NOT ARG_DESTINATION)
SET(ARG_DESTINATION ${INSTALL_BINDIR})
ENDIF()
- IF(ARG_COMPONENT)
- SET(COMP COMPONENT ${ARG_COMPONENT})
- ELSE()
- SET(COMP)
- ENDIF()
+ SET(COMP ${ARG_COMPONENT})
IF (COMP MATCHES ${SKIP_COMPONENTS})
RETURN()
ENDIF()
- INSTALL(PROGRAMS ${script} DESTINATION ${ARG_DESTINATION} ${COMP})
+ INSTALL(PROGRAMS ${script} DESTINATION ${ARG_DESTINATION} COMPONENT ${COMP})
+ get_filename_component(dest "${script}" NAME)
+ CREATE_MARIADB_SYMLINK(${dest} ${ARG_DESTINATION} ${COMP})
- INSTALL_MANPAGE(${script})
+ INSTALL_MANPAGE(${dest})
ENDFUNCTION()
diff --git a/cmake/mysql_add_executable.cmake b/cmake/mysql_add_executable.cmake
index d3a888f9a75..54fdab7b17c 100644
--- a/cmake/mysql_add_executable.cmake
+++ b/cmake/mysql_add_executable.cmake
@@ -63,21 +63,25 @@ FUNCTION (MYSQL_ADD_EXECUTABLE)
UNSET(EXCLUDE_FROM_ALL)
ENDIF()
ADD_EXECUTABLE(${target} ${WIN32} ${MACOSX_BUNDLE} ${EXCLUDE_FROM_ALL} ${sources})
+
# tell CPack where to install
IF(NOT ARG_EXCLUDE_FROM_ALL)
IF(NOT ARG_DESTINATION)
SET(ARG_DESTINATION ${INSTALL_BINDIR})
ENDIF()
IF(ARG_COMPONENT)
- SET(COMP COMPONENT ${ARG_COMPONENT})
+ SET(COMP ${ARG_COMPONENT})
ELSEIF(MYSQL_INSTALL_COMPONENT)
- SET(COMP COMPONENT ${MYSQL_INSTALL_COMPONENT})
+ SET(COMP ${MYSQL_INSTALL_COMPONENT})
ELSE()
- SET(COMP COMPONENT Client)
+ SET(COMP Client)
ENDIF()
IF (COMP MATCHES ${SKIP_COMPONENTS})
RETURN()
ENDIF()
- MYSQL_INSTALL_TARGETS(${target} DESTINATION ${ARG_DESTINATION} ${COMP})
+ MYSQL_INSTALL_TARGETS(${target} DESTINATION ${ARG_DESTINATION} COMPONENT ${COMP})
ENDIF()
+
+ # create mariadb named symlink
+ CREATE_MARIADB_SYMLINK(${target} ${ARG_DESTINATION} ${COMP})
ENDFUNCTION()
diff --git a/cmake/ssl.cmake b/cmake/ssl.cmake
index 7a571171eaf..bcb4a512126 100644
--- a/cmake/ssl.cmake
+++ b/cmake/ssl.cmake
@@ -49,12 +49,13 @@ ENDMACRO()
MACRO (MYSQL_USE_BUNDLED_SSL)
SET(INC_DIRS
+ ${CMAKE_BINARY_DIR}/extra/wolfssl
${CMAKE_SOURCE_DIR}/extra/wolfssl/wolfssl
${CMAKE_SOURCE_DIR}/extra/wolfssl/wolfssl/wolfssl
)
SET(SSL_LIBRARIES wolfssl wolfcrypt)
SET(SSL_INCLUDE_DIRS ${INC_DIRS})
- SET(SSL_DEFINES "-DHAVE_OPENSSL -DHAVE_WOLFSSL -DOPENSSL_ALL -DWOLFSSL_MYSQL_COMPATIBLE -DWC_NO_HARDEN")
+ SET(SSL_DEFINES "-DHAVE_OPENSSL -DHAVE_WOLFSSL -DWOLFSSL_USER_SETTINGS")
SET(HAVE_ERR_remove_thread_state ON CACHE INTERNAL "wolfssl doesn't have ERR_remove_thread_state")
SET(HAVE_EncryptAes128Ctr OFF CACHE INTERNAL "wolfssl does support AES-CTR, but differently from openssl")
SET(HAVE_EncryptAes128Gcm OFF CACHE INTERNAL "wolfssl does not support AES-GCM")
diff --git a/cmake/symlinks.cmake b/cmake/symlinks.cmake
new file mode 100644
index 00000000000..251532892c2
--- /dev/null
+++ b/cmake/symlinks.cmake
@@ -0,0 +1,72 @@
+# Create lists
+macro(REGISTER_SYMLINK from to)
+ list(APPEND MARIADB_SYMLINK_FROMS ${from})
+ list(APPEND MARIADB_SYMLINK_TOS ${to})
+endmacro()
+
+# MariaDB names for executables
+REGISTER_SYMLINK("mysql" "mariadb")
+REGISTER_SYMLINK("mysqlaccess" "mariadb-access")
+REGISTER_SYMLINK("mysqladmin" "mariadb-admin")
+REGISTER_SYMLINK("mariabackup" "mariadb-backup")
+REGISTER_SYMLINK("mysqlbinlog" "mariadb-binlog")
+REGISTER_SYMLINK("mysqlcheck" "mariadb-check")
+REGISTER_SYMLINK("mysql_client_test_embedded" "mariadb-client-test-embedded")
+REGISTER_SYMLINK("mysql_client_test" "mariadb-client-test")
+REGISTER_SYMLINK("mariadb_config" "mariadb-config")
+REGISTER_SYMLINK("mysql_convert_table_format" "mariadb-convert-table-format")
+REGISTER_SYMLINK("mysqldump" "mariadb-dump")
+REGISTER_SYMLINK("mysqldumpslow" "mariadb-dumpslow")
+REGISTER_SYMLINK("mysql_embedded" "mariadb-embedded")
+REGISTER_SYMLINK("mysql_find_rows" "mariadb-find-rows")
+REGISTER_SYMLINK("mysql_fix_extensions" "mariadb-fix-extensions")
+REGISTER_SYMLINK("mysqlhotcopy" "mariadb-hotcopy")
+REGISTER_SYMLINK("mysqlimport" "mariadb-import")
+REGISTER_SYMLINK("mysql_install_db" "mariadb-install-db")
+REGISTER_SYMLINK("mysql_ldb" "mariadb-ldb")
+REGISTER_SYMLINK("mysql_plugin" "mariadb-plugin")
+REGISTER_SYMLINK("mysql_secure_installation" "mariadb-secure-installation")
+REGISTER_SYMLINK("mysql_setpermission" "mariadb-setpermission")
+REGISTER_SYMLINK("mysqlshow" "mariadb-show")
+REGISTER_SYMLINK("mysqlslap" "mariadb-slap")
+REGISTER_SYMLINK("mysqltest" "mariadb-test")
+REGISTER_SYMLINK("mysqltest_embedded" "mariadb-test-embedded")
+REGISTER_SYMLINK("mysql_tzinfo_to_sql" "mariadb-tzinfo-to-sql")
+REGISTER_SYMLINK("mysql_upgrade" "mariadb-upgrade")
+REGISTER_SYMLINK("mysql_upgrade_service" "mariadb-upgrade-service")
+REGISTER_SYMLINK("mysql_upgrade_wizard" "mariadb-upgrade-wizard")
+REGISTER_SYMLINK("mysql_waitpid" "mariadb-waitpid")
+REGISTER_SYMLINK("mysqld" "mariadbd")
+REGISTER_SYMLINK("mysqld_multi" "mariadbd-multi")
+REGISTER_SYMLINK("mysqld_safe" "mariadbd-safe")
+REGISTER_SYMLINK("mysqld_safe_helper" "mariadbd-safe-helper")
+
+# Add MariaDB symlinks
+macro(CREATE_MARIADB_SYMLINK src dir comp)
+ # Find the MariaDB name for executable
+ list(FIND MARIADB_SYMLINK_FROMS ${src} _index)
+
+ if (${_index} GREATER -1)
+ list(GET MARIADB_SYMLINK_TOS ${_index} mariadbname)
+ endif()
+
+ if (mariadbname)
+ CREATE_MARIADB_SYMLINK_IN_DIR(${src} ${mariadbname} ${dir} ${comp})
+ endif()
+endmacro(CREATE_MARIADB_SYMLINK)
+
+# Add MariaDB symlinks in directory
+macro(CREATE_MARIADB_SYMLINK_IN_DIR src dest dir comp)
+ if(UNIX)
+ add_custom_target(
+ SYM_${dest} ALL
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${dest}
+ )
+
+ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${dest} POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E create_symlink ${src} ${dest}
+ COMMENT "mklink ${src} -> ${dest}")
+
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${dest} DESTINATION ${dir} COMPONENT ${comp})
+ endif()
+endmacro(CREATE_MARIADB_SYMLINK_IN_DIR)
diff --git a/debian/mariadb-server-10.5.mysql.init b/debian/additions/mysql.init
index 0d4c6019ab5..0d4c6019ab5 100644
--- a/debian/mariadb-server-10.5.mysql.init
+++ b/debian/additions/mysql.init
diff --git a/debian/mariadb-backup.install b/debian/mariadb-backup.install
index 734117c92e2..21a32860b0c 100644
--- a/debian/mariadb-backup.install
+++ b/debian/mariadb-backup.install
@@ -1,2 +1,4 @@
usr/bin/mariabackup
usr/bin/mbstream
+usr/share/man/man1/mariabackup.1
+usr/share/man/man1/mariadb-backup.1
diff --git a/debian/mariadb-backup.links b/debian/mariadb-backup.links
new file mode 100644
index 00000000000..7980ef5e54d
--- /dev/null
+++ b/debian/mariadb-backup.links
@@ -0,0 +1 @@
+usr/bin/mariabackup usr/bin/mariadb-backup
diff --git a/debian/mariadb-client-10.5.install b/debian/mariadb-client-10.5.install
index 945bf77c689..9cb4ee3dede 100644
--- a/debian/mariadb-client-10.5.install
+++ b/debian/mariadb-client-10.5.install
@@ -20,3 +20,14 @@ usr/share/man/man1/mysqldumpslow.1
usr/share/man/man1/mysqlimport.1
usr/share/man/man1/mysqlshow.1
usr/share/man/man1/mysqlslap.1
+usr/share/man/man1/mariadb-access.1
+usr/share/man/man1/mariadb-admin.1
+usr/share/man/man1/mariadb-binlog.1
+usr/share/man/man1/mariadb-dump.1
+usr/share/man/man1/mariadb-dumpslow.1
+usr/share/man/man1/mariadb-find-rows.1
+usr/share/man/man1/mariadb-fix-extensions.1
+usr/share/man/man1/mariadb-import.1
+usr/share/man/man1/mariadb-plugin.1
+usr/share/man/man1/mariadb-slap.1
+usr/share/man/man1/mariadb-waitpid.1
diff --git a/debian/mariadb-client-10.5.links b/debian/mariadb-client-10.5.links
index 4a504969246..5d966575b76 100644
--- a/debian/mariadb-client-10.5.links
+++ b/debian/mariadb-client-10.5.links
@@ -1,6 +1,25 @@
+usr/bin/mysql_find_rows usr/bin/mariadb-find-rows
+usr/bin/mysql_fix_extensions usr/bin/mariadb-fix-extensions
+usr/bin/mysql_plugin usr/bin/mariadb-plugin
+usr/bin/mysql_waitpid usr/bin/mariadb-waitpid
+usr/bin/mysqlaccess usr/bin/mariadb-access
+usr/bin/mysqladmin usr/bin/mariadb-admin
+usr/bin/mysqlbinlog usr/bin/mariadb-binlog
+usr/bin/mysqlcheck usr/bin/mariadb-analyze
+usr/bin/mysqlcheck usr/bin/mariadb-optimize
+usr/bin/mysqlcheck usr/bin/mariadb-repair
usr/bin/mysqlcheck usr/bin/mysqlanalyze
usr/bin/mysqlcheck usr/bin/mysqloptimize
usr/bin/mysqlcheck usr/bin/mysqlrepair
+usr/bin/mysqldump usr/bin/mariadb-dump
+usr/bin/mysqldumpslow usr/bin/mariadb-dumpslow
+usr/bin/mysqlimport usr/bin/mariadb-import
+usr/bin/mysqlreport usr/bin/mariadb-report
+usr/bin/mysqlslap usr/bin/mariadb-slap
+usr/share/man/man1/mysqlcheck.1.gz usr/share/man/man1/mariadb-analyze.1.gz
+usr/share/man/man1/mysqlcheck.1.gz usr/share/man/man1/mariadb-optimize.1.gz
+usr/share/man/man1/mysqlcheck.1.gz usr/share/man/man1/mariadb-repair.1.gz
usr/share/man/man1/mysqlcheck.1.gz usr/share/man/man1/mysqlanalyze.1.gz
usr/share/man/man1/mysqlcheck.1.gz usr/share/man/man1/mysqloptimize.1.gz
usr/share/man/man1/mysqlcheck.1.gz usr/share/man/man1/mysqlrepair.1.gz
+usr/share/man/man1/mysqlreport.1.gz usr/share/man/man1/mariadb-report.1.gz
diff --git a/debian/mariadb-client-core-10.5.install b/debian/mariadb-client-core-10.5.install
index a2781309439..0706b272e8a 100644
--- a/debian/mariadb-client-core-10.5.install
+++ b/debian/mariadb-client-core-10.5.install
@@ -2,3 +2,5 @@ usr/bin/mysql
usr/bin/mysqlcheck
usr/share/man/man1/mysql.1
usr/share/man/man1/mysqlcheck.1
+usr/share/man/man1/mariadb.1
+usr/share/man/man1/mariadb-check.1
diff --git a/debian/mariadb-client-core-10.5.links b/debian/mariadb-client-core-10.5.links
new file mode 100644
index 00000000000..d889e7164b0
--- /dev/null
+++ b/debian/mariadb-client-core-10.5.links
@@ -0,0 +1,2 @@
+usr/bin/mysql usr/bin/mariadb
+usr/bin/mysqlcheck usr/bin/mariadb-check
diff --git a/debian/mariadb-plugin-rocksdb.install b/debian/mariadb-plugin-rocksdb.install
index 403c7f291b6..a2b8b805cdb 100644
--- a/debian/mariadb-plugin-rocksdb.install
+++ b/debian/mariadb-plugin-rocksdb.install
@@ -1,5 +1,7 @@
etc/mysql/conf.d/rocksdb.cnf etc/mysql/mariadb.conf.d
usr/bin/myrocks_hotbackup
usr/bin/mysql_ldb
+usr/share/man/man1/mariadb-ldb.1
+usr/share/man/man1/mysql_ldb.1
usr/bin/sst_dump
usr/lib/mysql/plugin/ha_rocksdb.so
diff --git a/debian/mariadb-plugin-rocksdb.links b/debian/mariadb-plugin-rocksdb.links
new file mode 100644
index 00000000000..78e47d43359
--- /dev/null
+++ b/debian/mariadb-plugin-rocksdb.links
@@ -0,0 +1 @@
+usr/bin/mysql_ldb usr/bin/mariadb-ldb
diff --git a/debian/mariadb-server-10.5.install b/debian/mariadb-server-10.5.install
index 8f35fe710bc..aa3a96ef972 100644
--- a/debian/mariadb-server-10.5.install
+++ b/debian/mariadb-server-10.5.install
@@ -2,6 +2,7 @@ debian/additions/debian-start etc/mysql
debian/additions/debian-start.inc.sh usr/share/mysql
debian/additions/echo_stderr usr/share/mysql
debian/additions/mysqld_safe_syslog.cnf etc/mysql/conf.d
+debian/additions/mysql.init usr/share/mysql
etc/apparmor.d/usr.sbin.mysqld
lib/systemd/system/mariadb@bootstrap.service.d/use_galera_new_cluster.conf
usr/bin/aria_chk
@@ -65,7 +66,16 @@ usr/share/man/man1/aria_pack.1
usr/share/man/man1/aria_read_log.1
usr/share/man/man1/galera_new_cluster.1
usr/share/man/man1/galera_recovery.1
+usr/share/man/man1/mariadb-convert-table-format.1
+usr/share/man/man1/mariadb-hotcopy.1
+usr/share/man/man1/mariadb-secure-installation.1
usr/share/man/man1/mariadb-service-convert.1
+usr/share/man/man1/mariadb-setpermission.1
+usr/share/man/man1/mariadb-show.1
+usr/share/man/man1/mariadb-tzinfo-to-sql.1
+usr/share/man/man1/mariadbd-multi.1
+usr/share/man/man1/mariadbd-safe-helper.1
+usr/share/man/man1/mariadbd-safe.1
usr/share/man/man1/msql2mysql.1
usr/share/man/man1/my_print_defaults.1
usr/share/man/man1/myisam_ftdump.1
@@ -87,9 +97,9 @@ usr/share/man/man1/replace.1
usr/share/man/man1/resolve_stack_dump.1
usr/share/man/man1/resolveip.1
usr/share/man/man1/wsrep_sst_common.1
+usr/share/man/man1/wsrep_sst_mariabackup.1
usr/share/man/man1/wsrep_sst_mysqldump.1
usr/share/man/man1/wsrep_sst_rsync.1
-usr/share/man/man1/wsrep_sst_mariabackup.1
usr/share/mysql/errmsg-utf8.txt
usr/share/mysql/fill_help_tables.sql
usr/share/mysql/maria_add_gis_sp_bootstrap.sql
diff --git a/debian/mariadb-server-10.5.links b/debian/mariadb-server-10.5.links
new file mode 100644
index 00000000000..f2d97460371
--- /dev/null
+++ b/debian/mariadb-server-10.5.links
@@ -0,0 +1,9 @@
+usr/bin/mysql_convert_table_format usr/bin/mariadb-convert-table-format
+usr/bin/mysql_secure_installation usr/bin/mariadb-secure-installation
+usr/bin/mysql_setpermission usr/bin/mariadb-setpermission
+usr/bin/mysql_tzinfo_to_sql usr/bin/mariadb-tzinfo-to-sql
+usr/bin/mysqld_multi usr/bin/mariadbd-multi
+usr/bin/mysqld_safe usr/bin/mariadbd-safe
+usr/bin/mysqld_safe_helper usr/bin/mariadbd-safe-helper
+usr/bin/mysqlhotcopy usr/bin/mariadb-hotcopy
+usr/bin/mysqlshow usr/bin/mariadb-show
diff --git a/debian/mariadb-server-10.5.postinst b/debian/mariadb-server-10.5.postinst
index bbf500814b0..9d2b49f5692 100644
--- a/debian/mariadb-server-10.5.postinst
+++ b/debian/mariadb-server-10.5.postinst
@@ -17,11 +17,7 @@ ERR_LOGGER="logger -p daemon.err -t mariadb-server-$VER.postinst -i"
set -o pipefail
invoke() {
- if [ -x /usr/sbin/invoke-rc.d ]; then
- invoke-rc.d mysql $1
- else
- /etc/init.d/mysql $1
- fi
+ systemctl $1 mysql
}
case "$1" in
diff --git a/debian/mariadb-server-10.5.postrm b/debian/mariadb-server-10.5.postrm
index dceb7502bf1..f0698d6e0a6 100644
--- a/debian/mariadb-server-10.5.postrm
+++ b/debian/mariadb-server-10.5.postrm
@@ -12,11 +12,7 @@ MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
# is running!
stop_server() {
set +e
- if [ -x /usr/sbin/invoke-rc.d ]; then
- invoke-rc.d mysql stop
- else
- /etc/init.d/mysql stop
- fi
+ systemctl stop mysql
errno=$?
set -e
diff --git a/debian/mariadb-server-10.5.preinst b/debian/mariadb-server-10.5.preinst
index e01066f8dfe..61752141c36 100644
--- a/debian/mariadb-server-10.5.preinst
+++ b/debian/mariadb-server-10.5.preinst
@@ -20,25 +20,18 @@ mysql_upgradedir=/var/lib/mysql-upgrade
# do it himself. No database directories should be removed while the server
# is running! Another mysqld in e.g. a different chroot is fine for us.
stop_server() {
- if [ ! -x /etc/init.d/mysql ]; then return; fi
-
# Return immediately if there are no mysql processes running
# as there is no point in trying to shutdown in that case.
if ! pgrep mysqld > /dev/null; then return; fi
set +e
- if [ -x /usr/sbin/invoke-rc.d ]; then
- cmd="invoke-rc.d mysql stop"
- else
- cmd="/etc/init.d/mysql stop"
- fi
- $cmd
+ systemctl stop mysql
errno=$?
set -e
# 0=ok, 100=no init script (fresh install)
if [ "$errno" != 0 -a "$errno" != 100 ]; then
- echo "${cmd/ */} returned $errno" 1>&2
+ echo "'systemctl stop mysql' returned $errno" 1>&2
echo "There is a MySQL server running, but we failed in our attempts to stop it." 1>&2
echo "Stop it yourself and try again!" 1>&2
db_stop
diff --git a/debian/mariadb-server-core-10.5.install b/debian/mariadb-server-core-10.5.install
index 46c116b618d..24f967252a2 100644
--- a/debian/mariadb-server-core-10.5.install
+++ b/debian/mariadb-server-core-10.5.install
@@ -6,6 +6,9 @@ usr/share/man/man1/innochecksum.1
usr/share/man/man1/mysql_install_db.1
usr/share/man/man1/mysql_upgrade.1
usr/share/man/man8/mysqld.8
+usr/share/man/man1/mariadb-install-db.1
+usr/share/man/man1/mariadb-upgrade.1
+usr/share/man/man8/mariadbd.8
usr/share/mysql/charsets
usr/share/mysql/czech
usr/share/mysql/danish
diff --git a/debian/mariadb-server-core-10.5.links b/debian/mariadb-server-core-10.5.links
new file mode 100644
index 00000000000..b7873f93141
--- /dev/null
+++ b/debian/mariadb-server-core-10.5.links
@@ -0,0 +1,3 @@
+usr/bin/mysql_install_db usr/bin/mariadb-install-db
+usr/bin/mysql_upgrade usr/bin/mariadb-upgrade
+usr/sbin/mysqld usr/sbin/mariadbd
diff --git a/debian/mariadb-test.install b/debian/mariadb-test.install
index f715825274c..5d3afda68d4 100644
--- a/debian/mariadb-test.install
+++ b/debian/mariadb-test.install
@@ -23,6 +23,10 @@ usr/share/man/man1/mysql_client_test.1
usr/share/man/man1/mysql_client_test_embedded.1
usr/share/man/man1/mysqltest.1
usr/share/man/man1/mysqltest_embedded.1
+usr/share/man/man1/mariadb-client-test-embedded.1
+usr/share/man/man1/mariadb-client-test.1
+usr/share/man/man1/mariadb-test-embedded.1
+usr/share/man/man1/mariadb-test.1
usr/share/mysql/mysql-test/README
usr/share/mysql/mysql-test/README-gcov
usr/share/mysql/mysql-test/README.stress
diff --git a/debian/mariadb-test.links b/debian/mariadb-test.links
index 884b25a81da..8b9ca6fe98b 100644
--- a/debian/mariadb-test.links
+++ b/debian/mariadb-test.links
@@ -1,2 +1,6 @@
usr/share/mysql/mysql-test/mysql-test-run.pl usr/share/mysql/mysql-test/mtr
usr/share/mysql/mysql-test/mysql-test-run.pl usr/share/mysql/mysql-test/mysql-test-run
+usr/bin/mysql_client_test_embedded usr/bin/mariadb-client-test-embedded
+usr/bin/mysqltest_embedded usr/bin/mariadb-test-embedded
+usr/bin/mysql_client_test usr/bin/mariadb-client-test
+usr/bin/mysqltest usr/bin/mariadb-test
diff --git a/extra/crc32-vpmsum/CMakeLists.txt b/extra/crc32-vpmsum/CMakeLists.txt
index 31c09a97d6a..b4adebdadf5 100644
--- a/extra/crc32-vpmsum/CMakeLists.txt
+++ b/extra/crc32-vpmsum/CMakeLists.txt
@@ -2,7 +2,7 @@ ADD_CONVENIENCE_LIBRARY(${CRC32_LIBRARY} $<TARGET_OBJECTS:crc32c> $<TARGET_OBJEC
ADD_LIBRARY(crc32c OBJECT vec_crc32.c)
ADD_LIBRARY(crc32ieee OBJECT vec_crc32.c)
-GET_TARGET_PROPERTY(CFLAGS_CRC32_VPMSUM ${CRC32_LIBRARY} COMPILE_FLAGS)
+GET_PROPERTY(CFLAGS_CRC32_VPMSUM TARGET ${CRC32_LIBRARY} PROPERTY COMPILE_FLAGS)
SET_TARGET_PROPERTIES(crc32c crc32ieee PROPERTIES COMPILE_FLAGS "${CFLAGS_CRC32_VPMSUM} -maltivec -mvsx -mpower8-vector -mcrypto -mpower8-vector")
SET_TARGET_PROPERTIES(crc32ieee PROPERTIES COMPILE_DEFINITIONS "CRC32_FUNCTION=crc32ieee_vpmsum;CRC32_CONSTANTS_HEADER=\"crc32ieee_constants.h\"")
SET_TARGET_PROPERTIES(crc32c PROPERTIES COMPILE_DEFINITIONS "CRC32_FUNCTION=crc32c_vpmsum;CRC32_CONSTANTS_HEADER=\"crc32c_constants.h\"")
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index d666cd7aa13..84a873d0729 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -199,6 +199,7 @@ static char* log_ignored_opt;
extern my_bool opt_use_ssl;
+extern char *opt_tls_version;
my_bool opt_ssl_verify_server_cert;
my_bool opt_extended_validation;
my_bool opt_encrypted_backup;
@@ -829,6 +830,7 @@ enum options_xtrabackup
OPT_XTRA_CHECK_PRIVILEGES
};
+
struct my_option xb_client_options[] =
{
{"verbose", 'V', "display verbose output",
diff --git a/extra/wolfssl/CMakeLists.txt b/extra/wolfssl/CMakeLists.txt
index cf6715280e3..2cb3f1dd3d1 100644
--- a/extra/wolfssl/CMakeLists.txt
+++ b/extra/wolfssl/CMakeLists.txt
@@ -6,7 +6,8 @@ ELSE()
PROJECT(wolfssl C)
ENDIF()
-IF(MSVC AND (CMAKE_SIZEOF_VOID_P MATCHES 8))
+IF(CMAKE_SIZEOF_VOID_P MATCHES 8)
+IF(MSVC)
SET(WOLFSSL_INTELASM ON)
ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
IF(CMAKE_C_COMPILER_ID MATCHES GNU AND CMAKE_C_COMPILER_VERSION VERSION_LESS 4.9)
@@ -20,28 +21,10 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
SET(WOLFSSL_INTELASM ON)
ENDIF()
ENDIF()
+ENDIF()
SET(WOLFSSL_SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/src)
ADD_DEFINITIONS(${SSL_DEFINES})
-ADD_DEFINITIONS(
- -DHAVE_CRL
- -DWOLFSSL_MYSQL_COMPATIBLE
- -DHAVE_ECC
- -DECC_TIMING_RESISTANT
- -DBUILDING_WOLFSSL
- -DHAVE_HASHDRBG
- -DWOLFSSL_AES_DIRECT
- -DWOLFSSL_SHA384
- -DWOLFSSL_SHA512
- -DWOLFSSL_SHA224
- -DSESSION_CERT
- -DKEEP_OUR_CERT
- -DWOLFSSL_STATIC_RSA
- -DWC_RSA_BLINDING
- -DHAVE_TLS_EXTENSIONS
- -DHAVE_AES_ECB
- -DWOLFSSL_AES_COUNTER
- -DNO_WOLFSSL_STUB)
SET(WOLFSSL_SOURCES
${WOLFSSL_SRCDIR}/crl.c
@@ -51,7 +34,8 @@ SET(WOLFSSL_SOURCES
${WOLFSSL_SRCDIR}/wolfio.c
${WOLFSSL_SRCDIR}/ocsp.c
${WOLFSSL_SRCDIR}/ssl.c)
-ADD_DEFINITIONS(-DWOLFSSL_LIB)
+ADD_DEFINITIONS(-DWOLFSSL_LIB -DBUILDING_WOLFSSL)
+
INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl)
IF(MSVC)
# size_t to long truncation warning
@@ -114,28 +98,31 @@ IF(NOT (MSVC AND CMAKE_C_COMPILER_ID MATCHES Clang)
ENDIF()
IF(WOLFSSL_FASTMATH)
- ADD_DEFINITIONS(-DUSE_FAST_MATH)
- # FP_MAX_BITS is set high solely to satisfy ssl_8k_key.test
- # WolfSSL will use more stack space with it
- ADD_DEFINITIONS(-DFP_MAX_BITS=16384)
- SET(WOLFCRYPT_SOURCES ${WOLFCRYPT_SOURCES} ${WOLFCRYPT_SRCDIR}/tfm.c)
+ SET(USE_FAST_MATH 1)
+ SET(TFM_TIMING_RESISTANT 1)
+ # FP_MAX_BITS is set high solely to satisfy ssl_8k_key.test
+ # WolfSSL will use more stack space with it
+ SET(FP_MAX_BITS 16384)
+ SET(WOLFCRYPT_SOURCES ${WOLFCRYPT_SOURCES} ${WOLFCRYPT_SRCDIR}/tfm.c)
ELSE()
- SET(WOLFCRYPT_SOURCES ${WOLFCRYPT_SOURCES} ${WOLFCRYPT_SRCDIR}/integer.c)
+ SET(WOLFCRYPT_SOURCES ${WOLFCRYPT_SOURCES} ${WOLFCRYPT_SRCDIR}/integer.c)
ENDIF()
IF(WOLFSSL_INTELASM)
- ADD_DEFINITIONS(-DWOLFSSL_AESNI)
- SET(SSL_DEFINES "${SSL_DEFINES} -DWOLFSSL_AESNI" PARENT_SCOPE)
+ SET(WOLFSSL_AESNI 1)
+
LIST(APPEND WOLFCRYPT_SOURCES ${WOLFCRYPT_SRCDIR}/cpuid.c)
IF(MSVC)
LIST(APPEND WOLFCRYPT_SOURCES ${WOLFCRYPT_SRCDIR}/aes_asm.asm)
IF(CMAKE_C_COMPILER_ID MATCHES Clang)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes")
ELSE()
- ADD_DEFINITIONS(-DHAVE_INTEL_RDSEED -DWOLFSSL_X86_64_BUILD)
+ SET(HAVE_INTEL_RDSEED 1)
+ SET(WOLFSSL_X86_64_BUILD 1)
ENDIF()
ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
- ADD_DEFINITIONS(-DHAVE_INTEL_RDSEED -DUSE_INTEL_SPEEDUP)
+ SET(HAVE_INTEL_RDSEED 1)
+ SET(USE_INTEL_SPEEDUP 1)
LIST(APPEND WOLFCRYPT_SOURCES
${WOLFCRYPT_SRCDIR}/aes_asm.S
${WOLFCRYPT_SRCDIR}/sha512_asm.S
@@ -144,5 +131,7 @@ IF(WOLFSSL_INTELASM)
ENDIF()
ENDIF()
+CONFIGURE_FILE(user_settings.h.in user_settings.h)
+INCLUDE_DIRECTORIES(${SSL_INCLUDE_DIRS})
ADD_CONVENIENCE_LIBRARY(wolfcrypt ${WOLFCRYPT_SOURCES})
diff --git a/extra/wolfssl/user_settings.h.in b/extra/wolfssl/user_settings.h.in
new file mode 100644
index 00000000000..f44143517fa
--- /dev/null
+++ b/extra/wolfssl/user_settings.h.in
@@ -0,0 +1,33 @@
+#ifndef WOLFSSL_USER_SETTINGS_H
+#define WOLFSSL_USER_SETTINGS_H
+
+#define HAVE_CRL
+#define WOLFSSL_MYSQL_COMPATIBLE
+#define HAVE_ECC
+#define ECC_TIMING_RESISTANT
+#define HAVE_HASHDRBG
+#define WOLFSSL_AES_DIRECT
+#define WOLFSSL_SHA384
+#define WOLFSSL_SHA512
+#define WOLFSSL_SHA224
+#define SESSION_CERT
+#define KEEP_OUR_CERT
+#define WOLFSSL_STATIC_RSA
+#define WC_RSA_BLINDING
+#define HAVE_TLS_EXTENSIONS
+#define HAVE_AES_ECB
+#define WOLFSSL_AES_COUNTER
+#define NO_WOLFSSL_STUB
+#define OPENSSL_ALL
+
+
+#cmakedefine WOLFSSL_AESNI
+#cmakedefine USE_FAST_MATH
+#cmakedefine TFM_TIMING_RESISTANT
+#cmakedefine HAVE_INTEL_RDSEED
+#cmakedefine USE_INTEL_SPEEDUP
+#cmakedefine FP_MAX_BITS @FP_MAX_BITS@
+#cmakedefine USE_FAST_MATH
+#cmakedefine WOLFSSL_X86_64_BUILD
+
+#endif /* WOLFSSL_USER_SETTINGS_H */
diff --git a/include/my_base.h b/include/my_base.h
index cbb2431eaf1..e73844d0937 100644
--- a/include/my_base.h
+++ b/include/my_base.h
@@ -647,6 +647,7 @@ typedef ulong ha_rows;
#define HA_POS_ERROR (~ (ha_rows) 0)
#define HA_OFFSET_ERROR (~ (my_off_t) 0)
+#define HA_ROWS_MAX HA_POS_ERROR
#if SIZEOF_OFF_T == 4
#define MAX_FILE_SIZE INT_MAX32
diff --git a/include/sslopt-longopts.h b/include/sslopt-longopts.h
index be64e7f6590..d0278a1645d 100644
--- a/include/sslopt-longopts.h
+++ b/include/sslopt-longopts.h
@@ -46,6 +46,11 @@
"Certificate revocation list path (implies --ssl).",
&opt_ssl_crlpath, &opt_ssl_crlpath, 0, GET_STR, REQUIRED_ARG,
0, 0, 0, 0, 0, 0},
+ {"tls-version", OPT_TLS_VERSION,
+ "TLS protocol version for secure connection.",
+ &opt_tls_version, &opt_tls_version, 0, GET_STR, REQUIRED_ARG,
+ 0, 0, 0, 0, 0, 0},
+
#ifdef MYSQL_CLIENT
{"ssl-verify-server-cert", OPT_SSL_VERIFY_SERVER_CERT,
"Verify server's \"Common Name\" in its cert against hostname used "
diff --git a/include/sslopt-vars.h b/include/sslopt-vars.h
index c65aa693b76..e28f19b919d 100644
--- a/include/sslopt-vars.h
+++ b/include/sslopt-vars.h
@@ -30,6 +30,7 @@ SSL_STATIC char *opt_ssl_cipher = 0;
SSL_STATIC char *opt_ssl_key = 0;
SSL_STATIC char *opt_ssl_crl = 0;
SSL_STATIC char *opt_ssl_crlpath = 0;
+SSL_STATIC char *opt_tls_version = 0;
#ifdef MYSQL_CLIENT
SSL_STATIC my_bool opt_ssl_verify_server_cert= 0;
#endif
diff --git a/include/violite.h b/include/violite.h
index 7ee00912837..4778c5521de 100644
--- a/include/violite.h
+++ b/include/violite.h
@@ -59,6 +59,11 @@ struct vio_keepalive_opts
};
+#define VIO_TLSv1_0 1
+#define VIO_TLSv1_1 2
+#define VIO_TLSv1_2 4
+#define VIO_TLSv1_3 8
+
#define VIO_LOCALHOST 1U /* a localhost connection */
#define VIO_BUFFERED_READ 2U /* use buffered read */
#define VIO_READ_BUFFER_SIZE 16384U /* size of read buffer */
@@ -148,7 +153,8 @@ enum enum_ssl_init_error
{
SSL_INITERR_NOERROR= 0, SSL_INITERR_CERT, SSL_INITERR_KEY,
SSL_INITERR_NOMATCH, SSL_INITERR_BAD_PATHS, SSL_INITERR_CIPHERS,
- SSL_INITERR_MEMFAIL, SSL_INITERR_DH, SSL_INITERR_LASTERR
+ SSL_INITERR_MEMFAIL, SSL_INITERR_DH, SSL_INITERR_PROTOCOL,
+ SSL_INITERR_LASTERR
};
const char* sslGetErrString(enum enum_ssl_init_error err);
@@ -169,7 +175,8 @@ struct st_VioSSLFd
*new_VioSSLAcceptorFd(const char *key_file, const char *cert_file,
const char *ca_file,const char *ca_path,
const char *cipher, enum enum_ssl_init_error *error,
- const char *crl_file, const char *crl_path);
+ const char *crl_file, const char *crl_path,
+ ulonglong tls_version);
void free_vio_ssl_acceptor_fd(struct st_VioSSLFd *fd);
#endif /* HAVE_OPENSSL */
diff --git a/libmariadb b/libmariadb
-Subproject ab4d09dd8de0bb2c56ca0c60cb386f02d173619
+Subproject c098613d289ed88fc53286e98add28ae9f2d8b4
diff --git a/man/CMakeLists.txt b/man/CMakeLists.txt
index 7a1e284b3e7..9ceda0c4c33 100644
--- a/man/CMakeLists.txt
+++ b/man/CMakeLists.txt
@@ -44,3 +44,43 @@ INSTALL(FILES ${MAN1_CLIENT} DESTINATION ${INSTALL_MANDIR}/man1 COMPONENT ManPag
INSTALL(FILES ${MAN1_DEVEL} DESTINATION ${INSTALL_MANDIR}/man1 COMPONENT ManPagesDevelopment)
INSTALL(FILES ${MAN1_TEST} DESTINATION ${INSTALL_MANDIR}/man1 COMPONENT ManPagesTest)
+macro(MARIADB_SYMLINK_MANPAGE)
+ list(LENGTH MARIADB_SYMLINK_FROMS _len)
+ math(EXPR _listlen "${_len}-1")
+
+ foreach(_index RANGE ${_listlen})
+ list(GET MARIADB_SYMLINK_FROMS ${_index} _name)
+
+ set(_manname "${_name}")
+ list(FIND MAN1_SERVER ${_manname}.1 _iman1server)
+ list(FIND MAN8_SERVER ${_manname}.8 _iman8server)
+ list(FIND MAN1_CLIENT ${_manname}.1 _iman1client)
+ list(FIND MAN1_DEVEL ${_manname}.1 _iman1devel)
+ list(FIND MAN1_TEST ${_manname}.1 _iman1test)
+
+ if (${_iman1server} GREATER -1)
+ MARIADB_SYMLINK_MANPAGE_CREATE(${_manname} ${_index} 1 "man1" ManPagesServer)
+ endif()
+ if (${_iman8server} GREATER -1)
+ MARIADB_SYMLINK_MANPAGE_CREATE(${_manname} ${_index} 8 "man8" ManPagesServer)
+ endif()
+ if (${_iman1client} GREATER -1)
+ MARIADB_SYMLINK_MANPAGE_CREATE(${_manname} ${_index} 1 "man1" ManPagesClient)
+ endif()
+ if (${_iman1devel} GREATER -1)
+ MARIADB_SYMLINK_MANPAGE_CREATE(${_manname} ${_index} 1 "man1" ManPagesDevelopment)
+ endif()
+ if (${_iman1test} GREATER -1)
+ MARIADB_SYMLINK_MANPAGE_CREATE(${_manname} ${_index} 1 "man1" ManPagesTest)
+ endif()
+ endforeach(_index)
+endmacro(MARIADB_SYMLINK_MANPAGE)
+
+macro(MARIADB_SYMLINK_MANPAGE_CREATE mysqlname index mannr dir comp)
+ LIST(GET MARIADB_SYMLINK_TOS ${index} _mariadbname)
+ SET(dest "${CMAKE_CURRENT_BINARY_DIR}/${_mariadbname}.${mannr}")
+ FILE(WRITE ${dest} ".so ${mysqlname}.${mannr}")
+ INSTALL(FILES ${dest} DESTINATION ${INSTALL_MANDIR}/${dir} COMPONENT ${comp})
+endmacro(MARIADB_SYMLINK_MANPAGE_CREATE)
+
+MARIADB_SYMLINK_MANPAGE()
diff --git a/mysql-test/main/ctype_utf8_def_upgrade.opt b/mysql-test/main/ctype_utf8_def_upgrade.opt
new file mode 100644
index 00000000000..61a472b45c5
--- /dev/null
+++ b/mysql-test/main/ctype_utf8_def_upgrade.opt
@@ -0,0 +1 @@
+--character-set-server=utf8
diff --git a/mysql-test/main/ctype_utf8_def_upgrade.result b/mysql-test/main/ctype_utf8_def_upgrade.result
new file mode 100644
index 00000000000..4f8a2b27db2
--- /dev/null
+++ b/mysql-test/main/ctype_utf8_def_upgrade.result
@@ -0,0 +1,99 @@
+#
+# Start of 10.1 tests
+#
+#
+# MDEV-19675 Wrong charset is chosen when opening a pre-4.1 table
+#
+# Test with a saved table from 3.23
+SELECT @@character_set_database;
+@@character_set_database
+latin1
+SET @@character_set_database="latin1";
+SELECT COUNT(*) FROM t1;
+ERROR HY000: Got error 190 "Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine. You may have retry " from storage engine MyISAM
+CHECK TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 check Error Got error 190 "Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine. You may have retry " from storage engine MyISAM
+test.t1 check error Corrupt
+REPAIR TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 repair Error Got error 190 "Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine. You may have retry " from storage engine MyISAM
+test.t1 repair error Corrupt
+REPAIR TABLE t1 USE_FRM;
+Table Op Msg_type Msg_text
+test.t1 repair status OK
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+CHECK TABLE t1;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `Host` char(60) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
+ `Db` char(64) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
+ `Select_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Insert_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Update_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Delete_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Create_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Drop_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Grant_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `References_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Index_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Alter_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ PRIMARY KEY (`Host`,`Db`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Host privileges; Merged with database privileges'
+DROP TABLE t1;
+SET @@character_set_database=DEFAULT;
+# Now do the same, but doing 'ALTER DATABASE' to create the db.opt file,
+# instead of setting variables directly.
+# Emulate a pre-4.1 database without db.opt
+SHOW CREATE DATABASE db1;
+Database Create Database
+db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 */
+USE db1;
+SELECT @@character_set_database, 'taken from defaults' AS comment;
+@@character_set_database comment
+utf8 taken from defaults
+USE test;
+ALTER DATABASE db1 DEFAULT CHARACTER SET latin1;
+USE db1;
+SELECT @@character_set_database, 'taken from db.opt' AS comment;
+@@character_set_database comment
+latin1 taken from db.opt
+SELECT COUNT(*) FROM t1;
+ERROR HY000: Got error 190 "Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine. You may have retry " from storage engine MyISAM
+REPAIR TABLE t1 USE_FRM;
+Table Op Msg_type Msg_text
+db1.t1 repair status OK
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+CHECK TABLE t1;
+Table Op Msg_type Msg_text
+db1.t1 check status OK
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `Host` char(60) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
+ `Db` char(64) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
+ `Select_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Insert_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Update_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Delete_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Create_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Drop_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Grant_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `References_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Index_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ `Alter_priv` enum('N','Y') NOT NULL DEFAULT 'N',
+ PRIMARY KEY (`Host`,`Db`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Host privileges; Merged with database privileges'
+DROP TABLE t1;
+DROP DATABASE db1;
+USE test;
+#
+# End of 10.1 tests
+#
diff --git a/mysql-test/main/ctype_utf8_def_upgrade.test b/mysql-test/main/ctype_utf8_def_upgrade.test
new file mode 100644
index 00000000000..4751faa0622
--- /dev/null
+++ b/mysql-test/main/ctype_utf8_def_upgrade.test
@@ -0,0 +1,61 @@
+let $MYSQLD_DATADIR= `select @@datadir`;
+
+--echo #
+--echo # Start of 10.1 tests
+--echo #
+
+--echo #
+--echo # MDEV-19675 Wrong charset is chosen when opening a pre-4.1 table
+--echo #
+
+--echo # Test with a saved table from 3.23
+
+SELECT @@character_set_database;
+SET @@character_set_database="latin1";
+--copy_file std_data/host_old.frm $MYSQLD_DATADIR/test/t1.frm
+--copy_file std_data/host_old.MYD $MYSQLD_DATADIR/test/t1.MYD
+--copy_file std_data/host_old.MYI $MYSQLD_DATADIR/test/t1.MYI
+
+--error ER_GET_ERRNO
+SELECT COUNT(*) FROM t1;
+CHECK TABLE t1;
+REPAIR TABLE t1;
+REPAIR TABLE t1 USE_FRM;
+SELECT COUNT(*) FROM t1;
+CHECK TABLE t1;
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
+SET @@character_set_database=DEFAULT;
+
+
+--echo # Now do the same, but doing 'ALTER DATABASE' to create the db.opt file,
+--echo # instead of setting variables directly.
+
+--echo # Emulate a pre-4.1 database without db.opt
+--mkdir $MYSQLD_DATADIR/db1
+SHOW CREATE DATABASE db1;
+USE db1;
+SELECT @@character_set_database, 'taken from defaults' AS comment;
+USE test;
+ALTER DATABASE db1 DEFAULT CHARACTER SET latin1;
+USE db1;
+SELECT @@character_set_database, 'taken from db.opt' AS comment;
+
+--copy_file std_data/host_old.frm $MYSQLD_DATADIR/db1/t1.frm
+--copy_file std_data/host_old.MYD $MYSQLD_DATADIR/db1/t1.MYD
+--copy_file std_data/host_old.MYI $MYSQLD_DATADIR/db1/t1.MYI
+
+--error ER_GET_ERRNO
+SELECT COUNT(*) FROM t1;
+REPAIR TABLE t1 USE_FRM;
+SELECT COUNT(*) FROM t1;
+CHECK TABLE t1;
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
+
+DROP DATABASE db1;
+USE test;
+
+--echo #
+--echo # End of 10.1 tests
+--echo #
diff --git a/mysql-test/main/derived.result b/mysql-test/main/derived.result
index abf087f891c..792a859d849 100644
--- a/mysql-test/main/derived.result
+++ b/mysql-test/main/derived.result
@@ -1,4 +1,3 @@
-drop table if exists t1,t2,t3;
set @save_derived_optimizer_switch=@@optimizer_switch;
set optimizer_switch='derived_merge=off,derived_with_keys=off';
select * from (select 2 from DUAL) b;
diff --git a/mysql-test/main/derived.test b/mysql-test/main/derived.test
index 990f955450a..8f3f265178c 100644
--- a/mysql-test/main/derived.test
+++ b/mysql-test/main/derived.test
@@ -1,7 +1,4 @@
# Initialize
---disable_warnings
-drop table if exists t1,t2,t3;
---enable_warnings
set @save_derived_optimizer_switch=@@optimizer_switch;
set optimizer_switch='derived_merge=off,derived_with_keys=off';
diff --git a/mysql-test/main/derived_view.result b/mysql-test/main/derived_view.result
index b488cbe09e4..67b9cb025b1 100644
--- a/mysql-test/main/derived_view.result
+++ b/mysql-test/main/derived_view.result
@@ -3022,7 +3022,7 @@ DROP TABLE t1;
set optimizer_switch=@exit_optimizer_switch;
set join_cache_level=@exit_join_cache_level;
#
-# Bug mdev-12812: EXPLAIN for query with many expensive derived
+# Bug mdev-18479: EXPLAIN for query with many expensive derived
#
CREATE TABLE t1
(id int auto_increment primary key,
@@ -3323,8 +3323,6 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived17> ALL NULL NULL NULL NULL 50328437500000 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived14> ALL NULL NULL NULL NULL 27680640625000000 Using where; Using join buffer (incremental, BNL join)
-1 PRIMARY <derived7> ALL NULL NULL NULL NULL 7798774269472204800 Using where; Using join buffer (incremental, BNL join)
-1 PRIMARY <derived8> ALL NULL NULL NULL NULL 7798774269472204800 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived9> ALL NULL NULL NULL NULL 15224352343750000640 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived10> ALL NULL NULL NULL NULL 15224352343750000640 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived11> ALL NULL NULL NULL NULL 15224352343750000640 Using where; Using join buffer (incremental, BNL join)
@@ -3332,6 +3330,8 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived13> ALL NULL NULL NULL NULL 15224352343750000640 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived15> ALL NULL NULL NULL NULL 15224352343750000640 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived16> ALL NULL NULL NULL NULL 15224352343750000640 Using where; Using join buffer (incremental, BNL join)
+1 PRIMARY <derived7> ALL NULL NULL NULL NULL 18446744073709551615 Using where; Using join buffer (incremental, BNL join)
+1 PRIMARY <derived8> ALL NULL NULL NULL NULL 18446744073709551615 Using where; Using join buffer (incremental, BNL join)
17 DERIVED t2 system NULL NULL NULL NULL 1
17 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where
17 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
diff --git a/mysql-test/main/derived_view.test b/mysql-test/main/derived_view.test
index 2b89d3e4be6..d303391204f 100644
--- a/mysql-test/main/derived_view.test
+++ b/mysql-test/main/derived_view.test
@@ -1978,7 +1978,7 @@ set optimizer_switch=@exit_optimizer_switch;
set join_cache_level=@exit_join_cache_level;
--echo #
---echo # Bug mdev-12812: EXPLAIN for query with many expensive derived
+--echo # Bug mdev-18479: EXPLAIN for query with many expensive derived
--echo #
CREATE TABLE t1
diff --git a/mysql-test/main/grant5.result b/mysql-test/main/grant5.result
index c35e8201582..086ae7011e4 100644
--- a/mysql-test/main/grant5.result
+++ b/mysql-test/main/grant5.result
@@ -102,3 +102,28 @@ u6 Y mysql_old_password 78a302dd267f6044
u7 Y mysql_old_password 78a302dd267f6044
u8 Y nonexistent 78a302dd267f6044
drop user u1@h, u2@h, u3@h, u4@h, u5@h, u6@h, u7@h, u8@h;
+create database mysqltest_1;
+create user twg@'%' identified by 'test';
+create table mysqltest_1.t1(id int);
+grant create, drop on `mysqltest_1%`.* to twg@'%';
+grant all privileges on `mysqltest_1`.* to twg@'%';
+connect conn1,localhost,twg,test,mysqltest_1;
+insert into t1 values(1);
+disconnect conn1;
+connection default;
+revoke all privileges, grant option from twg@'%';
+grant create, drop on `mysqlt%`.* to twg@'%';
+grant all privileges on `mysqlt%1`.* to twg@'%';
+connect conn1,localhost,twg,test,mysqltest_1;
+insert into t1 values(1);
+disconnect conn1;
+connection default;
+revoke all privileges, grant option from twg@'%';
+grant create, drop on `mysqlt%`.* to twg@'%';
+grant all privileges on `%mysqltest_1`.* to twg@'%';
+connect conn1,localhost,twg,test,mysqltest_1;
+insert into t1 values(1);
+disconnect conn1;
+connection default;
+drop database mysqltest_1;
+drop user twg@'%';
diff --git a/mysql-test/main/grant5.test b/mysql-test/main/grant5.test
index cc673754461..4db262c25c1 100644
--- a/mysql-test/main/grant5.test
+++ b/mysql-test/main/grant5.test
@@ -86,3 +86,41 @@ select user,select_priv,plugin,authentication_string from mysql.user where user
# but they still can be dropped
drop user u1@h, u2@h, u3@h, u4@h, u5@h, u6@h, u7@h, u8@h;
+
+#
+# MDEV-14735 better matching order for grants
+# MDEV-14732 mysql.db privileges evaluated on order of grants rather than hierarchically
+# MDEV-8269 Correct fix for Bug #20181776 :- ACCESS CONTROL DOESN'T MATCH MOST SPECIFIC HOST WHEN IT CONTAINS WILDCARD
+#
+create database mysqltest_1;
+create user twg@'%' identified by 'test';
+create table mysqltest_1.t1(id int);
+
+# MDEV-14732 test case
+grant create, drop on `mysqltest_1%`.* to twg@'%';
+grant all privileges on `mysqltest_1`.* to twg@'%';
+connect conn1,localhost,twg,test,mysqltest_1;
+insert into t1 values(1);
+disconnect conn1;
+connection default;
+
+# prefix%suffix
+revoke all privileges, grant option from twg@'%';
+grant create, drop on `mysqlt%`.* to twg@'%';
+grant all privileges on `mysqlt%1`.* to twg@'%';
+connect conn1,localhost,twg,test,mysqltest_1;
+insert into t1 values(1);
+disconnect conn1;
+connection default;
+
+# more specific can even have a shorter prefix
+revoke all privileges, grant option from twg@'%';
+grant create, drop on `mysqlt%`.* to twg@'%';
+grant all privileges on `%mysqltest_1`.* to twg@'%';
+connect conn1,localhost,twg,test,mysqltest_1;
+insert into t1 values(1);
+disconnect conn1;
+connection default;
+
+drop database mysqltest_1;
+drop user twg@'%';
diff --git a/mysql-test/main/join.result b/mysql-test/main/join.result
index 5c7f24b8d62..1e880e1e442 100644
--- a/mysql-test/main/join.result
+++ b/mysql-test/main/join.result
@@ -1140,7 +1140,7 @@ SELECT 1 FROM v1 right join v1 AS v2 ON RAND();
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00
1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where
-1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00
+1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where
1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where
Warnings:
Note 1003 select 1 AS `1` from `test`.`t1` left join `test`.`t1` `t2` on(1 = 1) left join (`test`.`t1` left join `test`.`t1` `t2` on(1 = 1)) on(rand()) where 1
diff --git a/mysql-test/main/join_nested.result b/mysql-test/main/join_nested.result
index 4db32c3fad3..4f6583b6fbc 100644
--- a/mysql-test/main/join_nested.result
+++ b/mysql-test/main/join_nested.result
@@ -1966,3 +1966,36 @@ Note 1003 select 1 AS `K1`,'T1Row1' AS `Name`,`t2a`.`K2` AS `K2`,`t2a`.`K1r` AS
DROP VIEW v1;
DROP TABLE t1,t2;
set optimizer_search_depth= @tmp_mdev621;
+#
+# MDEV-19588: Nested left joins using optimized join cache
+#
+set optimizer_switch='optimize_join_buffer_size=on';
+set @save_join_cache_level= @@join_cache_level;
+set join_cache_level=2;
+CREATE TABLE t1 (i1 int, c1 varchar(20), pk int) engine=myisam;
+CREATE TABLE t2 (pk int, c1 varchar(20), i1 int) engine=myisam;
+INSERT INTO t2 VALUES (7,'a',-912),(8,'a',5);
+CREATE TABLE t3 (pk int, c1 varchar(20), i1 int) engine=myisam;
+INSERT INTO t3 VALUES
+(1,'a',-145),(2,'a',6),(3,'a',1),(7,'a',NULL),(8,'a',889),(9,'a',146),
+(10,'a',177),(16,'a',-433),(17,'a',NULL),(18,'a',2),(19,'a',3),(20,'a',5),
+(21,'a',-484),(22,'a',369),(23,'a',-192),(24,'a',-163),(25,'a',5),(26,'a',NULL);
+SELECT t3.*
+FROM t3 LEFT JOIN t1 LEFT JOIN t2 ON t1.i1 = t2.i1 ON t3.i1 = t1.i1
+WHERE t2.pk < 13 OR t3.i1 IS NULL;
+pk c1 i1
+7 a NULL
+17 a NULL
+26 a NULL
+explain extended SELECT t3.*
+FROM t3 LEFT JOIN t1 LEFT JOIN t2 ON t1.i1 = t2.i1 ON t3.i1 = t1.i1
+WHERE t2.pk < 13 OR t3.i1 IS NULL;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t3 ALL NULL NULL NULL NULL 18 100.00
+1 SIMPLE t1 ALL NULL NULL NULL NULL 0 0.00 Using where; Using join buffer (flat, BNL join)
+1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (incremental, BNL join)
+Warnings:
+Note 1003 select `test`.`t3`.`pk` AS `pk`,`test`.`t3`.`c1` AS `c1`,`test`.`t3`.`i1` AS `i1` from `test`.`t3` left join (`test`.`t1` left join `test`.`t2` on(`test`.`t2`.`i1` = `test`.`t3`.`i1`)) on(`test`.`t1`.`i1` = `test`.`t3`.`i1`) where `test`.`t2`.`pk` < 13 or `test`.`t3`.`i1` is null
+DROP TABLE t1,t2,t3;
+set join_cache_level= @save_join_cache_level;
+set optimizer_switch=@save_optimizer_switch;
diff --git a/mysql-test/main/join_nested.test b/mysql-test/main/join_nested.test
index 77d0e4154c1..864218371f4 100644
--- a/mysql-test/main/join_nested.test
+++ b/mysql-test/main/join_nested.test
@@ -1380,3 +1380,37 @@ DROP VIEW v1;
DROP TABLE t1,t2;
set optimizer_search_depth= @tmp_mdev621;
+
+--echo #
+--echo # MDEV-19588: Nested left joins using optimized join cache
+--echo #
+
+set optimizer_switch='optimize_join_buffer_size=on';
+
+set @save_join_cache_level= @@join_cache_level;
+set join_cache_level=2;
+
+CREATE TABLE t1 (i1 int, c1 varchar(20), pk int) engine=myisam;
+
+CREATE TABLE t2 (pk int, c1 varchar(20), i1 int) engine=myisam;
+INSERT INTO t2 VALUES (7,'a',-912),(8,'a',5);
+
+CREATE TABLE t3 (pk int, c1 varchar(20), i1 int) engine=myisam;
+INSERT INTO t3 VALUES
+(1,'a',-145),(2,'a',6),(3,'a',1),(7,'a',NULL),(8,'a',889),(9,'a',146),
+(10,'a',177),(16,'a',-433),(17,'a',NULL),(18,'a',2),(19,'a',3),(20,'a',5),
+(21,'a',-484),(22,'a',369),(23,'a',-192),(24,'a',-163),(25,'a',5),(26,'a',NULL);
+
+let $q=
+SELECT t3.*
+FROM t3 LEFT JOIN t1 LEFT JOIN t2 ON t1.i1 = t2.i1 ON t3.i1 = t1.i1
+WHERE t2.pk < 13 OR t3.i1 IS NULL;
+
+eval $q;
+eval explain extended $q;
+
+DROP TABLE t1,t2,t3;
+
+set join_cache_level= @save_join_cache_level;
+
+set optimizer_switch=@save_optimizer_switch;
diff --git a/mysql-test/main/join_nested_jcl6.result b/mysql-test/main/join_nested_jcl6.result
index 6ac34a8728d..d39bf7f373f 100644
--- a/mysql-test/main/join_nested_jcl6.result
+++ b/mysql-test/main/join_nested_jcl6.result
@@ -1977,6 +1977,39 @@ Note 1003 select 1 AS `K1`,'T1Row1' AS `Name`,`t2a`.`K2` AS `K2`,`t2a`.`K1r` AS
DROP VIEW v1;
DROP TABLE t1,t2;
set optimizer_search_depth= @tmp_mdev621;
+#
+# MDEV-19588: Nested left joins using optimized join cache
+#
+set optimizer_switch='optimize_join_buffer_size=on';
+set @save_join_cache_level= @@join_cache_level;
+set join_cache_level=2;
+CREATE TABLE t1 (i1 int, c1 varchar(20), pk int) engine=myisam;
+CREATE TABLE t2 (pk int, c1 varchar(20), i1 int) engine=myisam;
+INSERT INTO t2 VALUES (7,'a',-912),(8,'a',5);
+CREATE TABLE t3 (pk int, c1 varchar(20), i1 int) engine=myisam;
+INSERT INTO t3 VALUES
+(1,'a',-145),(2,'a',6),(3,'a',1),(7,'a',NULL),(8,'a',889),(9,'a',146),
+(10,'a',177),(16,'a',-433),(17,'a',NULL),(18,'a',2),(19,'a',3),(20,'a',5),
+(21,'a',-484),(22,'a',369),(23,'a',-192),(24,'a',-163),(25,'a',5),(26,'a',NULL);
+SELECT t3.*
+FROM t3 LEFT JOIN t1 LEFT JOIN t2 ON t1.i1 = t2.i1 ON t3.i1 = t1.i1
+WHERE t2.pk < 13 OR t3.i1 IS NULL;
+pk c1 i1
+7 a NULL
+17 a NULL
+26 a NULL
+explain extended SELECT t3.*
+FROM t3 LEFT JOIN t1 LEFT JOIN t2 ON t1.i1 = t2.i1 ON t3.i1 = t1.i1
+WHERE t2.pk < 13 OR t3.i1 IS NULL;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t3 ALL NULL NULL NULL NULL 18 100.00
+1 SIMPLE t1 ALL NULL NULL NULL NULL 0 0.00 Using where; Using join buffer (flat, BNL join)
+1 SIMPLE t2 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (incremental, BNL join)
+Warnings:
+Note 1003 select `test`.`t3`.`pk` AS `pk`,`test`.`t3`.`c1` AS `c1`,`test`.`t3`.`i1` AS `i1` from `test`.`t3` left join (`test`.`t1` left join `test`.`t2` on(`test`.`t2`.`i1` = `test`.`t3`.`i1`)) on(`test`.`t1`.`i1` = `test`.`t3`.`i1`) where `test`.`t2`.`pk` < 13 or `test`.`t3`.`i1` is null
+DROP TABLE t1,t2,t3;
+set join_cache_level= @save_join_cache_level;
+set optimizer_switch=@save_optimizer_switch;
CREATE TABLE t5 (a int, b int, c int, PRIMARY KEY(a), KEY b_i (b));
CREATE TABLE t6 (a int, b int, c int, PRIMARY KEY(a), KEY b_i (b));
CREATE TABLE t7 (a int, b int, c int, PRIMARY KEY(a), KEY b_i (b));
diff --git a/mysql-test/main/mdev13607.result b/mysql-test/main/mdev13607.result
index 43fc473c84d..dcb7365644a 100644
--- a/mysql-test/main/mdev13607.result
+++ b/mysql-test/main/mdev13607.result
@@ -79,21 +79,21 @@ id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY p7 ALL NULL NULL NULL NULL 50 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p8 ALL NULL NULL NULL NULL 50 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p9 ALL NULL NULL NULL NULL 50 Using where; Using join buffer (incremental, BNL join)
-1 PRIMARY <derived3> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived4> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived5> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived6> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived7> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived8> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived9> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived10> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived11> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived12> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived13> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived14> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived15> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived16> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
-1 PRIMARY <derived17> ALL NULL NULL NULL NULL 17319535557742690304 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived3> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived4> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived5> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived6> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived7> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived8> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived9> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived10> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived11> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived12> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived13> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived14> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived15> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived16> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
+1 PRIMARY <derived17> ALL NULL NULL NULL NULL 18446744073709551615 Using join buffer (incremental, BNL join)
17 DERIVED r1 ALL NULL NULL NULL NULL 2
17 DERIVED d1 ALL NULL NULL NULL NULL 2 Using where; Using join buffer (flat, BNL join)
17 DERIVED r2 ALL NULL NULL NULL NULL 2 Using where; Using join buffer (incremental, BNL join)
diff --git a/mysql-test/main/multi_update.result b/mysql-test/main/multi_update.result
index 4a16a7af3f6..4ba5c360538 100644
--- a/mysql-test/main/multi_update.result
+++ b/mysql-test/main/multi_update.result
@@ -412,7 +412,6 @@ c2_id c2_p_id c2_note c2_active
1 1 A Note 1
drop table t1, t2;
connect root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK;
-connection root;
create database mysqltest;
create table mysqltest.t1 (a int, b int, primary key (a));
create table mysqltest.t2 (a int, b int, primary key (a));
@@ -421,7 +420,6 @@ create user mysqltest_1@localhost;
grant select on mysqltest.* to mysqltest_1@localhost;
grant update on mysqltest.t1 to mysqltest_1@localhost;
connect user1,localhost,mysqltest_1,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK;
-connection user1;
update t1, t2 set t1.b=1 where t1.a=t2.a;
update t1, t2 set t1.b=(select t3.b from t3 where t1.a=t3.a) where t1.a=t2.a;
connection root;
@@ -456,13 +454,10 @@ create table t2 (a int);
insert into t2 values (10), (20), (30);
create view v1 as select a as b, a/10 as a from t2;
connect locker,localhost,root,,test;
-connection locker;
lock table t1 write;
connect changer,localhost,root,,test;
-connection changer;
alter table t1 add column c int default 100 after a;
connect updater,localhost,root,,test;
-connection updater;
update t1, v1 set t1.b=t1.a+t1.b+v1.b where t1.a=v1.a;
connection locker;
unlock tables;
@@ -963,7 +958,30 @@ triggered
triggered
drop table t1,t2, t3;
drop user foo;
-end of 5.5 tests
+create table t1 (a int, b int);
+create table t2 (c int, d int);
+insert t1 values (1,2),(3,4);
+insert t2 values (5,6),(7,8);
+create table t0 (x int);
+insert t0 values (11), (22);
+create trigger tr1 before update on t2 for each row insert t0 values (new.c);
+connect con1, localhost, root;
+lock table t0 write;
+connection default;
+update t1 join t2 on (a=c+4) set b=d;
+disconnect con1;
+drop table t1, t2, t0;
+create table t1 (a int, b varchar(50), c varchar(50));
+insert t1 (a,b) values (1,'1'), (2,'2'), (3,'3');
+create function f1() returns varchar(50) return 'result';
+create trigger tr before update on t1 for each row set new.c = (select f1());
+create table t2 select a, b from t1;
+update t1 join t2 using (a) set t1.b = t2.b;
+drop table t1, t2;
+drop function f1;
+#
+# end of 5.5 tests
+#
create table t1 (c1 int, c3 int);
insert t1(c3) values (1), (2), (3), (4), (5), (6), (7), (8);
create table t2 select * from t1;
diff --git a/mysql-test/main/multi_update.test b/mysql-test/main/multi_update.test
index b6ad8bfcf52..49799a45255 100644
--- a/mysql-test/main/multi_update.test
+++ b/mysql-test/main/multi_update.test
@@ -354,7 +354,6 @@ drop table t1, t2;
#
connect (root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK);
-connection root;
create database mysqltest;
create table mysqltest.t1 (a int, b int, primary key (a));
create table mysqltest.t2 (a int, b int, primary key (a));
@@ -363,7 +362,6 @@ create user mysqltest_1@localhost;
grant select on mysqltest.* to mysqltest_1@localhost;
grant update on mysqltest.t1 to mysqltest_1@localhost;
connect (user1,localhost,mysqltest_1,,mysqltest,$MASTER_MYPORT,$MASTER_MYSOCK);
-connection user1;
update t1, t2 set t1.b=1 where t1.a=t2.a;
update t1, t2 set t1.b=(select t3.b from t3 where t1.a=t3.a) where t1.a=t2.a;
connection root;
@@ -419,15 +417,12 @@ insert into t2 values (10), (20), (30);
create view v1 as select a as b, a/10 as a from t2;
connect (locker,localhost,root,,test);
-connection locker;
lock table t1 write;
connect (changer,localhost,root,,test);
-connection changer;
send alter table t1 add column c int default 100 after a;
connect (updater,localhost,root,,test);
-connection updater;
# Wait till "alter table t1 ..." of session changer is in work.
# = There is one session waiting.
let $wait_condition= select count(*)= 1 from information_schema.processlist
@@ -930,7 +925,38 @@ select * from t2;
drop table t1,t2, t3;
drop user foo;
---echo end of 5.5 tests
+#
+# Another test on not-opening tables unnecessary
+#
+create table t1 (a int, b int);
+create table t2 (c int, d int);
+insert t1 values (1,2),(3,4);
+insert t2 values (5,6),(7,8);
+create table t0 (x int);
+insert t0 values (11), (22);
+create trigger tr1 before update on t2 for each row insert t0 values (new.c);
+connect con1, localhost, root;
+lock table t0 write;
+connection default;
+update t1 join t2 on (a=c+4) set b=d;
+disconnect con1;
+drop table t1, t2, t0;
+
+#
+# MDEV-19521 Update Table Fails with Trigger and Stored Function
+#
+create table t1 (a int, b varchar(50), c varchar(50));
+insert t1 (a,b) values (1,'1'), (2,'2'), (3,'3');
+create function f1() returns varchar(50) return 'result';
+create trigger tr before update on t1 for each row set new.c = (select f1());
+create table t2 select a, b from t1;
+update t1 join t2 using (a) set t1.b = t2.b;
+drop table t1, t2;
+drop function f1;
+
+--echo #
+--echo # end of 5.5 tests
+--echo #
#
# MDEV-13911 Support ORDER BY and LIMIT in multi-table update
diff --git a/mysql-test/main/multi_update_debug.result b/mysql-test/main/multi_update_debug.result
new file mode 100644
index 00000000000..799b6821e48
--- /dev/null
+++ b/mysql-test/main/multi_update_debug.result
@@ -0,0 +1,16 @@
+create table t1 (a int, b int);
+create table t2 (c int, d int);
+insert t1 values (1,2),(3,4);
+insert t2 values (5,6),(7,8);
+create table t0 (x int);
+insert t0 values (11), (22);
+create trigger tr1 before update on t1 for each row insert t0 values (new.b);
+set debug_sync='open_tables_after_open_and_process_table WAIT_FOR cont';
+update t1 join t2 on (a=c+4) set b=d;
+connect con1, localhost, root;
+set debug_sync='mdl_acquire_lock_wait SIGNAL cont';
+lock table t1 write, t0 write;
+disconnect con1;
+connection default;
+drop table t1, t2, t0;
+set debug_sync='reset';
diff --git a/mysql-test/main/multi_update_debug.test b/mysql-test/main/multi_update_debug.test
new file mode 100644
index 00000000000..2da376e1b87
--- /dev/null
+++ b/mysql-test/main/multi_update_debug.test
@@ -0,0 +1,27 @@
+#
+# test MDL backoff-and-retry during multi-update
+#
+source include/have_debug_sync.inc;
+create table t1 (a int, b int);
+create table t2 (c int, d int);
+insert t1 values (1,2),(3,4);
+insert t2 values (5,6),(7,8);
+create table t0 (x int);
+insert t0 values (11), (22);
+create trigger tr1 before update on t1 for each row insert t0 values (new.b);
+
+set debug_sync='open_tables_after_open_and_process_table WAIT_FOR cont';
+send update t1 join t2 on (a=c+4) set b=d;
+
+connect con1, localhost, root;
+let $wait_condition= select count(*) from information_schema.processlist where state = ' debug sync point: open_tables_after_open_and_process_table'
+source include/wait_condition.inc;
+set debug_sync='mdl_acquire_lock_wait SIGNAL cont';
+lock table t1 write, t0 write;
+let $wait_condition= select count(*) from information_schema.processlist where state = 'Waiting for table metadata lock'
+source include/wait_condition.inc;
+disconnect con1;
+connection default;
+reap;
+drop table t1, t2, t0;
+set debug_sync='reset';
diff --git a/mysql-test/main/multi_update_innodb.result b/mysql-test/main/multi_update_innodb.result
index 294ebfcebdf..2ec7eb3065e 100644
--- a/mysql-test/main/multi_update_innodb.result
+++ b/mysql-test/main/multi_update_innodb.result
@@ -67,6 +67,23 @@ SELECT * FROM t2;
col_int_key pk_1 pk_2 col_int
1 2 3 4
DROP TABLE t1,t2;
+create table t1 (id serial, size int(11)) engine=innodb;
+create table t2 (id serial, size int, account_id int) engine=innodb;
+create table t3 (id serial, size int, article_id int) engine=innodb;
+create table t4 (id serial, file_id int, article_id int) engine=innodb;
+insert t1 values(null, 400);
+insert t2 values(null, 0, 1), (null, 1, 1);
+insert t3 values(null, 100, 1);
+insert t4 values(null, 1, 2);
+create trigger file_update_article before update on t3 for each row
+update t2 set t2.size = new.size where t2.id = new.article_id;
+create trigger article_update_account before update on t2 for each row
+update t1 set t1.size = t1.size + new.size where t1.id = new.account_id;
+update t3 join t4 on t4.file_id =t3.id and t4.article_id=2 set t3.size=t3.size + 2;
+drop table t1, t2, t3, t4;
+#
+# end of 5.5 tests
+#
# Bug mdev-5970
# Bug#13256831 - ERROR 1032 (HY000): CAN'T FIND RECORD
diff --git a/mysql-test/main/multi_update_innodb.test b/mysql-test/main/multi_update_innodb.test
index 2e46ee06d4d..04736482011 100644
--- a/mysql-test/main/multi_update_innodb.test
+++ b/mysql-test/main/multi_update_innodb.test
@@ -76,6 +76,28 @@ SELECT * FROM t2;
DROP TABLE t1,t2;
+#
+# MDEV-19491 update query stopped working after mariadb upgrade 10.2.23 -> 10.2.24
+#
+create table t1 (id serial, size int(11)) engine=innodb;
+create table t2 (id serial, size int, account_id int) engine=innodb;
+create table t3 (id serial, size int, article_id int) engine=innodb;
+create table t4 (id serial, file_id int, article_id int) engine=innodb;
+insert t1 values(null, 400);
+insert t2 values(null, 0, 1), (null, 1, 1);
+insert t3 values(null, 100, 1);
+insert t4 values(null, 1, 2);
+create trigger file_update_article before update on t3 for each row
+ update t2 set t2.size = new.size where t2.id = new.article_id;
+create trigger article_update_account before update on t2 for each row
+ update t1 set t1.size = t1.size + new.size where t1.id = new.account_id;
+update t3 join t4 on t4.file_id =t3.id and t4.article_id=2 set t3.size=t3.size + 2;
+drop table t1, t2, t3, t4;
+
+--echo #
+--echo # end of 5.5 tests
+--echo #
+
--echo
--echo # Bug mdev-5970
--echo # Bug#13256831 - ERROR 1032 (HY000): CAN'T FIND RECORD
diff --git a/mysql-test/main/mysqld--help.result b/mysql-test/main/mysqld--help.result
index 3eccd39eac2..070c3e43c18 100644
--- a/mysql-test/main/mysqld--help.result
+++ b/mysql-test/main/mysqld--help.result
@@ -1357,6 +1357,8 @@ The following specify which files/extra groups are read (specified before remain
--time-format=name The TIME format (ignored)
--timed-mutexes Specify whether to time mutexes. Deprecated, has no
effect.
+ --tls-version=name TLS protocol version for secure connections.. Any
+ combination of: TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3
--tmp-disk-table-size=#
Max size for data for an internal temporary on-disk
MyISAM or Aria table.
diff --git a/mysql-test/main/mysqld--help.test b/mysql-test/main/mysqld--help.test
index f0603e4e59d..0205fa4c3de 100644
--- a/mysql-test/main/mysqld--help.test
+++ b/mysql-test/main/mysqld--help.test
@@ -23,7 +23,7 @@ perl;
log-slow-queries pid-file slow-query-log-file log-basename
datadir slave-load-tmpdir tmpdir socket thread-pool-size
large-files-support lower-case-file-system system-time-zone
- collation-server character-set-server log-tc-size version.*/;
+ collation-server character-set-server log-tc-size tls-version version.*/;
# Plugins which may or may not be there:
@plugins=qw/innodb archive blackhole federated partition s3
diff --git a/mysql-test/main/openssl_6975.test b/mysql-test/main/openssl_6975.test
index 6a82d013fb6..bfcb0d56681 100644
--- a/mysql-test/main/openssl_6975.test
+++ b/mysql-test/main/openssl_6975.test
@@ -18,25 +18,25 @@ let $mysql=$MYSQL --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$
disable_abort_on_error;
echo TLS1.2 ciphers: user is ok with any cipher;
-exec $mysql --ssl-cipher=AES128-SHA256;
+exec $mysql --tls-version=TLSv1.2 --ssl-cipher=AES128-SHA256;
--replace_result DHE-RSA-CHACHA20-POLY1305 DHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES256-GCM-SHA384
-exec $mysql --ssl-cipher=TLSv1.2;
+exec $mysql --tls-version=TLSv1.2 --ssl-cipher=TLSv1.2;
echo TLS1.2 ciphers: user requires SSLv3 cipher AES128-SHA;
-exec $mysql --user ssl_sslv3 --ssl-cipher=AES128-SHA256;
-exec $mysql --user ssl_sslv3 --ssl-cipher=TLSv1.2;
+exec $mysql --user ssl_sslv3 --tls-version=TLSv1.2 --ssl-cipher=AES128-SHA256;
+exec $mysql --user ssl_sslv3 --tls-version=TLSv1.2 --ssl-cipher=TLSv1.2;
echo TLS1.2 ciphers: user requires TLSv1.2 cipher AES128-SHA256;
-exec $mysql --user ssl_tls12 --ssl-cipher=AES128-SHA256;
-exec $mysql --user ssl_tls12 --ssl-cipher=TLSv1.2;
+exec $mysql --user ssl_tls12 --tls-version=TLSv1.2 --ssl-cipher=AES128-SHA256;
+exec $mysql --user ssl_tls12 --tls-version=TLSv1.2 --ssl-cipher=TLSv1.2;
echo SSLv3 ciphers: user is ok with any cipher;
-exec $mysql --ssl-cipher=AES256-SHA;
-exec $mysql --ssl-cipher=SSLv3;
+exec $mysql --tls-version=TLSv1.0,TLSv1.1,TLSv1.2 --ssl-cipher=AES256-SHA;
+exec $mysql --tls-version=TLSv1.0,TLSv1.1,TLSv1.2 --ssl-cipher=SSLv3;
echo SSLv3 ciphers: user requires SSLv3 cipher AES128-SHA;
-exec $mysql --user ssl_sslv3 --ssl-cipher=AES128-SHA;
-exec $mysql --user ssl_sslv3 --ssl-cipher=SSLv3;
+exec $mysql --user ssl_sslv3 --tls-version=TLSv1.0,TLSv1.1,TLSv1.2 --ssl-cipher=AES128-SHA;
+exec $mysql --user ssl_sslv3 --tls-version=TLSv1.0,TLSv1.1,TLSv1.2 --ssl-cipher=SSLv3;
echo SSLv3 ciphers: user requires TLSv1.2 cipher AES128-SHA256;
-exec $mysql --user ssl_tls12 --ssl-cipher=AES128-SHA;
-exec $mysql --user ssl_tls12 --ssl-cipher=SSLv3;
+exec $mysql --user ssl_tls12 --tls-version=TLSv1.0,TLSv1.1,TLSv1.2 --ssl-cipher=AES128-SHA;
+exec $mysql --user ssl_tls12 --tls-version=TLSv1.0,TLSv1.1,TLSv1.2 --ssl-cipher=SSLv3;
drop user ssl_sslv3@localhost;
drop user ssl_tls12@localhost;
diff --git a/mysql-test/main/plugin_auth_qa_1.result b/mysql-test/main/plugin_auth_qa_1.result
index d2d902cb6a6..261767d4cd2 100644
--- a/mysql-test/main/plugin_auth_qa_1.result
+++ b/mysql-test/main/plugin_auth_qa_1.result
@@ -4,6 +4,9 @@ User plugin authentication_string
========== test 1.1.3.2 ====================================
CREATE USER plug_user IDENTIFIED WITH test_plugin_server AS 'plug_dest';
CREATE USER plug_dest IDENTIFIED BY 'plug_dest_passwd';
+GRANT PROXY ON `plug%dest` TO plug_user;
+ERROR 1045 (28000): Access denied for user 'plug_user'@'localhost' (using password: YES)
+REVOKE PROXY ON `plug%dest` FROM plug_user;
GRANT PROXY ON plug_dest TO plug_user;
current_user()
plug_dest@%
diff --git a/mysql-test/main/plugin_auth_qa_1.test b/mysql-test/main/plugin_auth_qa_1.test
index fb577fc178f..17fbf2ca25e 100644
--- a/mysql-test/main/plugin_auth_qa_1.test
+++ b/mysql-test/main/plugin_auth_qa_1.test
@@ -13,6 +13,10 @@ SELECT user,plugin,authentication_string FROM mysql.user WHERE user != 'root';
# CREATE...WITH/CREATE...BY/GRANT
CREATE USER plug_user IDENTIFIED WITH test_plugin_server AS 'plug_dest';
CREATE USER plug_dest IDENTIFIED BY 'plug_dest_passwd';
+GRANT PROXY ON `plug%dest` TO plug_user;
+--error 1
+--exec $MYSQL -S $MASTER_MYSOCK -u plug_user --password=plug_dest -e "SELECT current_user();SELECT user();USE test_user_db;CREATE TABLE t1(a int);SHOW TABLES;DROP TABLE t1;" 2>&1
+REVOKE PROXY ON `plug%dest` FROM plug_user;
GRANT PROXY ON plug_dest TO plug_user;
--replace_result $MASTER_MYSOCK MASTER_MYSOCK
--exec $MYSQL -S $MASTER_MYSOCK -u plug_user --password=plug_dest -e "SELECT current_user();SELECT user();USE test_user_db;CREATE TABLE t1(a int);SHOW TABLES;DROP TABLE t1;" 2>&1
diff --git a/mysql-test/main/range_innodb.result b/mysql-test/main/range_innodb.result
index 30161a2711d..8774a623826 100644
--- a/mysql-test/main/range_innodb.result
+++ b/mysql-test/main/range_innodb.result
@@ -80,3 +80,21 @@ ERROR HY000: Table definition has changed, please retry transaction
DROP TABLE t0,t1;
set @@global.debug_dbug="-d";
set @@optimizer_switch= @optimizer_switch_save;
+#
+# MDEV-19634: Assertion `0' failed in row_sel_convert_mysql_key_to_innobase,
+# [Warning] InnoDB: Using a partial-field key prefix in search
+#
+CREATE TABLE t1 (
+pk INT,
+a VARCHAR(1),
+b INT,
+PRIMARY KEY (pk),
+KEY (a,b)
+) ENGINE=InnoDB;
+INSERT INTO t1 VALUES (1,'a',1),(2,'b',2);
+explain SELECT a FROM t1 WHERE pk < 0 AND a <= 'w' and b > 0;
+id select_type table type possible_keys key key_len ref rows Extra
+1 SIMPLE t1 index PRIMARY,a a 9 NULL 2 Using where; Using index
+SELECT a FROM t1 WHERE pk < 0 AND a <= 'w' and b > 0;
+a
+drop table t1;
diff --git a/mysql-test/main/range_innodb.test b/mysql-test/main/range_innodb.test
index a17ef3f1146..2c225df27fe 100644
--- a/mysql-test/main/range_innodb.test
+++ b/mysql-test/main/range_innodb.test
@@ -87,3 +87,22 @@ select * from t1 where a=10 and b=10;
DROP TABLE t0,t1;
set @@global.debug_dbug="-d";
set @@optimizer_switch= @optimizer_switch_save;
+
+--echo #
+--echo # MDEV-19634: Assertion `0' failed in row_sel_convert_mysql_key_to_innobase,
+--echo # [Warning] InnoDB: Using a partial-field key prefix in search
+--echo #
+
+CREATE TABLE t1 (
+ pk INT,
+ a VARCHAR(1),
+ b INT,
+ PRIMARY KEY (pk),
+ KEY (a,b)
+) ENGINE=InnoDB;
+
+INSERT INTO t1 VALUES (1,'a',1),(2,'b',2);
+
+explain SELECT a FROM t1 WHERE pk < 0 AND a <= 'w' and b > 0;
+SELECT a FROM t1 WHERE pk < 0 AND a <= 'w' and b > 0;
+drop table t1;
diff --git a/mysql-test/main/subselect.result b/mysql-test/main/subselect.result
index 8c8c034c7cc..1fdf8d19ba6 100644
--- a/mysql-test/main/subselect.result
+++ b/mysql-test/main/subselect.result
@@ -6988,7 +6988,7 @@ WHERE SLEEP(0.1) OR c < 'p' OR b = ( SELECT MIN(b) FROM t2 );
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 1
1 PRIMARY t2 ALL b NULL NULL NULL 2 Using where
-1 PRIMARY t3 ref d d 5 test.t2.b 2 Using where; Using index
+1 PRIMARY t3 ref d d 5 test.t2.b 2 Using index
3 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
set @tmp_mdev410=@@global.userstat;
set global userstat=on;
diff --git a/mysql-test/main/subselect_mat.result b/mysql-test/main/subselect_mat.result
index 8ffe6643670..64bdfb499b4 100644
--- a/mysql-test/main/subselect_mat.result
+++ b/mysql-test/main/subselect_mat.result
@@ -2517,6 +2517,95 @@ SELECT 1 FROM t1 where t1.id IN (SELECT v1.i1 from v1);
1
drop table t1,t2;
drop view v1;
+#
+# MDEV-19580: function invocation in the left part of IN subquery
+#
+create table t1 (id int, a varchar(50), b int);
+insert into t1 values
+(1,'mrs',2), (2,'joe',2), (3,'paul',1), (4,'art',1);
+create table t2 (id int, a varchar(50), x int);
+insert into t2 values
+(1,'grand',1),(2,'average',1),(3,'serf',0);
+create table t3 (d1 date, d2 date, t1_id int, t2_id int );
+insert into t3 values
+('1972-01-01','1988-12-31',3,1), ('1972-01-01','1988-12-31',4,1),
+('1972-01-01','1988-12-31',1,2), ('1972-01-01','1988-12-31',2,3);
+create table t4 ( id int, a varchar(50) );
+insert into t4 values
+(1,'songwriter'),(2,'song character');
+create function f1(who int, dt date) returns int
+deterministic
+begin
+declare result int;
+select t2_id into result from t3 where dt>=d1 and dt<=d2 and t1_id=who;
+return result;
+end$$
+create function f2(who int, dt date) returns int
+begin
+declare result int;
+select t2_id into result from t3 where dt>=d1 and dt<=d2 and t1_id=who;
+return result;
+end$$
+# Deterministic function in left part of IN subquery: semi-join is OK
+select * from t1
+left join t4 on t1.b = t4.id
+where f1(t1.id, '1980-01-01') in (select id from t2 where x=1);
+id a b id a
+3 paul 1 1 songwriter
+4 art 1 1 songwriter
+1 mrs 2 2 song character
+explain extended select * from t1
+left join t4 on t1.b = t4.id
+where f1(t1.id, '1980-01-01') in (select id from t2 where x=1);
+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
+1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 100.00 Using where
+1 PRIMARY t4 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (flat, BNL join)
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 100.00 Using where
+Warnings:
+Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t4`.`id` AS `id`,`test`.`t4`.`a` AS `a` from `test`.`t1` semi join (`test`.`t2`) left join `test`.`t4` on(`test`.`t4`.`id` = `test`.`t1`.`b`) where `test`.`t2`.`x` = 1 and `f1`(`test`.`t1`.`id`,'1980-01-01') = `test`.`t2`.`id`
+# Non-deterministic function in left part of IN subq: semi-join is OK
+select * from t1
+left join t4 on t1.b = t4.id
+where f2(t1.id, '1980-01-01') in (select id from t2 where x=1);
+id a b id a
+3 paul 1 1 songwriter
+4 art 1 1 songwriter
+1 mrs 2 2 song character
+explain extended select * from t1
+left join t4 on t1.b = t4.id
+where f2(t1.id, '1980-01-01') in (select id from t2 where x=1);
+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
+1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 100.00 Using where
+1 PRIMARY t4 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (flat, BNL join)
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 100.00 Using where
+Warnings:
+Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t4`.`id` AS `id`,`test`.`t4`.`a` AS `a` from `test`.`t1` semi join (`test`.`t2`) left join `test`.`t4` on(`test`.`t4`.`id` = `test`.`t1`.`b`) where `test`.`t2`.`x` = 1 and `f2`(`test`.`t1`.`id`,'1980-01-01') = `test`.`t2`.`id`
+select t1.*, t4.*,
+(select max(t4.id) from t4 where t4.id=t1.b and sleep(0) = 0) as s
+from t1 left join t4 on t1.b = t4.id
+where f2(t1.id, '1980-01-01') in (select id from t2 where x=1);
+id a b id a s
+3 paul 1 1 songwriter 1
+4 art 1 1 songwriter 1
+1 mrs 2 2 song character 2
+explain extended select t1.*, t4.*,
+(select max(t4.id) from t4 where t4.id=t1.b and sleep(0) = 0) as s
+from t1 left join t4 on t1.b = t4.id
+where f2(t1.id, '1980-01-01') in (select id from t2 where x=1);
+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
+1 PRIMARY <subquery3> eq_ref distinct_key distinct_key 4 func 1 100.00 Using where
+1 PRIMARY t4 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (flat, BNL join)
+3 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 100.00 Using where
+2 DEPENDENT SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where
+Warnings:
+Note 1276 Field or reference 'test.t1.b' of SELECT #2 was resolved in SELECT #1
+Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t4`.`id` AS `id`,`test`.`t4`.`a` AS `a`,(/* select#2 */ select max(`test`.`t4`.`id`) from `test`.`t4` where `test`.`t4`.`id` = `test`.`t1`.`b` and sleep(0) = 0) AS `s` from `test`.`t1` semi join (`test`.`t2`) left join `test`.`t4` on(`test`.`t4`.`id` = `test`.`t1`.`b`) where `test`.`t2`.`x` = 1 and `f2`(`test`.`t1`.`id`,'1980-01-01') = `test`.`t2`.`id`
+drop function f1;
+drop function f2;
+drop table t1,t2,t3,t4;
# End of 5.5 tests
#
# MDEV-7220: Materialization strategy is not used for REPLACE ... SELECT
diff --git a/mysql-test/main/subselect_no_exists_to_in.result b/mysql-test/main/subselect_no_exists_to_in.result
index 1bcc1a5ecb3..613a0d8dd6c 100644
--- a/mysql-test/main/subselect_no_exists_to_in.result
+++ b/mysql-test/main/subselect_no_exists_to_in.result
@@ -6988,7 +6988,7 @@ WHERE SLEEP(0.1) OR c < 'p' OR b = ( SELECT MIN(b) FROM t2 );
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 1
1 PRIMARY t2 ALL b NULL NULL NULL 2 Using where
-1 PRIMARY t3 ref d d 5 test.t2.b 2 Using where; Using index
+1 PRIMARY t3 ref d d 5 test.t2.b 2 Using index
3 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
set @tmp_mdev410=@@global.userstat;
set global userstat=on;
diff --git a/mysql-test/main/subselect_no_mat.result b/mysql-test/main/subselect_no_mat.result
index 2876e190e68..982e701231d 100644
--- a/mysql-test/main/subselect_no_mat.result
+++ b/mysql-test/main/subselect_no_mat.result
@@ -6982,7 +6982,7 @@ WHERE SLEEP(0.1) OR c < 'p' OR b = ( SELECT MIN(b) FROM t2 );
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 1
1 PRIMARY t2 ALL b NULL NULL NULL 2 Using where
-1 PRIMARY t3 ref d d 5 test.t2.b 2 Using where; Using index
+1 PRIMARY t3 ref d d 5 test.t2.b 2 Using index
3 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
set @tmp_mdev410=@@global.userstat;
set global userstat=on;
diff --git a/mysql-test/main/subselect_no_opts.result b/mysql-test/main/subselect_no_opts.result
index 47f554a78ef..1937f2af8f6 100644
--- a/mysql-test/main/subselect_no_opts.result
+++ b/mysql-test/main/subselect_no_opts.result
@@ -6979,7 +6979,7 @@ WHERE SLEEP(0.1) OR c < 'p' OR b = ( SELECT MIN(b) FROM t2 );
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 1
1 PRIMARY t2 ALL b NULL NULL NULL 2 Using where
-1 PRIMARY t3 ref d d 5 test.t2.b 2 Using where; Using index
+1 PRIMARY t3 ref d d 5 test.t2.b 2 Using index
3 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
set @tmp_mdev410=@@global.userstat;
set global userstat=on;
diff --git a/mysql-test/main/subselect_no_scache.result b/mysql-test/main/subselect_no_scache.result
index 70968786fd0..929af9b4b1f 100644
--- a/mysql-test/main/subselect_no_scache.result
+++ b/mysql-test/main/subselect_no_scache.result
@@ -6994,7 +6994,7 @@ WHERE SLEEP(0.1) OR c < 'p' OR b = ( SELECT MIN(b) FROM t2 );
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 1
1 PRIMARY t2 ALL b NULL NULL NULL 2 Using where
-1 PRIMARY t3 ref d d 5 test.t2.b 2 Using where; Using index
+1 PRIMARY t3 ref d d 5 test.t2.b 2 Using index
3 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
set @tmp_mdev410=@@global.userstat;
set global userstat=on;
diff --git a/mysql-test/main/subselect_no_semijoin.result b/mysql-test/main/subselect_no_semijoin.result
index c9a52512614..52c81e58a49 100644
--- a/mysql-test/main/subselect_no_semijoin.result
+++ b/mysql-test/main/subselect_no_semijoin.result
@@ -6979,7 +6979,7 @@ WHERE SLEEP(0.1) OR c < 'p' OR b = ( SELECT MIN(b) FROM t2 );
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 1
1 PRIMARY t2 ALL b NULL NULL NULL 2 Using where
-1 PRIMARY t3 ref d d 5 test.t2.b 2 Using where; Using index
+1 PRIMARY t3 ref d d 5 test.t2.b 2 Using index
3 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
set @tmp_mdev410=@@global.userstat;
set global userstat=on;
diff --git a/mysql-test/main/subselect_sj_mat.result b/mysql-test/main/subselect_sj_mat.result
index 670489c17da..61caa0f1fbe 100644
--- a/mysql-test/main/subselect_sj_mat.result
+++ b/mysql-test/main/subselect_sj_mat.result
@@ -2553,6 +2553,95 @@ SELECT 1 FROM t1 where t1.id IN (SELECT v1.i1 from v1);
1
drop table t1,t2;
drop view v1;
+#
+# MDEV-19580: function invocation in the left part of IN subquery
+#
+create table t1 (id int, a varchar(50), b int);
+insert into t1 values
+(1,'mrs',2), (2,'joe',2), (3,'paul',1), (4,'art',1);
+create table t2 (id int, a varchar(50), x int);
+insert into t2 values
+(1,'grand',1),(2,'average',1),(3,'serf',0);
+create table t3 (d1 date, d2 date, t1_id int, t2_id int );
+insert into t3 values
+('1972-01-01','1988-12-31',3,1), ('1972-01-01','1988-12-31',4,1),
+('1972-01-01','1988-12-31',1,2), ('1972-01-01','1988-12-31',2,3);
+create table t4 ( id int, a varchar(50) );
+insert into t4 values
+(1,'songwriter'),(2,'song character');
+create function f1(who int, dt date) returns int
+deterministic
+begin
+declare result int;
+select t2_id into result from t3 where dt>=d1 and dt<=d2 and t1_id=who;
+return result;
+end$$
+create function f2(who int, dt date) returns int
+begin
+declare result int;
+select t2_id into result from t3 where dt>=d1 and dt<=d2 and t1_id=who;
+return result;
+end$$
+# Deterministic function in left part of IN subquery: semi-join is OK
+select * from t1
+left join t4 on t1.b = t4.id
+where f1(t1.id, '1980-01-01') in (select id from t2 where x=1);
+id a b id a
+3 paul 1 1 songwriter
+4 art 1 1 songwriter
+1 mrs 2 2 song character
+explain extended select * from t1
+left join t4 on t1.b = t4.id
+where f1(t1.id, '1980-01-01') in (select id from t2 where x=1);
+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
+1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 100.00 Using where
+1 PRIMARY t4 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (flat, BNL join)
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 100.00 Using where
+Warnings:
+Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t4`.`id` AS `id`,`test`.`t4`.`a` AS `a` from `test`.`t1` semi join (`test`.`t2`) left join `test`.`t4` on(`test`.`t4`.`id` = `test`.`t1`.`b`) where `test`.`t2`.`x` = 1 and `f1`(`test`.`t1`.`id`,'1980-01-01') = `test`.`t2`.`id`
+# Non-deterministic function in left part of IN subq: semi-join is OK
+select * from t1
+left join t4 on t1.b = t4.id
+where f2(t1.id, '1980-01-01') in (select id from t2 where x=1);
+id a b id a
+3 paul 1 1 songwriter
+4 art 1 1 songwriter
+1 mrs 2 2 song character
+explain extended select * from t1
+left join t4 on t1.b = t4.id
+where f2(t1.id, '1980-01-01') in (select id from t2 where x=1);
+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
+1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 100.00 Using where
+1 PRIMARY t4 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (flat, BNL join)
+2 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 100.00 Using where
+Warnings:
+Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t4`.`id` AS `id`,`test`.`t4`.`a` AS `a` from `test`.`t1` semi join (`test`.`t2`) left join `test`.`t4` on(`test`.`t4`.`id` = `test`.`t1`.`b`) where `test`.`t2`.`x` = 1 and `f2`(`test`.`t1`.`id`,'1980-01-01') = `test`.`t2`.`id`
+select t1.*, t4.*,
+(select max(t4.id) from t4 where t4.id=t1.b and sleep(0) = 0) as s
+from t1 left join t4 on t1.b = t4.id
+where f2(t1.id, '1980-01-01') in (select id from t2 where x=1);
+id a b id a s
+3 paul 1 1 songwriter 1
+4 art 1 1 songwriter 1
+1 mrs 2 2 song character 2
+explain extended select t1.*, t4.*,
+(select max(t4.id) from t4 where t4.id=t1.b and sleep(0) = 0) as s
+from t1 left join t4 on t1.b = t4.id
+where f2(t1.id, '1980-01-01') in (select id from t2 where x=1);
+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
+1 PRIMARY <subquery3> eq_ref distinct_key distinct_key 4 func 1 100.00 Using where
+1 PRIMARY t4 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (flat, BNL join)
+3 MATERIALIZED t2 ALL NULL NULL NULL NULL 3 100.00 Using where
+2 DEPENDENT SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where
+Warnings:
+Note 1276 Field or reference 'test.t1.b' of SELECT #2 was resolved in SELECT #1
+Note 1003 /* select#1 */ select `test`.`t1`.`id` AS `id`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t4`.`id` AS `id`,`test`.`t4`.`a` AS `a`,(/* select#2 */ select max(`test`.`t4`.`id`) from `test`.`t4` where `test`.`t4`.`id` = `test`.`t1`.`b` and sleep(0) = 0) AS `s` from `test`.`t1` semi join (`test`.`t2`) left join `test`.`t4` on(`test`.`t4`.`id` = `test`.`t1`.`b`) where `test`.`t2`.`x` = 1 and `f2`(`test`.`t1`.`id`,'1980-01-01') = `test`.`t2`.`id`
+drop function f1;
+drop function f2;
+drop table t1,t2,t3,t4;
# End of 5.5 tests
#
# MDEV-7220: Materialization strategy is not used for REPLACE ... SELECT
diff --git a/mysql-test/main/subselect_sj_mat.test b/mysql-test/main/subselect_sj_mat.test
index 8ba65c4454d..91a67faba57 100644
--- a/mysql-test/main/subselect_sj_mat.test
+++ b/mysql-test/main/subselect_sj_mat.test
@@ -2248,6 +2248,81 @@ explain SELECT 1 FROM t1 where t1.id IN (SELECT v1.i1 from v1);
SELECT 1 FROM t1 where t1.id IN (SELECT v1.i1 from v1);
drop table t1,t2;
drop view v1;
+
+
+--echo #
+--echo # MDEV-19580: function invocation in the left part of IN subquery
+--echo #
+
+create table t1 (id int, a varchar(50), b int);
+insert into t1 values
+(1,'mrs',2), (2,'joe',2), (3,'paul',1), (4,'art',1);
+
+create table t2 (id int, a varchar(50), x int);
+insert into t2 values
+(1,'grand',1),(2,'average',1),(3,'serf',0);
+
+create table t3 (d1 date, d2 date, t1_id int, t2_id int );
+insert into t3 values
+('1972-01-01','1988-12-31',3,1), ('1972-01-01','1988-12-31',4,1),
+('1972-01-01','1988-12-31',1,2), ('1972-01-01','1988-12-31',2,3);
+
+create table t4 ( id int, a varchar(50) );
+insert into t4 values
+(1,'songwriter'),(2,'song character');
+
+delimiter $$;
+
+create function f1(who int, dt date) returns int
+deterministic
+begin
+ declare result int;
+ select t2_id into result from t3 where dt>=d1 and dt<=d2 and t1_id=who;
+ return result;
+end$$
+
+create function f2(who int, dt date) returns int
+begin
+ declare result int;
+ select t2_id into result from t3 where dt>=d1 and dt<=d2 and t1_id=who;
+ return result;
+end$$
+
+delimiter ;$$
+
+--echo # Deterministic function in left part of IN subquery: semi-join is OK
+
+let $q1=
+select * from t1
+ left join t4 on t1.b = t4.id
+ where f1(t1.id, '1980-01-01') in (select id from t2 where x=1);
+
+eval $q1;
+eval explain extended $q1;
+
+--echo # Non-deterministic function in left part of IN subq: semi-join is OK
+
+let $q2=
+select * from t1
+ left join t4 on t1.b = t4.id
+ where f2(t1.id, '1980-01-01') in (select id from t2 where x=1);
+
+eval $q2;
+eval explain extended $q2;
+
+let $q3=
+select t1.*, t4.*,
+ (select max(t4.id) from t4 where t4.id=t1.b and sleep(0) = 0) as s
+ from t1 left join t4 on t1.b = t4.id
+ where f2(t1.id, '1980-01-01') in (select id from t2 where x=1);
+
+eval $q3;
+eval explain extended $q3;
+
+drop function f1;
+drop function f2;
+drop table t1,t2,t3,t4;
+
--echo # End of 5.5 tests
--echo #
--echo # MDEV-7220: Materialization strategy is not used for REPLACE ... SELECT
diff --git a/mysql-test/main/tls_version.opt b/mysql-test/main/tls_version.opt
new file mode 100644
index 00000000000..5f30e3749a4
--- /dev/null
+++ b/mysql-test/main/tls_version.opt
@@ -0,0 +1 @@
+--tls_version=TLSv1.1,TLSv1.2
diff --git a/mysql-test/main/tls_version.result b/mysql-test/main/tls_version.result
new file mode 100644
index 00000000000..d1b20a121fe
--- /dev/null
+++ b/mysql-test/main/tls_version.result
@@ -0,0 +1,14 @@
+Variable_name Value
+Ssl_version TLSv1.2
+Variable_name Value
+Ssl_version TLSv1.2
+Variable_name Value
+Ssl_version TLSv1.1
+Variable_name Value
+Ssl_version TLSv1.1
+Variable_name Value
+Ssl_version TLSv1.2
+Variable_name Value
+Ssl_version TLSv1.2
+@@tls_version
+TLSv1.1,TLSv1.2
diff --git a/mysql-test/main/tls_version.test b/mysql-test/main/tls_version.test
new file mode 100644
index 00000000000..875fed19821
--- /dev/null
+++ b/mysql-test/main/tls_version.test
@@ -0,0 +1,24 @@
+# Tests for SSL connections, only run if mysqld is compiled
+# with support for SSL.
+
+-- source include/have_ssl_communication.inc
+#default is highest available version: TLSv1.2
+--exec $MYSQL --host=localhost --ssl -e "show status like 'ssl_version';"
+# TLSv1.2
+--exec $MYSQL --host=localhost --ssl --tls_version=TLSv1.2 -e "show status like 'ssl_version';"
+# TLSv1.1
+--exec $MYSQL --host=localhost --ssl --tls_version=TLSv1.1 -e "show status like 'ssl_version';"
+# if a gap is between TLS versions, lowest version number should be used (TLS1.1)
+--exec $MYSQL --host=localhost --ssl --tls_version=TLSv1.1,TLSv1.3 -e "show status like 'ssl_version';"
+# TLSv1.3 is not enabled, so TLSv1.2 should be used
+--exec $MYSQL --host=localhost --ssl --tls_version=TLSv1.2,TLSv1.3 -e "show status like 'ssl_version';"
+# Highest TLS version number should be used (TLSv1.2)
+--exec $MYSQL --host=localhost --ssl --tls_version=TLSv1.1,TLSv1.2 -e "show status like 'ssl_version';"
+# Errors:
+# TLS v1.0 is disabled on server, so we should get an error
+--replace_regex /2026 SSL connection error.*/2026 SSL connection error: xxxx/
+--error 1
+--exec $MYSQL --host=localhost --ssl --tls_version=TLSv1.0 -e "show status like 'ssl_version';"
+# finally list available protocols
+--exec $MYSQL --host=localhost --ssl -e "select @@tls_version;"
+
diff --git a/mysql-test/suite/encryption/r/innodb_lotoftables.result b/mysql-test/suite/encryption/r/innodb_lotoftables.result
deleted file mode 100644
index e651ee01487..00000000000
--- a/mysql-test/suite/encryption/r/innodb_lotoftables.result
+++ /dev/null
@@ -1,1171 +0,0 @@
-SET GLOBAL innodb_fast_shutdown=0;
-# restart
-SHOW VARIABLES LIKE 'innodb_encrypt%';
-Variable_name Value
-innodb_encrypt_log OFF
-innodb_encrypt_tables OFF
-innodb_encryption_rotate_key_age 1
-innodb_encryption_rotation_iops 100
-innodb_encryption_threads 0
-create database innodb_encrypted_1;
-use innodb_encrypted_1;
-set autocommit=0;
-set autocommit=1;
-commit work;
-# should be empty
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE NAME LIKE 'innodb_encrypted%';
-NAME
-create database innodb_encrypted_2;
-use innodb_encrypted_2;
-set autocommit=0;
-commit work;
-set autocommit=1;
-# should contain 100 tables
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-innodb_encrypted_2/t_1
-innodb_encrypted_2/t_10
-innodb_encrypted_2/t_100
-innodb_encrypted_2/t_11
-innodb_encrypted_2/t_12
-innodb_encrypted_2/t_13
-innodb_encrypted_2/t_14
-innodb_encrypted_2/t_15
-innodb_encrypted_2/t_16
-innodb_encrypted_2/t_17
-innodb_encrypted_2/t_18
-innodb_encrypted_2/t_19
-innodb_encrypted_2/t_2
-innodb_encrypted_2/t_20
-innodb_encrypted_2/t_21
-innodb_encrypted_2/t_22
-innodb_encrypted_2/t_23
-innodb_encrypted_2/t_24
-innodb_encrypted_2/t_25
-innodb_encrypted_2/t_26
-innodb_encrypted_2/t_27
-innodb_encrypted_2/t_28
-innodb_encrypted_2/t_29
-innodb_encrypted_2/t_3
-innodb_encrypted_2/t_30
-innodb_encrypted_2/t_31
-innodb_encrypted_2/t_32
-innodb_encrypted_2/t_33
-innodb_encrypted_2/t_34
-innodb_encrypted_2/t_35
-innodb_encrypted_2/t_36
-innodb_encrypted_2/t_37
-innodb_encrypted_2/t_38
-innodb_encrypted_2/t_39
-innodb_encrypted_2/t_4
-innodb_encrypted_2/t_40
-innodb_encrypted_2/t_41
-innodb_encrypted_2/t_42
-innodb_encrypted_2/t_43
-innodb_encrypted_2/t_44
-innodb_encrypted_2/t_45
-innodb_encrypted_2/t_46
-innodb_encrypted_2/t_47
-innodb_encrypted_2/t_48
-innodb_encrypted_2/t_49
-innodb_encrypted_2/t_5
-innodb_encrypted_2/t_50
-innodb_encrypted_2/t_51
-innodb_encrypted_2/t_52
-innodb_encrypted_2/t_53
-innodb_encrypted_2/t_54
-innodb_encrypted_2/t_55
-innodb_encrypted_2/t_56
-innodb_encrypted_2/t_57
-innodb_encrypted_2/t_58
-innodb_encrypted_2/t_59
-innodb_encrypted_2/t_6
-innodb_encrypted_2/t_60
-innodb_encrypted_2/t_61
-innodb_encrypted_2/t_62
-innodb_encrypted_2/t_63
-innodb_encrypted_2/t_64
-innodb_encrypted_2/t_65
-innodb_encrypted_2/t_66
-innodb_encrypted_2/t_67
-innodb_encrypted_2/t_68
-innodb_encrypted_2/t_69
-innodb_encrypted_2/t_7
-innodb_encrypted_2/t_70
-innodb_encrypted_2/t_71
-innodb_encrypted_2/t_72
-innodb_encrypted_2/t_73
-innodb_encrypted_2/t_74
-innodb_encrypted_2/t_75
-innodb_encrypted_2/t_76
-innodb_encrypted_2/t_77
-innodb_encrypted_2/t_78
-innodb_encrypted_2/t_79
-innodb_encrypted_2/t_8
-innodb_encrypted_2/t_80
-innodb_encrypted_2/t_81
-innodb_encrypted_2/t_82
-innodb_encrypted_2/t_83
-innodb_encrypted_2/t_84
-innodb_encrypted_2/t_85
-innodb_encrypted_2/t_86
-innodb_encrypted_2/t_87
-innodb_encrypted_2/t_88
-innodb_encrypted_2/t_89
-innodb_encrypted_2/t_9
-innodb_encrypted_2/t_90
-innodb_encrypted_2/t_91
-innodb_encrypted_2/t_92
-innodb_encrypted_2/t_93
-innodb_encrypted_2/t_94
-innodb_encrypted_2/t_95
-innodb_encrypted_2/t_96
-innodb_encrypted_2/t_97
-innodb_encrypted_2/t_98
-innodb_encrypted_2/t_99
-# should contain 0 tables
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-create database innodb_encrypted_3;
-use innodb_encrypted_3;
-set autocommit=0;
-commit work;
-set autocommit=1;
-# should contain 100 tables
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-innodb_encrypted_2/t_1
-innodb_encrypted_2/t_10
-innodb_encrypted_2/t_100
-innodb_encrypted_2/t_11
-innodb_encrypted_2/t_12
-innodb_encrypted_2/t_13
-innodb_encrypted_2/t_14
-innodb_encrypted_2/t_15
-innodb_encrypted_2/t_16
-innodb_encrypted_2/t_17
-innodb_encrypted_2/t_18
-innodb_encrypted_2/t_19
-innodb_encrypted_2/t_2
-innodb_encrypted_2/t_20
-innodb_encrypted_2/t_21
-innodb_encrypted_2/t_22
-innodb_encrypted_2/t_23
-innodb_encrypted_2/t_24
-innodb_encrypted_2/t_25
-innodb_encrypted_2/t_26
-innodb_encrypted_2/t_27
-innodb_encrypted_2/t_28
-innodb_encrypted_2/t_29
-innodb_encrypted_2/t_3
-innodb_encrypted_2/t_30
-innodb_encrypted_2/t_31
-innodb_encrypted_2/t_32
-innodb_encrypted_2/t_33
-innodb_encrypted_2/t_34
-innodb_encrypted_2/t_35
-innodb_encrypted_2/t_36
-innodb_encrypted_2/t_37
-innodb_encrypted_2/t_38
-innodb_encrypted_2/t_39
-innodb_encrypted_2/t_4
-innodb_encrypted_2/t_40
-innodb_encrypted_2/t_41
-innodb_encrypted_2/t_42
-innodb_encrypted_2/t_43
-innodb_encrypted_2/t_44
-innodb_encrypted_2/t_45
-innodb_encrypted_2/t_46
-innodb_encrypted_2/t_47
-innodb_encrypted_2/t_48
-innodb_encrypted_2/t_49
-innodb_encrypted_2/t_5
-innodb_encrypted_2/t_50
-innodb_encrypted_2/t_51
-innodb_encrypted_2/t_52
-innodb_encrypted_2/t_53
-innodb_encrypted_2/t_54
-innodb_encrypted_2/t_55
-innodb_encrypted_2/t_56
-innodb_encrypted_2/t_57
-innodb_encrypted_2/t_58
-innodb_encrypted_2/t_59
-innodb_encrypted_2/t_6
-innodb_encrypted_2/t_60
-innodb_encrypted_2/t_61
-innodb_encrypted_2/t_62
-innodb_encrypted_2/t_63
-innodb_encrypted_2/t_64
-innodb_encrypted_2/t_65
-innodb_encrypted_2/t_66
-innodb_encrypted_2/t_67
-innodb_encrypted_2/t_68
-innodb_encrypted_2/t_69
-innodb_encrypted_2/t_7
-innodb_encrypted_2/t_70
-innodb_encrypted_2/t_71
-innodb_encrypted_2/t_72
-innodb_encrypted_2/t_73
-innodb_encrypted_2/t_74
-innodb_encrypted_2/t_75
-innodb_encrypted_2/t_76
-innodb_encrypted_2/t_77
-innodb_encrypted_2/t_78
-innodb_encrypted_2/t_79
-innodb_encrypted_2/t_8
-innodb_encrypted_2/t_80
-innodb_encrypted_2/t_81
-innodb_encrypted_2/t_82
-innodb_encrypted_2/t_83
-innodb_encrypted_2/t_84
-innodb_encrypted_2/t_85
-innodb_encrypted_2/t_86
-innodb_encrypted_2/t_87
-innodb_encrypted_2/t_88
-innodb_encrypted_2/t_89
-innodb_encrypted_2/t_9
-innodb_encrypted_2/t_90
-innodb_encrypted_2/t_91
-innodb_encrypted_2/t_92
-innodb_encrypted_2/t_93
-innodb_encrypted_2/t_94
-innodb_encrypted_2/t_95
-innodb_encrypted_2/t_96
-innodb_encrypted_2/t_97
-innodb_encrypted_2/t_98
-innodb_encrypted_2/t_99
-# should contain 100 tables
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-innodb_encrypted_3/t_1
-innodb_encrypted_3/t_10
-innodb_encrypted_3/t_100
-innodb_encrypted_3/t_11
-innodb_encrypted_3/t_12
-innodb_encrypted_3/t_13
-innodb_encrypted_3/t_14
-innodb_encrypted_3/t_15
-innodb_encrypted_3/t_16
-innodb_encrypted_3/t_17
-innodb_encrypted_3/t_18
-innodb_encrypted_3/t_19
-innodb_encrypted_3/t_2
-innodb_encrypted_3/t_20
-innodb_encrypted_3/t_21
-innodb_encrypted_3/t_22
-innodb_encrypted_3/t_23
-innodb_encrypted_3/t_24
-innodb_encrypted_3/t_25
-innodb_encrypted_3/t_26
-innodb_encrypted_3/t_27
-innodb_encrypted_3/t_28
-innodb_encrypted_3/t_29
-innodb_encrypted_3/t_3
-innodb_encrypted_3/t_30
-innodb_encrypted_3/t_31
-innodb_encrypted_3/t_32
-innodb_encrypted_3/t_33
-innodb_encrypted_3/t_34
-innodb_encrypted_3/t_35
-innodb_encrypted_3/t_36
-innodb_encrypted_3/t_37
-innodb_encrypted_3/t_38
-innodb_encrypted_3/t_39
-innodb_encrypted_3/t_4
-innodb_encrypted_3/t_40
-innodb_encrypted_3/t_41
-innodb_encrypted_3/t_42
-innodb_encrypted_3/t_43
-innodb_encrypted_3/t_44
-innodb_encrypted_3/t_45
-innodb_encrypted_3/t_46
-innodb_encrypted_3/t_47
-innodb_encrypted_3/t_48
-innodb_encrypted_3/t_49
-innodb_encrypted_3/t_5
-innodb_encrypted_3/t_50
-innodb_encrypted_3/t_51
-innodb_encrypted_3/t_52
-innodb_encrypted_3/t_53
-innodb_encrypted_3/t_54
-innodb_encrypted_3/t_55
-innodb_encrypted_3/t_56
-innodb_encrypted_3/t_57
-innodb_encrypted_3/t_58
-innodb_encrypted_3/t_59
-innodb_encrypted_3/t_6
-innodb_encrypted_3/t_60
-innodb_encrypted_3/t_61
-innodb_encrypted_3/t_62
-innodb_encrypted_3/t_63
-innodb_encrypted_3/t_64
-innodb_encrypted_3/t_65
-innodb_encrypted_3/t_66
-innodb_encrypted_3/t_67
-innodb_encrypted_3/t_68
-innodb_encrypted_3/t_69
-innodb_encrypted_3/t_7
-innodb_encrypted_3/t_70
-innodb_encrypted_3/t_71
-innodb_encrypted_3/t_72
-innodb_encrypted_3/t_73
-innodb_encrypted_3/t_74
-innodb_encrypted_3/t_75
-innodb_encrypted_3/t_76
-innodb_encrypted_3/t_77
-innodb_encrypted_3/t_78
-innodb_encrypted_3/t_79
-innodb_encrypted_3/t_8
-innodb_encrypted_3/t_80
-innodb_encrypted_3/t_81
-innodb_encrypted_3/t_82
-innodb_encrypted_3/t_83
-innodb_encrypted_3/t_84
-innodb_encrypted_3/t_85
-innodb_encrypted_3/t_86
-innodb_encrypted_3/t_87
-innodb_encrypted_3/t_88
-innodb_encrypted_3/t_89
-innodb_encrypted_3/t_9
-innodb_encrypted_3/t_90
-innodb_encrypted_3/t_91
-innodb_encrypted_3/t_92
-innodb_encrypted_3/t_93
-innodb_encrypted_3/t_94
-innodb_encrypted_3/t_95
-innodb_encrypted_3/t_96
-innodb_encrypted_3/t_97
-innodb_encrypted_3/t_98
-innodb_encrypted_3/t_99
-use test;
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-innodb_encrypted_2/t_1
-innodb_encrypted_2/t_10
-innodb_encrypted_2/t_100
-innodb_encrypted_2/t_11
-innodb_encrypted_2/t_12
-innodb_encrypted_2/t_13
-innodb_encrypted_2/t_14
-innodb_encrypted_2/t_15
-innodb_encrypted_2/t_16
-innodb_encrypted_2/t_17
-innodb_encrypted_2/t_18
-innodb_encrypted_2/t_19
-innodb_encrypted_2/t_2
-innodb_encrypted_2/t_20
-innodb_encrypted_2/t_21
-innodb_encrypted_2/t_22
-innodb_encrypted_2/t_23
-innodb_encrypted_2/t_24
-innodb_encrypted_2/t_25
-innodb_encrypted_2/t_26
-innodb_encrypted_2/t_27
-innodb_encrypted_2/t_28
-innodb_encrypted_2/t_29
-innodb_encrypted_2/t_3
-innodb_encrypted_2/t_30
-innodb_encrypted_2/t_31
-innodb_encrypted_2/t_32
-innodb_encrypted_2/t_33
-innodb_encrypted_2/t_34
-innodb_encrypted_2/t_35
-innodb_encrypted_2/t_36
-innodb_encrypted_2/t_37
-innodb_encrypted_2/t_38
-innodb_encrypted_2/t_39
-innodb_encrypted_2/t_4
-innodb_encrypted_2/t_40
-innodb_encrypted_2/t_41
-innodb_encrypted_2/t_42
-innodb_encrypted_2/t_43
-innodb_encrypted_2/t_44
-innodb_encrypted_2/t_45
-innodb_encrypted_2/t_46
-innodb_encrypted_2/t_47
-innodb_encrypted_2/t_48
-innodb_encrypted_2/t_49
-innodb_encrypted_2/t_5
-innodb_encrypted_2/t_50
-innodb_encrypted_2/t_51
-innodb_encrypted_2/t_52
-innodb_encrypted_2/t_53
-innodb_encrypted_2/t_54
-innodb_encrypted_2/t_55
-innodb_encrypted_2/t_56
-innodb_encrypted_2/t_57
-innodb_encrypted_2/t_58
-innodb_encrypted_2/t_59
-innodb_encrypted_2/t_6
-innodb_encrypted_2/t_60
-innodb_encrypted_2/t_61
-innodb_encrypted_2/t_62
-innodb_encrypted_2/t_63
-innodb_encrypted_2/t_64
-innodb_encrypted_2/t_65
-innodb_encrypted_2/t_66
-innodb_encrypted_2/t_67
-innodb_encrypted_2/t_68
-innodb_encrypted_2/t_69
-innodb_encrypted_2/t_7
-innodb_encrypted_2/t_70
-innodb_encrypted_2/t_71
-innodb_encrypted_2/t_72
-innodb_encrypted_2/t_73
-innodb_encrypted_2/t_74
-innodb_encrypted_2/t_75
-innodb_encrypted_2/t_76
-innodb_encrypted_2/t_77
-innodb_encrypted_2/t_78
-innodb_encrypted_2/t_79
-innodb_encrypted_2/t_8
-innodb_encrypted_2/t_80
-innodb_encrypted_2/t_81
-innodb_encrypted_2/t_82
-innodb_encrypted_2/t_83
-innodb_encrypted_2/t_84
-innodb_encrypted_2/t_85
-innodb_encrypted_2/t_86
-innodb_encrypted_2/t_87
-innodb_encrypted_2/t_88
-innodb_encrypted_2/t_89
-innodb_encrypted_2/t_9
-innodb_encrypted_2/t_90
-innodb_encrypted_2/t_91
-innodb_encrypted_2/t_92
-innodb_encrypted_2/t_93
-innodb_encrypted_2/t_94
-innodb_encrypted_2/t_95
-innodb_encrypted_2/t_96
-innodb_encrypted_2/t_97
-innodb_encrypted_2/t_98
-innodb_encrypted_2/t_99
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-innodb_encrypted_3/t_1
-innodb_encrypted_3/t_10
-innodb_encrypted_3/t_100
-innodb_encrypted_3/t_11
-innodb_encrypted_3/t_12
-innodb_encrypted_3/t_13
-innodb_encrypted_3/t_14
-innodb_encrypted_3/t_15
-innodb_encrypted_3/t_16
-innodb_encrypted_3/t_17
-innodb_encrypted_3/t_18
-innodb_encrypted_3/t_19
-innodb_encrypted_3/t_2
-innodb_encrypted_3/t_20
-innodb_encrypted_3/t_21
-innodb_encrypted_3/t_22
-innodb_encrypted_3/t_23
-innodb_encrypted_3/t_24
-innodb_encrypted_3/t_25
-innodb_encrypted_3/t_26
-innodb_encrypted_3/t_27
-innodb_encrypted_3/t_28
-innodb_encrypted_3/t_29
-innodb_encrypted_3/t_3
-innodb_encrypted_3/t_30
-innodb_encrypted_3/t_31
-innodb_encrypted_3/t_32
-innodb_encrypted_3/t_33
-innodb_encrypted_3/t_34
-innodb_encrypted_3/t_35
-innodb_encrypted_3/t_36
-innodb_encrypted_3/t_37
-innodb_encrypted_3/t_38
-innodb_encrypted_3/t_39
-innodb_encrypted_3/t_4
-innodb_encrypted_3/t_40
-innodb_encrypted_3/t_41
-innodb_encrypted_3/t_42
-innodb_encrypted_3/t_43
-innodb_encrypted_3/t_44
-innodb_encrypted_3/t_45
-innodb_encrypted_3/t_46
-innodb_encrypted_3/t_47
-innodb_encrypted_3/t_48
-innodb_encrypted_3/t_49
-innodb_encrypted_3/t_5
-innodb_encrypted_3/t_50
-innodb_encrypted_3/t_51
-innodb_encrypted_3/t_52
-innodb_encrypted_3/t_53
-innodb_encrypted_3/t_54
-innodb_encrypted_3/t_55
-innodb_encrypted_3/t_56
-innodb_encrypted_3/t_57
-innodb_encrypted_3/t_58
-innodb_encrypted_3/t_59
-innodb_encrypted_3/t_6
-innodb_encrypted_3/t_60
-innodb_encrypted_3/t_61
-innodb_encrypted_3/t_62
-innodb_encrypted_3/t_63
-innodb_encrypted_3/t_64
-innodb_encrypted_3/t_65
-innodb_encrypted_3/t_66
-innodb_encrypted_3/t_67
-innodb_encrypted_3/t_68
-innodb_encrypted_3/t_69
-innodb_encrypted_3/t_7
-innodb_encrypted_3/t_70
-innodb_encrypted_3/t_71
-innodb_encrypted_3/t_72
-innodb_encrypted_3/t_73
-innodb_encrypted_3/t_74
-innodb_encrypted_3/t_75
-innodb_encrypted_3/t_76
-innodb_encrypted_3/t_77
-innodb_encrypted_3/t_78
-innodb_encrypted_3/t_79
-innodb_encrypted_3/t_8
-innodb_encrypted_3/t_80
-innodb_encrypted_3/t_81
-innodb_encrypted_3/t_82
-innodb_encrypted_3/t_83
-innodb_encrypted_3/t_84
-innodb_encrypted_3/t_85
-innodb_encrypted_3/t_86
-innodb_encrypted_3/t_87
-innodb_encrypted_3/t_88
-innodb_encrypted_3/t_89
-innodb_encrypted_3/t_9
-innodb_encrypted_3/t_90
-innodb_encrypted_3/t_91
-innodb_encrypted_3/t_92
-innodb_encrypted_3/t_93
-innodb_encrypted_3/t_94
-innodb_encrypted_3/t_95
-innodb_encrypted_3/t_96
-innodb_encrypted_3/t_97
-innodb_encrypted_3/t_98
-innodb_encrypted_3/t_99
-SET GLOBAL innodb_encrypt_tables = on;
-SET GLOBAL innodb_encryption_threads=4;
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-innodb_encrypted_2/t_1
-innodb_encrypted_2/t_10
-innodb_encrypted_2/t_100
-innodb_encrypted_2/t_11
-innodb_encrypted_2/t_12
-innodb_encrypted_2/t_13
-innodb_encrypted_2/t_14
-innodb_encrypted_2/t_15
-innodb_encrypted_2/t_16
-innodb_encrypted_2/t_17
-innodb_encrypted_2/t_18
-innodb_encrypted_2/t_19
-innodb_encrypted_2/t_2
-innodb_encrypted_2/t_20
-innodb_encrypted_2/t_21
-innodb_encrypted_2/t_22
-innodb_encrypted_2/t_23
-innodb_encrypted_2/t_24
-innodb_encrypted_2/t_25
-innodb_encrypted_2/t_26
-innodb_encrypted_2/t_27
-innodb_encrypted_2/t_28
-innodb_encrypted_2/t_29
-innodb_encrypted_2/t_3
-innodb_encrypted_2/t_30
-innodb_encrypted_2/t_31
-innodb_encrypted_2/t_32
-innodb_encrypted_2/t_33
-innodb_encrypted_2/t_34
-innodb_encrypted_2/t_35
-innodb_encrypted_2/t_36
-innodb_encrypted_2/t_37
-innodb_encrypted_2/t_38
-innodb_encrypted_2/t_39
-innodb_encrypted_2/t_4
-innodb_encrypted_2/t_40
-innodb_encrypted_2/t_41
-innodb_encrypted_2/t_42
-innodb_encrypted_2/t_43
-innodb_encrypted_2/t_44
-innodb_encrypted_2/t_45
-innodb_encrypted_2/t_46
-innodb_encrypted_2/t_47
-innodb_encrypted_2/t_48
-innodb_encrypted_2/t_49
-innodb_encrypted_2/t_5
-innodb_encrypted_2/t_50
-innodb_encrypted_2/t_51
-innodb_encrypted_2/t_52
-innodb_encrypted_2/t_53
-innodb_encrypted_2/t_54
-innodb_encrypted_2/t_55
-innodb_encrypted_2/t_56
-innodb_encrypted_2/t_57
-innodb_encrypted_2/t_58
-innodb_encrypted_2/t_59
-innodb_encrypted_2/t_6
-innodb_encrypted_2/t_60
-innodb_encrypted_2/t_61
-innodb_encrypted_2/t_62
-innodb_encrypted_2/t_63
-innodb_encrypted_2/t_64
-innodb_encrypted_2/t_65
-innodb_encrypted_2/t_66
-innodb_encrypted_2/t_67
-innodb_encrypted_2/t_68
-innodb_encrypted_2/t_69
-innodb_encrypted_2/t_7
-innodb_encrypted_2/t_70
-innodb_encrypted_2/t_71
-innodb_encrypted_2/t_72
-innodb_encrypted_2/t_73
-innodb_encrypted_2/t_74
-innodb_encrypted_2/t_75
-innodb_encrypted_2/t_76
-innodb_encrypted_2/t_77
-innodb_encrypted_2/t_78
-innodb_encrypted_2/t_79
-innodb_encrypted_2/t_8
-innodb_encrypted_2/t_80
-innodb_encrypted_2/t_81
-innodb_encrypted_2/t_82
-innodb_encrypted_2/t_83
-innodb_encrypted_2/t_84
-innodb_encrypted_2/t_85
-innodb_encrypted_2/t_86
-innodb_encrypted_2/t_87
-innodb_encrypted_2/t_88
-innodb_encrypted_2/t_89
-innodb_encrypted_2/t_9
-innodb_encrypted_2/t_90
-innodb_encrypted_2/t_91
-innodb_encrypted_2/t_92
-innodb_encrypted_2/t_93
-innodb_encrypted_2/t_94
-innodb_encrypted_2/t_95
-innodb_encrypted_2/t_96
-innodb_encrypted_2/t_97
-innodb_encrypted_2/t_98
-innodb_encrypted_2/t_99
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-innodb_encrypted_3/t_1
-innodb_encrypted_3/t_10
-innodb_encrypted_3/t_100
-innodb_encrypted_3/t_11
-innodb_encrypted_3/t_12
-innodb_encrypted_3/t_13
-innodb_encrypted_3/t_14
-innodb_encrypted_3/t_15
-innodb_encrypted_3/t_16
-innodb_encrypted_3/t_17
-innodb_encrypted_3/t_18
-innodb_encrypted_3/t_19
-innodb_encrypted_3/t_2
-innodb_encrypted_3/t_20
-innodb_encrypted_3/t_21
-innodb_encrypted_3/t_22
-innodb_encrypted_3/t_23
-innodb_encrypted_3/t_24
-innodb_encrypted_3/t_25
-innodb_encrypted_3/t_26
-innodb_encrypted_3/t_27
-innodb_encrypted_3/t_28
-innodb_encrypted_3/t_29
-innodb_encrypted_3/t_3
-innodb_encrypted_3/t_30
-innodb_encrypted_3/t_31
-innodb_encrypted_3/t_32
-innodb_encrypted_3/t_33
-innodb_encrypted_3/t_34
-innodb_encrypted_3/t_35
-innodb_encrypted_3/t_36
-innodb_encrypted_3/t_37
-innodb_encrypted_3/t_38
-innodb_encrypted_3/t_39
-innodb_encrypted_3/t_4
-innodb_encrypted_3/t_40
-innodb_encrypted_3/t_41
-innodb_encrypted_3/t_42
-innodb_encrypted_3/t_43
-innodb_encrypted_3/t_44
-innodb_encrypted_3/t_45
-innodb_encrypted_3/t_46
-innodb_encrypted_3/t_47
-innodb_encrypted_3/t_48
-innodb_encrypted_3/t_49
-innodb_encrypted_3/t_5
-innodb_encrypted_3/t_50
-innodb_encrypted_3/t_51
-innodb_encrypted_3/t_52
-innodb_encrypted_3/t_53
-innodb_encrypted_3/t_54
-innodb_encrypted_3/t_55
-innodb_encrypted_3/t_56
-innodb_encrypted_3/t_57
-innodb_encrypted_3/t_58
-innodb_encrypted_3/t_59
-innodb_encrypted_3/t_6
-innodb_encrypted_3/t_60
-innodb_encrypted_3/t_61
-innodb_encrypted_3/t_62
-innodb_encrypted_3/t_63
-innodb_encrypted_3/t_64
-innodb_encrypted_3/t_65
-innodb_encrypted_3/t_66
-innodb_encrypted_3/t_67
-innodb_encrypted_3/t_68
-innodb_encrypted_3/t_69
-innodb_encrypted_3/t_7
-innodb_encrypted_3/t_70
-innodb_encrypted_3/t_71
-innodb_encrypted_3/t_72
-innodb_encrypted_3/t_73
-innodb_encrypted_3/t_74
-innodb_encrypted_3/t_75
-innodb_encrypted_3/t_76
-innodb_encrypted_3/t_77
-innodb_encrypted_3/t_78
-innodb_encrypted_3/t_79
-innodb_encrypted_3/t_8
-innodb_encrypted_3/t_80
-innodb_encrypted_3/t_81
-innodb_encrypted_3/t_82
-innodb_encrypted_3/t_83
-innodb_encrypted_3/t_84
-innodb_encrypted_3/t_85
-innodb_encrypted_3/t_86
-innodb_encrypted_3/t_87
-innodb_encrypted_3/t_88
-innodb_encrypted_3/t_89
-innodb_encrypted_3/t_9
-innodb_encrypted_3/t_90
-innodb_encrypted_3/t_91
-innodb_encrypted_3/t_92
-innodb_encrypted_3/t_93
-innodb_encrypted_3/t_94
-innodb_encrypted_3/t_95
-innodb_encrypted_3/t_96
-innodb_encrypted_3/t_97
-innodb_encrypted_3/t_98
-innodb_encrypted_3/t_99
-# Success!
-# Restart mysqld --innodb_encrypt_tables=0 --innodb_encryption_threads=0
-# restart: --innodb_encrypt_tables=0 --innodb_encryption_threads=0
-# Restart Success!
-use innodb_encrypted_1;
-use innodb_encrypted_2;
-use innodb_encrypted_3;
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-innodb_encrypted_3/t_1
-innodb_encrypted_3/t_10
-innodb_encrypted_3/t_100
-innodb_encrypted_3/t_11
-innodb_encrypted_3/t_12
-innodb_encrypted_3/t_13
-innodb_encrypted_3/t_14
-innodb_encrypted_3/t_15
-innodb_encrypted_3/t_16
-innodb_encrypted_3/t_17
-innodb_encrypted_3/t_18
-innodb_encrypted_3/t_19
-innodb_encrypted_3/t_2
-innodb_encrypted_3/t_20
-innodb_encrypted_3/t_21
-innodb_encrypted_3/t_22
-innodb_encrypted_3/t_23
-innodb_encrypted_3/t_24
-innodb_encrypted_3/t_25
-innodb_encrypted_3/t_26
-innodb_encrypted_3/t_27
-innodb_encrypted_3/t_28
-innodb_encrypted_3/t_29
-innodb_encrypted_3/t_3
-innodb_encrypted_3/t_30
-innodb_encrypted_3/t_31
-innodb_encrypted_3/t_32
-innodb_encrypted_3/t_33
-innodb_encrypted_3/t_34
-innodb_encrypted_3/t_35
-innodb_encrypted_3/t_36
-innodb_encrypted_3/t_37
-innodb_encrypted_3/t_38
-innodb_encrypted_3/t_39
-innodb_encrypted_3/t_4
-innodb_encrypted_3/t_40
-innodb_encrypted_3/t_41
-innodb_encrypted_3/t_42
-innodb_encrypted_3/t_43
-innodb_encrypted_3/t_44
-innodb_encrypted_3/t_45
-innodb_encrypted_3/t_46
-innodb_encrypted_3/t_47
-innodb_encrypted_3/t_48
-innodb_encrypted_3/t_49
-innodb_encrypted_3/t_5
-innodb_encrypted_3/t_50
-innodb_encrypted_3/t_51
-innodb_encrypted_3/t_52
-innodb_encrypted_3/t_53
-innodb_encrypted_3/t_54
-innodb_encrypted_3/t_55
-innodb_encrypted_3/t_56
-innodb_encrypted_3/t_57
-innodb_encrypted_3/t_58
-innodb_encrypted_3/t_59
-innodb_encrypted_3/t_6
-innodb_encrypted_3/t_60
-innodb_encrypted_3/t_61
-innodb_encrypted_3/t_62
-innodb_encrypted_3/t_63
-innodb_encrypted_3/t_64
-innodb_encrypted_3/t_65
-innodb_encrypted_3/t_66
-innodb_encrypted_3/t_67
-innodb_encrypted_3/t_68
-innodb_encrypted_3/t_69
-innodb_encrypted_3/t_7
-innodb_encrypted_3/t_70
-innodb_encrypted_3/t_71
-innodb_encrypted_3/t_72
-innodb_encrypted_3/t_73
-innodb_encrypted_3/t_74
-innodb_encrypted_3/t_75
-innodb_encrypted_3/t_76
-innodb_encrypted_3/t_77
-innodb_encrypted_3/t_78
-innodb_encrypted_3/t_79
-innodb_encrypted_3/t_8
-innodb_encrypted_3/t_80
-innodb_encrypted_3/t_81
-innodb_encrypted_3/t_82
-innodb_encrypted_3/t_83
-innodb_encrypted_3/t_84
-innodb_encrypted_3/t_85
-innodb_encrypted_3/t_86
-innodb_encrypted_3/t_87
-innodb_encrypted_3/t_88
-innodb_encrypted_3/t_89
-innodb_encrypted_3/t_9
-innodb_encrypted_3/t_90
-innodb_encrypted_3/t_91
-innodb_encrypted_3/t_92
-innodb_encrypted_3/t_93
-innodb_encrypted_3/t_94
-innodb_encrypted_3/t_95
-innodb_encrypted_3/t_96
-innodb_encrypted_3/t_97
-innodb_encrypted_3/t_98
-innodb_encrypted_3/t_99
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-innodb_encrypted_2/t_1
-innodb_encrypted_2/t_10
-innodb_encrypted_2/t_100
-innodb_encrypted_2/t_11
-innodb_encrypted_2/t_12
-innodb_encrypted_2/t_13
-innodb_encrypted_2/t_14
-innodb_encrypted_2/t_15
-innodb_encrypted_2/t_16
-innodb_encrypted_2/t_17
-innodb_encrypted_2/t_18
-innodb_encrypted_2/t_19
-innodb_encrypted_2/t_2
-innodb_encrypted_2/t_20
-innodb_encrypted_2/t_21
-innodb_encrypted_2/t_22
-innodb_encrypted_2/t_23
-innodb_encrypted_2/t_24
-innodb_encrypted_2/t_25
-innodb_encrypted_2/t_26
-innodb_encrypted_2/t_27
-innodb_encrypted_2/t_28
-innodb_encrypted_2/t_29
-innodb_encrypted_2/t_3
-innodb_encrypted_2/t_30
-innodb_encrypted_2/t_31
-innodb_encrypted_2/t_32
-innodb_encrypted_2/t_33
-innodb_encrypted_2/t_34
-innodb_encrypted_2/t_35
-innodb_encrypted_2/t_36
-innodb_encrypted_2/t_37
-innodb_encrypted_2/t_38
-innodb_encrypted_2/t_39
-innodb_encrypted_2/t_4
-innodb_encrypted_2/t_40
-innodb_encrypted_2/t_41
-innodb_encrypted_2/t_42
-innodb_encrypted_2/t_43
-innodb_encrypted_2/t_44
-innodb_encrypted_2/t_45
-innodb_encrypted_2/t_46
-innodb_encrypted_2/t_47
-innodb_encrypted_2/t_48
-innodb_encrypted_2/t_49
-innodb_encrypted_2/t_5
-innodb_encrypted_2/t_50
-innodb_encrypted_2/t_51
-innodb_encrypted_2/t_52
-innodb_encrypted_2/t_53
-innodb_encrypted_2/t_54
-innodb_encrypted_2/t_55
-innodb_encrypted_2/t_56
-innodb_encrypted_2/t_57
-innodb_encrypted_2/t_58
-innodb_encrypted_2/t_59
-innodb_encrypted_2/t_6
-innodb_encrypted_2/t_60
-innodb_encrypted_2/t_61
-innodb_encrypted_2/t_62
-innodb_encrypted_2/t_63
-innodb_encrypted_2/t_64
-innodb_encrypted_2/t_65
-innodb_encrypted_2/t_66
-innodb_encrypted_2/t_67
-innodb_encrypted_2/t_68
-innodb_encrypted_2/t_69
-innodb_encrypted_2/t_7
-innodb_encrypted_2/t_70
-innodb_encrypted_2/t_71
-innodb_encrypted_2/t_72
-innodb_encrypted_2/t_73
-innodb_encrypted_2/t_74
-innodb_encrypted_2/t_75
-innodb_encrypted_2/t_76
-innodb_encrypted_2/t_77
-innodb_encrypted_2/t_78
-innodb_encrypted_2/t_79
-innodb_encrypted_2/t_8
-innodb_encrypted_2/t_80
-innodb_encrypted_2/t_81
-innodb_encrypted_2/t_82
-innodb_encrypted_2/t_83
-innodb_encrypted_2/t_84
-innodb_encrypted_2/t_85
-innodb_encrypted_2/t_86
-innodb_encrypted_2/t_87
-innodb_encrypted_2/t_88
-innodb_encrypted_2/t_89
-innodb_encrypted_2/t_9
-innodb_encrypted_2/t_90
-innodb_encrypted_2/t_91
-innodb_encrypted_2/t_92
-innodb_encrypted_2/t_93
-innodb_encrypted_2/t_94
-innodb_encrypted_2/t_95
-innodb_encrypted_2/t_96
-innodb_encrypted_2/t_97
-innodb_encrypted_2/t_98
-innodb_encrypted_2/t_99
-SET GLOBAL innodb_encrypt_tables = off;
-SET GLOBAL innodb_encryption_threads=4;
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-innodb_encrypted_2/t_1
-innodb_encrypted_2/t_10
-innodb_encrypted_2/t_100
-innodb_encrypted_2/t_11
-innodb_encrypted_2/t_12
-innodb_encrypted_2/t_13
-innodb_encrypted_2/t_14
-innodb_encrypted_2/t_15
-innodb_encrypted_2/t_16
-innodb_encrypted_2/t_17
-innodb_encrypted_2/t_18
-innodb_encrypted_2/t_19
-innodb_encrypted_2/t_2
-innodb_encrypted_2/t_20
-innodb_encrypted_2/t_21
-innodb_encrypted_2/t_22
-innodb_encrypted_2/t_23
-innodb_encrypted_2/t_24
-innodb_encrypted_2/t_25
-innodb_encrypted_2/t_26
-innodb_encrypted_2/t_27
-innodb_encrypted_2/t_28
-innodb_encrypted_2/t_29
-innodb_encrypted_2/t_3
-innodb_encrypted_2/t_30
-innodb_encrypted_2/t_31
-innodb_encrypted_2/t_32
-innodb_encrypted_2/t_33
-innodb_encrypted_2/t_34
-innodb_encrypted_2/t_35
-innodb_encrypted_2/t_36
-innodb_encrypted_2/t_37
-innodb_encrypted_2/t_38
-innodb_encrypted_2/t_39
-innodb_encrypted_2/t_4
-innodb_encrypted_2/t_40
-innodb_encrypted_2/t_41
-innodb_encrypted_2/t_42
-innodb_encrypted_2/t_43
-innodb_encrypted_2/t_44
-innodb_encrypted_2/t_45
-innodb_encrypted_2/t_46
-innodb_encrypted_2/t_47
-innodb_encrypted_2/t_48
-innodb_encrypted_2/t_49
-innodb_encrypted_2/t_5
-innodb_encrypted_2/t_50
-innodb_encrypted_2/t_51
-innodb_encrypted_2/t_52
-innodb_encrypted_2/t_53
-innodb_encrypted_2/t_54
-innodb_encrypted_2/t_55
-innodb_encrypted_2/t_56
-innodb_encrypted_2/t_57
-innodb_encrypted_2/t_58
-innodb_encrypted_2/t_59
-innodb_encrypted_2/t_6
-innodb_encrypted_2/t_60
-innodb_encrypted_2/t_61
-innodb_encrypted_2/t_62
-innodb_encrypted_2/t_63
-innodb_encrypted_2/t_64
-innodb_encrypted_2/t_65
-innodb_encrypted_2/t_66
-innodb_encrypted_2/t_67
-innodb_encrypted_2/t_68
-innodb_encrypted_2/t_69
-innodb_encrypted_2/t_7
-innodb_encrypted_2/t_70
-innodb_encrypted_2/t_71
-innodb_encrypted_2/t_72
-innodb_encrypted_2/t_73
-innodb_encrypted_2/t_74
-innodb_encrypted_2/t_75
-innodb_encrypted_2/t_76
-innodb_encrypted_2/t_77
-innodb_encrypted_2/t_78
-innodb_encrypted_2/t_79
-innodb_encrypted_2/t_8
-innodb_encrypted_2/t_80
-innodb_encrypted_2/t_81
-innodb_encrypted_2/t_82
-innodb_encrypted_2/t_83
-innodb_encrypted_2/t_84
-innodb_encrypted_2/t_85
-innodb_encrypted_2/t_86
-innodb_encrypted_2/t_87
-innodb_encrypted_2/t_88
-innodb_encrypted_2/t_89
-innodb_encrypted_2/t_9
-innodb_encrypted_2/t_90
-innodb_encrypted_2/t_91
-innodb_encrypted_2/t_92
-innodb_encrypted_2/t_93
-innodb_encrypted_2/t_94
-innodb_encrypted_2/t_95
-innodb_encrypted_2/t_96
-innodb_encrypted_2/t_97
-innodb_encrypted_2/t_98
-innodb_encrypted_2/t_99
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-NAME
-innodb_encrypted_3/t_1
-innodb_encrypted_3/t_10
-innodb_encrypted_3/t_100
-innodb_encrypted_3/t_11
-innodb_encrypted_3/t_12
-innodb_encrypted_3/t_13
-innodb_encrypted_3/t_14
-innodb_encrypted_3/t_15
-innodb_encrypted_3/t_16
-innodb_encrypted_3/t_17
-innodb_encrypted_3/t_18
-innodb_encrypted_3/t_19
-innodb_encrypted_3/t_2
-innodb_encrypted_3/t_20
-innodb_encrypted_3/t_21
-innodb_encrypted_3/t_22
-innodb_encrypted_3/t_23
-innodb_encrypted_3/t_24
-innodb_encrypted_3/t_25
-innodb_encrypted_3/t_26
-innodb_encrypted_3/t_27
-innodb_encrypted_3/t_28
-innodb_encrypted_3/t_29
-innodb_encrypted_3/t_3
-innodb_encrypted_3/t_30
-innodb_encrypted_3/t_31
-innodb_encrypted_3/t_32
-innodb_encrypted_3/t_33
-innodb_encrypted_3/t_34
-innodb_encrypted_3/t_35
-innodb_encrypted_3/t_36
-innodb_encrypted_3/t_37
-innodb_encrypted_3/t_38
-innodb_encrypted_3/t_39
-innodb_encrypted_3/t_4
-innodb_encrypted_3/t_40
-innodb_encrypted_3/t_41
-innodb_encrypted_3/t_42
-innodb_encrypted_3/t_43
-innodb_encrypted_3/t_44
-innodb_encrypted_3/t_45
-innodb_encrypted_3/t_46
-innodb_encrypted_3/t_47
-innodb_encrypted_3/t_48
-innodb_encrypted_3/t_49
-innodb_encrypted_3/t_5
-innodb_encrypted_3/t_50
-innodb_encrypted_3/t_51
-innodb_encrypted_3/t_52
-innodb_encrypted_3/t_53
-innodb_encrypted_3/t_54
-innodb_encrypted_3/t_55
-innodb_encrypted_3/t_56
-innodb_encrypted_3/t_57
-innodb_encrypted_3/t_58
-innodb_encrypted_3/t_59
-innodb_encrypted_3/t_6
-innodb_encrypted_3/t_60
-innodb_encrypted_3/t_61
-innodb_encrypted_3/t_62
-innodb_encrypted_3/t_63
-innodb_encrypted_3/t_64
-innodb_encrypted_3/t_65
-innodb_encrypted_3/t_66
-innodb_encrypted_3/t_67
-innodb_encrypted_3/t_68
-innodb_encrypted_3/t_69
-innodb_encrypted_3/t_7
-innodb_encrypted_3/t_70
-innodb_encrypted_3/t_71
-innodb_encrypted_3/t_72
-innodb_encrypted_3/t_73
-innodb_encrypted_3/t_74
-innodb_encrypted_3/t_75
-innodb_encrypted_3/t_76
-innodb_encrypted_3/t_77
-innodb_encrypted_3/t_78
-innodb_encrypted_3/t_79
-innodb_encrypted_3/t_8
-innodb_encrypted_3/t_80
-innodb_encrypted_3/t_81
-innodb_encrypted_3/t_82
-innodb_encrypted_3/t_83
-innodb_encrypted_3/t_84
-innodb_encrypted_3/t_85
-innodb_encrypted_3/t_86
-innodb_encrypted_3/t_87
-innodb_encrypted_3/t_88
-innodb_encrypted_3/t_89
-innodb_encrypted_3/t_9
-innodb_encrypted_3/t_90
-innodb_encrypted_3/t_91
-innodb_encrypted_3/t_92
-innodb_encrypted_3/t_93
-innodb_encrypted_3/t_94
-innodb_encrypted_3/t_95
-innodb_encrypted_3/t_96
-innodb_encrypted_3/t_97
-innodb_encrypted_3/t_98
-innodb_encrypted_3/t_99
-use test;
-drop database innodb_encrypted_1;
-drop database innodb_encrypted_2;
-drop database innodb_encrypted_3;
diff --git a/mysql-test/suite/encryption/t/innodb_lotoftables.opt b/mysql-test/suite/encryption/t/innodb_lotoftables.opt
deleted file mode 100644
index ffb5a2957f8..00000000000
--- a/mysql-test/suite/encryption/t/innodb_lotoftables.opt
+++ /dev/null
@@ -1,3 +0,0 @@
---innodb-tablespaces-encryption
---innodb-encrypt-tables=off
---innodb-encryption-threads=0
diff --git a/mysql-test/suite/encryption/t/innodb_lotoftables.test b/mysql-test/suite/encryption/t/innodb_lotoftables.test
deleted file mode 100644
index 413fc8685f2..00000000000
--- a/mysql-test/suite/encryption/t/innodb_lotoftables.test
+++ /dev/null
@@ -1,207 +0,0 @@
--- source include/have_innodb.inc
--- source include/have_example_key_management_plugin.inc
--- source include/big_test.inc
-
-# embedded does not support restart
--- source include/not_embedded.inc
-
---disable_query_log
-let $innodb_encryption_threads_orig = `SELECT @@global.innodb_encryption_threads`;
---enable_query_log
-
-# empty the change buffer and the undo logs to avoid extra reads
-SET GLOBAL innodb_fast_shutdown=0;
---source include/restart_mysqld.inc
-
-SHOW VARIABLES LIKE 'innodb_encrypt%';
-
-#
-# This will create 100 tables where that could be
-# encrypted an unencrypt
-#
-create database innodb_encrypted_1;
-use innodb_encrypted_1;
-set autocommit=0;
-let $tables = 100;
-
---disable_query_log
-while ($tables)
-{
- eval create table t_$tables (a int not null primary key, b varchar(200)) engine=innodb
- stats_persistent=0;
- commit;
- let $rows = 100;
- while($rows)
- {
- eval insert into t_$tables values ($rows, substring(MD5(RAND()), -64));
- dec $rows;
- }
- commit;
- dec $tables;
-}
---enable_query_log
-
-set autocommit=1;
-commit work;
-#
-# Verify
-#
---echo # should be empty
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE NAME LIKE 'innodb_encrypted%';
-
-#
-# This will create 100 tables that are encrypted always
-#
-create database innodb_encrypted_2;
-use innodb_encrypted_2;
-set autocommit=0;
-
---disable_query_log
-let $tables = 100;
-while ($tables)
-{
- eval create table t_$tables (a int not null primary key, b varchar(200)) engine=innodb
- stats_persistent=0 encrypted=yes;
- commit;
- let $rows = 100;
- while($rows)
- {
- eval insert into t_$tables values ($rows, substring(MD5(RAND()), -64));
- dec $rows;
- }
- commit;
- dec $tables;
-}
---enable_query_log
-
-commit work;
-set autocommit=1;
-#
-# Verify
-#
---echo # should contain 100 tables
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
---echo # should contain 0 tables
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-
-#
-# This will create 100 tables that are not encrypted
-#
-create database innodb_encrypted_3;
-use innodb_encrypted_3;
-set autocommit=0;
-
---disable_query_log
-let $tables = 100;
-while ($tables)
-{
- eval create table t_$tables (a int not null primary key, b varchar(200)) engine=innodb
- stats_persistent=0 encrypted=no;
- commit;
- let $rows = 100;
- while($rows)
- {
- eval insert into t_$tables values ($rows, substring(MD5(RAND()), -64));
- dec $rows;
- }
- commit;
- dec $tables;
-}
---enable_query_log
-
-commit work;
-set autocommit=1;
-#
-# Verify
-#
---echo # should contain 100 tables
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
---echo # should contain 100 tables
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-
-use test;
-
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-
-SET GLOBAL innodb_encrypt_tables = on;
-SET GLOBAL innodb_encryption_threads=4;
-
---let $wait_timeout= 600
---let $wait_condition=SELECT COUNT(*) = 100 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0;
---source include/wait_condition.inc
-
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-
---echo # Success!
---echo # Restart mysqld --innodb_encrypt_tables=0 --innodb_encryption_threads=0
--- let $restart_parameters=--innodb_encrypt_tables=0 --innodb_encryption_threads=0
--- source include/restart_mysqld.inc
-
---echo # Restart Success!
-
-use innodb_encrypted_1;
-
---disable_result_log
---disable_query_log
-let $tables = 100;
-while ($tables)
-{
- eval select * from t_$tables;
- dec $tables;
-}
---enable_query_log
---enable_result_log
-
-use innodb_encrypted_2;
-
---disable_result_log
---disable_query_log
-let $tables = 100;
-while ($tables)
-{
- eval select * from t_$tables;
- dec $tables;
-}
---enable_query_log
---enable_result_log
-
-use innodb_encrypted_3;
-
---disable_result_log
---disable_query_log
-let $tables = 100;
-while ($tables)
-{
- eval select * from t_$tables;
- dec $tables;
-}
---enable_query_log
---enable_result_log
-
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-
-SET GLOBAL innodb_encrypt_tables = off;
-SET GLOBAL innodb_encryption_threads=4;
-
---let $wait_timeout= 600
---let $wait_condition=SELECT COUNT(*) = 100 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0;
---source include/wait_condition.inc
-
-
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND NAME LIKE 'innodb_encrypted%' ORDER BY NAME;
-
-#
-# Cleanup
-#
-use test;
-drop database innodb_encrypted_1;
-drop database innodb_encrypted_2;
-drop database innodb_encrypted_3;
-
---disable_query_log
-EVAL SET GLOBAL innodb_encryption_threads = $innodb_encryption_threads_orig;
---enable_query_log
diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def
index 9a9524f9a82..8b3e5500709 100644
--- a/mysql-test/suite/galera/disabled.def
+++ b/mysql-test/suite/galera/disabled.def
@@ -18,6 +18,7 @@ MW-328C : MDEV-17847 Galera test failure on MW-328[A|B|C]
MW-329 : wsrep_local_replays not stable
MW-336 : MDEV-13549 incorrect wait_condition for wsrep_slave_threads changes
MW-360 : needs rewrite to be MariaDB gtid compatible
+MW-336 : MDEV-19746 Galera test failures because of wsrep_slave_threads identification
MW-416 : MDEV-13549 Galera test failures
MW-44 : MDEV-15809 Test failure on galera.MW-44
galera_account_management : MariaDB 10.0 does not support ALTER USER
@@ -49,6 +50,7 @@ galera_var_node_address : MDEV-17151 Galera test failure
galera_var_notify_cmd : MDEV-13549 Galera test failures
galera_var_reject_queries : assertion in inline_mysql_socket_send
galera_var_retry_autocommit: MDEV-18181 Galera test failure on galera.galera_var_retry_autocommit
+galera_var_slave_threads : MDEV-19746 Galera test failures because of wsrep_slave_threads identification
galera_wan : MDEV-17259: Test failure on galera.galera_wan
mysql-wsrep#198 : MDEV-18935 Galera test mysql-wsrep#198 sporaric assertion transaction.cpp:362: int wsrep::transaction::before_commit(): Assertion `state() == s_executing || state() == s_committing || state() == s_must_abort || state() == s_replaying' failed.
partition : MDEV-13549 regularly showing auto_increment mismatch
diff --git a/mysql-test/suite/heap/heap.result b/mysql-test/suite/heap/heap.result
index 326142a71a4..e8d1341aa9b 100644
--- a/mysql-test/suite/heap/heap.result
+++ b/mysql-test/suite/heap/heap.result
@@ -563,32 +563,32 @@ t1 CREATE TABLE `t1` (
) ENGINE=MEMORY DEFAULT CHARSET=latin1
select count(*) from t1;
count(*)
-270
+267
insert into t1 values(concat('a',char(1)),concat('a',char(1)),concat('a',char(1)));
select count(*) from t1 where v='a';
count(*)
-10
+7
select count(*) from t1 where c='a';
count(*)
-10
+7
select count(*) from t1 where t='a';
count(*)
-10
+7
select count(*) from t1 where v='a ';
count(*)
-10
+7
select count(*) from t1 where c='a ';
count(*)
-10
+7
select count(*) from t1 where t='a ';
count(*)
-10
+7
select count(*) from t1 where v between 'a' and 'a ';
count(*)
-10
+7
select count(*) from t1 where v between 'a' and 'a ' and v between 'a ' and 'b\n';
count(*)
-10
+7
explain select count(*) from t1 where v='a ';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref v v 13 const # Using where
@@ -618,9 +618,6 @@ qq
*a *a*a *
*a *a*a *
*a *a*a *
-*a *a*a *
-*a *a*a *
-*a *a*a *
explain select * from t1 where v='a';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref v v 13 const # Using where
diff --git a/mysql-test/suite/heap/heap.test b/mysql-test/suite/heap/heap.test
index ea07d020e4d..237685a6423 100644
--- a/mysql-test/suite/heap/heap.test
+++ b/mysql-test/suite/heap/heap.test
@@ -337,6 +337,7 @@ while ($1)
}
dec $1;
}
+delete from t1 where v like 'a%' and length(v) > 7;
commit;
--enable_query_log
select count(*) from t1;
diff --git a/mysql-test/suite/innodb/r/innodb-64k-crash.result b/mysql-test/suite/innodb/r/innodb-64k-crash.result
index 0ff5c81f3a2..765abbc2cd4 100644
--- a/mysql-test/suite/innodb/r/innodb-64k-crash.result
+++ b/mysql-test/suite/innodb/r/innodb-64k-crash.result
@@ -271,320 +271,14 @@ vb=@c,wb=@c,xb=@c,yb=@c,zb=@c,
ac=@c,bc=@c,cc=@c,dc=@c,ec=@c,fc=@c,gc=@c,hc=@c,ic=@c,jc=@c,
kc=@c,lc=@c,mc=@c,nc=@c,oc=@c,pc=@c,qc=@c,rc=@c,sc=@c,tc=@c,uc=@c,
vc=@c,wc=@c,xc=@c,yc=@c,zc=@c;
+connect con1,localhost,root,,;
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+DELETE FROM t2 LIMIT 1;
+disconnect con1;
+connection default;
# restart
-UPDATE t1 SET a=@e,b=@e,c=@e,d=@e,e=@e,f=@e,g=@e,h=@e,i=@e,j=@e,
-k=@e,l=@e,m=@e,n=@e,o=@e,p=@e,q=@e,r=@e,s=@e,t=@e,u=@e,
-v=@e,w=@e,x=@e,y=@e,z=@e,
-aa=@e,ba=@e,ca=@e,da=@e,ea=@e,fa=@e,ga=@e,ha=@e,ia=@e,ja=@e,
-ka=@e,la=@e,ma=@e,na=@e,oa=@e,pa=@e,qa=@e,ra=@e,sa=@e,ta=@e,ua=@e,
-va=@e,wa=@e,xa=@e,ya=@e,za=@e,
-ab=@e,bb=@e,cb=@e,db=@e,eb=@e,fb=@e,gb=@e,hb=@e,ib=@e,jb=@e,
-kb=@e,lb=@e,mb=@e,nb=@e,ob=@e,pb=@e,qb=@e,rb=@e,sb=@e,tb=@e,ub=@e,
-vb=@e,wb=@e,xb=@e,yb=@e,zb=@e,
-ac=@e,bc=@e,cc=@e,dc=@e,ec=@e,fc=@e,gc=@e,hc=@e,ic=@e,jc=@e,
-kc=@e,lc=@e,mc=@e,nc=@e,oc=@e,pc=@e,qc=@e,rc=@e,sc=@e,tc=@e,uc=@e,
-vc=@e,wc=@e,xc=@e,yc=@e,zc=@e;
-UPDATE t2 SET a=@l,b=@l,c=@l,d=@l,e=@l,f=@l,g=@l,h=@l,i=@l,j=@l,
-k=@l,l=@l,m=@l,n=@l,o=@l,p=@l,q=@l,r=@l,s=@l,t=@l,u=@l,
-v=@l,w=@l,x=@l,y=@l,z=@l,
-aa=@l,ba=@l,ca=@l,da=@l,ea=@l,fa=@l,ga=@l,ha=@l,ia=@l,ja=@l,
-ka=@l,la=@l,ma=@l,na=@l,oa=@l,pa=@l,qa=@l,ra=@l,sa=@l,ta=@l,ua=@l,
-va=@l,wa=@l,xa=@l,ya=@l,za=@l,
-ab=@l,bb=@l,cb=@l,db=@l,eb=@l,fb=@l,gb=@l,hb=@l,ib=@l,jb=@l,
-kb=@l,lb=@l,mb=@l,nb=@l,ob=@l,pb=@l,qb=@l,rb=@l,sb=@l,tb=@l,ub=@l,
-vb=@l,wb=@l,xb=@l,yb=@l,zb=@l,
-ac=@l,bc=@l,cc=@l,dc=@l,ec=@l,fc=@l,gc=@l,hc=@l,ic=@l,jc=@l,
-kc=@l,lc=@l,mc=@l,nc=@l,oc=@l,pc=@l,qc=@l,rc=@l,sc=@l,tc=@l,uc=@l,
-vc=@l,wc=@l,xc=@l,yc=@l,zc=@l;
-COMMIT;
-BEGIN;
-UPDATE t1 SET a=@f,b=@f,c=@f,d=@f,e=@f;
-UPDATE t1 SET f=@f,g=@f,h=@f,i=@f,j=@f;
-UPDATE t1 SET k=@f,l=@f,m=@f,n=@f,o=@f;
-UPDATE t1 SET p=@f,q=@f,r=@f,s=@f,t=@f,u=@f;
-UPDATE t1 SET v=@f,w=@f,x=@f,y=@f,z=@f;
-UPDATE t1 SET aa=@f,ba=@f,ca=@f,da=@f;
-UPDATE t1 SET ea=@f,fa=@f,ga=@f,ha=@f,ia=@f,ja=@f;
-UPDATE t1 SET ka=@f,la=@f,ma=@f,na=@f,oa=@f,pa=@f;
-UPDATE t1 SET qa=@f,ra=@f,sa=@f,ta=@f,ua=@f;
-UPDATE t1 SET va=@f,wa=@f,xa=@f,ya=@f,za=@f;
-UPDATE t1 SET ab=@f,bb=@f,cb=@f,db=@f;
-UPDATE t1 SET eb=@f,fb=@f,gb=@f,hb=@f,ib=@f,ja=@f;
-UPDATE t1 SET kb=@f,lb=@f,mb=@f,nb=@f,ob=@f,pa=@f;
-UPDATE t1 SET qb=@f,rb=@f,sb=@f,tb=@f,ub=@f;
-UPDATE t1 SET vb=@f,wb=@f,xb=@f,yb=@f,zb=@f;
-UPDATE t1 SET ac=@f,bc=@f,cc=@f,dc=@f;
-UPDATE t1 SET ec=@f,fc=@f,gc=@f,hc=@f,ic=@f,jc=@f;
-UPDATE t1 SET kc=@f,lc=@f,mc=@f,nc=@f,oc=@f,pc=@f;
-UPDATE t1 SET qc=@f,rc=@f,sc=@f,tc=@f,uc=@f;
-UPDATE t1 SET vc=@f,wc=@f,xc=@f,yc=@f,zc=@f;
-COMMIT;
-BEGIN;
-UPDATE t2 SET a=@f,b=@f,c=@f,d=@f,e=@f;
-UPDATE t2 SET f=@f,g=@f,h=@f,i=@f,j=@f;
-UPDATE t2 SET k=@f,l=@f,m=@f,n=@f,o=@f;
-UPDATE t2 SET p=@f,q=@f,r=@f,s=@f,t=@f,u=@f;
-UPDATE t2 SET v=@f,w=@f,x=@f,y=@f,z=@f;
-UPDATE t2 SET aa=@f,ba=@f,ca=@f,da=@f;
-UPDATE t2 SET ea=@f,fa=@f,ga=@f,ha=@f,ia=@f,ja=@f;
-UPDATE t2 SET ka=@f,la=@f,ma=@f,na=@f,oa=@f,pa=@f;
-UPDATE t2 SET qa=@f,ra=@f,sa=@f,ta=@f,ua=@f;
-UPDATE t2 SET va=@f,wa=@f,xa=@f,ya=@f,za=@f;
-UPDATE t2 SET ab=@f,bb=@f,cb=@f,db=@f;
-UPDATE t2 SET eb=@f,fb=@f,gb=@f,hb=@f,ib=@f,ja=@f;
-UPDATE t2 SET kb=@f,lb=@f,mb=@f,nb=@f,ob=@f,pa=@f;
-UPDATE t2 SET qb=@f,rb=@f,sb=@f,tb=@f,ub=@f;
-UPDATE t2 SET vb=@f,wb=@f,xb=@f,yb=@f,zb=@f;
-UPDATE t2 SET ac=@f,bc=@f,cc=@f,dc=@f;
-UPDATE t2 SET ec=@f,fc=@f,gc=@f,hc=@f,ic=@f,jc=@f;
-UPDATE t2 SET kc=@f,lc=@f,mc=@f,nc=@f,oc=@f,pc=@f;
-UPDATE t2 SET qc=@f,rc=@f,sc=@f,tc=@f,uc=@f;
-UPDATE t2 SET vc=@f,wc=@f,xc=@f,yc=@f,zc=@f;
-COMMIT;
-show create table t1;
-Table Create Table
-t1 CREATE TABLE `t1` (
- `a` blob DEFAULT NULL,
- `b` blob DEFAULT NULL,
- `c` blob DEFAULT NULL,
- `d` blob DEFAULT NULL,
- `e` blob DEFAULT NULL,
- `f` blob DEFAULT NULL,
- `g` blob DEFAULT NULL,
- `h` blob DEFAULT NULL,
- `i` blob DEFAULT NULL,
- `j` blob DEFAULT NULL,
- `k` blob DEFAULT NULL,
- `l` blob DEFAULT NULL,
- `m` blob DEFAULT NULL,
- `n` blob DEFAULT NULL,
- `o` blob DEFAULT NULL,
- `p` blob DEFAULT NULL,
- `q` blob DEFAULT NULL,
- `r` blob DEFAULT NULL,
- `s` blob DEFAULT NULL,
- `t` blob DEFAULT NULL,
- `u` blob DEFAULT NULL,
- `v` blob DEFAULT NULL,
- `w` blob DEFAULT NULL,
- `x` blob DEFAULT NULL,
- `y` blob DEFAULT NULL,
- `z` blob DEFAULT NULL,
- `aa` blob DEFAULT NULL,
- `ba` blob DEFAULT NULL,
- `ca` blob DEFAULT NULL,
- `da` blob DEFAULT NULL,
- `ea` blob DEFAULT NULL,
- `fa` blob DEFAULT NULL,
- `ga` blob DEFAULT NULL,
- `ha` blob DEFAULT NULL,
- `ia` blob DEFAULT NULL,
- `ja` blob DEFAULT NULL,
- `ka` blob DEFAULT NULL,
- `la` blob DEFAULT NULL,
- `ma` blob DEFAULT NULL,
- `na` blob DEFAULT NULL,
- `oa` blob DEFAULT NULL,
- `pa` blob DEFAULT NULL,
- `qa` blob DEFAULT NULL,
- `ra` blob DEFAULT NULL,
- `sa` blob DEFAULT NULL,
- `ta` blob DEFAULT NULL,
- `ua` blob DEFAULT NULL,
- `va` blob DEFAULT NULL,
- `wa` blob DEFAULT NULL,
- `xa` blob DEFAULT NULL,
- `ya` blob DEFAULT NULL,
- `za` blob DEFAULT NULL,
- `ab` blob DEFAULT NULL,
- `bb` blob DEFAULT NULL,
- `cb` blob DEFAULT NULL,
- `db` blob DEFAULT NULL,
- `eb` blob DEFAULT NULL,
- `fb` blob DEFAULT NULL,
- `gb` blob DEFAULT NULL,
- `hb` blob DEFAULT NULL,
- `ib` blob DEFAULT NULL,
- `jb` blob DEFAULT NULL,
- `kb` blob DEFAULT NULL,
- `lb` blob DEFAULT NULL,
- `mb` blob DEFAULT NULL,
- `nb` blob DEFAULT NULL,
- `ob` blob DEFAULT NULL,
- `pb` blob DEFAULT NULL,
- `qb` blob DEFAULT NULL,
- `rb` blob DEFAULT NULL,
- `sb` blob DEFAULT NULL,
- `tb` blob DEFAULT NULL,
- `ub` blob DEFAULT NULL,
- `vb` blob DEFAULT NULL,
- `wb` blob DEFAULT NULL,
- `xb` blob DEFAULT NULL,
- `yb` blob DEFAULT NULL,
- `zb` blob DEFAULT NULL,
- `ac` blob DEFAULT NULL,
- `bc` blob DEFAULT NULL,
- `cc` blob DEFAULT NULL,
- `dc` blob DEFAULT NULL,
- `ec` blob DEFAULT NULL,
- `fc` blob DEFAULT NULL,
- `gc` blob DEFAULT NULL,
- `hc` blob DEFAULT NULL,
- `ic` blob DEFAULT NULL,
- `jc` blob DEFAULT NULL,
- `kc` blob DEFAULT NULL,
- `lc` blob DEFAULT NULL,
- `mc` blob DEFAULT NULL,
- `nc` blob DEFAULT NULL,
- `oc` blob DEFAULT NULL,
- `pc` blob DEFAULT NULL,
- `qc` blob DEFAULT NULL,
- `rc` blob DEFAULT NULL,
- `sc` blob DEFAULT NULL,
- `tc` blob DEFAULT NULL,
- `uc` blob DEFAULT NULL,
- `vc` blob DEFAULT NULL,
- `wc` blob DEFAULT NULL,
- `xc` blob DEFAULT NULL,
- `yc` blob DEFAULT NULL,
- `zc` blob DEFAULT NULL,
- KEY `t1a` (`a`(767),`b`(767)),
- KEY `t1c` (`c`(767),`d`(767)),
- KEY `t1e` (`e`(767),`f`(767)),
- KEY `t1f2` (`g`(767),`h`(767)),
- KEY `t1f4` (`i`(767),`j`(767)),
- KEY `t1k` (`k`(767),`m`(767)),
- KEY `t1f8` (`n`(767),`o`(767)),
- KEY `t1f11` (`p`(767),`q`(767)),
- KEY `t1f13` (`r`(767),`s`(767)),
- KEY `t1f15` (`t`(767),`u`(767)),
- KEY `t1f18` (`w`(767),`x`(767)),
- KEY `t1f20` (`y`(767),`z`(767)),
- KEY `ta1a6` (`aa`(767),`ba`(767)),
- KEY `tc1c6` (`ca`(767),`da`(767)),
- KEY `te1e6` (`ea`(767),`fa`(767))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
-show create table t2;
-Table Create Table
-t2 CREATE TABLE `t2` (
- `a` blob DEFAULT NULL,
- `b` blob DEFAULT NULL,
- `c` blob DEFAULT NULL,
- `d` blob DEFAULT NULL,
- `e` blob DEFAULT NULL,
- `f` blob DEFAULT NULL,
- `g` blob DEFAULT NULL,
- `h` blob DEFAULT NULL,
- `i` blob DEFAULT NULL,
- `j` blob DEFAULT NULL,
- `k` blob DEFAULT NULL,
- `l` blob DEFAULT NULL,
- `m` blob DEFAULT NULL,
- `n` blob DEFAULT NULL,
- `o` blob DEFAULT NULL,
- `p` blob DEFAULT NULL,
- `q` blob DEFAULT NULL,
- `r` blob DEFAULT NULL,
- `s` blob DEFAULT NULL,
- `t` blob DEFAULT NULL,
- `u` blob DEFAULT NULL,
- `v` blob DEFAULT NULL,
- `w` blob DEFAULT NULL,
- `x` blob DEFAULT NULL,
- `y` blob DEFAULT NULL,
- `z` blob DEFAULT NULL,
- `aa` blob DEFAULT NULL,
- `ba` blob DEFAULT NULL,
- `ca` blob DEFAULT NULL,
- `da` blob DEFAULT NULL,
- `ea` blob DEFAULT NULL,
- `fa` blob DEFAULT NULL,
- `ga` blob DEFAULT NULL,
- `ha` blob DEFAULT NULL,
- `ia` blob DEFAULT NULL,
- `ja` blob DEFAULT NULL,
- `ka` blob DEFAULT NULL,
- `la` blob DEFAULT NULL,
- `ma` blob DEFAULT NULL,
- `na` blob DEFAULT NULL,
- `oa` blob DEFAULT NULL,
- `pa` blob DEFAULT NULL,
- `qa` blob DEFAULT NULL,
- `ra` blob DEFAULT NULL,
- `sa` blob DEFAULT NULL,
- `ta` blob DEFAULT NULL,
- `ua` blob DEFAULT NULL,
- `va` blob DEFAULT NULL,
- `wa` blob DEFAULT NULL,
- `xa` blob DEFAULT NULL,
- `ya` blob DEFAULT NULL,
- `za` blob DEFAULT NULL,
- `ab` blob DEFAULT NULL,
- `bb` blob DEFAULT NULL,
- `cb` blob DEFAULT NULL,
- `db` blob DEFAULT NULL,
- `eb` blob DEFAULT NULL,
- `fb` blob DEFAULT NULL,
- `gb` blob DEFAULT NULL,
- `hb` blob DEFAULT NULL,
- `ib` blob DEFAULT NULL,
- `jb` blob DEFAULT NULL,
- `kb` blob DEFAULT NULL,
- `lb` blob DEFAULT NULL,
- `mb` blob DEFAULT NULL,
- `nb` blob DEFAULT NULL,
- `ob` blob DEFAULT NULL,
- `pb` blob DEFAULT NULL,
- `qb` blob DEFAULT NULL,
- `rb` blob DEFAULT NULL,
- `sb` blob DEFAULT NULL,
- `tb` blob DEFAULT NULL,
- `ub` blob DEFAULT NULL,
- `vb` blob DEFAULT NULL,
- `wb` blob DEFAULT NULL,
- `xb` blob DEFAULT NULL,
- `yb` blob DEFAULT NULL,
- `zb` blob DEFAULT NULL,
- `ac` blob DEFAULT NULL,
- `bc` blob DEFAULT NULL,
- `cc` blob DEFAULT NULL,
- `dc` blob DEFAULT NULL,
- `ec` blob DEFAULT NULL,
- `fc` blob DEFAULT NULL,
- `gc` blob DEFAULT NULL,
- `hc` blob DEFAULT NULL,
- `ic` blob DEFAULT NULL,
- `jc` blob DEFAULT NULL,
- `kc` blob DEFAULT NULL,
- `lc` blob DEFAULT NULL,
- `mc` blob DEFAULT NULL,
- `nc` blob DEFAULT NULL,
- `oc` blob DEFAULT NULL,
- `pc` blob DEFAULT NULL,
- `qc` blob DEFAULT NULL,
- `rc` blob DEFAULT NULL,
- `sc` blob DEFAULT NULL,
- `tc` blob DEFAULT NULL,
- `uc` blob DEFAULT NULL,
- `vc` blob DEFAULT NULL,
- `wc` blob DEFAULT NULL,
- `xc` blob DEFAULT NULL,
- `yc` blob DEFAULT NULL,
- `zc` blob DEFAULT NULL,
- KEY `t2a` (`a`(767),`b`(767)),
- KEY `t2c` (`c`(767),`d`(767)),
- KEY `t2e` (`e`(767),`f`(767)),
- KEY `t2f2` (`g`(767),`h`(767)),
- KEY `t2f4` (`i`(767),`j`(767)),
- KEY `t2k` (`k`(767),`m`(767)),
- KEY `t2f8` (`n`(767),`o`(767)),
- KEY `t2f11` (`p`(767),`q`(767)),
- KEY `t2f13` (`r`(767),`s`(767)),
- KEY `t2f15` (`t`(767),`u`(767)),
- KEY `t2f18` (`w`(767),`x`(767)),
- KEY `t2f20` (`y`(767),`z`(767)),
- KEY `ta2a6` (`aa`(767),`ba`(767)),
- KEY `tc2c6` (`ca`(767),`da`(767)),
- KEY `te2e6` (`ea`(767),`fa`(767))
-) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT
+check table t1,t2;
+Table Op Msg_type Msg_text
+test.t1 check status OK
+test.t2 check status OK
drop table t1,t2;
diff --git a/mysql-test/suite/innodb/t/innodb-64k-crash.test b/mysql-test/suite/innodb/t/innodb-64k-crash.test
index 8139b7ce4e4..950c1752ccd 100644
--- a/mysql-test/suite/innodb/t/innodb-64k-crash.test
+++ b/mysql-test/suite/innodb/t/innodb-64k-crash.test
@@ -300,84 +300,15 @@ UPDATE t1 SET a=@c,b=@c,c=@c,d=@c,e=@c,f=@c,g=@c,h=@c,i=@c,j=@c,
kc=@c,lc=@c,mc=@c,nc=@c,oc=@c,pc=@c,qc=@c,rc=@c,sc=@c,tc=@c,uc=@c,
vc=@c,wc=@c,xc=@c,yc=@c,zc=@c;
+connect (con1,localhost,root,,);
+SET GLOBAL innodb_flush_log_at_trx_commit=1;
+DELETE FROM t2 LIMIT 1;
+disconnect con1;
+connection default;
+
--let $shutdown_timeout=0
--source include/restart_mysqld.inc
--let $shutdown_timeout=
-UPDATE t1 SET a=@e,b=@e,c=@e,d=@e,e=@e,f=@e,g=@e,h=@e,i=@e,j=@e,
- k=@e,l=@e,m=@e,n=@e,o=@e,p=@e,q=@e,r=@e,s=@e,t=@e,u=@e,
- v=@e,w=@e,x=@e,y=@e,z=@e,
- aa=@e,ba=@e,ca=@e,da=@e,ea=@e,fa=@e,ga=@e,ha=@e,ia=@e,ja=@e,
- ka=@e,la=@e,ma=@e,na=@e,oa=@e,pa=@e,qa=@e,ra=@e,sa=@e,ta=@e,ua=@e,
- va=@e,wa=@e,xa=@e,ya=@e,za=@e,
- ab=@e,bb=@e,cb=@e,db=@e,eb=@e,fb=@e,gb=@e,hb=@e,ib=@e,jb=@e,
- kb=@e,lb=@e,mb=@e,nb=@e,ob=@e,pb=@e,qb=@e,rb=@e,sb=@e,tb=@e,ub=@e,
- vb=@e,wb=@e,xb=@e,yb=@e,zb=@e,
- ac=@e,bc=@e,cc=@e,dc=@e,ec=@e,fc=@e,gc=@e,hc=@e,ic=@e,jc=@e,
- kc=@e,lc=@e,mc=@e,nc=@e,oc=@e,pc=@e,qc=@e,rc=@e,sc=@e,tc=@e,uc=@e,
- vc=@e,wc=@e,xc=@e,yc=@e,zc=@e;
-
-UPDATE t2 SET a=@l,b=@l,c=@l,d=@l,e=@l,f=@l,g=@l,h=@l,i=@l,j=@l,
- k=@l,l=@l,m=@l,n=@l,o=@l,p=@l,q=@l,r=@l,s=@l,t=@l,u=@l,
- v=@l,w=@l,x=@l,y=@l,z=@l,
- aa=@l,ba=@l,ca=@l,da=@l,ea=@l,fa=@l,ga=@l,ha=@l,ia=@l,ja=@l,
- ka=@l,la=@l,ma=@l,na=@l,oa=@l,pa=@l,qa=@l,ra=@l,sa=@l,ta=@l,ua=@l,
- va=@l,wa=@l,xa=@l,ya=@l,za=@l,
- ab=@l,bb=@l,cb=@l,db=@l,eb=@l,fb=@l,gb=@l,hb=@l,ib=@l,jb=@l,
- kb=@l,lb=@l,mb=@l,nb=@l,ob=@l,pb=@l,qb=@l,rb=@l,sb=@l,tb=@l,ub=@l,
- vb=@l,wb=@l,xb=@l,yb=@l,zb=@l,
- ac=@l,bc=@l,cc=@l,dc=@l,ec=@l,fc=@l,gc=@l,hc=@l,ic=@l,jc=@l,
- kc=@l,lc=@l,mc=@l,nc=@l,oc=@l,pc=@l,qc=@l,rc=@l,sc=@l,tc=@l,uc=@l,
- vc=@l,wc=@l,xc=@l,yc=@l,zc=@l;
-
-COMMIT;
-
-BEGIN;
-UPDATE t1 SET a=@f,b=@f,c=@f,d=@f,e=@f;
-UPDATE t1 SET f=@f,g=@f,h=@f,i=@f,j=@f;
-UPDATE t1 SET k=@f,l=@f,m=@f,n=@f,o=@f;
-UPDATE t1 SET p=@f,q=@f,r=@f,s=@f,t=@f,u=@f;
-UPDATE t1 SET v=@f,w=@f,x=@f,y=@f,z=@f;
-UPDATE t1 SET aa=@f,ba=@f,ca=@f,da=@f;
-UPDATE t1 SET ea=@f,fa=@f,ga=@f,ha=@f,ia=@f,ja=@f;
-UPDATE t1 SET ka=@f,la=@f,ma=@f,na=@f,oa=@f,pa=@f;
-UPDATE t1 SET qa=@f,ra=@f,sa=@f,ta=@f,ua=@f;
-UPDATE t1 SET va=@f,wa=@f,xa=@f,ya=@f,za=@f;
-UPDATE t1 SET ab=@f,bb=@f,cb=@f,db=@f;
-UPDATE t1 SET eb=@f,fb=@f,gb=@f,hb=@f,ib=@f,ja=@f;
-UPDATE t1 SET kb=@f,lb=@f,mb=@f,nb=@f,ob=@f,pa=@f;
-UPDATE t1 SET qb=@f,rb=@f,sb=@f,tb=@f,ub=@f;
-UPDATE t1 SET vb=@f,wb=@f,xb=@f,yb=@f,zb=@f;
-UPDATE t1 SET ac=@f,bc=@f,cc=@f,dc=@f;
-UPDATE t1 SET ec=@f,fc=@f,gc=@f,hc=@f,ic=@f,jc=@f;
-UPDATE t1 SET kc=@f,lc=@f,mc=@f,nc=@f,oc=@f,pc=@f;
-UPDATE t1 SET qc=@f,rc=@f,sc=@f,tc=@f,uc=@f;
-UPDATE t1 SET vc=@f,wc=@f,xc=@f,yc=@f,zc=@f;
-COMMIT;
-
-BEGIN;
-UPDATE t2 SET a=@f,b=@f,c=@f,d=@f,e=@f;
-UPDATE t2 SET f=@f,g=@f,h=@f,i=@f,j=@f;
-UPDATE t2 SET k=@f,l=@f,m=@f,n=@f,o=@f;
-UPDATE t2 SET p=@f,q=@f,r=@f,s=@f,t=@f,u=@f;
-UPDATE t2 SET v=@f,w=@f,x=@f,y=@f,z=@f;
-UPDATE t2 SET aa=@f,ba=@f,ca=@f,da=@f;
-UPDATE t2 SET ea=@f,fa=@f,ga=@f,ha=@f,ia=@f,ja=@f;
-UPDATE t2 SET ka=@f,la=@f,ma=@f,na=@f,oa=@f,pa=@f;
-UPDATE t2 SET qa=@f,ra=@f,sa=@f,ta=@f,ua=@f;
-UPDATE t2 SET va=@f,wa=@f,xa=@f,ya=@f,za=@f;
-UPDATE t2 SET ab=@f,bb=@f,cb=@f,db=@f;
-UPDATE t2 SET eb=@f,fb=@f,gb=@f,hb=@f,ib=@f,ja=@f;
-UPDATE t2 SET kb=@f,lb=@f,mb=@f,nb=@f,ob=@f,pa=@f;
-UPDATE t2 SET qb=@f,rb=@f,sb=@f,tb=@f,ub=@f;
-UPDATE t2 SET vb=@f,wb=@f,xb=@f,yb=@f,zb=@f;
-UPDATE t2 SET ac=@f,bc=@f,cc=@f,dc=@f;
-UPDATE t2 SET ec=@f,fc=@f,gc=@f,hc=@f,ic=@f,jc=@f;
-UPDATE t2 SET kc=@f,lc=@f,mc=@f,nc=@f,oc=@f,pc=@f;
-UPDATE t2 SET qc=@f,rc=@f,sc=@f,tc=@f,uc=@f;
-UPDATE t2 SET vc=@f,wc=@f,xc=@f,yc=@f,zc=@f;
-COMMIT;
-
-show create table t1;
-show create table t2;
+check table t1,t2;
drop table t1,t2;
diff --git a/mysql-test/suite/innodb/t/leaf_page_corrupted_during_recovery.test b/mysql-test/suite/innodb/t/leaf_page_corrupted_during_recovery.test
index d81d613e7f1..bd8784236b6 100644
--- a/mysql-test/suite/innodb/t/leaf_page_corrupted_during_recovery.test
+++ b/mysql-test/suite/innodb/t/leaf_page_corrupted_during_recovery.test
@@ -9,6 +9,7 @@ call mtr.add_suppression("\\[ERROR\\] InnoDB: Plugin initialization aborted at s
call mtr.add_suppression("\\[ERROR\\] Plugin 'InnoDB' (init function|registration)");
call mtr.add_suppression("\\[ERROR\\] InnoDB: We detected index corruption");
call mtr.add_suppression("\\[ERROR\\] mysqld.*: Index for table 't1' is corrupt; try to repair it");
+call mtr.add_suppression("InnoDB: Error code: [0-9][0-9][0-9]* btr_pcur_open_low level: 0 called from file: ");
--enable_query_log
CREATE TABLE t1 (pk INT PRIMARY KEY, c CHAR(255))ENGINE=InnoDB STATS_PERSISTENT=0;
@@ -47,8 +48,6 @@ EOF
SELECT * FROM t1 WHERE PK = 1;
let $restart_parameters=--innodb-force-recovery=1;
-# Work around MDEV-19435 to avoid crash in row_purge_reset_trx_id()
-let $restart_parameters=--innodb-force-recovery=2;
--source include/restart_mysqld.inc
SELECT * FROM t1 WHERE PK = 1;
--error ER_NOT_KEYFILE
diff --git a/mysql-test/suite/plugins/r/server_audit.result b/mysql-test/suite/plugins/r/server_audit.result
index 39614b4505c..215625c4500 100644
--- a/mysql-test/suite/plugins/r/server_audit.result
+++ b/mysql-test/suite/plugins/r/server_audit.result
@@ -293,10 +293,10 @@ TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'insert into t2 values (1), (2)',0
TIME,HOSTNAME,root,localhost,ID,ID,READ,test,t2,
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'select * from t2',0
TIME,HOSTNAME,root,localhost,ID,ID,ALTER,test,t1,
+TIME,HOSTNAME,root,localhost,ID,ID,RENAME,test,t1|test.renamed_t1,
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,table_stats,
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,column_stats,
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,index_stats,
-TIME,HOSTNAME,root,localhost,ID,ID,RENAME,test,t1|test.renamed_t1,
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'alter table t1 rename renamed_t1',0
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'set global server_audit_events=\'connect,query\'',0
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'select 1,\n2,\n# comment\n3',0
diff --git a/mysql-test/suite/plugins/r/thread_pool_server_audit.result b/mysql-test/suite/plugins/r/thread_pool_server_audit.result
index 1a3a7d4c5bf..8c6ece53227 100644
--- a/mysql-test/suite/plugins/r/thread_pool_server_audit.result
+++ b/mysql-test/suite/plugins/r/thread_pool_server_audit.result
@@ -266,10 +266,10 @@ TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'insert into t2 values (1), (2)',0
TIME,HOSTNAME,root,localhost,ID,ID,READ,test,t2,
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'select * from t2',0
TIME,HOSTNAME,root,localhost,ID,ID,ALTER,test,t1,
+TIME,HOSTNAME,root,localhost,ID,ID,RENAME,test,t1|test.renamed_t1,
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,table_stats,
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,column_stats,
TIME,HOSTNAME,root,localhost,ID,ID,WRITE,mysql,index_stats,
-TIME,HOSTNAME,root,localhost,ID,ID,RENAME,test,t1|test.renamed_t1,
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'alter table t1 rename renamed_t1',0
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'set global server_audit_events=\'connect,query\'',0
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'select 1,\n2,\n# comment\n3',0
diff --git a/mysql-test/suite/rpl/disabled.def b/mysql-test/suite/rpl/disabled.def
index e5f708051ed..3ac023c9f4f 100644
--- a/mysql-test/suite/rpl/disabled.def
+++ b/mysql-test/suite/rpl/disabled.def
@@ -14,7 +14,6 @@ rpl_spec_variables : BUG#11755836 2009-10-27 jasonh rpl_spec_variables fa
rpl_get_master_version_and_clock : Bug#11766137 Jan 05 2011 joro Valgrind warnings rpl_get_master_version_and_clock
rpl_partition_archive : MDEV-5077 2013-09-27 svoj Cannot exchange partition with archive table
rpl_row_binlog_max_cache_size : MDEV-11092
-rpl_blackhole : MDEV-11094
rpl_row_index_choice : MDEV-11666
rpl_parallel2 : fails after MDEV-16172
rpl_semi_sync_after_sync : fails after MDEV-16172
diff --git a/mysql-test/suite/rpl/include/rpl_blackhole.test b/mysql-test/suite/rpl/include/rpl_blackhole.test
index a37d24b4cd6..6e7102b4203 100644
--- a/mysql-test/suite/rpl/include/rpl_blackhole.test
+++ b/mysql-test/suite/rpl/include/rpl_blackhole.test
@@ -11,7 +11,7 @@
# executing statement. If difference is >0, then something was
# written to the binary log on the slave.
-connection slave;
+# On Connection Slave
let $before = query_get_value("SHOW MASTER STATUS", Position, 1);
connection master;
diff --git a/mysql-test/suite/rpl/include/rpl_blackhole_basic.test b/mysql-test/suite/rpl/include/rpl_blackhole_basic.test
new file mode 100644
index 00000000000..c315906d47b
--- /dev/null
+++ b/mysql-test/suite/rpl/include/rpl_blackhole_basic.test
@@ -0,0 +1,97 @@
+# PURPOSE. Test that blackhole works with replication in all three
+# modes: STATEMENT, MIXED, and ROW.
+#
+# METHOD. We start by creating a table on the master and then change
+# the engine to use blackhole on the slave.
+#
+# After insert/update/delete of one or more rows, the test the
+# proceeds to check that replication is running after replicating an
+# change, that the blackhole engine does not contain anything (which
+# is just a check that the correct engine is used), and that something
+# is written to the binary log.
+#
+# Whe check INSERT, UPDATE, and DELETE statement for tables with no
+# key (forcing a range search on the slave), primary keys (using a
+# primary key lookup), and index/key with multiple matches (forcing an
+# index search).
+
+# We start with no primary key
+CREATE TABLE t1 (a INT, b INT, c INT);
+CREATE TABLE t2 (a INT, b INT, c INT);
+
+sync_slave_with_master;
+ALTER TABLE t1 ENGINE=BLACKHOLE;
+
+connection master;
+INSERT INTO t2 VALUES (1,9,1), (2,9,2), (3,9,3), (4,9,4);
+sync_slave_with_master;
+
+# Test insert, no primary key
+let $statement = INSERT INTO t1 VALUES (1,1,1),(2,1,2),(3,1,3),(4,1,4);
+source include/rpl_blackhole.test;
+
+# Test update, no primary key
+let $statement = UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 1;
+source include/rpl_blackhole.test;
+
+# Test delete, no primary key
+let $statement = DELETE FROM t1 WHERE a % 2 = 0 AND b = 1;
+source include/rpl_blackhole.test;
+
+# Test INSERT-SELECT into Blackhole, no primary key
+let $statement = INSERT INTO t1 SELECT * FROM t2;
+source include/rpl_blackhole.test;
+
+#
+# The MASTER has MyISAM as the engine for both tables. The SLAVE has Blackhole
+# on t1 (transactional engine) and MyISAM on t2 (non-transactional engine).
+#
+# In MIXED mode, the command "INSERT INTO t2 SELECT * FROM t1" is logged as
+# statement on the master. On the slave, it is tagged as unsafe because the
+# statement mixes both transactional and non-transactional engines and as such
+# its changes are logged as rows. However, due to the nature of the blackhole
+# engine, no rows are returned and thus any chain replication would make the
+# next master on the chain diverge.
+#
+# Fo this reason, we have disabled the statement.
+#
+# Test INSERT-SELECT from Blackhole, no primary key
+# let $statement = INSERT INTO t2 SELECT * FROM t1;
+# source include/rpl_blackhole.test;
+#
+
+connection master;
+ALTER TABLE t1 ADD PRIMARY KEY pk_t1 (a,b);
+sync_slave_with_master;
+
+# Test insert, primary key
+let $statement = INSERT INTO t1 VALUES (1,2,1),(2,2,2),(3,2,3),(4,2,4);
+source include/rpl_blackhole.test;
+
+# Test update, primary key
+let $statement = UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 2;
+source include/rpl_blackhole.test;
+
+# Test delete, primary key
+let $statement = DELETE FROM t1 WHERE a % 2 = 0 AND b = 2;
+source include/rpl_blackhole.test;
+
+connection master;
+ALTER TABLE t1 DROP PRIMARY KEY, ADD KEY key_t1 (a);
+sync_slave_with_master;
+
+# Test insert, key
+let $statement = INSERT INTO t1 VALUES (1,3,1),(2,3,2),(3,3,3),(4,3,4);
+source include/rpl_blackhole.test;
+
+# Test update, key
+let $statement = UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 3;
+source include/rpl_blackhole.test;
+
+# Test delete, key
+let $statement = DELETE FROM t1 WHERE a % 2 = 0 AND b = 3;
+source include/rpl_blackhole.test;
+
+connection master;
+DROP TABLE t1,t2;
+sync_slave_with_master;
diff --git a/mysql-test/suite/rpl/r/rpl_blackhole.result b/mysql-test/suite/rpl/r/rpl_blackhole.result
index b61e857fd3f..178c23b9f98 100644
--- a/mysql-test/suite/rpl/r/rpl_blackhole.result
+++ b/mysql-test/suite/rpl/r/rpl_blackhole.result
@@ -8,7 +8,6 @@ ALTER TABLE t1 ENGINE=BLACKHOLE;
connection master;
INSERT INTO t2 VALUES (1,9,1), (2,9,2), (3,9,3), (4,9,4);
connection slave;
-connection slave;
connection master;
INSERT INTO t1 VALUES (1,1,1),(2,1,2),(3,1,3),(4,1,4);
connection slave;
@@ -17,7 +16,6 @@ SELECT COUNT(*) FROM t1;
COUNT(*)
0
>>> Something was written to binary log <<<
-connection slave;
connection master;
UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 1;
connection slave;
@@ -26,7 +24,6 @@ SELECT COUNT(*) FROM t1;
COUNT(*)
0
>>> Something was written to binary log <<<
-connection slave;
connection master;
DELETE FROM t1 WHERE a % 2 = 0 AND b = 1;
connection slave;
@@ -35,7 +32,6 @@ SELECT COUNT(*) FROM t1;
COUNT(*)
0
>>> Something was written to binary log <<<
-connection slave;
connection master;
INSERT INTO t1 SELECT * FROM t2;
connection slave;
@@ -55,7 +51,6 @@ SELECT COUNT(*) FROM t1;
COUNT(*)
0
>>> Something was written to binary log <<<
-connection slave;
connection master;
UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 2;
connection slave;
@@ -64,7 +59,6 @@ SELECT COUNT(*) FROM t1;
COUNT(*)
0
>>> Something was written to binary log <<<
-connection slave;
connection master;
DELETE FROM t1 WHERE a % 2 = 0 AND b = 2;
connection slave;
@@ -84,7 +78,6 @@ SELECT COUNT(*) FROM t1;
COUNT(*)
0
>>> Something was written to binary log <<<
-connection slave;
connection master;
UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 3;
connection slave;
@@ -93,7 +86,6 @@ SELECT COUNT(*) FROM t1;
COUNT(*)
0
>>> Something was written to binary log <<<
-connection slave;
connection master;
DELETE FROM t1 WHERE a % 2 = 0 AND b = 3;
connection slave;
@@ -104,4 +96,5 @@ COUNT(*)
>>> Something was written to binary log <<<
connection master;
DROP TABLE t1,t2;
+connection slave;
include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result b/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result
new file mode 100644
index 00000000000..d92c3dce55b
--- /dev/null
+++ b/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result
@@ -0,0 +1,457 @@
+include/master-slave.inc
+[connection master]
+SET timestamp=1000000000;
+RESET MASTER;
+connection slave;
+SET timestamp=1000000000;
+RESET MASTER;
+connection master;
+CREATE TABLE t1 (a INT, b INT, c INT);
+CREATE TABLE t2 (a INT, b INT, c INT);
+connection slave;
+ALTER TABLE t1 ENGINE=BLACKHOLE;
+connection master;
+INSERT INTO t2 VALUES (1,9,1), (2,9,2), (3,9,3), (4,9,4);
+connection slave;
+connection master;
+INSERT INTO t1 VALUES (1,1,1),(2,1,2),(3,1,3),(4,1,4);
+connection slave;
+# Expect 0
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+>>> Something was written to binary log <<<
+connection master;
+UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 1;
+connection slave;
+# Expect 0
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+>>> Something was written to binary log <<<
+connection master;
+DELETE FROM t1 WHERE a % 2 = 0 AND b = 1;
+connection slave;
+# Expect 0
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+>>> Something was written to binary log <<<
+connection master;
+INSERT INTO t1 SELECT * FROM t2;
+connection slave;
+# Expect 0
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+>>> Something was written to binary log <<<
+connection master;
+ALTER TABLE t1 ADD PRIMARY KEY pk_t1 (a,b);
+connection slave;
+connection master;
+INSERT INTO t1 VALUES (1,2,1),(2,2,2),(3,2,3),(4,2,4);
+connection slave;
+# Expect 0
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+>>> Something was written to binary log <<<
+connection master;
+UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 2;
+connection slave;
+# Expect 0
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+>>> Something was written to binary log <<<
+connection master;
+DELETE FROM t1 WHERE a % 2 = 0 AND b = 2;
+connection slave;
+# Expect 0
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+>>> Something was written to binary log <<<
+connection master;
+ALTER TABLE t1 DROP PRIMARY KEY, ADD KEY key_t1 (a);
+connection slave;
+connection master;
+INSERT INTO t1 VALUES (1,3,1),(2,3,2),(3,3,3),(4,3,4);
+connection slave;
+# Expect 0
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+>>> Something was written to binary log <<<
+connection master;
+UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 3;
+connection slave;
+# Expect 0
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+>>> Something was written to binary log <<<
+connection master;
+DELETE FROM t1 WHERE a % 2 = 0 AND b = 3;
+connection slave;
+# Expect 0
+SELECT COUNT(*) FROM t1;
+COUNT(*)
+0
+>>> Something was written to binary log <<<
+connection master;
+DROP TABLE t1,t2;
+connection slave;
+connection slave;
+FLUSH LOGS;
+show binlog events in 'slave-bin.000001' from <start_pos>;
+Log_name Pos Event_type Server_id End_log_pos Info
+slave-bin.000001 # Gtid_list 2 # []
+slave-bin.000001 # Binlog_checkpoint 2 # slave-bin.000001
+slave-bin.000001 # Gtid 1 # GTID 0-1-1
+slave-bin.000001 # Query 1 # use `test`; CREATE TABLE t1 (a INT, b INT, c INT)
+slave-bin.000001 # Gtid 1 # GTID 0-1-2
+slave-bin.000001 # Query 1 # use `test`; CREATE TABLE t2 (a INT, b INT, c INT)
+slave-bin.000001 # Gtid 2 # GTID 0-2-3
+slave-bin.000001 # Query 2 # use `test`; ALTER TABLE t1 ENGINE=BLACKHOLE
+slave-bin.000001 # Gtid 1 # BEGIN GTID 0-1-3
+slave-bin.000001 # Annotate_rows 1 # INSERT INTO t2 VALUES (1,9,1), (2,9,2), (3,9,3), (4,9,4)
+slave-bin.000001 # Table_map 1 # table_id: # (test.t2)
+slave-bin.000001 # Write_rows_v1 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 1 # COMMIT
+slave-bin.000001 # Gtid 1 # BEGIN GTID 0-1-4
+slave-bin.000001 # Annotate_rows 1 # INSERT INTO t1 VALUES (1,1,1),(2,1,2),(3,1,3),(4,1,4)
+slave-bin.000001 # Table_map 1 # table_id: # (test.t1)
+slave-bin.000001 # Write_rows_v1 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 1 # COMMIT
+slave-bin.000001 # Gtid 1 # BEGIN GTID 0-1-5
+slave-bin.000001 # Annotate_rows 1 # UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 1
+slave-bin.000001 # Table_map 1 # table_id: # (test.t1)
+slave-bin.000001 # Update_rows_v1 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 1 # COMMIT
+slave-bin.000001 # Gtid 1 # BEGIN GTID 0-1-6
+slave-bin.000001 # Annotate_rows 1 # DELETE FROM t1 WHERE a % 2 = 0 AND b = 1
+slave-bin.000001 # Table_map 1 # table_id: # (test.t1)
+slave-bin.000001 # Delete_rows_v1 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 1 # COMMIT
+slave-bin.000001 # Gtid 1 # BEGIN GTID 0-1-7
+slave-bin.000001 # Annotate_rows 1 # INSERT INTO t1 SELECT * FROM t2
+slave-bin.000001 # Table_map 1 # table_id: # (test.t1)
+slave-bin.000001 # Write_rows_v1 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 1 # COMMIT
+slave-bin.000001 # Gtid 1 # GTID 0-1-8
+slave-bin.000001 # Query 1 # use `test`; ALTER TABLE t1 ADD PRIMARY KEY pk_t1 (a,b)
+slave-bin.000001 # Gtid 1 # BEGIN GTID 0-1-9
+slave-bin.000001 # Annotate_rows 1 # INSERT INTO t1 VALUES (1,2,1),(2,2,2),(3,2,3),(4,2,4)
+slave-bin.000001 # Table_map 1 # table_id: # (test.t1)
+slave-bin.000001 # Write_rows_v1 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 1 # COMMIT
+slave-bin.000001 # Gtid 1 # BEGIN GTID 0-1-10
+slave-bin.000001 # Annotate_rows 1 # UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 2
+slave-bin.000001 # Table_map 1 # table_id: # (test.t1)
+slave-bin.000001 # Update_rows_v1 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 1 # COMMIT
+slave-bin.000001 # Gtid 1 # BEGIN GTID 0-1-11
+slave-bin.000001 # Annotate_rows 1 # DELETE FROM t1 WHERE a % 2 = 0 AND b = 2
+slave-bin.000001 # Table_map 1 # table_id: # (test.t1)
+slave-bin.000001 # Delete_rows_v1 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 1 # COMMIT
+slave-bin.000001 # Gtid 1 # GTID 0-1-12
+slave-bin.000001 # Query 1 # use `test`; ALTER TABLE t1 DROP PRIMARY KEY, ADD KEY key_t1 (a)
+slave-bin.000001 # Gtid 1 # BEGIN GTID 0-1-13
+slave-bin.000001 # Annotate_rows 1 # INSERT INTO t1 VALUES (1,3,1),(2,3,2),(3,3,3),(4,3,4)
+slave-bin.000001 # Table_map 1 # table_id: # (test.t1)
+slave-bin.000001 # Write_rows_v1 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 1 # COMMIT
+slave-bin.000001 # Gtid 1 # BEGIN GTID 0-1-14
+slave-bin.000001 # Annotate_rows 1 # UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 3
+slave-bin.000001 # Table_map 1 # table_id: # (test.t1)
+slave-bin.000001 # Update_rows_v1 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 1 # COMMIT
+slave-bin.000001 # Gtid 1 # BEGIN GTID 0-1-15
+slave-bin.000001 # Annotate_rows 1 # DELETE FROM t1 WHERE a % 2 = 0 AND b = 3
+slave-bin.000001 # Table_map 1 # table_id: # (test.t1)
+slave-bin.000001 # Delete_rows_v1 1 # table_id: # flags: STMT_END_F
+slave-bin.000001 # Query 1 # COMMIT
+slave-bin.000001 # Gtid 1 # GTID 0-1-16
+slave-bin.000001 # Query 1 # use `test`; DROP TABLE IF EXISTS `t1`,`t2` /* generated by server */
+slave-bin.000001 # Rotate 2 # slave-bin.000002;pos=4
+/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
+/*!40019 SET @@session.max_insert_delayed_threads=0*/;
+/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
+DELIMITER /*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Start: binlog v 4, server v #.##.## created 010909 4:46:40 at startup
+ROLLBACK/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Gtid list []
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Binlog checkpoint slave-bin.000001
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-1 ddl
+/*!100101 SET @@session.skip_parallel_replication=0*//*!*/;
+/*!100001 SET @@session.gtid_domain_id=0*//*!*/;
+/*!100001 SET @@session.server_id=1*//*!*/;
+/*!100001 SET @@session.gtid_seq_no=1*//*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+use `test`/*!*/;
+SET TIMESTAMP=1000000000/*!*/;
+SET @@session.pseudo_thread_id=#/*!*/;
+SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1/*!*/;
+SET @@session.sql_mode=1411383296/*!*/;
+SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
+/*!\C latin1 *//*!*/;
+SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
+SET @@session.lc_time_names=0/*!*/;
+SET @@session.collation_database=DEFAULT/*!*/;
+CREATE TABLE t1 (a INT, b INT, c INT)
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-2 ddl
+/*!100001 SET @@session.gtid_seq_no=2*//*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+CREATE TABLE t2 (a INT, b INT, c INT)
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-2-3 ddl
+/*!100001 SET @@session.server_id=2*//*!*/;
+/*!100001 SET @@session.gtid_seq_no=3*//*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+ALTER TABLE t1 ENGINE=BLACKHOLE
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-3 trans
+/*!100001 SET @@session.server_id=1*//*!*/;
+/*!100001 SET @@session.gtid_seq_no=3*//*!*/;
+BEGIN
+/*!*/;
+# at #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows:
+#Q> INSERT INTO t2 VALUES (1,9,1), (2,9,2), (3,9,3), (4,9,4)
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `test`.`t2` mapped to number #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F
+# Number of rows: 4
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+COMMIT
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-4 trans
+/*!100001 SET @@session.gtid_seq_no=4*//*!*/;
+BEGIN
+/*!*/;
+# at #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows:
+#Q> INSERT INTO t1 VALUES (1,1,1),(2,1,2),(3,1,3),(4,1,4)
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F
+# Number of rows: 4
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+COMMIT
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-5 trans
+/*!100001 SET @@session.gtid_seq_no=5*//*!*/;
+BEGIN
+/*!*/;
+# at #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows:
+#Q> UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 1
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F
+# Number of rows: 2
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+COMMIT
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-6 trans
+/*!100001 SET @@session.gtid_seq_no=6*//*!*/;
+BEGIN
+/*!*/;
+# at #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows:
+#Q> DELETE FROM t1 WHERE a % 2 = 0 AND b = 1
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F
+# Number of rows: 2
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+COMMIT
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-7 trans
+/*!100001 SET @@session.gtid_seq_no=7*//*!*/;
+BEGIN
+/*!*/;
+# at #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows:
+#Q> INSERT INTO t1 SELECT * FROM t2
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F
+# Number of rows: 4
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+COMMIT
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-8 ddl
+/*!100001 SET @@session.gtid_seq_no=8*//*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+ALTER TABLE t1 ADD PRIMARY KEY pk_t1 (a,b)
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-9 trans
+/*!100001 SET @@session.gtid_seq_no=9*//*!*/;
+BEGIN
+/*!*/;
+# at #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows:
+#Q> INSERT INTO t1 VALUES (1,2,1),(2,2,2),(3,2,3),(4,2,4)
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F
+# Number of rows: 4
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+COMMIT
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-10 trans
+/*!100001 SET @@session.gtid_seq_no=10*//*!*/;
+BEGIN
+/*!*/;
+# at #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows:
+#Q> UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 2
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F
+# Number of rows: 2
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+COMMIT
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-11 trans
+/*!100001 SET @@session.gtid_seq_no=11*//*!*/;
+BEGIN
+/*!*/;
+# at #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows:
+#Q> DELETE FROM t1 WHERE a % 2 = 0 AND b = 2
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F
+# Number of rows: 2
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+COMMIT
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-12 ddl
+/*!100001 SET @@session.gtid_seq_no=12*//*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+ALTER TABLE t1 DROP PRIMARY KEY, ADD KEY key_t1 (a)
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-13 trans
+/*!100001 SET @@session.gtid_seq_no=13*//*!*/;
+BEGIN
+/*!*/;
+# at #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows:
+#Q> INSERT INTO t1 VALUES (1,3,1),(2,3,2),(3,3,3),(4,3,4)
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F
+# Number of rows: 4
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+COMMIT
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-14 trans
+/*!100001 SET @@session.gtid_seq_no=14*//*!*/;
+BEGIN
+/*!*/;
+# at #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows:
+#Q> UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 3
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F
+# Number of rows: 2
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+COMMIT
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-15 trans
+/*!100001 SET @@session.gtid_seq_no=15*//*!*/;
+BEGIN
+/*!*/;
+# at #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows:
+#Q> DELETE FROM t1 WHERE a % 2 = 0 AND b = 3
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number #
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F
+# Number of rows: 2
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+COMMIT
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-16 ddl
+/*!100001 SET @@session.gtid_seq_no=16*//*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0
+SET TIMESTAMP=1000000000/*!*/;
+DROP TABLE IF EXISTS `t1`,`t2` /* generated by server */
+/*!*/;
+# at #
+#010909 4:46:40 server id # end_log_pos # CRC32 XXX Rotate to slave-bin.000002 pos: 4
+DELIMITER ;
+# End of log file
+ROLLBACK /* added by mysqlbinlog */;
+/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
+/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
+include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_blackhole.test b/mysql-test/suite/rpl/t/rpl_blackhole.test
index 120f11f58ea..927f0d80778 100644
--- a/mysql-test/suite/rpl/t/rpl_blackhole.test
+++ b/mysql-test/suite/rpl/t/rpl_blackhole.test
@@ -20,81 +20,6 @@ source include/master-slave.inc;
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
-# We start with no primary key
-CREATE TABLE t1 (a INT, b INT, c INT);
-CREATE TABLE t2 (a INT, b INT, c INT);
+source include/rpl_blackhole_basic.test;
-sync_slave_with_master;
-ALTER TABLE t1 ENGINE=BLACKHOLE;
-
-connection master;
-INSERT INTO t2 VALUES (1,9,1), (2,9,2), (3,9,3), (4,9,4);
-sync_slave_with_master;
-
-# Test insert, no primary key
-let $statement = INSERT INTO t1 VALUES (1,1,1),(2,1,2),(3,1,3),(4,1,4);
-source include/rpl_blackhole.test;
-
-# Test update, no primary key
-let $statement = UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 1;
-source include/rpl_blackhole.test;
-
-# Test delete, no primary key
-let $statement = DELETE FROM t1 WHERE a % 2 = 0 AND b = 1;
-source include/rpl_blackhole.test;
-
-# Test INSERT-SELECT into Blackhole, no primary key
-let $statement = INSERT INTO t1 SELECT * FROM t2;
-source include/rpl_blackhole.test;
-
-#
-# The MASTER has MyISAM as the engine for both tables. The SLAVE has Blackhole
-# on t1 (transactional engine) and MyISAM on t2 (non-transactional engine).
-#
-# In MIXED mode, the command "INSERT INTO t2 SELECT * FROM t1" is logged as
-# statement on the master. On the slave, it is tagged as unsafe because the
-# statement mixes both transactional and non-transactional engines and as such
-# its changes are logged as rows. However, due to the nature of the blackhole
-# engine, no rows are returned and thus any chain replication would make the
-# next master on the chain diverge.
-#
-# Fo this reason, we have disabled the statement.
-#
-# Test INSERT-SELECT from Blackhole, no primary key
-# let $statement = INSERT INTO t2 SELECT * FROM t1;
-# source include/rpl_blackhole.test;
-#
-
-connection master;
-ALTER TABLE t1 ADD PRIMARY KEY pk_t1 (a,b);
-
-# Test insert, primary key
-let $statement = INSERT INTO t1 VALUES (1,2,1),(2,2,2),(3,2,3),(4,2,4);
-source include/rpl_blackhole.test;
-
-# Test update, primary key
-let $statement = UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 2;
-source include/rpl_blackhole.test;
-
-# Test delete, primary key
-let $statement = DELETE FROM t1 WHERE a % 2 = 0 AND b = 2;
-source include/rpl_blackhole.test;
-
-connection master;
-ALTER TABLE t1 DROP PRIMARY KEY, ADD KEY key_t1 (a);
-
-# Test insert, key
-let $statement = INSERT INTO t1 VALUES (1,3,1),(2,3,2),(3,3,3),(4,3,4);
-source include/rpl_blackhole.test;
-
-# Test update, key
-let $statement = UPDATE t1 SET c = 2*c WHERE a % 2 = 0 AND b = 3;
-source include/rpl_blackhole.test;
-
-# Test delete, key
-let $statement = DELETE FROM t1 WHERE a % 2 = 0 AND b = 3;
-source include/rpl_blackhole.test;
-
-connection master;
-DROP TABLE t1,t2;
--source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate-master.opt b/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate-master.opt
new file mode 100644
index 00000000000..91302791099
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate-master.opt
@@ -0,0 +1 @@
+--binlog_annotate_row_events --timezone=GMT-3
diff --git a/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate-slave.opt b/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate-slave.opt
new file mode 100644
index 00000000000..7ac6a84faa7
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate-slave.opt
@@ -0,0 +1 @@
+--binlog_annotate_row_events --replicate_annotate_row_events
diff --git a/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate.test b/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate.test
new file mode 100644
index 00000000000..afc8e25766a
--- /dev/null
+++ b/mysql-test/suite/rpl/t/rpl_blackhole_row_annotate.test
@@ -0,0 +1,49 @@
+# ==== Purpose ====
+#
+# Test verifies that when "replicate_annotate_row_events" are enabled on slave
+# the DML operations on blackhole engine will be successful. It also ensures
+# that Annotate events are logged into slave's binary log.
+#
+# ==== Implementation ====
+#
+# Steps:
+# 0 - Enable "replicate_annotate_row_events" on slave and do DML operations
+# on master.
+# 1 - Slave server will successfully apply the DML operations and it is in
+# sync with master.
+# 2 - Verify that the "show binlog events" prints all annotate events.
+# 3 - Stream the slave's binary log using "mysqlbinlog" tool and verify
+# that the Annotate events are being displayed.
+#
+# ==== References ====
+#
+# MDEV-11094: Blackhole table updates on slave fail when row annotation is
+# enabled
+
+source include/have_blackhole.inc;
+source include/have_binlog_format_row.inc;
+source include/binlog_start_pos.inc;
+source include/master-slave.inc;
+
+SET timestamp=1000000000;
+RESET MASTER;
+connection slave;
+SET timestamp=1000000000;
+RESET MASTER;
+
+connection master;
+source include/rpl_blackhole_basic.test;
+
+# Verify on slave.
+connection slave;
+FLUSH LOGS;
+--replace_column 2 # 5 #
+--replace_result $binlog_start_pos <start_pos>
+--replace_regex /table_id: [0-9]+/table_id: #/ /\/\* xid=.* \*\//\/* xid= *\//
+--eval show binlog events in 'slave-bin.000001' from $binlog_start_pos
+
+let $MYSQLD_DATADIR= `select @@datadir`;
+--replace_regex /server id [0-9]*/server id #/ /server v [^ ]*/server v #.##.##/ /exec_time=[0-9]*/exec_time=#/ /thread_id=[0-9]*/thread_id=#/ /table id [0-9]*/table id #/ /mapped to number [0-9]*/mapped to number #/ /end_log_pos [0-9]*/end_log_pos #/ /# at [0-9]*/# at #/ /CRC32 0x[0-9a-f]*/CRC32 XXX/
+--exec $MYSQL_BINLOG --base64-output=decode-rows $MYSQLD_DATADIR/slave-bin.000001
+
+source include/rpl_end.inc;
diff --git a/mysql-test/suite/sys_vars/inc/sysvars_server.inc b/mysql-test/suite/sys_vars/inc/sysvars_server.inc
index af1b0ce4563..56053449bae 100644
--- a/mysql-test/suite/sys_vars/inc/sysvars_server.inc
+++ b/mysql-test/suite/sys_vars/inc/sysvars_server.inc
@@ -31,6 +31,7 @@ select * from information_schema.system_variables
'rand_seed1',
'rand_seed2',
'system_time_zone',
+ 'tls_version',
'version_comment',
'version_source_revision',
'version_compile_machine', 'version_compile_os',
@@ -55,6 +56,7 @@ select VARIABLE_NAME, VARIABLE_SCOPE, VARIABLE_TYPE, VARIABLE_COMMENT,
'rand_seed1',
'rand_seed2',
'system_time_zone',
+ 'tls_version',
'version_comment',
'version_source_revision',
'version_compile_machine', 'version_compile_os',
diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result
index 509e098498d..0b587ab82c2 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result
@@ -20,6 +20,7 @@ variable_name not in (
'rand_seed1',
'rand_seed2',
'system_time_zone',
+'tls_version',
'version_comment',
'version_source_revision',
'version_compile_machine', 'version_compile_os',
@@ -4661,6 +4662,7 @@ where variable_name in (
'rand_seed1',
'rand_seed2',
'system_time_zone',
+'tls_version',
'version_comment',
'version_source_revision',
'version_compile_machine', 'version_compile_os',
@@ -4767,6 +4769,16 @@ NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT NULL
+VARIABLE_NAME TLS_VERSION
+VARIABLE_SCOPE GLOBAL
+VARIABLE_TYPE SET
+VARIABLE_COMMENT TLS protocol version for secure connections.
+NUMERIC_MIN_VALUE NULL
+NUMERIC_MAX_VALUE NULL
+NUMERIC_BLOCK_SIZE NULL
+ENUM_VALUE_LIST TLSv1.0,TLSv1.1,TLSv1.2,TLSv1.3
+READ_ONLY YES
+COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME VERSION
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE VARCHAR
diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
index 043cd983734..cd39a9e9882 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
@@ -20,6 +20,7 @@ variable_name not in (
'rand_seed1',
'rand_seed2',
'system_time_zone',
+'tls_version',
'version_comment',
'version_source_revision',
'version_compile_machine', 'version_compile_os',
@@ -5753,6 +5754,7 @@ where variable_name in (
'rand_seed1',
'rand_seed2',
'system_time_zone',
+'tls_version',
'version_comment',
'version_source_revision',
'version_compile_machine', 'version_compile_os',
@@ -5859,6 +5861,16 @@ NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT NULL
+VARIABLE_NAME TLS_VERSION
+VARIABLE_SCOPE GLOBAL
+VARIABLE_TYPE SET
+VARIABLE_COMMENT TLS protocol version for secure connections.
+NUMERIC_MIN_VALUE NULL
+NUMERIC_MAX_VALUE NULL
+NUMERIC_BLOCK_SIZE NULL
+ENUM_VALUE_LIST TLSv1.0,TLSv1.1,TLSv1.2,TLSv1.3
+READ_ONLY YES
+COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME VERSION
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE VARCHAR
diff --git a/mysql-test/suite/versioning/r/create.result b/mysql-test/suite/versioning/r/create.result
index ce19d83fcda..4b4354e169d 100644
--- a/mysql-test/suite/versioning/r/create.result
+++ b/mysql-test/suite/versioning/r/create.result
@@ -54,7 +54,7 @@ character_octet_length NULL
character_set_name NULL
collation_name NULL
column_key
-extra INVISIBLE
+extra STORED GENERATED, INVISIBLE
column_comment start
is_generated ALWAYS
generation_expression ROW START
@@ -69,7 +69,7 @@ character_octet_length NULL
character_set_name NULL
collation_name NULL
column_key
-extra INVISIBLE
+extra STORED GENERATED, INVISIBLE
column_comment end
is_generated ALWAYS
generation_expression ROW END
diff --git a/mysql-test/suite/versioning/r/simple.result b/mysql-test/suite/versioning/r/simple.result
index 7b42fed45c5..df47f80c9e9 100644
--- a/mysql-test/suite/versioning/r/simple.result
+++ b/mysql-test/suite/versioning/r/simple.result
@@ -71,3 +71,130 @@ and d.dept_id = e.dept_id;
emp_id dept_id name salary dept_id name
1 10 bill 2000 10 accounting
drop table emp, dept;
+create table t1 (
+a timestamp(6),
+b timestamp(6) generated always as (a + interval 1 day),
+c timestamp(6) generated always as (a + interval 1 month) stored,
+d timestamp(6) generated always as row start,
+e timestamp(6) generated always as row end,
+period for system_time(d,e)
+) with system versioning;
+show columns from t1;
+Field Type Null Key Default Extra
+a timestamp(6) NO current_timestamp(6) on update current_timestamp(6)
+b timestamp(6) YES NULL VIRTUAL GENERATED
+c timestamp(6) YES NULL STORED GENERATED
+d timestamp(6) NO NULL STORED GENERATED
+e timestamp(6) NO NULL STORED GENERATED
+select table_catalog,table_schema,table_name,column_name,ordinal_position,column_default,is_nullable,data_type,character_maximum_length,character_octet_length,numeric_precision,numeric_scale,datetime_precision,character_set_name,collation_name,column_type,column_key,extra,column_comment,is_generated,generation_expression,'---' from information_schema.columns where table_name='t1';
+table_catalog def
+table_schema test
+table_name t1
+column_name a
+ordinal_position 1
+column_default current_timestamp(6)
+is_nullable NO
+data_type timestamp
+character_maximum_length NULL
+character_octet_length NULL
+numeric_precision NULL
+numeric_scale NULL
+datetime_precision 6
+character_set_name NULL
+collation_name NULL
+column_type timestamp(6)
+column_key
+extra on update current_timestamp(6)
+column_comment
+is_generated NEVER
+generation_expression NULL
+--- ---
+table_catalog def
+table_schema test
+table_name t1
+column_name b
+ordinal_position 2
+column_default NULL
+is_nullable YES
+data_type timestamp
+character_maximum_length NULL
+character_octet_length NULL
+numeric_precision NULL
+numeric_scale NULL
+datetime_precision 6
+character_set_name NULL
+collation_name NULL
+column_type timestamp(6)
+column_key
+extra VIRTUAL GENERATED
+column_comment
+is_generated ALWAYS
+generation_expression `a` + interval 1 day
+--- ---
+table_catalog def
+table_schema test
+table_name t1
+column_name c
+ordinal_position 3
+column_default NULL
+is_nullable YES
+data_type timestamp
+character_maximum_length NULL
+character_octet_length NULL
+numeric_precision NULL
+numeric_scale NULL
+datetime_precision 6
+character_set_name NULL
+collation_name NULL
+column_type timestamp(6)
+column_key
+extra STORED GENERATED
+column_comment
+is_generated ALWAYS
+generation_expression `a` + interval 1 month
+--- ---
+table_catalog def
+table_schema test
+table_name t1
+column_name d
+ordinal_position 4
+column_default NULL
+is_nullable NO
+data_type timestamp
+character_maximum_length NULL
+character_octet_length NULL
+numeric_precision NULL
+numeric_scale NULL
+datetime_precision 6
+character_set_name NULL
+collation_name NULL
+column_type timestamp(6)
+column_key
+extra STORED GENERATED
+column_comment
+is_generated ALWAYS
+generation_expression ROW START
+--- ---
+table_catalog def
+table_schema test
+table_name t1
+column_name e
+ordinal_position 5
+column_default NULL
+is_nullable NO
+data_type timestamp
+character_maximum_length NULL
+character_octet_length NULL
+numeric_precision NULL
+numeric_scale NULL
+datetime_precision 6
+character_set_name NULL
+collation_name NULL
+column_type timestamp(6)
+column_key
+extra STORED GENERATED
+column_comment
+is_generated ALWAYS
+generation_expression ROW END
+--- ---
+drop table t1;
diff --git a/mysql-test/suite/versioning/t/simple.test b/mysql-test/suite/versioning/t/simple.test
index d61e9ffd47c..b550b3967d9 100644
--- a/mysql-test/suite/versioning/t/simple.test
+++ b/mysql-test/suite/versioning/t/simple.test
@@ -71,3 +71,19 @@ where d.dept_id = 10
and d.dept_id = e.dept_id;
drop table emp, dept;
+
+#
+# MDEV-16804 SYSTEM VERSIONING columns not showing as GENERATED
+#
+create table t1 (
+ a timestamp(6),
+ b timestamp(6) generated always as (a + interval 1 day),
+ c timestamp(6) generated always as (a + interval 1 month) stored,
+ d timestamp(6) generated always as row start,
+ e timestamp(6) generated always as row end,
+ period for system_time(d,e)
+) with system versioning;
+show columns from t1;
+query_vertical select table_catalog,table_schema,table_name,column_name,ordinal_position,column_default,is_nullable,data_type,character_maximum_length,character_octet_length,numeric_precision,numeric_scale,datetime_precision,character_set_name,collation_name,column_type,column_key,extra,column_comment,is_generated,generation_expression,'---' from information_schema.columns where table_name='t1';
+drop table t1;
+
diff --git a/mysql-test/suite/wsrep/disabled.def b/mysql-test/suite/wsrep/disabled.def
index 61142398372..276ed34f747 100644
--- a/mysql-test/suite/wsrep/disabled.def
+++ b/mysql-test/suite/wsrep/disabled.def
@@ -1,3 +1,16 @@
-wsrep.foreign_key : Sporadic failure "WSREP has not yet prepared node for application use"
+##############################################################################
+#
+# List the test cases that are to be disabled temporarily.
+#
+# Separate the test case name and the comment with ':'.
+#
+# <testcasename> : MDEV-<xxxx> <comment>
+#
+# Do not use any TAB characters for whitespace.
+#
+##############################################################################
+
+foreign_key : Sporadic failure "WSREP has not yet prepared node for application use"
+variables : MDEV-19746 Galera test failures because of wsrep_slave_threads identification
wsrep.pool_of_threads : Sporadic failure "WSREP has not yet prepared node for application use"
wsrep.variables : Global wsrep_on manipulation causes debug asserts
diff --git a/mysql-test/unstable-tests b/mysql-test/unstable-tests
index 045e220ac55..7246d2cc73e 100644
--- a/mysql-test/unstable-tests
+++ b/mysql-test/unstable-tests
@@ -102,7 +102,6 @@ encryption.innodb_encryption_discard_import : MDEV-16116
encryption.innodb_encryption_filekeys : MDEV-15673 - Timeout
encryption.innodb_encryption_row_compressed : MDEV-16113 - Crash
encryption.innodb_first_page : MDEV-10689 - Crash
-encryption.innodb_lotoftables : MDEV-16111 - Wrong result
encryption.innodb_onlinealter_encryption : MDEV-17287 - SIGABRT on server restart
encryption.innodb_scrub : MDEV-8139 - scrubbing tests need fixing
encryption.innodb_scrub_background : MDEV-8139 - scrubbing tests need fixing
diff --git a/plugin/auth_pam/auth_pam.c b/plugin/auth_pam/auth_pam.c
index 599b323b0b7..45a5028429f 100644
--- a/plugin/auth_pam/auth_pam.c
+++ b/plugin/auth_pam/auth_pam.c
@@ -218,6 +218,6 @@ maria_declare_plugin(pam)
NULL,
vars,
"2.0",
- MariaDB_PLUGIN_MATURITY_BETA
+ MariaDB_PLUGIN_MATURITY_GAMMA
}
maria_declare_plugin_end;
diff --git a/plugin/disks/information_schema_disks.cc b/plugin/disks/information_schema_disks.cc
index 844f69d18b6..2df4d54588e 100644
--- a/plugin/disks/information_schema_disks.cc
+++ b/plugin/disks/information_schema_disks.cc
@@ -152,7 +152,7 @@ maria_declare_plugin(disks)
NULL, /* no status variables */
NULL, /* no system variables */
"1.0", /* String version representation */
- MariaDB_PLUGIN_MATURITY_BETA /* Maturity (see include/mysql/plugin.h)*/
+ MariaDB_PLUGIN_MATURITY_GAMMA /* Maturity (see include/mysql/plugin.h)*/
}
mysql_declare_plugin_end;
diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt
index 3d31cda4ceb..7be46ac1985 100644
--- a/scripts/CMakeLists.txt
+++ b/scripts/CMakeLists.txt
@@ -332,6 +332,7 @@ ELSE()
COMPONENT ${${file}_COMPONENT}
)
ENDFOREACH()
+
SET (wsrep_sst_rsync_wan ${CMAKE_CURRENT_BINARY_DIR}/wsrep_sst_rsync_wan)
ADD_CUSTOM_COMMAND(
OUTPUT ${wsrep_sst_rsync_wan}
diff --git a/sql/handler.cc b/sql/handler.cc
index e309de97dd9..05dc961743b 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
- Copyright (c) 2009, 2018, MariaDB Corporation.
+ Copyright (c) 2009, 2019, 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
@@ -218,6 +218,32 @@ redo:
}
+bool
+Storage_engine_name::resolve_storage_engine_with_error(THD *thd,
+ handlerton **ha,
+ bool tmp_table)
+{
+ if (plugin_ref plugin= ha_resolve_by_name(thd, &m_storage_engine_name,
+ tmp_table))
+ {
+ *ha= plugin_hton(plugin);
+ return false;
+ }
+
+ *ha= NULL;
+ if (thd->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION)
+ {
+ my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), m_storage_engine_name.str);
+ return true;
+ }
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_UNKNOWN_STORAGE_ENGINE,
+ ER_THD(thd, ER_UNKNOWN_STORAGE_ENGINE),
+ m_storage_engine_name.str);
+ return false;
+}
+
+
plugin_ref ha_lock_engine(THD *thd, const handlerton *hton)
{
if (hton)
diff --git a/sql/item_sum.cc b/sql/item_sum.cc
index e03778be2a3..4051ae461ee 100644
--- a/sql/item_sum.cc
+++ b/sql/item_sum.cc
@@ -3848,11 +3848,15 @@ int copy_to_tree(void* key, element_count count __attribute__((unused)),
bool Item_func_group_concat::repack_tree(THD *thd)
{
struct st_repack_tree st;
+ int size= tree->size_of_element;
+ if (!tree->offset_to_key)
+ size-= sizeof(void*);
init_tree(&st.tree, (size_t) MY_MIN(thd->variables.max_heap_table_size,
thd->variables.sortbuff_size/16), 0,
- tree->size_of_element, group_concat_key_cmp_with_order, NULL,
+ size, group_concat_key_cmp_with_order, NULL,
(void*) this, MYF(MY_THREAD_SPECIFIC));
+ DBUG_ASSERT(tree->size_of_element == st.tree.size_of_element);
st.table= table;
st.len= 0;
st.maxlen= (size_t)thd->variables.group_concat_max_len;
diff --git a/sql/my_json_writer.cc b/sql/my_json_writer.cc
index 4bd80f106ba..4200769b1dc 100644
--- a/sql/my_json_writer.cc
+++ b/sql/my_json_writer.cc
@@ -129,6 +129,14 @@ void Json_writer::add_ll(longlong val)
add_unquoted_str(buf);
}
+void Json_writer::add_ull(ulonglong val)
+{
+ char buf[64];
+ my_snprintf(buf, sizeof(buf), "%llu", val);
+ add_unquoted_str(buf);
+}
+
+
/* Add a memory size, printing in Kb, Kb, Gb if necessary */
void Json_writer::add_size(longlong val)
{
diff --git a/sql/my_json_writer.h b/sql/my_json_writer.h
index 2c27043e74e..07a46f65390 100644
--- a/sql/my_json_writer.h
+++ b/sql/my_json_writer.h
@@ -194,6 +194,7 @@ public:
void add_table_name(const TABLE* table);
void add_ll(longlong val);
+ void add_ull(ulonglong val);
void add_size(longlong val);
void add_double(double val);
void add_bool(bool val);
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index f3d36bfc15c..9920d0c0387 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1442,8 +1442,8 @@ Query_cache query_cache;
my_bool opt_use_ssl = 0;
char *opt_ssl_ca= NULL, *opt_ssl_capath= NULL, *opt_ssl_cert= NULL,
*opt_ssl_cipher= NULL, *opt_ssl_key= NULL, *opt_ssl_crl= NULL,
- *opt_ssl_crlpath= NULL;
-
+ *opt_ssl_crlpath= NULL, *opt_tls_version= NULL;
+ulonglong tls_version= 0;
static scheduler_functions thread_scheduler_struct, extra_thread_scheduler_struct;
scheduler_functions *thread_scheduler= &thread_scheduler_struct,
@@ -4626,7 +4626,8 @@ static void init_ssl()
ssl_acceptor_fd= new_VioSSLAcceptorFd(opt_ssl_key, opt_ssl_cert,
opt_ssl_ca, opt_ssl_capath,
opt_ssl_cipher, &error,
- opt_ssl_crl, opt_ssl_crlpath);
+ opt_ssl_crl, opt_ssl_crlpath,
+ tls_version);
DBUG_PRINT("info",("ssl_acceptor_fd: %p", ssl_acceptor_fd));
if (!ssl_acceptor_fd)
{
@@ -4665,7 +4666,8 @@ int reinit_ssl()
enum enum_ssl_init_error error = SSL_INITERR_NOERROR;
st_VioSSLFd *new_fd = new_VioSSLAcceptorFd(opt_ssl_key, opt_ssl_cert,
- opt_ssl_ca, opt_ssl_capath, opt_ssl_cipher, &error, opt_ssl_crl, opt_ssl_crlpath);
+ opt_ssl_ca, opt_ssl_capath, opt_ssl_cipher, &error, opt_ssl_crl,
+ opt_ssl_crlpath, tls_version);
if (!new_fd)
{
diff --git a/sql/mysqld.h b/sql/mysqld.h
index 505741b5458..70a75d8eaad 100644
--- a/sql/mysqld.h
+++ b/sql/mysqld.h
@@ -634,6 +634,7 @@ extern Atomic_counter<uint32_t> thread_count;
extern char *opt_ssl_ca, *opt_ssl_capath, *opt_ssl_cert, *opt_ssl_cipher,
*opt_ssl_key, *opt_ssl_crl, *opt_ssl_crlpath;
+extern ulonglong tls_version;
extern MYSQL_PLUGIN_IMPORT pthread_key(THD*, THR_THD);
@@ -696,6 +697,7 @@ enum options_mysqld
OPT_WSREP_SYNC_WAIT,
#endif /* WITH_WSREP */
OPT_MYSQL_COMPATIBILITY,
+ OPT_TLS_VERSION,
OPT_MYSQL_TO_BE_IMPLEMENTED,
OPT_which_is_always_the_last
};
diff --git a/sql/opt_range.h b/sql/opt_range.h
index ae0e3822272..73def7bde92 100644
--- a/sql/opt_range.h
+++ b/sql/opt_range.h
@@ -459,8 +459,9 @@ public:
uint res= key_tree->store_min(key[key_tree->part].store_length,
range_key, *range_key_flag);
// add flags only if a key_part is written to the buffer
- if (res)
- *range_key_flag|= key_tree->min_flag;
+ if (!res)
+ return 0;
+ *range_key_flag|= key_tree->min_flag;
if (key_tree->next_key_part &&
key_tree->next_key_part->type == SEL_ARG::KEY_RANGE &&
key_tree->part != last_part &&
@@ -482,8 +483,9 @@ public:
SEL_ARG *key_tree= last();
uint res=key_tree->store_max(key[key_tree->part].store_length,
range_key, *range_key_flag);
- if (res)
- (*range_key_flag)|= key_tree->max_flag;
+ if (!res)
+ return 0;
+ *range_key_flag|= key_tree->max_flag;
if (key_tree->next_key_part &&
key_tree->next_key_part->type == SEL_ARG::KEY_RANGE &&
key_tree->part != last_part &&
diff --git a/sql/rpl_mi.cc b/sql/rpl_mi.cc
index 785a5b61b5f..509320e7a97 100644
--- a/sql/rpl_mi.cc
+++ b/sql/rpl_mi.cc
@@ -1233,7 +1233,7 @@ bool Master_info_index::init_all_master_info()
if (!err_num) // No Error on read Master_info
{
if (global_system_variables.log_warnings > 1)
- sql_print_information("Reading of all Master_info entries succeded");
+ sql_print_information("Reading of all Master_info entries succeeded");
DBUG_RETURN(0);
}
if (succ_num) // Have some Error and some Success
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 7a82d89f1bb..f214901327b 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -62,6 +62,12 @@
bool mysql_user_table_is_in_short_password_format= false;
bool using_global_priv_table= true;
+// set that from field length in acl_load?
+const uint max_hostname_length= 60;
+const uint max_dbname_length= 64;
+
+#include "sql_acl_getsort.ic"
+
static LEX_CSTRING native_password_plugin_name= {
STRING_WITH_LEN("mysql_native_password")
};
@@ -117,7 +123,7 @@ static bool compare_hostname(const acl_host_and_ip *, const char *, const char *
class ACL_ACCESS {
public:
- ulong sort;
+ ulonglong sort;
ulong access;
ACL_ACCESS()
:sort(0), access(0)
@@ -284,7 +290,6 @@ ulong role_global_merges= 0, role_db_merges= 0, role_table_merges= 0,
#ifndef NO_EMBEDDED_ACCESS_CHECKS
static void update_hostname(acl_host_and_ip *host, const char *hostname);
-static ulong get_sort(uint count,...);
static bool show_proxy_grants (THD *, const char *, const char *,
char *, size_t);
static bool show_role_grants(THD *, const char *, const char *,
@@ -332,7 +337,8 @@ public:
(proxied_host_arg && *proxied_host_arg) ?
proxied_host_arg : NULL);
with_grant= with_grant_arg;
- sort= get_sort(4, host.hostname, user, proxied_host.hostname, proxied_user);
+ sort= get_magic_sort("huhu", host.hostname, user, proxied_host.hostname,
+ proxied_user);
}
void init(MEM_ROOT *mem, const char *host_arg, const char *user_arg,
@@ -392,10 +398,8 @@ public:
proxied_user_arg, proxied_user));
DBUG_RETURN(compare_hostname(&host, host_arg, ip_arg) &&
compare_hostname(&proxied_host, host_arg, ip_arg) &&
- (!*user ||
- (user_arg && !wild_compare(user_arg, user, TRUE))) &&
- (!*proxied_user ||
- !wild_compare(proxied_user_arg, proxied_user, TRUE)));
+ (!*user || !strcmp(user_arg, user)) &&
+ (!*proxied_user || !strcmp(proxied_user_arg, proxied_user)));
}
@@ -2346,7 +2350,7 @@ static bool acl_load(THD *thd, const Grant_tables& tables)
}
host.access= host_table.get_access();
host.access= fix_rights_for_db(host.access);
- host.sort= get_sort(2, host.host.hostname, host.db);
+ host.sort= get_magic_sort("hd", host.host.hostname, host.db);
if (check_no_resolve && hostname_requires_resolving(host.host.hostname))
{
sql_print_warning("'host' entry '%s|%s' "
@@ -2388,7 +2392,7 @@ static bool acl_load(THD *thd, const Grant_tables& tables)
user.access= user_table.get_access();
- user.sort= get_sort(2, user.host.hostname, user.user.str);
+ user.sort= get_magic_sort("hu", user.host.hostname, user.user.str);
user.hostname_length= safe_strlen(user.host.hostname);
my_init_dynamic_array(&user.role_grants, sizeof(ACL_ROLE *), 0, 8, MYF(0));
@@ -2507,7 +2511,7 @@ static bool acl_load(THD *thd, const Grant_tables& tables)
db.db, db.user, safe_str(db.host.hostname));
}
}
- db.sort=get_sort(3,db.host.hostname,db.db,db.user);
+ db.sort=get_magic_sort("hdu", db.host.hostname, db.db, db.user);
#ifndef TO_BE_REMOVED
if (db_table.num_fields() <= 9)
{ // Without grant
@@ -2755,49 +2759,6 @@ static ulong get_access(TABLE *form, uint fieldnr, uint *next_field)
}
-/*
- Return a number which, if sorted 'desc', puts strings in this order:
- no wildcards
- wildcards
- empty string
-*/
-
-static ulong get_sort(uint count,...)
-{
- va_list args;
- va_start(args,count);
- ulong sort=0;
-
- /* Should not use this function with more than 4 arguments for compare. */
- DBUG_ASSERT(count <= 4);
-
- while (count--)
- {
- char *start, *str= va_arg(args,char*);
- uint chars= 0;
- uint wild_pos= 0; /* first wildcard position */
-
- if ((start= str))
- {
- for (; *str ; str++)
- {
- if (*str == wild_prefix && str[1])
- str++;
- else if (*str == wild_many || *str == wild_one)
- {
- wild_pos= (uint) (str - start) + 1;
- break;
- }
- chars= 128; // Marker that chars existed
- }
- }
- sort= (sort << 8) + (wild_pos ? MY_MIN(wild_pos, 127U) : chars);
- }
- va_end(args);
- return sort;
-}
-
-
static int acl_compare(const ACL_ACCESS *a, const ACL_ACCESS *b)
{
if (a->sort > b->sort)
@@ -3159,7 +3120,7 @@ ACL_USER::ACL_USER(THD *thd, const LEX_USER &combo,
user= safe_lexcstrdup_root(&acl_memroot, combo.user);
update_hostname(&host, safe_strdup_root(&acl_memroot, combo.host.str));
hostname_length= combo.host.length;
- sort= get_sort(2, host.hostname, user.str);
+ sort= get_magic_sort("hu", host.hostname, user.str);
password_last_changed= thd->query_start();
password_lifetime= -1;
my_init_dynamic_array(&role_grants, sizeof(ACL_USER *), 0, 8, MYF(0));
@@ -3316,7 +3277,7 @@ static void acl_insert_db(const char *user, const char *host, const char *db,
update_hostname(&acl_db.host, safe_strdup_root(&acl_memroot, host));
acl_db.db=strdup_root(&acl_memroot,db);
acl_db.initial_access= acl_db.access= privileges;
- acl_db.sort=get_sort(3,acl_db.host.hostname,acl_db.db,acl_db.user);
+ acl_db.sort=get_magic_sort("hdu", acl_db.host.hostname, acl_db.db, acl_db.user);
acl_dbs.push(acl_db);
rebuild_acl_dbs();
}
@@ -5035,7 +4996,7 @@ public:
char *db, *user, *tname, *hash_key;
ulong privs;
ulong init_privs; /* privileges found in physical table */
- ulong sort;
+ ulonglong sort;
size_t key_length;
GRANT_NAME(const char *h, const char *d,const char *u,
const char *t, ulong p, bool is_routine);
@@ -5081,7 +5042,7 @@ void GRANT_NAME::set_user_details(const char *h, const char *d,
my_casedn_str(files_charset_info, db);
}
user = strdup_root(&grant_memroot,u);
- sort= get_sort(3,host.hostname,db,user);
+ sort= get_magic_sort("hdu", host.hostname, db, user);
if (tname != t)
{
tname= strdup_root(&grant_memroot, t);
@@ -5123,7 +5084,7 @@ GRANT_NAME::GRANT_NAME(TABLE *form, bool is_routine)
update_hostname(&host, hostname);
db= get_field(&grant_memroot,form->field[1]);
- sort= get_sort(3, host.hostname, db, user);
+ sort= get_magic_sort("hdu", host.hostname, db, user);
tname= get_field(&grant_memroot,form->field[3]);
if (!db || !tname)
{
@@ -6216,7 +6177,7 @@ static int update_role_db(int merged, int first, ulong access,
acl_db.db= acl_dbs.at(first).db;
acl_db.access= access;
acl_db.initial_access= 0;
- acl_db.sort=get_sort(3, "", acl_db.db, role);
+ acl_db.sort= get_magic_sort("hdu", "", acl_db.db, role);
acl_dbs.push(acl_db);
return 2;
}
diff --git a/sql/sql_acl_getsort.ic b/sql/sql_acl_getsort.ic
new file mode 100644
index 00000000000..df55c7c5f1e
--- /dev/null
+++ b/sql/sql_acl_getsort.ic
@@ -0,0 +1,205 @@
+/* Copyright (c) 2019, 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
+ the Free Software Foundation; version 2 of the License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
+
+#ifndef NO_EMBEDDED_ACCESS_CHECKS
+/*
+ Returns a number which, if sorted in descending order, magically puts
+ patterns in the order from most specific (e.g. no wildcards) to most generic
+ (e.g. "%"). That is, the larger the number, the more specific the pattern is.
+
+ Takes a template that lists types of following patterns (by the first letter
+ of _h_ostname, _d_bname, _u_sername) and up to four patterns.
+ No more than two can be of 'h' or 'd' type (because one magic value takes 26
+ bits, see below).
+
+ ========================================================================
+
+ Here's how the magic is created:
+
+ Let's look at one iteration of the for() loop. That's one pattern. With
+ wildcards (usernames aren't interesting).
+
+ By definition a pattern A is "more specific" than pattern B if the set of
+ strings that match the pattern A is smaller than the set of strings that
+ match the pattern B. Strings are taken from the big superset of all valid
+ utf8 strings up to the maxlen.
+
+ Strings are matched character by character. For every non-wildcard
+ character there can be only one matching character in the matched string.
+
+ For a wild_one character ('_') any valid utf8 character will do. Below
+ numchars would mean a total number of vaid utf8 characters. It's a huge
+ number. A number of matching strings for wild_one will be numchars.
+
+ For a wild_many character ('%') any number of valid utf8 characters will do.
+ How many string will match it depends on the amount of non-wild_many
+ characters. Say, if a number of non-wildcard characters is N, and a number
+ of wild_one characters is M, and the number of wild_many characters is K,
+ then for K=1 its wild_many character will match any number of valid utf8
+ characters from 0 to L=maxlen-N-M. The number of matching strings will be
+
+ 1 + numchars + numchars^2 + numchars^3 + ... + numchars^L
+
+ Intermediate result: if M=K=0, the pattern will match only one string,
+ if M>0, K=0, the pattern will match numchars^M strings, if K=1, the
+ pattern will match
+
+ numchars^M + 1 + numchars + numchars^2 + ... + numchars^L
+
+ For a more visual notation, let's write these huge numbers not as
+ decimal or binary, but base numchars. Then the last number will be
+ a sum of two numbers: the first is one followed by M zeros, the second
+ constists of L+1 ones:
+
+ 1000{...M...}000 + 111{...L+1...}1111
+
+ This could produce any of the following
+
+ 111...112111...1111 if L > M, K = 1
+ 100...001111...1111 if M > L, K = 1
+ 2111111...111111111 if M = L, K = 1
+ 1111111...111111111 if M = 0, K = 1
+ 1000000...000000000 if K = 0, M > 0
+
+ There are two complications caused by multiple wild_many characters.
+ For, say, two wild_many characters, either can accept any number of utf8
+ characters, as long the the total amount of them is less then or equal to L.
+ Same logic applies to any number of non-consequent wild_many characters
+ (consequent wild_many characters count as one). This gives the number of
+ matching strings of
+
+ 1 + F(K,1)*numchars + F(K,2)*numchars^2 + ... + F(K,L)*numchars^L
+
+ where F(K,R) is the "number of ways one can put R balls into K boxes",
+ that is C^{K-1}_{R+K-1}.
+
+ In the "base numchars" notation, it means that besides 0, 1, and 2,
+ an R-th digit can be F(K,R). For the purpose of comparison, we only need
+ to know the most significant digit, F(K, L).
+ While it can be huge, we don't need the exact value, it's a
+ a monotonously increasing function of K, so if K1>K2, F(K1,L) > F(K2,L)
+ and we can simply compare values of K instead of complex F(K,L).
+
+ The second complication: F(K,R) gives only an upper boundary, the
+ actual number of matched strings can be smaller.
+ Example: pattern "a%b%c" can match "abbc" as a(b)b()c, and as a()b(b)c.
+ F(2,1) = 2, but it's only one string "abbc".
+ We'll ignore it here under assumption that it almost never happens
+ in practice and this simplification won't noticeably disrupt the ordering.
+
+ The last detail: old get_sort function sorted by the non-wildcard prefix
+ length, so in "abc_" and "a_bc" the former one was sorted first. Strictly
+ speaking they're both equally specific, but to preserve the backward
+ compatible sorting we'll use the P "prefix length or 0 if no wildcards"
+ to break ties.
+
+ Now, let's compare two long numbers. Numbers are easy to compare,
+ the longer number is larger. If they both have the same lengths,
+ the one with the larger first digit is larger, and so on.
+
+ But there is no need to actually calculate these numbers.
+ Three numbers L, K, M (and P to break ties) are enough to describe a pattern
+ for a purpose of comparison. L/K/M triplets can be compared like this:
+
+ * case 1: if for both patterns L>M: compare L, K, M, in that order
+ because:
+ - if L1 > L2, the first number is longer
+ - If L1 == L2, then the first digit is a monotonously increasing function
+ of K, so the first digit is larger when K is larger
+ - if K1 == K2, then all other digits in these numbers would be the
+ same too, with the exception of one digit in the middle that
+ got +1 because of +1000{...M...}000. So, whatever number has a
+ larger M will get this +1 first.
+ * case 2: if for both patterns L<M: compare M, L, K, in that order
+ * case 3: if for both patterns L=M: compare L (or M), K
+ * case 4: if one L1>M1, other L2=M2: compare L, K, M
+ * case 5: if one L1<M1, other L2=M2: compare M, L, K
+ * case 6: if one pattern L1>M1, the other M2>L2: first is more generic
+ unless (case 6a) K1=K2=1,M1=0,M2=L2+1 (in that case - equal)
+
+ note that in case 3 one can use a rule from the case either 1 or 2,
+ in the case 4 one can use the rule from the case 1,
+ in the case 5 one can use the rule from the case 2.
+
+ for the case 6 and ignoring the special case 6a, to compare patterns by a
+ magic number as a function z(a,b,c), we must ensure that z(L1,K1,M1) is
+ greater than z(M2,L2,K2) when L1=M2. This can be done by an extra bit,
+ which is 1 for K and 0 for L. Thus, the magic number could be
+
+ case 1: (((L*2 + 1)*(maxlen+1) + K)*(maxlen+1) + M)*(maxlen+1) + P
+ case 2: ((M*2*(maxlen+1) + L)*(maxlen+1) + K)*(maxlen+1) + P
+
+ upper bound: L<=maxlen, M<=maxlen, K<=maxlen/2, P<maxlen
+ for a current maxlen=64, the magic number needs 26 bits.
+*/
+
+static ulonglong get_magic_sort(const char *templ, ...)
+{
+ ulonglong sort=0;
+ va_list args;
+ va_start(args, templ);
+
+ IF_DBUG(uint bits_used= 0,);
+
+ for (; *templ; templ++)
+ {
+ char *pat= va_arg(args, char*);
+
+ if (*templ == 'u')
+ {
+ /* Username. Can be empty (= anybody) or a literal. Encoded in one bit */
+ sort= (sort << 1) + !*pat;
+ IF_DBUG(bits_used++,);
+ continue;
+ }
+
+ /* A wildcard pattern. Encoded in 26 bits. */
+ uint maxlen= *templ == 'd' ? max_dbname_length : max_hostname_length;
+ DBUG_ASSERT(maxlen <= 64);
+ DBUG_ASSERT(*templ == 'd' || *templ == 'h');
+
+ uint N= 0, M= 0, K= 0, P= 0;
+ for (uint i=0; pat[i]; i++)
+ {
+ if (pat[i] == wild_many)
+ {
+ if (!K && !M) P= N;
+ K++;
+ while (pat[i+1] == wild_many) i++;
+ continue;
+ }
+ if (pat[i] == wild_one)
+ {
+ if (!K && !M) P= N;
+ M++;
+ continue;
+ }
+ if (pat[i] == wild_prefix && pat[i+1]) i++;
+ N++;
+ }
+ uint L= K ? maxlen - N - M : 0, d= maxlen + 1, magic;
+ if (L > M)
+ magic= (((L * 2 + 1) * d + K) * d + M) * d + P;
+ else
+ magic= (((M * 2 + 0) * d + L) * d + K) * d + P;
+ DBUG_ASSERT(magic < 1<<26);
+ sort= (sort << 26) + magic;
+ IF_DBUG(bits_used+= 26,);
+ }
+ DBUG_ASSERT(bits_used < 8*sizeof(sort));
+ va_end(args);
+ return ~sort;
+}
+#endif
diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc
index 2a87d8069bc..75d792523c7 100644
--- a/sql/sql_alter.cc
+++ b/sql/sql_alter.cc
@@ -373,6 +373,18 @@ bool Sql_cmd_alter_table::execute(THD *thd)
SELECT_LEX *select_lex= lex->first_select_lex();
/* first table of first SELECT_LEX */
TABLE_LIST *first_table= (TABLE_LIST*) select_lex->table_list.first;
+
+ const bool used_engine= lex->create_info.used_fields & HA_CREATE_USED_ENGINE;
+ DBUG_ASSERT((m_storage_engine_name.str != NULL) == used_engine);
+ if (used_engine)
+ {
+ if (resolve_storage_engine_with_error(thd, &lex->create_info.db_type,
+ lex->create_info.tmp_table()))
+ return true; // Engine not found, substitution is not allowed
+ if (!lex->create_info.db_type) // Not found, but substitution is allowed
+ lex->create_info.used_fields&= ~HA_CREATE_USED_ENGINE;
+ }
+
/*
Code in mysql_alter_table() may modify its HA_CREATE_INFO argument,
so we have to use a copy of this structure to make execution
diff --git a/sql/sql_alter.h b/sql/sql_alter.h
index 113df10054b..41408a91836 100644
--- a/sql/sql_alter.h
+++ b/sql/sql_alter.h
@@ -356,7 +356,8 @@ protected:
Sql_cmd_alter_table represents the generic ALTER TABLE statement.
@todo move Alter_info and other ALTER specific structures from Lex here.
*/
-class Sql_cmd_alter_table : public Sql_cmd_common_alter_table
+class Sql_cmd_alter_table : public Sql_cmd_common_alter_table,
+ public Storage_engine_name
{
public:
/**
@@ -368,6 +369,8 @@ public:
~Sql_cmd_alter_table()
{}
+ Storage_engine_name *option_storage_engine_name() { return this; }
+
bool execute(THD *thd);
};
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index e43e4a132f0..c3ccb7549b6 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -4188,8 +4188,7 @@ open_tables_check_upgradable_mdl(THD *thd, TABLE_LIST *tables_start,
*/
bool open_tables(THD *thd, const DDL_options_st &options,
- TABLE_LIST **start, uint *counter,
- Sroutine_hash_entry **sroutine_to_open_list, uint flags,
+ TABLE_LIST **start, uint *counter, uint flags,
Prelocking_strategy *prelocking_strategy)
{
/*
@@ -4228,9 +4227,10 @@ restart:
has_prelocking_list= thd->lex->requires_prelocking();
table_to_open= start;
- sroutine_to_open= sroutine_to_open_list;
+ sroutine_to_open= &thd->lex->sroutines_list.first;
*counter= 0;
THD_STAGE_INFO(thd, stage_opening_tables);
+ prelocking_strategy->reset(thd);
/*
If we are executing LOCK TABLES statement or a DDL statement
@@ -4288,8 +4288,7 @@ restart:
elements in prelocking list/set.
*/
while (*table_to_open ||
- (thd->locked_tables_mode <= LTM_LOCK_TABLES &&
- *sroutine_to_open))
+ (thd->locked_tables_mode <= LTM_LOCK_TABLES && *sroutine_to_open))
{
/*
For every table in the list of tables to open, try to find or open
@@ -4409,6 +4408,8 @@ restart:
}
}
}
+ if ((error= prelocking_strategy->handle_end(thd)))
+ goto error;
}
/*
diff --git a/sql/sql_base.h b/sql/sql_base.h
index 54c26fb595a..28a787c56dd 100644
--- a/sql/sql_base.h
+++ b/sql/sql_base.h
@@ -248,17 +248,7 @@ lock_table_names(THD *thd, TABLE_LIST *table_list,
}
bool open_tables(THD *thd, const DDL_options_st &options,
TABLE_LIST **tables, uint *counter,
- Sroutine_hash_entry **sroutine_to_open, uint flags,
- Prelocking_strategy *prelocking_strategy);
-
-static inline bool
-open_tables(THD *thd, const DDL_options_st &options, TABLE_LIST **tables,
- uint *counter, uint flags, Prelocking_strategy *prelocking_strategy)
-{
- return open_tables(thd, options, tables, counter,
- &thd->lex->sroutines_list.first, flags,
- prelocking_strategy);
-}
+ uint flags, Prelocking_strategy *prelocking_strategy);
static inline bool
open_tables(THD *thd, TABLE_LIST **tables, uint *counter, uint flags,
@@ -400,6 +390,7 @@ class Prelocking_strategy
public:
virtual ~Prelocking_strategy() { }
+ virtual void reset(THD *thd) { };
virtual bool handle_routine(THD *thd, Query_tables_list *prelocking_ctx,
Sroutine_hash_entry *rt, sp_head *sp,
bool *need_prelocking) = 0;
@@ -407,6 +398,7 @@ public:
TABLE_LIST *table_list, bool *need_prelocking) = 0;
virtual bool handle_view(THD *thd, Query_tables_list *prelocking_ctx,
TABLE_LIST *table_list, bool *need_prelocking)= 0;
+ virtual bool handle_end(THD *thd) { return 0; };
};
diff --git a/sql/sql_cmd.h b/sql/sql_cmd.h
index 6c12a6689b3..7f1fd06aa46 100644
--- a/sql/sql_cmd.h
+++ b/sql/sql_cmd.h
@@ -118,6 +118,32 @@ enum enum_sql_command {
SQLCOM_END
};
+
+class Storage_engine_name
+{
+protected:
+ LEX_CSTRING m_storage_engine_name;
+public:
+ Storage_engine_name()
+ {
+ m_storage_engine_name.str= NULL;
+ m_storage_engine_name.length= 0;
+ }
+ Storage_engine_name(const LEX_CSTRING &name)
+ :m_storage_engine_name(name)
+ { }
+ Storage_engine_name(const LEX_STRING &name)
+ {
+ m_storage_engine_name.str= name.str;
+ m_storage_engine_name.length= name.length;
+ }
+ bool resolve_storage_engine_with_error(THD *thd,
+ handlerton **ha,
+ bool tmp_table);
+ bool is_set() { return m_storage_engine_name.str != NULL; }
+};
+
+
/**
@class Sql_cmd - Representation of an SQL command.
@@ -161,6 +187,11 @@ public:
*/
virtual bool execute(THD *thd) = 0;
+ virtual Storage_engine_name *option_storage_engine_name()
+ {
+ return NULL;
+ }
+
protected:
Sql_cmd()
{}
@@ -177,6 +208,26 @@ protected:
}
};
+class Sql_cmd_create_table_like: public Sql_cmd,
+ public Storage_engine_name
+{
+public:
+ Storage_engine_name *option_storage_engine_name() { return this; }
+ bool execute(THD *thd);
+};
+
+class Sql_cmd_create_table: public Sql_cmd_create_table_like
+{
+public:
+ enum_sql_command sql_command_code() const { return SQLCOM_CREATE_TABLE; }
+};
+
+class Sql_cmd_create_sequence: public Sql_cmd_create_table_like
+{
+public:
+ enum_sql_command sql_command_code() const { return SQLCOM_CREATE_SEQUENCE; }
+};
+
/**
Sql_cmd_call represents the CALL statement.
diff --git a/sql/sql_explain.cc b/sql/sql_explain.cc
index 03ca08fb3fb..2b46a385ba1 100644
--- a/sql/sql_explain.cc
+++ b/sql/sql_explain.cc
@@ -1782,7 +1782,7 @@ void Explain_table_access::print_explain_json(Explain_query *query,
/* `rows` */
if (rows_set)
- writer->add_member("rows").add_ll(rows);
+ writer->add_member("rows").add_ull(rows);
/* `r_rows` */
if (is_analyze)
@@ -2422,7 +2422,7 @@ void Explain_update::print_explain_json(Explain_query *query,
}
/* `rows` */
- writer->add_member("rows").add_ll(rows);
+ writer->add_member("rows").add_ull(rows);
if (mrr_type.length() != 0)
@@ -2451,7 +2451,7 @@ void Explain_update::print_explain_json(Explain_query *query,
r_rows= 0;
r_filtered= buf_tracker.get_filtered_after_where() * 100.0;
}
- writer->add_member("r_rows").add_ll(r_rows);
+ writer->add_member("r_rows").add_ull(r_rows);
writer->add_member("r_filtered").add_double(r_filtered);
}
else /* Not doing buffering */
diff --git a/sql/sql_join_cache.cc b/sql/sql_join_cache.cc
index 8986e4c42ac..3b051259ad6 100644
--- a/sql/sql_join_cache.cc
+++ b/sql/sql_join_cache.cc
@@ -2147,7 +2147,8 @@ enum_nested_loop_state JOIN_CACHE::join_records(bool skip_last)
}
finish:
- if (outer_join_first_inner)
+ if (outer_join_first_inner &&
+ join_tab->first_inner == join_tab->first_unmatched)
{
/*
All null complemented rows have been already generated for all
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index c6140e35b24..a2cfc0d0128 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -4862,7 +4862,10 @@ void SELECT_LEX::increase_derived_records(ha_rows records)
break;
default:
// usual UNION
- result->est_records+= records;
+ if (HA_ROWS_MAX - records > result->est_records)
+ result->est_records+= records;
+ else
+ result->est_records= HA_ROWS_MAX;
break;
}
}
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 8ec5741bc5f..770791a67e4 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -4130,285 +4130,6 @@ mysql_execute_command(THD *thd)
res = ha_show_status(thd, lex->create_info.db_type, HA_ENGINE_MUTEX);
break;
}
- case SQLCOM_CREATE_SEQUENCE:
- case SQLCOM_CREATE_TABLE:
- {
- DBUG_ASSERT(first_table == all_tables && first_table != 0);
- bool link_to_local;
- TABLE_LIST *create_table= first_table;
- TABLE_LIST *select_tables= lex->create_last_non_select_table->next_global;
-
- if (lex->tmp_table())
- {
- status_var_decrement(thd->status_var.com_stat[SQLCOM_CREATE_TABLE]);
- status_var_increment(thd->status_var.com_create_tmp_table);
- }
-
- /*
- Code below (especially in mysql_create_table() and select_create
- methods) may modify HA_CREATE_INFO structure in LEX, so we have to
- use a copy of this structure to make execution prepared statement-
- safe. A shallow copy is enough as this code won't modify any memory
- referenced from this structure.
- */
- Table_specification_st create_info(lex->create_info);
- /*
- We need to copy alter_info for the same reasons of re-execution
- safety, only in case of Alter_info we have to do (almost) a deep
- copy.
- */
- Alter_info alter_info(lex->alter_info, thd->mem_root);
- if (unlikely(thd->is_fatal_error))
- {
- /* If out of memory when creating a copy of alter_info. */
- res= 1;
- goto end_with_restore_list;
- }
-
- /* Check privileges */
- if ((res= create_table_precheck(thd, select_tables, create_table)))
- goto end_with_restore_list;
-
- /* Might have been updated in create_table_precheck */
- create_info.alias= create_table->alias;
-
- /* Fix names if symlinked or relocated tables */
- if (append_file_to_dir(thd, &create_info.data_file_name,
- &create_table->table_name) ||
- append_file_to_dir(thd, &create_info.index_file_name,
- &create_table->table_name))
- goto end_with_restore_list;
-
- /*
- If no engine type was given, work out the default now
- rather than at parse-time.
- */
- if (!(create_info.used_fields & HA_CREATE_USED_ENGINE))
- create_info.use_default_db_type(thd);
-
- /*
- If we are using SET CHARSET without DEFAULT, add an implicit
- DEFAULT to not confuse old users. (This may change).
- */
- if ((create_info.used_fields &
- (HA_CREATE_USED_DEFAULT_CHARSET | HA_CREATE_USED_CHARSET)) ==
- HA_CREATE_USED_CHARSET)
- {
- create_info.used_fields&= ~HA_CREATE_USED_CHARSET;
- create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
- create_info.default_table_charset= create_info.table_charset;
- create_info.table_charset= 0;
- }
-
- /*
- If we are a slave, we should add OR REPLACE if we don't have
- IF EXISTS. This will help a slave to recover from
- CREATE TABLE OR EXISTS failures by dropping the table and
- retrying the create.
- */
- if (thd->slave_thread &&
- slave_ddl_exec_mode_options == SLAVE_EXEC_MODE_IDEMPOTENT &&
- !lex->create_info.if_not_exists())
- {
- create_info.add(DDL_options_st::OPT_OR_REPLACE);
- create_info.add(DDL_options_st::OPT_OR_REPLACE_SLAVE_GENERATED);
- }
-
-#ifdef WITH_PARTITION_STORAGE_ENGINE
- thd->work_part_info= 0;
- {
- partition_info *part_info= thd->lex->part_info;
- if (part_info && !(part_info= part_info->get_clone(thd)))
- {
- res= -1;
- goto end_with_restore_list;
- }
- thd->work_part_info= part_info;
- }
-#endif
-
- if (select_lex->item_list.elements) // With select
- {
- select_result *result;
-
- /*
- CREATE TABLE...IGNORE/REPLACE SELECT... can be unsafe, unless
- ORDER BY PRIMARY KEY clause is used in SELECT statement. We therefore
- use row based logging if mixed or row based logging is available.
- TODO: Check if the order of the output of the select statement is
- deterministic. Waiting for BUG#42415
- */
- if(lex->ignore)
- lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_CREATE_IGNORE_SELECT);
-
- if(lex->duplicates == DUP_REPLACE)
- lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_CREATE_REPLACE_SELECT);
-
- /*
- If:
- a) we inside an SP and there was NAME_CONST substitution,
- b) binlogging is on (STMT mode),
- c) we log the SP as separate statements
- raise a warning, as it may cause problems
- (see 'NAME_CONST issues' in 'Binary Logging of Stored Programs')
- */
- if (thd->query_name_consts && mysql_bin_log.is_open() &&
- thd->wsrep_binlog_format() == BINLOG_FORMAT_STMT &&
- !mysql_bin_log.is_query_in_union(thd, thd->query_id))
- {
- List_iterator_fast<Item> it(select_lex->item_list);
- Item *item;
- uint splocal_refs= 0;
- /* Count SP local vars in the top-level SELECT list */
- while ((item= it++))
- {
- if (item->get_item_splocal())
- splocal_refs++;
- }
- /*
- If it differs from number of NAME_CONST substitution applied,
- we may have a SOME_FUNC(NAME_CONST()) in the SELECT list,
- that may cause a problem with binary log (see BUG#35383),
- raise a warning.
- */
- if (splocal_refs != thd->query_name_consts)
- push_warning(thd,
- Sql_condition::WARN_LEVEL_WARN,
- ER_UNKNOWN_ERROR,
-"Invoked routine ran a statement that may cause problems with "
-"binary log, see 'NAME_CONST issues' in 'Binary Logging of Stored Programs' "
-"section of the manual.");
- }
-
- select_lex->options|= SELECT_NO_UNLOCK;
- unit->set_limit(select_lex);
-
- /*
- Disable non-empty MERGE tables with CREATE...SELECT. Too
- complicated. See Bug #26379. Empty MERGE tables are read-only
- and don't allow CREATE...SELECT anyway.
- */
- if (create_info.used_fields & HA_CREATE_USED_UNION)
- {
- my_error(ER_WRONG_OBJECT, MYF(0), create_table->db.str,
- create_table->table_name.str, "BASE TABLE");
- res= 1;
- goto end_with_restore_list;
- }
-
- res= open_and_lock_tables(thd, create_info, lex->query_tables, TRUE, 0);
- if (unlikely(res))
- {
- /* Got error or warning. Set res to 1 if error */
- if (!(res= thd->is_error()))
- my_ok(thd); // CREATE ... IF NOT EXISTS
- goto end_with_restore_list;
- }
-
- /* Ensure we don't try to create something from which we select from */
- if (create_info.or_replace() && !create_info.tmp_table())
- {
- TABLE_LIST *duplicate;
- if (unlikely((duplicate= unique_table(thd, lex->query_tables,
- lex->query_tables->next_global,
- CHECK_DUP_FOR_CREATE |
- CHECK_DUP_SKIP_TEMP_TABLE))))
- {
- update_non_unique_table_error(lex->query_tables, "CREATE",
- duplicate);
- res= TRUE;
- goto end_with_restore_list;
- }
- }
- {
- /*
- Remove target table from main select and name resolution
- context. This can't be done earlier as it will break view merging in
- statements like "CREATE TABLE IF NOT EXISTS existing_view SELECT".
- */
- lex->unlink_first_table(&link_to_local);
-
- /* Store reference to table in case of LOCK TABLES */
- create_info.table= create_table->table;
-
- /*
- select_create is currently not re-execution friendly and
- needs to be created for every execution of a PS/SP.
- Note: In wsrep-patch, CTAS is handled like a regular transaction.
- */
- if (unlikely((result= new (thd->mem_root)
- select_create(thd, create_table,
- &create_info,
- &alter_info,
- select_lex->item_list,
- lex->duplicates,
- lex->ignore,
- select_tables))))
- {
- /*
- CREATE from SELECT give its SELECT_LEX for SELECT,
- and item_list belong to SELECT
- */
- if (!(res= handle_select(thd, lex, result, 0)))
- {
- if (create_info.tmp_table())
- thd->variables.option_bits|= OPTION_KEEP_LOG;
- }
- delete result;
- }
- lex->link_first_table_back(create_table, link_to_local);
- }
- }
- else
- {
- /* regular create */
- if (create_info.like())
- {
- /* CREATE TABLE ... LIKE ... */
- res= mysql_create_like_table(thd, create_table, select_tables,
- &create_info);
- }
- else
- {
- if (create_info.fix_create_fields(thd, &alter_info, *create_table) ||
- create_info.check_fields(thd, &alter_info, *create_table))
- goto end_with_restore_list;
-
- /*
- In STATEMENT format, we probably have to replicate also temporary
- tables, like mysql replication does. Also check if the requested
- engine is allowed/supported.
- */
- if (WSREP(thd) &&
- !check_engine(thd, create_table->db.str, create_table->table_name.str,
- &create_info) &&
- (!thd->is_current_stmt_binlog_format_row() ||
- !create_info.tmp_table()))
- {
- WSREP_TO_ISOLATION_BEGIN(create_table->db.str, create_table->table_name.str, NULL);
- }
- /* Regular CREATE TABLE */
- res= mysql_create_table(thd, create_table, &create_info, &alter_info);
- }
-
- if (!res)
- {
- /* So that CREATE TEMPORARY TABLE gets to binlog at commit/rollback */
- if (create_info.tmp_table())
- thd->variables.option_bits|= OPTION_KEEP_LOG;
- /* in case of create temp tables if @@session_track_state_change is
- ON then send session state notification in OK packet */
- if(create_info.options & HA_LEX_CREATE_TMP_TABLE)
- {
- SESSION_TRACKER_CHANGED(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
- }
- my_ok(thd);
- }
- }
-
-end_with_restore_list:
- break;
- }
case SQLCOM_CREATE_INDEX:
case SQLCOM_DROP_INDEX:
/*
@@ -6342,6 +6063,8 @@ end_with_restore_list:
case SQLCOM_OPTIMIZE:
case SQLCOM_REPAIR:
case SQLCOM_TRUNCATE:
+ case SQLCOM_CREATE_TABLE:
+ case SQLCOM_CREATE_SEQUENCE:
case SQLCOM_ALTER_TABLE:
DBUG_ASSERT(first_table == all_tables && first_table != 0);
/* fall through */
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 165ae88879f..f2e7ba5e214 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -223,7 +223,8 @@ static COND *make_cond_for_table_from_pred(THD *thd, Item *root_cond,
table_map used_table,
int join_tab_idx_arg,
bool exclude_expensive_cond,
- bool retain_ref_cond);
+ bool retain_ref_cond,
+ bool is_top_and_level);
static Item* part_of_refkey(TABLE *form,Field *field);
uint find_shortest_key(TABLE *table, const key_map *usable_keys);
@@ -5471,7 +5472,7 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
DBUG_RETURN(TRUE); /* purecov: inspected */
{
- ha_rows records= 1;
+ double records= 1;
SELECT_LEX_UNIT *unit= join->select_lex->master_unit();
/* Find an optimal join order of the non-constant tables. */
@@ -5496,10 +5497,11 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
table/view.
*/
for (i= 0; i < join->table_count ; i++)
- records*= join->best_positions[i].records_read ?
- (ha_rows)join->best_positions[i].records_read : 1;
- set_if_smaller(records, unit->select_limit_cnt);
- join->select_lex->increase_derived_records(records);
+ if (double rr= join->best_positions[i].records_read)
+ records= COST_MULT(records, rr);
+ ha_rows rows= records > HA_ROWS_MAX ? HA_ROWS_MAX : (ha_rows) records;
+ set_if_smaller(rows, unit->select_limit_cnt);
+ join->select_lex->increase_derived_records(rows);
}
}
@@ -8803,18 +8805,23 @@ double JOIN::get_examined_rows()
{
double examined_rows;
double prev_fanout= 1;
+ double records;
JOIN_TAB *tab= first_breadth_first_tab();
JOIN_TAB *prev_tab= tab;
- examined_rows= (double)tab->get_examined_rows();
+ records= (double)tab->get_examined_rows();
while ((tab= next_breadth_first_tab(first_breadth_first_tab(),
top_join_tab_count, tab)))
{
- prev_fanout *= prev_tab->records_read;
- examined_rows+= tab->get_examined_rows() * prev_fanout;
+ prev_fanout= COST_MULT(prev_fanout, prev_tab->records_read);
+ records=
+ COST_ADD(records,
+ COST_MULT((double) (tab->get_examined_rows()), prev_fanout));
prev_tab= tab;
}
+ examined_rows= (double)
+ (records > (double) HA_ROWS_MAX ? HA_ROWS_MAX : (ha_rows) records);
return examined_rows;
}
@@ -11178,12 +11185,6 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
RAND_TABLE_BIT;
}
- /*
- Following force including random expression in last table condition.
- It solve problem with select like SELECT * FROM t1 WHERE rand() > 0.5
- */
- if (tab == join->join_tab + last_top_base_tab_idx)
- current_map|= RAND_TABLE_BIT;
used_tables|=current_map;
if (tab->type == JT_REF && tab->quick &&
@@ -11228,6 +11229,20 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
{
tmp= make_cond_for_table(thd, cond, used_tables, current_map, i,
FALSE, FALSE);
+ if (tab == join->join_tab + last_top_base_tab_idx)
+ {
+ /*
+ This pushes conjunctive conditions of WHERE condition such that:
+ - their used_tables() contain RAND_TABLE_BIT
+ - the conditions does not refer to any fields
+ (such like rand() > 0.5)
+ */
+ table_map rand_table_bit= (table_map) RAND_TABLE_BIT;
+ COND *rand_cond= make_cond_for_table(thd, cond, used_tables,
+ rand_table_bit, -1,
+ FALSE, FALSE);
+ add_cond_and_fix(thd, &tmp, rand_cond);
+ }
}
/* Add conditions added by add_not_null_conds(). */
if (tab->select_cond)
@@ -11568,6 +11583,21 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
current_map,
/*(inner_tab - first_tab)*/ -1,
FALSE, FALSE);
+ if (tab == last_tab)
+ {
+ /*
+ This pushes conjunctive conditions of ON expression of an outer
+ join such that:
+ - their used_tables() contain RAND_TABLE_BIT
+ - the conditions does not refer to any fields
+ (such like rand() > 0.5)
+ */
+ table_map rand_table_bit= (table_map) RAND_TABLE_BIT;
+ COND *rand_cond= make_cond_for_table(thd, on_expr, used_tables2,
+ rand_table_bit, -1,
+ FALSE, FALSE);
+ add_cond_and_fix(thd, &tmp_cond, rand_cond);
+ }
bool is_sjm_lookup_tab= FALSE;
if (inner_tab->bush_children)
{
@@ -13243,6 +13273,8 @@ ha_rows JOIN_TAB::get_examined_rows()
else
examined_rows= records_read;
+ if (examined_rows >= (double) HA_ROWS_MAX)
+ return HA_ROWS_MAX;
return (ha_rows) examined_rows;
}
@@ -22023,7 +22055,7 @@ make_cond_for_table(THD *thd, Item *cond, table_map tables,
return make_cond_for_table_from_pred(thd, cond, cond, tables, used_table,
join_tab_idx_arg,
exclude_expensive_cond,
- retain_ref_cond);
+ retain_ref_cond, true);
}
@@ -22033,9 +22065,12 @@ make_cond_for_table_from_pred(THD *thd, Item *root_cond, Item *cond,
int join_tab_idx_arg,
bool exclude_expensive_cond __attribute__
((unused)),
- bool retain_ref_cond)
+ bool retain_ref_cond,
+ bool is_top_and_level)
{
+ table_map rand_table_bit= (table_map) RAND_TABLE_BIT;
+
if (used_table && !(cond->used_tables() & used_table))
return (COND*) 0; // Already checked
@@ -22051,11 +22086,28 @@ make_cond_for_table_from_pred(THD *thd, Item *root_cond, Item *cond,
Item *item;
while ((item=li++))
{
+ /*
+ Special handling of top level conjuncts with RAND_TABLE_BIT:
+ if such a conjunct contains a reference to a field that is not
+ an outer field then it is pushed to the corresponding table by
+ the same rule as all other conjuncts. Otherwise, if the conjunct
+ is used in WHERE is is pushed to the last joined table, if is it
+ is used in ON condition of an outer join it is pushed into the
+ last inner table of the outer join. Such conjuncts are pushed in
+ a call of make_cond_for_table_from_pred() with the
+ parameter 'used_table' equal to PSEUDO_TABLE_BITS.
+ */
+ if (is_top_and_level && used_table == rand_table_bit &&
+ (item->used_tables() & ~OUTER_REF_TABLE_BIT) != rand_table_bit)
+ {
+ /* The conjunct with RAND_TABLE_BIT has been allready pushed */
+ continue;
+ }
Item *fix=make_cond_for_table_from_pred(thd, root_cond, item,
tables, used_table,
- join_tab_idx_arg,
+ join_tab_idx_arg,
exclude_expensive_cond,
- retain_ref_cond);
+ retain_ref_cond, false);
if (fix)
new_cond->argument_list()->push_back(fix, thd->mem_root);
}
@@ -22080,6 +22132,13 @@ make_cond_for_table_from_pred(THD *thd, Item *root_cond, Item *cond,
}
else
{ // Or list
+ if (is_top_and_level && used_table == rand_table_bit &&
+ (cond->used_tables() & ~OUTER_REF_TABLE_BIT) != rand_table_bit)
+ {
+ /* This top level formula with RAND_TABLE_BIT has been already pushed */
+ return (COND*) 0;
+ }
+
Item_cond_or *new_cond=new (thd->mem_root) Item_cond_or(thd);
if (!new_cond)
return (COND*) 0; // OOM /* purecov: inspected */
@@ -22091,7 +22150,7 @@ make_cond_for_table_from_pred(THD *thd, Item *root_cond, Item *cond,
tables, 0L,
join_tab_idx_arg,
exclude_expensive_cond,
- retain_ref_cond);
+ retain_ref_cond, false);
if (!fix)
return (COND*) 0; // Always true
new_cond->argument_list()->push_back(fix, thd->mem_root);
@@ -22108,6 +22167,13 @@ make_cond_for_table_from_pred(THD *thd, Item *root_cond, Item *cond,
}
}
+ if (is_top_and_level && used_table == rand_table_bit &&
+ (cond->used_tables() & ~OUTER_REF_TABLE_BIT) != rand_table_bit)
+ {
+ /* This top level formula with RAND_TABLE_BIT has been already pushed */
+ return (COND*) 0;
+ }
+
/*
Because the following test takes a while and it can be done
table_count times, we mark each item that we have examined with the result
@@ -26141,10 +26207,10 @@ bool JOIN_TAB::save_explain_data(Explain_table_access *eta,
}
else
{
- double examined_rows= (double)get_examined_rows();
+ ha_rows examined_rows= get_examined_rows();
eta->rows_set= true;
- eta->rows= (ha_rows) examined_rows;
+ eta->rows= examined_rows;
/* "filtered" */
float f= 0.0;
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 642b98e0e98..6b9a35f2888 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -6048,9 +6048,15 @@ static int get_schema_column_record(THD *thd, TABLE_LIST *tables,
else if (field->flags & VERS_SYSTEM_FIELD)
{
if (field->flags & VERS_SYS_START_FLAG)
+ {
table->field[21]->store(STRING_WITH_LEN("ROW START"), cs);
+ buf.set(STRING_WITH_LEN("STORED GENERATED"), cs);
+ }
else
+ {
table->field[21]->store(STRING_WITH_LEN("ROW END"), cs);
+ buf.set(STRING_WITH_LEN("STORED GENERATED"), cs);
+ }
table->field[21]->set_notnull();
table->field[20]->store(STRING_WITH_LEN("ALWAYS"), cs);
}
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 5845f96ca58..c47f85aaf4c 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -9188,11 +9188,6 @@ simple_rename_or_index_change(THD *thd, TABLE_LIST *table_list,
close_all_tables_for_name(thd, table->s, HA_EXTRA_PREPARE_FOR_RENAME,
NULL);
- (void) rename_table_in_stat_tables(thd, &alter_ctx->db,
- &alter_ctx->table_name,
- &alter_ctx->new_db,
- &alter_ctx->new_alias);
-
if (mysql_rename_table(old_db_type, &alter_ctx->db, &alter_ctx->table_name,
&alter_ctx->new_db, &alter_ctx->new_alias, 0))
error= -1;
@@ -9209,6 +9204,12 @@ simple_rename_or_index_change(THD *thd, TABLE_LIST *table_list,
NO_FK_CHECKS);
error= -1;
}
+ /* Update stat tables last. This is to be able to handle rename of a stat table */
+ if (error == 0)
+ (void) rename_table_in_stat_tables(thd, &alter_ctx->db,
+ &alter_ctx->table_name,
+ &alter_ctx->new_db,
+ &alter_ctx->new_alias);
}
if (likely(!error))
@@ -11126,3 +11127,312 @@ bool check_engine(THD *thd, const char *db_name,
DBUG_RETURN(false);
}
+
+
+bool Sql_cmd_create_table_like::execute(THD *thd)
+{
+ DBUG_ENTER("Sql_cmd_create_table::execute");
+ LEX *lex= thd->lex;
+ TABLE_LIST *all_tables= lex->query_tables;
+ SELECT_LEX *select_lex= lex->first_select_lex();
+ TABLE_LIST *first_table= select_lex->table_list.first;
+ DBUG_ASSERT(first_table == all_tables && first_table != 0);
+ bool link_to_local;
+ TABLE_LIST *create_table= first_table;
+ TABLE_LIST *select_tables= lex->create_last_non_select_table->next_global;
+ /* most outer SELECT_LEX_UNIT of query */
+ SELECT_LEX_UNIT *unit= &lex->unit;
+ int res= 0;
+
+ const bool used_engine= lex->create_info.used_fields & HA_CREATE_USED_ENGINE;
+ DBUG_ASSERT((m_storage_engine_name.str != NULL) == used_engine);
+ if (used_engine)
+ {
+ if (resolve_storage_engine_with_error(thd, &lex->create_info.db_type,
+ lex->create_info.tmp_table()))
+ DBUG_RETURN(true); // Engine not found, substitution is not allowed
+
+ if (!lex->create_info.db_type) // Not found, but substitution is allowed
+ {
+ lex->create_info.use_default_db_type(thd);
+ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
+ ER_WARN_USING_OTHER_HANDLER,
+ ER_THD(thd, ER_WARN_USING_OTHER_HANDLER),
+ hton_name(lex->create_info.db_type)->str,
+ create_table->table_name.str);
+ }
+ }
+
+ if (lex->tmp_table())
+ {
+ status_var_decrement(thd->status_var.com_stat[SQLCOM_CREATE_TABLE]);
+ status_var_increment(thd->status_var.com_create_tmp_table);
+ }
+
+ /*
+ Code below (especially in mysql_create_table() and select_create
+ methods) may modify HA_CREATE_INFO structure in LEX, so we have to
+ use a copy of this structure to make execution prepared statement-
+ safe. A shallow copy is enough as this code won't modify any memory
+ referenced from this structure.
+ */
+ Table_specification_st create_info(lex->create_info);
+ /*
+ We need to copy alter_info for the same reasons of re-execution
+ safety, only in case of Alter_info we have to do (almost) a deep
+ copy.
+ */
+ Alter_info alter_info(lex->alter_info, thd->mem_root);
+
+ if (unlikely(thd->is_fatal_error))
+ {
+ /* If out of memory when creating a copy of alter_info. */
+ res= 1;
+ goto end_with_restore_list;
+ }
+
+ /* Check privileges */
+ if ((res= create_table_precheck(thd, select_tables, create_table)))
+ goto end_with_restore_list;
+
+ /* Might have been updated in create_table_precheck */
+ create_info.alias= create_table->alias;
+
+ /* Fix names if symlinked or relocated tables */
+ if (append_file_to_dir(thd, &create_info.data_file_name,
+ &create_table->table_name) ||
+ append_file_to_dir(thd, &create_info.index_file_name,
+ &create_table->table_name))
+ goto end_with_restore_list;
+
+ /*
+ If no engine type was given, work out the default now
+ rather than at parse-time.
+ */
+ if (!(create_info.used_fields & HA_CREATE_USED_ENGINE))
+ create_info.use_default_db_type(thd);
+ /*
+ If we are using SET CHARSET without DEFAULT, add an implicit
+ DEFAULT to not confuse old users. (This may change).
+ */
+ if ((create_info.used_fields &
+ (HA_CREATE_USED_DEFAULT_CHARSET | HA_CREATE_USED_CHARSET)) ==
+ HA_CREATE_USED_CHARSET)
+ {
+ create_info.used_fields&= ~HA_CREATE_USED_CHARSET;
+ create_info.used_fields|= HA_CREATE_USED_DEFAULT_CHARSET;
+ create_info.default_table_charset= create_info.table_charset;
+ create_info.table_charset= 0;
+ }
+
+ /*
+ If we are a slave, we should add OR REPLACE if we don't have
+ IF EXISTS. This will help a slave to recover from
+ CREATE TABLE OR EXISTS failures by dropping the table and
+ retrying the create.
+ */
+ if (thd->slave_thread &&
+ slave_ddl_exec_mode_options == SLAVE_EXEC_MODE_IDEMPOTENT &&
+ !lex->create_info.if_not_exists())
+ {
+ create_info.add(DDL_options_st::OPT_OR_REPLACE);
+ create_info.add(DDL_options_st::OPT_OR_REPLACE_SLAVE_GENERATED);
+ }
+
+#ifdef WITH_PARTITION_STORAGE_ENGINE
+ thd->work_part_info= 0;
+ {
+ partition_info *part_info= thd->lex->part_info;
+ if (part_info && !(part_info= part_info->get_clone(thd)))
+ {
+ res= -1;
+ goto end_with_restore_list;
+ }
+ thd->work_part_info= part_info;
+ }
+#endif
+
+ if (select_lex->item_list.elements) // With select
+ {
+ select_result *result;
+
+ /*
+ CREATE TABLE...IGNORE/REPLACE SELECT... can be unsafe, unless
+ ORDER BY PRIMARY KEY clause is used in SELECT statement. We therefore
+ use row based logging if mixed or row based logging is available.
+ TODO: Check if the order of the output of the select statement is
+ deterministic. Waiting for BUG#42415
+ */
+ if(lex->ignore)
+ lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_CREATE_IGNORE_SELECT);
+
+ if(lex->duplicates == DUP_REPLACE)
+ lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_CREATE_REPLACE_SELECT);
+
+ /*
+ If:
+ a) we inside an SP and there was NAME_CONST substitution,
+ b) binlogging is on (STMT mode),
+ c) we log the SP as separate statements
+ raise a warning, as it may cause problems
+ (see 'NAME_CONST issues' in 'Binary Logging of Stored Programs')
+ */
+ if (thd->query_name_consts && mysql_bin_log.is_open() &&
+ thd->wsrep_binlog_format() == BINLOG_FORMAT_STMT &&
+ !mysql_bin_log.is_query_in_union(thd, thd->query_id))
+ {
+ List_iterator_fast<Item> it(select_lex->item_list);
+ Item *item;
+ uint splocal_refs= 0;
+ /* Count SP local vars in the top-level SELECT list */
+ while ((item= it++))
+ {
+ if (item->get_item_splocal())
+ splocal_refs++;
+ }
+ /*
+ If it differs from number of NAME_CONST substitution applied,
+ we may have a SOME_FUNC(NAME_CONST()) in the SELECT list,
+ that may cause a problem with binary log (see BUG#35383),
+ raise a warning.
+ */
+ if (splocal_refs != thd->query_name_consts)
+ push_warning(thd,
+ Sql_condition::WARN_LEVEL_WARN,
+ ER_UNKNOWN_ERROR,
+"Invoked routine ran a statement that may cause problems with "
+"binary log, see 'NAME_CONST issues' in 'Binary Logging of Stored Programs' "
+"section of the manual.");
+ }
+
+ select_lex->options|= SELECT_NO_UNLOCK;
+ unit->set_limit(select_lex);
+
+ /*
+ Disable non-empty MERGE tables with CREATE...SELECT. Too
+ complicated. See Bug #26379. Empty MERGE tables are read-only
+ and don't allow CREATE...SELECT anyway.
+ */
+ if (create_info.used_fields & HA_CREATE_USED_UNION)
+ {
+ my_error(ER_WRONG_OBJECT, MYF(0), create_table->db.str,
+ create_table->table_name.str, "BASE TABLE");
+ res= 1;
+ goto end_with_restore_list;
+ }
+
+ res= open_and_lock_tables(thd, create_info, lex->query_tables, TRUE, 0);
+ if (unlikely(res))
+ {
+ /* Got error or warning. Set res to 1 if error */
+ if (!(res= thd->is_error()))
+ my_ok(thd); // CREATE ... IF NOT EXISTS
+ goto end_with_restore_list;
+ }
+
+ /* Ensure we don't try to create something from which we select from */
+ if (create_info.or_replace() && !create_info.tmp_table())
+ {
+ if (TABLE_LIST *duplicate= unique_table(thd, lex->query_tables,
+ lex->query_tables->next_global,
+ CHECK_DUP_FOR_CREATE |
+ CHECK_DUP_SKIP_TEMP_TABLE))
+ {
+ update_non_unique_table_error(lex->query_tables, "CREATE",
+ duplicate);
+ res= TRUE;
+ goto end_with_restore_list;
+ }
+ }
+ {
+ /*
+ Remove target table from main select and name resolution
+ context. This can't be done earlier as it will break view merging in
+ statements like "CREATE TABLE IF NOT EXISTS existing_view SELECT".
+ */
+ lex->unlink_first_table(&link_to_local);
+
+ /* Store reference to table in case of LOCK TABLES */
+ create_info.table= create_table->table;
+
+ /*
+ select_create is currently not re-execution friendly and
+ needs to be created for every execution of a PS/SP.
+ Note: In wsrep-patch, CTAS is handled like a regular transaction.
+ */
+ if ((result= new (thd->mem_root) select_create(thd, create_table,
+ &create_info,
+ &alter_info,
+ select_lex->item_list,
+ lex->duplicates,
+ lex->ignore,
+ select_tables)))
+ {
+ /*
+ CREATE from SELECT give its SELECT_LEX for SELECT,
+ and item_list belong to SELECT
+ */
+ if (!(res= handle_select(thd, lex, result, 0)))
+ {
+ if (create_info.tmp_table())
+ thd->variables.option_bits|= OPTION_KEEP_LOG;
+ }
+ delete result;
+ }
+ lex->link_first_table_back(create_table, link_to_local);
+ }
+ }
+ else
+ {
+ /* regular create */
+ if (create_info.like())
+ {
+ /* CREATE TABLE ... LIKE ... */
+ res= mysql_create_like_table(thd, create_table, select_tables,
+ &create_info);
+ }
+ else
+ {
+ if (create_info.fix_create_fields(thd, &alter_info, *create_table) ||
+ create_info.check_fields(thd, &alter_info, *create_table))
+ goto end_with_restore_list;
+
+ /*
+ In STATEMENT format, we probably have to replicate also temporary
+ tables, like mysql replication does. Also check if the requested
+ engine is allowed/supported.
+ */
+ if (WSREP(thd) &&
+ !check_engine(thd, create_table->db.str, create_table->table_name.str,
+ &create_info) &&
+ (!thd->is_current_stmt_binlog_format_row() ||
+ !create_info.tmp_table()))
+ {
+ WSREP_TO_ISOLATION_BEGIN(create_table->db.str, create_table->table_name.str, NULL);
+ }
+ /* Regular CREATE TABLE */
+ res= mysql_create_table(thd, create_table, &create_info, &alter_info);
+ }
+ if (!res)
+ {
+ /* So that CREATE TEMPORARY TABLE gets to binlog at commit/rollback */
+ if (create_info.tmp_table())
+ thd->variables.option_bits|= OPTION_KEEP_LOG;
+ /* in case of create temp tables if @@session_track_state_change is
+ ON then send session state notification in OK packet */
+ if (create_info.options & HA_LEX_CREATE_TMP_TABLE)
+ {
+ SESSION_TRACKER_CHANGED(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
+ }
+ my_ok(thd);
+ }
+ }
+
+end_with_restore_list:
+ DBUG_RETURN(res);
+
+#ifdef WITH_WSREP
+wsrep_error_label:
+ DBUG_RETURN(true);
+#endif
+}
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index fe021e27505..b16c49cf17a 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -181,6 +181,11 @@ static bool check_fields(THD *thd, TABLE_LIST *table, List<Item> &items,
if (table->has_period())
{
+ if (table->is_view_or_derived())
+ {
+ my_error(ER_IT_IS_A_VIEW, MYF(0), table->table_name.str);
+ return TRUE;
+ }
DBUG_ASSERT(thd->lex->sql_command == SQLCOM_UPDATE);
for (List_iterator_fast<Item> it(items); (item=it++);)
{
@@ -1622,121 +1627,81 @@ static bool multi_update_check_table_access(THD *thd, TABLE_LIST *table,
}
-/*
- make update specific preparation and checks after opening tables
+class Multiupdate_prelocking_strategy : public DML_prelocking_strategy
+{
+ bool done;
+ bool has_prelocking_list;
+public:
+ void reset(THD *thd);
+ bool handle_end(THD *thd);
+};
+
+void Multiupdate_prelocking_strategy::reset(THD *thd)
+{
+ done= false;
+ has_prelocking_list= thd->lex->requires_prelocking();
+}
- SYNOPSIS
- mysql_multi_update_prepare()
- thd thread handler
+/**
+ Determine what tables could be updated in the multi-update
- RETURN
- FALSE OK
- TRUE Error
+ For these tables we'll need to open triggers and continue prelocking
+ until all is open.
*/
-
-int mysql_multi_update_prepare(THD *thd)
+bool Multiupdate_prelocking_strategy::handle_end(THD *thd)
{
- LEX *lex= thd->lex;
- TABLE_LIST *table_list= lex->query_tables;
- TABLE_LIST *tl;
- List<Item> *fields= &lex->first_select_lex()->item_list;
- table_map tables_for_update;
- bool update_view= 0;
- DML_prelocking_strategy prelocking_strategy;
- bool has_prelocking_list= thd->lex->requires_prelocking();
+ DBUG_ENTER("Multiupdate_prelocking_strategy::handle_end");
+ if (done)
+ DBUG_RETURN(0);
- /*
- if this multi-update was converted from usual update, here is table
- counter else junk will be assigned here, but then replaced with real
- count in open_tables()
- */
- uint table_count= lex->table_count;
- const bool using_lock_tables= thd->locked_tables_mode != LTM_NONE;
- bool original_multiupdate= (thd->lex->sql_command == SQLCOM_UPDATE_MULTI);
- DBUG_ENTER("mysql_multi_update_prepare");
+ LEX *lex= thd->lex;
+ SELECT_LEX *select_lex= lex->first_select_lex();
+ TABLE_LIST *table_list= lex->query_tables, *tl;
- /* following need for prepared statements, to run next time multi-update */
- thd->lex->sql_command= SQLCOM_UPDATE_MULTI;
+ done= true;
- /*
- Open tables and create derived ones, but do not lock and fill them yet.
+ if (mysql_handle_derived(lex, DT_INIT) ||
+ mysql_handle_derived(lex, DT_MERGE_FOR_INSERT) ||
+ mysql_handle_derived(lex, DT_PREPARE))
+ DBUG_RETURN(1);
- During prepare phase acquire only S metadata locks instead of SW locks to
- keep prepare of multi-UPDATE compatible with concurrent LOCK TABLES WRITE
- and global read lock.
- */
- if ((original_multiupdate && open_tables(thd, &table_list, &table_count,
- thd->stmt_arena->is_stmt_prepare()
- ? MYSQL_OPEN_FORCE_SHARED_MDL : 0,
- &prelocking_strategy)) ||
- mysql_handle_derived(lex, DT_INIT))
- DBUG_RETURN(TRUE);
/*
setup_tables() need for VIEWs. JOIN::prepare() will call setup_tables()
second time, but this call will do nothing (there are check for second
call in setup_tables()).
*/
- //We need to merge for insert prior to prepare.
- if (mysql_handle_derived(lex, DT_MERGE_FOR_INSERT))
- DBUG_RETURN(TRUE);
-
- if (mysql_handle_derived(lex, DT_PREPARE))
- DBUG_RETURN(TRUE);
-
- if (table_list->has_period())
- {
- /*
- Multi-table update is not supported on syntax lexel. However it's possible
- to get here through PREPARE with update of multi-table view.
- */
- DBUG_ASSERT(table_list->is_view_or_derived());
- my_error(ER_IT_IS_A_VIEW, MYF(0), table_list->table_name.str);
- DBUG_RETURN(TRUE);
- }
-
- if (setup_tables_and_check_access(thd,
- &lex->first_select_lex()->context,
- &lex->first_select_lex()->top_join_list,
- table_list,
- lex->first_select_lex()->leaf_tables,
- FALSE, UPDATE_ACL, SELECT_ACL, FALSE))
- DBUG_RETURN(TRUE);
+ if (setup_tables_and_check_access(thd, &select_lex->context,
+ &select_lex->top_join_list, table_list, select_lex->leaf_tables,
+ FALSE, UPDATE_ACL, SELECT_ACL, FALSE))
+ DBUG_RETURN(1);
- if (lex->first_select_lex()->handle_derived(thd->lex, DT_MERGE))
- DBUG_RETURN(TRUE);
+ if (select_lex->handle_derived(thd->lex, DT_MERGE))
+ DBUG_RETURN(1);
+ List<Item> *fields= &lex->first_select_lex()->item_list;
if (setup_fields_with_no_wrap(thd, Ref_ptr_array(),
*fields, MARK_COLUMNS_WRITE, 0, 0))
- DBUG_RETURN(TRUE);
+ DBUG_RETURN(1);
+ // Check if we have a view in the list ...
for (tl= table_list; tl ; tl= tl->next_local)
- {
if (tl->view)
- {
- update_view= 1;
break;
- }
- }
-
- if (check_fields(thd, table_list, *fields, update_view))
- {
- DBUG_RETURN(TRUE);
- }
-
- thd->table_map_for_update= tables_for_update= get_table_map(fields);
+ // ... and pass this knowlage in check_fields call
+ if (check_fields(thd, table_list, *fields, tl != NULL ))
+ DBUG_RETURN(1);
- if (unsafe_key_update(lex->first_select_lex()->leaf_tables,
- tables_for_update))
- DBUG_RETURN(true);
+ table_map tables_for_update= thd->table_map_for_update= get_table_map(fields);
- TABLE_LIST **new_tables= lex->query_tables_last;
- DBUG_ASSERT(*new_tables== NULL);
+ if (unsafe_key_update(select_lex->leaf_tables, tables_for_update))
+ DBUG_RETURN(1);
/*
Setup timestamp handling and locking mode
*/
List_iterator<TABLE_LIST> ti(lex->first_select_lex()->leaf_tables);
+ const bool using_lock_tables= thd->locked_tables_mode != LTM_NONE;
while ((tl= ti++))
{
TABLE *table= tl->table;
@@ -1751,7 +1716,7 @@ int mysql_multi_update_prepare(THD *thd)
{
my_error(ER_NON_UPDATABLE_TABLE, MYF(0),
tl->top_table()->alias.str, "UPDATE");
- DBUG_RETURN(TRUE);
+ DBUG_RETURN(1);
}
DBUG_PRINT("info",("setting table `%s` for update",
@@ -1763,8 +1728,8 @@ int mysql_multi_update_prepare(THD *thd)
tl->updating= 1;
if (tl->belong_to_view)
tl->belong_to_view->updating= 1;
- if (extend_table_list(thd, tl, &prelocking_strategy, has_prelocking_list))
- DBUG_RETURN(TRUE);
+ if (extend_table_list(thd, tl, this, has_prelocking_list))
+ DBUG_RETURN(1);
}
else
{
@@ -1796,19 +1761,6 @@ int mysql_multi_update_prepare(THD *thd)
through all leaf tables but also through all view hierarchy.
*/
- uint addon_table_count= 0;
- if (*new_tables)
- {
- Sroutine_hash_entry **new_routines= thd->lex->sroutines_list.next;
- DBUG_ASSERT(*new_routines == NULL);
- if (open_tables(thd, thd->lex->create_info, new_tables,
- &addon_table_count, new_routines,
- thd->stmt_arena->is_stmt_prepare()
- ? MYSQL_OPEN_FORCE_SHARED_MDL : 0,
- &prelocking_strategy))
- DBUG_RETURN(TRUE);
- }
-
for (tl= table_list; tl; tl= tl->next_local)
{
bool not_used= false;
@@ -1821,23 +1773,67 @@ int mysql_multi_update_prepare(THD *thd)
/* check single table update for view compound from several tables */
for (tl= table_list; tl; tl= tl->next_local)
{
+ TABLE_LIST *for_update= 0;
if (tl->is_jtbm())
continue;
- if (tl->is_merged_derived())
+ if (tl->is_merged_derived() &&
+ tl->check_single_table(&for_update, tables_for_update, tl))
{
- TABLE_LIST *for_update= 0;
- if (tl->check_single_table(&for_update, tables_for_update, tl))
- {
- my_error(ER_VIEW_MULTIUPDATE, MYF(0),
- tl->view_db.str, tl->view_name.str);
- DBUG_RETURN(-1);
- }
+ my_error(ER_VIEW_MULTIUPDATE, MYF(0), tl->view_db.str, tl->view_name.str);
+ DBUG_RETURN(1);
}
}
+ DBUG_RETURN(0);
+}
+
+/*
+ make update specific preparation and checks after opening tables
+
+ SYNOPSIS
+ mysql_multi_update_prepare()
+ thd thread handler
+
+ RETURN
+ FALSE OK
+ TRUE Error
+*/
+
+int mysql_multi_update_prepare(THD *thd)
+{
+ LEX *lex= thd->lex;
+ TABLE_LIST *table_list= lex->query_tables;
+ TABLE_LIST *tl;
+ Multiupdate_prelocking_strategy prelocking_strategy;
+ uint table_count= lex->table_count;
+ DBUG_ENTER("mysql_multi_update_prepare");
+
+ /*
+ Open tables and create derived ones, but do not lock and fill them yet.
+
+ During prepare phase acquire only S metadata locks instead of SW locks to
+ keep prepare of multi-UPDATE compatible with concurrent LOCK TABLES WRITE
+ and global read lock.
+ */
+ if (thd->lex->sql_command == SQLCOM_UPDATE_MULTI)
+ {
+ if (open_tables(thd, &table_list, &table_count,
+ thd->stmt_arena->is_stmt_prepare() ? MYSQL_OPEN_FORCE_SHARED_MDL : 0,
+ &prelocking_strategy))
+ DBUG_RETURN(TRUE);
+ }
+ else
+ {
+ /* following need for prepared statements, to run next time multi-update */
+ thd->lex->sql_command= SQLCOM_UPDATE_MULTI;
+ prelocking_strategy.reset(thd);
+ if (prelocking_strategy.handle_end(thd))
+ DBUG_RETURN(TRUE);
+ }
+
/* now lock and fill tables */
if (!thd->stmt_arena->is_stmt_prepare() &&
- lock_tables(thd, table_list, table_count + addon_table_count, 0))
+ lock_tables(thd, table_list, table_count, 0))
{
DBUG_RETURN(TRUE);
}
@@ -1850,7 +1846,7 @@ int mysql_multi_update_prepare(THD *thd)
*/
lex->first_select_lex()->exclude_from_table_unique_test= TRUE;
/* We only need SELECT privilege for columns in the values list */
- ti.rewind();
+ List_iterator<TABLE_LIST> ti(lex->first_select_lex()->leaf_tables);
while ((tl= ti++))
{
if (tl->is_jtbm())
@@ -1883,25 +1879,18 @@ int mysql_multi_update_prepare(THD *thd)
Setup multi-update handling and call SELECT to do the join
*/
-bool mysql_multi_update(THD *thd,
- TABLE_LIST *table_list,
- List<Item> *fields,
- List<Item> *values,
- COND *conds,
- ulonglong options,
+bool mysql_multi_update(THD *thd, TABLE_LIST *table_list, List<Item> *fields,
+ List<Item> *values, COND *conds, ulonglong options,
enum enum_duplicates handle_duplicates,
- bool ignore,
- SELECT_LEX_UNIT *unit,
- SELECT_LEX *select_lex,
- multi_update **result)
+ bool ignore, SELECT_LEX_UNIT *unit,
+ SELECT_LEX *select_lex, multi_update **result)
{
bool res;
DBUG_ENTER("mysql_multi_update");
-
+
if (!(*result= new (thd->mem_root) multi_update(thd, table_list,
&thd->lex->first_select_lex()->leaf_tables,
- fields, values,
- handle_duplicates, ignore)))
+ fields, values, handle_duplicates, ignore)))
{
DBUG_RETURN(TRUE);
}
@@ -1911,8 +1900,8 @@ bool mysql_multi_update(THD *thd,
res= mysql_select(thd,
table_list, select_lex->with_wild, total_list, conds,
- select_lex->order_list.elements, select_lex->order_list.first,
- (ORDER *)NULL, (Item *) NULL, (ORDER *)NULL,
+ select_lex->order_list.elements,
+ select_lex->order_list.first, NULL, NULL, NULL,
options | SELECT_NO_JOIN_CACHE | SELECT_NO_UNLOCK |
OPTION_SETUP_TABLES_DONE,
*result, unit, select_lex);
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 20946797a0c..374e7bae1ab 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -2664,6 +2664,8 @@ create:
create_or_replace opt_temporary TABLE_SYM opt_if_not_exists
{
LEX *lex= thd->lex;
+ if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_table()))
+ MYSQL_YYABORT;
lex->create_info.init();
if (lex->main_select_push())
MYSQL_YYABORT;
@@ -2691,24 +2693,16 @@ create:
create_body
{
LEX *lex= thd->lex;
- if ((lex->create_info.used_fields & HA_CREATE_USED_ENGINE) &&
- !lex->create_info.db_type)
- {
- lex->create_info.use_default_db_type(thd);
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_WARN_USING_OTHER_HANDLER,
- ER_THD(thd, ER_WARN_USING_OTHER_HANDLER),
- hton_name(lex->create_info.db_type)->str,
- $6->table.str);
- }
create_table_set_open_action_and_adjust_tables(lex);
Lex->pop_select(); //main select
}
| create_or_replace opt_temporary SEQUENCE_SYM opt_if_not_exists table_ident
{
LEX *lex= thd->lex;
- if (Lex->main_select_push())
+ if (lex->main_select_push())
MYSQL_YYABORT;
+ if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_sequence()))
+ MYSQL_YYABORT;
lex->create_info.init();
if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_SEQUENCE, $2,
$1 | $4)))
@@ -2754,16 +2748,6 @@ create:
Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE;
Lex->create_info.sequence= 1;
- if ((lex->create_info.used_fields & HA_CREATE_USED_ENGINE) &&
- !lex->create_info.db_type)
- {
- lex->create_info.use_default_db_type(thd);
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_WARN_USING_OTHER_HANDLER,
- ER_THD(thd, ER_WARN_USING_OTHER_HANDLER),
- hton_name(lex->create_info.db_type)->str,
- $5->table.str);
- }
create_table_set_open_action_and_adjust_tables(lex);
Lex->pop_select(); //main select
}
@@ -6119,10 +6103,20 @@ create_table_options:
;
create_table_option:
- ENGINE_SYM opt_equal storage_engines
+ ENGINE_SYM opt_equal ident_or_text
{
- Lex->create_info.db_type= $3;
- Lex->create_info.used_fields|= HA_CREATE_USED_ENGINE;
+ LEX *lex= Lex;
+ if (!lex->m_sql_cmd)
+ {
+ DBUG_ASSERT(lex->sql_command == SQLCOM_ALTER_TABLE);
+ if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table()))
+ MYSQL_YYABORT;
+ }
+ Storage_engine_name *opt=
+ lex->m_sql_cmd->option_storage_engine_name();
+ DBUG_ASSERT(opt); // Expect a proper Sql_cmd
+ *opt= Storage_engine_name($3);
+ lex->create_info.used_fields|= HA_CREATE_USED_ENGINE;
}
| MAX_ROWS opt_equal ulonglong_num
{
@@ -6417,21 +6411,10 @@ default_collation:
storage_engines:
ident_or_text
{
- plugin_ref plugin= ha_resolve_by_name(thd, &$1,
- thd->lex->create_info.tmp_table());
-
- if (likely(plugin))
- $$= plugin_hton(plugin);
- else
- {
- if (thd->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION)
- my_yyabort_error((ER_UNKNOWN_STORAGE_ENGINE, MYF(0), $1.str));
- $$= 0;
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_UNKNOWN_STORAGE_ENGINE,
- ER_THD(thd, ER_UNKNOWN_STORAGE_ENGINE),
- $1.str);
- }
+ if (Storage_engine_name($1).
+ resolve_storage_engine_with_error(thd, &$$,
+ thd->lex->create_info.tmp_table()))
+ MYSQL_YYABORT;
}
;
@@ -8453,11 +8436,6 @@ alter_list_item:
{
LEX *lex=Lex;
lex->alter_info.flags|= ALTER_OPTIONS;
- if ((lex->create_info.used_fields & HA_CREATE_USED_ENGINE) &&
- !lex->create_info.db_type)
- {
- lex->create_info.used_fields&= ~HA_CREATE_USED_ENGINE;
- }
}
| FORCE_SYM
{
diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy
index 719a6e39e2a..93144658bca 100644
--- a/sql/sql_yacc_ora.yy
+++ b/sql/sql_yacc_ora.yy
@@ -2156,6 +2156,8 @@ create:
create_or_replace opt_temporary TABLE_SYM opt_if_not_exists
{
LEX *lex= thd->lex;
+ if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_table()))
+ MYSQL_YYABORT;
lex->create_info.init();
if (lex->main_select_push())
MYSQL_YYABORT;
@@ -2183,24 +2185,16 @@ create:
create_body
{
LEX *lex= thd->lex;
- if ((lex->create_info.used_fields & HA_CREATE_USED_ENGINE) &&
- !lex->create_info.db_type)
- {
- lex->create_info.use_default_db_type(thd);
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_WARN_USING_OTHER_HANDLER,
- ER_THD(thd, ER_WARN_USING_OTHER_HANDLER),
- hton_name(lex->create_info.db_type)->str,
- $6->table.str);
- }
create_table_set_open_action_and_adjust_tables(lex);
Lex->pop_select(); //main select
}
| create_or_replace opt_temporary SEQUENCE_SYM opt_if_not_exists table_ident
{
LEX *lex= thd->lex;
- if (Lex->main_select_push())
+ if (lex->main_select_push())
MYSQL_YYABORT;
+ if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_sequence()))
+ MYSQL_YYABORT;
lex->create_info.init();
if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_SEQUENCE, $2,
$1 | $4)))
@@ -2246,16 +2240,6 @@ create:
Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE;
Lex->create_info.sequence= 1;
- if ((lex->create_info.used_fields & HA_CREATE_USED_ENGINE) &&
- !lex->create_info.db_type)
- {
- lex->create_info.use_default_db_type(thd);
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_WARN_USING_OTHER_HANDLER,
- ER_THD(thd, ER_WARN_USING_OTHER_HANDLER),
- hton_name(lex->create_info.db_type)->str,
- $5->table.str);
- }
create_table_set_open_action_and_adjust_tables(lex);
Lex->pop_select(); //main select
}
@@ -6118,10 +6102,20 @@ create_table_options:
;
create_table_option:
- ENGINE_SYM opt_equal storage_engines
+ ENGINE_SYM opt_equal ident_or_text
{
- Lex->create_info.db_type= $3;
- Lex->create_info.used_fields|= HA_CREATE_USED_ENGINE;
+ LEX *lex= Lex;
+ if (!lex->m_sql_cmd)
+ {
+ DBUG_ASSERT(lex->sql_command == SQLCOM_ALTER_TABLE);
+ if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table()))
+ MYSQL_YYABORT;
+ }
+ Storage_engine_name *opt=
+ lex->m_sql_cmd->option_storage_engine_name();
+ DBUG_ASSERT(opt); // Expect a proper Sql_cmd
+ *opt= Storage_engine_name($3);
+ lex->create_info.used_fields|= HA_CREATE_USED_ENGINE;
}
| MAX_ROWS opt_equal ulonglong_num
{
@@ -6416,21 +6410,10 @@ default_collation:
storage_engines:
ident_or_text
{
- plugin_ref plugin= ha_resolve_by_name(thd, &$1,
- thd->lex->create_info.tmp_table());
-
- if (likely(plugin))
- $$= plugin_hton(plugin);
- else
- {
- if (thd->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION)
- my_yyabort_error((ER_UNKNOWN_STORAGE_ENGINE, MYF(0), $1.str));
- $$= 0;
- push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
- ER_UNKNOWN_STORAGE_ENGINE,
- ER_THD(thd, ER_UNKNOWN_STORAGE_ENGINE),
- $1.str);
- }
+ if (Storage_engine_name($1).
+ resolve_storage_engine_with_error(thd, &$$,
+ thd->lex->create_info.tmp_table()))
+ MYSQL_YYABORT;
}
;
@@ -8544,11 +8527,6 @@ alter_list_item:
{
LEX *lex=Lex;
lex->alter_info.flags|= ALTER_OPTIONS;
- if ((lex->create_info.used_fields & HA_CREATE_USED_ENGINE) &&
- !lex->create_info.db_type)
- {
- lex->create_info.used_fields&= ~HA_CREATE_USED_ENGINE;
- }
}
| FORCE_SYM
{
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 7bc294fcc99..2e7c5e7f442 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -3565,6 +3565,29 @@ static Sys_var_charptr Sys_ssl_crlpath(
READ_ONLY GLOBAL_VAR(opt_ssl_crlpath), SSL_OPT(OPT_SSL_CRLPATH),
IN_FS_CHARSET, DEFAULT(0));
+static const char *tls_version_names[]=
+{
+ "TLSv1.0",
+ "TLSv1.1",
+ "TLSv1.2",
+ "TLSv1.3",
+ 0
+};
+
+export bool tls_version_string_representation(THD *thd, sql_mode_t sql_mode,
+ LEX_CSTRING *ls)
+{
+ set_to_string(thd, ls, tls_version, tls_version_names);
+ return ls->str == 0;
+}
+
+static Sys_var_set Sys_tls_version(
+ "tls_version",
+ "TLS protocol version for secure connections.",
+ READ_ONLY GLOBAL_VAR(tls_version), CMD_LINE(REQUIRED_ARG),
+ tls_version_names,
+ DEFAULT(VIO_TLSv1_1 | VIO_TLSv1_2 | VIO_TLSv1_3));
+
static Sys_var_mybool Sys_standard_compliant_cte(
"standard_compliant_cte",
"Allow only CTEs compliant to SQL standard",
diff --git a/sql/table.cc b/sql/table.cc
index de6ef8e67af..17a9e2048d0 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -1688,8 +1688,9 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
}
if (!share->table_charset)
{
+ const CHARSET_INFO *cs= thd->variables.collation_database;
/* unknown charset in frm_image[38] or pre-3.23 frm */
- if (use_mb(default_charset_info))
+ if (use_mb(cs))
{
/* Warn that we may be changing the size of character columns */
sql_print_warning("'%s' had no or invalid character set, "
@@ -1697,7 +1698,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
"so character column sizes may have changed",
share->path.str);
}
- share->table_charset= default_charset_info;
+ share->table_charset= cs;
}
share->db_record_offset= 1;
@@ -3036,8 +3037,20 @@ static bool sql_unusable_for_discovery(THD *thd, handlerton *engine,
if (create_info->data_file_name || create_info->index_file_name)
return 1;
// ... engine
- if (create_info->db_type && create_info->db_type != engine)
- return 1;
+ DBUG_ASSERT(lex->m_sql_cmd);
+ if (lex->create_info.used_fields & HA_CREATE_USED_ENGINE)
+ {
+ /*
+ TODO: we could just compare engine names here, without resolving.
+ But this optimization is too late for 10.1.
+ */
+ Storage_engine_name *opt= lex->m_sql_cmd->option_storage_engine_name();
+ DBUG_ASSERT(opt); // lex->m_sql_cmd must be an Sql_cmd_create_table instance
+ if (opt->resolve_storage_engine_with_error(thd, &create_info->db_type,
+ false) ||
+ (create_info->db_type && create_info->db_type != engine))
+ return 1;
+ }
// ... WITH SYSTEM VERSIONING
if (create_info->versioned())
return 1;
diff --git a/storage/blackhole/ha_blackhole.cc b/storage/blackhole/ha_blackhole.cc
index c3be2e5f768..a57c667c20a 100644
--- a/storage/blackhole/ha_blackhole.cc
+++ b/storage/blackhole/ha_blackhole.cc
@@ -25,6 +25,24 @@
#include "ha_blackhole.h"
#include "sql_class.h" // THD, SYSTEM_THREAD_SLAVE_SQL
+/**
+ Checks if the param 'thd' is pointing to slave applier thread and row based
+ replication is in use.
+
+ A row event will have its thd->query() == NULL except in cases where
+ replicate_annotate_row_events is enabled. In the later case the thd->query()
+ will be pointing to the query, received through replicated annotate event
+ from master.
+
+ @param thd pointer to a THD instance
+
+ @return TRUE if thread is slave applier and row based replication is in use
+*/
+static bool is_row_based_replication(THD *thd)
+{
+ return thd->system_thread == SYSTEM_THREAD_SLAVE_SQL &&
+ (thd->query() == NULL || thd->variables.binlog_annotate_row_events);
+}
/* Static declarations for handlerton */
static handler *blackhole_create_handler(handlerton *hton,
@@ -109,7 +127,7 @@ int ha_blackhole::update_row(const uchar *old_data, const uchar *new_data)
{
DBUG_ENTER("ha_blackhole::update_row");
THD *thd= ha_thd();
- if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query() == NULL)
+ if (is_row_based_replication(thd))
DBUG_RETURN(0);
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
}
@@ -118,7 +136,7 @@ int ha_blackhole::delete_row(const uchar *buf)
{
DBUG_ENTER("ha_blackhole::delete_row");
THD *thd= ha_thd();
- if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query() == NULL)
+ if (is_row_based_replication(thd))
DBUG_RETURN(0);
DBUG_RETURN(HA_ERR_WRONG_COMMAND);
}
@@ -135,7 +153,7 @@ int ha_blackhole::rnd_next(uchar *buf)
int rc;
DBUG_ENTER("ha_blackhole::rnd_next");
THD *thd= ha_thd();
- if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query() == NULL)
+ if (is_row_based_replication(thd))
rc= 0;
else
rc= HA_ERR_END_OF_FILE;
@@ -220,7 +238,7 @@ int ha_blackhole::index_read_map(uchar * buf, const uchar * key,
int rc;
DBUG_ENTER("ha_blackhole::index_read");
THD *thd= ha_thd();
- if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query() == NULL)
+ if (is_row_based_replication(thd))
rc= 0;
else
rc= HA_ERR_END_OF_FILE;
@@ -235,7 +253,7 @@ int ha_blackhole::index_read_idx_map(uchar * buf, uint idx, const uchar * key,
int rc;
DBUG_ENTER("ha_blackhole::index_read_idx");
THD *thd= ha_thd();
- if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query() == NULL)
+ if (is_row_based_replication(thd))
rc= 0;
else
rc= HA_ERR_END_OF_FILE;
@@ -249,7 +267,7 @@ int ha_blackhole::index_read_last_map(uchar * buf, const uchar * key,
int rc;
DBUG_ENTER("ha_blackhole::index_read_last");
THD *thd= ha_thd();
- if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && thd->query() == NULL)
+ if (is_row_based_replication(thd))
rc= 0;
else
rc= HA_ERR_END_OF_FILE;
diff --git a/storage/innobase/.clang-format b/storage/innobase/.clang-format
new file mode 100644
index 00000000000..f7a72f3cf24
--- /dev/null
+++ b/storage/innobase/.clang-format
@@ -0,0 +1,10 @@
+UseTab: Always
+TabWidth: 8
+IndentWidth: 8
+BreakBeforeBinaryOperators: All
+PointerAlignment: Left
+AlwaysBreakAfterReturnType: TopLevel
+BreakBeforeBraces: Custom
+BraceWrapping:
+ AfterFunction: true
+AccessModifierOffset: -8
diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc
index 53c63d82fe2..0e3bdf597b8 100644
--- a/storage/innobase/buf/buf0buf.cc
+++ b/storage/innobase/buf/buf0buf.cc
@@ -4840,6 +4840,22 @@ evict_from_pool:
and block->lock. */
buf_wait_for_read(fix_block);
+ if (fix_block->page.id != page_id) {
+ fix_block->unfix();
+
+#ifdef UNIV_DEBUG
+ if (!fsp_is_system_temporary(page_id.space())) {
+ rw_lock_s_unlock(fix_block->debug_latch);
+ }
+#endif /* UNIV_DEBUG */
+
+ if (err) {
+ *err = DB_PAGE_CORRUPTED;
+ }
+
+ return NULL;
+ }
+
mtr_memo_type_t fix_type;
switch (rw_latch) {
@@ -5806,14 +5822,18 @@ buf_corrupt_page_release(buf_page_t* bpage, const fil_space_t* space)
buf_pool_t* buf_pool = buf_pool_from_bpage(bpage);
const ibool uncompressed = (buf_page_get_state(bpage)
== BUF_BLOCK_FILE_PAGE);
+ page_id_t old_page_id = bpage->id;
/* First unfix and release lock on the bpage */
buf_pool_mutex_enter(buf_pool);
mutex_enter(buf_page_get_mutex(bpage));
ut_ad(buf_page_get_io_fix(bpage) == BUF_IO_READ);
- ut_ad(bpage->buf_fix_count == 0);
ut_ad(bpage->id.space() == space->id);
+ /* buf_fix_count can be greater than zero. Because other thread
+ can wait in buf_page_wait_read() for the page to be read. */
+
+ bpage->id.set_corrupt_id();
/* Set BUF_IO_NONE before we remove the block from LRU list */
buf_page_set_io_fix(bpage, BUF_IO_NONE);
@@ -5830,7 +5850,7 @@ buf_corrupt_page_release(buf_page_t* bpage, const fil_space_t* space)
}
/* After this point bpage can't be referenced. */
- buf_LRU_free_one_page(bpage);
+ buf_LRU_free_one_page(bpage, old_page_id);
ut_ad(buf_pool->n_pend_reads > 0);
buf_pool->n_pend_reads--;
diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc
index 9994e032d88..79fafa68c4c 100644
--- a/storage/innobase/buf/buf0lru.cc
+++ b/storage/innobase/buf/buf0lru.cc
@@ -2137,25 +2137,31 @@ buf_LRU_block_free_hashed_page(
buf_page_mutex_exit(block);
}
-/******************************************************************//**
-Remove one page from LRU list and put it to free list */
-void
-buf_LRU_free_one_page(
-/*==================*/
- buf_page_t* bpage) /*!< in/out: block, must contain a file page and
- be in a state where it can be freed; there
- may or may not be a hash index to the page */
+/** Remove one page from LRU list and put it to free list.
+@param[in,out] bpage block, must contain a file page and be in
+ a freeable state; there may or may not be a
+ hash index to the page
+@param[in] old_page_id page number before bpage->id was invalidated */
+void buf_LRU_free_one_page(buf_page_t* bpage, page_id_t old_page_id)
{
buf_pool_t* buf_pool = buf_pool_from_bpage(bpage);
-
- rw_lock_t* hash_lock = buf_page_hash_lock_get(buf_pool, bpage->id);
+ rw_lock_t* hash_lock = buf_page_hash_lock_get(buf_pool,
+ old_page_id);
BPageMutex* block_mutex = buf_page_get_mutex(bpage);
ut_ad(buf_pool_mutex_own(buf_pool));
rw_lock_x_lock(hash_lock);
+
+ while (bpage->buf_fix_count > 0) {
+ /* Wait for other threads to release the fix count
+ before releasing the bpage from LRU list. */
+ }
+
mutex_enter(block_mutex);
+ bpage->id = old_page_id;
+
if (buf_LRU_block_remove_hashed(bpage, true)) {
buf_LRU_block_free_hashed_page((buf_block_t*) bpage);
}
diff --git a/storage/innobase/buf/buf0rea.cc b/storage/innobase/buf/buf0rea.cc
index ac979faa2bc..0f67584fe4d 100644
--- a/storage/innobase/buf/buf0rea.cc
+++ b/storage/innobase/buf/buf0rea.cc
@@ -63,13 +63,14 @@ buf_read_page_handle_error(
buf_pool_t* buf_pool = buf_pool_from_bpage(bpage);
const bool uncompressed = (buf_page_get_state(bpage)
== BUF_BLOCK_FILE_PAGE);
+ const page_id_t old_page_id = bpage->id;
/* First unfix and release lock on the bpage */
buf_pool_mutex_enter(buf_pool);
mutex_enter(buf_page_get_mutex(bpage));
ut_ad(buf_page_get_io_fix(bpage) == BUF_IO_READ);
- ut_ad(bpage->buf_fix_count == 0);
+ bpage->id.set_corrupt_id();
/* Set BUF_IO_NONE before we remove the block from LRU list */
buf_page_set_io_fix(bpage, BUF_IO_NONE);
@@ -82,7 +83,7 @@ buf_read_page_handle_error(
mutex_exit(buf_page_get_mutex(bpage));
/* remove the block from LRU list */
- buf_LRU_free_one_page(bpage);
+ buf_LRU_free_one_page(bpage, old_page_id);
ut_ad(buf_pool->n_pend_reads > 0);
buf_pool->n_pend_reads--;
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index e6bddd32438..1a6364b4a2b 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -20692,7 +20692,6 @@ ib_senderrf(
...) /*!< Args */
{
va_list args;
- char* str = NULL;
const char* format = my_get_err_msg(code);
/* If the caller wants to push a message to the client then
@@ -20705,7 +20704,7 @@ ib_senderrf(
va_start(args, code);
- myf l = Sql_condition::WARN_LEVEL_NOTE;
+ myf l;
switch (level) {
case IB_LOG_LEVEL_INFO:
@@ -20714,14 +20713,6 @@ ib_senderrf(
case IB_LOG_LEVEL_WARN:
l = ME_WARNING;
break;
- case IB_LOG_LEVEL_ERROR:
- sd_notifyf(0, "STATUS=InnoDB: Error: %s", str);
- l = 0;
- break;
- case IB_LOG_LEVEL_FATAL:
- l = 0;
- sd_notifyf(0, "STATUS=InnoDB: Fatal: %s", str);
- break;
default:
l = 0;
break;
@@ -20730,7 +20721,6 @@ ib_senderrf(
my_printv_error(code, format, MYF(l), args);
va_end(args);
- free(str);
if (level == IB_LOG_LEVEL_FATAL) {
ut_error;
diff --git a/storage/innobase/include/buf0buf.ic b/storage/innobase/include/buf0buf.ic
index 7af0547080e..970119edd6e 100644
--- a/storage/innobase/include/buf0buf.ic
+++ b/storage/innobase/include/buf0buf.ic
@@ -2,7 +2,7 @@
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc.
-Copyright (c) 2014, 2018, MariaDB Corporation.
+Copyright (c) 2014, 2019, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
diff --git a/storage/innobase/include/buf0lru.h b/storage/innobase/include/buf0lru.h
index 6583629be8c..2468efb193f 100644
--- a/storage/innobase/include/buf0lru.h
+++ b/storage/innobase/include/buf0lru.h
@@ -202,14 +202,12 @@ void
buf_LRU_stat_update(void);
/*=====================*/
-/******************************************************************//**
-Remove one page from LRU list and put it to free list */
-void
-buf_LRU_free_one_page(
-/*==================*/
- buf_page_t* bpage) /*!< in/out: block, must contain a file page and
- be in a state where it can be freed; there
- may or may not be a hash index to the page */
+/** Remove one page from LRU list and put it to free list.
+@param[in,out] bpage block, must contain a file page and be in
+ a freeable state; there may or may not be a
+ hash index to the page
+@param[in] old_page_id page number before bpage->id was invalidated */
+void buf_LRU_free_one_page(buf_page_t* bpage, page_id_t old_page_id)
MY_ATTRIBUTE((nonnull));
/******************************************************************//**
diff --git a/storage/innobase/include/buf0types.h b/storage/innobase/include/buf0types.h
index 67e2548b944..969edfe2374 100644
--- a/storage/innobase/include/buf0types.h
+++ b/storage/innobase/include/buf0types.h
@@ -184,6 +184,12 @@ public:
ut_ad(page_no <= 0xFFFFFFFFU);
}
+ /** Set the FIL_NULL for the space and page_no */
+ void set_corrupt_id()
+ {
+ m_space = m_page_no = ULINT32_UNDEFINED;
+ }
+
private:
/** Tablespace id. */
diff --git a/storage/innobase/row/row0row.cc b/storage/innobase/row/row0row.cc
index 40f0a71a122..57e2c8e4fdb 100644
--- a/storage/innobase/row/row0row.cc
+++ b/storage/innobase/row/row0row.cc
@@ -1206,9 +1206,12 @@ row_search_on_row_ref(
if (UNIV_UNLIKELY(ref->info_bits != 0)) {
ut_ad(ref->is_metadata());
ut_ad(ref->n_fields <= index->n_uniq);
- btr_pcur_open_at_index_side(true, index, mode, pcur, true, 0,
- mtr);
- btr_pcur_move_to_next_user_rec(pcur, mtr);
+ if (btr_pcur_open_at_index_side(
+ true, index, mode, pcur, true, 0, mtr)
+ != DB_SUCCESS
+ || !btr_pcur_move_to_next_user_rec(pcur, mtr)) {
+ return FALSE;
+ }
/* We do not necessarily have index->is_instant() here,
because we could be executing a rollback of an
instant ADD COLUMN operation. The function
@@ -1219,7 +1222,10 @@ row_search_on_row_ref(
& REC_INFO_MIN_REC_FLAG;
} else {
ut_a(ref->n_fields == index->n_uniq);
- btr_pcur_open(index, ref, PAGE_CUR_LE, mode, pcur, mtr);
+ if (btr_pcur_open(index, ref, PAGE_CUR_LE, mode, pcur, mtr)
+ != DB_SUCCESS) {
+ return FALSE;
+ }
}
low_match = btr_pcur_get_low_match(pcur);
diff --git a/storage/oqgraph/CMakeLists.txt b/storage/oqgraph/CMakeLists.txt
index 6199a648c2c..68582e2802d 100644
--- a/storage/oqgraph/CMakeLists.txt
+++ b/storage/oqgraph/CMakeLists.txt
@@ -38,7 +38,7 @@ IF(MSVC)
ADD_DEFINITIONS(-DJU_WIN)
ELSE(MSVC)
# Fix lp bug 1221555 with -fpermissive, so that errors in gcc 4.7 become warnings for the time being
- STRING(REPLACE "-fno-exceptions" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})
+ STRING(REPLACE "-fno-exceptions" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated -fno-strict-aliasing -fpermissive")
ENDIF(MSVC)
diff --git a/storage/rocksdb/ha_rocksdb.cc b/storage/rocksdb/ha_rocksdb.cc
index fe517e9d9b5..674489c340a 100644
--- a/storage/rocksdb/ha_rocksdb.cc
+++ b/storage/rocksdb/ha_rocksdb.cc
@@ -8744,7 +8744,7 @@ int ha_rocksdb::check(THD *const thd, HA_CHECK_OPT *const check_opt) {
int res;
// NO_LINT_DEBUG
sql_print_verbose_info("CHECKTABLE %s: Checking index %s", table_name,
- table->key_info[keyno].name);
+ table->key_info[keyno].name.str);
while (1) {
if (!rows)
res = index_first(table->record[0]);
diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc
index 18e2d2acbd5..58351195a61 100644
--- a/storage/spider/spd_db_mysql.cc
+++ b/storage/spider/spd_db_mysql.cc
@@ -1986,7 +1986,7 @@ int spider_db_mbase::connect(
} else if (!strcmp(tgt_host, "127.0.0.1") ||
!strcmp(tgt_host, glob_hostname))
{
- if (tgt_port == *spd_mysqld_port)
+ if (tgt_port == (long) *spd_mysqld_port)
{
my_printf_error(ER_SPIDER_SAME_SERVER_LINK_NUM,
ER_SPIDER_SAME_SERVER_LINK_STR2, MYF(0),
diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc
index 71e5faa5ba5..d6aa9356c6d 100644
--- a/storage/spider/spd_table.cc
+++ b/storage/spider/spd_table.cc
@@ -6848,7 +6848,7 @@ int spider_panic(
int spider_db_init(
void *p
) {
- int error_num, roop_count;
+ int error_num = HA_ERR_OUT_OF_MEM, roop_count;
uint dbton_id = 0;
handlerton *spider_hton = (handlerton *)p;
DBUG_ENTER("spider_db_init");
@@ -6977,16 +6977,10 @@ int spider_db_init(
#ifndef WITHOUT_SPIDER_BG_SEARCH
if (pthread_attr_init(&spider_pt_attr))
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_pt_attr_init;
- }
/*
if (pthread_attr_setdetachstate(&spider_pt_attr, PTHREAD_CREATE_DETACHED))
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_pt_attr_setstate;
- }
*/
#endif
@@ -6996,40 +6990,28 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_tbl,
&spider_tbl_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_tbl_mutex_init;
- }
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_thread_id_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_thread_id,
&spider_thread_id_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_thread_id_mutex_init;
- }
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_conn_id_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_conn_id,
&spider_conn_id_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_conn_id_mutex_init;
- }
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_ipport_conn_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_ipport_count,
&spider_ipport_conn_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_ipport_count_mutex_init;
- }
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_init_error_tbl_mutex, MY_MUTEX_INIT_FAST))
@@ -7037,10 +7019,8 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_init_error_tbl,
&spider_init_error_tbl_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_init_error_tbl_mutex_init;
- }
+
#ifdef WITH_PARTITION_STORAGE_ENGINE
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_pt_share_mutex, MY_MUTEX_INIT_FAST))
@@ -7048,10 +7028,8 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_pt_share,
&spider_pt_share_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_pt_share_mutex_init;
- }
+
#endif
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_lgtm_tblhnd_share_mutex, MY_MUTEX_INIT_FAST))
@@ -7059,30 +7037,24 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_lgtm_tblhnd_share,
&spider_lgtm_tblhnd_share_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_lgtm_tblhnd_share_mutex_init;
- }
+
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_conn_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_conn,
&spider_conn_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_conn_mutex_init;
- }
+
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_open_conn_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_open_conn,
&spider_open_conn_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_open_conn_mutex_init;
- }
+
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_hs_r_conn_mutex, MY_MUTEX_INIT_FAST))
@@ -7090,20 +7062,16 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_hs_r_conn,
&spider_hs_r_conn_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_hs_r_conn_mutex_init;
- }
+
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_hs_w_conn_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_hs_w_conn,
&spider_hs_w_conn_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_hs_w_conn_mutex_init;
- }
+
#endif
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_allocated_thds_mutex, MY_MUTEX_INIT_FAST))
@@ -7111,20 +7079,15 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_allocated_thds,
&spider_allocated_thds_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_allocated_thds_mutex_init;
- }
+
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_mon_table_cache_mutex, MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_mon_table_cache,
&spider_mon_table_cache_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_mon_table_cache_mutex_init;
- }
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&spider_mem_calc_mutex, MY_MUTEX_INIT_FAST))
@@ -7132,127 +7095,96 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_mem_calc,
&spider_mem_calc_mutex, MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_mem_calc_mutex_init;
- }
- if(
- my_hash_init(&spider_open_tables, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_tbl_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_open_tables, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_tbl_get_key, 0, 0))
goto error_open_tables_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_open_tables, 143);
spider_alloc_calc_mem(NULL,
spider_open_tables,
spider_open_tables.array.max_element *
spider_open_tables.array.size_of_element);
- if(
- my_hash_init(&spider_init_error_tables, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_tbl_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_init_error_tables, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_tbl_get_key, 0, 0))
goto error_init_error_tables_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_init_error_tables, 144);
spider_alloc_calc_mem(NULL,
spider_init_error_tables,
spider_init_error_tables.array.max_element *
spider_init_error_tables.array.size_of_element);
#ifdef WITH_PARTITION_STORAGE_ENGINE
- if(
- my_hash_init(&spider_open_pt_share, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_pt_share_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_open_pt_share, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_pt_share_get_key, 0, 0))
goto error_open_pt_share_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_open_pt_share, 145);
spider_alloc_calc_mem(NULL,
spider_open_pt_share,
spider_open_pt_share.array.max_element *
spider_open_pt_share.array.size_of_element);
#endif
- if(
- my_hash_init(&spider_lgtm_tblhnd_share_hash, spd_charset_utf8_bin,
- 32, 0, 0,
- (my_hash_get_key) spider_lgtm_tblhnd_share_hash_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_lgtm_tblhnd_share_hash, spd_charset_utf8_bin,
+ 32, 0, 0,
+ (my_hash_get_key) spider_lgtm_tblhnd_share_hash_get_key,
+ 0, 0))
goto error_lgtm_tblhnd_share_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_lgtm_tblhnd_share_hash, 245);
spider_alloc_calc_mem(NULL,
spider_lgtm_tblhnd_share_hash,
spider_lgtm_tblhnd_share_hash.array.max_element *
spider_lgtm_tblhnd_share_hash.array.size_of_element);
- if(
- my_hash_init(&spider_open_connections, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_conn_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_open_connections, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_conn_get_key, 0, 0))
goto error_open_connections_hash_init;
- }
- if(
- my_hash_init(&spider_ipport_conns, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_ipport_conn_get_key, spider_free_ipport_conn, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+
+ if (my_hash_init(&spider_ipport_conns, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_ipport_conn_get_key,
+ spider_free_ipport_conn, 0))
goto error_ipport_conn__hash_init;
- }
+
spider_alloc_calc_mem_init(spider_open_connections, 146);
spider_alloc_calc_mem(NULL,
spider_open_connections,
spider_open_connections.array.max_element *
spider_open_connections.array.size_of_element);
#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET)
- if(
- my_hash_init(&spider_hs_r_conn_hash, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_conn_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_hs_r_conn_hash, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_conn_get_key, 0, 0))
goto error_hs_r_conn_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_hs_r_conn_hash, 147);
spider_alloc_calc_mem(NULL,
spider_hs_r_conn_hash,
spider_hs_r_conn_hash.array.max_element *
spider_hs_r_conn_hash.array.size_of_element);
- if(
- my_hash_init(&spider_hs_w_conn_hash, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_conn_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_hs_w_conn_hash, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_conn_get_key, 0, 0))
goto error_hs_w_conn_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_hs_w_conn_hash, 148);
spider_alloc_calc_mem(NULL,
spider_hs_w_conn_hash,
spider_hs_w_conn_hash.array.max_element *
spider_hs_w_conn_hash.array.size_of_element);
#endif
- if(
- my_hash_init(&spider_allocated_thds, spd_charset_utf8_bin, 32, 0, 0,
- (my_hash_get_key) spider_allocated_thds_get_key, 0, 0)
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (my_hash_init(&spider_allocated_thds, spd_charset_utf8_bin, 32, 0, 0,
+ (my_hash_get_key) spider_allocated_thds_get_key, 0, 0))
goto error_allocated_thds_hash_init;
- }
+
spider_alloc_calc_mem_init(spider_allocated_thds, 149);
spider_alloc_calc_mem(NULL,
spider_allocated_thds,
spider_allocated_thds.array.max_element *
spider_allocated_thds.array.size_of_element);
- if(
- SPD_INIT_DYNAMIC_ARRAY2(&spider_mon_table_cache, sizeof(SPIDER_MON_KEY),
- NULL, 64, 64, MYF(MY_WME))
- ) {
- error_num = HA_ERR_OUT_OF_MEM;
+ if (SPD_INIT_DYNAMIC_ARRAY2(&spider_mon_table_cache, sizeof(SPIDER_MON_KEY),
+ NULL, 64, 64, MYF(MY_WME)))
goto error_mon_table_cache_array_init;
- }
+
spider_alloc_calc_mem_init(spider_mon_table_cache, 165);
spider_alloc_calc_mem(NULL,
spider_mon_table_cache,
@@ -7282,10 +7214,7 @@ int spider_db_init(
if (mysql_mutex_init(spd_key_mutex_udf_table_mon,
&spider_udf_table_mon_mutexes[roop_count], MY_MUTEX_INIT_FAST))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_init_udf_table_mon_mutex;
- }
}
for (roop_count = 0;
roop_count < (int) spider_param_udf_table_mon_mutex_count();
@@ -7297,10 +7226,7 @@ int spider_db_init(
if (mysql_cond_init(spd_key_cond_udf_table_mon,
&spider_udf_table_mon_conds[roop_count], NULL))
#endif
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_init_udf_table_mon_cond;
- }
}
for (roop_count = 0;
roop_count < (int) spider_param_udf_table_mon_mutex_count();
@@ -7309,10 +7235,8 @@ int spider_db_init(
if (my_hash_init(&spider_udf_table_mon_list_hash[roop_count],
spd_charset_utf8_bin, 32, 0, 0,
(my_hash_get_key) spider_udf_tbl_mon_list_key, 0, 0))
- {
- error_num = HA_ERR_OUT_OF_MEM;
goto error_init_udf_table_mon_list_hash;
- }
+
spider_alloc_calc_mem_init(spider_udf_table_mon_list_hash, 150);
spider_alloc_calc_mem(NULL,
spider_udf_table_mon_list_hash,
diff --git a/storage/tokudb/PerconaFT/ft/logger/logger.cc b/storage/tokudb/PerconaFT/ft/logger/logger.cc
index 0e1e5a276b7..9516f46df28 100644
--- a/storage/tokudb/PerconaFT/ft/logger/logger.cc
+++ b/storage/tokudb/PerconaFT/ft/logger/logger.cc
@@ -668,12 +668,8 @@ int toku_logger_find_logfiles (const char *directory, char ***resultp, int *n_lo
snprintf(fname, fnamelen, "%s/%s", directory, de->d_name);
result[n_results++] = fname;
}
- // Return them in increasing order. Set width to allow for newer log file names ("xxx.tokulog13")
- // which are one character longer than old log file names ("xxx.tokulog2"). The comparison function
- // won't look beyond the terminating NUL, so an extra character in the comparison string doesn't matter.
- // Allow room for terminating NUL after "xxx.tokulog13" even if result[0] is of form "xxx.tokulog2."
- int width = sizeof(result[0]+2);
- qsort(result, n_results, width, logfilenamecompare);
+ // Return them in increasing order.
+ qsort(result, n_results, sizeof(result[0]), logfilenamecompare);
*resultp = result;
*n_logfiles = n_results;
result[n_results]=0; // make a trailing null
diff --git a/support-files/CMakeLists.txt b/support-files/CMakeLists.txt
index 43ab5787ceb..3655c87b94e 100644
--- a/support-files/CMakeLists.txt
+++ b/support-files/CMakeLists.txt
@@ -90,8 +90,18 @@ IF(UNIX)
SET(scriptdir ${INSTALL_SCRIPTDIRABS})
SET(libexecdir ${INSTALL_SBINDIRABS})
SET(pkgdatadir ${INSTALL_MYSQLSHAREDIRABS})
- SET(sysconfdir ${INSTALL_SYSCONFDIR})
- SET(sysconf2dir ${INSTALL_SYSCONF2DIR})
+ IF(INSTALL_SYSCONFDIR)
+ SET(sysconfdir ${INSTALL_SYSCONFDIR})
+ ELSEIF(DEFAULT_SYSCONFDIR)
+ SET(sysconfdir ${DEFAULT_SYSCONFDIR})
+ ELSE()
+ SET(sysconfdir "/etc")
+ ENDIF()
+ IF(INSTALL_SYSCONF2DIR)
+ SET(sysconf2dir ${INSTALL_SYSCONF2DIR})
+ ELSE()
+ SET(sysconf2dir "${sysconfdir}/mysql")
+ ENDIF()
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/mysql.server.sh
${CMAKE_CURRENT_BINARY_DIR}/mysql.server @ONLY)
INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/mysql.server
diff --git a/support-files/mariadb@.service.in b/support-files/mariadb@.service.in
index a2f5cff0828..727c1b85301 100644
--- a/support-files/mariadb@.service.in
+++ b/support-files/mariadb@.service.in
@@ -1,21 +1,134 @@
-# Multi instance version of mariadb. For if you run multiple versions at once.
-# Also used for mariadb@bootstrap to bootstrap Galera.
+# Multi instance version of MariaDB
#
-# create config file @sysconf2dir@/my{instancename}.cnf
+# Use this if you run multiple instances of MariaDB on a single server.
+#
+# This systemd service is not suitable for Galera as specialised SST recovery
+# scripts are needed.
+#
+#
+# Copyright notice:
#
-# start as systemctl start mariadb@{instancename}.server
-
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
-# Thanks to:
-# Daniel Black
-# Erkan Yanar
-# David Strauss
-# and probably others
-# Inspired from https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-db/mysql-init-scripts/files/mysqld_at.service
+#
+# MULTI INSTANCES
+#
+# When multiple instances of MariaDB are running on a server they need to
+# ensure that they don't conflict with each other. This includes elements
+# like network ports, sockets and data directories listed under CONFLICTING
+# VARIABLES below. The systemd environment variable MYSQLD_MULTI_INSTANCE
+# controls each instance to ensure it is run independently. It is passed to
+# mysqld and mysql_install
+#
+# By default, a group suffix exists and within the default configuration
+# files, a group [mysqld.{instancename}] is read for each service. Other
+# default groups, like [server.{instancename}] and [mariadb.{instancename}],
+# are also read. For each instance, one of the groups will need to contain
+# the conflicting variables listed below under CONFLICTING VARIABLES.
+#
+# The MYSQLD_MULTI_INSTANCE environment used is:
+# Environment='MYSQLD_MULTI_INSTANCE=--defaults-group-suffix=.%I --basedir=@prefix@'
+#
+#
+# APPLYING YOUR MULTI INSTANCE MECHANISM
+#
+# To apply one of the non-default multi-instance mechanisms, create a file
+# "/etc/systemd/system/mariadb@.service.d/multi.conf" containing:
+#
+# [Service]
+# Environment=MYSQLD_MULTI_INSTANCE="...."
+#
+# Include any other settings you which to override. Directives like Exec* are
+# lists and adding a directive will append to the list. You can clear the list
+# by starting with "Directive=" and no value. Follow this by the list that you
+# do want. See the systemd.unit(5) manual page for more information.
+#
+# Then run "systemctl daemon-reload".
+#
+#
+# EXAMPLE MYSQLD_MULTI_INSTANCE CONFIGURATIONS
+#
+# Configuration File Based Mechanism:
+#
+# This has a configuration file per instance.
+#
+# [Unit]
+# ConditionPathExists=@sysconfdir@/my.%I.cnf
+#
+# [Service]
+# Environment=MYSQLD_MULTI_INSTANCE=--defaults-file=@sysconfdir@/my.%I.cnf
+#
+# Here you need to create a configuration file @sysconfdir@/my.%I.cnf for each
+# instance, each containing the conflicting variables to separate instances.
+#
+#
+# Multi User Based Mechanism:
+#
+# Here each user (the instance name) has their own mysql instance.
+#
+# Create instances in users home directory with abstract socket:
+#
+# [Service]
+# User=%I
+# ProtectHome=false
+# ExecStartPre=
+# ExecStartPre=@scriptdir@/mysql_install_db $MYSQLD_MULTI_INSTANCE \
+# --auth-root-authentication-method=socket --auth-root-socket-user=%I
+# Environment=MYSQLD_MULTI_INSTANCE="--defaults-file=/home/%I/my%I.cnf \
+# --datadir=/home/%I/mysqldatadir --skip-networking --socket=@mysql-%I"
+#
+#
+# Command Line Mechanism:
+#
+# This is a good way run multiple instance where there is little difference
+# in configuration between instances.
+#
+# [Service]
+# Environment=MYSQLD_MULTI_INSTANCE="--socket=/var/run/mysqld/%I.sock \
+# --datadir=/var/lib/mysqld-multi/%I \
+# --skip-networking"
+#
+#
+# CONFLICTING VARIABLES
+#
+# A number of MariaDB system variables may conflict. The main ones that need to
+# be set because their default values will conflict are:
+# * socket
+# * port
+# * datadir
+#
+#
+# PRE-10.3
+#
+# Before 10.3 MYSQLD_MULTI_INSTANCE was effectively --defaults-file=@sysconf2dir@/my%I.cnf
+# As @sysconfdir@/my.cnf included these files it was a bad choice as an
+# existing single instance would include all these files. If you want to
+# continue a file based multi-instance mysqld, recommend the Configuration File
+# Based Mechanism above and moving @sysconf2dir@/my%I.cnf files to @sysconfdir@/my%I.cnf.
+#
+#
+# SELINUX
+#
+# As basic selinux rules are written around a single instance of MariaDB you may need
+# to define labels for the files and network ports of all instances.
+#
+# See: https://mariadb.com/kb/en/library/what-to-do-if-mariadb-doesnt-start/#selinux
+#
+#
+# STARTING
+#
+# Start the instance: systemctl start mariadb@{instancename}.service
+#
+#
+# DOCUMENTATION:
+#
+# Read https://mariadb.com/kb/en/mariadb/systemd/ regarding customisation.
+#
+# Also see systemd man pages: systemd.unit(5), systemd.exec(5) and
+# systemd.service(5)
[Unit]
Description=MariaDB @VERSION@ database server (multi-instance)
@@ -23,16 +136,20 @@ Documentation=man:mysqld(8)
Documentation=https://mariadb.com/kb/en/library/systemd/
After=network.target
-ConditionPathExists=@sysconf2dir@/my%I.cnf
+# Negated condition here is because 10.3 and before had @sysconf2dir@/my%I.cnf
+# as the configuration difference for multiple instances. This condition here
+# to prevent an accidental change during an upgrade in the case the user
+# created these file(s).
+#
+## See Environment=MYSQLD_MULTI_INSTANCE below for current recommended options.
+ConditionPathExists=!@sysconf2dir@/my%I.cnf
+
[Install]
WantedBy=multi-user.target
-Alias=mysql.service
-Alias=mysqld.service
[Service]
-
##############################################################################
## Core requirements
##
@@ -47,16 +164,14 @@ PrivateNetwork=false
## Package maintainers
##
-User=mysql
-Group=mysql
-
# To allow memlock to be used as non-root user if set in configuration
CapabilityBoundingSet=CAP_IPC_LOCK
# Prevent writes to /usr, /boot, and /etc
ProtectSystem=full
-# Doesn't yet work properly with SELinux enabled
+# Requires kernel 4.14 or later and SELinux transition rule for mysqld_t
+# (https://github.com/systemd/systemd/issues/3845)
# NoNewPrivileges=true
PrivateDevices=true
@@ -64,48 +179,16 @@ PrivateDevices=true
# Prevent accessing /home, /root and /run/user
ProtectHome=true
-# Execute pre and post scripts as root, otherwise it does it as User=
-PermissionsStartOnly=true
-
-# Perform automatic wsrep recovery. When server is started without wsrep,
-# galera_recovery simply returns an empty string. In any case, however,
-# the script is not expected to return with a non-zero status.
-# It is always safe to unset _WSREP_START_POSITION%I environment variable.
-# Do not panic if galera_recovery script is not available. (MDEV-10538)
-ExecStartPre=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION%I"
-
-ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \
- VAR=`@bindir@/galera_recovery --defaults-file=@sysconf2dir@/my%I.cnf`; [ $? -eq 0 ] \
- && systemctl set-environment _WSREP_START_POSITION%I=$VAR || exit 1"
-
-# Alternate: (remove ConditionPathExists above)
-# use [mysqld.INSTANCENAME] as sections in my.cnf
-#
-#ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \
-# VAR=`@bindir@/galera_recovery --defaults-group-suffix=%I`; [ $? -eq 0 ] \
-# && systemctl set-environment _WSREP_START_POSITION%I=$VAR || exit 1"
-
# Needed to create system tables etc.
-# ExecStartPre=@scriptdir@/mysql_install_db -u mysql
+ExecStartPre=@scriptdir@/mysql_install_db $MYSQLD_MULTI_INSTANCE
# Start main service
-# MYSQLD_OPTS here is for users to set in /etc/systemd/system/mariadb@.service.d/MY_SPECIAL.conf
-# Use the [Service] section and Environment="MYSQLD_OPTS=...".
-# This isn't a replacement for my.cnf.
-# _WSREP_NEW_CLUSTER is for the exclusive use of the script galera_new_cluster
-
-# Note: Place $MYSQLD_OPTS at the very end for its options to take precedence.
-
-ExecStart=@sbindir@/mysqld --defaults-file=@sysconf2dir@/my%I.cnf \
- $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION%I $MYSQLD_OPTS
-# Alternate: (remove ConditionPathExists above)
-# use [mysqld.INSTANCENAME] as sections in my.cnf
+# A few variables are here:
+# * MYSQLD_MULTI_INSTANCE - control how multiple instances are distinguisable
+# * MYSQLD_OPTS - user definable extras - not a replacement for my.cnf
#
-# ExecStart=@sbindir@/mysqld --defaults-group-suffix=%I \
-# $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION%I $MYSQLD_OPTS
-
-# Unset _WSREP_START_POSITION environment variable.
-ExecStartPost=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION%I"
+# Note 1: Place $MYSQLD_OPTS at the very end for its options to take precedence.
+ExecStart=@sbindir@/mysqld $MYSQLD_MULTI_INSTANCE $MYSQLD_OPTS
KillSignal=SIGTERM
@@ -140,6 +223,19 @@ UMask=007
# LOAD DATA INFILE you can enable PrivateTmp=true for a little more security.
PrivateTmp=false
+# Controlling how multiple instances are separated. See top of this file.
+# Note 1: This service isn't User=mysql by default so we need to be explicit.
+# Note 2: we set --basedir to prevent probes that might trigger SELinux alarms,
+# per bug https://bugzilla.redhat.com/show_bug.cgi?id=547485. Its as an option
+# here as a user may want to use the MYSQLD_MULTI_INSTANCE to run multiple
+# versions.
+Environment='MYSQLD_MULTI_INSTANCE=--defaults-group-suffix=.%I --basedir=@prefix@'
+
+# While you can override these, you shouldn't leave them empty as that
+# will default to root.
+User=mysql
+Group=mysql
+
##
## Options previously available to be set via [mysqld_safe]
## that now needs to be set by systemd config files as mysqld_safe
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 917ec458203..cb6c756cfe3 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -22,7 +22,7 @@ INCLUDE_DIRECTORIES(BEFORE
${CMAKE_BINARY_DIR}/libmariadb/include
${CMAKE_SOURCE_DIR}/libmariadb/include)
-ADD_EXECUTABLE(mysql_client_test mysql_client_test.c)
+MYSQL_ADD_EXECUTABLE(mysql_client_test mysql_client_test.c COMPONENT Test)
SET(CLIENT_LIB mariadbclient mysys)
TARGET_LINK_LIBRARIES(mysql_client_test ${CLIENT_LIB})
@@ -34,8 +34,6 @@ IF(WITH_UNIT_TESTS)
ADD_DEPENDENCIES(bug25714 GenError ${CLIENT_LIB})
ENDIF()
-INSTALL(TARGETS mysql_client_test DESTINATION ${INSTALL_BINDIR} COMPONENT Test)
-
CHECK_INCLUDE_FILE(event.h HAVE_EVENT_H)
FIND_LIBRARY(EVENT_LIBRARY event)
MARK_AS_ADVANCED(EVENT_LIBRARY)
diff --git a/vio/viosslfactories.c b/vio/viosslfactories.c
index 033d71779ab..4a31ebd1798 100644
--- a/vio/viosslfactories.c
+++ b/vio/viosslfactories.c
@@ -83,7 +83,8 @@ ssl_error_string[] =
"SSL_CTX_set_default_verify_paths failed",
"Failed to set ciphers to use",
"SSL_CTX_new failed",
- "SSL_CTX_set_tmp_dh failed"
+ "SSL_CTX_set_tmp_dh failed",
+ "Unknown TLS version"
};
const char*
@@ -183,21 +184,57 @@ static int wolfssl_send(WOLFSSL* ssl, char* buf, int sz, void* vio)
}
#endif /* HAVE_WOLFSSL */
+static long vio_tls_protocol_options(ulonglong tls_version)
+{
+ long tls_protocol_flags=
+#ifdef TLS1_3_VERSION
+ SSL_OP_NO_TLSv1_3 |
+#endif
+#if defined(TLS1_2_VERSION) || defined(HAVE_WOLFSSL)
+ SSL_OP_NO_TLSv1_2 |
+#endif
+ SSL_OP_NO_TLSv1_1 |
+ SSL_OP_NO_TLSv1;
+ long disabled_tls_protocols= tls_protocol_flags,
+ disabled_ssl_protocols= SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
+
+ if (!tls_version)
+ return disabled_ssl_protocols;
+
+ if (tls_version & VIO_TLSv1_0)
+ disabled_tls_protocols&= ~SSL_OP_NO_TLSv1;
+ if (tls_version & VIO_TLSv1_1)
+ disabled_tls_protocols&= ~SSL_OP_NO_TLSv1_1;
+#if defined(TLS1_2_VERSION) || defined(HAVE_WOLFSSL)
+ if (tls_version & VIO_TLSv1_2)
+ disabled_tls_protocols&= ~SSL_OP_NO_TLSv1_2;
+#endif
+#ifdef TLS1_3_VERSION
+ if (tls_version & VIO_TLSv1_3)
+ disabled_tls_protocols&= ~SSL_OP_NO_TLSv1_3;
+#endif
+
+ /* some garbage was specified in tls_version option */
+ if (tls_protocol_flags == disabled_tls_protocols)
+ return -1;
+ return (disabled_tls_protocols | disabled_ssl_protocols);
+}
+
/************************ VioSSLFd **********************************/
static struct st_VioSSLFd *
new_VioSSLFd(const char *key_file, const char *cert_file,
const char *ca_file, const char *ca_path,
const char *cipher, my_bool is_client_method,
enum enum_ssl_init_error *error,
- const char *crl_file, const char *crl_path)
+ const char *crl_file, const char *crl_path, ulonglong tls_version)
{
DH *dh;
struct st_VioSSLFd *ssl_fd;
- long ssl_ctx_options= SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
+ long ssl_ctx_options;
DBUG_ENTER("new_VioSSLFd");
DBUG_PRINT("enter",
("key_file: '%s' cert_file: '%s' ca_file: '%s' ca_path: '%s' "
- "cipher: '%s' crl_file: '%s' crl_path: '%s' ",
+ "cipher: '%s' crl_file: '%s' crl_path: '%s'",
key_file ? key_file : "NULL",
cert_file ? cert_file : "NULL",
ca_file ? ca_file : "NULL",
@@ -220,6 +257,14 @@ new_VioSSLFd(const char *key_file, const char *cert_file,
goto err1;
}
+ ssl_ctx_options= vio_tls_protocol_options(tls_version);
+ if (ssl_ctx_options == -1)
+ {
+ *error= SSL_INITERR_PROTOCOL;
+ DBUG_PRINT("error", ("%s", sslGetErrString(*error)));
+ goto err1;
+ }
+
SSL_CTX_set_options(ssl_fd->ssl_context, ssl_ctx_options);
/*
@@ -342,7 +387,7 @@ new_VioSSLConnectorFd(const char *key_file, const char *cert_file,
if (!(ssl_fd= new_VioSSLFd(key_file, cert_file, ca_file,
ca_path, cipher, TRUE, error,
- crl_file, crl_path)))
+ crl_file, crl_path, 0)))
{
return 0;
}
@@ -360,13 +405,14 @@ struct st_VioSSLFd *
new_VioSSLAcceptorFd(const char *key_file, const char *cert_file,
const char *ca_file, const char *ca_path,
const char *cipher, enum enum_ssl_init_error* error,
- const char *crl_file, const char *crl_path)
+ const char *crl_file, const char *crl_path,
+ ulonglong tls_version)
{
struct st_VioSSLFd *ssl_fd;
int verify= SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE;
if (!(ssl_fd= new_VioSSLFd(key_file, cert_file, ca_file,
ca_path, cipher, FALSE, error,
- crl_file, crl_path)))
+ crl_file, crl_path, tls_version)))
{
return 0;
}