
[Commits] d4e9a50: MDEV-17456 Malicious SUPER user can possibly change audit log configuration without leaving traces.
by holyfoot@askmonty.org 19 May '19
by holyfoot@askmonty.org 19 May '19
19 May '19
revision-id: d4e9a50e887c40da6a57cc5438d9857eae7c45f2 (mariadb-10.2.24-30-gd4e9a50)
parent(s): 395ce1dcb33b5866f810299095978f2fb9263c95
committer: Alexey Botchkov
timestamp: 2019-05-19 23:50:23 +0400
message:
MDEV-17456 Malicious SUPER user can possibly change audit log configuration without leaving traces.
Fix for the SET GLOBAL server_audit_loggin=on; added.
---
mysql-test/suite/plugins/r/server_audit.result | 2 ++
plugin/server_audit/server_audit.c | 15 +++++++++------
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/mysql-test/suite/plugins/r/server_audit.result b/mysql-test/suite/plugins/r/server_audit.result
index b8d2986..4088b36 100644
--- a/mysql-test/suite/plugins/r/server_audit.result
+++ b/mysql-test/suite/plugins/r/server_audit.result
@@ -271,6 +271,7 @@ TIME,HOSTNAME,root,localhost,ID,0,CONNECT,mysql,,0
TIME,HOSTNAME,root,localhost,ID,0,DISCONNECT,mysql,,0
TIME,HOSTNAME,no_such_user,localhost,ID,0,FAILED_CONNECT,,,ID
TIME,HOSTNAME,no_such_user,localhost,ID,0,DISCONNECT,,,0
+TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'set global server_audit_incl_users=\'odin, dva, tri\'',0
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'set global server_audit_incl_users=\'odin, root, dva, tri\'',0
TIME,HOSTNAME,root,localhost,ID,ID,CREATE,test,t2,
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'create table t2 (id int)',0
@@ -381,6 +382,7 @@ TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'CREATE USER u3 IDENTIFIED BY ***
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'drop user u1, u2, u3',0
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'insert into t1 values (1), (2)',0
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'set global server_audit_logging= off',0
+TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'set global server_audit_logging= on',0
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'set global server_audit_events=\'\'',0
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'set global serv',0
TIME,HOSTNAME,root,localhost,ID,ID,QUERY,sa_db,'select (1), (2)',0
diff --git a/plugin/server_audit/server_audit.c b/plugin/server_audit/server_audit.c
index 8472f97..e143f56 100644
--- a/plugin/server_audit/server_audit.c
+++ b/plugin/server_audit/server_audit.c
@@ -15,7 +15,7 @@
#define PLUGIN_VERSION 0x104
-#define PLUGIN_STR_VERSION "1.4.5"
+#define PLUGIN_STR_VERSION "1.4.6"
#define _my_thread_var loc_thread_var
@@ -2022,10 +2022,14 @@ void auditing(MYSQL_THD thd, unsigned int event_class, const void *ev)
update_connection_info(cn, event_class, ev, &after_action);
if (!logging)
+ {
+ if (cn)
+ cn->log_always= 0;
goto exit_func;
+ }
if (event_class == MYSQL_AUDIT_GENERAL_CLASS && FILTER(EVENT_QUERY) &&
- cn && do_log_user(cn->user))
+ cn && (cn->log_always || do_log_user(cn->user)))
{
const struct mysql_event_general *event =
(const struct mysql_event_general *) ev;
@@ -2038,6 +2042,7 @@ void auditing(MYSQL_THD thd, unsigned int event_class, const void *ev)
{
log_statement(cn, event, "QUERY");
cn->query_length= 0; /* So the log_current_query() won't log this again. */
+ cn->log_always= 0;
}
}
else if (event_class == MYSQL_AUDIT_TABLE_CLASS && FILTER(EVENT_TABLE) && cn)
@@ -2108,8 +2113,6 @@ void auditing(MYSQL_THD thd, unsigned int event_class, const void *ev)
break;
}
}
- if (cn)
- cn->log_always= 0;
flogger_mutex_unlock(&lock_operations);
}
@@ -2553,8 +2556,7 @@ static void log_current_query(MYSQL_THD thd)
if (!thd)
return;
cn= get_loc_info(thd);
- if (!ci_needs_setup(cn) && cn->query_length &&
- FILTER(EVENT_QUERY) && do_log_user(cn->user))
+ if (!ci_needs_setup(cn) && cn->query_length)
{
cn->log_always= 1;
log_statement_ex(cn, cn->query_time, thd_get_thread_id(thd),
@@ -2814,6 +2816,7 @@ static void update_logging(MYSQL_THD thd,
{
CLIENT_ERROR(1, "Logging was disabled.", MYF(ME_JUST_WARNING));
}
+ mark_always_logged(thd);
}
else
{
1
0
revision-id: c07325f932abef2032b2e56532f6cb615e2a1161 (mariadb-10.4.4-112-gc07325f932a)
parent(s): 7f8187bc432f79afe4c0549d68845a68e6c159ab 2ae83affef5a4d89f38272db31a400f968279a7a
author: Oleksandr Byelkin
committer: Oleksandr Byelkin
timestamp: 2019-05-19 20:55:37 +0200
message:
Merge branch '10.3' into 10.4
BUILD/FINISH.sh | 2 +-
BUILD/SETUP.sh | 2 +-
BUILD/autorun.sh | 2 +-
BUILD/check-cpu | 2 +-
BUILD/cleanup | 2 +-
BUILD/cmake_configure.sh | 2 +-
BUILD/compile-amd64-debug-max | 2 +-
BUILD/compile-amd64-gcov | 2 +-
BUILD/compile-amd64-gprof | 2 +-
BUILD/compile-amd64-max | 2 +-
BUILD/compile-amd64-valgrind-max | 2 +-
BUILD/compile-bintar | 2 +-
BUILD/compile-darwin-mwcc | 2 +-
BUILD/compile-dist | 2 +-
BUILD/compile-hpux11-parisc2-aCC | 2 +-
BUILD/compile-irix-mips64-mipspro | 2 +-
BUILD/compile-pentium-icc | 2 +-
BUILD/compile-pentium-icc-yassl | 2 +-
BUILD/compile-pentium32 | 2 +-
BUILD/compile-pentium32-cybozu | 2 +-
BUILD/compile-pentium32-debug | 2 +-
BUILD/compile-pentium32-debug-max | 2 +-
BUILD/compile-pentium32-debug-openssl | 2 +-
BUILD/compile-pentium32-gcov | 2 +-
BUILD/compile-pentium32-gprof | 2 +-
BUILD/compile-pentium32-icc-valgrind-max | 4 +-
BUILD/compile-pentium32-max | 2 +-
BUILD/compile-pentium32-valgrind-max | 4 +-
BUILD/compile-pentium64-asan-max | 2 +-
BUILD/compile-pentium64-debug | 2 +-
BUILD/compile-pentium64-debug-max | 2 +-
BUILD/compile-pentium64-gcov | 2 +-
BUILD/compile-pentium64-gprof | 2 +-
BUILD/compile-pentium64-max | 2 +-
BUILD/compile-pentium64-valgrind-max | 4 +-
BUILD/compile-pentium64-wsrep | 2 +-
BUILD/compile-ppc | 2 +-
BUILD/compile-ppc-debug | 2 +-
BUILD/compile-ppc-debug-max | 2 +-
BUILD/compile-ppc-max | 2 +-
BUILD/compile-solaris-amd64-debug | 2 +-
BUILD/compile-solaris-amd64-forte | 2 +-
BUILD/compile-solaris-sparc | 2 +-
BUILD/compile-solaris-sparc-forte | 4 +-
BUILD/util.sh | 2 +-
CMakeLists.txt | 14 +-
COPYING | 4 +-
README.md | 8 +-
COPYING.thirdparty => THIRDPARTY | 12 +-
client/CMakeLists.txt | 2 +-
client/client_priv.h | 2 +-
client/completion_hash.cc | 2 +-
client/completion_hash.h | 2 +-
client/echo.c | 2 +-
client/my_readline.h | 2 +-
client/mysql.cc | 2 +-
client/mysql_plugin.c | 10 +-
client/mysql_upgrade.c | 2 +-
client/mysqladmin.cc | 2 +-
client/mysqlbinlog.cc | 2 +-
client/mysqlcheck.c | 2 +-
client/mysqldump.c | 70 +--
client/mysqlimport.c | 15 +-
client/mysqlshow.c | 2 +-
client/mysqlslap.c | 2 +-
client/mysqltest.cc | 2 +-
client/readline.cc | 2 +-
client/sql_string.cc.dontuse | 2 +-
client/sql_string.h.dontuse | 2 +-
cmake/abi_check.cmake | 2 +-
cmake/build_configurations/mysql_release.cmake | 2 +-
cmake/character_sets.cmake | 2 +-
cmake/compile_flags.cmake | 2 +-
cmake/configure.pl | 2 +-
cmake/cpack_source_ignore_files.cmake | 2 +-
cmake/cpu_info.cmake | 2 +-
cmake/create_initial_db.cmake | 2 +-
cmake/do_abi_check.cmake | 2 +-
cmake/dtrace.cmake | 2 +-
cmake/dtrace_prelink.cmake | 2 +-
cmake/info_bin.cmake | 2 +-
cmake/info_macros.cmake.in | 2 +-
cmake/info_src.cmake | 2 +-
cmake/install_layout.cmake | 2 +-
cmake/install_macros.cmake | 2 +-
cmake/libutils.cmake | 2 +-
cmake/maintainer.cmake | 2 +-
cmake/make_dist.cmake.in | 2 +-
cmake/merge_archives_unix.cmake | 2 +-
cmake/mysql_add_executable.cmake | 2 +-
cmake/mysql_version.cmake | 2 +-
cmake/os/AIX.cmake | 2 +-
cmake/os/Cygwin.cmake | 2 +-
cmake/os/Darwin.cmake | 2 +-
cmake/os/FreeBSD.cmake | 2 +-
cmake/os/HP-UX.cmake | 2 +-
cmake/os/Linux.cmake | 2 +-
cmake/os/OS400.cmake | 2 +-
cmake/os/SunOS.cmake | 2 +-
cmake/os/Windows.cmake | 2 +-
cmake/os/WindowsCache.cmake | 2 +-
cmake/package_name.cmake | 2 +-
cmake/plugin.cmake | 2 +-
cmake/readline.cmake | 2 +-
cmake/ssl.cmake | 2 +-
cmake/stack_direction.c | 2 +-
cmake/systemd.cmake | 2 +-
cmake/tags.cmake | 2 +-
cmake/versioninfo.rc.in | 2 +-
cmake/wsrep.cmake | 2 +-
cmake/zlib.cmake | 2 +-
config.h.cmake | 2 +-
configure.cmake | 2 +-
dbug/CMakeLists.txt | 2 +-
dbug/dbug_add_tags.pl | 2 +-
debian/additions/innotop/innotop | 6 +-
debian/additions/innotop/innotop.1 | 2 +-
debian/copyright | 2 +-
extra/CMakeLists.txt | 2 +-
extra/charset2html.c | 2 +-
extra/comp_err.c | 2 +-
extra/innochecksum.cc | 2 +-
extra/mariabackup/CMakeLists.txt | 2 +-
extra/mariabackup/backup_copy.cc | 6 +-
extra/mariabackup/backup_mysql.cc | 6 +-
extra/mariabackup/backup_wsrep.h | 2 +-
extra/mariabackup/changed_page_bitmap.cc | 2 +-
extra/mariabackup/changed_page_bitmap.h | 2 +-
extra/mariabackup/common.h | 2 +-
extra/mariabackup/crc/CMakeLists.txt | 2 +-
extra/mariabackup/crc/config.h.cmake | 2 +-
extra/mariabackup/crc/crc-intel-pclmul.c | 4 +-
extra/mariabackup/crc/crc-intel-pclmul.h | 2 +-
extra/mariabackup/crc/crc_glue.c | 2 +-
extra/mariabackup/crc/crc_glue.h | 2 +-
extra/mariabackup/datasink.cc | 2 +-
extra/mariabackup/datasink.h | 2 +-
extra/mariabackup/ds_archive.cc | 2 +-
extra/mariabackup/ds_archive.h | 2 +-
extra/mariabackup/ds_buffer.cc | 2 +-
extra/mariabackup/ds_buffer.h | 2 +-
extra/mariabackup/ds_compress.cc | 2 +-
extra/mariabackup/ds_compress.h | 2 +-
extra/mariabackup/ds_local.cc | 2 +-
extra/mariabackup/ds_local.h | 2 +-
extra/mariabackup/ds_stdout.cc | 2 +-
extra/mariabackup/ds_stdout.h | 2 +-
extra/mariabackup/ds_tmpfile.cc | 2 +-
extra/mariabackup/ds_tmpfile.h | 2 +-
extra/mariabackup/ds_xbstream.cc | 2 +-
extra/mariabackup/ds_xbstream.h | 2 +-
extra/mariabackup/fil_cur.cc | 2 +-
extra/mariabackup/fil_cur.h | 2 +-
extra/mariabackup/innobackupex.cc | 6 +-
extra/mariabackup/innobackupex.h | 2 +-
extra/mariabackup/read_filt.cc | 2 +-
extra/mariabackup/read_filt.h | 2 +-
extra/mariabackup/write_filt.cc | 2 +-
extra/mariabackup/write_filt.h | 2 +-
extra/mariabackup/wsrep.cc | 4 +-
extra/mariabackup/xb_regex.h | 2 +-
extra/mariabackup/xbcloud.cc | 2 +-
extra/mariabackup/xbstream.cc | 2 +-
extra/mariabackup/xbstream.h | 2 +-
extra/mariabackup/xbstream_read.cc | 2 +-
extra/mariabackup/xbstream_write.cc | 2 +-
extra/mariabackup/xtrabackup.cc | 6 +-
extra/mariabackup/xtrabackup.h | 2 +-
extra/my_print_defaults.c | 2 +-
extra/mysql_waitpid.c | 2 +-
extra/perror.c | 2 +-
extra/readline/CMakeLists.txt | 2 +-
extra/readline/COPYING | 4 +-
extra/readline/ansi_stdlib.h | 2 +-
extra/readline/bind.c | 2 +-
extra/readline/callback.c | 2 +-
extra/readline/chardefs.h | 2 +-
extra/readline/compat.c | 2 +-
extra/readline/complete.c | 2 +-
extra/readline/configure.in | 2 +-
extra/readline/display.c | 2 +-
extra/readline/emacs_keymap.c | 2 +-
extra/readline/funmap.c | 2 +-
extra/readline/histexpand.c | 2 +-
extra/readline/histfile.c | 2 +-
extra/readline/histlib.h | 2 +-
extra/readline/history.c | 2 +-
extra/readline/history.h | 2 +-
extra/readline/histsearch.c | 2 +-
extra/readline/input.c | 2 +-
extra/readline/isearch.c | 2 +-
extra/readline/keymaps.c | 2 +-
extra/readline/keymaps.h | 2 +-
extra/readline/kill.c | 2 +-
extra/readline/macro.c | 2 +-
extra/readline/mbutil.c | 2 +-
extra/readline/misc.c | 2 +-
extra/readline/nls.c | 2 +-
extra/readline/parens.c | 2 +-
extra/readline/posixdir.h | 2 +-
extra/readline/posixjmp.h | 2 +-
extra/readline/posixstat.h | 2 +-
extra/readline/readline.c | 2 +-
extra/readline/readline.h | 2 +-
extra/readline/rlconf.h | 2 +-
extra/readline/rldefs.h | 2 +-
extra/readline/rlmbutil.h | 2 +-
extra/readline/rlprivate.h | 2 +-
extra/readline/rlshell.h | 2 +-
extra/readline/rlstdc.h | 2 +-
extra/readline/rltty.c | 2 +-
extra/readline/rltty.h | 2 +-
extra/readline/rltypedefs.h | 2 +-
extra/readline/rlwinsize.h | 2 +-
extra/readline/savestring.c | 2 +-
extra/readline/search.c | 2 +-
extra/readline/shell.c | 2 +-
extra/readline/signals.c | 2 +-
extra/readline/tcap.h | 2 +-
extra/readline/terminal.c | 2 +-
extra/readline/text.c | 2 +-
extra/readline/tilde.c | 2 +-
extra/readline/tilde.h | 2 +-
extra/readline/undo.c | 2 +-
extra/readline/util.c | 2 +-
extra/readline/vi_keymap.c | 2 +-
extra/readline/vi_mode.c | 2 +-
extra/readline/xmalloc.c | 2 +-
extra/readline/xmalloc.h | 2 +-
extra/replace.c | 2 +-
extra/resolve_stack_dump.c | 2 +-
extra/resolveip.c | 2 +-
extra/yassl/CMakeLists.txt | 2 +-
extra/yassl/COPYING | 4 +-
extra/yassl/examples/client/client.cpp | 2 +-
extra/yassl/examples/echoclient/echoclient.cpp | 2 +-
extra/yassl/examples/echoserver/echoserver.cpp | 2 +-
extra/yassl/examples/server/server.cpp | 2 +-
extra/yassl/include/buffer.hpp | 2 +-
extra/yassl/include/cert_wrapper.hpp | 2 +-
extra/yassl/include/crypto_wrapper.hpp | 2 +-
extra/yassl/include/factory.hpp | 2 +-
extra/yassl/include/handshake.hpp | 2 +-
extra/yassl/include/lock.hpp | 2 +-
extra/yassl/include/log.hpp | 2 +-
extra/yassl/include/openssl/crypto.h | 2 +-
extra/yassl/include/openssl/des.h | 2 +-
extra/yassl/include/openssl/des_old.h | 2 +-
extra/yassl/include/openssl/engine.h | 2 +-
extra/yassl/include/openssl/err.h | 2 +-
extra/yassl/include/openssl/evp.h | 2 +-
.../yassl/include/openssl/generate_prefix_files.pl | 2 +-
extra/yassl/include/openssl/hmac.h | 2 +-
extra/yassl/include/openssl/lhash.h | 2 +-
extra/yassl/include/openssl/md4.h | 2 +-
extra/yassl/include/openssl/md5.h | 2 +-
extra/yassl/include/openssl/objects.h | 2 +-
extra/yassl/include/openssl/opensslv.h | 2 +-
extra/yassl/include/openssl/pem.h | 2 +-
extra/yassl/include/openssl/pkcs12.h | 2 +-
extra/yassl/include/openssl/prefix_crypto.h | 2 +-
extra/yassl/include/openssl/prefix_ssl.h | 2 +-
extra/yassl/include/openssl/rand.h | 2 +-
extra/yassl/include/openssl/rsa.h | 2 +-
extra/yassl/include/openssl/sha.h | 2 +-
extra/yassl/include/openssl/ssl.h | 2 +-
extra/yassl/include/openssl/transport_types.h | 2 +-
extra/yassl/include/openssl/x509.h | 2 +-
extra/yassl/include/openssl/x509v3.h | 2 +-
extra/yassl/include/socket_wrapper.hpp | 2 +-
extra/yassl/include/timer.hpp | 2 +-
extra/yassl/include/yassl.hpp | 2 +-
extra/yassl/include/yassl_error.hpp | 2 +-
extra/yassl/include/yassl_imp.hpp | 2 +-
extra/yassl/include/yassl_int.hpp | 2 +-
extra/yassl/include/yassl_types.hpp | 2 +-
extra/yassl/src/buffer.cpp | 2 +-
extra/yassl/src/cert_wrapper.cpp | 2 +-
extra/yassl/src/crypto_wrapper.cpp | 2 +-
extra/yassl/src/handshake.cpp | 2 +-
extra/yassl/src/lock.cpp | 2 +-
extra/yassl/src/log.cpp | 2 +-
extra/yassl/src/make.bat | 2 +-
extra/yassl/src/socket_wrapper.cpp | 2 +-
extra/yassl/src/ssl.cpp | 2 +-
extra/yassl/src/timer.cpp | 2 +-
extra/yassl/src/yassl.cpp | 2 +-
extra/yassl/src/yassl_error.cpp | 2 +-
extra/yassl/src/yassl_imp.cpp | 2 +-
extra/yassl/src/yassl_int.cpp | 2 +-
extra/yassl/taocrypt/CMakeLists.txt | 2 +-
extra/yassl/taocrypt/COPYING | 4 +-
extra/yassl/taocrypt/benchmark/benchmark.cpp | 2 +-
extra/yassl/taocrypt/benchmark/make.bat | 2 +-
extra/yassl/taocrypt/include/aes.hpp | 2 +-
extra/yassl/taocrypt/include/algebra.hpp | 2 +-
extra/yassl/taocrypt/include/arc4.hpp | 2 +-
extra/yassl/taocrypt/include/asn.hpp | 2 +-
extra/yassl/taocrypt/include/block.hpp | 2 +-
extra/yassl/taocrypt/include/blowfish.hpp | 2 +-
extra/yassl/taocrypt/include/coding.hpp | 2 +-
extra/yassl/taocrypt/include/des.hpp | 2 +-
extra/yassl/taocrypt/include/dh.hpp | 2 +-
extra/yassl/taocrypt/include/dsa.hpp | 2 +-
extra/yassl/taocrypt/include/error.hpp | 2 +-
extra/yassl/taocrypt/include/file.hpp | 2 +-
extra/yassl/taocrypt/include/hash.hpp | 2 +-
extra/yassl/taocrypt/include/hc128.hpp | 2 +-
extra/yassl/taocrypt/include/hmac.hpp | 2 +-
extra/yassl/taocrypt/include/integer.hpp | 2 +-
extra/yassl/taocrypt/include/kernelc.hpp | 2 +-
extra/yassl/taocrypt/include/md2.hpp | 2 +-
extra/yassl/taocrypt/include/md4.hpp | 2 +-
extra/yassl/taocrypt/include/md5.hpp | 2 +-
extra/yassl/taocrypt/include/misc.hpp | 2 +-
extra/yassl/taocrypt/include/modarith.hpp | 2 +-
extra/yassl/taocrypt/include/modes.hpp | 2 +-
extra/yassl/taocrypt/include/pwdbased.hpp | 2 +-
extra/yassl/taocrypt/include/rabbit.hpp | 2 +-
extra/yassl/taocrypt/include/random.hpp | 2 +-
extra/yassl/taocrypt/include/ripemd.hpp | 2 +-
extra/yassl/taocrypt/include/rsa.hpp | 2 +-
extra/yassl/taocrypt/include/runtime.hpp | 2 +-
extra/yassl/taocrypt/include/sha.hpp | 2 +-
extra/yassl/taocrypt/include/twofish.hpp | 2 +-
extra/yassl/taocrypt/include/type_traits.hpp | 2 +-
extra/yassl/taocrypt/include/types.hpp | 2 +-
extra/yassl/taocrypt/mySTL/algorithm.hpp | 2 +-
extra/yassl/taocrypt/mySTL/helpers.hpp | 2 +-
extra/yassl/taocrypt/mySTL/list.hpp | 2 +-
extra/yassl/taocrypt/mySTL/memory.hpp | 2 +-
extra/yassl/taocrypt/mySTL/memory_array.hpp | 2 +-
extra/yassl/taocrypt/mySTL/pair.hpp | 2 +-
extra/yassl/taocrypt/mySTL/stdexcept.hpp | 2 +-
extra/yassl/taocrypt/mySTL/vector.hpp | 2 +-
extra/yassl/taocrypt/src/aes.cpp | 2 +-
extra/yassl/taocrypt/src/aestables.cpp | 2 +-
extra/yassl/taocrypt/src/algebra.cpp | 2 +-
extra/yassl/taocrypt/src/arc4.cpp | 2 +-
extra/yassl/taocrypt/src/asn.cpp | 2 +-
extra/yassl/taocrypt/src/bftables.cpp | 2 +-
extra/yassl/taocrypt/src/blowfish.cpp | 2 +-
extra/yassl/taocrypt/src/coding.cpp | 2 +-
extra/yassl/taocrypt/src/des.cpp | 2 +-
extra/yassl/taocrypt/src/dh.cpp | 2 +-
extra/yassl/taocrypt/src/dsa.cpp | 2 +-
extra/yassl/taocrypt/src/file.cpp | 2 +-
extra/yassl/taocrypt/src/hash.cpp | 2 +-
extra/yassl/taocrypt/src/hc128.cpp | 2 +-
extra/yassl/taocrypt/src/integer.cpp | 2 +-
extra/yassl/taocrypt/src/make.bat | 2 +-
extra/yassl/taocrypt/src/md2.cpp | 2 +-
extra/yassl/taocrypt/src/md4.cpp | 2 +-
extra/yassl/taocrypt/src/md5.cpp | 2 +-
extra/yassl/taocrypt/src/misc.cpp | 2 +-
extra/yassl/taocrypt/src/rabbit.cpp | 2 +-
extra/yassl/taocrypt/src/random.cpp | 2 +-
extra/yassl/taocrypt/src/ripemd.cpp | 2 +-
extra/yassl/taocrypt/src/rsa.cpp | 2 +-
extra/yassl/taocrypt/src/sha.cpp | 2 +-
extra/yassl/taocrypt/src/tftables.cpp | 2 +-
extra/yassl/taocrypt/src/twofish.cpp | 2 +-
extra/yassl/taocrypt/test/make.bat | 2 +-
extra/yassl/taocrypt/test/memory.cpp | 2 +-
extra/yassl/taocrypt/test/test.cpp | 2 +-
extra/yassl/testsuite/make.bat | 2 +-
extra/yassl/testsuite/test.hpp | 2 +-
extra/yassl/testsuite/testsuite.cpp | 2 +-
include/CMakeLists.txt | 2 +-
include/atomic/gcc_builtins.h | 2 +-
include/atomic/generic-msvc.h | 2 +-
include/atomic/solaris.h | 2 +-
include/big_endian.h | 2 +-
include/byte_order_generic.h | 2 +-
include/byte_order_generic_x86.h | 2 +-
include/byte_order_generic_x86_64.h | 2 +-
include/decimal.h | 2 +-
include/errmsg.h | 2 +-
include/ft_global.h | 2 +-
include/handler_ername.h | 2 +-
include/hash.h | 2 +-
include/heap.h | 2 +-
include/keycache.h | 2 +-
include/lf.h | 2 +-
include/little_endian.h | 2 +-
include/m_ctype.h | 2 +-
include/m_string.h | 2 +-
include/maria.h | 2 +-
include/my_alarm.h | 2 +-
include/my_alloc.h | 2 +-
include/my_atomic.h | 2 +-
include/my_attribute.h | 2 +-
include/my_base.h | 2 +-
include/my_bit.h | 2 +-
include/my_bitmap.h | 2 +-
include/my_byteorder.h | 2 +-
include/my_check_opt.h | 2 +-
include/my_compare.h | 2 +-
include/my_compiler.h | 2 +-
include/my_cpu.h | 2 +-
include/my_crypt.h | 2 +-
include/my_dbug.h | 2 +-
include/my_decimal_limits.h | 2 +-
include/my_default.h | 2 +-
include/my_dir.h | 2 +-
include/my_getopt.h | 2 +-
include/my_global.h | 2 +-
include/my_handler_errors.h | 2 +-
include/my_libwrap.h | 2 +-
include/my_list.h | 2 +-
include/my_md5.h | 2 +-
include/my_net.h | 2 +-
include/my_nosys.h | 2 +-
include/my_pthread.h | 24 +-
include/my_rdtsc.h | 2 +-
include/my_rnd.h | 2 +-
include/my_service_manager.h | 2 +-
include/my_stacktrace.h | 2 +-
include/my_sys.h | 5 +-
include/my_time.h | 2 +-
include/my_tree.h | 4 +-
include/my_uctype.h | 2 +-
include/my_user.h | 2 +-
include/my_valgrind.h | 4 +-
include/my_xml.h | 2 +-
include/myisam.h | 2 +-
include/myisamchk.h | 2 +-
include/myisammrg.h | 2 +-
include/myisampack.h | 2 +-
include/mysql.h | 2 +-
include/mysql/auth_dialog_client.h | 2 +-
include/mysql/client_plugin.h | 2 +-
include/mysql/plugin.h | 2 +-
include/mysql/plugin_audit.h | 2 +-
include/mysql/plugin_auth.h | 2 +-
include/mysql/plugin_auth_common.h | 2 +-
include/mysql/plugin_encryption.h | 2 +-
include/mysql/plugin_ftparser.h | 2 +-
include/mysql/plugin_password_validation.h | 2 +-
include/mysql/psi/mysql_file.h | 2 +-
include/mysql/psi/mysql_idle.h | 2 +-
include/mysql/psi/mysql_socket.h | 2 +-
include/mysql/psi/mysql_stage.h | 2 +-
include/mysql/psi/mysql_statement.h | 2 +-
include/mysql/psi/mysql_table.h | 2 +-
include/mysql/psi/mysql_thread.h | 2 +-
include/mysql/psi/psi.h | 2 +-
include/mysql/psi/psi_abi_v0.h | 2 +-
include/mysql/psi/psi_abi_v1.h | 2 +-
include/mysql/psi/psi_abi_v2.h | 2 +-
include/mysql/psi/psi_base.h | 2 +-
include/mysql/psi/psi_memory.h | 2 +-
include/mysql/service_base64.h | 2 +-
include/mysql/service_debug_sync.h | 2 +-
include/mysql/service_encryption.h | 2 +-
include/mysql/service_encryption_scheme.h | 2 +-
include/mysql/service_kill_statement.h | 2 +-
include/mysql/service_logger.h | 2 +-
include/mysql/service_md5.h | 2 +-
include/mysql/service_my_crypt.h | 2 +-
include/mysql/service_my_print_error.h | 2 +-
include/mysql/service_my_snprintf.h | 2 +-
include/mysql/service_progress_report.h | 2 +-
include/mysql/service_sha1.h | 2 +-
include/mysql/service_sha2.h | 2 +-
include/mysql/service_thd_alloc.h | 2 +-
include/mysql/service_thd_autoinc.h | 2 +-
include/mysql/service_thd_error_context.h | 2 +-
include/mysql/service_thd_rnd.h | 2 +-
include/mysql/service_thd_specifics.h | 2 +-
include/mysql/service_thd_timezone.h | 2 +-
include/mysql/service_thd_wait.h | 2 +-
include/mysql/service_wsrep.h | 2 +-
include/mysql/services.h | 2 +-
include/mysql_async.h | 2 +-
include/mysql_com.h | 2 +-
include/mysql_com_server.h | 2 +-
include/mysql_embed.h | 2 +-
include/mysql_time.h | 2 +-
include/mysys_err.h | 2 +-
include/password.h | 2 +-
include/probes_mysql.d.base | 2 +-
include/probes_mysql.h | 2 +-
include/rijndael.h | 2 +-
include/service_versions.h | 2 +-
include/sql_common.h | 2 +-
include/sslopt-case.h | 2 +-
include/sslopt-longopts.h | 2 +-
include/sslopt-vars.h | 2 +-
include/t_ctype.h | 2 +-
include/thr_alarm.h | 2 +-
include/thr_lock.h | 2 +-
include/thr_timer.h | 2 +-
include/thread_pool_priv.h | 2 +-
include/typelib.h | 2 +-
include/violite.h | 4 +-
include/waiting_threads.h | 2 +-
include/welcome_copyright_notice.h | 2 +-
include/wqueue.h | 2 +-
include/wsrep.h | 2 +-
libmysqld/CMakeLists.txt | 2 +-
libmysqld/client_settings.h | 2 +-
libmysqld/emb_qcache.cc | 2 +-
libmysqld/emb_qcache.h | 2 +-
libmysqld/embedded_priv.h | 2 +-
libmysqld/examples/CMakeLists.txt | 2 +-
libmysqld/examples/builder-sample/emb_sample.bpr | 2 +-
libmysqld/examples/builder-sample/emb_sample.cpp | 2 +-
libmysqld/examples/builder-sample/emb_samples.cpp | 2 +-
libmysqld/examples/builder-sample/emb_samples.h | 2 +-
libmysqld/examples/test-run | 2 +-
libmysqld/libmysql.c | 2 +-
libmysqld/libmysqld.c | 2 +-
libservices/CMakeLists.txt | 2 +-
libservices/base64_service.c | 2 +-
libservices/debug_sync_service.c | 2 +-
libservices/encryption_scheme_service.c | 2 +-
libservices/encryption_service.c | 2 +-
libservices/kill_statement_service.c | 2 +-
libservices/logger_service.c | 2 +-
libservices/my_md5_service.c | 2 +-
libservices/my_print_error_service.c | 2 +-
libservices/my_sha1_service.c | 2 +-
libservices/my_sha2_service.c | 2 +-
libservices/my_snprintf_service.c | 2 +-
libservices/progress_report_service.c | 2 +-
libservices/thd_alloc_service.c | 2 +-
libservices/thd_autoinc_service.c | 2 +-
libservices/thd_error_context_service.c | 2 +-
libservices/thd_rnd_service.c | 2 +-
libservices/thd_specifics_service.c | 2 +-
libservices/thd_timezone_service.c | 2 +-
libservices/thd_wait_service.c | 2 +-
libservices/wsrep_service.c | 2 +-
man/CMakeLists.txt | 2 +-
man/comp_err.1 | 2 +-
man/innochecksum.1 | 2 +-
man/msql2mysql.1 | 2 +-
man/my_print_defaults.1 | 2 +-
man/myisam_ftdump.1 | 2 +-
man/myisamchk.1 | 2 +-
man/myisamlog.1 | 2 +-
man/myisampack.1 | 2 +-
man/mysql-stress-test.pl.1 | 2 +-
man/mysql-test-run.pl.1 | 2 +-
man/mysql.1 | 2 +-
man/mysql.server.1 | 2 +-
man/mysql_client_test.1 | 2 +-
man/mysql_config.1 | 2 +-
man/mysql_convert_table_format.1 | 2 +-
man/mysql_find_rows.1 | 2 +-
man/mysql_fix_extensions.1 | 2 +-
man/mysql_install_db.1 | 2 +-
man/mysql_plugin.1 | 2 +-
man/mysql_secure_installation.1 | 2 +-
man/mysql_setpermission.1 | 2 +-
man/mysql_tzinfo_to_sql.1 | 2 +-
man/mysql_upgrade.1 | 2 +-
man/mysql_waitpid.1 | 2 +-
man/mysqlaccess.1 | 2 +-
man/mysqladmin.1 | 2 +-
man/mysqlbinlog.1 | 2 +-
man/mysqlcheck.1 | 2 +-
man/mysqld.8 | 2 +-
man/mysqld_multi.1 | 2 +-
man/mysqld_safe.1 | 2 +-
man/mysqldump.1 | 2 +-
man/mysqldumpslow.1 | 2 +-
man/mysqlhotcopy.1 | 2 +-
man/mysqlimport.1 | 2 +-
man/mysqlshow.1 | 2 +-
man/mysqlslap.1 | 2 +-
man/mysqltest.1 | 2 +-
man/perror.1 | 2 +-
man/replace.1 | 2 +-
man/resolve_stack_dump.1 | 2 +-
man/resolveip.1 | 2 +-
man/tokuftdump.1 | 2 +-
mysql-test/CMakeLists.txt | 2 +-
mysql-test/dgcov.pl | 2 +-
mysql-test/include/ctype_like_escape.inc | 6 +
mysql-test/include/default_my.cnf | 2 +-
mysql-test/include/default_mysqld.cnf | 2 +-
mysql-test/include/have_perfschema.inc | 2 +-
mysql-test/include/mtr_check.sql | 2 +-
mysql-test/include/mtr_warnings.sql | 2 +-
mysql-test/include/set_binlog_format_mixed.sql | 2 +-
mysql-test/include/set_binlog_format_row.sql | 2 +-
mysql-test/include/set_binlog_format_statement.sql | 2 +-
mysql-test/lib/My/Config.pm | 2 +-
mysql-test/lib/My/ConfigFactory.pm | 2 +-
mysql-test/lib/My/CoreDump.pm | 2 +-
mysql-test/lib/My/File/Path.pm | 2 +-
mysql-test/lib/My/Find.pm | 2 +-
mysql-test/lib/My/Handles.pm | 2 +-
mysql-test/lib/My/Options.pm | 2 +-
mysql-test/lib/My/Platform.pm | 2 +-
mysql-test/lib/My/SafeProcess.pm | 2 +-
mysql-test/lib/My/SafeProcess/Base.pm | 2 +-
mysql-test/lib/My/SafeProcess/CMakeLists.txt | 2 +-
mysql-test/lib/My/SafeProcess/safe_kill_win.cc | 2 +-
mysql-test/lib/My/SafeProcess/safe_process.cc | 2 +-
mysql-test/lib/My/SafeProcess/safe_process_win.cc | 2 +-
mysql-test/lib/My/SysInfo.pm | 2 +-
mysql-test/lib/My/Test.pm | 2 +-
mysql-test/lib/generate-ssl-certs.sh | 2 +-
mysql-test/lib/mtr_cases.pm | 2 +-
mysql-test/lib/mtr_gprof.pl | 2 +-
mysql-test/lib/mtr_io.pl | 2 +-
mysql-test/lib/mtr_match.pm | 2 +-
mysql-test/lib/mtr_misc.pl | 2 +-
mysql-test/lib/mtr_process.pl | 2 +-
mysql-test/lib/mtr_report.pm | 2 +-
mysql-test/lib/mtr_results.pm | 2 +-
mysql-test/lib/mtr_stress.pl | 2 +-
mysql-test/lib/mtr_unique.pm | 2 +-
mysql-test/lib/t/Base.t | 2 +-
mysql-test/lib/t/Find.t | 2 +-
mysql-test/lib/t/Options.t | 2 +-
mysql-test/lib/t/Platform.t | 2 +-
mysql-test/lib/t/SafeProcess.t | 2 +-
mysql-test/lib/t/SafeProcessStress.pl | 2 +-
mysql-test/lib/t/copytree.t | 2 +-
mysql-test/lib/t/dummyd.pl | 2 +-
mysql-test/lib/t/rmtree.t | 2 +-
mysql-test/lib/t/testMyConfig.t | 2 +-
mysql-test/lib/t/testMyConfigFactory.t | 2 +-
mysql-test/lib/t/test_child.pl | 2 +-
mysql-test/lib/v1/My/Config.pm | 2 +-
mysql-test/lib/v1/mtr_cases.pl | 2 +-
mysql-test/lib/v1/mtr_gcov.pl | 2 +-
mysql-test/lib/v1/mtr_gprof.pl | 2 +-
mysql-test/lib/v1/mtr_im.pl | 2 +-
mysql-test/lib/v1/mtr_io.pl | 2 +-
mysql-test/lib/v1/mtr_match.pl | 2 +-
mysql-test/lib/v1/mtr_misc.pl | 2 +-
mysql-test/lib/v1/mtr_process.pl | 2 +-
mysql-test/lib/v1/mtr_report.pl | 2 +-
mysql-test/lib/v1/mtr_stress.pl | 2 +-
mysql-test/lib/v1/mtr_timer.pl | 2 +-
mysql-test/lib/v1/mtr_unique.pl | 2 +-
mysql-test/lib/v1/mysql-test-run.pl | 2 +-
mysql-test/main/bootstrap.test | 13 +-
mysql-test/main/cast.result | 4 +-
mysql-test/main/create_drop_binlog.result | 4 +
mysql-test/main/create_drop_event.result | 5 +
mysql-test/main/ctype_big5.result | 12 +
mysql-test/main/ctype_euckr.result | 12 +
mysql-test/main/ctype_gb2312.result | 12 +
mysql-test/main/ctype_gbk.result | 12 +
mysql-test/main/ctype_latin1.result | 12 +
mysql-test/main/ctype_sjis.result | 12 +
mysql-test/main/ctype_tis620.result | 12 +
mysql-test/main/ctype_uca.result | 6 +
mysql-test/main/ctype_ucs.result | 12 +
mysql-test/main/ctype_ujis.result | 12 +
mysql-test/main/ctype_utf16.result | 12 +
mysql-test/main/ctype_utf16_uca.result | 6 +
mysql-test/main/ctype_utf16le.result | 12 +
mysql-test/main/ctype_utf32.result | 12 +
mysql-test/main/ctype_utf32_uca.result | 6 +
mysql-test/main/ctype_utf8.result | 12 +
mysql-test/main/ctype_utf8mb4.result | 12 +
mysql-test/main/ctype_utf8mb4_heap.result | 12 +
mysql-test/main/ctype_utf8mb4_innodb.result | 12 +
mysql-test/main/ctype_utf8mb4_myisam.result | 12 +
mysql-test/main/ddl_i18n_koi8r.result | 8 +
mysql-test/main/ddl_i18n_utf8.result | 8 +
mysql-test/main/derived_cond_pushdown.result | 52 +-
mysql-test/main/derived_cond_pushdown.test | 14 +
mysql-test/main/dyncol.result | 4 +-
mysql-test/main/events_1.result | 68 +++
mysql-test/main/events_2.result | 30 +
mysql-test/main/events_bugs.result | 54 ++
mysql-test/main/events_grant.result | 10 +
mysql-test/main/events_restart.result | 26 +-
mysql-test/main/events_stress.test | 1 +
mysql-test/main/events_trans.result | 9 +
mysql-test/main/flush_logs_not_windows.result | 3 +
mysql-test/main/flush_logs_not_windows.test | 13 +
mysql-test/main/flush_read_lock.result | 2 +
mysql-test/main/func_gconcat.result | 30 +-
mysql-test/main/func_gconcat.test | 33 +-
mysql-test/main/func_hybrid_type.result | 30 +
mysql-test/main/func_hybrid_type.test | 20 +
mysql-test/main/func_json.result | 75 ++-
mysql-test/main/func_json.test | 43 ++
mysql-test/main/func_str.result | 38 ++
mysql-test/main/func_str.test | 36 ++
mysql-test/main/gis.result | 34 +-
mysql-test/main/gis.test | 41 +-
mysql-test/main/gis2.result | 38 --
mysql-test/main/gis2.test | 45 --
mysql-test/main/gis_notembedded.result | 45 ++
mysql-test/main/gis_notembedded.test | 24 +
mysql-test/main/grant4.result | 21 +
mysql-test/main/grant4.test | 35 +-
mysql-test/main/information_schema_prepare.result | 4 +
mysql-test/main/information_schema_prepare.test | 7 +
mysql-test/main/lock_sync.result | 4 +
mysql-test/main/mdev_19276.result | 11 +
mysql-test/main/mdev_19276.test | 17 +
mysql-test/main/multi_update.result | 23 +
mysql-test/main/multi_update.test | 31 +
...lti_update2-master.opt => multi_update_big.opt} | 0
...ulti_update2.result => multi_update_big.result} | 0
.../{multi_update2.test => multi_update_big.test} | 0
mysql-test/main/mysqldump-compat.result | 4 +
mysql-test/main/mysqldump-compat.test | 13 +
mysql-test/main/mysqldump.result | 34 ++
mysql-test/main/mysqldump.test | 29 +
mysql-test/main/partition_innodb.result | 42 ++
mysql-test/main/partition_innodb.test | 25 +
mysql-test/main/ps.result | 23 +
mysql-test/main/ps.test | 16 +
mysql-test/main/select.result | 14 +-
mysql-test/main/select_jcl6.result | 14 +-
mysql-test/main/select_pkeycache.result | 14 +-
mysql-test/main/show_check.result | 4 +
mysql-test/main/sp_notembedded.result | 2 +
mysql-test/main/ssl_verify_ip.opt | 3 +
mysql-test/main/ssl_verify_ip.result | 4 +
mysql-test/main/ssl_verify_ip.test | 3 +
mysql-test/main/stat_tables.result | 48 ++
mysql-test/main/stat_tables.test | 47 ++
mysql-test/main/stat_tables_innodb.result | 48 ++
mysql-test/main/statistics.result | 14 +
mysql-test/main/statistics.test | 15 +
mysql-test/main/status2.result | 4 +-
mysql-test/main/status2.test | 4 +-
mysql-test/main/table_value_constr.result | 397 ++++++++++++
mysql-test/main/table_value_constr.test | 193 ++++++
mysql-test/main/temp_table.result | 12 +
mysql-test/main/temp_table.test | 16 +
mysql-test/main/timezone2.result | 33 +
mysql-test/main/timezone2.test | 31 +
mysql-test/main/type_bit.result | 7 +
mysql-test/main/type_bit.test | 9 +
mysql-test/main/type_float.result | 101 ++-
mysql-test/main/type_float.test | 69 ++-
mysql-test/main/view_grant.result | 4 +
mysql-test/main/view_grant.test | 5 +
mysql-test/main/win.result | 89 +++
mysql-test/main/win.test | 60 ++
mysql-test/mysql-stress-test.pl | 2 +-
mysql-test/mysql-test-run.pl | 6 +-
mysql-test/purify.supp | 2 +-
mysql-test/std_data/checkDBI_DBD-mysql.pl | 2 +-
mysql-test/std_data/ldml/latin1.xml | 2 +-
mysql-test/std_data/serversan-cert.pem | 110 ++--
mysql-test/std_data/serversan-key.pem | 52 +-
mysql-test/suite.pm | 4 +
mysql-test/suite/binlog/r/binlog_mdev717.result | 2 +
mysql-test/suite/binlog/r/binlog_sql_mode.result | 2 +
mysql-test/suite/compat/oracle/r/events.result | 2 +
.../compat/oracle/r/table_value_constr.result | 321 ++++++++++
.../suite/compat/oracle/t/table_value_constr.test | 151 +++++
.../suite/engines/iuds/r/insert_decimal.result | 4 +-
.../suite/funcs_1/r/is_routines_embedded.result | 12 +
mysql-test/suite/galera/r/galera_events.result | 2 +
.../r/galera_parallel_autoinc_largetrx.result | 1 +
.../r/galera_parallel_autoinc_manytrx.result | 33 +-
.../galera/t/galera_parallel_autoinc_largetrx.test | 4 +-
.../galera/t/galera_parallel_autoinc_manytrx.test | 87 ++-
.../suite/gcol/r/innodb_virtual_purge.result | 17 +
mysql-test/suite/gcol/t/innodb_virtual_purge.test | 35 ++
mysql-test/suite/innodb/r/foreign-keys.result | 24 +
mysql-test/suite/innodb/r/innodb-index.result | 27 +
mysql-test/suite/innodb/r/innodb-truncate.result | 13 +
.../innodb/r/innodb_skip_innodb_is_tables.result | 16 +-
.../suite/innodb/r/instant_alter_crash.result | 5 +-
mysql-test/suite/innodb/r/xa_debug.result | 1 +
mysql-test/suite/innodb/t/foreign-keys.test | 31 +
mysql-test/suite/innodb/t/innodb-index.test | 20 +
mysql-test/suite/innodb/t/innodb-truncate.test | 19 +
mysql-test/suite/innodb/t/instant_alter_crash.test | 5 +-
mysql-test/suite/innodb/t/xa_debug.test | 1 +
.../suite/innodb_fts/r/innodb_ft_aux_table.result | 121 ++++
.../suite/innodb_fts/t/innodb_ft_aux_table.opt | 6 +
.../suite/innodb_fts/t/innodb_ft_aux_table.test | 43 ++
mysql-test/suite/json/r/json_no_table.result | 4 +-
.../suite/perfschema/r/pfs_upgrade_event.result | 2 +
.../suite/perfschema/t/ddl_esms_by_digest.test | 2 +-
.../suite/perfschema/t/dml_esms_by_digest.test | 2 +-
mysql-test/suite/perfschema_stress/README | 2 +-
.../suite/plugins/r/feedback_plugin_load.result | 6 +-
.../suite/plugins/r/feedback_plugin_send.result | 6 +-
mysql-test/suite/plugins/r/pam.result | 20 +
.../suite/plugins/t/feedback_plugin_load.test | 2 +-
mysql-test/suite/plugins/t/pam.test | 25 +-
mysql-test/suite/rpl/disabled.def | 1 -
mysql-test/suite/rpl/extension/checksum.pl | 2 +-
mysql-test/suite/rpl/r/kill_race_condition.result | 18 +
mysql-test/suite/rpl/r/rpl_binlog_dup_entry.result | 29 +
.../suite/rpl/r/rpl_create_drop_event.result | 4 +
mysql-test/suite/rpl/r/rpl_current_user.result | 2 +
mysql-test/suite/rpl/r/rpl_events.result | 6 +
mysql-test/suite/rpl/r/rpl_heartbeat_basic.result | 2 +
mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result | 2 +
mysql-test/suite/rpl/r/rpl_invoked_features.result | 4 +
mysql-test/suite/rpl/r/rpl_killed_ddl.result | 2 +
.../rpl/r/rpl_mixed_implicit_commit_binlog.result | 2 +
.../rpl/r/rpl_row_implicit_commit_binlog.result | 2 +
mysql-test/suite/rpl/r/rpl_row_mysqlbinlog.result | 8 +-
.../rpl/r/rpl_stm_implicit_commit_binlog.result | 2 +
.../suite/rpl/r/rpl_tmp_table_and_DDL.result | 4 +
mysql-test/suite/rpl/t/kill_race_condition.test | 28 +
mysql-test/suite/rpl/t/rpl_binlog_dup_entry.test | 72 +++
mysql-test/suite/rpl/t/rpl_row_mysqlbinlog.test | 3 +-
.../r/innodb_ft_result_cache_limit,32bit.rdiff | 11 +
....result => innodb_ft_result_cache_limit.result} | 0
.../r/innodb_ft_result_cache_limit_32.result | 7 -
.../r/sysvars_innodb,32bit,xtradb.rdiff-disabled | 4 +-
.../r/sysvars_innodb,xtradb.rdiff-disabled | 4 +-
...t_32.test => innodb_ft_result_cache_limit.test} | 2 +-
.../t/innodb_ft_result_cache_limit_64.test | 9 -
.../suite/sys_vars/t/max_digest_length_basic.test | 2 +-
.../suite/sys_vars/t/pfs_digests_size_basic.test | 2 +-
.../sys_vars/t/pfs_max_digest_length_basic.test | 2 +-
.../t/pfs_session_connect_attrs_size_basic.test | 2 +-
.../t/transaction_prealloc_size_bug27322.test | 9 +-
mysql-test/suite/versioning/common.inc | 4 +
mysql-test/suite/versioning/engines.combinations | 3 +
mysql-test/suite/versioning/r/create.result | 19 +-
mysql-test/suite/versioning/r/rpl.result | 6 +-
mysql-test/suite/versioning/r/update-big.result | 25 +
mysql-test/suite/versioning/t/create.test | 18 +-
mysql-test/suite/versioning/t/rpl.test | 6 +-
mysql-test/suite/versioning/t/update-big.test | 34 ++
mysql-test/valgrind.supp | 2 +-
mysys/CMakeLists.txt | 2 +-
mysys/array.c | 2 +-
mysys/base64.c | 2 +-
mysys/charset-def.c | 2 +-
mysys/charset.c | 2 +-
mysys/checksum.c | 2 +-
mysys/errors.c | 2 +-
mysys/file_logger.c | 2 +-
mysys/get_password.c | 2 +-
mysys/hash.c | 2 +-
mysys/lf_alloc-pin.c | 2 +-
mysys/lf_dynarray.c | 2 +-
mysys/lf_hash.c | 2 +-
mysys/list.c | 2 +-
mysys/mf_arr_appstr.c | 2 +-
mysys/mf_cache.c | 2 +-
mysys/mf_dirname.c | 2 +-
mysys/mf_fn_ext.c | 2 +-
mysys/mf_format.c | 2 +-
mysys/mf_getdate.c | 2 +-
mysys/mf_iocache.c | 2 +-
mysys/mf_iocache2.c | 2 +-
mysys/mf_keycache.c | 2 +-
mysys/mf_keycaches.c | 2 +-
mysys/mf_loadpath.c | 2 +-
mysys/mf_pack.c | 2 +-
mysys/mf_path.c | 2 +-
mysys/mf_qsort.c | 2 +-
mysys/mf_qsort2.c | 2 +-
mysys/mf_radix.c | 2 +-
mysys/mf_same.c | 2 +-
mysys/mf_sort.c | 2 +-
mysys/mf_soundex.c | 2 +-
mysys/mf_tempdir.c | 2 +-
mysys/mf_tempfile.c | 2 +-
mysys/mf_unixpath.c | 2 +-
mysys/mf_wcomp.c | 2 +-
mysys/mulalloc.c | 2 +-
mysys/my_access.c | 2 +-
mysys/my_addr_resolve.c | 2 +-
mysys/my_alarm.c | 2 +-
mysys/my_alloc.c | 2 +-
mysys/my_basename.c | 2 +-
mysys/my_bit.c | 2 +-
mysys/my_bitmap.c | 2 +-
mysys/my_chmod.c | 2 +-
mysys/my_chsize.c | 2 +-
mysys/my_compare.c | 2 +-
mysys/my_compress.c | 2 +-
mysys/my_conio.c | 2 +-
mysys/my_copy.c | 2 +-
mysys/my_create.c | 2 +-
mysys/my_default.c | 2 +-
mysys/my_delete.c | 2 +-
mysys/my_div.c | 2 +-
mysys/my_dlerror.c | 2 +-
mysys/my_error.c | 2 +-
mysys/my_file.c | 2 +-
mysys/my_fopen.c | 4 +-
mysys/my_fstream.c | 2 +-
mysys/my_gethwaddr.c | 2 +-
mysys/my_getncpus.c | 2 +-
mysys/my_getopt.c | 2 +-
mysys/my_getpagesize.c | 2 +-
mysys/my_getsystime.c | 2 +-
mysys/my_getwd.c | 2 +-
mysys/my_init.c | 2 +-
mysys/my_largepage.c | 2 +-
mysys/my_lib.c | 2 +-
mysys/my_libwrap.c | 2 +-
mysys/my_lock.c | 2 +-
mysys/my_lockmem.c | 2 +-
mysys/my_malloc.c | 2 +-
mysys/my_memmem.c | 2 +-
mysys/my_mess.c | 2 +-
mysys/my_mkdir.c | 2 +-
mysys/my_mmap.c | 2 +-
mysys/my_new.cc | 2 +-
mysys/my_once.c | 2 +-
mysys/my_open.c | 11 +-
mysys/my_port.c | 2 +-
mysys/my_pread.c | 2 +-
mysys/my_pthread.c | 2 +-
mysys/my_quick.c | 2 +-
mysys/my_rdtsc.c | 2 +-
mysys/my_read.c | 2 +-
mysys/my_redel.c | 2 +-
mysys/my_rename.c | 2 +-
mysys/my_rnd.c | 2 +-
mysys/my_safehash.c | 2 +-
mysys/my_safehash.h | 2 +-
mysys/my_seek.c | 2 +-
mysys/my_sleep.c | 2 +-
mysys/my_static.c | 5 +-
mysys/my_static.h | 2 +-
mysys/my_symlink.c | 2 +-
mysys/my_symlink2.c | 2 +-
mysys/my_sync.c | 2 +-
mysys/my_thr_init.c | 2 +-
mysys/my_timer_cycles.il | 2 +-
mysys/my_uuid.c | 2 +-
mysys/my_wincond.c | 2 +-
mysys/my_windac.c | 2 +-
mysys/my_winerr.c | 2 +-
mysys/my_winfile.c | 2 +-
mysys/my_winthread.c | 2 +-
mysys/my_write.c | 2 +-
mysys/mysys_priv.h | 2 +-
mysys/psi_noop.c | 2 +-
mysys/ptr_cmp.c | 2 +-
mysys/safemalloc.c | 2 +-
mysys/stacktrace.c | 2 +-
mysys/string.c | 2 +-
mysys/test_charset.c | 2 +-
mysys/test_dir.c | 2 +-
mysys/test_thr_mutex.c | 2 +-
mysys/test_xml.c | 2 +-
mysys/testhash.c | 2 +-
mysys/thr_alarm.c | 2 +-
mysys/thr_lock.c | 2 +-
mysys/thr_mutex.c | 2 +-
mysys/thr_rwlock.c | 2 +-
mysys/thr_timer.c | 2 +-
mysys/tree.c | 50 +-
mysys/typelib.c | 2 +-
mysys/waiting_threads.c | 2 +-
mysys/wqueue.c | 2 +-
mysys_ssl/CMakeLists.txt | 2 +-
mysys_ssl/my_crypt.cc | 2 +-
mysys_ssl/my_md5.cc | 2 +-
mysys_ssl/my_sha.ic | 2 +-
mysys_ssl/my_sha1.cc | 2 +-
mysys_ssl/my_sha224.cc | 2 +-
mysys_ssl/my_sha256.cc | 2 +-
mysys_ssl/my_sha384.cc | 2 +-
mysys_ssl/my_sha512.cc | 2 +-
mysys_ssl/yassl.cc | 2 +-
pcre/AUTHORS | 6 +-
pcre/ChangeLog | 43 ++
pcre/LICENCE | 10 +-
pcre/NEWS | 10 +
pcre/configure.ac | 10 +-
pcre/pcre_compile.c | 18 +-
pcre/pcre_jit_compile.c | 2 +-
pcre/pcrecpp.cc | 64 +-
pcre/pcrecpp_unittest.cc | 34 +-
pcre/pcregrep.c | 4 +-
pcre/testdata/testinput1 | 15 +
pcre/testdata/testinput2 | 3 +
pcre/testdata/testinput4 | 3 +
pcre/testdata/testoutput1 | 24 +
pcre/testdata/testoutput2 | 4 +
pcre/testdata/testoutput4 | 4 +
plugin/audit_null/CMakeLists.txt | 2 +-
plugin/audit_null/audit_null.c | 2 +-
plugin/auth_dialog/CMakeLists.txt | 2 +-
plugin/auth_dialog/dialog.c | 2 +-
plugin/auth_ed25519/client_ed25519.c | 2 +-
plugin/auth_ed25519/common.h | 2 +-
plugin/auth_ed25519/ed25519-t.c | 2 +-
plugin/auth_ed25519/server_ed25519.c | 2 +-
plugin/auth_examples/CMakeLists.txt | 2 +-
plugin/auth_examples/auth_0x0100.c | 2 +-
plugin/auth_examples/clear_password_client.c | 2 +-
plugin/auth_examples/dialog_examples.c | 2 +-
plugin/auth_examples/qa_auth_client.c | 2 +-
plugin/auth_examples/qa_auth_interface.c | 2 +-
plugin/auth_examples/qa_auth_server.c | 2 +-
plugin/auth_examples/test_plugin.c | 2 +-
plugin/auth_pam/auth_pam.c | 6 +-
plugin/auth_pam/auth_pam_base.c | 5 +-
plugin/auth_pam/auth_pam_common.c | 5 +
plugin/auth_pam/auth_pam_tool.c | 3 +-
plugin/auth_pipe/auth_pipe.c | 2 +-
plugin/auth_socket/CMakeLists.txt | 2 +-
plugin/auth_socket/auth_socket.c | 2 +-
.../aws_key_management_plugin.cc | 2 +-
.../cracklib_password_check.c | 2 +-
plugin/daemon_example/CMakeLists.txt | 2 +-
plugin/daemon_example/daemon_example.cc | 2 +-
.../debug_key_management_plugin.cc | 2 +-
plugin/disks/information_schema_disks.cc | 2 +-
.../example_key_management_plugin.cc | 2 +-
plugin/feedback/feedback.cc | 2 +-
plugin/feedback/feedback.h | 2 +-
plugin/feedback/sender_thread.cc | 2 +-
plugin/feedback/url_base.cc | 2 +-
plugin/feedback/url_http.cc | 2 +-
plugin/feedback/utils.cc | 2 +-
.../file_key_management_plugin.cc | 2 +-
plugin/file_key_management/parser.cc | 2 +-
plugin/file_key_management/parser.h | 2 +-
plugin/fulltext/CMakeLists.txt | 2 +-
plugin/fulltext/plugin_example.c | 2 +-
plugin/metadata_lock_info/metadata_lock_info.cc | 2 +-
plugin/query_response_time/plugin.cc | 2 +-
plugin/server_audit/CMakeLists.txt | 2 +-
plugin/server_audit/COPYING | 4 +-
plugin/server_audit/plugin_audit_v4.h | 2 +-
plugin/server_audit/server_audit.c | 2 +-
.../simple_password_check/simple_password_check.c | 2 +-
plugin/sql_errlog/CMakeLists.txt | 2 +-
plugin/sql_errlog/sql_errlog.c | 2 +-
plugin/user_variables/user_variables.cc | 2 +-
plugin/versioning/CMakeLists.txt | 2 +-
plugin/win_auth_client/CMakeLists.txt | 2 +-
plugin/win_auth_client/common.cc | 2 +-
plugin/win_auth_client/common.h | 2 +-
plugin/win_auth_client/handshake.cc | 2 +-
plugin/win_auth_client/handshake.h | 2 +-
plugin/win_auth_client/handshake_client.cc | 2 +-
plugin/win_auth_client/log_client.cc | 2 +-
plugin/win_auth_client/plugin_client.cc | 2 +-
plugin/wsrep_info/plugin.cc | 2 +-
scripts/CMakeLists.txt | 2 +-
scripts/comp_sql.c | 2 +-
scripts/fill_help_tables.sql | 2 +-
scripts/galera_recovery.sh | 2 +-
scripts/maria_add_gis_sp.sql.in | 6 +-
scripts/mariadb-service-convert | 2 +-
scripts/msql2mysql.sh | 2 +-
scripts/mysql_config.pl.in | 2 +-
scripts/mysql_config.sh | 2 +-
scripts/mysql_convert_table_format.sh | 2 +-
scripts/mysql_find_rows.sh | 2 +-
scripts/mysql_fix_extensions.sh | 2 +-
scripts/mysql_install_db.sh | 5 +-
scripts/mysql_secure_installation.sh | 2 +-
scripts/mysql_setpermission.sh | 2 +-
scripts/mysql_system_tables.sql | 2 +-
scripts/mysql_system_tables_data.sql | 2 +-
scripts/mysql_system_tables_fix.sql | 2 +-
scripts/mysql_test_data_timezone.sql | 2 +-
scripts/mysqlaccess.sh | 2 +-
scripts/mysqld_multi.sh | 2 +-
scripts/mysqldumpslow.sh | 2 +-
scripts/mysqlhotcopy.sh | 2 +-
scripts/wsrep_sst_common.sh | 2 +-
scripts/wsrep_sst_mariabackup.sh | 2 +-
scripts/wsrep_sst_mysqldump.sh | 2 +-
scripts/wsrep_sst_rsync.sh | 2 +-
sql-bench/CMakeLists.txt | 2 +-
sql-bench/as3ap.sh | 2 +-
sql-bench/bench-count-distinct.sh | 2 +-
sql-bench/bench-init.pl.sh | 2 +-
sql-bench/compare-results.sh | 2 +-
sql-bench/copy-db.sh | 2 +-
sql-bench/crash-me.sh | 2 +-
sql-bench/run-all-tests.sh | 2 +-
sql-bench/server-cfg.sh | 2 +-
sql-bench/test-ATIS.sh | 2 +-
sql-bench/test-alter-table.sh | 2 +-
sql-bench/test-big-tables.sh | 2 +-
sql-bench/test-connect.sh | 2 +-
sql-bench/test-create.sh | 2 +-
sql-bench/test-insert.sh | 2 +-
sql-bench/test-select.sh | 2 +-
sql-bench/test-transactions.sh | 2 +-
sql-bench/test-wisconsin.sh | 2 +-
sql-common/client.c | 8 +-
sql-common/client_plugin.c | 2 +-
sql-common/conf_to_src.c | 2 +-
sql-common/errmsg.c | 2 +-
sql-common/my_time.c | 2 +-
sql-common/my_user.c | 2 +-
sql-common/pack.c | 2 +-
sql/CMakeLists.txt | 2 +-
sql/authors.h | 2 +-
sql/bounded_queue.h | 2 +-
sql/client_settings.h | 2 +-
sql/compat56.cc | 2 +-
sql/compat56.h | 2 +-
sql/contributors.h | 2 +-
sql/create_options.cc | 2 +-
sql/create_options.h | 2 +-
sql/custom_conf.h | 2 +-
sql/datadict.cc | 2 +-
sql/datadict.h | 2 +-
sql/debug_sync.cc | 2 +-
sql/debug_sync.h | 2 +-
sql/derror.cc | 2 +-
sql/derror.h | 2 +-
sql/des_key_file.cc | 2 +-
sql/des_key_file.h | 2 +-
sql/discover.cc | 2 +-
sql/discover.h | 2 +-
sql/encryption.cc | 2 +-
sql/event_data_objects.cc | 2 +-
sql/event_data_objects.h | 2 +-
sql/event_db_repository.cc | 2 +-
sql/event_db_repository.h | 2 +-
sql/event_parse_data.cc | 2 +-
sql/event_parse_data.h | 2 +-
sql/event_queue.cc | 2 +-
sql/event_queue.h | 2 +-
sql/event_scheduler.cc | 2 +-
sql/event_scheduler.h | 2 +-
sql/events.cc | 8 +-
sql/events.h | 2 +-
sql/field.cc | 25 +-
sql/field.h | 2 +-
sql/field_conv.cc | 2 +-
sql/filesort.cc | 2 +-
sql/filesort.h | 2 +-
sql/filesort_utils.cc | 2 +-
sql/filesort_utils.h | 2 +-
sql/gcalc_slicescan.cc | 2 +-
sql/gcalc_slicescan.h | 2 +-
sql/gcalc_tools.cc | 2 +-
sql/gcalc_tools.h | 2 +-
sql/gen_lex_hash.cc | 2 +-
sql/gen_lex_token.cc | 2 +-
sql/gen_win_tzname_data.ps1 | 11 +
sql/group_by_handler.cc | 2 +-
sql/group_by_handler.h | 2 +-
sql/gstream.cc | 2 +-
sql/gstream.h | 2 +-
sql/ha_partition.cc | 43 +-
sql/ha_partition.h | 14 +-
sql/handler.cc | 238 +++++---
sql/handler.h | 20 +-
sql/hash_filo.cc | 2 +-
sql/hash_filo.h | 2 +-
sql/hostname.cc | 2 +-
sql/hostname.h | 2 +-
sql/init.cc | 2 +-
sql/init.h | 2 +-
sql/innodb_priv.h | 2 +-
sql/item.cc | 13 +-
sql/item.h | 35 +-
sql/item_buff.cc | 2 +-
sql/item_cmpfunc.cc | 2 +-
sql/item_cmpfunc.h | 2 +-
sql/item_create.cc | 41 +-
sql/item_create.h | 2 +-
sql/item_func.cc | 22 +-
sql/item_func.h | 56 +-
sql/item_geofunc.cc | 2 +-
sql/item_geofunc.h | 2 +-
sql/item_inetfunc.cc | 2 +-
sql/item_inetfunc.h | 2 +-
sql/item_jsonfunc.cc | 325 ++++++++++
sql/item_jsonfunc.h | 12 +-
sql/item_row.cc | 2 +-
sql/item_row.h | 2 +-
sql/item_strfunc.cc | 2 +-
sql/item_strfunc.h | 2 +-
sql/item_subselect.cc | 17 +-
sql/item_subselect.h | 4 +-
sql/item_sum.cc | 95 ++-
sql/item_sum.h | 10 +-
sql/item_timefunc.cc | 2 +-
sql/item_timefunc.h | 2 +-
sql/item_xmlfunc.cc | 2 +-
sql/item_xmlfunc.h | 2 +-
sql/key.cc | 2 +-
sql/key.h | 2 +-
sql/keycaches.cc | 2 +-
sql/keycaches.h | 2 +-
sql/lex.h | 2 +-
sql/lex_symbol.h | 2 +-
sql/lock.cc | 2 +-
sql/lock.h | 2 +-
sql/log.cc | 14 +-
sql/log.h | 3 +-
sql/log_event.cc | 25 +-
sql/log_event.h | 2 +-
sql/log_event_old.cc | 21 +-
sql/log_event_old.h | 2 +-
sql/log_slow.h | 2 +-
sql/main.cc | 2 +-
sql/mdl.cc | 2 +-
sql/mdl.h | 2 +-
sql/mem_root_array.h | 2 +-
sql/mf_iocache.cc | 2 +-
sql/mf_iocache_encr.cc | 2 +-
sql/multi_range_read.cc | 2 +-
sql/multi_range_read.h | 2 +-
sql/my_apc.cc | 2 +-
sql/my_apc.h | 2 +-
sql/my_decimal.cc | 2 +-
sql/my_decimal.h | 2 +-
sql/my_json_writer.cc | 2 +-
sql/my_json_writer.h | 2 +-
sql/mysql_install_db.cc | 2 +-
sql/mysql_upgrade_service.cc | 5 +-
sql/mysqld.cc | 56 +-
sql/mysqld.h | 24 +-
sql/mysqld_suffix.h | 2 +-
sql/net_serv.cc | 2 +-
sql/opt_index_cond_pushdown.cc | 2 +-
sql/opt_range.cc | 4 +-
sql/opt_range.h | 2 +-
sql/opt_range_mrr.cc | 2 +-
sql/opt_subselect.cc | 2 +-
sql/opt_subselect.h | 2 +-
sql/opt_sum.cc | 2 +-
sql/opt_table_elimination.cc | 2 +-
sql/parse_file.cc | 2 +-
sql/parse_file.h | 2 +-
sql/partition_element.h | 2 +-
sql/partition_info.cc | 2 +-
sql/partition_info.h | 2 +-
sql/password.c | 2 +-
sql/plistsort.c | 2 +-
sql/procedure.cc | 2 +-
sql/procedure.h | 2 +-
sql/protocol.cc | 4 +-
sql/protocol.h | 2 +-
sql/records.cc | 2 +-
sql/records.h | 2 +-
sql/repl_failsafe.cc | 2 +-
sql/repl_failsafe.h | 2 +-
sql/replication.h | 2 +-
sql/rpl_constants.h | 2 +-
sql/rpl_filter.cc | 2 +-
sql/rpl_filter.h | 2 +-
sql/rpl_gtid.cc | 2 +-
sql/rpl_gtid.h | 2 +-
sql/rpl_injector.cc | 2 +-
sql/rpl_injector.h | 2 +-
sql/rpl_mi.cc | 2 +-
sql/rpl_mi.h | 2 +-
sql/rpl_record.cc | 2 +-
sql/rpl_record.h | 2 +-
sql/rpl_record_old.cc | 2 +-
sql/rpl_record_old.h | 2 +-
sql/rpl_reporting.cc | 2 +-
sql/rpl_reporting.h | 2 +-
sql/rpl_rli.cc | 2 +-
sql/rpl_rli.h | 2 +-
sql/rpl_tblmap.cc | 2 +-
sql/rpl_tblmap.h | 2 +-
sql/rpl_utility.cc | 2 +-
sql/rpl_utility.h | 2 +-
sql/scheduler.cc | 2 +-
sql/scheduler.h | 2 +-
sql/semisync.cc | 2 +-
sql/semisync.h | 2 +-
sql/semisync_master.h | 2 +-
sql/session_tracker.cc | 1 +
sql/set_var.cc | 2 +-
sql/set_var.h | 2 +-
sql/share/CMakeLists.txt | 2 +-
sql/share/charsets/Index.xml | 2 +-
sql/share/charsets/armscii8.xml | 2 +-
sql/share/charsets/ascii.xml | 2 +-
sql/share/charsets/cp1250.xml | 2 +-
sql/share/charsets/cp1251.xml | 2 +-
sql/share/charsets/cp1256.xml | 2 +-
sql/share/charsets/cp1257.xml | 2 +-
sql/share/charsets/cp850.xml | 2 +-
sql/share/charsets/cp852.xml | 2 +-
sql/share/charsets/cp866.xml | 2 +-
sql/share/charsets/dec8.xml | 2 +-
sql/share/charsets/geostd8.xml | 2 +-
sql/share/charsets/greek.xml | 2 +-
sql/share/charsets/hebrew.xml | 2 +-
sql/share/charsets/hp8.xml | 2 +-
sql/share/charsets/keybcs2.xml | 2 +-
sql/share/charsets/koi8r.xml | 2 +-
sql/share/charsets/koi8u.xml | 2 +-
sql/share/charsets/languages.html | 2 +-
sql/share/charsets/latin1.xml | 2 +-
sql/share/charsets/latin2.xml | 2 +-
sql/share/charsets/latin5.xml | 2 +-
sql/share/charsets/latin7.xml | 2 +-
sql/share/charsets/macce.xml | 2 +-
sql/share/charsets/macroman.xml | 2 +-
sql/share/charsets/swe7.xml | 2 +-
sql/share/errmsg-utf8.txt | 4 +-
sql/signal_handler.cc | 2 +-
sql/slave.cc | 2 +-
sql/slave.h | 2 +-
sql/sp.cc | 2 +-
sql/sp.h | 2 +-
sql/sp_cache.cc | 2 +-
sql/sp_cache.h | 2 +-
sql/sp_head.cc | 4 +-
sql/sp_head.h | 2 +-
sql/sp_pcontext.cc | 2 +-
sql/sp_pcontext.h | 2 +-
sql/sp_rcontext.cc | 2 +-
sql/sp_rcontext.h | 2 +-
sql/spatial.cc | 2 +-
sql/spatial.h | 2 +-
sql/sql_acl.cc | 37 +-
sql/sql_acl.h | 2 +-
sql/sql_admin.cc | 2 +-
sql/sql_admin.h | 2 +-
sql/sql_alter.cc | 2 +-
sql/sql_alter.h | 2 +-
sql/sql_analyse.cc | 2 +-
sql/sql_analyse.h | 2 +-
sql/sql_analyze_stmt.cc | 2 +-
sql/sql_analyze_stmt.h | 2 +-
sql/sql_array.h | 2 +-
sql/sql_audit.cc | 2 +-
sql/sql_audit.h | 2 +-
sql/sql_base.cc | 112 ++--
sql/sql_base.h | 19 +-
sql/sql_basic_types.h | 2 +-
sql/sql_binlog.cc | 2 +-
sql/sql_binlog.h | 2 +-
sql/sql_bitmap.h | 2 +-
sql/sql_bootstrap.cc | 2 +-
sql/sql_bootstrap.h | 2 +-
sql/sql_builtin.cc.in | 2 +-
sql/sql_cache.cc | 2 +-
sql/sql_cache.h | 2 +-
sql/sql_callback.h | 2 +-
sql/sql_class.cc | 2 +-
sql/sql_class.h | 3 +-
sql/sql_client.cc | 2 +-
sql/sql_cmd.h | 2 +-
sql/sql_connect.cc | 2 +-
sql/sql_connect.h | 2 +-
sql/sql_const.h | 2 +-
sql/sql_crypt.cc | 2 +-
sql/sql_crypt.h | 2 +-
sql/sql_cursor.cc | 2 +-
sql/sql_cursor.h | 2 +-
sql/sql_db.cc | 24 +-
sql/sql_db.h | 4 +-
sql/sql_delete.cc | 9 +-
sql/sql_delete.h | 2 +-
sql/sql_derived.cc | 2 +-
sql/sql_derived.h | 2 +-
sql/sql_digest.cc | 2 +-
sql/sql_digest.h | 2 +-
sql/sql_digest_stream.h | 2 +-
sql/sql_do.cc | 2 +-
sql/sql_do.h | 2 +-
sql/sql_error.cc | 2 +-
sql/sql_error.h | 2 +-
sql/sql_explain.cc | 2 +-
sql/sql_explain.h | 2 +-
sql/sql_expression_cache.cc | 2 +-
sql/sql_expression_cache.h | 2 +-
sql/sql_get_diagnostics.cc | 2 +-
sql/sql_get_diagnostics.h | 2 +-
sql/sql_handler.cc | 2 +-
sql/sql_handler.h | 2 +-
sql/sql_help.cc | 2 +-
sql/sql_help.h | 2 +-
sql/sql_hset.h | 2 +-
sql/sql_insert.cc | 2 +-
sql/sql_insert.h | 2 +-
sql/sql_join_cache.cc | 2 +-
sql/sql_join_cache.h | 2 +-
sql/sql_lex.cc | 32 +-
sql/sql_lex.h | 10 +-
sql/sql_lifo_buffer.h | 2 +-
sql/sql_list.cc | 2 +-
sql/sql_list.h | 2 +-
sql/sql_load.cc | 2 +-
sql/sql_load.h | 2 +-
sql/sql_locale.cc | 2 +-
sql/sql_locale.h | 2 +-
sql/sql_manager.cc | 2 +-
sql/sql_manager.h | 2 +-
sql/sql_parse.cc | 18 +-
sql/sql_parse.h | 2 +-
sql/sql_partition.cc | 2 +-
sql/sql_partition.h | 2 +-
sql/sql_partition_admin.cc | 2 +-
sql/sql_partition_admin.h | 2 +-
sql/sql_plist.h | 2 +-
sql/sql_plugin.cc | 2 +-
sql/sql_plugin.h | 2 +-
sql/sql_plugin_compat.h | 2 +-
sql/sql_plugin_services.ic | 2 +-
sql/sql_prepare.cc | 2 +-
sql/sql_prepare.h | 2 +-
sql/sql_priv.h | 2 +-
sql/sql_profile.cc | 2 +-
sql/sql_profile.h | 2 +-
sql/sql_reload.cc | 9 +-
sql/sql_reload.h | 2 +-
sql/sql_rename.cc | 2 +-
sql/sql_rename.h | 2 +-
sql/sql_repl.cc | 2 +-
sql/sql_repl.h | 2 +-
sql/sql_select.cc | 44 +-
sql/sql_select.h | 2 +-
sql/sql_servers.cc | 2 +-
sql/sql_servers.h | 2 +-
sql/sql_show.cc | 5 +-
sql/sql_show.h | 2 +-
sql/sql_signal.cc | 2 +-
sql/sql_signal.h | 2 +-
sql/sql_sort.h | 2 +-
sql/sql_state.c | 2 +-
sql/sql_statistics.cc | 27 +-
sql/sql_statistics.h | 2 +-
sql/sql_string.cc | 23 +-
sql/sql_string.h | 2 +-
sql/sql_table.cc | 210 ++-----
sql/sql_table.h | 2 +-
sql/sql_tablespace.cc | 2 +-
sql/sql_tablespace.h | 2 +-
sql/sql_test.cc | 12 +-
sql/sql_test.h | 2 +-
sql/sql_time.cc | 2 +-
sql/sql_time.h | 2 +-
sql/sql_trigger.cc | 2 +-
sql/sql_trigger.h | 2 +-
sql/sql_truncate.cc | 16 +-
sql/sql_truncate.h | 2 +-
sql/sql_tvc.cc | 232 ++++++-
sql/sql_tvc.h | 5 +
sql/sql_type.cc | 88 ++-
sql/sql_type.h | 28 +-
sql/sql_type_int.h | 2 +-
sql/sql_type_real.h | 47 ++
sql/sql_udf.cc | 2 +-
sql/sql_udf.h | 2 +-
sql/sql_union.cc | 42 +-
sql/sql_union.h | 2 +-
sql/sql_update.cc | 38 +-
sql/sql_update.h | 2 +-
sql/sql_view.cc | 5 +-
sql/sql_view.h | 2 +-
sql/sql_window.cc | 27 +
sql/sql_yacc.yy | 35 +-
sql/sql_yacc_ora.yy | 33 +-
sql/strfunc.cc | 2 +-
sql/strfunc.h | 2 +-
sql/structs.h | 2 +-
sql/sys_vars.cc | 2 +-
sql/sys_vars.ic | 2 +-
sql/sys_vars_shared.h | 2 +-
sql/table.cc | 5 +-
sql/table.h | 3 +-
sql/table_cache.cc | 2 +-
sql/table_cache.h | 2 +-
sql/thr_malloc.cc | 2 +-
sql/thr_malloc.h | 2 +-
sql/threadpool.h | 2 +-
sql/threadpool_common.cc | 2 +-
sql/threadpool_generic.cc | 2 +-
sql/threadpool_win.cc | 2 +-
sql/transaction.cc | 2 +-
sql/transaction.h | 2 +-
sql/tzfile.h | 2 +-
sql/tztime.cc | 2 +-
sql/tztime.h | 2 +-
sql/udf_example.c | 2 +-
sql/uniques.cc | 2 +-
sql/unireg.cc | 2 +-
sql/unireg.h | 2 +-
sql/win_tzname_data.h | 136 +++++
sql/winservice.c | 2 +-
sql/winservice.h | 2 +-
sql/wsrep_applier.cc | 2 +-
sql/wsrep_applier.h | 2 +-
sql/wsrep_binlog.cc | 2 +-
sql/wsrep_binlog.h | 2 +-
sql/wsrep_check_opts.cc | 2 +-
sql/wsrep_dummy.cc | 2 +-
sql/wsrep_mysqld.cc | 2 +-
sql/wsrep_mysqld.h | 2 +-
sql/wsrep_mysqld_c.h | 2 +-
sql/wsrep_notify.cc | 2 +-
sql/wsrep_priv.h | 2 +-
sql/wsrep_sst.cc | 2 +-
sql/wsrep_sst.h | 2 +-
sql/wsrep_thd.cc | 2 +-
sql/wsrep_thd.h | 2 +-
sql/wsrep_utils.cc | 2 +-
sql/wsrep_utils.h | 2 +-
sql/wsrep_var.cc | 2 +-
sql/wsrep_var.h | 2 +-
sql/wsrep_xid.cc | 2 +-
sql/wsrep_xid.h | 2 +-
storage/archive/CMakeLists.txt | 2 +-
storage/archive/archive_reader.c | 2 +-
storage/archive/archive_test.c | 2 +-
storage/archive/ha_archive.cc | 2 +-
storage/archive/ha_archive.h | 2 +-
storage/blackhole/CMakeLists.txt | 2 +-
storage/blackhole/ha_blackhole.cc | 2 +-
storage/blackhole/ha_blackhole.h | 2 +-
storage/cassandra/ha_cassandra.cc | 2 +-
storage/cassandra/ha_cassandra.h | 2 +-
storage/connect/CMakeLists.txt | 2 +-
storage/connect/connect.cc | 2 +-
storage/connect/connect.h | 2 +-
storage/connect/filter.h | 1 +
storage/connect/ha_connect.cc | 87 ++-
storage/connect/ha_connect.h | 5 +-
storage/connect/inihandl.cpp | 2 +-
storage/connect/jmgoconn.cpp | 4 +-
storage/connect/mycat.cc | 2 +-
storage/connect/mycat.h | 2 +-
storage/connect/tabdos.cpp | 42 +-
storage/connect/tabfmt.cpp | 13 +-
storage/connect/user_connect.cc | 5 +-
storage/connect/user_connect.h | 2 +-
storage/connect/value.cpp | 97 ++-
storage/connect/value.h | 16 +-
storage/csv/CMakeLists.txt | 2 +-
storage/csv/ha_tina.cc | 2 +-
storage/csv/ha_tina.h | 2 +-
storage/csv/transparent_file.cc | 2 +-
storage/csv/transparent_file.h | 2 +-
storage/example/CMakeLists.txt | 2 +-
storage/example/ha_example.cc | 2 +-
storage/example/ha_example.h | 2 +-
storage/federated/CMakeLists.txt | 2 +-
storage/federated/ha_federated.cc | 2 +-
storage/federated/ha_federated.h | 2 +-
storage/heap/CMakeLists.txt | 2 +-
storage/heap/_check.c | 2 +-
storage/heap/_rectest.c | 2 +-
storage/heap/ha_heap.cc | 2 +-
storage/heap/ha_heap.h | 2 +-
storage/heap/heapdef.h | 2 +-
storage/heap/hp_block.c | 2 +-
storage/heap/hp_clear.c | 2 +-
storage/heap/hp_close.c | 2 +-
storage/heap/hp_create.c | 2 +-
storage/heap/hp_delete.c | 2 +-
storage/heap/hp_extra.c | 2 +-
storage/heap/hp_hash.c | 2 +-
storage/heap/hp_info.c | 2 +-
storage/heap/hp_open.c | 2 +-
storage/heap/hp_panic.c | 2 +-
storage/heap/hp_rename.c | 2 +-
storage/heap/hp_rfirst.c | 2 +-
storage/heap/hp_rkey.c | 2 +-
storage/heap/hp_rlast.c | 2 +-
storage/heap/hp_rnext.c | 2 +-
storage/heap/hp_rprev.c | 2 +-
storage/heap/hp_rrnd.c | 2 +-
storage/heap/hp_rsame.c | 2 +-
storage/heap/hp_scan.c | 2 +-
storage/heap/hp_static.c | 2 +-
storage/heap/hp_test1.c | 2 +-
storage/heap/hp_test2.c | 2 +-
storage/heap/hp_update.c | 2 +-
storage/heap/hp_write.c | 4 +-
storage/innobase/CMakeLists.txt | 2 +-
storage/innobase/btr/btr0btr.cc | 2 +-
storage/innobase/btr/btr0bulk.cc | 2 +-
storage/innobase/btr/btr0cur.cc | 2 +-
storage/innobase/btr/btr0defragment.cc | 2 +-
storage/innobase/btr/btr0pcur.cc | 2 +-
storage/innobase/btr/btr0sea.cc | 2 +-
storage/innobase/buf/buf0buddy.cc | 2 +-
storage/innobase/buf/buf0buf.cc | 2 +-
storage/innobase/buf/buf0checksum.cc | 2 +-
storage/innobase/buf/buf0dblwr.cc | 9 +-
storage/innobase/buf/buf0dump.cc | 2 +-
storage/innobase/buf/buf0flu.cc | 2 +-
storage/innobase/buf/buf0lru.cc | 2 +-
storage/innobase/buf/buf0rea.cc | 2 +-
storage/innobase/bzip2.cmake | 2 +-
storage/innobase/compile-innodb | 2 +-
storage/innobase/data/data0data.cc | 2 +-
storage/innobase/data/data0type.cc | 2 +-
storage/innobase/dict/dict0boot.cc | 2 +-
storage/innobase/dict/dict0crea.cc | 4 +-
storage/innobase/dict/dict0defrag_bg.cc | 2 +-
storage/innobase/dict/dict0dict.cc | 2 +-
storage/innobase/dict/dict0load.cc | 2 +-
storage/innobase/dict/dict0mem.cc | 2 +-
storage/innobase/dict/dict0stats.cc | 6 +-
storage/innobase/dict/dict0stats_bg.cc | 2 +-
storage/innobase/eval/eval0eval.cc | 2 +-
storage/innobase/eval/eval0proc.cc | 2 +-
storage/innobase/fil/fil0crypt.cc | 2 +-
storage/innobase/fil/fil0fil.cc | 5 +-
storage/innobase/fil/fil0pagecompress.cc | 2 +-
storage/innobase/fsp/fsp0file.cc | 2 +-
storage/innobase/fsp/fsp0fsp.cc | 2 +-
storage/innobase/fsp/fsp0space.cc | 2 +-
storage/innobase/fsp/fsp0sysspace.cc | 2 +-
storage/innobase/fts/fts0ast.cc | 2 +-
storage/innobase/fts/fts0blex.cc | 2 +-
storage/innobase/fts/fts0blex.l | 2 +-
storage/innobase/fts/fts0config.cc | 11 +-
storage/innobase/fts/fts0fts.cc | 68 +--
storage/innobase/fts/fts0opt.cc | 249 +++-----
storage/innobase/fts/fts0pars.y | 2 +-
storage/innobase/fts/fts0plugin.cc | 2 +-
storage/innobase/fts/fts0que.cc | 6 +-
storage/innobase/fts/fts0sql.cc | 105 ++--
storage/innobase/fts/fts0tlex.cc | 2 +-
storage/innobase/fts/fts0tlex.l | 2 +-
storage/innobase/fts/make_parser.sh | 2 +-
storage/innobase/fut/fut0lst.cc | 2 +-
storage/innobase/gis/gis0geo.cc | 2 +-
storage/innobase/gis/gis0rtree.cc | 11 +-
storage/innobase/gis/gis0sea.cc | 2 +-
storage/innobase/ha/ha0ha.cc | 2 +-
storage/innobase/ha/ha0storage.cc | 2 +-
storage/innobase/ha/hash0hash.cc | 2 +-
storage/innobase/handler/ha_innodb.cc | 115 ++--
storage/innobase/handler/ha_innodb.h | 2 +-
storage/innobase/handler/handler0alter.cc | 29 +-
storage/innobase/handler/i_s.cc | 105 ++--
storage/innobase/handler/i_s.h | 8 +-
storage/innobase/ibuf/ibuf0ibuf.cc | 2 +-
storage/innobase/include/btr0btr.h | 2 +-
storage/innobase/include/btr0btr.ic | 2 +-
storage/innobase/include/btr0bulk.h | 2 +-
storage/innobase/include/btr0cur.h | 2 +-
storage/innobase/include/btr0cur.ic | 2 +-
storage/innobase/include/btr0defragment.h | 2 +-
storage/innobase/include/btr0pcur.h | 2 +-
storage/innobase/include/btr0pcur.ic | 2 +-
storage/innobase/include/btr0sea.h | 2 +-
storage/innobase/include/btr0sea.ic | 2 +-
storage/innobase/include/btr0types.h | 2 +-
storage/innobase/include/buf0buddy.h | 2 +-
storage/innobase/include/buf0buddy.ic | 2 +-
storage/innobase/include/buf0buf.h | 2 +-
storage/innobase/include/buf0buf.ic | 2 +-
storage/innobase/include/buf0checksum.h | 2 +-
storage/innobase/include/buf0dblwr.h | 2 +-
storage/innobase/include/buf0dump.h | 2 +-
storage/innobase/include/buf0flu.h | 2 +-
storage/innobase/include/buf0flu.ic | 2 +-
storage/innobase/include/buf0lru.h | 2 +-
storage/innobase/include/buf0rea.h | 2 +-
storage/innobase/include/buf0types.h | 2 +-
storage/innobase/include/data0data.h | 2 +-
storage/innobase/include/data0data.ic | 2 +-
storage/innobase/include/data0type.h | 2 +-
storage/innobase/include/data0type.ic | 2 +-
storage/innobase/include/data0types.h | 2 +-
storage/innobase/include/db0err.h | 2 +-
storage/innobase/include/dict0boot.h | 2 +-
storage/innobase/include/dict0boot.ic | 2 +-
storage/innobase/include/dict0crea.h | 2 +-
storage/innobase/include/dict0crea.ic | 2 +-
storage/innobase/include/dict0defrag_bg.h | 2 +-
storage/innobase/include/dict0dict.h | 2 +-
storage/innobase/include/dict0dict.ic | 2 +-
storage/innobase/include/dict0load.h | 2 +-
storage/innobase/include/dict0mem.h | 2 +-
storage/innobase/include/dict0mem.ic | 2 +-
storage/innobase/include/dict0pagecompress.h | 2 +-
storage/innobase/include/dict0pagecompress.ic | 2 +-
storage/innobase/include/dict0priv.h | 2 +-
storage/innobase/include/dict0priv.ic | 2 +-
storage/innobase/include/dict0stats.h | 2 +-
storage/innobase/include/dict0stats.ic | 2 +-
storage/innobase/include/dict0stats_bg.h | 2 +-
storage/innobase/include/dict0types.h | 2 +-
storage/innobase/include/dyn0buf.h | 2 +-
storage/innobase/include/dyn0types.h | 2 +-
storage/innobase/include/eval0eval.h | 2 +-
storage/innobase/include/eval0eval.ic | 2 +-
storage/innobase/include/eval0proc.h | 2 +-
storage/innobase/include/eval0proc.ic | 2 +-
storage/innobase/include/fil0crypt.h | 2 +-
storage/innobase/include/fil0crypt.ic | 2 +-
storage/innobase/include/fil0fil.h | 5 +-
storage/innobase/include/fil0fil.ic | 2 +-
storage/innobase/include/fil0pagecompress.h | 2 +-
storage/innobase/include/fsp0file.h | 2 +-
storage/innobase/include/fsp0fsp.h | 2 +-
storage/innobase/include/fsp0fsp.ic | 2 +-
storage/innobase/include/fsp0pagecompress.h | 2 +-
storage/innobase/include/fsp0pagecompress.ic | 2 +-
storage/innobase/include/fsp0space.h | 2 +-
storage/innobase/include/fsp0sysspace.h | 2 +-
storage/innobase/include/fsp0types.h | 2 +-
storage/innobase/include/fts0ast.h | 2 +-
storage/innobase/include/fts0fts.h | 30 +-
storage/innobase/include/fts0opt.h | 2 +-
storage/innobase/include/fts0plugin.h | 2 +-
storage/innobase/include/fts0priv.h | 134 ++--
storage/innobase/include/fts0priv.ic | 2 +-
storage/innobase/include/fts0tokenize.h | 2 +-
storage/innobase/include/fts0types.h | 2 +-
storage/innobase/include/fts0types.ic | 2 +-
storage/innobase/include/fts0vlc.ic | 2 +-
storage/innobase/include/fut0fut.h | 2 +-
storage/innobase/include/fut0lst.h | 2 +-
storage/innobase/include/fut0lst.ic | 2 +-
storage/innobase/include/gis0geo.h | 2 +-
storage/innobase/include/gis0rtree.h | 2 +-
storage/innobase/include/gis0rtree.ic | 2 +-
storage/innobase/include/gis0type.h | 2 +-
storage/innobase/include/ha0ha.h | 2 +-
storage/innobase/include/ha0ha.ic | 2 +-
storage/innobase/include/ha0storage.h | 2 +-
storage/innobase/include/ha0storage.ic | 2 +-
storage/innobase/include/ha_prototypes.h | 2 +-
storage/innobase/include/handler0alter.h | 13 +-
storage/innobase/include/hash0hash.h | 2 +-
storage/innobase/include/hash0hash.ic | 2 +-
storage/innobase/include/ib0mutex.h | 2 +-
storage/innobase/include/ibuf0ibuf.h | 2 +-
storage/innobase/include/ibuf0ibuf.ic | 2 +-
storage/innobase/include/ibuf0types.h | 2 +-
storage/innobase/include/lock0iter.h | 2 +-
storage/innobase/include/lock0lock.h | 2 +-
storage/innobase/include/lock0lock.ic | 2 +-
storage/innobase/include/lock0prdt.h | 2 +-
storage/innobase/include/lock0priv.h | 2 +-
storage/innobase/include/lock0priv.ic | 2 +-
storage/innobase/include/lock0types.h | 2 +-
storage/innobase/include/log0crypt.h | 2 +-
storage/innobase/include/log0log.h | 6 +-
storage/innobase/include/log0log.ic | 2 +-
storage/innobase/include/log0recv.h | 2 +-
storage/innobase/include/log0types.h | 2 +-
storage/innobase/include/mach0data.h | 2 +-
storage/innobase/include/mach0data.ic | 2 +-
storage/innobase/include/mem0mem.h | 2 +-
storage/innobase/include/mem0mem.ic | 2 +-
storage/innobase/include/mtr0log.h | 2 +-
storage/innobase/include/mtr0log.ic | 2 +-
storage/innobase/include/mtr0mtr.h | 2 +-
storage/innobase/include/mtr0mtr.ic | 2 +-
storage/innobase/include/mtr0types.h | 2 +-
storage/innobase/include/os0api.h | 2 +-
storage/innobase/include/os0event.h | 2 +-
storage/innobase/include/os0file.h | 2 +-
storage/innobase/include/os0file.ic | 2 +-
storage/innobase/include/os0once.h | 2 +-
storage/innobase/include/os0proc.h | 2 +-
storage/innobase/include/os0thread.h | 2 +-
storage/innobase/include/page0cur.h | 2 +-
storage/innobase/include/page0cur.ic | 2 +-
storage/innobase/include/page0page.h | 2 +-
storage/innobase/include/page0page.ic | 2 +-
storage/innobase/include/page0types.h | 2 +-
storage/innobase/include/page0zip.h | 2 +-
storage/innobase/include/page0zip.ic | 2 +-
storage/innobase/include/pars0opt.h | 2 +-
storage/innobase/include/pars0pars.h | 2 +-
storage/innobase/include/pars0sym.h | 2 +-
storage/innobase/include/pars0types.h | 2 +-
storage/innobase/include/que0que.h | 2 +-
storage/innobase/include/que0que.ic | 2 +-
storage/innobase/include/que0types.h | 2 +-
storage/innobase/include/read0types.h | 2 +-
storage/innobase/include/rem0cmp.h | 2 +-
storage/innobase/include/rem0cmp.ic | 2 +-
storage/innobase/include/rem0rec.h | 2 +-
storage/innobase/include/rem0rec.ic | 2 +-
storage/innobase/include/rem0types.h | 2 +-
storage/innobase/include/row0ext.h | 2 +-
storage/innobase/include/row0ext.ic | 2 +-
storage/innobase/include/row0ftsort.h | 2 +-
storage/innobase/include/row0import.h | 2 +-
storage/innobase/include/row0ins.h | 2 +-
storage/innobase/include/row0log.h | 2 +-
storage/innobase/include/row0log.ic | 2 +-
storage/innobase/include/row0merge.h | 2 +-
storage/innobase/include/row0mysql.h | 2 +-
storage/innobase/include/row0purge.h | 2 +-
storage/innobase/include/row0quiesce.h | 2 +-
storage/innobase/include/row0row.h | 2 +-
storage/innobase/include/row0row.ic | 2 +-
storage/innobase/include/row0sel.h | 2 +-
storage/innobase/include/row0sel.ic | 2 +-
storage/innobase/include/row0types.h | 2 +-
storage/innobase/include/row0uins.h | 2 +-
storage/innobase/include/row0umod.h | 2 +-
storage/innobase/include/row0undo.h | 2 +-
storage/innobase/include/row0upd.h | 2 +-
storage/innobase/include/row0upd.ic | 2 +-
storage/innobase/include/row0vers.h | 2 +-
storage/innobase/include/srv0conc.h | 2 +-
storage/innobase/include/srv0mon.h | 2 +-
storage/innobase/include/srv0mon.ic | 2 +-
storage/innobase/include/srv0srv.h | 2 +-
storage/innobase/include/srv0start.h | 2 +-
storage/innobase/include/sync0arr.h | 2 +-
storage/innobase/include/sync0arr.ic | 2 +-
storage/innobase/include/sync0debug.h | 2 +-
storage/innobase/include/sync0policy.h | 2 +-
storage/innobase/include/sync0rw.h | 2 +-
storage/innobase/include/sync0rw.ic | 2 +-
storage/innobase/include/sync0sync.h | 2 +-
storage/innobase/include/sync0types.h | 2 +-
storage/innobase/include/trx0i_s.h | 2 +-
storage/innobase/include/trx0purge.h | 2 +-
storage/innobase/include/trx0purge.ic | 2 +-
storage/innobase/include/trx0rec.h | 2 +-
storage/innobase/include/trx0rec.ic | 2 +-
storage/innobase/include/trx0roll.h | 2 +-
storage/innobase/include/trx0rseg.h | 2 +-
storage/innobase/include/trx0rseg.ic | 2 +-
storage/innobase/include/trx0sys.h | 2 +-
storage/innobase/include/trx0trx.h | 2 +-
storage/innobase/include/trx0trx.ic | 2 +-
storage/innobase/include/trx0types.h | 2 +-
storage/innobase/include/trx0undo.h | 2 +-
storage/innobase/include/trx0undo.ic | 2 +-
storage/innobase/include/trx0xa.h | 2 +-
storage/innobase/include/univ.i | 2 +-
storage/innobase/include/ut0byte.h | 2 +-
storage/innobase/include/ut0byte.ic | 2 +-
storage/innobase/include/ut0counter.h | 2 +-
storage/innobase/include/ut0crc32.h | 2 +-
storage/innobase/include/ut0dbg.h | 2 +-
storage/innobase/include/ut0list.h | 2 +-
storage/innobase/include/ut0list.ic | 2 +-
storage/innobase/include/ut0lst.h | 2 +-
storage/innobase/include/ut0mem.h | 2 +-
storage/innobase/include/ut0mem.ic | 2 +-
storage/innobase/include/ut0mutex.h | 2 +-
storage/innobase/include/ut0new.h | 2 +-
storage/innobase/include/ut0pool.h | 2 +-
storage/innobase/include/ut0rbt.h | 2 +-
storage/innobase/include/ut0rnd.h | 2 +-
storage/innobase/include/ut0rnd.ic | 2 +-
storage/innobase/include/ut0sort.h | 2 +-
storage/innobase/include/ut0stage.h | 2 +-
storage/innobase/include/ut0timer.h | 2 +-
storage/innobase/include/ut0timer.ic | 2 +-
storage/innobase/include/ut0ut.h | 2 +-
storage/innobase/include/ut0ut.ic | 2 +-
storage/innobase/include/ut0vec.h | 2 +-
storage/innobase/include/ut0vec.ic | 2 +-
storage/innobase/include/ut0wqueue.h | 2 +-
storage/innobase/lock/lock0iter.cc | 2 +-
storage/innobase/lock/lock0lock.cc | 2 +-
storage/innobase/lock/lock0prdt.cc | 2 +-
storage/innobase/lock/lock0wait.cc | 2 +-
storage/innobase/log/log0crypt.cc | 2 +-
storage/innobase/log/log0log.cc | 117 +---
storage/innobase/log/log0recv.cc | 2 +-
storage/innobase/lz4.cmake | 2 +-
storage/innobase/lzma.cmake | 2 +-
storage/innobase/lzo.cmake | 2 +-
storage/innobase/mach/mach0data.cc | 2 +-
storage/innobase/mem/mem0mem.cc | 2 +-
storage/innobase/mtr/mtr0log.cc | 2 +-
storage/innobase/mtr/mtr0mtr.cc | 2 +-
storage/innobase/os/os0event.cc | 2 +-
storage/innobase/os/os0file.cc | 2 +-
storage/innobase/os/os0proc.cc | 2 +-
storage/innobase/os/os0thread.cc | 2 +-
storage/innobase/page/page0cur.cc | 2 +-
storage/innobase/page/page0page.cc | 2 +-
storage/innobase/page/page0zip.cc | 2 +-
storage/innobase/pars/lexyy.cc | 2 +-
storage/innobase/pars/make_bison.sh | 2 +-
storage/innobase/pars/make_flex.sh | 2 +-
storage/innobase/pars/pars0grm.y | 2 +-
storage/innobase/pars/pars0lex.l | 2 +-
storage/innobase/pars/pars0opt.cc | 2 +-
storage/innobase/pars/pars0pars.cc | 2 +-
storage/innobase/pars/pars0sym.cc | 2 +-
storage/innobase/que/que0que.cc | 2 +-
storage/innobase/read/read0read.cc | 4 +-
storage/innobase/rem/rem0cmp.cc | 2 +-
storage/innobase/rem/rem0rec.cc | 2 +-
storage/innobase/row/row0ext.cc | 2 +-
storage/innobase/row/row0ftsort.cc | 3 +-
storage/innobase/row/row0import.cc | 2 +-
storage/innobase/row/row0ins.cc | 2 +-
storage/innobase/row/row0log.cc | 2 +-
storage/innobase/row/row0merge.cc | 6 +-
storage/innobase/row/row0mysql.cc | 8 +-
storage/innobase/row/row0purge.cc | 10 +-
storage/innobase/row/row0quiesce.cc | 2 +-
storage/innobase/row/row0row.cc | 2 +-
storage/innobase/row/row0sel.cc | 2 +-
storage/innobase/row/row0uins.cc | 2 +-
storage/innobase/row/row0umod.cc | 4 +-
storage/innobase/row/row0undo.cc | 2 +-
storage/innobase/row/row0upd.cc | 2 +-
storage/innobase/row/row0vers.cc | 2 +-
storage/innobase/snappy.cmake | 2 +-
storage/innobase/srv/srv0conc.cc | 2 +-
storage/innobase/srv/srv0mon.cc | 30 +-
storage/innobase/srv/srv0srv.cc | 2 +-
storage/innobase/srv/srv0start.cc | 2 +-
storage/innobase/sync/sync0arr.cc | 2 +-
storage/innobase/sync/sync0debug.cc | 2 +-
storage/innobase/sync/sync0rw.cc | 4 +-
storage/innobase/sync/sync0sync.cc | 2 +-
storage/innobase/trx/trx0i_s.cc | 32 +-
storage/innobase/trx/trx0purge.cc | 2 +-
storage/innobase/trx/trx0rec.cc | 2 +-
storage/innobase/trx/trx0roll.cc | 2 +-
storage/innobase/trx/trx0rseg.cc | 2 +-
storage/innobase/trx/trx0sys.cc | 2 +-
storage/innobase/trx/trx0trx.cc | 2 +-
storage/innobase/trx/trx0undo.cc | 2 +-
storage/innobase/ut/ut0crc32.cc | 4 +-
storage/innobase/ut/ut0dbg.cc | 2 +-
storage/innobase/ut/ut0list.cc | 2 +-
storage/innobase/ut/ut0mem.cc | 2 +-
storage/innobase/ut/ut0new.cc | 2 +-
storage/innobase/ut/ut0rbt.cc | 2 +-
storage/innobase/ut/ut0rnd.cc | 2 +-
storage/innobase/ut/ut0timer.cc | 36 +-
storage/innobase/ut/ut0ut.cc | 2 +-
storage/innobase/ut/ut0vec.cc | 2 +-
storage/innobase/ut/ut0wqueue.cc | 2 +-
storage/maria/CMakeLists.txt | 2 +-
storage/maria/ft_maria.c | 2 +-
storage/maria/ha_maria.cc | 96 +--
storage/maria/ha_maria.h | 9 +-
storage/maria/lockman.c | 2 +-
storage/maria/lockman.h | 2 +-
storage/maria/ma_bitmap.c | 2 +-
storage/maria/ma_blockrec.c | 2 +-
storage/maria/ma_blockrec.h | 2 +-
storage/maria/ma_cache.c | 2 +-
storage/maria/ma_changed.c | 2 +-
storage/maria/ma_check.c | 2 +-
storage/maria/ma_check_standalone.h | 2 +-
storage/maria/ma_checkpoint.c | 2 +-
storage/maria/ma_checkpoint.h | 2 +-
storage/maria/ma_checksum.c | 2 +-
storage/maria/ma_close.c | 2 +-
storage/maria/ma_commit.c | 2 +-
storage/maria/ma_commit.h | 2 +-
storage/maria/ma_control_file.c | 2 +-
storage/maria/ma_control_file.h | 2 +-
storage/maria/ma_create.c | 2 +-
storage/maria/ma_crypt.c | 2 +-
storage/maria/ma_crypt.h | 2 +-
storage/maria/ma_dbug.c | 2 +-
storage/maria/ma_delete.c | 2 +-
storage/maria/ma_delete_all.c | 2 +-
storage/maria/ma_delete_table.c | 2 +-
storage/maria/ma_dynrec.c | 2 +-
storage/maria/ma_extra.c | 2 +-
storage/maria/ma_ft_boolean_search.c | 2 +-
storage/maria/ma_ft_eval.c | 2 +-
storage/maria/ma_ft_eval.h | 2 +-
storage/maria/ma_ft_nlq_search.c | 2 +-
storage/maria/ma_ft_parser.c | 2 +-
storage/maria/ma_ft_stem.c | 2 +-
storage/maria/ma_ft_test1.c | 2 +-
storage/maria/ma_ft_test1.h | 2 +-
storage/maria/ma_ft_update.c | 2 +-
storage/maria/ma_ftdefs.h | 2 +-
storage/maria/ma_fulltext.h | 2 +-
storage/maria/ma_info.c | 2 +-
storage/maria/ma_init.c | 2 +-
storage/maria/ma_key.c | 2 +-
storage/maria/ma_key_recover.c | 2 +-
storage/maria/ma_key_recover.h | 2 +-
storage/maria/ma_keycache.c | 2 +-
storage/maria/ma_locking.c | 2 +-
storage/maria/ma_loghandler.c | 2 +-
storage/maria/ma_loghandler.h | 2 +-
storage/maria/ma_loghandler_lsn.h | 2 +-
storage/maria/ma_norec.c | 2 +-
storage/maria/ma_open.c | 2 +-
storage/maria/ma_packrec.c | 2 +-
storage/maria/ma_page.c | 2 +-
storage/maria/ma_pagecache.c | 2 +-
storage/maria/ma_pagecache.h | 2 +-
storage/maria/ma_pagecaches.c | 2 +-
storage/maria/ma_pagecrc.c | 2 +-
storage/maria/ma_panic.c | 2 +-
storage/maria/ma_preload.c | 2 +-
storage/maria/ma_range.c | 2 +-
storage/maria/ma_recovery.c | 2 +-
storage/maria/ma_recovery.h | 2 +-
storage/maria/ma_recovery_util.c | 2 +-
storage/maria/ma_recovery_util.h | 2 +-
storage/maria/ma_rename.c | 2 +-
storage/maria/ma_rfirst.c | 2 +-
storage/maria/ma_rkey.c | 2 +-
storage/maria/ma_rlast.c | 2 +-
storage/maria/ma_rnext.c | 2 +-
storage/maria/ma_rnext_same.c | 2 +-
storage/maria/ma_rprev.c | 2 +-
storage/maria/ma_rrnd.c | 2 +-
storage/maria/ma_rsame.c | 2 +-
storage/maria/ma_rsamepos.c | 2 +-
storage/maria/ma_rt_index.c | 2 +-
storage/maria/ma_rt_index.h | 2 +-
storage/maria/ma_rt_key.c | 2 +-
storage/maria/ma_rt_key.h | 2 +-
storage/maria/ma_rt_mbr.c | 2 +-
storage/maria/ma_rt_mbr.h | 2 +-
storage/maria/ma_rt_split.c | 2 +-
storage/maria/ma_rt_test.c | 2 +-
storage/maria/ma_scan.c | 2 +-
storage/maria/ma_search.c | 2 +-
storage/maria/ma_servicethread.c | 2 +-
storage/maria/ma_servicethread.h | 2 +-
storage/maria/ma_sort.c | 2 +-
storage/maria/ma_sp_defs.h | 2 +-
storage/maria/ma_sp_key.c | 2 +-
storage/maria/ma_sp_test.c | 2 +-
storage/maria/ma_state.c | 2 +-
storage/maria/ma_state.h | 2 +-
storage/maria/ma_static.c | 2 +-
storage/maria/ma_statrec.c | 2 +-
storage/maria/ma_test1.c | 2 +-
storage/maria/ma_test2.c | 2 +-
storage/maria/ma_test3.c | 2 +-
storage/maria/ma_trnman.h | 2 +-
storage/maria/ma_unique.c | 2 +-
storage/maria/ma_update.c | 2 +-
storage/maria/ma_write.c | 6 +-
storage/maria/maria_chk.c | 2 +-
storage/maria/maria_def.h | 2 +-
storage/maria/maria_dump_log.c | 2 +-
storage/maria/maria_ftdump.c | 2 +-
storage/maria/maria_pack.c | 2 +-
storage/maria/maria_read_log.c | 2 +-
storage/maria/tablockman.c | 2 +-
storage/maria/tablockman.h | 2 +-
storage/maria/trnman.c | 2 +-
storage/maria/trnman.h | 2 +-
storage/maria/trnman_public.h | 2 +-
storage/maria/unittest/CMakeLists.txt | 2 +-
storage/maria/unittest/lockman-t.c | 2 +-
storage/maria/unittest/lockman1-t.c | 2 +-
storage/maria/unittest/lockman2-t.c | 2 +-
storage/maria/unittest/ma_control_file-t.c | 2 +-
storage/maria/unittest/ma_loghandler_examples.c | 2 +-
storage/maria/unittest/ma_maria_log_cleanup.c | 2 +-
storage/maria/unittest/ma_pagecache_consist.c | 2 +-
storage/maria/unittest/ma_pagecache_rwconsist.c | 2 +-
storage/maria/unittest/ma_pagecache_rwconsist2.c | 2 +-
storage/maria/unittest/ma_pagecache_single.c | 2 +-
storage/maria/unittest/ma_test_loghandler-t.c | 2 +-
.../unittest/ma_test_loghandler_first_lsn-t.c | 2 +-
.../maria/unittest/ma_test_loghandler_max_lsn-t.c | 2 +-
.../unittest/ma_test_loghandler_multigroup-t.c | 2 +-
.../unittest/ma_test_loghandler_multithread-t.c | 2 +-
.../maria/unittest/ma_test_loghandler_noflush-t.c | 2 +-
.../maria/unittest/ma_test_loghandler_nologs-t.c | 2 +-
.../unittest/ma_test_loghandler_pagecache-t.c | 2 +-
.../maria/unittest/ma_test_loghandler_purge-t.c | 2 +-
storage/maria/unittest/sequence_storage.c | 2 +-
storage/maria/unittest/sequence_storage.h | 2 +-
storage/maria/unittest/test_file.c | 2 +-
storage/maria/unittest/test_file.h | 2 +-
storage/maria/unittest/trnman-t.c | 2 +-
storage/mroonga/CMakeLists.txt | 2 +-
storage/mroonga/COPYING | 4 +-
.../mroonga/build/cmake_modules/ReadFileList.cmake | 2 +-
storage/mroonga/config.sh.in | 2 +-
storage/mroonga/ha_mroonga.cpp | 2 +-
storage/mroonga/ha_mroonga.hpp | 2 +-
.../mroonga/lib/mrn_auto_increment_value_lock.cpp | 2 +-
.../mroonga/lib/mrn_auto_increment_value_lock.hpp | 2 +-
storage/mroonga/lib/mrn_column_name.cpp | 2 +-
storage/mroonga/lib/mrn_column_name.hpp | 2 +-
storage/mroonga/lib/mrn_condition_converter.cpp | 2 +-
storage/mroonga/lib/mrn_condition_converter.hpp | 2 +-
storage/mroonga/lib/mrn_context_pool.cpp | 2 +-
storage/mroonga/lib/mrn_context_pool.hpp | 2 +-
storage/mroonga/lib/mrn_count_skip_checker.cpp | 2 +-
storage/mroonga/lib/mrn_count_skip_checker.hpp | 2 +-
storage/mroonga/lib/mrn_current_thread.hpp | 2 +-
storage/mroonga/lib/mrn_database.cpp | 2 +-
storage/mroonga/lib/mrn_database.hpp | 2 +-
storage/mroonga/lib/mrn_database_manager.cpp | 2 +-
storage/mroonga/lib/mrn_database_manager.hpp | 2 +-
storage/mroonga/lib/mrn_database_repairer.cpp | 2 +-
storage/mroonga/lib/mrn_database_repairer.hpp | 2 +-
storage/mroonga/lib/mrn_debug_column_access.cpp | 2 +-
storage/mroonga/lib/mrn_debug_column_access.hpp | 2 +-
storage/mroonga/lib/mrn_encoding.cpp | 2 +-
storage/mroonga/lib/mrn_encoding.hpp | 2 +-
storage/mroonga/lib/mrn_external_lock.cpp | 2 +-
storage/mroonga/lib/mrn_external_lock.hpp | 2 +-
storage/mroonga/lib/mrn_field_normalizer.cpp | 2 +-
storage/mroonga/lib/mrn_field_normalizer.hpp | 2 +-
storage/mroonga/lib/mrn_grn.hpp | 2 +-
storage/mroonga/lib/mrn_index_column_name.cpp | 2 +-
storage/mroonga/lib/mrn_index_column_name.hpp | 2 +-
storage/mroonga/lib/mrn_index_table_name.cpp | 2 +-
storage/mroonga/lib/mrn_index_table_name.hpp | 2 +-
storage/mroonga/lib/mrn_lock.cpp | 2 +-
storage/mroonga/lib/mrn_lock.hpp | 2 +-
.../lib/mrn_match_escalation_threshold_scope.cpp | 2 +-
.../lib/mrn_match_escalation_threshold_scope.hpp | 2 +-
.../mroonga/lib/mrn_multiple_column_key_codec.cpp | 2 +-
.../mroonga/lib/mrn_multiple_column_key_codec.hpp | 2 +-
storage/mroonga/lib/mrn_mysqlservices.cpp | 2 +-
storage/mroonga/lib/mrn_operation.cpp | 2 +-
storage/mroonga/lib/mrn_operation.hpp | 2 +-
storage/mroonga/lib/mrn_operations.cpp | 2 +-
storage/mroonga/lib/mrn_operations.hpp | 2 +-
storage/mroonga/lib/mrn_parameters_parser.cpp | 2 +-
storage/mroonga/lib/mrn_parameters_parser.hpp | 2 +-
storage/mroonga/lib/mrn_path_mapper.cpp | 2 +-
storage/mroonga/lib/mrn_path_mapper.hpp | 2 +-
storage/mroonga/lib/mrn_query_parser.cpp | 2 +-
storage/mroonga/lib/mrn_query_parser.hpp | 2 +-
storage/mroonga/lib/mrn_smart_bitmap.cpp | 2 +-
storage/mroonga/lib/mrn_smart_bitmap.hpp | 2 +-
storage/mroonga/lib/mrn_smart_grn_obj.cpp | 2 +-
storage/mroonga/lib/mrn_smart_grn_obj.hpp | 2 +-
.../mroonga/lib/mrn_table_fields_offset_mover.cpp | 2 +-
.../mroonga/lib/mrn_table_fields_offset_mover.hpp | 2 +-
storage/mroonga/lib/mrn_time_converter.cpp | 2 +-
storage/mroonga/lib/mrn_time_converter.hpp | 2 +-
storage/mroonga/lib/mrn_value_decoder.cpp | 2 +-
storage/mroonga/lib/mrn_value_decoder.hpp | 2 +-
storage/mroonga/lib/mrn_windows.hpp | 2 +-
storage/mroonga/mrn_constants.hpp | 2 +-
storage/mroonga/mrn_err.h | 2 +-
storage/mroonga/mrn_macro.hpp | 2 +-
storage/mroonga/mrn_mysql.h | 2 +-
storage/mroonga/mrn_mysql_compat.h | 2 +-
storage/mroonga/mrn_table.cpp | 2 +-
storage/mroonga/mrn_table.hpp | 2 +-
storage/mroonga/mrn_variables.hpp | 2 +-
storage/mroonga/mrn_version.h.in | 2 +-
.../mroonga/include/mroonga/check_64bit.inc | 2 +-
.../mroonga/include/mroonga/check_freebsd.inc | 2 +-
.../include/mroonga/check_ha_mroonga_so.inc | 2 +-
.../include/mroonga/check_libgroonga_embedded.inc | 2 +-
.../mroonga/check_libgroonga_support_lz4.inc | 2 +-
.../mroonga/check_libgroonga_support_zlib.inc | 2 +-
.../mroonga/check_libgroonga_support_zstd.inc | 2 +-
.../mroonga/include/mroonga/check_mariadb.inc | 2 +-
.../mroonga/include/mroonga/check_osx.inc | 2 +-
.../mroonga/include/mroonga/check_solaris.inc | 2 +-
.../include/mroonga/check_strict_sql_mode.inc | 2 +-
.../mroonga/include/mroonga/check_version.inc | 2 +-
.../mroonga/include/mroonga/check_windows.inc | 2 +-
.../include/mroonga/have_fractional_seconds.inc | 2 +-
.../mroonga/include/mroonga/have_freebsd.inc | 2 +-
.../mroonga/have_groonga_plugin_register.inc | 2 +-
.../mroonga/include/mroonga/have_mariadb.inc | 2 +-
.../include/mroonga/have_mariadb_10_2_or_later.inc | 2 +-
.../mroonga/include/mroonga/have_mroonga.inc | 2 +-
.../include/mroonga/have_mroonga_deinit.inc | 2 +-
.../include/mroonga/have_mroonga_helper.inc | 2 +-
.../mroonga/include/mroonga/have_mysql.inc | 2 +-
.../include/mroonga/have_mysql_5_7_or_later.inc | 2 +-
.../include/mroonga/have_signed_64bit_time_t.inc | 2 +-
.../mroonga/include/mroonga/have_solaris.inc | 2 +-
.../include/mroonga/have_strict_sql_mode.inc | 2 +-
.../mroonga/include/mroonga/have_version_10_0.inc | 2 +-
.../include/mroonga/have_version_10_0_or_later.inc | 2 +-
.../mroonga/include/mroonga/have_version_5_5.inc | 2 +-
.../mroonga/include/mroonga/have_version_5_6.inc | 2 +-
.../include/mroonga/have_version_5_6_or_later.inc | 2 +-
.../mroonga/include/mroonga/have_version_5_7.inc | 2 +-
.../include/mroonga/have_version_5_7_or_later.inc | 2 +-
.../include/mroonga/load_mroonga_functions.inc | 2 +-
.../mroonga/include/mroonga/skip_freebsd.inc | 2 +-
.../include/mroonga/skip_mariadb_10_0_or_later.inc | 2 +-
.../mroonga/include/mroonga/skip_mariadb_10_1.inc | 2 +-
.../mroonga/skip_mariadb_10_1_or_earlier.inc | 2 +-
.../include/mroonga/skip_mariadb_10_2_or_later.inc | 2 +-
.../mroonga/include/mroonga/skip_mariadb_5_5.inc | 2 +-
.../mroonga/include/mroonga/skip_mysql_5_5.inc | 2 +-
.../mroonga/include/mroonga/skip_mysql_5_7.inc | 2 +-
.../include/mroonga/skip_mysql_5_7_or_later.inc | 2 +-
.../mroonga/include/mroonga/skip_osx.inc | 2 +-
.../include/mroonga/skip_signed_64bit_time_t.inc | 2 +-
.../mroonga/include/mroonga/skip_solaris.inc | 2 +-
.../include/mroonga/skip_strict_sql_mode.inc | 2 +-
.../include/mroonga/support_libgroonga_lz4.inc | 2 +-
.../include/mroonga/support_libgroonga_zlib.inc | 2 +-
.../include/mroonga/support_libgroonga_zstd.inc | 2 +-
.../include/mroonga/unload_mroonga_functions.inc | 2 +-
.../include/mroonga/unsupport_libgroonga_lz4.inc | 2 +-
.../include/mroonga/unsupport_libgroonga_zlib.inc | 2 +-
.../include/mroonga/unsupport_libgroonga_zstd.inc | 2 +-
.../storage/t/alter_table_add_column_after.test | 2 +-
.../storage/t/alter_table_add_column_first.test | 2 +-
.../t/alter_table_add_column_flags_comment.test | 2 +-
.../t/alter_table_add_column_flags_parameter.test | 2 +-
...lter_table_add_column_groonga_type_comment.test | 2 +-
...er_table_add_column_groonga_type_parameter.test | 2 +-
.../t/alter_table_add_column_multibyte_cp932.test | 2 +-
.../t/alter_table_add_column_multibyte_utf8.test | 2 +-
.../storage/t/alter_table_add_column_multiple.test | 2 +-
.../storage/t/alter_table_add_column_plain.test | 2 +-
.../t/alter_table_add_column_type_comment.test | 2 +-
...e_add_index_token_filters_one_token_filter.test | 2 +-
.../t/alter_table_add_index_unique_duplicated.test | 2 +-
...dd_index_unique_multiple_column_duplicated.test | 2 +-
...er_table_add_key_multiple_column_with_data.test | 2 +-
.../storage/t/alter_table_add_primary_key.test | 2 +-
...able_change_column_comment_not_for_mroonga.test | 2 +-
.../t/alter_table_change_column_have_index.test | 2 +-
.../t/alter_table_change_column_rename_after.test | 2 +-
.../t/alter_table_change_column_rename_first.test | 2 +-
.../alter_table_change_column_rename_multiple.test | 2 +-
.../alter_table_change_column_rename_no_order.test | 2 +-
.../t/alter_table_change_engine_decimal.test | 2 +-
.../alter_table_change_engine_fulltext_index.test | 2 +-
.../storage/t/alter_table_change_token_filter.test | 2 +-
.../alter_table_disable_keys_create_fulltext.test | 2 +-
.../t/alter_table_disable_keys_fulltext_table.test | 2 +-
.../t/alter_table_disable_keys_fulltext_ujis.test | 2 +-
.../t/alter_table_disable_keys_fulltext_utf8.test | 2 +-
.../alter_table_disable_keys_multiple_column.test | 2 +-
.../storage/t/alter_table_disable_keys_normal.test | 2 +-
.../t/alter_table_disable_keys_primary.test | 2 +-
.../t/alter_table_disable_keys_truncate.test | 2 +-
.../t/alter_table_disable_keys_updating.test | 2 +-
.../t/alter_table_drop_column_multiple.test | 2 +-
.../storage/t/alter_table_drop_column_one.test | 2 +-
...r_table_drop_key_multiple_column_with_data.test | 2 +-
.../storage/t/alter_table_drop_primary_key.test | 2 +-
.../t/alter_table_enable_keys_fulltext.test | 2 +-
.../t/alter_table_enable_keys_fulltext_table.test | 2 +-
.../t/alter_table_enable_keys_fulltext_ujis.test | 2 +-
.../t/alter_table_enable_keys_fulltext_utf8.test | 2 +-
.../t/alter_table_enable_keys_multiple_column.test | 2 +-
.../storage/t/alter_table_enable_keys_normal.test | 2 +-
.../storage/t/alter_table_enable_keys_primary.test | 2 +-
.../t/alter_table_fulltext_add_no_primary_key.test | 2 +-
.../storage/t/alter_table_fulltext_add_normal.test | 2 +-
.../storage/t/alter_table_fulltext_add_table.test | 2 +-
.../storage/t/alter_table_fulltext_drop_table.test | 2 +-
.../storage/t/alter_table_modify_column_after.test | 2 +-
.../storage/t/alter_table_modify_column_first.test | 2 +-
.../t/alter_table_modify_column_no_order.test | 2 +-
...ter_table_recreate_anonymous_index_at_once.test | 2 +-
.../storage/t/alter_table_rename_table.test | 2 +-
.../mroonga/storage/t/alter_table_spatial.test | 2 +-
.../storage/t/auto_increment_TODO_SPLIT_ME.test | 2 +-
.../storage/t/auto_increment_table_param.test | 2 +-
.../mroonga/storage/t/auto_increment_text.test | 2 +-
.../mroonga/storage/t/binlog_TODO_SPLIT_ME.test | 2 +-
.../mroonga/storage/t/check_table_broken.test | 2 +-
.../mroonga/storage/t/check_table_not_broken.test | 2 +-
.../t/collation_utf8_general_ci_french.test | 2 +-
.../t/collation_utf8_unicode_520_ci_french.test | 2 +-
.../t/collation_utf8_unicode_520_ci_japanese.test | 2 +-
.../t/collation_utf8_unicode_ci_french.test | 2 +-
.../t/collation_utf8_unicode_ci_japanese.test | 2 +-
.../t/column_comment_index_not_for_mroonga.test | 2 +-
.../t/column_comment_normal_not_for_mroonga.test | 2 +-
.../mroonga/storage/t/column_date_with_index.test | 2 +-
.../storage/t/column_date_without_index.test | 2 +-
.../mroonga/storage/t/column_date_zero_date.test | 2 +-
.../storage/t/column_datetime_32bit_2038.test | 2 +-
.../t/column_datetime_32bit_before_unix_epoch.test | 2 +-
.../storage/t/column_datetime_32bit_max.test | 2 +-
.../t/column_datetime_32bit_out_of_range.test | 2 +-
.../storage/t/column_datetime_64bit_2038.test | 2 +-
.../t/column_datetime_64bit_before_unix_epoch.test | 2 +-
.../storage/t/column_datetime_64bit_max.test | 2 +-
...atetime_64bit_strict_sql_mode_out_of_range.test | 2 +-
...mn_datetime_64bit_version_5_5_out_of_range.test | 2 +-
...me_64bit_version_5_6_or_later_out_of_range.test | 2 +-
...umn_datetime_fractional_seconds_with_index.test | 2 +-
..._datetime_fractional_seconds_without_index.test | 2 +-
.../column_datetime_freebsd_before_unix_epoch.test | 2 +-
...n_datetime_mariadb_10_2_or_later_zero_date.test | 2 +-
...etime_mariadb_10_2_or_later_zero_month_day.test | 2 +-
...lumn_datetime_mysql_5_7_or_later_zero_date.test | 2 +-
...datetime_mysql_5_7_or_later_zero_month_day.test | 2 +-
.../mroonga/storage/t/column_datetime_null.test | 2 +-
.../storage/t/column_datetime_with_index.test | 2 +-
.../storage/t/column_datetime_without_index.test | 2 +-
.../storage/t/column_datetime_zero_date.test | 2 +-
.../storage/t/column_datetime_zero_month_day.test | 2 +-
...lumn_decimal_fractional_seconds_with_index.test | 2 +-
...n_decimal_fractional_seconds_without_index.test | 2 +-
.../storage/t/column_decimal_with_index.test | 2 +-
.../storage/t/column_decimal_without_index.test | 2 +-
.../storage/t/column_enum_less_with_index.test | 2 +-
.../storage/t/column_enum_many_with_index.test | 2 +-
.../t/column_generated_stored_add_column.test | 2 +-
.../storage/t/column_generated_stored_delete.test | 2 +-
.../t/column_generated_stored_drop_column.test | 2 +-
.../storage/t/column_generated_stored_insert.test | 2 +-
.../storage/t/column_generated_stored_reindex.test | 2 +-
.../storage/t/column_generated_stored_update.test | 2 +-
.../t/column_generated_virtual_add_column.test | 2 +-
.../storage/t/column_generated_virtual_delete.test | 2 +-
.../t/column_generated_virtual_drop_column.test | 2 +-
.../storage/t/column_generated_virtual_insert.test | 2 +-
...ed_virtual_mariadb_10_2_or_later_add_index.test | 2 +-
...iadb_10_2_or_later_create_table_with_index.test | 2 +-
...rated_virtual_mysql_5_7_or_later_add_index.test | 2 +-
.../storage/t/column_generated_virtual_update.test | 2 +-
.../mroonga/storage/t/column_groonga__id__id.test | 2 +-
.../storage/t/column_groonga__id_invalid_id.test | 2 +-
.../column_groonga_index_fulltext_other_table.test | 2 +-
..._groonga_index_fulltext_vector_other_table.test | 2 +-
.../t/column_groonga_index_int_other_table.test | 2 +-
.../storage/t/column_groonga_scalar_reference.test | 2 +-
.../t/column_groonga_scalar_support_lz4.test | 2 +-
.../t/column_groonga_scalar_support_zlib.test | 2 +-
.../t/column_groonga_scalar_support_zstd.test | 2 +-
.../t/column_groonga_scalar_unsupport_lz4.test | 2 +-
.../t/column_groonga_scalar_unsupport_zlib.test | 2 +-
.../t/column_groonga_scalar_unsupport_zstd.test | 2 +-
...roonga_scalar_with_not_for_mroonga_comment.test | 2 +-
...lumn_groonga_vector_order_by_with_function.test | 2 +-
.../storage/t/column_groonga_vector_reference.test | 2 +-
.../t/column_int_with_index_zero_value.test | 2 +-
.../mroonga/storage/t/column_json_insert.test | 2 +-
.../mroonga/storage/t/column_multibyte_cp932.test | 2 +-
.../mroonga/storage/t/column_multibyte_utf8.test | 2 +-
.../storage/t/column_set_16_with_index.test | 2 +-
.../storage/t/column_set_24_with_index.test | 2 +-
.../storage/t/column_set_32_with_index.test | 2 +-
.../storage/t/column_set_64_with_index.test | 2 +-
.../mroonga/storage/t/column_set_8_with_index.test | 2 +-
.../storage/t/column_signed_bigint_with_index.test | 2 +-
.../storage/t/column_signed_int_with_index.test | 2 +-
.../t/column_signed_mediumint_with_index.test | 2 +-
.../t/column_signed_smallint_with_index.test | 2 +-
.../t/column_signed_tinyint_with_index.test | 2 +-
.../column_time_fractional_seconds_with_index.test | 2 +-
.../mroonga/storage/t/column_time_with_index.test | 2 +-
...mn_timestamp_fractional_seconds_with_index.test | 2 +-
.../storage/t/column_timestamp_with_index.test | 2 +-
.../storage/t/column_tinyint_without_index.test | 2 +-
.../t/column_unsigned_bigint_with_index.test | 2 +-
.../t/column_unsigned_bigint_without_index.test | 2 +-
.../storage/t/column_unsigned_int_with_index.test | 2 +-
.../t/column_unsigned_mediumint_with_index.test | 2 +-
.../t/column_unsigned_smallint_with_index.test | 2 +-
.../t/column_unsigned_tinyint_with_index.test | 2 +-
.../mroonga/storage/t/column_year_with_index.test | 2 +-
.../storage/t/column_year_without_index.test | 2 +-
.../mysql-test/mroonga/storage/t/count_star.test | 2 +-
.../storage/t/create_database_name_slash.test | 2 +-
.../storage/t/create_table_TODO_SPLIT_ME.test | 2 +-
.../t/create_table_column_flags_comment.test | 2 +-
.../t/create_table_column_flags_parameter.test | 2 +-
.../create_table_column_groonga_type_comment.test | 2 +-
...eate_table_column_groonga_type_nonexistent.test | 2 +-
...create_table_column_groonga_type_parameter.test | 2 +-
.../t/create_table_column_type_comment.test | 2 +-
.../t/create_table_column_type_nonexistent.test | 2 +-
.../storage/t/create_table_comment_normal.test | 2 +-
.../storage/t/create_table_default_tokenizer.test | 2 +-
.../t/create_table_index_flags_comment.test | 2 +-
.../t/create_table_index_flags_index_medium.test | 2 +-
.../t/create_table_index_flags_index_small.test | 2 +-
.../storage/t/create_table_index_flags_none.test | 2 +-
.../t/create_table_index_flags_parameter.test | 2 +-
.../t/create_table_index_index_flags_none.test | 2 +-
..._index_flags_with_position_and_with_weight.test | 2 +-
.../t/create_table_index_normalizer_comment.test | 2 +-
..._table_index_normalizer_fulltext_index_bin.test | 2 +-
.../t/create_table_index_normalizer_index_bin.test | 2 +-
...lizer_no_utf8_charset_with_utf8_normalizer.test | 2 +-
.../t/create_table_index_normalizer_none.test | 2 +-
.../t/create_table_index_normalizer_parameter.test | 2 +-
.../t/create_table_index_parser_comment.test | 2 +-
.../t/create_table_index_parser_default.test | 2 +-
.../storage/t/create_table_index_parser_off.test | 2 +-
...index_token_filters_multiple_token_filters.test | 2 +-
...table_index_token_filters_one_token_filter.test | 2 +-
...create_table_index_token_filters_parameter.test | 2 +-
.../t/create_table_index_tokenizer_comment.test | 2 +-
.../t/create_table_index_tokenizer_default.test | 2 +-
.../t/create_table_index_tokenizer_off.test | 2 +-
.../t/create_table_index_tokenizer_parameter.test | 2 +-
.../t/create_table_table_normalizer_default.test | 2 +-
.../t/create_table_table_normalizer_hash.test | 2 +-
...table_token_filters_multiple_token_filters.test | 2 +-
...table_table_token_filters_one_token_filter.test | 2 +-
...create_table_table_token_filters_stop_word.test | 2 +-
.../mroonga/storage/t/delete_fulltext_column.test | 2 +-
.../storage/t/delete_index_btree_many_records.test | 2 +-
.../storage/t/delete_index_hash_id_no_unique.test | 2 +-
.../storage/t/delete_index_hash_id_unique.test | 2 +-
.../mroonga/storage/t/delete_normal_column.test | 2 +-
.../mroonga/storage/t/delete_unsigned_bigint.test | 2 +-
.../storage/t/drop_database_TODO_SPLIT_ME.test | 2 +-
.../mroonga/storage/t/drop_database_no_table.test | 2 +-
.../storage/t/drop_table_TODO_SPLIT_ME.test | 2 +-
.../mysql-test/mroonga/storage/t/flush_logs.test | 2 +-
.../mroonga/storage/t/foreign_key_alter_add.test | 2 +-
.../mroonga/storage/t/foreign_key_alter_drop.test | 2 +-
.../mroonga/storage/t/foreign_key_create.test | 2 +-
.../storage/t/foreign_key_delete_existent.test | 2 +-
.../storage/t/foreign_key_delete_nonexistent.test | 2 +-
.../storage/t/foreign_key_insert_existent.test | 2 +-
.../storage/t/foreign_key_insert_nonexistent.test | 2 +-
.../mroonga/storage/t/foreign_key_rename.test | 2 +-
.../storage/t/foreign_key_update_existent.test | 2 +-
.../storage/t/foreign_key_update_nonexistent.test | 2 +-
.../t/fulltext_boolean_mode_empty_query.test | 2 +-
.../storage/t/fulltext_boolean_mode_escape.test | 2 +-
.../t/fulltext_boolean_mode_leading_not.test | 2 +-
.../t/fulltext_boolean_mode_pragma_all.test | 2 +-
..._pragma_default_operator_minus_no_operator.test | 2 +-
...mode_pragma_default_operator_minus_with_or.test | 2 +-
...de_pragma_default_operator_minus_with_plus.test | 2 +-
...ode_pragma_default_operator_or_no_operator.test | 2 +-
...mode_pragma_default_operator_or_with_minus.test | 2 +-
..._mode_pragma_default_operator_or_with_plus.test | 2 +-
...e_pragma_default_operator_plus_no_operator.test | 2 +-
...pragma_default_operator_plus_with_astarisk.test | 2 +-
...de_pragma_default_operator_plus_with_minus.test | 2 +-
..._mode_pragma_default_operator_plus_with_or.test | 2 +-
...boolean_mode_pragma_syntax_script_operator.test | 2 +-
...boolean_mode_pragma_syntax_script_selector.test | 2 +-
...ltext_boolean_mode_pragma_weight_full_spec.test | 2 +-
...ltext_boolean_mode_pragma_weight_no_weight.test | 2 +-
...xt_boolean_mode_pragma_weight_omit_section.test | 2 +-
...an_mode_pragma_weight_ten_or_more_sections.test | 2 +-
..._mode_pragma_weight_three_or_more_sections.test | 2 +-
.../fulltext_boolean_mode_syntax_error_error.test | 2 +-
...xt_boolean_mode_syntax_error_error_and_log.test | 2 +-
.../fulltext_boolean_mode_syntax_error_ignore.test | 2 +-
...t_boolean_mode_syntax_error_ignore_and_log.test | 2 +-
.../mroonga/storage/t/fulltext_charset_ascii.test | 2 +-
.../mroonga/storage/t/fulltext_charset_cp932.test | 2 +-
.../storage/t/fulltext_charset_eucjpms.test | 2 +-
.../storage/t/fulltext_charset_japanese.test | 2 +-
.../storage/t/fulltext_charset_utf8mb4.test | 2 +-
.../mroonga/storage/t/fulltext_empty_query.test | 2 +-
.../mroonga/storage/t/fulltext_found_rows.test | 2 +-
.../storage/t/fulltext_groonga_varchar_vector.test | 2 +-
.../mroonga/storage/t/fulltext_index_recreate.test | 2 +-
.../mroonga/storage/t/fulltext_insert_select.test | 2 +-
.../mroonga/storage/t/fulltext_insert_values.test | 2 +-
.../t/fulltext_multiple_column_index_delete.test | 2 +-
.../t/fulltext_multiple_column_index_insert.test | 2 +-
.../t/fulltext_multiple_column_index_recreate.test | 2 +-
.../t/fulltext_multiple_column_index_update.test | 2 +-
.../mroonga/storage/t/fulltext_multiple_index.test | 2 +-
.../mroonga/storage/t/fulltext_no_primary_key.test | 2 +-
.../storage/t/fulltext_not_match_against.test | 2 +-
.../mysql-test/mroonga/storage/t/fulltext_or.test | 2 +-
...ltext_order_boolean_mode_different_against.test | 2 +-
...ulltext_order_boolean_mode_different_match.test | 2 +-
.../t/fulltext_order_boolean_mode_no_where.test | 2 +-
...text_order_boolean_mode_same_match_against.test | 2 +-
.../fulltext_order_natural_language_mode_asc.test | 2 +-
.../fulltext_order_natural_language_mode_desc.test | 2 +-
...er_natural_language_mode_different_against.test | 2 +-
...rder_natural_language_mode_different_match.test | 2 +-
...ltext_order_natural_language_mode_no_where.test | 2 +-
...r_natural_language_mode_same_match_against.test | 2 +-
.../mroonga/storage/t/fulltext_two_inner_join.test | 2 +-
.../t/fulltext_version_10_0_no_such_key.test | 2 +-
.../t/fulltext_version_5_5_no_such_key.test | 2 +-
.../t/fulltext_version_5_6_no_such_key.test | 2 +-
.../storage/t/function_command_auto-escape.test | 2 +-
.../mroonga/storage/t/function_command_select.test | 2 +-
.../t/function_command_special-database-name.test | 2 +-
.../t/function_escape_error_query_is_missing.test | 2 +-
.../function_escape_error_query_is_not_string.test | 2 +-
...cape_error_target_characters_is_not_string.test | 2 +-
.../storage/t/function_escape_query_all.test | 2 +-
.../storage/t/function_escape_query_custom.test | 2 +-
.../storage/t/function_escape_query_join.test | 2 +-
.../t/function_escape_query_match_against.test | 2 +-
.../storage/t/function_escape_query_named.test | 2 +-
.../storage/t/function_escape_query_nested.test | 2 +-
.../storage/t/function_escape_script_decimal.test | 2 +-
.../storage/t/function_escape_script_integer.test | 2 +-
.../storage/t/function_escape_script_real.test | 2 +-
.../storage/t/function_escape_script_string.test | 2 +-
.../t/function_highlight_html_dynamic_keyword.test | 2 +-
.../t/function_highlight_html_japanese.test | 2 +-
.../function_highlight_html_multiple_keywords.test | 2 +-
.../t/function_highlight_html_normalizer.test | 2 +-
.../storage/t/function_highlight_html_query.test | 2 +-
.../t/function_highlight_html_query_pragma.test | 2 +-
.../storage/t/function_highlight_html_record.test | 2 +-
.../storage/t/function_last_insert_grn_id.test | 2 +-
.../t/function_last_insert_id_reference.test | 2 +-
.../storage/t/function_last_insert_id_set.test | 2 +-
.../storage/t/function_normalize_default.test | 2 +-
.../storage/t/function_normalize_normalizer.test | 2 +-
.../storage/t/function_normalize_record.test | 2 +-
.../storage/t/function_query_expand_multiple.test | 2 +-
.../storage/t/function_query_expand_no_index.test | 2 +-
.../storage/t/function_query_expand_one.test | 2 +-
.../storage/t/function_query_expand_pragma.test | 2 +-
.../mroonga/storage/t/function_snippet_ascii.test | 2 +-
.../mroonga/storage/t/function_snippet_cp932.test | 2 +-
.../storage/t/function_snippet_eucjpms.test | 2 +-
.../t/function_snippet_html_dynamic_keyword.test | 2 +-
.../storage/t/function_snippet_html_japanese.test | 2 +-
.../t/function_snippet_html_multiple_keywords.test | 2 +-
.../t/function_snippet_html_multiple_snippets.test | 2 +-
.../storage/t/function_snippet_html_query.test | 2 +-
.../t/function_snippet_html_query_pragma.test | 2 +-
.../storage/t/function_snippet_html_record.test | 2 +-
...nction_snippet_invalid_nonexistent_charset.test | 2 +-
...nction_snippet_invalid_unsupported_charset.test | 2 +-
.../storage/t/function_snippet_japanese.test | 2 +-
.../storage/t/geometry_bulk_insert_null.test | 2 +-
.../mroonga/storage/t/geometry_contains.test | 2 +-
.../geometry_strict_sql_mode_bulk_insert_null.test | 2 +-
.../t/geometry_strict_sql_mode_contains.test | 2 +-
.../storage/t/index_btree_equal_datetime.test | 2 +-
.../mroonga/storage/t/index_btree_equal_time.test | 2 +-
.../storage/t/index_btree_equal_timestamp.test | 2 +-
.../t/index_btree_normal_column_insert.test | 2 +-
.../mroonga/storage/t/index_hash_id_normal.test | 2 +-
.../mroonga/storage/t/index_hash_id_primary.test | 2 +-
.../mroonga/storage/t/index_hash_id_unique.test | 2 +-
.../storage/t/index_hash_normal_column_insert.test | 2 +-
.../t/index_hash_strict_sql_mode_id_primary.test | 2 +-
.../storage/t/index_multiple_column_delete.test | 2 +-
.../t/index_multiple_column_nullable_smallint.test | 2 +-
...x_multiple_column_nullable_unsigned_bigint.test | 2 +-
...ndex_multiple_column_nullable_unsigned_int.test | 2 +-
...multiple_column_nullable_unsigned_smallint.test | 2 +-
.../t/index_multiple_column_nullable_varchar.test | 2 +-
...ltiple_column_order_by_where_equal_asc_asc.test | 2 +-
...iple_column_order_by_where_equal_desc_desc.test | 2 +-
.../t/index_multiple_column_primary_delete.test | 2 +-
.../index_multiple_column_primary_select_int.test | 2 +-
...iple_column_primary_strict_sql_mode_update.test | 2 +-
.../t/index_multiple_column_primary_update.test | 2 +-
...ultiple_column_range_all_used_greater_than.test | 2 +-
...olumn_range_all_used_greater_than_or_equal.test | 2 +-
...x_multiple_column_range_all_used_less_than.test | 2 +-
...e_column_range_all_used_less_than_or_equal.test | 2 +-
...ge_partially_used_have_prefix_greater_than.test | 2 +-
...lly_used_have_prefix_greater_than_or_equal.test | 2 +-
...range_partially_used_have_prefix_less_than.test | 2 +-
...tially_used_have_prefix_less_than_or_equal.test | 2 +-
...ange_partially_used_no_prefix_greater_than.test | 2 +-
...ially_used_no_prefix_greater_than_or_equal.test | 2 +-
...n_range_partially_used_no_prefix_less_than.test | 2 +-
...artially_used_no_prefix_less_than_or_equal.test | 2 +-
.../storage/t/index_multiple_column_recreate.test | 2 +-
.../storage/t/index_multiple_column_replace.test | 2 +-
.../t/index_multiple_column_select_double.test | 2 +-
.../t/index_multiple_column_select_float.test | 2 +-
.../t/index_multiple_column_select_int.test | 2 +-
.../t/index_multiple_column_select_max.test | 2 +-
.../t/index_multiple_column_select_min.test | 2 +-
.../t/index_multiple_column_select_string.test | 2 +-
.../t/index_multiple_column_select_varchar.test | 2 +-
...ex_multiple_column_unique_date_32bit_equal.test | 2 +-
...ex_multiple_column_unique_date_64bit_equal.test | 2 +-
...dex_multiple_column_unique_date_index_read.test | 2 +-
...ultiple_column_unique_date_order_32bit_asc.test | 2 +-
...ltiple_column_unique_date_order_32bit_desc.test | 2 +-
...ultiple_column_unique_date_order_64bit_asc.test | 2 +-
...ltiple_column_unique_date_order_64bit_desc.test | 2 +-
...index_multiple_column_unique_date_reinsert.test | 2 +-
...multiple_column_unique_datetime_index_read.test | 2 +-
...atetime_insert_delete_insert_invalid_value.test | 2 +-
..._multiple_column_unique_datetime_order_asc.test | 2 +-
...multiple_column_unique_datetime_order_desc.test | 2 +-
...x_multiple_column_unique_datetime_reinsert.test | 2 +-
.../t/index_multiple_column_unique_decimal.test | 2 +-
...dex_multiple_column_unique_time_index_read.test | 2 +-
...ndex_multiple_column_unique_time_order_asc.test | 2 +-
...dex_multiple_column_unique_time_order_desc.test | 2 +-
...index_multiple_column_unique_time_reinsert.test | 2 +-
...ultiple_column_unique_timestamp_index_read.test | 2 +-
...multiple_column_unique_timestamp_order_asc.test | 2 +-
...ultiple_column_unique_timestamp_order_desc.test | 2 +-
..._multiple_column_unique_timestamp_reinsert.test | 2 +-
.../t/index_multiple_column_unique_varchar.test | 2 +-
...ex_multiple_column_unique_year_32bit_equal.test | 2 +-
...ex_multiple_column_unique_year_64bit_equal.test | 2 +-
...dex_multiple_column_unique_year_index_read.test | 2 +-
...ultiple_column_unique_year_order_32bit_asc.test | 2 +-
...ltiple_column_unique_year_order_32bit_desc.test | 2 +-
...ultiple_column_unique_year_order_64bit_asc.test | 2 +-
...ltiple_column_unique_year_order_64bit_desc.test | 2 +-
...index_multiple_column_unique_year_reinsert.test | 2 +-
.../t/index_multiple_column_update_int.test | 2 +-
.../t/index_multiple_column_update_string.test | 2 +-
.../storage/t/index_primary_char_exact_length.test | 2 +-
.../t/index_primary_char_null_character.test | 2 +-
.../storage/t/index_primary_char_short.test | 2 +-
.../mroonga/storage/t/index_primary_date.test | 2 +-
...x_primary_datetime_with_fractional_seconds.test | 2 +-
...rimary_datetime_without_fractional_seconds.test | 2 +-
...ex_primary_decimal_with_fractional_seconds.test | 2 +-
...primary_decimal_without_fractional_seconds.test | 2 +-
...index_primary_time_with_fractional_seconds.test | 2 +-
...ex_primary_time_without_fractional_seconds.test | 2 +-
..._primary_timestamp_with_fractional_seconds.test | 2 +-
...imary_timestamp_without_fractional_seconds.test | 2 +-
.../t/index_primary_varchar_null_character.test | 2 +-
.../mroonga/storage/t/index_primary_year.test | 2 +-
.../t/index_range_normal_greater_than_asc.test | 2 +-
.../t/index_range_normal_greater_than_desc.test | 2 +-
...dex_range_normal_greater_than_or_equal_asc.test | 2 +-
...ex_range_normal_greater_than_or_equal_desc.test | 2 +-
.../t/index_range_normal_less_than_asc.test | 2 +-
.../t/index_range_normal_less_than_desc.test | 2 +-
.../index_range_normal_less_than_or_equal_asc.test | 2 +-
...index_range_normal_less_than_or_equal_desc.test | 2 +-
.../t/index_range_primary_greater_than_asc.test | 2 +-
.../t/index_range_primary_greater_than_desc.test | 2 +-
...ex_range_primary_greater_than_or_equal_asc.test | 2 +-
...x_range_primary_greater_than_or_equal_desc.test | 2 +-
.../t/index_range_primary_less_than_asc.test | 2 +-
.../t/index_range_primary_less_than_desc.test | 2 +-
...index_range_primary_less_than_or_equal_asc.test | 2 +-
...ndex_range_primary_less_than_or_equal_desc.test | 2 +-
.../storage/t/index_read_multiple_bigint.test | 2 +-
.../t/index_read_multiple_bigint_unsigned.test | 2 +-
.../storage/t/index_read_multiple_double.test | 2 +-
.../storage/t/index_read_multiple_float.test | 2 +-
.../mroonga/storage/t/index_read_multiple_int.test | 2 +-
.../t/index_read_multiple_int_unsigned.test | 2 +-
.../storage/t/index_read_multiple_mediumint.test | 2 +-
.../t/index_read_multiple_mediumint_unsigned.test | 2 +-
.../storage/t/index_read_multiple_smallint.test | 2 +-
.../t/index_read_multiple_smallint_unsigned.test | 2 +-
.../storage/t/index_read_multiple_tinyint.test | 2 +-
.../t/index_read_multiple_tinyint_unsigned.test | 2 +-
.../storage/t/index_read_multiple_varchar.test | 2 +-
.../t/index_read_multiple_varchar_collation.test | 2 +-
.../mroonga/storage/t/index_read_normal_int.test | 2 +-
.../storage/t/index_read_normal_varchar.test | 2 +-
.../mroonga/storage/t/index_read_primary_int.test | 2 +-
.../storage/t/index_read_primary_varchar.test | 2 +-
.../mroonga/storage/t/index_unique_delete_all.test | 2 +-
.../t/index_unique_delete_by_primary_key.test | 2 +-
.../storage/t/index_unique_insert_after_error.test | 2 +-
.../t/index_unique_search_after_duplicated.test | 2 +-
.../mroonga/storage/t/index_unique_varchar.test | 2 +-
.../storage/t/index_update_multiple_column.test | 2 +-
.../storage/t/index_update_single_column.test | 2 +-
.../storage/t/information_schema_plugins.test | 2 +-
...ormation_schema_tables_auto_increment_none.test | 2 +-
...formation_schema_tables_auto_increment_use.test | 2 +-
.../t/information_schema_tables_data_length.test | 2 +-
.../mroonga/storage/t/insert_TODO_SPLIT_ME.test | 2 +-
.../mroonga/storage/t/insert_delayed.test | 2 +-
...update_no_primary_key_and_unique_key_twice.test | 2 +-
...insert_on_duplicate_key_update_primary_key.test | 2 +-
.../insert_on_duplicate_key_update_unique_key.test | 2 +-
.../mroonga/storage/t/insert_virtual_column.test | 2 +-
.../mroonga/storage/t/like_unicode_ci.test | 2 +-
.../mroonga/storage/t/lock_tables_read.test | 2 +-
...zation_count_skip_after_insert_multithread.test | 2 +-
...tion_count_skip_after_insert_single_thread.test | 2 +-
.../t/optimization_count_skip_disabled.test | 2 +-
.../t/optimization_count_skip_index_and.test | 2 +-
.../t/optimization_count_skip_index_between.test | 2 +-
.../t/optimization_count_skip_index_equal.test | 2 +-
...kip_index_full_text_search_in_boolean_mode.test | 2 +-
..._full_text_search_in_natural_language_mode.test | 2 +-
.../t/optimization_count_skip_index_greater.test | 2 +-
...ptimization_count_skip_index_greater_equal.test | 2 +-
.../t/optimization_count_skip_index_less.test | 2 +-
.../optimization_count_skip_index_less_equal.test | 2 +-
.../t/optimization_count_skip_index_not_equal.test | 2 +-
.../t/optimization_count_skip_index_view.test | 2 +-
...ptimization_count_skip_multiple_conditions.test | 2 +-
...ptimization_count_skip_primary_key_between.test | 2 +-
.../optimization_count_skip_primary_key_equal.test | 2 +-
...ptimization_count_skip_primary_key_greater.test | 2 +-
...ation_count_skip_primary_key_greater_equal.test | 2 +-
.../optimization_count_skip_primary_key_less.test | 2 +-
...mization_count_skip_primary_key_less_equal.test | 2 +-
...imization_count_skip_primary_key_not_equal.test | 2 +-
...ization_order_limit_not_optimized_disabled.test | 2 +-
...imit_not_optimized_multiple_match_againsts.test | 2 +-
...ization_order_limit_not_optimized_no_limit.test | 2 +-
.../optimization_order_limit_optimized_cp932.test | 2 +-
...ion_order_limit_optimized_datetime_between.test | 2 +-
...rder_limit_optimized_datetime_between_over.test | 2 +-
...ation_order_limit_optimized_datetime_equal.test | 2 +-
...rder_limit_optimized_datetime_greater_than.test | 2 +-
...t_optimized_datetime_greater_than_or_equal.test | 2 +-
...n_order_limit_optimized_datetime_less_than.test | 2 +-
...imit_optimized_datetime_less_than_or_equal.test | 2 +-
...imit_optimized_duplicated_order_by_columns.test | 2 +-
...timization_order_limit_optimized_enum_name.test | 2 +-
...imization_order_limit_optimized_enum_value.test | 2 +-
...ion_order_limit_optimized_have_primary_key.test | 2 +-
...mization_order_limit_optimized_int_between.test | 2 +-
...ion_order_limit_optimized_int_between_over.test | 2 +-
...timization_order_limit_optimized_int_equal.test | 2 +-
...ion_order_limit_optimized_int_greater_than.test | 2 +-
..._limit_optimized_int_greater_than_or_equal.test | 2 +-
...zation_order_limit_optimized_int_less_than.test | 2 +-
...der_limit_optimized_int_less_than_or_equal.test | 2 +-
...ation_order_limit_optimized_no_primary_key.test | 2 +-
...tion_order_limit_optimized_no_where_clause.test | 2 +-
...ization_order_limit_optimized_order_by_asc.test | 2 +-
...zation_order_limit_optimized_order_by_desc.test | 2 +-
...mization_order_limit_optimized_order_by_id.test | 2 +-
...der_limit_optimized_order_by_match_against.test | 2 +-
...order_limit_optimized_select_match_against.test | 2 +-
...ization_order_limit_optimized_time_between.test | 2 +-
...on_order_limit_optimized_time_between_over.test | 2 +-
...imization_order_limit_optimized_time_equal.test | 2 +-
...on_order_limit_optimized_time_greater_than.test | 2 +-
...limit_optimized_time_greater_than_or_equal.test | 2 +-
...ation_order_limit_optimized_time_less_than.test | 2 +-
...er_limit_optimized_time_less_than_or_equal.test | 2 +-
...r_limit_optimized_varchar_equal_with_index.test | 2 +-
...imit_optimized_varchar_equal_without_index.test | 2 +-
...ization_order_limit_optimized_year_between.test | 2 +-
...on_order_limit_optimized_year_between_over.test | 2 +-
...imization_order_limit_optimized_year_equal.test | 2 +-
...on_order_limit_optimized_year_greater_than.test | 2 +-
...limit_optimized_year_greater_than_or_equal.test | 2 +-
...ation_order_limit_optimized_year_less_than.test | 2 +-
...er_limit_optimized_year_less_than_or_equal.test | 2 +-
.../mroonga/storage/t/partition_insert.test | 2 +-
.../mroonga/storage/t/partition_update.test | 2 +-
.../storage/t/repair_table_no_index_file.test | 2 +-
.../mroonga/storage/t/replace_geometry.test | 2 +-
.../mroonga/storage/t/replace_select_varchar.test | 2 +-
.../mysql-test/mroonga/storage/t/replace_text.test | 2 +-
.../mroonga/storage/t/replace_varchar.test | 2 +-
.../mroonga/storage/t/replace_vector.test | 2 +-
.../mroonga/storage/t/replace_without_key.test | 2 +-
.../mysql-test/mroonga/storage/t/select_all.test | 2 +-
.../storage/t/select_empty_key_where_equal.test | 2 +-
.../t/select_empty_key_where_not_equal.test | 2 +-
.../storage/t/select_group_by_with_index.test | 2 +-
.../storage/t/select_group_by_without_index.test | 2 +-
.../mysql-test/mroonga/storage/t/select_pkey.test | 2 +-
.../mroonga/storage/t/select_secondary_key.test | 2 +-
.../storage/t/show_create_table_TODO_SPLIT_ME.test | 2 +-
.../mroonga/storage/t/sub_query_fulltext.test | 2 +-
.../mroonga/storage/t/temporary_table.test | 2 +-
.../mysql-test/mroonga/storage/t/truncate.test | 2 +-
.../mroonga/storage/t/update_binlog_row.test | 2 +-
.../mroonga/storage/t/update_fulltext.test | 2 +-
.../mroonga/storage/t/update_id_hash_index.test | 2 +-
.../storage/t/update_id_unique_hash_index.test | 2 +-
.../mysql-test/mroonga/storage/t/update_int.test | 2 +-
.../storage/t/update_last_insert_grn_id.test | 2 +-
.../mroonga/storage/t/update_virtual_column.test | 2 +-
...ble_boolean_mode_syntax_flags_allow_column.test | 2 +-
...oolean_mode_syntax_flags_allow_leading_not.test | 2 +-
...ble_boolean_mode_syntax_flags_allow_update.test | 2 +-
...ble_boolean_mode_syntax_flags_syntax_query.test | 2 +-
...le_boolean_mode_syntax_flags_syntax_script.test | 2 +-
.../storage/t/variable_database_path_prefix.test | 2 +-
.../t/variable_default_parser_new_value.test | 2 +-
.../t/variable_default_parser_same_value.test | 2 +-
.../t/variable_default_tokenizer_new_value.test | 2 +-
.../t/variable_default_tokenizer_same_value.test | 2 +-
.../storage/t/variable_dry_write_delete.test | 2 +-
.../storage/t/variable_dry_write_insert.test | 2 +-
.../storage/t/variable_dry_write_update.test | 2 +-
...ariable_enable_operations_recording_insert.test | 2 +-
.../storage/t/variable_lock_timeout_disable.test | 2 +-
.../storage/t/variable_lock_timeout_invalid.test | 2 +-
.../storage/t/variable_lock_timeout_no_retry.test | 2 +-
.../storage/t/variable_lock_timeout_valid.test | 2 +-
.../storage/t/variable_log_file_new_value.test | 2 +-
.../t/variable_log_file_nonexistent_path.test | 2 +-
.../storage/t/variable_log_file_same_value.test | 2 +-
.../t/variable_log_level_TODO_SPLIT_ME.test | 2 +-
...variable_match_escalation_threshold_global.test | 2 +-
...ariable_match_escalation_threshold_session.test | 2 +-
...variable_max_n_records_for_estimate_global.test | 2 +-
...rds_for_estimate_mysql_5_7_or_later_global.test | 2 +-
...mate_mysql_5_7_or_later_not_found_in_limit.test | 2 +-
...ds_for_estimate_mysql_5_7_or_later_session.test | 2 +-
..._n_records_for_estimate_not_found_in_limit.test | 2 +-
...ariable_max_n_records_for_estimate_session.test | 2 +-
...riable_query_log_file_disabled_empty_value.test | 2 +-
...ariable_query_log_file_disabled_null_value.test | 2 +-
...ariable_query_log_file_enabled_empty_value.test | 2 +-
...variable_query_log_file_enabled_null_value.test | 2 +-
.../t/variable_query_log_file_new_value.test | 2 +-
.../t/variable_query_log_file_same_value.test | 2 +-
.../t/variable_vector_column_delimiter.test | 2 +-
.../mroonga/storage/t/variable_version.test | 2 +-
.../mroonga/wrapper/t/alter_table_add_column.test | 2 +-
.../t/alter_table_add_column_multibyte_cp932.test | 2 +-
.../t/alter_table_add_column_multibyte_utf8.test | 2 +-
.../t/alter_table_change_column_comment.test | 2 +-
.../wrapper/t/alter_table_change_engine.test | 2 +-
.../t/alter_table_comment_change_engine.test | 2 +-
.../alter_table_disable_keys_create_fulltext.test | 2 +-
.../t/alter_table_disable_keys_fulltext.test | 2 +-
.../alter_table_disable_keys_multiple_column.test | 2 +-
.../wrapper/t/alter_table_disable_keys_normal.test | 2 +-
.../t/alter_table_disable_keys_primary.test | 2 +-
.../t/alter_table_disable_keys_updating.test | 2 +-
.../mroonga/wrapper/t/alter_table_drop_column.test | 2 +-
.../t/alter_table_enable_keys_fulltext.test | 2 +-
.../t/alter_table_enable_keys_lock_tables.test | 2 +-
.../t/alter_table_enable_keys_multiple_column.test | 2 +-
.../wrapper/t/alter_table_enable_keys_normal.test | 2 +-
.../wrapper/t/alter_table_enable_keys_primary.test | 2 +-
.../mroonga/wrapper/t/alter_table_fulltext.test | 2 +-
.../wrapper/t/alter_table_rename_table.test | 2 +-
.../mroonga/wrapper/t/alter_table_spatial.test | 2 +-
.../mroonga/wrapper/t/auto_increment_text.test | 2 +-
.../mroonga/wrapper/t/binlog_TODO_SPLIT_ME.test | 2 +-
.../mroonga/wrapper/t/check_table_for_upgrade.test | 2 +-
.../t/column_comment_index_not_for_mroonga.test | 2 +-
.../t/column_generated_stored_add_column.test | 2 +-
.../wrapper/t/column_generated_stored_delete.test | 2 +-
.../t/column_generated_stored_drop_column.test | 2 +-
.../wrapper/t/column_generated_stored_insert.test | 2 +-
.../wrapper/t/column_generated_stored_reindex.test | 2 +-
.../wrapper/t/column_generated_stored_update.test | 2 +-
.../t/column_generated_virtual_add_column.test | 2 +-
...olumn_generated_virtual_add_fulltext_index.test | 2 +-
.../t/column_generated_virtual_add_index.test | 2 +-
.../wrapper/t/column_generated_virtual_delete.test | 2 +-
.../t/column_generated_virtual_drop_column.test | 2 +-
.../wrapper/t/column_generated_virtual_insert.test | 2 +-
.../wrapper/t/column_generated_virtual_update.test | 2 +-
.../mroonga/wrapper/t/column_multibyte_cp932.test | 2 +-
.../mroonga/wrapper/t/column_multibyte_utf8.test | 2 +-
.../mroonga/wrapper/t/column_normal_comment.test | 2 +-
.../mysql-test/mroonga/wrapper/t/count_star.test | 2 +-
.../count_star_mysql_5_7_or_later_with_index.test | 2 +-
.../mroonga/wrapper/t/count_star_with_index.test | 2 +-
.../wrapper/t/create_table_TODO_SPLIT_ME.test | 2 +-
.../wrapper/t/create_table_comment_combined.test | 2 +-
.../wrapper/t/create_table_flags_comment.test | 2 +-
.../mroonga/wrapper/t/create_table_flags_none.test | 2 +-
.../wrapper/t/create_table_flags_parameter.test | 2 +-
.../wrapper/t/create_table_index_flags_none.test | 2 +-
..._index_flags_with_position_and_with_weight.test | 2 +-
.../wrapper/t/create_table_normalizer_comment.test | 2 +-
...create_table_normalizer_fulltext_index_bin.test | 2 +-
.../t/create_table_normalizer_parameter.test | 2 +-
.../wrapper/t/create_table_parser_comment.test | 2 +-
...token_filters_index_multiple_token_filters.test | 2 +-
...table_token_filters_index_one_token_filter.test | 2 +-
...create_table_token_filters_index_parameter.test | 2 +-
.../wrapper/t/create_table_tokenizer_comment.test | 2 +-
.../t/create_table_tokenizer_parameter.test | 2 +-
.../mroonga/wrapper/t/delete_TODO_SPLIT_ME.test | 2 +-
.../mysql-test/mroonga/wrapper/t/delete_all.test | 2 +-
.../wrapper/t/drop_table_new_connection.test | 2 +-
.../t/fulltext_boolean_mode_leading_not.test | 2 +-
...lltext_boolean_mode_multiple_match_against.test | 2 +-
..._pragma_default_operator_minus_no_operator.test | 2 +-
...mode_pragma_default_operator_minus_with_or.test | 2 +-
...de_pragma_default_operator_minus_with_plus.test | 2 +-
...ode_pragma_default_operator_or_no_operator.test | 2 +-
...mode_pragma_default_operator_or_with_minus.test | 2 +-
..._mode_pragma_default_operator_or_with_plus.test | 2 +-
...e_pragma_default_operator_plus_no_operator.test | 2 +-
...de_pragma_default_operator_plus_with_minus.test | 2 +-
..._mode_pragma_default_operator_plus_with_or.test | 2 +-
...ltext_boolean_mode_pragma_weight_full_spec.test | 2 +-
...ltext_boolean_mode_pragma_weight_no_weight.test | 2 +-
...xt_boolean_mode_pragma_weight_omit_section.test | 2 +-
.../mroonga/wrapper/t/fulltext_charset_ascii.test | 2 +-
.../mroonga/wrapper/t/fulltext_charset_cp932.test | 2 +-
.../wrapper/t/fulltext_charset_eucjpms.test | 2 +-
.../wrapper/t/fulltext_charset_japanese.test | 2 +-
.../mroonga/wrapper/t/fulltext_index_recreate.test | 2 +-
.../mroonga/wrapper/t/fulltext_insert_select.test | 2 +-
.../mroonga/wrapper/t/fulltext_insert_values.test | 2 +-
.../mroonga/wrapper/t/fulltext_many_records.test | 2 +-
...d_and_not_matched_have_where_matched_order.test | 2 +-
...atched_and_not_matched_have_where_no_order.test | 2 +-
...atched_and_not_matched_no_where_both_order.test | 2 +-
.../t/fulltext_multiple_column_index_delete.test | 2 +-
.../t/fulltext_multiple_column_index_insert.test | 2 +-
.../t/fulltext_multiple_column_index_recreate.test | 2 +-
.../t/fulltext_multiple_column_index_update.test | 2 +-
.../mroonga/wrapper/t/fulltext_multiple_index.test | 2 +-
.../mroonga/wrapper/t/fulltext_myisam.test | 2 +-
.../wrapper/t/fulltext_not_match_against.test | 2 +-
.../wrapper/t/fulltext_order_TODO_SPLIT_ME.test | 2 +-
.../wrapper/t/fulltext_order_transaction.test | 2 +-
.../t/function_last_insert_id_reference.test | 2 +-
.../wrapper/t/function_last_insert_id_set.test | 2 +-
.../mroonga/wrapper/t/geometry_contains.test | 2 +-
.../mroonga/wrapper/t/geometry_delete.test | 2 +-
.../mroonga/wrapper/t/geometry_update.test | 2 +-
.../wrapper/t/index_force_index_not_used.test | 2 +-
.../mroonga/wrapper/t/insert_TODO_SPLIT_ME.test | 2 +-
.../mysql-test/mroonga/wrapper/t/insert_bulk.test | 2 +-
..._update_multiple_column_primary_key_myisam.test | 2 +-
...update_multiple_column_unique_index_myisam.test | 2 +-
.../wrapper/t/multi_range_read_disk_sweep.test | 2 +-
...i_range_read_mysql_5_7_or_later_disk_sweep.test | 2 +-
.../t/optimization_order_limit_TODO_SPLIT_ME.test | 2 +-
.../t/optimization_order_limit_no_direction.test | 2 +-
.../optimization_order_limit_no_where_clause.test | 2 +-
...imization_order_limit_order_by_primary_key.test | 2 +-
.../mroonga/wrapper/t/performance_schema.test | 2 +-
.../mroonga/wrapper/t/repair_table_no_files.test | 2 +-
.../wrapper/t/repair_table_no_index_file.test | 2 +-
.../mroonga/wrapper/t/temporary_table.test | 2 +-
.../mroonga/wrapper/t/transaction_query_cache.test | 2 +-
.../t/transaction_rollback_delete_delete.test | 2 +-
.../t/transaction_rollback_delete_update.test | 2 +-
.../mysql-test/mroonga/wrapper/t/truncate.test | 2 +-
.../mroonga/wrapper/t/update_fulltext.test | 2 +-
.../mysql-test/mroonga/wrapper/t/update_int.test | 2 +-
.../wrapper/t/variable_dry_write_delete.test | 2 +-
.../wrapper/t/variable_dry_write_insert.test | 2 +-
.../wrapper/t/variable_dry_write_update.test | 2 +-
...variable_match_escalation_threshold_global.test | 2 +-
...ariable_match_escalation_threshold_session.test | 2 +-
storage/mroonga/packages/ubuntu/upload.rb | 2 +-
storage/mroonga/test/run-sql-test.sh | 2 +-
storage/mroonga/test/unit/test_mrn_path_mapper.cpp | 2 +-
storage/mroonga/tools/travis/before_script.sh | 2 +-
storage/mroonga/tools/travis/install.sh | 2 +-
storage/mroonga/tools/travis/script.sh | 2 +-
storage/mroonga/udf/mrn_udf_command.cpp | 2 +-
storage/mroonga/udf/mrn_udf_escape.cpp | 2 +-
storage/mroonga/udf/mrn_udf_highlight_html.cpp | 2 +-
storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp | 2 +-
storage/mroonga/udf/mrn_udf_normalize.cpp | 2 +-
storage/mroonga/udf/mrn_udf_query_expand.cpp | 2 +-
storage/mroonga/udf/mrn_udf_snippet.cpp | 2 +-
storage/mroonga/udf/mrn_udf_snippet_html.cpp | 2 +-
storage/mroonga/vendor/groonga/CMakeLists.txt | 2 +-
storage/mroonga/vendor/groonga/COPYING | 4 +-
.../groonga/benchmark/bench-between-sequential.c | 2 +-
.../mroonga/vendor/groonga/benchmark/bench-cache.c | 2 +-
.../vendor/groonga/benchmark/bench-ctx-create.c | 2 +-
.../vendor/groonga/benchmark/bench-geo-distance.c | 2 +-
.../vendor/groonga/benchmark/bench-geo-select.c | 2 +-
.../mroonga/vendor/groonga/benchmark/bench-nfkc.c | 2 +-
.../groonga/benchmark/bench-query-optimizer.c | 2 +-
.../vendor/groonga/benchmark/bench-range-select.c | 2 +-
.../vendor/groonga/benchmark/bench-result-set.c | 2 +-
.../vendor/groonga/benchmark/bench-table-factory.c | 2 +-
.../vendor/groonga/benchmark/lib/bench-reporter.c | 2 +-
.../vendor/groonga/benchmark/lib/bench-reporter.h | 2 +-
.../vendor/groonga/benchmark/lib/bench-utils.c | 2 +-
.../vendor/groonga/benchmark/lib/bench-utils.h | 2 +-
.../vendor/groonga/benchmark/lib/benchmark.c | 2 +-
.../vendor/groonga/benchmark/lib/benchmark.h | 2 +-
.../vendor/groonga/bindings/python/ql/groongaql.c | 2 +-
.../groonga/build/cmake_modules/ReadFileList.cmake | 2 +-
.../mroonga/vendor/groonga/include/CMakeLists.txt | 2 +-
storage/mroonga/vendor/groonga/include/groonga.h | 2 +-
storage/mroonga/vendor/groonga/include/groonga.hpp | 2 +-
.../vendor/groonga/include/groonga/accessor.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/array.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/arrow.h | 2 +-
.../vendor/groonga/include/groonga/arrow.hpp | 2 +-
.../mroonga/vendor/groonga/include/groonga/cache.h | 2 +-
.../vendor/groonga/include/groonga/column.h | 2 +-
.../vendor/groonga/include/groonga/command.h | 2 +-
.../vendor/groonga/include/groonga/config.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/dat.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/db.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/dump.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/error.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/expr.h | 2 +-
.../vendor/groonga/include/groonga/file_reader.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/geo.h | 2 +-
.../vendor/groonga/include/groonga/groonga.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/hash.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/id.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/ii.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/nfkc.h | 2 +-
.../vendor/groonga/include/groonga/normalizer.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/obj.h | 2 +-
.../vendor/groonga/include/groonga/operator.h | 2 +-
.../vendor/groonga/include/groonga/output.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/pat.h | 2 +-
.../vendor/groonga/include/groonga/plugin.h | 2 +-
.../vendor/groonga/include/groonga/portability.h | 2 +-
.../groonga/include/groonga/request_canceler.h | 2 +-
.../vendor/groonga/include/groonga/request_timer.h | 2 +-
.../vendor/groonga/include/groonga/scorer.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/table.h | 2 +-
.../vendor/groonga/include/groonga/thread.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/time.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/token.h | 2 +-
.../vendor/groonga/include/groonga/token_filter.h | 2 +-
.../vendor/groonga/include/groonga/tokenizer.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/type.h | 2 +-
.../mroonga/vendor/groonga/include/groonga/util.h | 2 +-
.../groonga/include/groonga/window_function.h | 2 +-
.../vendor/groonga/include/groonga/windows.h | 2 +-
.../groonga/include/groonga/windows_event_logger.h | 2 +-
storage/mroonga/vendor/groonga/lib/CMakeLists.txt | 2 +-
storage/mroonga/vendor/groonga/lib/alloc.c | 2 +-
storage/mroonga/vendor/groonga/lib/arrow.cpp | 2 +-
storage/mroonga/vendor/groonga/lib/cache.c | 2 +-
storage/mroonga/vendor/groonga/lib/column.c | 2 +-
storage/mroonga/vendor/groonga/lib/com.c | 2 +-
storage/mroonga/vendor/groonga/lib/command.c | 2 +-
storage/mroonga/vendor/groonga/lib/config.c | 2 +-
storage/mroonga/vendor/groonga/lib/ctx.c | 2 +-
storage/mroonga/vendor/groonga/lib/ctx_impl_mrb.c | 2 +-
storage/mroonga/vendor/groonga/lib/dat.cpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/array.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/base.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/block.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/check.hpp | 2 +-
.../vendor/groonga/lib/dat/cursor-factory.cpp | 2 +-
.../vendor/groonga/lib/dat/cursor-factory.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/cursor.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/dat.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/entry.hpp | 2 +-
.../mroonga/vendor/groonga/lib/dat/file-impl.cpp | 2 +-
.../mroonga/vendor/groonga/lib/dat/file-impl.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/file.cpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/file.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/header.hpp | 2 +-
.../mroonga/vendor/groonga/lib/dat/id-cursor.cpp | 2 +-
.../mroonga/vendor/groonga/lib/dat/id-cursor.hpp | 2 +-
.../mroonga/vendor/groonga/lib/dat/key-cursor.cpp | 2 +-
.../mroonga/vendor/groonga/lib/dat/key-cursor.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/key.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/node.hpp | 2 +-
.../vendor/groonga/lib/dat/predictive-cursor.cpp | 2 +-
.../vendor/groonga/lib/dat/predictive-cursor.hpp | 2 +-
.../vendor/groonga/lib/dat/prefix-cursor.cpp | 2 +-
.../vendor/groonga/lib/dat/prefix-cursor.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/string.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/trie.cpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/trie.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/dat/vector.hpp | 2 +-
storage/mroonga/vendor/groonga/lib/db.c | 2 +-
storage/mroonga/vendor/groonga/lib/dump.c | 2 +-
storage/mroonga/vendor/groonga/lib/error.c | 2 +-
storage/mroonga/vendor/groonga/lib/expr.c | 2 +-
storage/mroonga/vendor/groonga/lib/expr_code.c | 2 +-
storage/mroonga/vendor/groonga/lib/expr_executor.c | 2 +-
storage/mroonga/vendor/groonga/lib/file_lock.c | 2 +-
storage/mroonga/vendor/groonga/lib/file_reader.c | 2 +-
storage/mroonga/vendor/groonga/lib/geo.c | 2 +-
storage/mroonga/vendor/groonga/lib/grn.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_alloc.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_cache.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_com.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_config.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_ctx.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_ctx_impl.h | 2 +-
.../mroonga/vendor/groonga/lib/grn_ctx_impl_mrb.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_dat.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_db.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_error.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_expr.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_expr_code.h | 2 +-
.../mroonga/vendor/groonga/lib/grn_expr_executor.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_file_lock.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_geo.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_hash.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_ii.h | 2 +-
.../mroonga/vendor/groonga/lib/grn_index_column.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_io.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_load.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_logger.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_mrb.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_msgpack.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_nfkc.h | 2 +-
.../mroonga/vendor/groonga/lib/grn_normalizer.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_obj.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_output.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_pat.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_plugin.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_proc.h | 2 +-
.../mroonga/vendor/groonga/lib/grn_raw_string.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_report.h | 2 +-
.../vendor/groonga/lib/grn_request_canceler.h | 2 +-
.../mroonga/vendor/groonga/lib/grn_request_timer.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_rset.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_scanner.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_scorer.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_scorers.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_snip.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_store.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_str.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_string.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_time.h | 2 +-
.../mroonga/vendor/groonga/lib/grn_token_cursor.h | 2 +-
.../mroonga/vendor/groonga/lib/grn_tokenizers.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_ts.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_util.h | 2 +-
.../vendor/groonga/lib/grn_window_function.h | 2 +-
.../vendor/groonga/lib/grn_window_functions.h | 2 +-
storage/mroonga/vendor/groonga/lib/grn_windows.h | 2 +-
storage/mroonga/vendor/groonga/lib/hash.c | 2 +-
storage/mroonga/vendor/groonga/lib/icudump.c | 2 +-
storage/mroonga/vendor/groonga/lib/id.c | 2 +-
storage/mroonga/vendor/groonga/lib/ii.c | 2 +-
storage/mroonga/vendor/groonga/lib/index_column.c | 2 +-
storage/mroonga/vendor/groonga/lib/io.c | 2 +-
storage/mroonga/vendor/groonga/lib/load.c | 2 +-
storage/mroonga/vendor/groonga/lib/logger.c | 2 +-
storage/mroonga/vendor/groonga/lib/mrb.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_accessor.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_accessor.h | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_array.c | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_array.h | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_bulk.c | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_bulk.h | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_cache.c | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_cache.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_column.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_column.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_command.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_command.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_command_input.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_command_input.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_command_version.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_command_version.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_config.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_config.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_content_type.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_content_type.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_converter.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_converter.h | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_ctx.c | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_ctx.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_database.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_database.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_double_array_trie.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_double_array_trie.h | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_error.c | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_error.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_eval_context.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_eval_context.h | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_expr.c | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_expr.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_fixed_size_column.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_fixed_size_column.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_hash_table.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_hash_table.h | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_id.c | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_id.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_index_column.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_index_column.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_index_cursor.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_index_cursor.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_indexable.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_indexable.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_logger.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_logger.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_object.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_object.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_object_flags.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_object_flags.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_operator.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_operator.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_options.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_options.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_patricia_trie.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_patricia_trie.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_pointer.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_pointer.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_procedure.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_procedure.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_query_logger.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_query_logger.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_record.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_record.h | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_table.c | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_table.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_table_cursor.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_table_cursor.h | 2 +-
.../groonga/lib/mrb/mrb_table_cursor_flags.c | 2 +-
.../groonga/lib/mrb/mrb_table_cursor_flags.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_table_group_flags.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_table_group_flags.h | 2 +-
.../groonga/lib/mrb/mrb_table_group_result.c | 2 +-
.../groonga/lib/mrb/mrb_table_group_result.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_table_sort_flags.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_table_sort_flags.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_table_sort_key.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_table_sort_key.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_thread.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_thread.h | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_type.c | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_type.h | 2 +-
.../groonga/lib/mrb/mrb_variable_size_column.c | 2 +-
.../groonga/lib/mrb/mrb_variable_size_column.h | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_void.c | 2 +-
storage/mroonga/vendor/groonga/lib/mrb/mrb_void.h | 2 +-
.../vendor/groonga/lib/mrb/mrb_window_definition.c | 2 +-
.../vendor/groonga/lib/mrb/mrb_window_definition.h | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_writer.c | 2 +-
.../mroonga/vendor/groonga/lib/mrb/mrb_writer.h | 2 +-
storage/mroonga/vendor/groonga/lib/nfkc.c | 2 +-
storage/mroonga/vendor/groonga/lib/nfkc.rb | 4 +-
storage/mroonga/vendor/groonga/lib/nfkc50.c | 2 +-
storage/mroonga/vendor/groonga/lib/normalizer.c | 2 +-
storage/mroonga/vendor/groonga/lib/obj.c | 2 +-
storage/mroonga/vendor/groonga/lib/operator.c | 2 +-
storage/mroonga/vendor/groonga/lib/output.c | 2 +-
storage/mroonga/vendor/groonga/lib/pat.c | 2 +-
storage/mroonga/vendor/groonga/lib/plugin.c | 2 +-
storage/mroonga/vendor/groonga/lib/proc.c | 2 +-
.../mroonga/vendor/groonga/lib/proc/proc_column.c | 2 +-
.../mroonga/vendor/groonga/lib/proc/proc_config.c | 2 +-
.../mroonga/vendor/groonga/lib/proc/proc_dump.c | 2 +-
.../vendor/groonga/lib/proc/proc_fuzzy_search.c | 2 +-
.../vendor/groonga/lib/proc/proc_highlight.c | 2 +-
.../vendor/groonga/lib/proc/proc_in_records.c | 2 +-
.../mroonga/vendor/groonga/lib/proc/proc_lock.c | 2 +-
.../mroonga/vendor/groonga/lib/proc/proc_object.c | 2 +-
.../vendor/groonga/lib/proc/proc_object_inspect.c | 2 +-
.../vendor/groonga/lib/proc/proc_object_list.c | 2 +-
.../mroonga/vendor/groonga/lib/proc/proc_query.c | 2 +-
.../vendor/groonga/lib/proc/proc_query_log_flags.c | 2 +-
.../mroonga/vendor/groonga/lib/proc/proc_schema.c | 2 +-
.../mroonga/vendor/groonga/lib/proc/proc_select.c | 2 +-
.../mroonga/vendor/groonga/lib/proc/proc_snippet.c | 2 +-
.../mroonga/vendor/groonga/lib/proc/proc_table.c | 2 +-
.../vendor/groonga/lib/proc/proc_tokenize.c | 2 +-
storage/mroonga/vendor/groonga/lib/raw_string.c | 2 +-
storage/mroonga/vendor/groonga/lib/report.c | 2 +-
.../mroonga/vendor/groonga/lib/request_canceler.c | 2 +-
storage/mroonga/vendor/groonga/lib/request_timer.c | 2 +-
storage/mroonga/vendor/groonga/lib/rset.c | 2 +-
storage/mroonga/vendor/groonga/lib/scanner.c | 2 +-
storage/mroonga/vendor/groonga/lib/scorer.c | 2 +-
storage/mroonga/vendor/groonga/lib/scorers.c | 2 +-
storage/mroonga/vendor/groonga/lib/snip.c | 2 +-
storage/mroonga/vendor/groonga/lib/store.c | 2 +-
storage/mroonga/vendor/groonga/lib/str.c | 2 +-
storage/mroonga/vendor/groonga/lib/string.c | 2 +-
storage/mroonga/vendor/groonga/lib/table.c | 2 +-
storage/mroonga/vendor/groonga/lib/thread.c | 2 +-
storage/mroonga/vendor/groonga/lib/time.c | 2 +-
storage/mroonga/vendor/groonga/lib/token_cursor.c | 2 +-
storage/mroonga/vendor/groonga/lib/token_filter.c | 2 +-
storage/mroonga/vendor/groonga/lib/tokenizer.c | 2 +-
storage/mroonga/vendor/groonga/lib/tokenizers.c | 2 +-
storage/mroonga/vendor/groonga/lib/ts.c | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_buf.c | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_buf.h | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_cursor.c | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_cursor.h | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_expr.c | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_expr.h | 2 +-
.../vendor/groonga/lib/ts/ts_expr_builder.c | 2 +-
.../vendor/groonga/lib/ts/ts_expr_builder.h | 2 +-
.../mroonga/vendor/groonga/lib/ts/ts_expr_node.c | 2 +-
.../mroonga/vendor/groonga/lib/ts/ts_expr_node.h | 2 +-
.../mroonga/vendor/groonga/lib/ts/ts_expr_parser.c | 2 +-
.../mroonga/vendor/groonga/lib/ts/ts_expr_parser.h | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_log.h | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_op.c | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_op.h | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_plan.c | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_plan.h | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_sorter.c | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_sorter.h | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_str.c | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_str.h | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_types.h | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_util.c | 2 +-
storage/mroonga/vendor/groonga/lib/ts/ts_util.h | 2 +-
storage/mroonga/vendor/groonga/lib/type.c | 2 +-
storage/mroonga/vendor/groonga/lib/util.c | 2 +-
.../mroonga/vendor/groonga/lib/window_function.c | 2 +-
.../mroonga/vendor/groonga/lib/window_functions.c | 2 +-
storage/mroonga/vendor/groonga/lib/windows.c | 2 +-
.../vendor/groonga/lib/windows_event_logger.c | 2 +-
.../mroonga/vendor/groonga/plugins/CMakeLists.txt | 2 +-
.../plugins/expression_rewriters/CMakeLists.txt | 2 +-
.../groonga/plugins/functions/CMakeLists.txt | 2 +-
.../groonga/plugins/functions/index_column.c | 2 +-
.../vendor/groonga/plugins/functions/math.c | 2 +-
.../vendor/groonga/plugins/functions/number.c | 2 +-
.../vendor/groonga/plugins/functions/string.c | 2 +-
.../vendor/groonga/plugins/functions/time.c | 2 +-
.../vendor/groonga/plugins/functions/vector.c | 2 +-
.../groonga/plugins/query_expanders/CMakeLists.txt | 2 +-
.../vendor/groonga/plugins/query_expanders/tsv.c | 2 +-
.../vendor/groonga/plugins/ruby/CMakeLists.txt | 2 +-
.../vendor/groonga/plugins/sharding/CMakeLists.txt | 2 +-
.../vendor/groonga/plugins/suggest/CMakeLists.txt | 2 +-
.../vendor/groonga/plugins/suggest/suggest.c | 2 +-
.../groonga/plugins/token_filters/CMakeLists.txt | 2 +-
.../vendor/groonga/plugins/token_filters/stem.c | 2 +-
.../groonga/plugins/token_filters/stop_word.c | 2 +-
.../groonga/plugins/tokenizers/CMakeLists.txt | 2 +-
.../vendor/groonga/plugins/tokenizers/kytea.cpp | 2 +-
.../vendor/groonga/plugins/tokenizers/mecab.c | 2 +-
storage/mroonga/vendor/groonga/src/CMakeLists.txt | 2 +-
storage/mroonga/vendor/groonga/src/grndb.c | 2 +-
storage/mroonga/vendor/groonga/src/grnslap.c | 2 +-
storage/mroonga/vendor/groonga/src/groonga.c | 2 +-
.../mroonga/vendor/groonga/src/groonga_benchmark.c | 2 +-
storage/mroonga/vendor/groonga/src/groonga_mruby.c | 2 +-
.../httpd/nginx-module/ngx_http_groonga_module.c | 2 +-
.../vendor/groonga/src/suggest/CMakeLists.txt | 2 +-
.../src/suggest/groonga_suggest_create_dataset.c | 2 +-
.../groonga/src/suggest/groonga_suggest_httpd.c | 2 +-
.../groonga/src/suggest/groonga_suggest_learner.c | 2 +-
storage/mroonga/vendor/groonga/src/suggest/util.c | 2 +-
storage/mroonga/vendor/groonga/src/suggest/util.h | 2 +-
.../vendor/groonga/src/suggest/zmq_compatible.h | 2 +-
.../groonga/tools/groonga-object-list-checker.rb | 2 +-
.../groonga/tools/groonga-suggest-httpd-client.rb | 2 +-
.../mroonga/vendor/groonga/vendor/CMakeLists.txt | 2 +-
.../vendor/groonga/vendor/lz4/CMakeLists.txt | 2 +-
.../vendor/groonga/vendor/mecab/CMakeLists.txt | 2 +-
.../groonga/vendor/message_pack/CMakeLists.txt | 2 +-
.../vendor/groonga/vendor/mruby/CMakeLists.txt | 2 +-
.../vendor/groonga/vendor/onigmo/CMakeLists.txt | 2 +-
.../vendor/groonga/vendor/plugins/CMakeLists.txt | 2 +-
.../groonga-normalizer-mysql/CMakeLists.txt | 2 +-
.../plugins/groonga-normalizer-mysql/Makefile.am | 2 +-
.../plugins/groonga-normalizer-mysql/autogen.sh | 2 +-
.../groonga-normalizer-mysql/build/Makefile.am | 2 +-
.../build/cmake_modules/Makefile.am | 2 +-
.../build/cmake_modules/ReadFileList.cmake | 2 +-
.../plugins/groonga-normalizer-mysql/configure.ac | 2 +-
.../groonga-normalizer-mysql/data/travis/setup.sh | 2 +-
.../groonga-normalizer-mysql/doc/Makefile.am | 2 +-
.../groonga-normalizer-mysql/doc/text/Makefile.am | 2 +-
.../groonga-normalizer-mysql/doc/text/lgpl-2.0.txt | 4 +-
.../normalizers/CMakeLists.txt | 2 +-
.../normalizers/Makefile.am | 2 +-
.../groonga-normalizer-mysql/normalizers/mysql.c | 2 +-
.../normalizers/mysql_general_ci_table.h | 4 +-
...ept_kana_ci_kana_with_voiced_sound_mark_table.h | 4 +-
.../normalizers/mysql_unicode_520_ci_table.h | 4 +-
...ept_kana_ci_kana_with_voiced_sound_mark_table.h | 4 +-
.../normalizers/mysql_unicode_ci_table.h | 4 +-
.../packages/debian/copyright | 4 +-
.../tool/dump_difference_uca.rb | 2 +-
.../tool/dump_difference_utf8.rb | 2 +-
.../tool/generate_uca_table.rb | 6 +-
.../tool/generate_utf8_table.rb | 6 +-
.../groonga-normalizer-mysql/tool/parser.rb | 2 +-
.../tool/travis/before_script.sh | 2 +-
.../tool/travis/install.sh | 2 +-
storage/myisam/CMakeLists.txt | 2 +-
storage/myisam/ft_boolean_search.c | 2 +-
storage/myisam/ft_myisam.c | 2 +-
storage/myisam/ft_nlq_search.c | 2 +-
storage/myisam/ft_parser.c | 2 +-
storage/myisam/ft_static.c | 2 +-
storage/myisam/ft_stopwords.c | 2 +-
storage/myisam/ft_update.c | 2 +-
storage/myisam/ftbench/Ecompare.pl | 2 +-
storage/myisam/ftbench/Ecreate.pl | 2 +-
storage/myisam/ftbench/Ereport.pl | 2 +-
storage/myisam/ftbench/ft-test-run.sh | 2 +-
storage/myisam/ftdefs.h | 2 +-
storage/myisam/fulltext.h | 2 +-
storage/myisam/ha_myisam.cc | 9 +-
storage/myisam/ha_myisam.h | 3 +-
storage/myisam/mi_cache.c | 2 +-
storage/myisam/mi_changed.c | 2 +-
storage/myisam/mi_check.c | 2 +-
storage/myisam/mi_checksum.c | 2 +-
storage/myisam/mi_close.c | 2 +-
storage/myisam/mi_create.c | 2 +-
storage/myisam/mi_dbug.c | 2 +-
storage/myisam/mi_delete.c | 2 +-
storage/myisam/mi_delete_all.c | 2 +-
storage/myisam/mi_delete_table.c | 2 +-
storage/myisam/mi_dynrec.c | 2 +-
storage/myisam/mi_extra.c | 2 +-
storage/myisam/mi_extrafunc.h | 2 +-
storage/myisam/mi_info.c | 2 +-
storage/myisam/mi_key.c | 2 +-
storage/myisam/mi_keycache.c | 2 +-
storage/myisam/mi_locking.c | 2 +-
storage/myisam/mi_log.c | 2 +-
storage/myisam/mi_open.c | 2 +-
storage/myisam/mi_packrec.c | 2 +-
storage/myisam/mi_page.c | 2 +-
storage/myisam/mi_panic.c | 2 +-
storage/myisam/mi_preload.c | 2 +-
storage/myisam/mi_range.c | 2 +-
storage/myisam/mi_rename.c | 2 +-
storage/myisam/mi_rfirst.c | 2 +-
storage/myisam/mi_rkey.c | 2 +-
storage/myisam/mi_rlast.c | 2 +-
storage/myisam/mi_rnext.c | 2 +-
storage/myisam/mi_rnext_same.c | 2 +-
storage/myisam/mi_rprev.c | 2 +-
storage/myisam/mi_rrnd.c | 2 +-
storage/myisam/mi_rsame.c | 2 +-
storage/myisam/mi_rsamepos.c | 2 +-
storage/myisam/mi_scan.c | 2 +-
storage/myisam/mi_search.c | 2 +-
storage/myisam/mi_static.c | 2 +-
storage/myisam/mi_statrec.c | 2 +-
storage/myisam/mi_test1.c | 2 +-
storage/myisam/mi_test2.c | 2 +-
storage/myisam/mi_test3.c | 2 +-
storage/myisam/mi_test_all.sh | 2 +-
storage/myisam/mi_unique.c | 2 +-
storage/myisam/mi_update.c | 2 +-
storage/myisam/mi_write.c | 3 +-
storage/myisam/myisam_ftdump.c | 2 +-
storage/myisam/myisamchk.c | 2 +-
storage/myisam/myisamdef.h | 2 +-
storage/myisam/myisamlog.c | 2 +-
storage/myisam/myisampack.c | 2 +-
storage/myisam/rt_index.c | 2 +-
storage/myisam/rt_index.h | 2 +-
storage/myisam/rt_key.c | 2 +-
storage/myisam/rt_key.h | 2 +-
storage/myisam/rt_mbr.c | 2 +-
storage/myisam/rt_mbr.h | 2 +-
storage/myisam/rt_split.c | 2 +-
storage/myisam/rt_test.c | 2 +-
storage/myisam/sort.c | 2 +-
storage/myisam/sp_defs.h | 2 +-
storage/myisam/sp_key.c | 2 +-
storage/myisam/sp_test.c | 2 +-
storage/myisammrg/CMakeLists.txt | 2 +-
storage/myisammrg/ha_myisammrg.cc | 2 +-
storage/myisammrg/ha_myisammrg.h | 2 +-
storage/myisammrg/myrg_close.c | 2 +-
storage/myisammrg/myrg_create.c | 2 +-
storage/myisammrg/myrg_def.h | 2 +-
storage/myisammrg/myrg_delete.c | 2 +-
storage/myisammrg/myrg_extra.c | 2 +-
storage/myisammrg/myrg_info.c | 2 +-
storage/myisammrg/myrg_locking.c | 2 +-
storage/myisammrg/myrg_open.c | 2 +-
storage/myisammrg/myrg_panic.c | 2 +-
storage/myisammrg/myrg_queue.c | 2 +-
storage/myisammrg/myrg_range.c | 2 +-
storage/myisammrg/myrg_records.c | 2 +-
storage/myisammrg/myrg_rfirst.c | 2 +-
storage/myisammrg/myrg_rkey.c | 2 +-
storage/myisammrg/myrg_rlast.c | 2 +-
storage/myisammrg/myrg_rnext.c | 2 +-
storage/myisammrg/myrg_rnext_same.c | 2 +-
storage/myisammrg/myrg_rprev.c | 2 +-
storage/myisammrg/myrg_rrnd.c | 2 +-
storage/myisammrg/myrg_rsame.c | 2 +-
storage/myisammrg/myrg_static.c | 2 +-
storage/myisammrg/myrg_update.c | 2 +-
storage/myisammrg/myrg_write.c | 2 +-
storage/oqgraph/graphcore-config.h | 2 +-
storage/oqgraph/graphcore-graph.cc | 2 +-
storage/oqgraph/graphcore-graph.h | 2 +-
storage/oqgraph/graphcore-types.h | 2 +-
storage/oqgraph/graphcore.cc | 2 +-
storage/oqgraph/graphcore.h | 2 +-
storage/oqgraph/ha_oqgraph.cc | 2 +-
storage/oqgraph/ha_oqgraph.h | 2 +-
storage/oqgraph/oqgraph_judy.cc | 2 +-
storage/oqgraph/oqgraph_judy.h | 2 +-
storage/oqgraph/oqgraph_probes.d | 2 +-
storage/oqgraph/oqgraph_shim.cc | 2 +-
storage/oqgraph/oqgraph_shim.h | 2 +-
storage/oqgraph/oqgraph_thunk.cc | 2 +-
storage/oqgraph/oqgraph_thunk.h | 2 +-
storage/perfschema/CMakeLists.txt | 2 +-
storage/perfschema/cursor_by_account.cc | 2 +-
storage/perfschema/cursor_by_account.h | 2 +-
storage/perfschema/cursor_by_host.cc | 2 +-
storage/perfschema/cursor_by_host.h | 2 +-
storage/perfschema/cursor_by_thread.cc | 2 +-
storage/perfschema/cursor_by_thread.h | 2 +-
.../perfschema/cursor_by_thread_connect_attr.cc | 2 +-
storage/perfschema/cursor_by_thread_connect_attr.h | 2 +-
storage/perfschema/cursor_by_user.cc | 2 +-
storage/perfschema/cursor_by_user.h | 2 +-
storage/perfschema/gen_pfs_lex_token.cc | 2 +-
storage/perfschema/ha_perfschema.cc | 2 +-
storage/perfschema/ha_perfschema.h | 2 +-
storage/perfschema/pfs.cc | 2 +-
storage/perfschema/pfs.h | 2 +-
storage/perfschema/pfs_account.cc | 2 +-
storage/perfschema/pfs_account.h | 2 +-
storage/perfschema/pfs_atomic.h | 2 +-
storage/perfschema/pfs_autosize.cc | 2 +-
storage/perfschema/pfs_column_types.h | 2 +-
storage/perfschema/pfs_column_values.cc | 2 +-
storage/perfschema/pfs_column_values.h | 2 +-
storage/perfschema/pfs_con_slice.cc | 2 +-
storage/perfschema/pfs_con_slice.h | 2 +-
storage/perfschema/pfs_defaults.cc | 2 +-
storage/perfschema/pfs_defaults.h | 2 +-
storage/perfschema/pfs_digest.cc | 2 +-
storage/perfschema/pfs_digest.h | 2 +-
storage/perfschema/pfs_engine_table.cc | 2 +-
storage/perfschema/pfs_engine_table.h | 2 +-
storage/perfschema/pfs_events.h | 2 +-
storage/perfschema/pfs_events_stages.cc | 2 +-
storage/perfschema/pfs_events_stages.h | 2 +-
storage/perfschema/pfs_events_statements.cc | 2 +-
storage/perfschema/pfs_events_statements.h | 2 +-
storage/perfschema/pfs_events_waits.cc | 2 +-
storage/perfschema/pfs_events_waits.h | 2 +-
storage/perfschema/pfs_global.cc | 2 +-
storage/perfschema/pfs_global.h | 2 +-
storage/perfschema/pfs_host.cc | 2 +-
storage/perfschema/pfs_host.h | 2 +-
storage/perfschema/pfs_instr.cc | 2 +-
storage/perfschema/pfs_instr.h | 2 +-
storage/perfschema/pfs_instr_class.cc | 2 +-
storage/perfschema/pfs_instr_class.h | 2 +-
storage/perfschema/pfs_lock.h | 2 +-
storage/perfschema/pfs_server.cc | 2 +-
storage/perfschema/pfs_server.h | 2 +-
storage/perfschema/pfs_setup_actor.cc | 2 +-
storage/perfschema/pfs_setup_actor.h | 2 +-
storage/perfschema/pfs_setup_object.cc | 2 +-
storage/perfschema/pfs_setup_object.h | 2 +-
storage/perfschema/pfs_stat.h | 2 +-
storage/perfschema/pfs_timer.cc | 25 +-
storage/perfschema/pfs_timer.h | 4 +-
storage/perfschema/pfs_user.cc | 2 +-
storage/perfschema/pfs_user.h | 2 +-
storage/perfschema/pfs_visitor.cc | 2 +-
storage/perfschema/pfs_visitor.h | 2 +-
storage/perfschema/table_accounts.cc | 2 +-
storage/perfschema/table_accounts.h | 2 +-
storage/perfschema/table_all_instr.cc | 2 +-
storage/perfschema/table_all_instr.h | 2 +-
.../table_esgs_by_account_by_event_name.cc | 2 +-
.../table_esgs_by_account_by_event_name.h | 2 +-
.../perfschema/table_esgs_by_host_by_event_name.cc | 2 +-
.../perfschema/table_esgs_by_host_by_event_name.h | 2 +-
.../table_esgs_by_thread_by_event_name.cc | 2 +-
.../table_esgs_by_thread_by_event_name.h | 2 +-
.../perfschema/table_esgs_by_user_by_event_name.cc | 2 +-
.../perfschema/table_esgs_by_user_by_event_name.h | 2 +-
.../perfschema/table_esgs_global_by_event_name.cc | 2 +-
.../perfschema/table_esgs_global_by_event_name.h | 2 +-
.../table_esms_by_account_by_event_name.cc | 2 +-
.../table_esms_by_account_by_event_name.h | 2 +-
storage/perfschema/table_esms_by_digest.cc | 2 +-
storage/perfschema/table_esms_by_digest.h | 2 +-
.../perfschema/table_esms_by_host_by_event_name.cc | 2 +-
.../perfschema/table_esms_by_host_by_event_name.h | 2 +-
.../table_esms_by_thread_by_event_name.cc | 2 +-
.../table_esms_by_thread_by_event_name.h | 2 +-
.../perfschema/table_esms_by_user_by_event_name.cc | 2 +-
.../perfschema/table_esms_by_user_by_event_name.h | 2 +-
.../perfschema/table_esms_global_by_event_name.cc | 2 +-
.../perfschema/table_esms_global_by_event_name.h | 2 +-
storage/perfschema/table_events_stages.cc | 2 +-
storage/perfschema/table_events_stages.h | 2 +-
storage/perfschema/table_events_statements.cc | 2 +-
storage/perfschema/table_events_statements.h | 2 +-
storage/perfschema/table_events_waits.cc | 2 +-
storage/perfschema/table_events_waits.h | 2 +-
storage/perfschema/table_events_waits_summary.cc | 2 +-
storage/perfschema/table_events_waits_summary.h | 2 +-
.../table_ews_by_account_by_event_name.cc | 2 +-
.../table_ews_by_account_by_event_name.h | 2 +-
.../perfschema/table_ews_by_host_by_event_name.cc | 2 +-
.../perfschema/table_ews_by_host_by_event_name.h | 2 +-
.../table_ews_by_thread_by_event_name.cc | 2 +-
.../perfschema/table_ews_by_thread_by_event_name.h | 2 +-
.../perfschema/table_ews_by_user_by_event_name.cc | 2 +-
.../perfschema/table_ews_by_user_by_event_name.h | 2 +-
.../perfschema/table_ews_global_by_event_name.cc | 4 +-
.../perfschema/table_ews_global_by_event_name.h | 4 +-
storage/perfschema/table_file_instances.cc | 2 +-
storage/perfschema/table_file_instances.h | 2 +-
.../perfschema/table_file_summary_by_event_name.cc | 2 +-
.../perfschema/table_file_summary_by_event_name.h | 2 +-
.../perfschema/table_file_summary_by_instance.cc | 2 +-
.../perfschema/table_file_summary_by_instance.h | 2 +-
storage/perfschema/table_helper.cc | 2 +-
storage/perfschema/table_helper.h | 2 +-
storage/perfschema/table_host_cache.cc | 2 +-
storage/perfschema/table_host_cache.h | 2 +-
storage/perfschema/table_hosts.cc | 2 +-
storage/perfschema/table_hosts.h | 2 +-
storage/perfschema/table_os_global_by_type.cc | 2 +-
storage/perfschema/table_os_global_by_type.h | 2 +-
storage/perfschema/table_performance_timers.cc | 12 +-
storage/perfschema/table_performance_timers.h | 2 +-
.../table_session_account_connect_attrs.cc | 2 +-
.../table_session_account_connect_attrs.h | 2 +-
storage/perfschema/table_session_connect.cc | 2 +-
storage/perfschema/table_session_connect.h | 2 +-
storage/perfschema/table_session_connect_attrs.cc | 2 +-
storage/perfschema/table_session_connect_attrs.h | 2 +-
storage/perfschema/table_setup_actors.cc | 2 +-
storage/perfschema/table_setup_actors.h | 2 +-
storage/perfschema/table_setup_consumers.cc | 2 +-
storage/perfschema/table_setup_consumers.h | 2 +-
storage/perfschema/table_setup_instruments.cc | 2 +-
storage/perfschema/table_setup_instruments.h | 2 +-
storage/perfschema/table_setup_objects.cc | 2 +-
storage/perfschema/table_setup_objects.h | 2 +-
storage/perfschema/table_setup_timers.cc | 2 +-
storage/perfschema/table_setup_timers.h | 2 +-
storage/perfschema/table_socket_instances.cc | 2 +-
storage/perfschema/table_socket_instances.h | 2 +-
.../table_socket_summary_by_event_name.cc | 2 +-
.../table_socket_summary_by_event_name.h | 2 +-
.../perfschema/table_socket_summary_by_instance.cc | 2 +-
.../perfschema/table_socket_summary_by_instance.h | 2 +-
storage/perfschema/table_sync_instances.cc | 2 +-
storage/perfschema/table_sync_instances.h | 2 +-
storage/perfschema/table_threads.cc | 2 +-
storage/perfschema/table_threads.h | 2 +-
storage/perfschema/table_tiws_by_index_usage.cc | 2 +-
storage/perfschema/table_tiws_by_index_usage.h | 2 +-
storage/perfschema/table_tiws_by_table.cc | 2 +-
storage/perfschema/table_tiws_by_table.h | 2 +-
storage/perfschema/table_tlws_by_table.cc | 2 +-
storage/perfschema/table_tlws_by_table.h | 2 +-
storage/perfschema/table_users.cc | 2 +-
storage/perfschema/table_users.h | 2 +-
storage/perfschema/unittest/CMakeLists.txt | 4 +-
storage/perfschema/unittest/conf.txt | 2 +-
storage/perfschema/unittest/pfs-t.cc | 2 +-
storage/perfschema/unittest/pfs_account-oom-t.cc | 2 +-
storage/perfschema/unittest/pfs_connect_attr-t.cc | 2 +-
storage/perfschema/unittest/pfs_host-oom-t.cc | 2 +-
storage/perfschema/unittest/pfs_instr-oom-t.cc | 2 +-
storage/perfschema/unittest/pfs_instr-t.cc | 2 +-
.../perfschema/unittest/pfs_instr_class-oom-t.cc | 2 +-
storage/perfschema/unittest/pfs_instr_class-t.cc | 2 +-
storage/perfschema/unittest/pfs_misc-t.cc | 2 +-
storage/perfschema/unittest/pfs_server_stubs.cc | 4 +-
storage/perfschema/unittest/pfs_timer-t.cc | 4 +-
storage/perfschema/unittest/pfs_user-oom-t.cc | 2 +-
storage/perfschema/unittest/stub_pfs_defaults.h | 2 +-
storage/perfschema/unittest/stub_pfs_global.h | 2 +-
storage/perfschema/unittest/stub_print_error.h | 2 +-
storage/rocksdb/CMakeLists.txt | 5 +
storage/rocksdb/ha_rocksdb.cc | 67 +-
.../mysql-test/rocksdb/r/col_opt_not_null.result | 6 +-
.../mysql-test/rocksdb/r/col_opt_null.result | 6 +-
.../mysql-test/rocksdb/r/col_opt_unsigned.result | 6 +-
.../rocksdb/r/innodb_i_s_tables_disabled.result | 342 +++++++++++
.../mysql-test/rocksdb/r/locking_issues.result | 675 +--------------------
.../rocksdb/r/locking_issues_case1_1_rc.result | 30 +
.../rocksdb/r/locking_issues_case1_1_rr.result | 30 +
.../rocksdb/r/locking_issues_case1_2_rc.result | 30 +
.../rocksdb/r/locking_issues_case1_2_rr.result | 30 +
.../rocksdb/r/locking_issues_case2_rc.result | 50 ++
.../rocksdb/r/locking_issues_case2_rc_lsr.result | 37 ++
.../rocksdb/r/locking_issues_case2_rr.result | 50 ++
.../rocksdb/r/locking_issues_case2_rr_lsr.result | 37 ++
.../rocksdb/r/locking_issues_case3_rc.result | 25 +
.../rocksdb/r/locking_issues_case3_rr.result | 23 +
.../rocksdb/r/locking_issues_case4_rc.result | 23 +
.../rocksdb/r/locking_issues_case4_rr.result | 23 +
.../rocksdb/r/locking_issues_case5_rc.result | 29 +
.../rocksdb/r/locking_issues_case5_rr.result | 28 +
.../rocksdb/r/locking_issues_case6_rc.result | 29 +
.../rocksdb/r/locking_issues_case6_rr.result | 28 +
.../rocksdb/r/locking_issues_case7_rc.result | 41 ++
.../rocksdb/r/locking_issues_case7_rc_lsr.result | 45 ++
.../rocksdb/r/locking_issues_case7_rr.result | 41 ++
.../rocksdb/r/locking_issues_case7_rr_lsr.result | 45 ++
.../mysql-test/rocksdb/r/mariadb_plugin.result | 12 +-
.../rocksdb/mysql-test/rocksdb/r/type_float.result | 6 +-
.../t/innodb_i_s_tables_disabled-master.opt | 30 +
.../rocksdb/t/innodb_i_s_tables_disabled.test | 43 ++
.../mysql-test/rocksdb/t/locking_issues.test | 66 +-
.../rocksdb/t/locking_issues_case1_1_rc.test | 4 +
.../rocksdb/t/locking_issues_case1_1_rr.test | 4 +
.../rocksdb/t/locking_issues_case1_2_rc.test | 4 +
.../rocksdb/t/locking_issues_case1_2_rr.test | 4 +
.../rocksdb/t/locking_issues_case2_rc.test | 5 +
.../rocksdb/t/locking_issues_case2_rc_lsr.test | 5 +
.../rocksdb/t/locking_issues_case2_rr.test | 5 +
.../rocksdb/t/locking_issues_case2_rr_lsr.test | 5 +
.../rocksdb/t/locking_issues_case3_rc.test | 4 +
.../rocksdb/t/locking_issues_case3_rr.test | 4 +
.../rocksdb/t/locking_issues_case4_rc.test | 4 +
.../rocksdb/t/locking_issues_case4_rr.test | 4 +
.../rocksdb/t/locking_issues_case5_rc.test | 4 +
.../rocksdb/t/locking_issues_case5_rr.test | 4 +
.../rocksdb/t/locking_issues_case6_rc.test | 4 +
.../rocksdb/t/locking_issues_case6_rr.test | 4 +
.../rocksdb/t/locking_issues_case7_rc.test | 5 +
.../rocksdb/t/locking_issues_case7_rc_lsr.test | 5 +
.../rocksdb/t/locking_issues_case7_rr.test | 5 +
.../rocksdb/t/locking_issues_case7_rr_lsr.test | 5 +
.../mysql-test/rocksdb/t/mariadb_plugin.test | 16 +-
storage/rocksdb/rdb_utils.h | 4 +-
storage/sequence/sequence.cc | 2 +-
storage/spider/ha_spider.cc | 2 +-
storage/spider/ha_spider.h | 2 +-
storage/spider/hs_client/hs_compat.h | 2 +-
storage/spider/scripts/install_spider.sql | 2 +-
storage/spider/spd_conn.cc | 2 +-
storage/spider/spd_conn.h | 2 +-
storage/spider/spd_copy_tables.cc | 2 +-
storage/spider/spd_copy_tables.h | 2 +-
storage/spider/spd_db_conn.cc | 2 +-
storage/spider/spd_db_conn.h | 2 +-
storage/spider/spd_db_handlersocket.cc | 2 +-
storage/spider/spd_db_handlersocket.h | 2 +-
storage/spider/spd_db_include.h | 2 +-
storage/spider/spd_db_mysql.cc | 2 +-
storage/spider/spd_db_mysql.h | 2 +-
storage/spider/spd_db_oracle.cc | 2 +-
storage/spider/spd_db_oracle.h | 2 +-
storage/spider/spd_direct_sql.cc | 2 +-
storage/spider/spd_direct_sql.h | 2 +-
storage/spider/spd_err.h | 2 +-
storage/spider/spd_i_s.cc | 2 +-
storage/spider/spd_include.h | 2 +-
storage/spider/spd_malloc.cc | 2 +-
storage/spider/spd_malloc.h | 2 +-
storage/spider/spd_param.cc | 2 +-
storage/spider/spd_param.h | 2 +-
storage/spider/spd_ping_table.cc | 2 +-
storage/spider/spd_ping_table.h | 2 +-
storage/spider/spd_sys_table.cc | 2 +-
storage/spider/spd_sys_table.h | 2 +-
storage/spider/spd_table.cc | 2 +-
storage/spider/spd_table.h | 2 +-
storage/spider/spd_trx.cc | 2 +-
storage/spider/spd_trx.h | 2 +-
storage/spider/spd_udf.cc | 2 +-
storage/spider/spd_udf.h | 2 +-
storage/test_sql_discovery/test_sql_discovery.cc | 2 +-
storage/tokudb/.clang-format | 40 ++
storage/tokudb/PerconaFT/COPYING.GPLv2 | 4 +-
.../PerconaFT/cmake/merge_archives_unix.cmake.in | 2 +-
.../PerconaFT/third_party/snappy-1.1.2/aclocal.m4 | 4 +-
.../PerconaFT/third_party/snappy-1.1.2/configure | 2 +-
.../PerconaFT/third_party/snappy-1.1.2/ltmain.sh | 2 +-
.../third_party/xz-4.999.9beta/COPYING.GPLv2 | 4 +-
.../third_party/xz-4.999.9beta/COPYING.LGPLv2.1 | 4 +-
.../xz-4.999.9beta/build-aux/config.sub | 2 +-
.../third_party/xz-4.999.9beta/build-aux/ltmain.sh | 2 +-
.../PerconaFT/third_party/xz-4.999.9beta/configure | 2 +-
.../third_party/xz-4.999.9beta/lib/getopt.c | 2 +-
.../third_party/xz-4.999.9beta/lib/getopt.in.h | 2 +-
.../third_party/xz-4.999.9beta/lib/getopt1.c | 2 +-
.../third_party/xz-4.999.9beta/lib/getopt_int.h | 2 +-
.../third_party/xz-4.999.9beta/m4/libtool.m4 | 2 +-
storage/tokudb/ha_tokudb.cc | 28 +-
storage/tokudb/ha_tokudb.h | 2 +-
storage/tokudb/ha_tokudb_mrr_mysql.cc | 1 +
.../mysql-test/rpl/r/rpl_tokudb_mixed_dml.result | 2 +
.../tokudb/mysql-test/tokudb_bugs/r/PS-5158.result | 6 +
.../tokudb/mysql-test/tokudb_bugs/r/PS-5163.result | 5 +
.../mysql-test/tokudb_bugs/t/PS-5158-master.opt | 2 +
.../tokudb/mysql-test/tokudb_bugs/t/PS-5158.test | 27 +
.../tokudb/mysql-test/tokudb_bugs/t/PS-5163.test | 11 +
strings/CMakeLists.txt | 2 +-
strings/conf_to_src.c | 4 +-
strings/ctype-big5.c | 2 +-
strings/ctype-bin.c | 2 +-
strings/ctype-cp932.c | 2 +-
strings/ctype-czech.c | 2 +-
strings/ctype-euc_kr.c | 2 +-
strings/ctype-eucjpms.c | 2 +-
strings/ctype-extra.c | 2 +-
strings/ctype-gb2312.c | 2 +-
strings/ctype-gbk.c | 2 +-
strings/ctype-latin1.c | 2 +-
strings/ctype-mb.c | 2 +-
strings/ctype-mb.ic | 2 +-
strings/ctype-simple.c | 2 +-
strings/ctype-sjis.c | 2 +-
strings/ctype-uca.c | 2 +-
strings/ctype-ucs2.c | 2 +-
strings/ctype-ujis.c | 2 +-
strings/ctype-utf8.c | 2 +-
strings/ctype-win1250ch.c | 2 +-
strings/ctype.c | 2 +-
strings/decimal.c | 2 +-
strings/do_ctype.c | 2 +-
strings/dtoa.c | 2 +-
strings/dump_map.c | 2 +-
strings/my_strchr.c | 2 +-
strings/my_vsnprintf.c | 2 +-
strings/strcoll.ic | 2 +-
strings/strings_def.h | 2 +-
strings/strmake.c | 2 +-
strings/strmov_overlapp.c | 2 +-
strings/t_ctype.h | 2 +-
strings/uca-dump.c | 2 +-
strings/uctypedump.c | 2 +-
strings/utr11-dump.c | 2 +-
strings/xml.c | 2 +-
support-files/CMakeLists.txt | 2 +-
support-files/MacOSX/Description.plist.sh | 2 +-
support-files/MacOSX/Info.plist.sh | 2 +-
support-files/MacOSX/MySQLCOM | 2 +-
support-files/MacOSX/StartupItem.Description.plist | 2 +-
support-files/MacOSX/StartupItem.Info.plist | 2 +-
support-files/MacOSX/StartupItem.postinstall | 2 +-
support-files/MacOSX/StartupParameters.plist.sh | 2 +-
support-files/MacOSX/mwar-wrapper | 2 +-
support-files/MacOSX/mwcc-wrapper | 2 +-
support-files/MacOSX/postflight.sh | 2 +-
support-files/MacOSX/preflight.sh | 2 +-
support-files/dtrace/locktime.d | 2 +-
support-files/dtrace/query-execandqc.d | 2 +-
support-files/dtrace/query-filesort-time.d | 2 +-
support-files/dtrace/query-network-time.d | 2 +-
support-files/dtrace/query-parse-time.d | 2 +-
support-files/dtrace/query-rowops.d | 2 +-
support-files/dtrace/query-time.d | 2 +-
support-files/dtrace/statement-time.d | 2 +-
support-files/dtrace/statement-type-aggregate.d | 2 +-
support-files/mysql.m4 | 2 +-
support-files/rpm/server-postin.sh | 2 +-
tests/CMakeLists.txt | 2 +-
tests/big_record.pl | 2 +-
tests/bug25714.c | 2 +-
tests/connect_test.c | 2 +-
tests/deadlock_test.c | 2 +-
tests/drop_test.pl | 2 +-
tests/export.pl | 2 +-
tests/fork2_test.pl | 2 +-
tests/fork_big.pl | 2 +-
tests/fork_big2.pl | 2 +-
tests/grant.pl | 2 +-
tests/index_corrupt.pl | 2 +-
tests/insert_and_repair.pl | 2 +-
tests/insert_test.c | 2 +-
tests/list_test.c | 2 +-
tests/lock_test.pl | 2 +-
tests/mysql_client_fw.c | 2 +-
tests/mysql_client_test.c | 23 +-
tests/pmail.pl | 2 +-
tests/rename_test.pl | 2 +-
tests/select_test.c | 2 +-
tests/showdb_test.c | 2 +-
tests/ssl_test.c | 2 +-
tests/table_types.pl | 2 +-
tests/test_delayed_insert.pl | 2 +-
tests/thread_test.c | 2 +-
tests/truncate.pl | 2 +-
unittest/examples/CMakeLists.txt | 2 +-
unittest/examples/core-t.c | 2 +-
unittest/examples/no_plan-t.c | 2 +-
unittest/examples/simple-t.c | 2 +-
unittest/examples/skip-t.c | 2 +-
unittest/examples/skip_all-t.c | 2 +-
unittest/examples/todo-t.c | 2 +-
unittest/json_lib/CMakeLists.txt | 2 +-
unittest/my_decimal/CMakeLists.txt | 2 +-
unittest/my_decimal/my_decimal-t.cc | 2 +-
unittest/mysys/CMakeLists.txt | 2 +-
unittest/mysys/aes-t.c | 2 +-
unittest/mysys/base64-t.c | 2 +-
unittest/mysys/bitmap-t.c | 2 +-
unittest/mysys/dynstring-t.c | 2 +-
unittest/mysys/lf-t.c | 2 +-
unittest/mysys/my_atomic-t.c | 2 +-
unittest/mysys/my_delete-t.c | 2 +-
unittest/mysys/my_malloc-t.c | 2 +-
unittest/mysys/my_rdtsc-t.c | 2 +-
unittest/mysys/my_vsnprintf-t.c | 2 +-
unittest/mysys/thr_template.c | 2 +-
unittest/mysys/waiting_threads-t.c | 2 +-
unittest/mytap/CMakeLists.txt | 2 +-
unittest/mytap/t/basic-t.c | 2 +-
unittest/mytap/tap.c | 2 +-
unittest/mytap/tap.h | 2 +-
unittest/sql/CMakeLists.txt | 2 +-
unittest/sql/explain_filename-t.cc | 2 +-
unittest/sql/mf_iocache-t.cc | 2 +-
unittest/sql/my_apc-t.cc | 2 +-
unittest/strings/strings-t.c | 2 +-
unittest/unit.pl | 2 +-
vio/CMakeLists.txt | 2 +-
vio/test-ssl.c | 2 +-
vio/test-sslclient.c | 2 +-
vio/test-sslserver.c | 2 +-
vio/vio.c | 2 +-
vio/vio_priv.h | 2 +-
vio/viopipe.c | 2 +-
vio/viosocket.c | 2 +-
vio/viossl.c | 2 +-
vio/viosslfactories.c | 2 +-
vio/viotest-ssl.c | 2 +-
vio/viotest-sslconnect.cc | 2 +-
vio/viotest.cc | 2 +-
win/create_def_file.js | 2 +-
win/packaging/CMakeLists.txt | 2 +-
win/packaging/COPYING.rtf | 4 +-
win/packaging/ca/CMakeLists.txt | 2 +-
win/packaging/ca/CustomAction.cpp | 2 +-
zlib/CMakeLists.txt | 2 +-
3893 files changed, 11761 insertions(+), 6455 deletions(-)
diff --cc README.md
index 8d4a6e7cfab,053831e4cd7..7b115d28fa7
--- a/README.md
+++ b/README.md
@@@ -44,16 -44,9 +44,16 @@@ More help is available from the Maria D
https://launchpad.net/~maria-discuss
and the #maria IRC channel on Freenode.
+Live QA for beginner contributors
+----
+MariaDB has a dedicated time each week when we answer new contributor questions live on Zulip and IRC.
+From 8:00 to 10:00 UTC on Mondays, and 10:00 to 12:00 UTC on Thursdays,
+anyone can ask any questions they’d like, and a live developer will be available to assist.
+
+New contributors can ask questions any time, but we will provide immediate feedback during that interval.
- License
- --------
-Licensing:
-----------
++Licensing
++---------
***************************************************************************
diff --cc client/mysqlimport.c
index 977e0e6ca1e,dbb2e8f7dba..3e250bdd9ed
--- a/client/mysqlimport.c
+++ b/client/mysqlimport.c
@@@ -502,8 -521,11 +509,8 @@@ static void safe_exit(int error, MYSQL
if (mysql)
mysql_close(mysql);
- free_defaults(argv_to_free);
mysql_library_end();
-#ifdef HAVE_SMEM
- my_free(shared_memory_base_name);
-#endif
+ free_defaults(argv_to_free);
my_free(opt_password);
if (error)
sf_leaking_memory= 1; /* dirty exit, some threads are still running */
diff --cc include/wsrep.h
index df8a88e1c69,a3a58324f3e..fde5c5226e7
--- a/include/wsrep.h
+++ b/include/wsrep.h
@@@ -11,8 -11,10 +11,8 @@@
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 02111-1301 USA */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
-#include <my_config.h>
-
#ifndef WSREP_INCLUDED
#define WSREP_INCLUDED
diff --cc mysql-test/main/bootstrap.test
index d75be403f13,97f5da86096..5484cd1a798
--- a/mysql-test/main/bootstrap.test
+++ b/mysql-test/main/bootstrap.test
@@@ -62,14 -59,21 +62,23 @@@ drop table t1
SELECT 'bug' as '' FROM INFORMATION_SCHEMA.ENGINES WHERE engine='innodb'
and SUPPORT='YES';
++--source include/kill_mysqld.inc
#
# MDEV-13063 Server crashes in intern_plugin_lock or assertion `plugin_ptr->ref_count == 1' fails in plugin_init
#
- --source include/kill_mysqld.inc
--error 1
--exec $MYSQLD_BOOTSTRAP_CMD --myisam_recover_options=NONE
- --source include/start_mysqld.inc
+ #
+ # MDEV-19349 mysql_install_db: segfault at tmp_file_prefix check
+ #
+ --write_file $MYSQLTEST_VARDIR/tmp/1
+ use test;
+ EOF
+ --exec $MYSQLD_BOOTSTRAP_CMD < $MYSQLTEST_VARDIR/tmp/1 >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1
+ --remove_file $MYSQLTEST_VARDIR/tmp/1
+
++--source include/start_mysqld.inc
--echo End of 5.5 tests
--source include/not_windows_embedded.inc
diff --cc mysql-test/main/func_hybrid_type.result
index 91f3949d456,c7ec29f1a49..664a872cf4c
--- a/mysql-test/main/func_hybrid_type.result
+++ b/mysql-test/main/func_hybrid_type.result
@@@ -3448,6 -3448,36 +3448,36 @@@ t1 CREATE TABLE `t1`
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
#
+ # MDEV-11015 Assertion failed: precision > 0 in decimal_bin_size upon SELECT with DISTINCT, CAST and other functions
+ #
+ CREATE TABLE t1 (b LONGBLOB);
+ INSERT IGNORE INTO t1 VALUES ('foo'),('bar');
+ SELECT DISTINCT - GREATEST( b, CAST( NULL AS DATETIME ) ) AS f FROM t1;
+ f
+ NULL
+ Warnings:
-Warning 1292 Incorrect datetime value: 'foo'
-Warning 1292 Incorrect datetime value: 'bar'
++Warning 1292 Truncated incorrect datetime value: 'foo'
++Warning 1292 Truncated incorrect datetime value: 'bar'
+ DROP TABLE t1;
+ CREATE TABLE t1 (b LONGBLOB);
+ INSERT IGNORE INTO t1 VALUES ('foo'),('bar');
+ SELECT DISTINCT - GREATEST( b, CAST( NULL AS TIME) ) AS f FROM t1;
+ f
+ NULL
+ Warnings:
-Warning 1292 Truncated incorrect time value: 'foo'
-Warning 1292 Truncated incorrect time value: 'bar'
++Warning 1292 Incorrect time value: 'foo'
++Warning 1292 Incorrect time value: 'bar'
+ DROP TABLE t1;
+ CREATE TABLE t1 (b LONGBLOB);
+ INSERT IGNORE INTO t1 VALUES ('foo'),('bar');
+ SELECT DISTINCT - GREATEST( b, CAST( NULL AS DATE) ) AS f FROM t1;
+ f
+ NULL
+ Warnings:
-Warning 1292 Incorrect datetime value: 'foo'
-Warning 1292 Incorrect datetime value: 'bar'
++Warning 1292 Truncated incorrect datetime value: 'foo'
++Warning 1292 Truncated incorrect datetime value: 'bar'
+ DROP TABLE t1;
+ #
# End of 10.1 tests
#
#
diff --cc mysql-test/main/grant4.test
index 2715b7c7145,30f08f9eea2..a63bd158a0d
--- a/mysql-test/main/grant4.test
+++ b/mysql-test/main/grant4.test
@@@ -145,6 -145,34 +145,38 @@@ disconnect con1
drop database mysqltest_db1;
drop user mysqltest_u1@localhost;
+ #
+ # MDEV-18241 Downgrade from 10.4 to 10.3 crashes
+ #
++source include/switch_to_mysql_user.inc;
+ call mtr.add_suppression("Table 'mysql.user' doesn't exist");
+ call mtr.add_suppression("'mysql.user' is not of type 'TABLE'");
+ rename table mysql.user to mysql.user1;
+ create view mysql.user as select * from mysql.user1;
+ --error ER_WRONG_OBJECT
+ flush privileges;
+ drop view mysql.user;
+ create temporary table mysql.user select * from mysql.user1 limit 0;
+ --error ER_NO_SUCH_TABLE
+ flush privileges;
+ drop temporary table mysql.user;
+ rename table mysql.user1 to mysql.user;
++source include/switch_to_mysql_global_priv.inc;
+
+ #
+ # Bug#28986737: RENAMING AND REPLACING MYSQL.USER TABLE CAN LEAD TO A SERVER CRASH
+ #
++source include/switch_to_mysql_user.inc;
+ call mtr.add_suppression('mysql.user table is damaged');
+ rename table mysql.user to mysql.user1;
+ create table mysql.user (Host char(100), User char(100));
+ --error ER_UNKNOWN_ERROR
+ flush privileges;
+ drop table mysql.user;
+ rename table mysql.user1 to mysql.user;
++source include/switch_to_mysql_global_priv.inc;
+
+ --echo End of 5.5 tests
--echo #
--echo # Additional coverage for refactoring which is made as part
diff --cc mysql-test/main/select.result
index 804830c48df,352ab4ddef4..f4fd91233b5
--- a/mysql-test/main/select.result
+++ b/mysql-test/main/select.result
@@@ -2786,19 -2786,19 +2786,19 @@@ id select_type table type possible_key
1 SIMPLE t1 index key1 key1 5 NULL 4 Using where; Using index
explain select min(key1) from t1 where key1 >= 0.3762 and rand() + 0.5 >= 0.5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range key1 key1 5 NULL 3 Using where; Using index
+1 SIMPLE t1 index key1 key1 5 NULL 4 Using where; Using index
select max(key1) from t1 where key1 <= 0.6158;
max(key1)
- 0.6158000230789185
+ 0.6158
select max(key2) from t2 where key2 <= 1.6158;
max(key2)
- 1.6158000230789185
+ 1.6158
select min(key1) from t1 where key1 >= 0.3762;
min(key1)
- 0.37619999051094055
+ 0.3762
select min(key2) from t2 where key2 >= 1.3762;
min(key2)
- 1.3761999607086182
+ 1.3762
select max(key1), min(key2) from t1, t2
where key1 <= 0.6158 and key2 >= 1.3762;
max(key1) min(key2)
diff --cc mysql-test/main/select_jcl6.result
index 31856279ed5,1c7192b75b6..a3544f6be21
--- a/mysql-test/main/select_jcl6.result
+++ b/mysql-test/main/select_jcl6.result
@@@ -2797,19 -2797,19 +2797,19 @@@ id select_type table type possible_key
1 SIMPLE t1 index key1 key1 5 NULL 4 Using where; Using index
explain select min(key1) from t1 where key1 >= 0.3762 and rand() + 0.5 >= 0.5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range key1 key1 5 NULL 3 Using where; Using index
+1 SIMPLE t1 index key1 key1 5 NULL 4 Using where; Using index
select max(key1) from t1 where key1 <= 0.6158;
max(key1)
- 0.6158000230789185
+ 0.6158
select max(key2) from t2 where key2 <= 1.6158;
max(key2)
- 1.6158000230789185
+ 1.6158
select min(key1) from t1 where key1 >= 0.3762;
min(key1)
- 0.37619999051094055
+ 0.3762
select min(key2) from t2 where key2 >= 1.3762;
min(key2)
- 1.3761999607086182
+ 1.3762
select max(key1), min(key2) from t1, t2
where key1 <= 0.6158 and key2 >= 1.3762;
max(key1) min(key2)
diff --cc mysql-test/main/select_pkeycache.result
index 804830c48df,352ab4ddef4..f4fd91233b5
--- a/mysql-test/main/select_pkeycache.result
+++ b/mysql-test/main/select_pkeycache.result
@@@ -2786,19 -2786,19 +2786,19 @@@ id select_type table type possible_key
1 SIMPLE t1 index key1 key1 5 NULL 4 Using where; Using index
explain select min(key1) from t1 where key1 >= 0.3762 and rand() + 0.5 >= 0.5;
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE t1 range key1 key1 5 NULL 3 Using where; Using index
+1 SIMPLE t1 index key1 key1 5 NULL 4 Using where; Using index
select max(key1) from t1 where key1 <= 0.6158;
max(key1)
- 0.6158000230789185
+ 0.6158
select max(key2) from t2 where key2 <= 1.6158;
max(key2)
- 1.6158000230789185
+ 1.6158
select min(key1) from t1 where key1 >= 0.3762;
min(key1)
- 0.37619999051094055
+ 0.3762
select min(key2) from t2 where key2 >= 1.3762;
min(key2)
- 1.3761999607086182
+ 1.3762
select max(key1), min(key2) from t1, t2
where key1 <= 0.6158 and key2 >= 1.3762;
max(key1) min(key2)
diff --cc mysql-test/main/table_value_constr.result
index 1d485af4a4d,318d0a76663..51198ea47d6
--- a/mysql-test/main/table_value_constr.result
+++ b/mysql-test/main/table_value_constr.result
@@@ -2189,3 -2189,400 +2189,400 @@@ EXECUTE stmt
1 + 1 2 abc
2 2 abc
DEALLOCATE PREPARE stmt;
+ #
+ # MDEV-17894: tvc with ORDER BY ... LIMIT
+ #
+ values (5), (7), (1), (3), (4) limit 2;
+ 5
+ 5
+ 7
+ explain extended values (5), (7), (1), (3), (4) limit 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ Warnings:
+ Note 1003 values (5),(7),(1),(3),(4) limit 2
+ values (5), (7), (1), (3), (4) limit 2 offset 1;
+ 5
+ 7
+ 1
+ explain extended values (5), (7), (1), (3), (4) limit 2 offset 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ Warnings:
+ Note 1003 values (5),(7),(1),(3),(4) limit 1,2
+ values (5), (7), (1), (3), (4) order by 1 limit 2;
+ 5
+ 1
+ 3
+ explain extended values (5), (7), (1), (3), (4) order by 1 limit 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNIT RESULT <unit1> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 values (5),(7),(1),(3),(4) order by 1 limit 2
+ values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1;
+ 5
+ 3
+ 4
+ explain extended values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNIT RESULT <unit1> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 values (5),(7),(1),(3),(4) order by 1 limit 1,2
+ values (5), (7), (1), (3), (4) order by 1;
+ 5
+ 1
+ 3
+ 4
+ 5
+ 7
+ explain extended values (5), (7), (1), (3), (4) order by 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNIT RESULT <unit1> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 values (5),(7),(1),(3),(4) order by 1
+ values (5,90), (7,20), (1,70), (3,50), (4,10) order by 2;
+ 5 90
+ 4 10
+ 7 20
+ 3 50
+ 1 70
+ 5 90
+ explain extended values (5,90), (7,20), (1,70), (3,50), (4,10) order by 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNIT RESULT <unit1> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 values (5,90),(7,20),(1,70),(3,50),(4,10) order by 2
+ select 2 union (values (5), (7), (1), (3), (4) limit 2);
+ 2
+ 2
+ 5
+ 7
+ explain extended select 2 union (values (5), (7), (1), (3), (4) limit 2);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 /* select#1 */ select 2 AS `2` union (values (5),(7),(1),(3),(4) limit 2)
+ select 2 union (values (5), (7), (1), (3), (4) limit 2 offset 1);
+ 2
+ 2
+ 7
+ 1
+ explain extended select 2 union (values (5), (7), (1), (3), (4) limit 2 offset 1);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 /* select#1 */ select 2 AS `2` union (values (5),(7),(1),(3),(4) limit 1,2)
+ select 2 union (values (5), (7), (1), (3), (4) order by 1 limit 2);
+ 2
+ 2
+ 1
+ 3
+ explain extended select 2 union (values (5), (7), (1), (3), (4) order by 1 limit 2);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 3 UNION <derived2> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+ 2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,3> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 /* select#1 */ select 2 AS `2` union (/* select#3 */ select `tvc_0`.`5` AS `5` from (values (5),(7),(1),(3),(4)) `tvc_0` order by 1 limit 2)
+ select 2 union (values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1);
+ 2
+ 2
+ 3
+ 4
+ explain extended select 2 union (values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 3 UNION <derived2> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+ 2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,3> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 /* select#1 */ select 2 AS `2` union (/* select#3 */ select `tvc_0`.`5` AS `5` from (values (5),(7),(1),(3),(4)) `tvc_0` order by 1 limit 1,2)
+ (values (5), (7), (1), (3), (4) limit 2) union select 2;
+ 5
+ 5
+ 7
+ 2
+ explain extended (values (5), (7), (1), (3), (4) limit 2) union select 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 2) union /* select#2 */ select 2 AS `2`
+ (values (5), (7), (1), (3), (4) limit 2 offset 1) union select 2;
+ 5
+ 7
+ 1
+ 2
+ explain extended (values (5), (7), (1), (3), (4) limit 2 offset 1) union select 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 1,2) union /* select#2 */ select 2 AS `2`
+ (values (5), (7), (1), (3), (4) order by 1 limit 2) union select 2;
+ 5
+ 1
+ 3
+ 2
+ explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2) union select 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
++1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
++3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (/* select#1 */ select `tvc_0`.`5` AS `5` from (values (5),(7),(1),(3),(4)) `tvc_0` order by 1 limit 2) union /* select#2 */ select 2 AS `2`
+ (values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1) union select 2;
+ 5
+ 3
+ 4
+ 2
+ explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1) union select 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
++1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
++3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (/* select#1 */ select `tvc_0`.`5` AS `5` from (values (5),(7),(1),(3),(4)) `tvc_0` order by 1 limit 1,2) union /* select#2 */ select 2 AS `2`
+ select 3 union all (values (5), (7), (1), (3), (4) limit 2 offset 3);
+ 3
+ 3
+ 3
+ 4
+ explain extended select 3 union all (values (5), (7), (1), (3), (4) limit 2 offset 3);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ Warnings:
+ Note 1003 /* select#1 */ select 3 AS `3` union all (values (5),(7),(1),(3),(4) limit 3,2)
+ (values (5), (7), (1), (3), (4) limit 2 offset 3) union all select 3;
+ 5
+ 3
+ 4
+ 3
+ explain extended (values (5), (7), (1), (3), (4) limit 2 offset 3) union all select 3;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 3,2) union all /* select#2 */ select 3 AS `3`
+ select 3 union all (values (5), (7), (1), (3), (4) order by 1 limit 2);
+ 3
+ 3
+ 1
+ 3
+ explain extended select 3 union all (values (5), (7), (1), (3), (4) order by 1 limit 2);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 3 UNION <derived2> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+ 2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,3> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 /* select#1 */ select 3 AS `3` union all (/* select#3 */ select `tvc_0`.`5` AS `5` from (values (5),(7),(1),(3),(4)) `tvc_0` order by 1 limit 2)
+ (values (5), (7), (1), (3), (4) order by 1 limit 2) union all select 3;
+ 5
+ 1
+ 3
+ 3
+ explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2) union all select 3;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
++1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
++3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (/* select#1 */ select `tvc_0`.`5` AS `5` from (values (5),(7),(1),(3),(4)) `tvc_0` order by 1 limit 2) union all /* select#2 */ select 3 AS `3`
+ ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union
+ ( values (5), (7), (1), (3), (4) order by 1 limit 2 );
+ 5
+ 7
+ 1
+ 3
+ explain extended ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union
+ ( values (5), (7), (1), (3), (4) order by 1 limit 2 );
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 3 UNION <derived2> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+ 2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,3> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 1,2) union (/* select#3 */ select `tvc_0`.`5` AS `5` from (values (5),(7),(1),(3),(4)) `tvc_0` order by 1 limit 2)
+ ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union all
+ ( values (5), (7), (1), (3), (4) order by 1 limit 2 );
+ 5
+ 7
+ 1
+ 1
+ 3
+ explain extended ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union all
+ ( values (5), (7), (1), (3), (4) order by 1 limit 2 );
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 3 UNION <derived2> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+ 2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,3> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 1,2) union all (/* select#3 */ select `tvc_0`.`5` AS `5` from (values (5),(7),(1),(3),(4)) `tvc_0` order by 1 limit 2)
+ (values (5), (7), (1), (3), (4) limit 2 offset 3) union all select 3 order by 1;
+ 5
+ 3
+ 3
+ 4
+ explain extended (values (5), (7), (1), (3), (4) limit 2 offset 3) union all select 3 order by 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 3,2) union all /* select#2 */ select 3 AS `3` order by 1
+ (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3 order by 1;
+ 5
+ 3
+ 3
+ 4
+ 5
+ explain extended (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3 order by 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
++1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
++3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 (/* select#1 */ select `tvc_0`.`5` AS `5` from (values (5),(7),(1),(3),(4)) `tvc_0` order by 1 limit 1,3) union all /* select#2 */ select 3 AS `3` order by 1
+ (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3
+ order by 1 limit 2 offset 1;
+ 5
+ 3
+ 4
+ explain extended (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3
+ order by 1 limit 2 offset 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
++1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
++3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 (/* select#1 */ select `tvc_0`.`5` AS `5` from (values (5),(7),(1),(3),(4)) `tvc_0` order by 1 limit 1,3) union all /* select#2 */ select 3 AS `3` order by 1 limit 1,2
+ values (5,90), (7,20), (1,70), (3,50), (4,10) order by 3;
+ ERROR 42S22: Unknown column '3' in 'order clause'
+ prepare stmt from "
+ select 2 union (values (5), (7), (1), (3), (4) limit 2)
+ ";
+ execute stmt;
+ 2
+ 2
+ 5
+ 7
+ execute stmt;
+ 2
+ 2
+ 5
+ 7
+ deallocate prepare stmt;
+ prepare stmt from "
+ select 2 union (values (5), (7), (1), (3), (4) order by 1 limit 2)
+ ";
+ execute stmt;
+ 2
+ 2
+ 1
+ 3
+ execute stmt;
+ 2
+ 2
+ 1
+ 3
+ deallocate prepare stmt;
+ prepare stmt from "
+ select 3 union all (values (5), (7), (1), (3), (4) limit 2)
+ ";
+ execute stmt;
+ 3
+ 3
+ 5
+ 7
+ execute stmt;
+ 3
+ 3
+ 5
+ 7
+ deallocate prepare stmt;
+ prepare stmt from "
+ select 3 union all (values (5), (7), (1), (3), (4) order by 1 limit 2)
+ ";
+ execute stmt;
+ 3
+ 3
+ 1
+ 3
+ execute stmt;
+ 3
+ 3
+ 1
+ 3
+ deallocate prepare stmt;
+ prepare stmt from "
+ ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union
+ ( values (5), (7), (1), (3), (4) order by 1 limit 2 );
+ ";
+ execute stmt;
+ 5
+ 7
+ 1
+ 3
+ execute stmt;
+ 5
+ 7
+ 1
+ 3
+ deallocate prepare stmt;
+ prepare stmt from "
+ values (5,90), (7,20), (1,70), (3,50), (4,10) order by 3;
+ ";
+ ERROR 42S22: Unknown column '3' in 'order clause'
+ create view v1 as values (5), (7), (1), (3), (4) order by 1 limit 2;
+ show create view v1;
+ View Create View character_set_client collation_connection
+ v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS values (5),(7),(1),(3),(4) order by 1 limit 2 latin1 latin1_swedish_ci
+ select * from v1;
+ 5
+ 1
+ 3
+ drop view v1;
+ create view v1 as
+ ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union
+ ( values (5), (7), (1), (3), (4) order by 1 limit 2 );
+ show create view v1;
+ View Create View character_set_client collation_connection
+ v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS (values (5),(7),(1),(3),(4) limit 1,2) union (values (5),(7),(1),(3),(4) order by 1 limit 2) latin1 latin1_swedish_ci
+ select * from v1;
+ 5
+ 7
+ 1
+ 3
+ drop view v1;
+ create view v1 as values (5,90), (7,20), (1,70), (3,50), (4,10) order by 3;
+ ERROR 42S22: Unknown column '3' in 'order clause'
+ create view v1 as
+ ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union
+ ( values (5), (7), (1), (3), (4) order by 2 limit 2 );
+ ERROR 42S22: Unknown column '2' in 'order clause'
diff --cc mysql-test/main/timezone2.result
index dd137045d1a,c4d13f6c678..cf3c6e01e25
--- a/mysql-test/main/timezone2.result
+++ b/mysql-test/main/timezone2.result
@@@ -333,227 -333,35 +333,260 @@@ NUL
# End of 5.3 tests
#
#
+ # Start of 10.1 tests
+ #
+ #
+ # MDEV-11895 NO_ZERO_DATE affects timestamp values without any warnings
+ #
+ SET sql_mode = '';
+ CREATE TABLE t1 (a TIMESTAMP NULL) ENGINE = MyISAM;
+ CREATE TABLE t2 (a TIMESTAMP NULL) ENGINE = MyISAM;
+ CREATE TABLE t3 (a TIMESTAMP NULL) ENGINE = MyISAM;
+ SET @@session.time_zone = 'UTC';
+ INSERT INTO t1 VALUES ('2011-10-29 23:00:00');
+ INSERT INTO t1 VALUES ('2011-10-29 23:00:01');
+ INSERT INTO t1 VALUES ('2011-10-29 23:59:59');
+ SET @@session.time_zone = 'Europe/Moscow';
+ SET sql_mode='NO_ZERO_DATE';
+ INSERT INTO t2 SELECT * FROM t1;
+ SET sql_mode='';
+ INSERT INTO t3 SELECT * FROM t1;
+ SELECT UNIX_TIMESTAMP(a), a FROM t2;
+ UNIX_TIMESTAMP(a) a
+ 1319929200 2011-10-30 02:00:00
+ 1319929201 2011-10-30 02:00:01
+ 1319932799 2011-10-30 02:59:59
+ SELECT UNIX_TIMESTAMP(a), a FROM t3;
+ UNIX_TIMESTAMP(a) a
+ 1319929200 2011-10-30 02:00:00
+ 1319929201 2011-10-30 02:00:01
+ 1319932799 2011-10-30 02:59:59
+ DROP TABLE t1, t2, t3;
+ #
+ # End of 10.1 tests
+ #
++#
+# Start of 10.4 tests
+#
+#
+# MDEV-17203 Move fractional second truncation from Item_xxx_typecast::get_date() to Time and Datetime constructors
+# (an addition for the test for MDEV-4653)
+SET timestamp=unix_timestamp('2001-02-03 10:20:30');
+SET old_mode=ZERO_DATE_TIME_CAST;
+SELECT CONVERT_TZ(TIME('00:00:00'),'+00:00','+7:5');
+CONVERT_TZ(TIME('00:00:00'),'+00:00','+7:5')
+NULL
+Warnings:
+Warning 1292 Truncated incorrect datetime value: '00:00:00'
+SELECT CONVERT_TZ(TIME('2010-01-01 00:00:00'),'+00:00','+7:5');
+CONVERT_TZ(TIME('2010-01-01 00:00:00'),'+00:00','+7:5')
+NULL
+Warnings:
+Warning 1292 Truncated incorrect datetime value: '00:00:00'
+SET old_mode=DEFAULT;
+SET timestamp=DEFAULT;
+#
+# MDEV-13995 MAX(timestamp) returns a wrong result near DST change
+#
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526) /*summer time in Moscow*/);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526+3599) /*winter time in Moscow*/);
+SET time_zone='Europe/Moscow';
+SELECT a, UNIX_TIMESTAMP(a) FROM t1;
+a UNIX_TIMESTAMP(a)
+2010-10-31 02:25:26 1288477526
+2010-10-31 02:25:25 1288481125
+SELECT UNIX_TIMESTAMP(MAX(a)) AS a FROM t1;
+a
+1288481125
+CREATE TABLE t2 (a TIMESTAMP);
+INSERT INTO t2 SELECT MAX(a) AS a FROM t1;
+SELECT a, UNIX_TIMESTAMP(a) FROM t2;
+a UNIX_TIMESTAMP(a)
+2010-10-31 02:25:25 1288481125
+DROP TABLE t2;
+DROP TABLE t1;
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP);
+CREATE TABLE t2 (a TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526) /*summer time in Moscow*/);
+INSERT INTO t2 VALUES (FROM_UNIXTIME(1288477526+3599) /*winter time in Moscow*/);
+SET time_zone='Europe/Moscow';
+SELECT UNIX_TIMESTAMP(t1.a), UNIX_TIMESTAMP(t2.a) FROM t1,t2;
+UNIX_TIMESTAMP(t1.a) UNIX_TIMESTAMP(t2.a)
+1288477526 1288481125
+SELECT * FROM t1,t2 WHERE t1.a < t2.a;
+a a
+2010-10-31 02:25:26 2010-10-31 02:25:25
+DROP TABLE t1,t2;
+BEGIN NOT ATOMIC
+DECLARE a,b TIMESTAMP;
+SET time_zone='+00:00';
+SET a=FROM_UNIXTIME(1288477526);
+SET b=FROM_UNIXTIME(1288481125);
+SELECT a < b;
+SET time_zone='Europe/Moscow';
+SELECT a < b;
+END;
+$$
+a < b
+1
+a < b
+1
+CREATE OR REPLACE FUNCTION f1(uts INT) RETURNS TIMESTAMP
+BEGIN
+DECLARE ts TIMESTAMP;
+DECLARE tz VARCHAR(64) DEFAULT @@time_zone;
+SET time_zone='+00:00';
+SET ts=FROM_UNIXTIME(uts);
+SET time_zone=tz;
+RETURN ts;
+END;
+$$
+SET time_zone='+00:00';
+SELECT f1(1288477526) < f1(1288481125);
+f1(1288477526) < f1(1288481125)
+1
+SET time_zone='Europe/Moscow';
+SELECT f1(1288477526) < f1(1288481125);
+f1(1288477526) < f1(1288481125)
+1
+DROP FUNCTION f1;
+CREATE TABLE t1 (a TIMESTAMP,b TIMESTAMP);
+SET time_zone='+00:00';
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526) /*summer time in Mowcow*/,
+FROM_UNIXTIME(1288481125) /*winter time in Moscow*/);
+SELECT *, LEAST(a,b) FROM t1;
+a b LEAST(a,b)
+2010-10-30 22:25:26 2010-10-30 23:25:25 2010-10-30 22:25:26
+SET time_zone='Europe/Moscow';
+SELECT *, LEAST(a,b) FROM t1;
+a b LEAST(a,b)
+2010-10-31 02:25:26 2010-10-31 02:25:25 2010-10-31 02:25:26
+SELECT UNIX_TIMESTAMP(a), UNIX_TIMESTAMP(b), UNIX_TIMESTAMP(LEAST(a,b)) FROM t1;
+UNIX_TIMESTAMP(a) UNIX_TIMESTAMP(b) UNIX_TIMESTAMP(LEAST(a,b))
+1288477526 1288481125 1288477526
+DROP TABLE t1;
+CREATE TABLE t1 (a TIMESTAMP,b TIMESTAMP,c TIMESTAMP);
+SET time_zone='+00:00';
+INSERT INTO t1 VALUES (
+FROM_UNIXTIME(1288477526) /*summer time in Moscow*/,
+FROM_UNIXTIME(1288481125) /*winter time in Moscow*/,
+FROM_UNIXTIME(1288481126) /*winter time in Moscow*/);
+SELECT b BETWEEN a AND c FROM t1;
+b BETWEEN a AND c
+1
+SET time_zone='Europe/Moscow';
+SELECT b BETWEEN a AND c FROM t1;
+b BETWEEN a AND c
+1
+DROP TABLE t1;
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526) /*summer time in Mowcow*/);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288481125) /*winter time in Moscow*/);
+SELECT a, UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
+a UNIX_TIMESTAMP(a)
+2010-10-30 22:25:26 1288477526
+2010-10-30 23:25:25 1288481125
+SELECT COALESCE(a) AS a, UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
+a UNIX_TIMESTAMP(a)
+2010-10-30 22:25:26 1288477526
+2010-10-30 23:25:25 1288481125
+SET time_zone='Europe/Moscow';
+SELECT a, UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
+a UNIX_TIMESTAMP(a)
+2010-10-31 02:25:26 1288477526
+2010-10-31 02:25:25 1288481125
+SELECT COALESCE(a) AS a, UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
+a UNIX_TIMESTAMP(a)
+2010-10-31 02:25:26 1288477526
+2010-10-31 02:25:25 1288481125
+DROP TABLE t1;
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526) /*summer time in Mowcow*/);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288481126) /*winter time in Moscow*/);
+SET time_zone='Europe/Moscow';
+SELECT a, UNIX_TIMESTAMP(a) FROM t1 GROUP BY a;
+a UNIX_TIMESTAMP(a)
+2010-10-31 02:25:26 1288477526
+2010-10-31 02:25:26 1288481126
+DROP TABLE t1;
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP, b TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526),FROM_UNIXTIME(1288481126));
+SELECT UNIX_TIMESTAMP(a),UNIX_TIMESTAMP(b),CASE a WHEN b THEN 'eq' ELSE 'ne' END AS x FROM t1;
+UNIX_TIMESTAMP(a) UNIX_TIMESTAMP(b) x
+1288477526 1288481126 ne
+SET time_zone='Europe/Moscow';
+SELECT UNIX_TIMESTAMP(a),UNIX_TIMESTAMP(b),CASE a WHEN b THEN 'eq' ELSE 'ne' END AS x FROM t1;
+UNIX_TIMESTAMP(a) UNIX_TIMESTAMP(b) x
+1288477526 1288481126 ne
+DROP TABLE t1;
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP, b TIMESTAMP,c TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526),FROM_UNIXTIME(1288481126),FROM_UNIXTIME(1288481127));
+SELECT UNIX_TIMESTAMP(a),UNIX_TIMESTAMP(b),a IN (b,c) AS x FROM t1;
+UNIX_TIMESTAMP(a) UNIX_TIMESTAMP(b) x
+1288477526 1288481126 0
+SET time_zone='Europe/Moscow';
+SELECT UNIX_TIMESTAMP(a),UNIX_TIMESTAMP(b),a IN (b,c) AS x FROM t1;
+UNIX_TIMESTAMP(a) UNIX_TIMESTAMP(b) x
+1288477526 1288481126 0
+DROP TABLE t1;
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP, b TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526),FROM_UNIXTIME(1288481126));
+SELECT * FROM t1 WHERE a = (SELECT MAX(b) FROM t1);
+a b
+SELECT * FROM t1 WHERE a = (SELECT MIN(b) FROM t1);
+a b
+SELECT * FROM t1 WHERE a IN ((SELECT MAX(b) FROM t1), (SELECT MIN(b) FROM t1));
+a b
+SET time_zone='Europe/Moscow';
+SELECT * FROM t1 WHERE a = (SELECT MAX(b) FROM t1);
+a b
+SELECT * FROM t1 WHERE a = (SELECT MIN(b) FROM t1);
+a b
+SELECT * FROM t1 WHERE a IN ((SELECT MAX(b) FROM t1), (SELECT MIN(b) FROM t1));
+a b
+DROP TABLE t1;
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP, b TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1100000000),FROM_UNIXTIME(1200000000));
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1100000001),FROM_UNIXTIME(1200000001));
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526),FROM_UNIXTIME(1288481126));
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1300000000),FROM_UNIXTIME(1400000000));
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1300000001),FROM_UNIXTIME(1400000001));
+SELECT * FROM t1 WHERE a = (SELECT MAX(b) FROM t1);
+a b
+SELECT * FROM t1 WHERE a = (SELECT MIN(b) FROM t1);
+a b
+SELECT * FROM t1 WHERE a IN ((SELECT MAX(b) FROM t1), (SELECT MIN(b) FROM t1));
+a b
+SET time_zone='Europe/Moscow';
+SELECT * FROM t1 WHERE a = (SELECT MAX(b) FROM t1);
+a b
+SELECT * FROM t1 WHERE a = (SELECT MIN(b) FROM t1);
+a b
+SELECT * FROM t1 WHERE a IN ((SELECT MAX(b) FROM t1), (SELECT MIN(b) FROM t1));
+a b
+DROP TABLE t1;
+#
+# MDEV-17979 Assertion `0' failed in Item::val_native upon SELECT with timestamp, NULLIF, GROUP BY
+#
+SET time_zone='+00:00';
+CREATE TABLE t1 (a INT, ts TIMESTAMP) ENGINE=MyISAM;
+INSERT INTO t1 VALUES (1, FROM_UNIXTIME(1288481126) /*winter time in Moscow*/);
+SET time_zone='Europe/Moscow';
+CREATE TABLE t2 AS SELECT ts, COALESCE(ts) AS cts FROM t1 GROUP BY cts;
+SELECT ts, cts, UNIX_TIMESTAMP(ts) AS uts, UNIX_TIMESTAMP(cts) AS ucts FROM t2;
+ts cts uts ucts
+2010-10-31 02:25:26 2010-10-31 02:25:26 1288481126 1288481126
+DROP TABLE t1,t2;
+SET time_zone=DEFAULT;
+#
+# End of 10.4 tests
+#
diff --cc mysql-test/main/timezone2.test
index db515653651,1e5615502da..e945923da7a
--- a/mysql-test/main/timezone2.test
+++ b/mysql-test/main/timezone2.test
@@@ -309,200 -309,33 +309,231 @@@ SELECT CONVERT_TZ('2001-10-08 00:00:00'
--echo # End of 5.3 tests
--echo #
+ --echo #
+ --echo # Start of 10.1 tests
+ --echo #
+
+ --echo #
+ --echo # MDEV-11895 NO_ZERO_DATE affects timestamp values without any warnings
+ --echo #
+
+ SET sql_mode = '';
+ CREATE TABLE t1 (a TIMESTAMP NULL) ENGINE = MyISAM;
+ CREATE TABLE t2 (a TIMESTAMP NULL) ENGINE = MyISAM;
+ CREATE TABLE t3 (a TIMESTAMP NULL) ENGINE = MyISAM;
+
+ SET @@session.time_zone = 'UTC';
+ INSERT INTO t1 VALUES ('2011-10-29 23:00:00');
+ INSERT INTO t1 VALUES ('2011-10-29 23:00:01');
+ INSERT INTO t1 VALUES ('2011-10-29 23:59:59');
+
+ SET @@session.time_zone = 'Europe/Moscow';
+ SET sql_mode='NO_ZERO_DATE';
+ INSERT INTO t2 SELECT * FROM t1;
+ SET sql_mode='';
+ INSERT INTO t3 SELECT * FROM t1;
+ SELECT UNIX_TIMESTAMP(a), a FROM t2;
+ SELECT UNIX_TIMESTAMP(a), a FROM t3;
+ DROP TABLE t1, t2, t3;
+
+ --echo #
+ --echo # End of 10.1 tests
+ --echo #
++
+--echo #
+--echo # Start of 10.4 tests
+--echo #
+
+--echo #
+--echo # MDEV-17203 Move fractional second truncation from Item_xxx_typecast::get_date() to Time and Datetime constructors
+--echo # (an addition for the test for MDEV-4653)
+
+SET timestamp=unix_timestamp('2001-02-03 10:20:30');
+SET old_mode=ZERO_DATE_TIME_CAST;
+SELECT CONVERT_TZ(TIME('00:00:00'),'+00:00','+7:5');
+SELECT CONVERT_TZ(TIME('2010-01-01 00:00:00'),'+00:00','+7:5');
+SET old_mode=DEFAULT;
+SET timestamp=DEFAULT;
+
+--echo #
+--echo # MDEV-13995 MAX(timestamp) returns a wrong result near DST change
+--echo #
+
+# MAX()
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526) /*summer time in Moscow*/);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526+3599) /*winter time in Moscow*/);
+SET time_zone='Europe/Moscow';
+SELECT a, UNIX_TIMESTAMP(a) FROM t1;
+SELECT UNIX_TIMESTAMP(MAX(a)) AS a FROM t1;
+CREATE TABLE t2 (a TIMESTAMP);
+INSERT INTO t2 SELECT MAX(a) AS a FROM t1;
+SELECT a, UNIX_TIMESTAMP(a) FROM t2;
+DROP TABLE t2;
+DROP TABLE t1;
+
+
+# Comparison
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP);
+CREATE TABLE t2 (a TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526) /*summer time in Moscow*/);
+INSERT INTO t2 VALUES (FROM_UNIXTIME(1288477526+3599) /*winter time in Moscow*/);
+SET time_zone='Europe/Moscow';
+SELECT UNIX_TIMESTAMP(t1.a), UNIX_TIMESTAMP(t2.a) FROM t1,t2;
+SELECT * FROM t1,t2 WHERE t1.a < t2.a;
+DROP TABLE t1,t2;
+
+
+# SP variable comparison
+DELIMITER $$;
+BEGIN NOT ATOMIC
+ DECLARE a,b TIMESTAMP;
+ SET time_zone='+00:00';
+ SET a=FROM_UNIXTIME(1288477526);
+ SET b=FROM_UNIXTIME(1288481125);
+ SELECT a < b;
+ SET time_zone='Europe/Moscow';
+ SELECT a < b;
+END;
+$$
+DELIMITER ;$$
+
+
+# SP function comparison
+DELIMITER $$;
+CREATE OR REPLACE FUNCTION f1(uts INT) RETURNS TIMESTAMP
+BEGIN
+ DECLARE ts TIMESTAMP;
+ DECLARE tz VARCHAR(64) DEFAULT @@time_zone;
+ SET time_zone='+00:00';
+ SET ts=FROM_UNIXTIME(uts);
+ SET time_zone=tz;
+ RETURN ts;
+END;
+$$
+DELIMITER ;$$
+SET time_zone='+00:00';
+SELECT f1(1288477526) < f1(1288481125);
+SET time_zone='Europe/Moscow';
+SELECT f1(1288477526) < f1(1288481125);
+DROP FUNCTION f1;
+
+
+# LEAST()
+CREATE TABLE t1 (a TIMESTAMP,b TIMESTAMP);
+SET time_zone='+00:00';
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526) /*summer time in Mowcow*/,
+ FROM_UNIXTIME(1288481125) /*winter time in Moscow*/);
+SELECT *, LEAST(a,b) FROM t1;
+SET time_zone='Europe/Moscow';
+SELECT *, LEAST(a,b) FROM t1;
+SELECT UNIX_TIMESTAMP(a), UNIX_TIMESTAMP(b), UNIX_TIMESTAMP(LEAST(a,b)) FROM t1;
+DROP TABLE t1;
+
+
+# BETWEEN
+CREATE TABLE t1 (a TIMESTAMP,b TIMESTAMP,c TIMESTAMP);
+SET time_zone='+00:00';
+INSERT INTO t1 VALUES (
+ FROM_UNIXTIME(1288477526) /*summer time in Moscow*/,
+ FROM_UNIXTIME(1288481125) /*winter time in Moscow*/,
+ FROM_UNIXTIME(1288481126) /*winter time in Moscow*/);
+SELECT b BETWEEN a AND c FROM t1;
+SET time_zone='Europe/Moscow';
+SELECT b BETWEEN a AND c FROM t1;
+DROP TABLE t1;
+
+
+# ORDER BY
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526) /*summer time in Mowcow*/);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288481125) /*winter time in Moscow*/);
+SELECT a, UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
+SELECT COALESCE(a) AS a, UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
+SET time_zone='Europe/Moscow';
+SELECT a, UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
+SELECT COALESCE(a) AS a, UNIX_TIMESTAMP(a) FROM t1 ORDER BY a;
+DROP TABLE t1;
+
+
+# GROUP BY
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526) /*summer time in Mowcow*/);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288481126) /*winter time in Moscow*/);
+SET time_zone='Europe/Moscow';
+SELECT a, UNIX_TIMESTAMP(a) FROM t1 GROUP BY a;
+DROP TABLE t1;
+
+
+# CASE
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP, b TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526),FROM_UNIXTIME(1288481126));
+SELECT UNIX_TIMESTAMP(a),UNIX_TIMESTAMP(b),CASE a WHEN b THEN 'eq' ELSE 'ne' END AS x FROM t1;
+SET time_zone='Europe/Moscow';
+SELECT UNIX_TIMESTAMP(a),UNIX_TIMESTAMP(b),CASE a WHEN b THEN 'eq' ELSE 'ne' END AS x FROM t1;
+DROP TABLE t1;
+
+
+# IN
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP, b TIMESTAMP,c TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526),FROM_UNIXTIME(1288481126),FROM_UNIXTIME(1288481127));
+SELECT UNIX_TIMESTAMP(a),UNIX_TIMESTAMP(b),a IN (b,c) AS x FROM t1;
+SET time_zone='Europe/Moscow';
+SELECT UNIX_TIMESTAMP(a),UNIX_TIMESTAMP(b),a IN (b,c) AS x FROM t1;
+DROP TABLE t1;
+
+# Comparison and IN in combination with a subquery (with one row)
+
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP, b TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526),FROM_UNIXTIME(1288481126));
+SELECT * FROM t1 WHERE a = (SELECT MAX(b) FROM t1);
+SELECT * FROM t1 WHERE a = (SELECT MIN(b) FROM t1);
+SELECT * FROM t1 WHERE a IN ((SELECT MAX(b) FROM t1), (SELECT MIN(b) FROM t1));
+
+SET time_zone='Europe/Moscow';
+SELECT * FROM t1 WHERE a = (SELECT MAX(b) FROM t1);
+SELECT * FROM t1 WHERE a = (SELECT MIN(b) FROM t1);
+SELECT * FROM t1 WHERE a IN ((SELECT MAX(b) FROM t1), (SELECT MIN(b) FROM t1));
+DROP TABLE t1;
+
+# Comparison and IN in combinarion with a subquery (with multiple rows)
+SET time_zone='+00:00';
+CREATE TABLE t1 (a TIMESTAMP, b TIMESTAMP);
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1100000000),FROM_UNIXTIME(1200000000));
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1100000001),FROM_UNIXTIME(1200000001));
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1288477526),FROM_UNIXTIME(1288481126));
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1300000000),FROM_UNIXTIME(1400000000));
+INSERT INTO t1 VALUES (FROM_UNIXTIME(1300000001),FROM_UNIXTIME(1400000001));
+SELECT * FROM t1 WHERE a = (SELECT MAX(b) FROM t1);
+SELECT * FROM t1 WHERE a = (SELECT MIN(b) FROM t1);
+SELECT * FROM t1 WHERE a IN ((SELECT MAX(b) FROM t1), (SELECT MIN(b) FROM t1));
+
+SET time_zone='Europe/Moscow';
+SELECT * FROM t1 WHERE a = (SELECT MAX(b) FROM t1);
+SELECT * FROM t1 WHERE a = (SELECT MIN(b) FROM t1);
+SELECT * FROM t1 WHERE a IN ((SELECT MAX(b) FROM t1), (SELECT MIN(b) FROM t1));
+DROP TABLE t1;
+
+--echo #
+--echo # MDEV-17979 Assertion `0' failed in Item::val_native upon SELECT with timestamp, NULLIF, GROUP BY
+--echo #
+
+SET time_zone='+00:00';
+CREATE TABLE t1 (a INT, ts TIMESTAMP) ENGINE=MyISAM;
+INSERT INTO t1 VALUES (1, FROM_UNIXTIME(1288481126) /*winter time in Moscow*/);
+SET time_zone='Europe/Moscow';
+CREATE TABLE t2 AS SELECT ts, COALESCE(ts) AS cts FROM t1 GROUP BY cts;
+SELECT ts, cts, UNIX_TIMESTAMP(ts) AS uts, UNIX_TIMESTAMP(cts) AS ucts FROM t2;
+DROP TABLE t1,t2;
+SET time_zone=DEFAULT;
+
+--echo #
+--echo # End of 10.4 tests
+--echo #
diff --cc mysql-test/main/type_float.result
index 0ce54c0126c,217fa3aff2a..167c167ad45
--- a/mysql-test/main/type_float.result
+++ b/mysql-test/main/type_float.result
@@@ -841,34 -841,107 +841,133 @@@ DROP TABLE t1
# End of 10.2 tests
#
#
- # Start of 10.4 tests
-# Start of 10.3 tests
-#
-#
+ # MDEV-19468 Hybrid type expressions return wrong format for FLOAT
+ #
+ CREATE TABLE t1 (a FLOAT);
+ INSERT INTO t1 VALUES (0.671437);
+ SELECT a, COALESCE(a), MAX(a), LEAST(a,a), (SELECT a FROM t1) AS c FROM t1;
+ a COALESCE(a) MAX(a) LEAST(a,a) c
+ 0.671437 0.671437 0.671437 0.671437 0.671437
+ DROP TABLE t1;
+ CREATE TABLE t1 (a FLOAT);
+ INSERT INTO t1 VALUES (0.671437);
+ SELECT
+ CONCAT(a),
+ CONCAT(COALESCE(a)),
+ CONCAT(LEAST(a,a)),
+ CONCAT(MAX(a)),
+ CONCAT((SELECT a FROM t1)) AS c
+ FROM t1;
+ CONCAT(a) CONCAT(COALESCE(a)) CONCAT(LEAST(a,a)) CONCAT(MAX(a)) c
+ 0.671437 0.671437 0.671437 0.671437 0.671437
+ CREATE TABLE t2 AS SELECT
+ CONCAT(a),
+ CONCAT(COALESCE(a)),
+ CONCAT(LEAST(a,a)),
+ CONCAT(MAX(a)),
+ CONCAT((SELECT a FROM t1)) AS c
+ FROM t1;
+ SELECT * FROM t2;
+ CONCAT(a) CONCAT(COALESCE(a)) CONCAT(LEAST(a,a)) CONCAT(MAX(a)) c
+ 0.671437 0.671437 0.671437 0.671437 0.671437
+ DROP TABLE t1, t2;
+ #
+ # MDEV-16872 Add CAST(expr AS FLOAT)
+ #
+ SELECT CAST(0.671437 AS FLOAT), CONCAT(CAST(0.671437 AS FLOAT));
+ CAST(0.671437 AS FLOAT) CONCAT(CAST(0.671437 AS FLOAT))
+ 0.671437 0.671437
+ SELECT CAST(1e40 AS FLOAT), CONCAT(CAST(1e40 AS FLOAT));
+ CAST(1e40 AS FLOAT) CONCAT(CAST(1e40 AS FLOAT))
+ 3.40282e38 3.40282e38
+ Warnings:
+ Note 1264 Out of range value for column 'CAST(1e40 AS FLOAT)' at row 1
+ Note 1264 Out of range value for column 'CAST(1e40 AS FLOAT)' at row 1
+ SELECT CAST(-1e40 AS FLOAT), CONCAT(CAST(-1e40 AS FLOAT));
+ CAST(-1e40 AS FLOAT) CONCAT(CAST(-1e40 AS FLOAT))
+ -3.40282e38 -3.40282e38
+ Warnings:
+ Note 1264 Out of range value for column 'CAST(-1e40 AS FLOAT)' at row 1
+ Note 1264 Out of range value for column 'CAST(-1e40 AS FLOAT)' at row 1
+ SET sql_mode='STRICT_ALL_TABLES,STRICT_TRANS_TABLES';
+ CREATE TABLE t1 (a FLOAT);
+ INSERT INTO t1 VALUES (CAST(1e40 AS FLOAT));
+ Warnings:
+ Note 1264 Out of range value for column 'CAST(1e40 AS FLOAT)' at row 1
+ SELECT * FROM t1;
+ a
+ 3.40282e38
+ DROP TABLE t1;
+ SET sql_mode=DEFAULT;
+ EXPLAIN EXTENDED SELECT CAST(0.671437 AS FLOAT);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ Warnings:
+ Note 1003 select cast(0.671437 as float) AS `CAST(0.671437 AS FLOAT)`
+ CREATE TABLE t1 AS SELECT CAST(0.671437 AS FLOAT) AS c1;
+ SHOW CREATE TABLE t1;
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+ `c1` float DEFAULT NULL
+ ) ENGINE=MyISAM DEFAULT CHARSET=latin1
+ SELECT * FROM t1;
+ c1
+ 0.671437
+ DROP TABLE t1;
+ CREATE TABLE t1 (a FLOAT);
+ CREATE TABLE t2 AS SELECT CONCAT(a) AS c1, CONCAT(CAST(a AS FLOAT)) AS c2 FROM t1;
+ SHOW CREATE TABLE t2;
+ Table Create Table
+ t2 CREATE TABLE `t2` (
+ `c1` varchar(12) DEFAULT NULL,
+ `c2` varchar(12) DEFAULT NULL
+ ) ENGINE=MyISAM DEFAULT CHARSET=latin1
+ DROP TABLE t1, t2;
+ CREATE TABLE t1 (a FLOAT DEFAULT CAST(0.671437 AS FLOAT));
+ SHOW CREATE TABLE t1;
+ Table Create Table
+ t1 CREATE TABLE `t1` (
+ `a` float DEFAULT (cast(0.671437 as float))
+ ) ENGINE=MyISAM DEFAULT CHARSET=latin1
+ DROP TABLE t1;
+ CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, a FLOAT);
+ INSERT INTO t1 VALUES (1, 0.671437),(2, 0.671437);
+ DELETE FROM t1 WHERE a=0.671437;
+ SELECT * FROM t1;
+ id a
+ 1 0.671437
+ 2 0.671437
+ DELETE FROM t1 WHERE a=CAST(0.671437 AS FLOAT);
+ DROP TABLE t1;
+ #
+ # End of 10.3 tests
#
+#
+# MDEV-11362 True condition elimination does not work for DECIMAL and temporal dynamic SQL parameters
+#
+CREATE TABLE t1 (a DOUBLE);
+INSERT INTO t1 VALUES (1),(2),(3);
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE 1e0+a<=>1e0+a;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00
+Warnings:
+Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where 1
+EXECUTE IMMEDIATE 'EXPLAIN EXTENDED SELECT * FROM t1 WHERE ?+a<=>?+a' USING 1e0,1e0;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00
+Warnings:
+Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where 1
+EXECUTE IMMEDIATE 'EXPLAIN EXTENDED SELECT * FROM t1 WHERE ?+a<=>1e0+a' USING 1e0;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00
+Warnings:
+Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where 1
+EXECUTE IMMEDIATE 'EXPLAIN EXTENDED SELECT * FROM t1 WHERE 1e0+a<=>?+a' USING 1e0;
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00
+Warnings:
+Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where 1
+DROP TABLE t1;
+#
+# End of 10.4 tests
+#
diff --cc mysql-test/main/type_float.test
index f42d3445e2a,65c8130b5db..4665c945a76
--- a/mysql-test/main/type_float.test
+++ b/mysql-test/main/type_float.test
@@@ -582,23 -582,78 +582,90 @@@ DROP TABLE t1
--echo # End of 10.2 tests
--echo #
---echo #
---echo # Start of 10.3 tests
---echo #
-
+ --echo #
+ --echo # MDEV-19468 Hybrid type expressions return wrong format for FLOAT
+ --echo #
+
+ CREATE TABLE t1 (a FLOAT);
+ INSERT INTO t1 VALUES (0.671437);
+ SELECT a, COALESCE(a), MAX(a), LEAST(a,a), (SELECT a FROM t1) AS c FROM t1;
+ DROP TABLE t1;
+
+ CREATE TABLE t1 (a FLOAT);
+ INSERT INTO t1 VALUES (0.671437);
+ SELECT
+ CONCAT(a),
+ CONCAT(COALESCE(a)),
+ CONCAT(LEAST(a,a)),
+ CONCAT(MAX(a)),
+ CONCAT((SELECT a FROM t1)) AS c
+ FROM t1;
+ CREATE TABLE t2 AS SELECT
+ CONCAT(a),
+ CONCAT(COALESCE(a)),
+ CONCAT(LEAST(a,a)),
+ CONCAT(MAX(a)),
+ CONCAT((SELECT a FROM t1)) AS c
+ FROM t1;
+ SELECT * FROM t2;
+ DROP TABLE t1, t2;
+
+
+ --echo #
+ --echo # MDEV-16872 Add CAST(expr AS FLOAT)
+ --echo #
+
+ SELECT CAST(0.671437 AS FLOAT), CONCAT(CAST(0.671437 AS FLOAT));
+ SELECT CAST(1e40 AS FLOAT), CONCAT(CAST(1e40 AS FLOAT));
+ SELECT CAST(-1e40 AS FLOAT), CONCAT(CAST(-1e40 AS FLOAT));
+
+ SET sql_mode='STRICT_ALL_TABLES,STRICT_TRANS_TABLES';
+ CREATE TABLE t1 (a FLOAT);
+ INSERT INTO t1 VALUES (CAST(1e40 AS FLOAT));
+ SELECT * FROM t1;
+ DROP TABLE t1;
+ SET sql_mode=DEFAULT;
+
+ EXPLAIN EXTENDED SELECT CAST(0.671437 AS FLOAT);
+
+ CREATE TABLE t1 AS SELECT CAST(0.671437 AS FLOAT) AS c1;
+ SHOW CREATE TABLE t1;
+ SELECT * FROM t1;
+ DROP TABLE t1;
+
+ CREATE TABLE t1 (a FLOAT);
+ CREATE TABLE t2 AS SELECT CONCAT(a) AS c1, CONCAT(CAST(a AS FLOAT)) AS c2 FROM t1;
+ SHOW CREATE TABLE t2;
+ DROP TABLE t1, t2;
+
+ CREATE TABLE t1 (a FLOAT DEFAULT CAST(0.671437 AS FLOAT));
+ SHOW CREATE TABLE t1;
+ DROP TABLE t1;
+
+ CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, a FLOAT);
+ INSERT INTO t1 VALUES (1, 0.671437),(2, 0.671437);
+ DELETE FROM t1 WHERE a=0.671437;
+ SELECT * FROM t1;
+ DELETE FROM t1 WHERE a=CAST(0.671437 AS FLOAT);
+ DROP TABLE t1;
+
--echo #
- --echo # Start of 10.4 tests
+ --echo # End of 10.3 tests
--echo #
+
+--echo #
+--echo # MDEV-11362 True condition elimination does not work for DECIMAL and temporal dynamic SQL parameters
+--echo #
+
+CREATE TABLE t1 (a DOUBLE);
+INSERT INTO t1 VALUES (1),(2),(3);
+EXPLAIN EXTENDED SELECT * FROM t1 WHERE 1e0+a<=>1e0+a;
+EXECUTE IMMEDIATE 'EXPLAIN EXTENDED SELECT * FROM t1 WHERE ?+a<=>?+a' USING 1e0,1e0;
+EXECUTE IMMEDIATE 'EXPLAIN EXTENDED SELECT * FROM t1 WHERE ?+a<=>1e0+a' USING 1e0;
+EXECUTE IMMEDIATE 'EXPLAIN EXTENDED SELECT * FROM t1 WHERE 1e0+a<=>?+a' USING 1e0;
+DROP TABLE t1;
+
+--echo #
+--echo # End of 10.4 tests
+--echo #
diff --cc mysql-test/suite/compat/oracle/r/table_value_constr.result
index 18fce086f6e,f0c7c4eebe1..3e72167d43d
--- a/mysql-test/suite/compat/oracle/r/table_value_constr.result
+++ b/mysql-test/suite/compat/oracle/r/table_value_constr.result
@@@ -2183,3 -2183,324 +2183,324 @@@ VALUES(1 + 1,2,'abc')
SELECT * FROM (VALUES(1 + 1,2,'abc')) t;
1 + 1 2 abc
2 2 abc
+ #
+ # MDEV-17894: tvc with ORDER BY ... LIMIT
+ #
+ values (5), (7), (1), (3), (4) limit 2;
+ 5
+ 5
+ 7
+ explain extended values (5), (7), (1), (3), (4) limit 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ Warnings:
+ Note 1003 values (5),(7),(1),(3),(4) limit 2
+ values (5), (7), (1), (3), (4) limit 2 offset 1;
+ 5
+ 7
+ 1
+ explain extended values (5), (7), (1), (3), (4) limit 2 offset 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ Warnings:
+ Note 1003 values (5),(7),(1),(3),(4) limit 1,2
+ values (5), (7), (1), (3), (4) order by 1 limit 2;
+ 5
+ 1
+ 3
+ explain extended values (5), (7), (1), (3), (4) order by 1 limit 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNIT RESULT <unit1> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 values (5),(7),(1),(3),(4) order by 1 limit 2
+ values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1;
+ 5
+ 3
+ 4
+ explain extended values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNIT RESULT <unit1> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 values (5),(7),(1),(3),(4) order by 1 limit 1,2
+ values (5), (7), (1), (3), (4) order by 1;
+ 5
+ 1
+ 3
+ 4
+ 5
+ 7
+ explain extended values (5), (7), (1), (3), (4) order by 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNIT RESULT <unit1> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 values (5),(7),(1),(3),(4) order by 1
+ values (5,90), (7,20), (1,70), (3,50), (4,10) order by 2;
+ 5 90
+ 4 10
+ 7 20
+ 3 50
+ 1 70
+ 5 90
+ explain extended values (5,90), (7,20), (1,70), (3,50), (4,10) order by 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNIT RESULT <unit1> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 values (5,90),(7,20),(1,70),(3,50),(4,10) order by 2
+ select 2 union (values (5), (7), (1), (3), (4) limit 2);
+ 2
+ 2
+ 5
+ 7
+ explain extended select 2 union (values (5), (7), (1), (3), (4) limit 2);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 /* select#1 */ select 2 AS "2" union (values (5),(7),(1),(3),(4) limit 2)
+ select 2 union (values (5), (7), (1), (3), (4) limit 2 offset 1);
+ 2
+ 2
+ 7
+ 1
+ explain extended select 2 union (values (5), (7), (1), (3), (4) limit 2 offset 1);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 /* select#1 */ select 2 AS "2" union (values (5),(7),(1),(3),(4) limit 1,2)
+ select 2 union (values (5), (7), (1), (3), (4) order by 1 limit 2);
+ 2
+ 2
+ 1
+ 3
+ explain extended select 2 union (values (5), (7), (1), (3), (4) order by 1 limit 2);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 3 UNION <derived2> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+ 2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,3> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 /* select#1 */ select 2 AS "2" union (/* select#3 */ select "tvc_0"."5" AS "5" from (values (5),(7),(1),(3),(4)) "tvc_0" order by 1 limit 2)
+ select 2 union (values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1);
+ 2
+ 2
+ 3
+ 4
+ explain extended select 2 union (values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 3 UNION <derived2> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+ 2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,3> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 /* select#1 */ select 2 AS "2" union (/* select#3 */ select "tvc_0"."5" AS "5" from (values (5),(7),(1),(3),(4)) "tvc_0" order by 1 limit 1,2)
+ (values (5), (7), (1), (3), (4) limit 2) union select 2;
+ 5
+ 5
+ 7
+ 2
+ explain extended (values (5), (7), (1), (3), (4) limit 2) union select 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 2) union /* select#2 */ select 2 AS "2"
+ (values (5), (7), (1), (3), (4) limit 2 offset 1) union select 2;
+ 5
+ 7
+ 1
+ 2
+ explain extended (values (5), (7), (1), (3), (4) limit 2 offset 1) union select 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 1,2) union /* select#2 */ select 2 AS "2"
+ (values (5), (7), (1), (3), (4) order by 1 limit 2) union select 2;
+ 5
+ 1
+ 3
+ 2
+ explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2) union select 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
++1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
++3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (/* select#1 */ select "tvc_0"."5" AS "5" from (values (5),(7),(1),(3),(4)) "tvc_0" order by 1 limit 2) union /* select#2 */ select 2 AS "2"
+ (values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1) union select 2;
+ 5
+ 3
+ 4
+ 2
+ explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1) union select 2;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
++1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
++3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (/* select#1 */ select "tvc_0"."5" AS "5" from (values (5),(7),(1),(3),(4)) "tvc_0" order by 1 limit 1,2) union /* select#2 */ select 2 AS "2"
+ select 3 union all (values (5), (7), (1), (3), (4) limit 2 offset 3);
+ 3
+ 3
+ 3
+ 4
+ explain extended select 3 union all (values (5), (7), (1), (3), (4) limit 2 offset 3);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ Warnings:
+ Note 1003 /* select#1 */ select 3 AS "3" union all (values (5),(7),(1),(3),(4) limit 3,2)
+ (values (5), (7), (1), (3), (4) limit 2 offset 3) union all select 3;
+ 5
+ 3
+ 4
+ 3
+ explain extended (values (5), (7), (1), (3), (4) limit 2 offset 3) union all select 3;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 3,2) union all /* select#2 */ select 3 AS "3"
+ select 3 union all (values (5), (7), (1), (3), (4) order by 1 limit 2);
+ 3
+ 3
+ 1
+ 3
+ explain extended select 3 union all (values (5), (7), (1), (3), (4) order by 1 limit 2);
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 3 UNION <derived2> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+ 2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,3> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 /* select#1 */ select 3 AS "3" union all (/* select#3 */ select "tvc_0"."5" AS "5" from (values (5),(7),(1),(3),(4)) "tvc_0" order by 1 limit 2)
+ (values (5), (7), (1), (3), (4) order by 1 limit 2) union all select 3;
+ 5
+ 1
+ 3
+ 3
+ explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2) union all select 3;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
++1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
++3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (/* select#1 */ select "tvc_0"."5" AS "5" from (values (5),(7),(1),(3),(4)) "tvc_0" order by 1 limit 2) union all /* select#2 */ select 3 AS "3"
+ ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union
+ ( values (5), (7), (1), (3), (4) order by 1 limit 2 );
+ 5
+ 7
+ 1
+ 3
+ explain extended ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union
+ ( values (5), (7), (1), (3), (4) order by 1 limit 2 );
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 3 UNION <derived2> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+ 2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,3> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 1,2) union (/* select#3 */ select "tvc_0"."5" AS "5" from (values (5),(7),(1),(3),(4)) "tvc_0" order by 1 limit 2)
+ ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union all
+ ( values (5), (7), (1), (3), (4) order by 1 limit 2 );
+ 5
+ 7
+ 1
+ 1
+ 3
+ explain extended ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union all
+ ( values (5), (7), (1), (3), (4) order by 1 limit 2 );
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 3 UNION <derived2> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+ 2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,3> ALL NULL NULL NULL NULL NULL NULL
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 1,2) union all (/* select#3 */ select "tvc_0"."5" AS "5" from (values (5),(7),(1),(3),(4)) "tvc_0" order by 1 limit 2)
+ (values (5), (7), (1), (3), (4) limit 2 offset 3) union all select 3 order by 1;
+ 5
+ 3
+ 3
+ 4
+ explain extended (values (5), (7), (1), (3), (4) limit 2 offset 3) union all select 3 order by 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
+ 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 (values (5),(7),(1),(3),(4) limit 3,2) union all /* select#2 */ select 3 AS "3" order by 1
+ (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3 order by 1;
+ 5
+ 3
+ 3
+ 4
+ 5
+ explain extended (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3 order by 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
++1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
++3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 (/* select#1 */ select "tvc_0"."5" AS "5" from (values (5),(7),(1),(3),(4)) "tvc_0" order by 1 limit 1,3) union all /* select#2 */ select 3 AS "3" order by 1
+ (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3
+ order by 1 limit 2 offset 1;
+ 5
+ 3
+ 4
+ explain extended (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3
+ order by 1 limit 2 offset 1;
+ id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
++1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
++3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ 2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+ NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
+ Warnings:
+ Note 1003 (/* select#1 */ select "tvc_0"."5" AS "5" from (values (5),(7),(1),(3),(4)) "tvc_0" order by 1 limit 1,3) union all /* select#2 */ select 3 AS "3" order by 1 limit 1,2
+ values (5,90), (7,20), (1,70), (3,50), (4,10) order by 3;
+ ERROR 42S22: Unknown column '3' in 'order clause'
+ create view v1 as values (5), (7), (1), (3), (4) order by 1 limit 2;
+ show create view v1;
+ View Create View character_set_client collation_connection
+ v1 CREATE VIEW "v1" AS values (5),(7),(1),(3),(4) order by 1 limit 2 latin1 latin1_swedish_ci
+ select * from v1;
+ 5
+ 1
+ 3
+ drop view v1;
+ create view v1 as
+ ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union
+ ( values (5), (7), (1), (3), (4) order by 1 limit 2 );
+ show create view v1;
+ View Create View character_set_client collation_connection
+ v1 CREATE VIEW "v1" AS (values (5),(7),(1),(3),(4) limit 1,2) union (values (5),(7),(1),(3),(4) order by 1 limit 2) latin1 latin1_swedish_ci
+ select * from v1;
+ 5
+ 7
+ 1
+ 3
+ drop view v1;
+ create view v1 as values (5,90), (7,20), (1,70), (3,50), (4,10) order by 3;
+ ERROR 42S22: Unknown column '3' in 'order clause'
+ create view v1 as
+ ( values (5), (7), (1), (3), (4) limit 2 offset 1 )
+ union
+ ( values (5), (7), (1), (3), (4) order by 2 limit 2 );
+ ERROR 42S22: Unknown column '2' in 'order clause'
diff --cc mysql-test/suite/funcs_1/r/is_routines_embedded.result
index ec375e9c5f6,ec68057eaa1..1ac3651f254
--- a/mysql-test/suite/funcs_1/r/is_routines_embedded.result
+++ b/mysql-test/suite/funcs_1/r/is_routines_embedded.result
@@@ -197,8 -197,12 +197,12 @@@ sp_6_408002_2 def db_datadict_2 sp_6_40
SELECT * FROM db_datadict_2.res_6_408002_2;
END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
-check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDE
R BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert'); SELECT * FROM INFORMATION_SCHEMA.ROUTINES; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.host, mysql.plugin, mysql.proc, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zon
e, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.user; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
+check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDE
R BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert'); SELECT * FROM INFORMATION_SCHEMA.ROUTINES; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.proc, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.tim
e_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0, SQL_SAFE_UPDATES=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
+ AddGeometryColumn def mysql AddGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin
+ set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
+ DropGeometryColumn def mysql DropGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin
+ set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' DROP ', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
connect testuser2, localhost, testuser2, , db_datadict;
SELECT * FROM information_schema.routines;
SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION
@@@ -209,8 -213,12 +213,12 @@@ sp_6_408002_2 def db_datadict_2 sp_6_40
SELECT * FROM db_datadict_2.res_6_408002_2;
END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
-check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDE
R BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert'); SELECT * FROM INFORMATION_SCHEMA.ROUTINES; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.host, mysql.plugin, mysql.proc, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zon
e, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.user; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
+check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDE
R BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert'); SELECT * FROM INFORMATION_SCHEMA.ROUTINES; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.proc, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.tim
e_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0, SQL_SAFE_UPDATES=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
+ AddGeometryColumn def mysql AddGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin
+ set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
+ DropGeometryColumn def mysql DropGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin
+ set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' DROP ', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
connect testuser3, localhost, testuser3, , test;
SELECT * FROM information_schema.routines;
SPECIFIC_NAME ROUTINE_CATALOG ROUTINE_SCHEMA ROUTINE_NAME ROUTINE_TYPE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME DTD_IDENTIFIER ROUTINE_BODY ROUTINE_DEFINITION EXTERNAL_NAME EXTERNAL_LANGUAGE PARAMETER_STYLE IS_DETERMINISTIC SQL_DATA_ACCESS SQL_PATH SECURITY_TYPE CREATED LAST_ALTERED SQL_MODE ROUTINE_COMMENT DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION
@@@ -221,8 -229,12 +229,12 @@@ sp_6_408002_2 def db_datadict_2 sp_6_40
SELECT * FROM db_datadict_2.res_6_408002_2;
END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
add_suppression def mtr add_suppression PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN INSERT INTO test_suppressions (pattern) VALUES (pattern); FLUSH NO_WRITE_TO_BINLOG TABLE test_suppressions; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
-check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDE
R BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert'); SELECT * FROM INFORMATION_SCHEMA.ROUTINES; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.host, mysql.plugin, mysql.proc, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zon
e, mysql.time_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.user; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
+check_testcase def mtr check_testcase PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE variable_name NOT IN ('timestamp') AND variable_name not like "Last_IO_Err*" AND variable_name != 'INNODB_IBUF_MAX_SIZE' AND variable_name != 'INNODB_USE_NATIVE_AIO' AND variable_name != 'INNODB_BUFFER_POOL_LOAD_AT_STARTUP' AND variable_name not like 'GTID%POS' AND variable_name != 'GTID_BINLOG_STATE' ORDER BY variable_name; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA ORDER BY BINARY SCHEMA_NAME; SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mtr_wsrep_notify', 'wsrep_schema') ORDER BY BINARY SCHEMA_NAME; SELECT table_name AS tables_in_test FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='test'; SELECT CONCAT(table_schema, '.', table_name) AS tables_in_mysql FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='mysql' ORDE
R BY tables_in_mysql; SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql; SELECT * FROM INFORMATION_SCHEMA.EVENTS; SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME NOT IN ('gs_insert', 'ts_insert'); SELECT * FROM INFORMATION_SCHEMA.ROUTINES; SHOW STATUS LIKE 'slave_open_temp_tables'; checksum table mysql.columns_priv, mysql.db, mysql.func, mysql.help_category, mysql.help_keyword, mysql.help_relation, mysql.plugin, mysql.proc, mysql.procs_priv, mysql.roles_mapping, mysql.tables_priv, mysql.time_zone, mysql.tim
e_zone_leap_second, mysql.time_zone_name, mysql.time_zone_transition, mysql.time_zone_transition_type, mysql.global_priv; SELECT * FROM INFORMATION_SCHEMA.PLUGINS; select * from information_schema.session_variables where variable_name = 'debug_sync'; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
check_warnings def mtr check_warnings PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL BEGIN DECLARE `pos` bigint unsigned; SET SQL_LOG_BIN=0, SQL_SAFE_UPDATES=0; UPDATE error_log el, global_suppressions gs SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP gs.pattern; UPDATE error_log el, test_suppressions ts SET suspicious=0 WHERE el.suspicious=1 AND el.line REGEXP ts.pattern; SELECT COUNT(*) INTO @num_warnings FROM error_log WHERE suspicious=1; IF @num_warnings > 0 THEN SELECT line FROM error_log WHERE suspicious=1; SELECT 2 INTO result; ELSE SELECT 0 INTO RESULT; END IF; TRUNCATE test_suppressions; DROP TABLE error_log; END NULL NULL SQL NO CONTAINS SQL NULL DEFINER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost utf8 utf8_general_ci latin1_swedish_ci
+ AddGeometryColumn def mysql AddGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin
+ set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
+ DropGeometryColumn def mysql DropGeometryColumn PROCEDURE NULL NULL NULL NULL NULL NULL NULL NULL SQL begin
+ set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' DROP ', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end NULL NULL SQL NO CONTAINS SQL NULL INVOKER YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss root@localhost latin1 latin1_swedish_ci latin1_swedish_ci
connection default;
disconnect testuser1;
disconnect testuser2;
diff --cc mysql-test/suite/galera/r/galera_events.result
index 791b0be729d,e925e62cb91..373f063c2bd
--- a/mysql-test/suite/galera/r/galera_events.result
+++ b/mysql-test/suite/galera/r/galera_events.result
@@@ -1,7 -1,7 +1,9 @@@
+connection node_2;
+connection node_1;
connection node_1;
CREATE EVENT event1 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO SELECT 1;
+ Warnings:
+ Warning 1105 Event scheduler is switched off, use SET GLOBAL event_scheduler=ON to enable it.
connection node_2;
SELECT DEFINER= 'root@localhost', ORIGINATOR = 1, STATUS = 'SLAVESIDE_DISABLED', EVENT_TYPE = 'ONE TIME', ON_COMPLETION = 'NOT PRESERVE' FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME = 'event1';
DEFINER= 'root@localhost' ORIGINATOR = 1 STATUS = 'SLAVESIDE_DISABLED' EVENT_TYPE = 'ONE TIME' ON_COMPLETION = 'NOT PRESERVE'
diff --cc mysql-test/suite/galera/r/galera_parallel_autoinc_manytrx.result
index 09a415d47eb,0fd0f0b505a..88cb6cacc07
--- a/mysql-test/suite/galera/r/galera_parallel_autoinc_manytrx.result
+++ b/mysql-test/suite/galera/r/galera_parallel_autoinc_manytrx.result
@@@ -1,7 -1,5 +1,7 @@@
+connection node_2;
+connection node_1;
connection node_1;
- CREATE TABLE ten (f1 INTEGER);
+ CREATE TABLE ten (f1 INTEGER) Engine=InnoDB;
INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) Engine=InnoDB;
connection node_2;
diff --cc mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test
index 203d18b85a6,34558283462..31fbb6914c9
--- a/mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test
+++ b/mysql-test/suite/galera/t/galera_parallel_autoinc_largetrx.test
@@@ -18,11 -18,13 +18,12 @@@ INSERT INTO ten VALUES (1),(2),(3),(4),
CREATE TABLE t1 (f1 INTEGER AUTO_INCREMENT PRIMARY KEY, f2 INTEGER) Engine=InnoDB;
--connection node_2
+ set session wsrep_sync_wait=15;
--let $wsrep_slave_threads_orig = `SELECT @@wsrep_slave_threads`
SET GLOBAL wsrep_slave_threads = 4;
---let $wait_condition = SELECT COUNT(*) = @@wsrep_slave_threads + 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND (STATE IS NULL OR STATE NOT LIKE 'InnoDB%');
+--let $wait_condition = SELECT VARIABLE_VALUE = @@wsrep_slave_threads + 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_thread_count';
--source include/wait_condition.inc
-
--connection node_1
--send INSERT INTO t1 (f2) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;
diff --cc mysql-test/suite/innodb/r/foreign-keys.result
index 447013d408d,c4cf3a6a72d..9dee6efcb04
--- a/mysql-test/suite/innodb/r/foreign-keys.result
+++ b/mysql-test/suite/innodb/r/foreign-keys.result
@@@ -100,6 -100,30 +100,30 @@@ CREATE TABLE t2 (b INT, KEY(b)) ENGINE=
INSERT INTO t2 VALUES(2);
ALTER TABLE t2 ADD FOREIGN KEY(b) REFERENCES t1(a), LOCK=EXCLUSIVE;
DROP TABLE t2, t1;
+ #
+ # MDEV-16060 - InnoDB: Failing assertion: ut_strcmp(index->name, key->name)
+ #
+ CREATE TABLE t1 (`pk` INT PRIMARY KEY) ENGINE=InnoDB;
+ CREATE TABLE t2 LIKE t1;
+ FLUSH TABLES;
+ SET debug_sync='alter_table_intermediate_table_created SIGNAL ready WAIT_FOR go';
+ ALTER TABLE t1 ADD FOREIGN KEY(pk) REFERENCES t2(pk) ON UPDATE CASCADE;
+ connect con1, localhost, root;
+ SET debug_sync='now WAIT_FOR ready';
+ SET lock_wait_timeout=1;
+ UPDATE t2 SET pk=10 WHERE pk=1;
+ ERROR HY000: Lock wait timeout exceeded; try restarting transaction
+ PREPARE stmt FROM 'UPDATE t2 SET pk=10 WHERE pk=1';
+ DEALLOCATE PREPARE stmt;
-FLUSH TABLE t2;
+ SET debug_sync='now SIGNAL go';
+ connection default;
+ disconnect con1;
+ connection default;
+ SET debug_sync='reset';
+ SHOW OPEN TABLES FROM test;
+ Database Table In_use Name_locked
++test t2 0 0
+ DROP TABLE t1, t2;
create table t1 (a int primary key, b int) engine=innodb;
create table t2 (c int primary key, d int,
foreign key (d) references t1 (a) on update cascade) engine=innodb;
diff --cc mysql-test/suite/innodb/r/instant_alter_crash.result
index 528bd9a905a,dde97d084d4..cfcb24f8bb2
--- a/mysql-test/suite/innodb/r/instant_alter_crash.result
+++ b/mysql-test/suite/innodb/r/instant_alter_crash.result
@@@ -15,10 -16,9 +16,10 @@@ ALTER TABLE t1 ADD COLUMN (c3 TEXT NOT
connection default;
SET DEBUG_SYNC='now WAIT_FOR ddl';
SET GLOBAL innodb_flush_log_at_trx_commit=1;
- INSERT INTO t2 VALUES(3,4,'accusantium doloremque laudantium');
+ COMMIT;
# Kill the server
disconnect ddl;
+# restart
SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
SELECT * FROM t1;
id c2
diff --cc mysql-test/suite/innodb/t/foreign-keys.test
index 442467b7dbe,be2c891771b..e5950e01a11
--- a/mysql-test/suite/innodb/t/foreign-keys.test
+++ b/mysql-test/suite/innodb/t/foreign-keys.test
@@@ -127,6 -127,38 +127,37 @@@ INSERT INTO t2 VALUES(2)
ALTER TABLE t2 ADD FOREIGN KEY(b) REFERENCES t1(a), LOCK=EXCLUSIVE;
DROP TABLE t2, t1;
+
+ --echo #
+ --echo # MDEV-16060 - InnoDB: Failing assertion: ut_strcmp(index->name, key->name)
+ --echo #
+ CREATE TABLE t1 (`pk` INT PRIMARY KEY) ENGINE=InnoDB;
+ CREATE TABLE t2 LIKE t1;
+ FLUSH TABLES;
+
+ SET debug_sync='alter_table_intermediate_table_created SIGNAL ready WAIT_FOR go';
+ send ALTER TABLE t1 ADD FOREIGN KEY(pk) REFERENCES t2(pk) ON UPDATE CASCADE;
+
+ connect con1, localhost, root;
+ SET debug_sync='now WAIT_FOR ready';
+ SET lock_wait_timeout=1; # change to 0 in 10.3
+ --error ER_LOCK_WAIT_TIMEOUT
+ UPDATE t2 SET pk=10 WHERE pk=1;
+ PREPARE stmt FROM 'UPDATE t2 SET pk=10 WHERE pk=1';
+ DEALLOCATE PREPARE stmt;
-FLUSH TABLE t2;
+ SET debug_sync='now SIGNAL go';
+
+ connection default;
+ reap;
+
+ # Cleanup
+ disconnect con1;
+
+ connection default;
+ SET debug_sync='reset';
+ SHOW OPEN TABLES FROM test;
+ DROP TABLE t1, t2;
+
#
# FK and prelocking:
# child table accesses (reads and writes) wait for locks.
diff --cc mysql-test/suite/plugins/r/pam.result
index a16cd7f3d43,46f1223d7b3..1d70f530969
--- a/mysql-test/suite/plugins/r/pam.result
+++ b/mysql-test/suite/plugins/r/pam.result
@@@ -20,13 -20,26 +20,33 @@@ Challenge input first
Enter: not very secret challenge
Now, the magic number!
PIN: ****
+#
+# athentication is unsuccessful
+#
+Challenge input first.
+Enter: crash pam module
+Now, the magic number!
+PIN: ***
drop user test_pam;
drop user pam_test;
+ create user PAM_TEST identified via pam using 'mariadb_mtr';
+ #
+ # athentication is unsuccessful
+ #
+ Challenge input first.
+ Enter: not very secret challenge
+ Now, the magic number!
+ PIN: ****
+ set global pam_winbind_workaround=1;
+ #
+ # athentication is successful
+ #
+ Challenge input first.
+ Enter: not very secret challenge
+ Now, the magic number!
+ PIN: ****
+ select user(), current_user(), database();
+ user() current_user() database()
+ PAM_TEST@localhost PAM_TEST@% test
+ drop user PAM_TEST;
uninstall plugin pam;
diff --cc mysql-test/suite/plugins/t/pam.test
index 6bb282f68c0,8441b83c5c3..040b26ef8b8
--- a/mysql-test/suite/plugins/t/pam.test
+++ b/mysql-test/suite/plugins/t/pam.test
@@@ -29,18 -23,28 +29,35 @@@ EO
--echo # athentication is unsuccessful
--echo #
--error 1
- --exec $MYSQL_TEST -u test_pam --plugin-dir=$plugindir < $MYSQLTEST_VARDIR/tmp/pam_bad.txt
+ --exec $MYSQL_TEST -u test_pam < $MYSQLTEST_VARDIR/tmp/pam_bad.txt
+--echo #
+--echo # athentication is unsuccessful
+--echo #
+--error 1
+--exec $MYSQL_TEST -u test_pam --plugin-dir=$plugindir < $MYSQLTEST_VARDIR/tmp/pam_ugly.txt
+
- --remove_file $MYSQLTEST_VARDIR/tmp/pam_good.txt
- --remove_file $MYSQLTEST_VARDIR/tmp/pam_bad.txt
drop user test_pam;
drop user pam_test;
+ create user PAM_TEST identified via pam using 'mariadb_mtr';
+
+ --echo #
+ --echo # athentication is unsuccessful
+ --echo #
+ --error 1
+ --exec $MYSQL_TEST -u PAM_TEST < $MYSQLTEST_VARDIR/tmp/pam_good.txt
+
+ set global pam_winbind_workaround=1;
+ --echo #
+ --echo # athentication is successful
+ --echo #
+ --exec $MYSQL_TEST -u PAM_TEST < $MYSQLTEST_VARDIR/tmp/pam_good.txt
+
+ --remove_file $MYSQLTEST_VARDIR/tmp/pam_good.txt
+ --remove_file $MYSQLTEST_VARDIR/tmp/pam_bad.txt
++--remove_file $MYSQLTEST_VARDIR/tmp/pam_ugly.txt
+ drop user PAM_TEST;
+
let $count_sessions= 1;
--source include/wait_until_count_sessions.inc
uninstall plugin pam;
diff --cc mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result
index 89f59deae73,dce79837700..7dd3907f102
--- a/mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result
+++ b/mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result
@@@ -677,8 -676,11 +677,10 @@@ DROP TRIGGER tr1
******************** EVENTS ********************
-GRANT EVENT ON *.* TO 'root'@'localhost';
INSERT INTO t1 VALUES(1, 'test1');
CREATE EVENT e1 ON SCHEDULE EVERY '1' SECOND COMMENT 'e_second_comment' DO DELETE FROM t1;
+ Warnings:
+ Warning 1105 Event scheduler is switched off, use SET GLOBAL event_scheduler=ON to enable it.
SHOW EVENTS;
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
test_rpl e1 root@localhost SYSTEM RECURRING NULL 1 # # NULL ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
diff --cc plugin/auth_ed25519/server_ed25519.c
index d2e9e70a9b9,81fc3e66755..6fec98c56fc
--- a/plugin/auth_ed25519/server_ed25519.c
+++ b/plugin/auth_ed25519/server_ed25519.c
@@@ -12,10 -12,9 +12,10 @@@
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 02111-1301 USA */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#include <mysql/plugin_auth.h>
+#include <mysqld_error.h>
#include "common.h"
#if !defined(__attribute__) && !defined(__GNUC__)
diff --cc plugin/auth_pam/auth_pam.c
index 779f6ced1ad,fae73aea690..599b323b0b7
--- a/plugin/auth_pam/auth_pam.c
+++ b/plugin/auth_pam/auth_pam.c
@@@ -28,167 -52,160 +28,171 @@@ static char pam_debug = 0
#define PAM_DEBUG(X) /* no-op */
#endif
+ static char winbind_hack = 0;
+
-static int conv(int n, const struct pam_message **msg,
- struct pam_response **resp, void *data)
+static char *opt_plugin_dir; /* To be dynamically linked. */
+static const char *tool_name= "auth_pam_tool_dir/auth_pam_tool";
+static const int tool_name_len= 31;
+
+static int pam_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info)
{
- struct param *param = (struct param *)data;
- unsigned char *end = param->buf + sizeof(param->buf) - 1;
- int i;
+ int p_to_c[2], c_to_p[2]; /* Parent-to-child and child-to-parent pipes. */
+ pid_t proc_id;
+ int result= CR_ERROR, pkt_len;
+ unsigned char field, *pkt;
- *resp = 0;
+ PAM_DEBUG((stderr, "PAM: opening pipes.\n"));
+ if (pipe(p_to_c) < 0 || pipe(c_to_p) < 0)
+ {
+ /* Error creating pipes. */
+ return CR_ERROR;
+ }
+ PAM_DEBUG((stderr, "PAM: forking.\n"));
+ if ((proc_id= fork()) < 0)
+ {
+ /* Error forking. */
+ close(p_to_c[0]);
+ close(c_to_p[1]);
+ goto error_ret;
+ }
- for (i = 0; i < n; i++)
+ if (proc_id == 0)
{
- /* if there's a message - append it to the buffer */
- if (msg[i]->msg)
+ /* The 'sandbox' process started. */
+ char toolpath[FN_REFLEN];
+ size_t plugin_dir_len= strlen(opt_plugin_dir);
+
+ PAM_DEBUG((stderr, "PAM: Child process prepares pipes.\n"));
+
+ if (close(p_to_c[1]) < 0 ||
+ close(c_to_p[0]) < 0 ||
+ dup2(p_to_c[0], 0) < 0 || /* Parent's pipe to STDIN. */
+ dup2(c_to_p[1], 1) < 0) /* Sandbox's pipe to STDOUT. */
{
- int len = strlen(msg[i]->msg);
- if (len > end - param->ptr)
- len = end - param->ptr;
- if (len > 0)
- {
- memcpy(param->ptr, msg[i]->msg, len);
- param->ptr+= len;
- *(param->ptr)++ = '\n';
- }
+ exit(-1);
}
- /* if the message style is *_PROMPT_*, meaning PAM asks a question,
- send the accumulated text to the client, read the reply */
- if (msg[i]->msg_style == PAM_PROMPT_ECHO_OFF ||
- msg[i]->msg_style == PAM_PROMPT_ECHO_ON)
+
+ PAM_DEBUG((stderr, "PAM: check tool directory: %s, %s.\n",
+ opt_plugin_dir, tool_name));
+ if (plugin_dir_len + tool_name_len + 2 > sizeof(toolpath))
{
- int pkt_len;
- unsigned char *pkt;
+ /* Tool path too long. */
+ exit(-1);
+ }
- /* allocate the response array.
- freeing it is the responsibility of the caller */
- if (*resp == 0)
- {
- *resp = calloc(sizeof(struct pam_response), n);
- if (*resp == 0)
- return PAM_BUF_ERR;
- }
+ memcpy(toolpath, opt_plugin_dir, plugin_dir_len);
+ if (plugin_dir_len && toolpath[plugin_dir_len-1] != FN_LIBCHAR)
+ toolpath[plugin_dir_len++]= FN_LIBCHAR;
+ memcpy(toolpath+plugin_dir_len, tool_name, tool_name_len+1);
- /* dialog plugin interprets the first byte of the packet
- as the magic number.
- 2 means "read the input with the echo enabled"
- 4 means "password-like input, echo disabled"
- C'est la vie. */
- param->buf[0] = msg[i]->msg_style == PAM_PROMPT_ECHO_ON ? 2 : 4;
- PAM_DEBUG((stderr, "PAM: conv: send(%.*s)\n", (int)(param->ptr - param->buf - 1), param->buf));
- if (param->vio->write_packet(param->vio, param->buf, param->ptr - param->buf - 1))
- return PAM_CONV_ERR;
-
- pkt_len = param->vio->read_packet(param->vio, &pkt);
- if (pkt_len < 0)
- {
- PAM_DEBUG((stderr, "PAM: conv: recv() ERROR\n"));
- return PAM_CONV_ERR;
- }
- PAM_DEBUG((stderr, "PAM: conv: recv(%.*s)\n", pkt_len, pkt));
- /* allocate and copy the reply to the response array */
- if (!((*resp)[i].resp= strndup((char*) pkt, pkt_len)))
- return PAM_CONV_ERR;
- param->ptr = param->buf + 1;
- }
+ PAM_DEBUG((stderr, "PAM: execute pam sandbox [%s].\n", toolpath));
+ (void) execl(toolpath, toolpath, NULL);
+ PAM_DEBUG((stderr, "PAM: exec() failed.\n"));
+ exit(-1);
}
- return PAM_SUCCESS;
-}
-#define DO(X) if ((status = (X)) != PAM_SUCCESS) goto end
+ /* Parent process continues. */
-#if defined(SOLARIS) || defined(__sun)
-typedef void** pam_get_item_3_arg;
-#else
-typedef const void** pam_get_item_3_arg;
-#endif
+ PAM_DEBUG((stderr, "PAM: parent continues.\n"));
+ if (close(p_to_c[0]) < 0 ||
+ close(c_to_p[1]) < 0)
+ goto error_ret;
-static int pam_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info)
-{
- pam_handle_t *pamh = NULL;
- int status;
- const char *new_username= NULL;
- struct param param;
- /* The following is written in such a way to make also solaris happy */
- struct pam_conv pam_start_arg = { &conv, (char*) ¶m };
-
- /*
- get the service name, as specified in
-
- CREATE USER ... IDENTIFIED WITH pam AS "service"
- */
- const char *service = info->auth_string && info->auth_string[0]
- ? info->auth_string : "mysql";
-
- param.ptr = param.buf + 1;
- param.vio = vio;
-
- PAM_DEBUG((stderr, "PAM: pam_start(%s, %s)\n", service, info->user_name));
- DO( pam_start(service, info->user_name, &pam_start_arg, &pamh) );
-
- PAM_DEBUG((stderr, "PAM: pam_authenticate(0)\n"));
- DO( pam_authenticate (pamh, 0) );
-
- PAM_DEBUG((stderr, "PAM: pam_acct_mgmt(0)\n"));
- DO( pam_acct_mgmt(pamh, 0) );
-
- PAM_DEBUG((stderr, "PAM: pam_get_item(PAM_USER)\n"));
- DO( pam_get_item(pamh, PAM_USER, (pam_get_item_3_arg) &new_username) );
-
- if (new_username &&
- (winbind_hack ? strcasecmp : strcmp)(new_username, info->user_name))
- strncpy(info->authenticated_as, new_username,
- sizeof(info->authenticated_as)-1);
- info->authenticated_as[sizeof(info->authenticated_as)-1]= 0;
-
-end:
- pam_end(pamh, status);
- PAM_DEBUG((stderr, "PAM: status = %d user = %s\n", status, info->authenticated_as));
- return status == PAM_SUCCESS ? CR_OK : CR_ERROR;
-}
+ /* no user name yet ? read the client handshake packet with the user name */
+ if (info->user_name == 0)
+ {
+ if ((pkt_len= vio->read_packet(vio, &pkt) < 0))
+ return CR_ERROR;
+ }
+ else
+ pkt= NULL;
-static struct st_mysql_auth info =
-{
- MYSQL_AUTHENTICATION_INTERFACE_VERSION,
- "dialog",
- pam_auth
-};
-
-static char use_cleartext_plugin;
-static MYSQL_SYSVAR_BOOL(use_cleartext_plugin, use_cleartext_plugin,
- PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
- "Use mysql_cleartext_plugin on the client side instead of the dialog "
- "plugin. This may be needed for compatibility reasons, but it only "
- "supports simple PAM policies that don't require anything besides "
- "a password", NULL, NULL, 0);
-
-static MYSQL_SYSVAR_BOOL(winbind_workaround, winbind_hack, PLUGIN_VAR_OPCMDARG,
- "Compare usernames case insensitively to work around pam_winbind "
- "unconditional username lowercasing", NULL, NULL, 0);
+ PAM_DEBUG((stderr, "PAM: parent sends user data [%s], [%s].\n",
+ info->user_name, info->auth_string));
#ifndef DBUG_OFF
- field= pam_debug;
-static MYSQL_SYSVAR_BOOL(debug, pam_debug, PLUGIN_VAR_OPCMDARG,
- "Log all PAM activity", NULL, NULL, 0);
++ field= pam_debug ? 1 : 0;
+#else
+ field= 0;
#endif
++ field|= winbind_hack ? 2 : 0;
+
+ if (write(p_to_c[1], &field, 1) != 1 ||
+ write_string(p_to_c[1], (const uchar *) info->user_name,
+ info->user_name_length) ||
+ write_string(p_to_c[1], (const uchar *) info->auth_string,
+ info->auth_string_length))
+ goto error_ret;
-static struct st_mysql_sys_var* vars[] = {
- MYSQL_SYSVAR(use_cleartext_plugin),
- MYSQL_SYSVAR(winbind_workaround),
-#ifndef DBUG_OFF
- MYSQL_SYSVAR(debug),
-#endif
- NULL
-};
+ for (;;)
+ {
+ PAM_DEBUG((stderr, "PAM: listening to the sandbox.\n"));
+ if (read(c_to_p[0], &field, 1) < 1)
+ {
+ PAM_DEBUG((stderr, "PAM: read failed.\n"));
+ goto error_ret;
+ }
+
+ if (field == AP_EOF)
+ {
+ PAM_DEBUG((stderr, "PAM: auth OK returned.\n"));
+ break;
+ }
+
+ switch (field)
+ {
+ case AP_AUTHENTICATED_AS:
+ PAM_DEBUG((stderr, "PAM: reading authenticated_as string.\n"));
+ if (read_string(c_to_p[0], info->authenticated_as,
+ sizeof(info->authenticated_as) - 1) < 0)
+ goto error_ret;
+ break;
+
+ case AP_CONV:
+ {
+ unsigned char buf[10240];
+ int buf_len;
+
+ PAM_DEBUG((stderr, "PAM: getting CONV string.\n"));
+ if ((buf_len= read_string(c_to_p[0], (char *) buf, sizeof(buf))) < 0)
+ goto error_ret;
+
+ if (!pkt || (buf[0] >> 1) != 2)
+ {
+ PAM_DEBUG((stderr, "PAM: sending CONV string.\n"));
+ if (vio->write_packet(vio, buf, buf_len))
+ goto error_ret;
+
+ PAM_DEBUG((stderr, "PAM: reading CONV answer.\n"));
+ if ((pkt_len= vio->read_packet(vio, &pkt)) < 0)
+ goto error_ret;
+ }
+
+ PAM_DEBUG((stderr, "PAM: answering CONV.\n"));
+ if (write_string(p_to_c[1], pkt, pkt_len))
+ goto error_ret;
+
+ pkt= NULL;
+ }
+ break;
+
+ default:
+ PAM_DEBUG((stderr, "PAM: unknown sandbox field.\n"));
+ goto error_ret;
+ }
+ }
+ result= CR_OK;
+
+error_ret:
+ close(p_to_c[1]);
+ close(c_to_p[0]);
+
+ PAM_DEBUG((stderr, "PAM: auth result %d.\n", result));
+ return result;
+}
+
+
+#include "auth_pam_common.c"
static int init(void *p __attribute__((unused)))
diff --cc plugin/auth_pam/auth_pam_base.c
index 67a0adbeb2e,00000000000..a23cfcbfd65
mode 100644,000000..100644
--- a/plugin/auth_pam/auth_pam_base.c
+++ b/plugin/auth_pam/auth_pam_base.c
@@@ -1,174 -1,0 +1,177 @@@
+/*
+ Copyright (c) 2011, 2018 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 02111-1301 USA */
+
+/*
+ This file contains code to interact with the PAM module.
+ To be included into auth_pam_tool.c and auth_pam_v2.c,
+
+ Before the #include these sould be defined:
+
+ struct param {
+ unsigned char buf[10240], *ptr;
+ MYSQL_PLUGIN_VIO *vio;
+ ... other arbitrary fields allowed.
+ };
+ static int write_packet(struct param *param, const unsigned char *buf,
+ int buf_len)
+ static int read_packet(struct param *param, unsigned char **pkt)
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/* It least solaris doesn't have strndup */
+
+#ifndef HAVE_STRNDUP
+char *strndup(const char *from, size_t length)
+{
+ char *ptr;
+ size_t max_length= strlen(from);
+ if (length > max_length)
+ length= max_length;
+ if ((ptr= (char*) malloc(length+1)) != 0)
+ {
+ memcpy((char*) ptr, (char*) from, length);
+ ptr[length]=0;
+ }
+ return ptr;
+}
+#endif
+
+#ifndef DBUG_OFF
+static char pam_debug = 0;
+#define PAM_DEBUG(X) do { if (pam_debug) { fprintf X; } } while(0)
+#else
+#define PAM_DEBUG(X) /* no-op */
+#endif
+
++static char winbind_hack = 0;
++
+static int conv(int n, const struct pam_message **msg,
+ struct pam_response **resp, void *data)
+{
+ struct param *param = (struct param *)data;
+ unsigned char *end = param->buf + sizeof(param->buf) - 1;
+ int i;
+
+ *resp = 0;
+
+ for (i = 0; i < n; i++)
+ {
+ /* if there's a message - append it to the buffer */
+ if (msg[i]->msg)
+ {
+ int len = strlen(msg[i]->msg);
+ if (len > end - param->ptr)
+ len = end - param->ptr;
+ if (len > 0)
+ {
+ memcpy(param->ptr, msg[i]->msg, len);
+ param->ptr+= len;
+ *(param->ptr)++ = '\n';
+ }
+ }
+ /* if the message style is *_PROMPT_*, meaning PAM asks a question,
+ send the accumulated text to the client, read the reply */
+ if (msg[i]->msg_style == PAM_PROMPT_ECHO_OFF ||
+ msg[i]->msg_style == PAM_PROMPT_ECHO_ON)
+ {
+ int pkt_len;
+ unsigned char *pkt;
+
+ /* allocate the response array.
+ freeing it is the responsibility of the caller */
+ if (*resp == 0)
+ {
+ *resp = calloc(sizeof(struct pam_response), n);
+ if (*resp == 0)
+ return PAM_BUF_ERR;
+ }
+
+ /* dialog plugin interprets the first byte of the packet
+ as the magic number.
+ 2 means "read the input with the echo enabled"
+ 4 means "password-like input, echo disabled"
+ C'est la vie. */
+ param->buf[0] = msg[i]->msg_style == PAM_PROMPT_ECHO_ON ? 2 : 4;
+ PAM_DEBUG((stderr, "PAM: conv: send(%.*s)\n",
+ (int)(param->ptr - param->buf - 1), param->buf));
+ pkt_len= roundtrip(param, param->buf, param->ptr - param->buf - 1, &pkt);
+ if (pkt_len < 0)
+ return PAM_CONV_ERR;
+
+ PAM_DEBUG((stderr, "PAM: conv: recv(%.*s)\n", pkt_len, pkt));
+ /* allocate and copy the reply to the response array */
+ if (!((*resp)[i].resp= strndup((char*) pkt, pkt_len)))
+ return PAM_CONV_ERR;
+ param->ptr = param->buf + 1;
+ }
+ }
+ return PAM_SUCCESS;
+}
+
+#define DO(X) if ((status = (X)) != PAM_SUCCESS) goto end
+
+#if defined(SOLARIS) || defined(__sun)
+typedef void** pam_get_item_3_arg;
+#else
+typedef const void** pam_get_item_3_arg;
+#endif
+
+static int pam_auth_base(struct param *param, MYSQL_SERVER_AUTH_INFO *info)
+{
+ pam_handle_t *pamh = NULL;
+ int status;
+ const char *new_username= NULL;
+ /* The following is written in such a way to make also solaris happy */
+ struct pam_conv pam_start_arg = { &conv, (char*) param };
+
+ /*
+ get the service name, as specified in
+
+ CREATE USER ... IDENTIFIED WITH pam AS "service"
+ */
+ const char *service = info->auth_string && info->auth_string[0]
+ ? info->auth_string : "mysql";
+
+ param->ptr = param->buf + 1;
+
+ PAM_DEBUG((stderr, "PAM: pam_start(%s, %s)\n", service, info->user_name));
+ DO( pam_start(service, info->user_name, &pam_start_arg, &pamh) );
+
+ PAM_DEBUG((stderr, "PAM: pam_authenticate(0)\n"));
+ DO( pam_authenticate (pamh, 0) );
+
+ PAM_DEBUG((stderr, "PAM: pam_acct_mgmt(0)\n"));
+ DO( pam_acct_mgmt(pamh, 0) );
+
+ PAM_DEBUG((stderr, "PAM: pam_get_item(PAM_USER)\n"));
+ DO( pam_get_item(pamh, PAM_USER, (pam_get_item_3_arg) &new_username) );
+
- if (new_username && strcmp(new_username, info->user_name))
++ if (new_username &&
++ (winbind_hack ? strcasecmp : strcmp)(new_username, info->user_name))
+ strncpy(info->authenticated_as, new_username,
+ sizeof(info->authenticated_as));
+ info->authenticated_as[sizeof(info->authenticated_as)-1]= 0;
+
+end:
+ pam_end(pamh, status);
+ PAM_DEBUG((stderr, "PAM: status = %d user = %s\n", status, info->authenticated_as));
+ return status == PAM_SUCCESS ? CR_OK : CR_ERROR;
+}
+
diff --cc plugin/auth_pam/auth_pam_common.c
index 135feb611a6,00000000000..ef8f0f658ff
mode 100644,000000..100644
--- a/plugin/auth_pam/auth_pam_common.c
+++ b/plugin/auth_pam/auth_pam_common.c
@@@ -1,51 -1,0 +1,56 @@@
+/*
+ Copyright (c) 2011, 2018 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 02111-1301 USA */
+
+/*
+ In this file we gather the plugin interface definitions
+ that are same in all the PAM plugin versions.
+ To be included into auth_pam.c and auth_pam_v1.c.
+*/
+
+static struct st_mysql_auth info =
+{
+ MYSQL_AUTHENTICATION_INTERFACE_VERSION,
+ "dialog",
+ pam_auth,
+ NULL, NULL /* no PASSWORD() */
+};
+
+static char use_cleartext_plugin;
+static MYSQL_SYSVAR_BOOL(use_cleartext_plugin, use_cleartext_plugin,
+ PLUGIN_VAR_NOCMDARG | PLUGIN_VAR_READONLY,
+ "Use mysql_cleartext_plugin on the client side instead of the dialog "
+ "plugin. This may be needed for compatibility reasons, but it only "
+ "supports simple PAM policies that don't require anything besides "
+ "a password", NULL, NULL, 0);
+
++static MYSQL_SYSVAR_BOOL(winbind_workaround, winbind_hack, PLUGIN_VAR_OPCMDARG,
++ "Compare usernames case insensitively to work around pam_winbind "
++ "unconditional username lowercasing", NULL, NULL, 0);
++
+#ifndef DBUG_OFF
+static MYSQL_SYSVAR_BOOL(debug, pam_debug, PLUGIN_VAR_OPCMDARG,
+ "Log all PAM activity", NULL, NULL, 0);
+#endif
+
+
+static struct st_mysql_sys_var* vars[] = {
+ MYSQL_SYSVAR(use_cleartext_plugin),
++ MYSQL_SYSVAR(winbind_workaround),
+#ifndef DBUG_OFF
+ MYSQL_SYSVAR(debug),
+#endif
+ NULL
+};
diff --cc plugin/auth_pam/auth_pam_tool.c
index 95d47dca113,00000000000..6fd30b457ee
mode 100644,000000..100644
--- a/plugin/auth_pam/auth_pam_tool.c
+++ b/plugin/auth_pam/auth_pam_tool.c
@@@ -1,115 -1,0 +1,116 @@@
+/*
+ Copyright (c) 2011, 2018 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 02111-1301 USA */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <mysql/plugin_auth_common.h>
+
+struct param {
+ unsigned char buf[10240], *ptr;
+};
+
+
+#include "auth_pam_tool.h"
+
+
+static int roundtrip(struct param *param, const unsigned char *buf,
+ int buf_len, unsigned char **pkt)
+{
+ unsigned char b= AP_CONV;
+ if (write(1, &b, 1) < 1 || write_string(1, buf, buf_len))
+ return -1;
+ *pkt= (unsigned char *) param->buf;
+ return read_string(0, (char *) param->buf, (int) sizeof(param->buf)) - 1;
+}
+
+typedef struct st_mysql_server_auth_info
+{
+ /**
+ User name as sent by the client and shown in USER().
+ NULL if the client packet with the user name was not received yet.
+ */
+ char *user_name;
+
+ /**
+ A corresponding column value from the mysql.user table for the
+ matching account name
+ */
+ char *auth_string;
+
+ /**
+ Matching account name as found in the mysql.user table.
+ A plugin can override it with another name that will be
+ used by MySQL for authorization, and shown in CURRENT_USER()
+ */
+ char authenticated_as[MYSQL_USERNAME_LENGTH+1];
+} MYSQL_SERVER_AUTH_INFO;
+
+
+#include "auth_pam_base.c"
+
+
+int main(int argc, char **argv)
+{
+ struct param param;
+ MYSQL_SERVER_AUTH_INFO info;
+ unsigned char field;
+ int res;
+ char a_buf[MYSQL_USERNAME_LENGTH + 1 + 1024];
+
+ if (read(0, &field, 1) < 1)
+ return -1;
+#ifndef DBUG_OFF
- pam_debug= field;
++ pam_debug= field & 1;
+#endif
++ winbind_hack= field & 2;
+
+ PAM_DEBUG((stderr, "PAM: sandbox started [%s].\n", argv[0]));
+
+ info.user_name= a_buf;
+ if ((res= read_string(0, info.user_name, sizeof(a_buf))) < 0)
+ return -1;
+ PAM_DEBUG((stderr, "PAM: sandbox username [%s].\n", info.user_name));
+
+ info.auth_string= info.user_name + res + 1;
+ if (read_string(0, info.auth_string, sizeof(a_buf) - 1 - res) < 0)
+ return -1;
+
+ PAM_DEBUG((stderr, "PAM: sandbox auth string [%s].\n", info.auth_string));
+
+ if ((res= pam_auth_base(¶m, &info)) != CR_OK)
+ {
+ PAM_DEBUG((stderr, "PAM: auth failed, sandbox closed.\n"));
+ return -1;
+ }
+
+ if (info.authenticated_as[0])
+ {
+ PAM_DEBUG((stderr, "PAM: send authenticated_as field.\n"));
+ field= AP_AUTHENTICATED_AS;
+ if (write(1, &field, 1) < 1 ||
+ write_string(1, (unsigned char *) info.authenticated_as,
+ strlen(info.authenticated_as)))
+ return -1;
+ }
+
+ PAM_DEBUG((stderr, "PAM: send OK result.\n"));
+ field= AP_EOF;
+ if (write(1, &field, 1) != 1)
+ return -1;
+
+ PAM_DEBUG((stderr, "PAM: sandbox closed.\n"));
+ return 0;
+}
diff --cc scripts/mysql_install_db.sh
index d87c0aa48a5,d315248ce9c..1ea1e39be36
--- a/scripts/mysql_install_db.sh
+++ b/scripts/mysql_install_db.sh
@@@ -515,13 -487,9 +515,14 @@@ mysqld_install_cmd_line(
--net_buffer_length=16K
}
+# Use $auth_root_socket_user if explicitly specified.
+# Otherwise use the owner of datadir - ${user:-$USER}
+# Use 'root' as a fallback
+auth_root_socket_user=${auth_root_socket_user:-${user:-${USER:-root}}}
+
cat_sql()
{
+ echo "create database if not exists mysql;"
echo "use mysql;"
case "$auth_root_authentication_method" in
diff --cc sql/events.cc
index 196c8df591d,d8c4f373582..166fa992f88
--- a/sql/events.cc
+++ b/sql/events.cc
@@@ -418,11 -418,17 +418,17 @@@ Events::create_event(THD *thd, Event_pa
thd->restore_stmt_binlog_format(save_binlog_format);
+ if (!ret && Events::opt_event_scheduler == Events::EVENTS_OFF)
+ {
+ push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR,
+ "Event scheduler is switched off, use SET GLOBAL event_scheduler=ON to enable it.");
+ }
+
DBUG_RETURN(ret);
-
-WSREP_ERROR_LABEL:
- DBUG_RETURN(TRUE);
-
+#ifdef WITH_WSREP
+wsrep_error_label:
+ DBUG_RETURN(true);
+#endif
}
diff --cc sql/field.cc
index 4256ef70005,c6bdb013cdf..a671195ba2b
--- a/sql/field.cc
+++ b/sql/field.cc
@@@ -4544,13 -4554,10 +4544,10 @@@ longlong Field_float::val_int(void
String *Field_float::val_str(String *val_buffer,
String *val_ptr __attribute__((unused)))
{
- ASSERT_COLUMN_MARKED_FOR_READ;
+ DBUG_ASSERT(marked_for_read());
DBUG_ASSERT(!zerofill || field_length <= MAX_FIELD_CHARLENGTH);
- float nr;
- float4get(nr,ptr);
- uint to_length= 70;
- if (val_buffer->alloc(to_length))
+ if (Float(ptr).to_string(val_buffer, dec))
{
my_error(ER_OUT_OF_RESOURCES, MYF(0));
return val_buffer;
diff --cc sql/handler.cc
index edd6e40b8ec,826b6f34746..c5d6fa29f8f
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@@ -5023,6 -4998,98 +5020,98 @@@ end
}
+ static void flush_checksum(ha_checksum *row_crc, uchar **checksum_start,
+ size_t *checksum_length)
+ {
+ if (*checksum_start)
+ {
+ *row_crc= my_checksum(*row_crc, *checksum_start, *checksum_length);
+ *checksum_start= NULL;
+ *checksum_length= 0;
+ }
+ }
+
+
+ /* calculating table's checksum */
+ int handler::calculate_checksum()
+ {
+ int error;
+ THD *thd=ha_thd();
+ DBUG_ASSERT(table->s->last_null_bit_pos < 8);
+ uchar null_mask= table->s->last_null_bit_pos
+ ? 256 - (1 << table->s->last_null_bit_pos) : 0;
+
- table->use_all_columns();
++ table->use_all_stored_columns();
+ stats.checksum= 0;
+
+ if ((error= ha_rnd_init(1)))
+ return error;
+
+ for (;;)
+ {
+ if (thd->killed)
+ return HA_ERR_ABORTED_BY_USER;
+
+ ha_checksum row_crc= 0;
+ error= table->file->ha_rnd_next(table->record[0]);
+ if (error)
+ break;
+
+ if (table->s->null_bytes)
+ {
+ /* fix undefined null bits */
+ table->record[0][table->s->null_bytes-1] |= null_mask;
+ if (!(table->s->db_create_options & HA_OPTION_PACK_RECORD))
+ table->record[0][0] |= 1;
+
+ row_crc= my_checksum(row_crc, table->record[0], table->s->null_bytes);
+ }
+
+ uchar *checksum_start= NULL;
+ size_t checksum_length= 0;
+ for (uint i= 0; i < table->s->fields; i++ )
+ {
+ Field *f= table->field[i];
+
+ if (! thd->variables.old_mode && f->is_real_null(0))
+ {
+ flush_checksum(&row_crc, &checksum_start, &checksum_length);
+ continue;
+ }
+ /*
+ BLOB and VARCHAR have pointers in their field, we must convert
+ to string; GEOMETRY is implemented on top of BLOB.
+ BIT may store its data among NULL bits, convert as well.
+ */
+ switch (f->type()) {
+ case MYSQL_TYPE_BLOB:
+ case MYSQL_TYPE_VARCHAR:
+ case MYSQL_TYPE_GEOMETRY:
+ case MYSQL_TYPE_BIT:
+ {
+ flush_checksum(&row_crc, &checksum_start, &checksum_length);
+ String tmp;
+ f->val_str(&tmp);
+ row_crc= my_checksum(row_crc, (uchar*) tmp.ptr(), tmp.length());
+ break;
+ }
+ default:
+ if (!checksum_start)
+ checksum_start= f->ptr;
+ DBUG_ASSERT(checksum_start + checksum_length == f->ptr);
+ checksum_length+= f->pack_length();
+ break;
+ }
+ }
+ flush_checksum(&row_crc, &checksum_start, &checksum_length);
+
+ stats.checksum+= row_crc;
+ }
+ table->file->ha_rnd_end();
+ return error == HA_ERR_END_OF_FILE ? 0 : error;
+ }
+
+
/****************************************************************************
** Some general functions that isn't in the handler class
****************************************************************************/
@@@ -7561,175 -7471,44 +7688,148 @@@ bool Vers_parse_info::check_sys_fields(
if (check_conditions(table_name, db))
return true;
+ const Create_field *row_start= NULL;
+ const Create_field *row_end= NULL;
+
List_iterator<Create_field> it(alter_info->create_list);
- uint found_flag= 0;
while (Create_field *f= it++)
{
- vers_sys_type_t f_check_unit= VERS_UNDEFINED;
- uint sys_flag= f->flags & VERS_SYSTEM_FIELD;
+ if (!row_start && f->flags & VERS_SYS_START_FLAG)
+ row_start= f;
+ else if (!row_end && f->flags & VERS_SYS_END_FLAG)
+ row_end= f;
+ }
- if (!sys_flag)
- continue;
+ const bool expect_timestamp=
+ !can_native || !is_some_bigint(row_start) || !is_some_bigint(row_end);
- if (sys_flag & found_flag)
- {
- my_error(ER_VERS_DUPLICATE_ROW_START_END, MYF(0),
- found_flag & VERS_SYS_START_FLAG ? "START" : "END",
- f->field_name.str);
- return true;
- }
+ if (expect_timestamp)
+ {
+ if (!is_versioning_timestamp(row_start))
+ return require_timestamp(row_start, table_name);
- sys_flag|= found_flag;
+ if (!is_versioning_timestamp(row_end))
+ return require_timestamp(row_end, table_name);
+ }
+ else
+ {
+ if (!is_versioning_bigint(row_start))
+ return require_bigint(row_start, table_name);
- if ((f->type_handler() == &type_handler_datetime2 ||
- f->type_handler() == &type_handler_timestamp2) &&
- f->length == MAX_DATETIME_FULL_WIDTH)
- {
- f_check_unit= VERS_TIMESTAMP;
- }
- else if (f->type_handler() == &type_handler_longlong
- && (f->flags & UNSIGNED_FLAG)
- && f->length == (MY_INT64_NUM_DECIMAL_DIGITS - 1))
- {
- f_check_unit= VERS_TRX_ID;
- }
- else
- {
- if (!check_unit)
- check_unit= VERS_TIMESTAMP;
- goto error;
- }
+ if (!is_versioning_bigint(row_end))
+ return require_bigint(row_end, table_name);
+ }
- if (f_check_unit)
- {
- if (check_unit)
- {
- if (check_unit == f_check_unit)
- {
- if (check_unit == VERS_TRX_ID && !TR_table::use_transaction_registry)
- {
- my_error(ER_VERS_TRT_IS_DISABLED, MYF(0));
- return true;
- }
- return false;
- }
- error:
- my_error(ER_VERS_FIELD_WRONG_TYPE, MYF(0), f->field_name.str,
- check_unit == VERS_TIMESTAMP ?
- "TIMESTAMP(6)" :
- "BIGINT(20) UNSIGNED",
- table_name.str);
- return true;
- }
- check_unit= f_check_unit;
- }
+ if (is_versioning_bigint(row_start) && is_versioning_bigint(row_end) &&
+ !TR_table::use_transaction_registry)
+ {
+ my_error(ER_VERS_TRT_IS_DISABLED, MYF(0));
+ return true;
}
- my_error(ER_MISSING, MYF(0), table_name.str, found_flag & VERS_SYS_START_FLAG ?
- "ROW END" : found_flag ? "ROW START" : "ROW START/END");
- return true;
+ return false;
}
+
+bool Table_period_info::check_field(const Create_field* f,
+ const Lex_ident& f_name) const
+{
+ bool res= false;
+ if (!f)
+ {
+ my_error(ER_BAD_FIELD_ERROR, MYF(0), f_name.str, name.str);
+ res= true;
+ }
+ else if (f->type_handler()->mysql_timestamp_type() != MYSQL_TIMESTAMP_DATE &&
+ f->type_handler()->mysql_timestamp_type() != MYSQL_TIMESTAMP_DATETIME)
+ {
+ my_error(ER_WRONG_FIELD_SPEC, MYF(0), f->field_name.str);
+ res= true;
+ }
+ else if (f->vcol_info || f->flags & VERS_SYSTEM_FIELD)
+ {
+ my_error(ER_PERIOD_FIELD_WRONG_ATTRIBUTES, MYF(0),
+ f->field_name.str, "GENERATED ALWAYS AS");
+ }
+
+ return res;
+}
+
+bool Table_scope_and_contents_source_st::check_fields(
+ THD *thd, Alter_info *alter_info, TABLE_LIST &create_table)
+{
+ return vers_check_system_fields(thd, alter_info, create_table)
+ || check_period_fields(thd, alter_info);
+}
+
+bool Table_scope_and_contents_source_st::check_period_fields(
+ THD *thd, Alter_info *alter_info)
+{
+ if (!period_info.name)
+ return false;
+
+ if (tmp_table())
+ {
+ my_error(ER_PERIOD_TEMPORARY_NOT_ALLOWED, MYF(0));
+ return true;
+ }
+
+ Table_period_info::start_end_t &period= period_info.period;
+ const Create_field *row_start= NULL;
+ const Create_field *row_end= NULL;
+ List_iterator<Create_field> it(alter_info->create_list);
+ while (const Create_field *f= it++)
+ {
+ if (period.start.streq(f->field_name)) row_start= f;
+ else if (period.end.streq(f->field_name)) row_end= f;
+
+ if (period_info.name.streq(f->field_name))
+ {
+ my_error(ER_DUP_FIELDNAME, MYF(0), f->field_name.str);
+ return true;
+ }
+ }
+
+ bool res= period_info.check_field(row_start, period.start.str)
+ || period_info.check_field(row_end, period.end.str);
+ if (res)
+ return true;
+
+ if (row_start->type_handler() != row_end->type_handler()
+ || row_start->length != row_end->length)
+ {
+ my_error(ER_PERIOD_TYPES_MISMATCH, MYF(0), period_info.name.str);
+ res= true;
+ }
+
+ return res;
+}
+
+bool
+Table_scope_and_contents_source_st::fix_create_fields(THD *thd,
+ Alter_info *alter_info,
+ const TABLE_LIST &create_table,
+ bool create_select)
+{
+ return vers_fix_system_fields(thd, alter_info, create_table, create_select)
+ || fix_period_fields(thd, alter_info);
+}
+
+bool
+Table_scope_and_contents_source_st::fix_period_fields(THD *thd,
+ Alter_info *alter_info)
+{
+ if (!period_info.name)
+ return false;
+
+ Table_period_info::start_end_t &period= period_info.period;
+ List_iterator<Create_field> it(alter_info->create_list);
+ while (Create_field *f= it++)
+ {
+ if (period.start.streq(f->field_name) || period.end.streq(f->field_name))
+ {
+ f->period= &period_info;
+ f->flags|= NOT_NULL_FLAG;
+ }
+ }
+ return false;
+}
diff --cc sql/handler.h
index fb6862e4ce1,7d3017d4a12..d030a73c76f
--- a/sql/handler.h
+++ b/sql/handler.h
@@@ -1986,35 -1946,15 +1986,33 @@@ struct Table_period_info: Sql_allo
Lex_ident start;
Lex_ident end;
};
+ start_end_t period;
+ bool create_if_not_exists;
+ Virtual_column_info *constr;
- start_end_t system_time;
- start_end_t as_row;
+ bool is_set() const
+ {
+ DBUG_ASSERT(bool(period.start) == bool(period.end));
+ return period.start;
+ }
- void set_system_time(Lex_ident start, Lex_ident end)
+ void set_period(const Lex_ident& start, const Lex_ident& end)
{
- system_time.start= start;
- system_time.end= end;
+ period.start= start;
+ period.end= end;
}
+ bool check_field(const Create_field* f, const Lex_ident& f_name) const;
+};
+
+struct Vers_parse_info: public Table_period_info
+{
+ Vers_parse_info() :
+ Table_period_info(STRING_WITH_LEN("SYSTEM_TIME")),
- check_unit(VERS_UNDEFINED),
+ versioned_fields(false),
+ unversioned_fields(false)
+ {}
+
+ Table_period_info::start_end_t as_row;
- vers_sys_type_t check_unit;
protected:
friend struct Table_scope_and_contents_source_st;
diff --cc sql/item.cc
index 7d901c3333d,3584230fb2a..22bcbf39ab3
--- a/sql/item.cc
+++ b/sql/item.cc
@@@ -9963,8 -10153,9 +9963,8 @@@ longlong Item_cache_real::val_int(
}
- String* Item_cache_real::val_str(String *str)
+ String* Item_cache_double::val_str(String *str)
{
- DBUG_ASSERT(fixed == 1);
if (!has_value())
return NULL;
str->set_real(value, decimals, default_charset());
@@@ -9972,8 -10163,19 +9972,17 @@@
}
+ String* Item_cache_float::val_str(String *str)
+ {
- DBUG_ASSERT(fixed == 1);
+ if (!has_value())
+ return NULL;
+ Float(value).to_string(str, decimals);
+ return str;
+ }
+
+
my_decimal *Item_cache_real::val_decimal(my_decimal *decimal_val)
{
- DBUG_ASSERT(fixed == 1);
if (!has_value())
return NULL;
double2my_decimal(E_DEC_FATAL_ERROR, value, decimal_val);
diff --cc sql/item.h
index 0c6465f98f6,2adc111db03..b0d3666ead7
--- a/sql/item.h
+++ b/sql/item.h
@@@ -6782,21 -6186,44 +6782,44 @@@ public
class Item_cache_real: public Item_cache
{
+ protected:
double value;
public:
- Item_cache_real(THD *thd): Item_cache(thd, &type_handler_double),
- value(0) {}
-
+ Item_cache_real(THD *thd, const Type_handler *h)
+ :Item_cache(thd, h),
+ value(0)
+ {}
double val_real();
longlong val_int();
- String* val_str(String *str);
my_decimal *val_decimal(my_decimal *);
- bool get_date(MYSQL_TIME *ltime, ulonglong fuzzydate)
- { return get_date_from_real(ltime, fuzzydate); }
+ bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate)
+ { return get_date_from_real(thd, ltime, fuzzydate); }
bool cache_value();
Item *convert_to_basic_const_item(THD *thd);
+ };
+
+
+ class Item_cache_double: public Item_cache_real
+ {
+ public:
+ Item_cache_double(THD *thd)
+ :Item_cache_real(thd, &type_handler_double)
+ { }
+ String* val_str(String *str);
+ Item *get_copy(THD *thd)
+ { return get_item_copy<Item_cache_double>(thd, this); }
+ };
+
+
+ class Item_cache_float: public Item_cache_real
+ {
+ public:
+ Item_cache_float(THD *thd)
+ :Item_cache_real(thd, &type_handler_float)
+ { }
+ String* val_str(String *str);
Item *get_copy(THD *thd)
- { return get_item_copy<Item_cache_real>(thd, this); }
+ { return get_item_copy<Item_cache_float>(thd, this); }
};
diff --cc sql/item_jsonfunc.cc
index 40237ab46a6,2f43f907c8b..a90e7fb3a1a
--- a/sql/item_jsonfunc.cc
+++ b/sql/item_jsonfunc.cc
@@@ -2135,6 -2141,331 +2135,331 @@@ String *Item_func_json_merge::val_str(S
null_value= 0;
return str;
+ error_return:
+ if (je1.s.error)
+ report_json_error(js1, &je1, 0);
+ if (je2.s.error)
+ report_json_error(js2, &je2, n_arg);
+ null_return:
+ null_value= 1;
+ return NULL;
+ }
+
+
+ static int copy_value_patch(String *str, json_engine_t *je)
+ {
+ int first_key= 1;
+
+ if (je->value_type != JSON_VALUE_OBJECT)
+ {
+ const uchar *beg, *end;
+
+ beg= je->value_begin;
+
+ if (!json_value_scalar(je))
+ {
+ if (json_skip_level(je))
+ return 1;
+ end= je->s.c_str;
+ }
+ else
+ end= je->value_end;
+
+ if (append_simple(str, beg, end-beg))
+ return 1;
+
+ return 0;
+ }
+ /* JSON_VALUE_OBJECT */
+
+ if (str->append("{", 1))
+ return 1;
+ while (json_scan_next(je) == 0 && je->state != JST_OBJ_END)
+ {
+ const uchar *key_start;
+ /* Loop through the Json_1 keys and compare with the Json_2 keys. */
+ DBUG_ASSERT(je->state == JST_KEY);
+ key_start= je->s.c_str;
+
+ if (json_read_value(je))
+ return 1;
+
+ if (je->value_type == JSON_VALUE_NULL)
+ continue;
+
+ if (!first_key)
+ {
+ if (str->append(", ", 2))
+ return 3;
+ }
+ else
+ first_key= 0;
+
+ if (str->append("\"", 1) ||
+ append_simple(str, key_start, je->value_begin - key_start) ||
+ copy_value_patch(str, je))
+ return 1;
+ }
+ if (str->append("}", 1))
+ return 1;
+
+ return 0;
+ }
+
+
+ static int do_merge_patch(String *str, json_engine_t *je1, json_engine_t *je2,
+ bool *empty_result)
+ {
+ if (json_read_value(je1) || json_read_value(je2))
+ return 1;
+
+ if (je1->value_type == JSON_VALUE_OBJECT &&
+ je2->value_type == JSON_VALUE_OBJECT)
+ {
+ json_engine_t sav_je1= *je1;
+ json_engine_t sav_je2= *je2;
+
+ int first_key= 1;
+ json_string_t key_name;
+ size_t sav_len;
+ bool mrg_empty;
-
++
+ *empty_result= FALSE;
+ json_string_set_cs(&key_name, je1->s.cs);
+
+ if (str->append("{", 1))
+ return 3;
+ while (json_scan_next(je1) == 0 &&
+ je1->state != JST_OBJ_END)
+ {
+ const uchar *key_start, *key_end;
+ /* Loop through the Json_1 keys and compare with the Json_2 keys. */
+ DBUG_ASSERT(je1->state == JST_KEY);
+ key_start= je1->s.c_str;
+ do
+ {
+ key_end= je1->s.c_str;
+ } while (json_read_keyname_chr(je1) == 0);
+
+ if (je1->s.error)
+ return 1;
+
+ sav_len= str->length();
+
+ if (!first_key)
+ {
+ if (str->append(", ", 2))
+ return 3;
+ *je2= sav_je2;
+ }
+
+ if (str->append("\"", 1) ||
+ append_simple(str, key_start, key_end - key_start) ||
+ str->append("\":", 2))
+ return 3;
+
+ while (json_scan_next(je2) == 0 &&
+ je2->state != JST_OBJ_END)
+ {
+ int ires;
+ DBUG_ASSERT(je2->state == JST_KEY);
+ json_string_set_str(&key_name, key_start, key_end);
+ if (!json_key_matches(je2, &key_name))
+ {
+ if (je2->s.error || json_skip_key(je2))
+ return 2;
+ continue;
+ }
+
+ /* Json_2 has same key as Json_1. Merge them. */
+ if ((ires= do_merge_patch(str, je1, je2, &mrg_empty)))
+ return ires;
+
+ if (mrg_empty)
+ str->length(sav_len);
+ else
+ first_key= 0;
+
+ goto merged_j1;
+ }
+
+ if (je2->s.error)
+ return 2;
+
+ key_start= je1->s.c_str;
+ /* Just append the Json_1 key value. */
+ if (json_skip_key(je1))
+ return 1;
+ if (append_simple(str, key_start, je1->s.c_str - key_start))
+ return 3;
+ first_key= 0;
+
+ merged_j1:
+ continue;
+ }
+
+ *je2= sav_je2;
+ /*
+ Now loop through the Json_2 keys.
+ Skip if there is same key in Json_1
+ */
+ while (json_scan_next(je2) == 0 &&
+ je2->state != JST_OBJ_END)
+ {
+ const uchar *key_start, *key_end;
+ DBUG_ASSERT(je2->state == JST_KEY);
+ key_start= je2->s.c_str;
+ do
+ {
+ key_end= je2->s.c_str;
+ } while (json_read_keyname_chr(je2) == 0);
+
+ if (je2->s.error)
+ return 1;
+
+ *je1= sav_je1;
+ while (json_scan_next(je1) == 0 &&
+ je1->state != JST_OBJ_END)
+ {
+ DBUG_ASSERT(je1->state == JST_KEY);
+ json_string_set_str(&key_name, key_start, key_end);
+ if (!json_key_matches(je1, &key_name))
+ {
+ if (je1->s.error || json_skip_key(je1))
+ return 2;
+ continue;
+ }
+ if (json_skip_key(je2) ||
+ json_skip_level(je1))
+ return 1;
+ goto continue_j2;
+ }
+
+ if (je1->s.error)
+ return 2;
+
+
+ sav_len= str->length();
+
+ if (!first_key && str->append(", ", 2))
+ return 3;
+
+ if (str->append("\"", 1) ||
+ append_simple(str, key_start, key_end - key_start) ||
+ str->append("\":", 2))
+ return 3;
+
+ if (json_read_value(je2))
+ return 1;
+
+ if (je2->value_type == JSON_VALUE_NULL)
+ str->length(sav_len);
+ else
+ {
+ if (copy_value_patch(str, je2))
+ return 1;
+ first_key= 0;
+ }
+
+ continue_j2:
+ continue;
+ }
+
+ if (str->append("}", 1))
+ return 3;
+ }
+ else
+ {
+ if (!json_value_scalar(je1) && json_skip_level(je1))
+ return 1;
+
+ *empty_result= je2->value_type == JSON_VALUE_NULL;
+ if (!(*empty_result) && copy_value_patch(str, je2))
+ return 1;
+ }
+
+ return 0;
+ }
+
+
+ String *Item_func_json_merge_patch::val_str(String *str)
+ {
+ DBUG_ASSERT(fixed == 1);
+ json_engine_t je1, je2;
+ String *js1= args[0]->val_json(&tmp_js1), *js2=NULL;
+ uint n_arg;
+ bool empty_result, merge_to_null;
+
+ merge_to_null= args[0]->null_value;
+
+ for (n_arg=1; n_arg < arg_count; n_arg++)
+ {
+ js2= args[n_arg]->val_json(&tmp_js2);
+ if (args[n_arg]->null_value)
+ {
+ merge_to_null= true;
+ goto cont_point;
+ }
+
+ json_scan_start(&je2, js2->charset(),(const uchar *) js2->ptr(),
+ (const uchar *) js2->ptr() + js2->length());
+
+ if (merge_to_null)
+ {
+ if (json_read_value(&je2))
+ goto error_return;
+ if (je2.value_type == JSON_VALUE_OBJECT)
+ {
+ merge_to_null= true;
+ goto cont_point;
+ }
+ merge_to_null= false;
+ str->set(js2->ptr(), js2->length(), js2->charset());
+ goto cont_point;
+ }
+
+ str->set_charset(js1->charset());
+ str->length(0);
+
+
+ json_scan_start(&je1, js1->charset(),(const uchar *) js1->ptr(),
+ (const uchar *) js1->ptr() + js1->length());
+
+ if (do_merge_patch(str, &je1, &je2, &empty_result))
+ goto error_return;
+
+ if (empty_result)
+ str->append("null");
+
+ cont_point:
+ {
+ /* Swap str and js1. */
+ if (str == &tmp_js1)
+ {
+ str= js1;
+ js1= &tmp_js1;
+ }
+ else
+ {
+ js1= str;
+ str= &tmp_js1;
+ }
+ }
+ }
+
+ if (merge_to_null)
+ goto null_return;
+
+ json_scan_start(&je1, js1->charset(),(const uchar *) js1->ptr(),
+ (const uchar *) js1->ptr() + js1->length());
+ str->length(0);
+ str->set_charset(js1->charset());
+ if (json_nice(&je1, str, Item_func_json_format::LOOSE))
+ goto error_return;
+
+ null_value= 0;
+ return str;
+
error_return:
if (je1.s.error)
report_json_error(js1, &je1, 0);
diff --cc sql/item_sum.h
index abe6192fcd1,ef849782464..59b8f824c72
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@@ -1845,14 -1797,9 +1846,17 @@@ class Item_func_group_concat : public I
friend int dump_leaf_key(void* key_arg,
element_count count __attribute__((unused)),
void* item_arg);
+
+ bool repack_tree(THD *thd);
+
+public:
+ // Methods used by ColumnStore
+ bool get_distinct() const { return distinct; }
+ uint get_count_field() const { return arg_count_field; }
+ uint get_order_field() const { return arg_count_order; }
+ const String* get_separator() const { return separator; }
+ ORDER** get_order() const { return order; }
+
public:
Item_func_group_concat(THD *thd, Name_resolution_context *context_arg,
bool is_distinct, List<Item> *is_select,
diff --cc sql/log_event.cc
index 1246330f7bb,e96e278e6eb..95d602a0d8e
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@@ -11327,15 -11315,15 +11333,15 @@@ int Rows_log_event::do_apply_event(rpl_
{
WSREP_WARN("BF applier failed to open_and_lock_tables: %u, fatal: %d "
"wsrep = (exec_mode: %d conflict_state: %d seqno: %lld)",
- thd->get_stmt_da()->sql_errno(),
- thd->is_fatal_error,
- thd->wsrep_exec_mode,
- thd->wsrep_conflict_state,
- (long long)wsrep_thd_trx_seqno(thd));
+ thd->get_stmt_da()->sql_errno(),
+ thd->is_fatal_error,
+ thd->wsrep_cs().mode(),
+ thd->wsrep_trx().state(),
+ (long long) wsrep_thd_trx_seqno(thd));
}
-#endif
+#endif /* WITH_WSREP */
- if ((thd->is_slave_error || thd->is_fatal_error) &&
- !is_parallel_retry_error(rgi, actual_error))
+ if (thd->is_error() &&
+ !is_parallel_retry_error(rgi, error= thd->get_stmt_da()->sql_errno()))
{
/*
Error reporting borrowed from Query_log_event with many excessive
diff --cc sql/my_json_writer.h
index 8f86212ac30,da56396d7d9..2c27043e74e
--- a/sql/my_json_writer.h
+++ b/sql/my_json_writer.h
@@@ -11,17 -11,9 +11,17 @@@
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 02111-1301 USA */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
+#ifndef JSON_WRITER_INCLUDED
+#define JSON_WRITER_INCLUDED
+#include "my_base.h"
+#include "sql_select.h"
+class Opt_trace_stmt;
+class Opt_trace_context;
class Json_writer;
+struct TABLE_LIST;
+
/*
Single_line_formatting_helper is used by Json_writer to do better formatting
diff --cc sql/mysqld.cc
index dec23535551,e8c605ce945..403d91b6285
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@@ -7078,7 -7829,8 +7099,6 @@@ struct my_option my_long_options[]
MYSQL_TO_BE_IMPLEMENTED_OPTION("optimizer-trace-features"), // OPTIMIZER_TRACE
MYSQL_TO_BE_IMPLEMENTED_OPTION("optimizer-trace-offset"), // OPTIMIZER_TRACE
MYSQL_TO_BE_IMPLEMENTED_OPTION("optimizer-trace-limit"), // OPTIMIZER_TRACE
- MYSQL_TO_BE_IMPLEMENTED_OPTION("eq-range-index-dive-limit"),
- MYSQL_TO_BE_IMPLEMENTED_OPTION("optimizer-trace-max-mem-size"), // OPTIMIZER_TRACE
MYSQL_COMPATIBILITY_OPTION("server-id-bits"),
MYSQL_TO_BE_IMPLEMENTED_OPTION("slave-rows-search-algorithms"), // HAVE_REPLICATION
MYSQL_TO_BE_IMPLEMENTED_OPTION("slave-allow-batching"), // HAVE_REPLICATION
diff --cc sql/protocol.cc
index ffed17634c0,84ca4585a12..83b4dc80ae2
--- a/sql/protocol.cc
+++ b/sql/protocol.cc
@@@ -1225,10 -1205,11 +1225,10 @@@ bool Protocol_text::store_decimal(cons
bool Protocol_text::store(float from, uint32 decimals, String *buffer)
{
#ifndef DBUG_OFF
- DBUG_ASSERT(field_types == 0 ||
- field_types[field_pos] == MYSQL_TYPE_FLOAT);
+ DBUG_ASSERT(valid_handler(field_pos, PROTOCOL_SEND_FLOAT));
field_pos++;
#endif
- buffer->set_real((double) from, decimals, thd->charset());
+ Float(from).to_string(buffer, decimals);
return net_store_data((uchar*) buffer->ptr(), buffer->length());
}
diff --cc sql/sql_acl.cc
index 27f2a985931,50b09e3b675..49dad4a6e3e
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@@ -848,956 -842,376 +848,963 @@@ class Grant_table_bas
class User_table: public Grant_table_base
{
public:
- /* Field getters return NULL if the column is not present in the table.
- This is consistent only if the table is in a supported version. We do
- not guard against corrupt tables. (yet) */
- Field* host() const
- { return get_field(0); }
- Field* user() const
- { return get_field(1); }
- Field* password() const
- { return have_password() ? NULL : tl.table->field[2]; }
- /* Columns after privilege columns. */
- Field* ssl_type() const
- { return get_field(start_privilege_column + num_privileges()); }
- Field* ssl_cipher() const
- { return get_field(start_privilege_column + num_privileges() + 1); }
- Field* x509_issuer() const
- { return get_field(start_privilege_column + num_privileges() + 2); }
- Field* x509_subject() const
- { return get_field(start_privilege_column + num_privileges() + 3); }
- Field* max_questions() const
- { return get_field(start_privilege_column + num_privileges() + 4); }
- Field* max_updates() const
- { return get_field(start_privilege_column + num_privileges() + 5); }
- Field* max_connections() const
- { return get_field(start_privilege_column + num_privileges() + 6); }
- Field* max_user_connections() const
- { return get_field(start_privilege_column + num_privileges() + 7); }
- Field* plugin() const
- { return get_field(start_privilege_column + num_privileges() + 8); }
- Field* authentication_string() const
- { return get_field(start_privilege_column + num_privileges() + 9); }
- Field* password_expired() const
- { return get_field(start_privilege_column + num_privileges() + 10); }
- Field* is_role() const
- { return get_field(start_privilege_column + num_privileges() + 11); }
- Field* default_role() const
- { return get_field(start_privilege_column + num_privileges() + 12); }
- Field* max_statement_time() const
- { return get_field(start_privilege_column + num_privileges() + 13); }
-
- /*
- Check if a user entry in the user table is marked as being a role entry
-
- IMPLEMENTATION
- Access the coresponding column and check the coresponding ENUM of the form
- ENUM('N', 'Y')
-
- SYNOPSIS
- check_is_role()
- form an open table to read the entry from.
- The record should be already read in table->record[0]
-
- RETURN VALUE
- TRUE if the user is marked as a role
- FALSE otherwise
- */
- bool check_is_role() const
- {
- /* Table version does not support roles */
- if (!is_role())
- return false;
-
- return get_YN_as_bool(is_role());
- }
-
-
+ bool init_read_record(READ_RECORD* info) const
+ {
+ return Grant_table_base::init_read_record(info) || setup_sysvars();
+ }
+
+ virtual LEX_CSTRING& name() const = 0;
+ virtual int get_auth(THD *, MEM_ROOT *, ACL_USER *u) const= 0;
+ virtual bool set_auth(const ACL_USER &u) const = 0;
+ virtual ulong get_access() const = 0;
+ virtual void set_access(ulong rights, bool revoke) const = 0;
+
+ char *get_host(MEM_ROOT *root) const
+ { return ::get_field(root, m_table->field[0]); }
+ int set_host(const char *s, size_t l) const
+ { return m_table->field[0]->store(s, l, system_charset_info); };
+ char *get_user(MEM_ROOT *root) const
+ { return ::get_field(root, m_table->field[1]); }
+ int set_user(const char *s, size_t l) const
+ { return m_table->field[1]->store(s, l, system_charset_info); };
+
+ virtual SSL_type get_ssl_type () const = 0;
+ virtual int set_ssl_type (SSL_type x) const = 0;
+ virtual const char* get_ssl_cipher (MEM_ROOT *root) const = 0;
+ virtual int set_ssl_cipher (const char *s, size_t l) const = 0;
+ virtual const char* get_x509_issuer (MEM_ROOT *root) const = 0;
+ virtual int set_x509_issuer (const char *s, size_t l) const = 0;
+ virtual const char* get_x509_subject (MEM_ROOT *root) const = 0;
+ virtual int set_x509_subject (const char *s, size_t l) const = 0;
+ virtual longlong get_max_questions () const = 0;
+ virtual int set_max_questions (longlong x) const = 0;
+ virtual longlong get_max_updates () const = 0;
+ virtual int set_max_updates (longlong x) const = 0;
+ virtual longlong get_max_connections () const = 0;
+ virtual int set_max_connections (longlong x) const = 0;
+ virtual longlong get_max_user_connections () const = 0;
+ virtual int set_max_user_connections (longlong x) const = 0;
+ virtual double get_max_statement_time () const = 0;
+ virtual int set_max_statement_time (double x) const = 0;
+ virtual bool get_is_role () const = 0;
+ virtual int set_is_role (bool x) const = 0;
+ virtual const char* get_default_role (MEM_ROOT *root) const = 0;
+ virtual int set_default_role (const char *s, size_t l) const = 0;
+ virtual bool get_account_locked () const = 0;
+ virtual int set_account_locked (bool x) const = 0;
+ virtual bool get_password_expired () const = 0;
+ virtual int set_password_expired (bool x) const = 0;
+ virtual my_time_t get_password_last_changed () const = 0;
+ virtual int set_password_last_changed (my_time_t x) const = 0;
+ virtual longlong get_password_lifetime () const = 0;
+ virtual int set_password_lifetime (longlong x) const = 0;
+
+ virtual ~User_table() {}
private:
friend class Grant_tables;
+ virtual int setup_sysvars() const = 0;
+};
- /* Only Grant_tables can instantiate this class. */
- User_table() {};
+/* MySQL-3.23 to MariaDB 10.3 `user` table */
+class User_table_tabular: public User_table
+{
+ public:
- void init(enum thr_lock_type lock_type)
+ LEX_CSTRING& name() const { return MYSQL_TABLE_NAME_USER; }
+
+ int get_auth(THD *thd, MEM_ROOT *root, ACL_USER *u) const
{
- /* We are relying on init_one_table zeroing out the TABLE_LIST structure. */
- tl.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_USER_NAME, NULL, lock_type);
- Grant_table_base::init(lock_type, false);
+ u->alloc_auth(root, 1);
+ if (have_password())
+ {
+ const char *as= safe_str(::get_field(&acl_memroot, password()));
+ u->auth->auth_string.str= as;
+ u->auth->auth_string.length= strlen(as);
+ u->auth->plugin= guess_auth_plugin(thd, u->auth->auth_string.length);
+ }
+ else
+ {
+ u->auth->plugin= native_password_plugin_name;
+ u->auth->auth_string= empty_clex_str;
+ }
+ if (plugin() && authstr())
+ {
+ char *tmpstr= ::get_field(&acl_memroot, plugin());
+ if (tmpstr)
+ {
+ const char *pw= u->auth->auth_string.str;
+ const char *as= safe_str(::get_field(&acl_memroot, authstr()));
+ if (*pw)
+ {
+ if (*as && strcmp(as, pw))
+ {
+ sql_print_warning("'user' entry '%s@%s' has both a password and an "
+ "authentication plugin specified. The password will be ignored.",
+ safe_str(get_user(thd->mem_root)), safe_str(get_host(thd->mem_root)));
+ }
+ else
+ as= pw;
+ }
+ u->auth->plugin.str= tmpstr;
+ u->auth->plugin.length= strlen(tmpstr);
+ u->auth->auth_string.str= as;
+ u->auth->auth_string.length= strlen(as);
+ }
+ }
+ return 0;
}
- /* The user table is a bit different compared to the other Grant tables.
- Usually, we only add columns to the grant tables when adding functionality.
- This makes it easy to test which version of the table we are using, by
- just looking at the number of fields present in the table.
-
- In MySQL 5.7.6 the Password column was removed. We need to guard for that.
- The field-fetching methods for the User table return NULL if the field
- doesn't exist. This simplifies checking of table "version", as we don't
- have to make use of num_fields() any more.
- */
- inline Field* get_field(uint field_num) const
+ bool set_auth(const ACL_USER &u) const
{
- if (field_num >= num_fields())
- return NULL;
-
- return tl.table->field[field_num];
+ if (u.nauth != 1)
+ return 1;
+ if (plugin())
+ {
+ if (have_password())
+ password()->reset();
+ plugin()->store(u.auth->plugin.str, u.auth->plugin.length, system_charset_info);
+ authstr()->store(u.auth->auth_string.str, u.auth->auth_string.length, system_charset_info);
+ }
+ else
+ {
+ if (u.auth->plugin.str != native_password_plugin_name.str &&
+ u.auth->plugin.str != old_password_plugin_name.str)
+ return 1;
+ password()->store(u.auth->auth_string.str, u.auth->auth_string.length, system_charset_info);
+ }
+ return 0;
}
- /* Normally password column is the third column in the table. If privileges
- start on the third column instead, we are missing the password column.
- This means we are using a MySQL 5.7.6+ data directory. */
- bool have_password() const { return start_privilege_column == 2; }
+ ulong get_access() const
+ {
+ ulong access= Grant_table_base::get_access();
+ if ((num_fields() <= 13) && (access & CREATE_ACL))
+ access|=REFERENCES_ACL | INDEX_ACL | ALTER_ACL;
-};
+ if (num_fields() <= 18)
+ {
+ access|= LOCK_TABLES_ACL | CREATE_TMP_ACL | SHOW_DB_ACL;
+ if (access & FILE_ACL)
+ access|= REPL_CLIENT_ACL | REPL_SLAVE_ACL;
+ if (access & PROCESS_ACL)
+ access|= SUPER_ACL | EXECUTE_ACL;
+ }
-class Db_table: public Grant_table_base
-{
- public:
- Field* host() const { return tl.table->field[0]; }
- Field* db() const { return tl.table->field[1]; }
- Field* user() const { return tl.table->field[2]; }
+ if (num_fields() <= 31 && (access & CREATE_ACL))
+ access|= (CREATE_VIEW_ACL | SHOW_VIEW_ACL);
- private:
- friend class Grant_tables;
+ if (num_fields() <= 33)
+ {
+ if (access & CREATE_ACL)
+ access|= CREATE_PROC_ACL;
+ if (access & ALTER_ACL)
+ access|= ALTER_PROC_ACL;
+ }
- Db_table() {};
+ if (num_fields() <= 36 && (access & GRANT_ACL))
+ access|= CREATE_USER_ACL;
- void init(enum thr_lock_type lock_type)
- {
- /* We are relying on init_one_table zeroing out the TABLE_LIST structure. */
- tl.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_DB_NAME, NULL, lock_type);
- Grant_table_base::init(lock_type, false);
- }
-};
+ if (num_fields() <= 37 && (access & SUPER_ACL))
+ access|= EVENT_ACL;
-class Tables_priv_table: public Grant_table_base
-{
- public:
- Field* host() const { return tl.table->field[0]; }
- Field* db() const { return tl.table->field[1]; }
- Field* user() const { return tl.table->field[2]; }
- Field* table_name() const { return tl.table->field[3]; }
- Field* grantor() const { return tl.table->field[4]; }
- Field* timestamp() const { return tl.table->field[5]; }
- Field* table_priv() const { return tl.table->field[6]; }
- Field* column_priv() const { return tl.table->field[7]; }
+ if (num_fields() <= 38 && (access & SUPER_ACL))
+ access|= TRIGGER_ACL;
- private:
- friend class Grant_tables;
+ if (num_fields() <= 46 && (access & DELETE_ACL))
+ access|= DELETE_HISTORY_ACL;
- Tables_priv_table() {};
+ return access & GLOBAL_ACLS;
+ }
- void init(enum thr_lock_type lock_type, Grant_table_base *next_table= NULL)
+ void set_access(ulong rights, bool revoke) const
{
- /* We are relying on init_one_table zeroing out the TABLE_LIST structure. */
- LEX_CSTRING MYSQL_TABLES_PRIV_NAME={STRING_WITH_LEN("tables_priv") };
- tl.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_TABLES_PRIV_NAME, NULL, lock_type);
- Grant_table_base::init(lock_type, false);
+ ulong priv= SELECT_ACL;
+ for (uint i= start_priv_columns; i < end_priv_columns; i++, priv <<= 1)
+ {
+ if (priv & rights)
+ m_table->field[i]->store(1 + !revoke, 0);
+ }
}
-};
-
-class Columns_priv_table: public Grant_table_base
-{
- public:
- Field* host() const { return tl.table->field[0]; }
- Field* db() const { return tl.table->field[1]; }
- Field* user() const { return tl.table->field[2]; }
- Field* table_name() const { return tl.table->field[3]; }
- Field* column_name() const { return tl.table->field[4]; }
- Field* timestamp() const { return tl.table->field[5]; }
- Field* column_priv() const { return tl.table->field[6]; }
-
- private:
- friend class Grant_tables;
-
- Columns_priv_table() {};
- void init(enum thr_lock_type lock_type)
+ SSL_type get_ssl_type () const
{
- /* We are relying on init_one_table zeroing out the TABLE_LIST structure. */
- LEX_CSTRING MYSQL_COLUMNS_PRIV_NAME={ STRING_WITH_LEN("columns_priv") };
- tl.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_COLUMNS_PRIV_NAME, NULL, lock_type);
- Grant_table_base::init(lock_type, false);
+ Field *f= get_field(end_priv_columns, MYSQL_TYPE_ENUM);
+ return (SSL_type)(f ? f->val_int()-1 : 0);
}
-};
-
-class Host_table: public Grant_table_base
-{
- public:
- Field* host() const { return tl.table->field[0]; }
- Field* db() const { return tl.table->field[1]; }
-
- private:
- friend class Grant_tables;
-
- Host_table() {}
-
- void init(enum thr_lock_type lock_type)
+ int set_ssl_type (SSL_type x) const
{
- /* We are relying on init_one_table zeroing out the TABLE_LIST structure. */
- LEX_CSTRING MYSQL_HOST_NAME={STRING_WITH_LEN("host") };
- tl.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_HOST_NAME, NULL, lock_type);
- Grant_table_base::init(lock_type, true);
+ if (Field *f= get_field(end_priv_columns, MYSQL_TYPE_ENUM))
+ return f->store(x+1, 0);
+ else
+ return 1;
}
-};
-
-class Procs_priv_table: public Grant_table_base
-{
- public:
- Field* host() const { return tl.table->field[0]; }
- Field* db() const { return tl.table->field[1]; }
- Field* user() const { return tl.table->field[2]; }
- Field* routine_name() const { return tl.table->field[3]; }
- Field* routine_type() const { return tl.table->field[4]; }
- Field* grantor() const { return tl.table->field[5]; }
- Field* proc_priv() const { return tl.table->field[6]; }
- Field* timestamp() const { return tl.table->field[7]; }
-
- private:
- friend class Grant_tables;
-
- Procs_priv_table() {}
-
- void init(enum thr_lock_type lock_type)
+ const char* get_ssl_cipher (MEM_ROOT *root) const
{
- /* We are relying on init_one_table zeroing out the TABLE_LIST structure. */
- LEX_CSTRING MYSQL_PROCS_PRIV_NAME={STRING_WITH_LEN("procs_priv") };
- tl.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_PROCS_PRIV_NAME, NULL, lock_type);
- Grant_table_base::init(lock_type, true);
+ Field *f= get_field(end_priv_columns + 1, MYSQL_TYPE_BLOB);
+ return f ? ::get_field(root,f) : 0;
}
-};
-
-class Proxies_priv_table: public Grant_table_base
-{
- public:
- Field* host() const { return tl.table->field[0]; }
- Field* user() const { return tl.table->field[1]; }
- Field* proxied_host() const { return tl.table->field[2]; }
- Field* proxied_user() const { return tl.table->field[3]; }
- Field* with_grant() const { return tl.table->field[4]; }
- Field* grantor() const { return tl.table->field[5]; }
- Field* timestamp() const { return tl.table->field[6]; }
-
- private:
- friend class Grant_tables;
-
- Proxies_priv_table() {}
-
- void init(enum thr_lock_type lock_type)
+ int set_ssl_cipher (const char *s, size_t l) const
{
- /* We are relying on init_one_table zeroing out the TABLE_LIST structure. */
- LEX_CSTRING MYSQL_PROXIES_PRIV_NAME={STRING_WITH_LEN("proxies_priv") };
- tl.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_PROXIES_PRIV_NAME, NULL, lock_type);
- Grant_table_base::init(lock_type, true);
+ if (Field *f= get_field(end_priv_columns + 1, MYSQL_TYPE_BLOB))
+ return f->store(s, l, &my_charset_latin1);
+ else
+ return 1;
}
-};
-
-class Roles_mapping_table: public Grant_table_base
-{
- public:
- Field* host() const { return tl.table->field[0]; }
- Field* user() const { return tl.table->field[1]; }
- Field* role() const { return tl.table->field[2]; }
- Field* admin_option() const { return tl.table->field[3]; }
-
- private:
- friend class Grant_tables;
-
- Roles_mapping_table() {}
-
- void init(enum thr_lock_type lock_type)
+ const char* get_x509_issuer (MEM_ROOT *root) const
{
- /* We are relying on init_one_table zeroing out the TABLE_LIST structure. */
- LEX_CSTRING MYSQL_ROLES_MAPPING_NAME={STRING_WITH_LEN("roles_mapping") };
- tl.init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_ROLES_MAPPING_NAME, NULL, lock_type);
- Grant_table_base::init(lock_type, true);
+ Field *f= get_field(end_priv_columns + 2, MYSQL_TYPE_BLOB);
+ return f ? ::get_field(root,f) : 0;
}
-};
-
-/**
- Class that represents a collection of grant tables.
-*/
-class Grant_tables
-{
- public:
- /* When constructing the Grant_tables object, we initialize only
- the tables which are going to be opened.
- @param which_tables Bitmap of which tables to open.
- @param lock_type Lock type to use when opening tables.
- */
- Grant_tables(int which_tables, enum thr_lock_type lock_type)
+ int set_x509_issuer (const char *s, size_t l) const
{
- DBUG_ENTER("Grant_tables::Grant_tables");
- DBUG_PRINT("info", ("which_tables: %x, lock_type: %u",
- which_tables, lock_type));
- DBUG_ASSERT(which_tables); /* At least one table must be opened. */
- Grant_table_base* prev= NULL;
- /* We start from the last table, Table_roles_mapping, such that
- the first one in the linked list is Table_user. */
- if (which_tables & Table_roles_mapping)
- {
- m_roles_mapping_table.init(lock_type);
- prev= &m_roles_mapping_table;
- }
- if (which_tables & Table_proxies_priv)
- {
- m_proxies_priv_table.init(lock_type);
- link_tables(&m_proxies_priv_table, prev);
- prev= &m_proxies_priv_table;
- }
- if (which_tables & Table_procs_priv)
- {
- m_procs_priv_table.init(lock_type);
- link_tables(&m_procs_priv_table, prev);
- prev= &m_procs_priv_table;
- }
- if (which_tables & Table_host)
- {
- m_host_table.init(lock_type);
- link_tables(&m_host_table, prev);
- prev= &m_host_table;
- }
- if (which_tables & Table_columns_priv)
- {
- m_columns_priv_table.init(lock_type);
- link_tables(&m_columns_priv_table, prev);
- prev= &m_columns_priv_table;
- }
- if (which_tables & Table_tables_priv)
- {
- m_tables_priv_table.init(lock_type);
- link_tables(&m_tables_priv_table, prev);
- prev= &m_tables_priv_table;
- }
- if (which_tables & Table_db)
- {
- m_db_table.init(lock_type);
- link_tables(&m_db_table, prev);
- prev= &m_db_table;
- }
- if (which_tables & Table_user)
- {
- m_user_table.init(lock_type);
- link_tables(&m_user_table, prev);
- prev= &m_user_table;
- }
-
- first_table_in_list= prev;
- DBUG_VOID_RETURN;
+ if (Field *f= get_field(end_priv_columns + 2, MYSQL_TYPE_BLOB))
+ return f->store(s, l, &my_charset_latin1);
+ else
+ return 1;
}
-
- /* Before any operation is possible on grant tables, they must be opened.
- This opens the tables according to the lock type specified during
- construction.
-
- @retval 1 replication filters matched. Abort the operation,
- but return OK (!)
- @retval 0 tables were opened successfully
- @retval -1 error, tables could not be opened
- */
- int open_and_lock(THD *thd)
+ const char* get_x509_subject (MEM_ROOT *root) const
{
- DBUG_ENTER("Grant_tables::open_and_lock");
- DBUG_ASSERT(first_table_in_list);
-#ifdef HAVE_REPLICATION
- if (first_table_in_list->tl.lock_type >= TL_WRITE_ALLOW_WRITE &&
- thd->slave_thread && !thd->spcont)
- {
- /*
- GRANT and REVOKE are applied the slave in/exclusion rules as they are
- some kind of updates to the mysql.% tables.
- */
- Rpl_filter *rpl_filter= thd->system_thread_info.rpl_sql_info->rpl_filter;
- if (rpl_filter->is_on() &&
- !rpl_filter->tables_ok(0, &first_table_in_list->tl))
- DBUG_RETURN(1);
+ Field *f= get_field(end_priv_columns + 3, MYSQL_TYPE_BLOB);
+ return f ? ::get_field(root,f) : 0;
+ }
+ int set_x509_subject (const char *s, size_t l) const
+ {
+ if (Field *f= get_field(end_priv_columns + 3, MYSQL_TYPE_BLOB))
+ return f->store(s, l, &my_charset_latin1);
+ else
+ return 1;
+ }
+ longlong get_max_questions () const
+ {
+ Field *f= get_field(end_priv_columns + 4, MYSQL_TYPE_LONG);
+ return f ? f->val_int() : 0;
+ }
+ int set_max_questions (longlong x) const
+ {
+ if (Field *f= get_field(end_priv_columns + 4, MYSQL_TYPE_LONG))
+ return f->store(x, 0);
+ else
+ return 1;
+ }
+ longlong get_max_updates () const
+ {
+ Field *f= get_field(end_priv_columns + 5, MYSQL_TYPE_LONG);
+ return f ? f->val_int() : 0;
+ }
+ int set_max_updates (longlong x) const
+ {
+ if (Field *f= get_field(end_priv_columns + 5, MYSQL_TYPE_LONG))
+ return f->store(x, 0);
+ else
+ return 1;
+ }
+ longlong get_max_connections () const
+ {
+ Field *f= get_field(end_priv_columns + 6, MYSQL_TYPE_LONG);
+ return f ? f->val_int() : 0;
+ }
+ int set_max_connections (longlong x) const
+ {
+ if (Field *f= get_field(end_priv_columns + 6, MYSQL_TYPE_LONG))
+ return f->store(x, 0);
+ else
+ return 1;
+ }
+ longlong get_max_user_connections () const
+ {
+ Field *f= get_field(end_priv_columns + 7, MYSQL_TYPE_LONG);
+ return f ? f->val_int() : 0;
+ }
+ int set_max_user_connections (longlong x) const
+ {
+ if (Field *f= get_field(end_priv_columns + 7, MYSQL_TYPE_LONG))
+ return f->store(x, 0);
+ else
+ return 1;
+ }
+ double get_max_statement_time () const
+ {
+ Field *f= get_field(end_priv_columns + 13, MYSQL_TYPE_NEWDECIMAL);
+ return f ? f->val_real() : 0;
+ }
+ int set_max_statement_time (double x) const
+ {
+ if (Field *f= get_field(end_priv_columns + 13, MYSQL_TYPE_NEWDECIMAL))
+ return f->store(x);
+ else
+ return 1;
+ }
+ bool get_is_role () const
+ {
+ Field *f= get_field(end_priv_columns + 11, MYSQL_TYPE_ENUM);
+ return f ? f->val_int()-1 : 0;
+ }
+ int set_is_role (bool x) const
+ {
+ if (Field *f= get_field(end_priv_columns + 11, MYSQL_TYPE_ENUM))
+ return f->store(x+1, 0);
+ else
+ return 1;
+ }
+ const char* get_default_role (MEM_ROOT *root) const
+ {
+ Field *f= get_field(end_priv_columns + 12, MYSQL_TYPE_STRING);
+ return f ? ::get_field(root,f) : 0;
+ }
+ int set_default_role (const char *s, size_t l) const
+ {
+ if (Field *f= get_field(end_priv_columns + 12, MYSQL_TYPE_STRING))
+ return f->store(s, l, system_charset_info);
+ else
+ return 1;
+ }
+ /* On a MariaDB 10.3 user table, the account locking accessors will try to
+ get the content of the max_statement_time column, but they will fail due
+ to the typecheck in get_field. */
+ bool get_account_locked () const
+ {
+ Field *f= get_field(end_priv_columns + 13, MYSQL_TYPE_ENUM);
+ return f ? f->val_int()-1 : 0;
+ }
+ int set_account_locked (bool x) const
+ {
+ if (Field *f= get_field(end_priv_columns + 13, MYSQL_TYPE_ENUM))
+ return f->store(x+1, 0);
+
+ return 1;
+ }
+
+ bool get_password_expired () const
+ {
+ uint field_num= end_priv_columns + 10;
+
+ Field *f= get_field(field_num, MYSQL_TYPE_ENUM);
+ return f ? f->val_int()-1 : 0;
+ }
+ int set_password_expired (bool x) const
+ {
+ uint field_num= end_priv_columns + 10;
+
+ if (Field *f= get_field(field_num, MYSQL_TYPE_ENUM))
+ return f->store(x+1, 0);
+ return 1;
+ }
+ my_time_t get_password_last_changed () const
+ {
+ ulong unused_dec;
+ if (Field *f= get_field(end_priv_columns + 11, MYSQL_TYPE_TIMESTAMP2))
+ return f->get_timestamp(&unused_dec);
+ return 0;
+ }
+ int set_password_last_changed (my_time_t x) const
+ {
+ if (Field *f= get_field(end_priv_columns + 11, MYSQL_TYPE_TIMESTAMP2))
+ {
+ f->set_notnull();
+ return f->store_timestamp(x, 0);
}
-#endif
- if (open_and_lock_tables(thd, &first_table_in_list->tl, FALSE,
- MYSQL_LOCK_IGNORE_TIMEOUT))
- DBUG_RETURN(-1);
+ return 1;
+ }
+ longlong get_password_lifetime () const
+ {
+ if (Field *f= get_field(end_priv_columns + 12, MYSQL_TYPE_SHORT))
+ {
+ if (f->is_null())
+ return -1;
+ return f->val_int();
+ }
+ return 0;
+ }
+ int set_password_lifetime (longlong x) const
+ {
+ if (Field *f= get_field(end_priv_columns + 12, MYSQL_TYPE_SHORT))
+ {
+ if (x < 0)
+ {
+ f->set_null();
+ return 0;
+ }
+ f->set_notnull();
+ return f->store(x, 0);
+ }
+ return 1;
+ }
+
+ virtual ~User_table_tabular() {}
+ private:
+ friend class Grant_tables;
+
+ /* Only Grant_tables can instantiate this class. */
+ User_table_tabular() {}
+
+ /* The user table is a bit different compared to the other Grant tables.
+ Usually, we only add columns to the grant tables when adding functionality.
+ This makes it easy to test which version of the table we are using, by
+ just looking at the number of fields present in the table.
+
+ In MySQL 5.7.6 the Password column was removed. We need to guard for that.
+ The field-fetching methods for the User table return NULL if the field
+ doesn't exist. This simplifies checking of table "version", as we don't
+ have to make use of num_fields() any more.
+ */
+ inline Field* get_field(uint field_num, enum enum_field_types type) const
+ {
+ if (field_num >= num_fields())
+ return NULL;
+ Field *f= m_table->field[field_num];
+ return f->real_type() == type ? f : NULL;
+ }
+
+ int setup_sysvars() const
+ {
++ if (num_fields() < 13) // number of columns in 3.21
++ {
++ sql_print_error("Fatal error: mysql.user table is damaged or in "
++ "unsupported 3.20 format.");
++ return 1;
++ }
++
+ username_char_length= MY_MIN(m_table->field[1]->char_length(),
+ USERNAME_CHAR_LENGTH);
+ using_global_priv_table= false;
+
+ if (have_password()) // Password column might be missing. (MySQL 5.7.6+)
+ {
+ int password_length= password()->field_length /
+ password()->charset()->mbmaxlen;
+ if (password_length < SCRAMBLED_PASSWORD_CHAR_LENGTH_323)
+ {
+ sql_print_error("Fatal error: mysql.user table is damaged or in "
+ "unsupported 3.20 format.");
+ return 1;
+ }
+
+ mysql_mutex_lock(&LOCK_global_system_variables);
+ if (password_length < SCRAMBLED_PASSWORD_CHAR_LENGTH)
+ {
+ if (opt_secure_auth)
+ {
+ mysql_mutex_unlock(&LOCK_global_system_variables);
+ sql_print_error("Fatal error: mysql.user table is in old format, "
+ "but server started with --secure-auth option.");
+ return 1;
+ }
+ mysql_user_table_is_in_short_password_format= true;
+ if (global_system_variables.old_passwords)
+ mysql_mutex_unlock(&LOCK_global_system_variables);
+ else
+ {
+ extern sys_var *Sys_old_passwords_ptr;
+ Sys_old_passwords_ptr->value_origin= sys_var::AUTO;
+ global_system_variables.old_passwords= 1;
+ mysql_mutex_unlock(&LOCK_global_system_variables);
+ sql_print_warning("mysql.user table is not updated to new password format; "
+ "Disabling new password usage until "
+ "mysql_fix_privilege_tables is run");
+ }
+ m_table->in_use->variables.old_passwords= 1;
+ }
+ else
+ {
+ mysql_user_table_is_in_short_password_format= false;
+ mysql_mutex_unlock(&LOCK_global_system_variables);
+ }
+ }
+ return 0;
+ }
+
+ /* Normally password column is the third column in the table. If privileges
+ start on the third column instead, we are missing the password column.
+ This means we are using a MySQL 5.7.6+ data directory. */
+ bool have_password() const { return start_priv_columns == 3; }
+
+ Field* password() const { return m_table->field[2]; }
+ Field* plugin() const { return get_field(end_priv_columns + 8, MYSQL_TYPE_STRING); }
+ Field* authstr() const { return get_field(end_priv_columns + 9, MYSQL_TYPE_BLOB); }
+};
+
+/*
+ MariaDB 10.4 and up `global_priv` table
+
+ TODO possible optimizations:
+ * update json in-place if the new value can fit
+ * don't repeat get_value for every key, but use a streaming parser
+ to convert json into in-memory object (ACL_USER?) in one json scan.
+ - this makes sense for acl_load(), but hardly for GRANT
+ * similarly, pack ACL_USER (?) into json in one go.
+ - doesn't make sense? GRANT rarely updates more than one field.
+*/
+class User_table_json: public User_table
+{
+ LEX_CSTRING& name() const { return MYSQL_TABLE_NAME[USER_TABLE]; }
+
+ int get_auth(THD *thd, MEM_ROOT *root, ACL_USER *u) const
+ {
+ size_t array_len;
+ const char *array;
+ int vl;
+ const char *v;
+
+ if (get_value("auth_or", JSV_ARRAY, &array, &array_len))
+ {
+ u->alloc_auth(root, 1);
+ return get_auth1(thd, root, u, 0);
+ }
+
+ if (json_get_array_item(array, array + array_len, (int)array_len,
+ &v, &vl) != JSV_NOTHING)
+ return 1;
+ u->alloc_auth(root, vl);
+ for (uint i=0; i < u->nauth; i++)
+ {
+ if (json_get_array_item(array, array + array_len, i, &v, &vl) != JSV_OBJECT)
+ return 1;
+
+ const char *p, *a;
+ int pl, al;
+ switch (json_get_object_key(v, v + vl, "plugin", &p, &pl)) {
+ case JSV_STRING: u->auth[i].plugin.str= strmake_root(root, p, pl);
+ u->auth[i].plugin.length= pl;
+ break;
+ case JSV_NOTHING: if (get_auth1(thd, root, u, i))
+ return 1;
+ else
+ continue;
+ default: return 1;
+ }
+ switch (json_get_object_key(v, v + vl, "authentication_string", &a, &al)) {
+ case JSV_NOTHING: u->auth[i].auth_string= empty_clex_str;
+ break;
+ case JSV_STRING: u->auth[i].auth_string.str= strmake_root(root, a, al);
+ u->auth[i].auth_string.length= al;
+ break;
+ default: return 1;
+ }
+ }
+ return 0;
+ }
+
+ int get_auth1(THD *thd, MEM_ROOT *root, ACL_USER *u, uint n) const
+ {
+ const char *authstr= get_str_value(root, "authentication_string");
+ const char *plugin= get_str_value(root, "plugin");
+ if (plugin && authstr)
+ {
+ if (plugin && *plugin)
+ {
+ u->auth[n].plugin.str= plugin;
+ u->auth[n].plugin.length= strlen(plugin);
+ }
+ else
+ u->auth[n].plugin= native_password_plugin_name;
+ u->auth[n].auth_string.str= authstr;
+ u->auth[n].auth_string.length= strlen(authstr);
+ return 0;
+ }
+ return 1;
+ }
+
+ bool append_str_value(String *to, const LEX_CSTRING &str) const
+ {
+ to->append('"');
+ to->reserve(str.length*2);
+ int len= json_escape(system_charset_info, (uchar*)str.str, (uchar*)str.str + str.length,
+ to->charset(), (uchar*)to->end(), (uchar*)to->end() + str.length*2);
+ if (len < 0)
+ return 1;
+ to->length(to->length() + len);
+ to->append('"');
+ return 0;
+ }
+
+ bool set_auth(const ACL_USER &u) const
+ {
+ StringBuffer<JSON_SIZE> json(m_table->field[2]->charset());
+ if (u.nauth == 1)
+ return set_auth1(u, 0);
+ bool top_done = false;
+ json.append('[');
+ for (uint i=0; i < u.nauth; i++)
+ {
+ ACL_USER::AUTH * const auth= u.auth + i;
+ if (i)
+ json.append(',');
+ json.append('{');
+ if (!top_done &&
+ (auth->plugin.str == native_password_plugin_name.str ||
+ auth->plugin.str == old_password_plugin_name.str ||
+ i == u.nauth - 1))
+ {
+ if (set_auth1(u, i))
+ return 1;
+ top_done= true;
+ }
+ else
+ {
+ json.append(STRING_WITH_LEN("\"plugin\":"));
+ if (append_str_value(&json, auth->plugin))
+ return 1;
+ if (auth->auth_string.length)
+ {
+ json.append(STRING_WITH_LEN(",\"authentication_string\":"));
+ if (append_str_value(&json, auth->auth_string))
+ return 1;
+ }
+ }
+ json.append('}');
+ }
+ json.append(']');
+ return set_value("auth_or", json.ptr(), json.length(), false) == JSV_BAD_JSON;
+ }
+ bool set_auth1(const ACL_USER &u, uint i) const
+ {
+ return set_str_value("plugin",
+ u.auth[i].plugin.str, u.auth[i].plugin.length) ||
+ set_str_value("authentication_string",
+ u.auth[i].auth_string.str, u.auth[i].auth_string.length);
+ }
+ ulong get_access() const
+ {
+ /*
+ when new privileges will be added, we'll start storing GLOBAL_ACLS
+ (or, for example, my_count_bits(GLOBAL_ACLS))
+ in the json too, and it'll allow us to do privilege upgrades
+ */
+ return get_int_value("access") & GLOBAL_ACLS;
+ }
+ void set_access(ulong rights, bool revoke) const
+ {
+ ulong access= get_access();
+ if (revoke)
+ access&= ~rights;
+ else
+ access|= rights;
+ set_int_value("access", access & GLOBAL_ACLS);
+ }
+ const char *unsafe_str(const char *s) const
+ { return s[0] ? s : NULL; }
+
+ SSL_type get_ssl_type () const
+ { return (SSL_type)get_int_value("ssl_type"); }
+ int set_ssl_type (SSL_type x) const
+ { return set_int_value("ssl_type", x); }
+ const char* get_ssl_cipher (MEM_ROOT *root) const
+ { return unsafe_str(get_str_value(root, "ssl_cipher")); }
+ int set_ssl_cipher (const char *s, size_t l) const
+ { return set_str_value("ssl_cipher", s, l); }
+ const char* get_x509_issuer (MEM_ROOT *root) const
+ { return unsafe_str(get_str_value(root, "x509_issuer")); }
+ int set_x509_issuer (const char *s, size_t l) const
+ { return set_str_value("x509_issuer", s, l); }
+ const char* get_x509_subject (MEM_ROOT *root) const
+ { return unsafe_str(get_str_value(root, "x509_subject")); }
+ int set_x509_subject (const char *s, size_t l) const
+ { return set_str_value("x509_subject", s, l); }
+ longlong get_max_questions () const
+ { return get_int_value("max_questions"); }
+ int set_max_questions (longlong x) const
+ { return set_int_value("max_questions", x); }
+ longlong get_max_updates () const
+ { return get_int_value("max_updates"); }
+ int set_max_updates (longlong x) const
+ { return set_int_value("max_updates", x); }
+ longlong get_max_connections () const
+ { return get_int_value("max_connections"); }
+ int set_max_connections (longlong x) const
+ { return set_int_value("max_connections", x); }
+ longlong get_max_user_connections () const
+ { return get_int_value("max_user_connections"); }
+ int set_max_user_connections (longlong x) const
+ { return set_int_value("max_user_connections", x); }
+ double get_max_statement_time () const
+ { return get_double_value("max_statement_time"); }
+ int set_max_statement_time (double x) const
+ { return set_double_value("max_statement_time", x); }
+ bool get_is_role () const
+ { return get_bool_value("is_role"); }
+ int set_is_role (bool x) const
+ { return set_bool_value("is_role", x); }
+ const char* get_default_role (MEM_ROOT *root) const
+ { return get_str_value(root, "default_role"); }
+ int set_default_role (const char *s, size_t l) const
+ { return set_str_value("default_role", s, l); }
+ bool get_account_locked () const
+ { return get_bool_value("account_locked"); }
+ int set_account_locked (bool x) const
+ { return set_bool_value("account_locked", x); }
+ my_time_t get_password_last_changed () const
+ { return static_cast<my_time_t>(get_int_value("password_last_changed")); }
+ int set_password_last_changed (my_time_t x) const
+ { return set_int_value("password_last_changed", static_cast<longlong>(x)); }
+ int set_password_lifetime (longlong x) const
+ { return set_int_value("password_lifetime", x); }
+ longlong get_password_lifetime () const
+ { return get_int_value("password_lifetime", -1); }
+ /*
+ password_last_changed=0 means the password is manually expired.
+ In MySQL 5.7+ this state is described using the password_expired column
+ in mysql.user
+ */
+ bool get_password_expired () const
+ { return get_int_value("password_last_changed", -1) == 0; }
+ int set_password_expired (bool x) const
+ { return x ? set_password_last_changed(0) : 0; }
+
+ ~User_table_json() {}
+ private:
+ friend class Grant_tables;
+ static const uint JSON_SIZE=1024;
+ int setup_sysvars() const
+ {
+ using_global_priv_table= true;
+ username_char_length= MY_MIN(m_table->field[1]->char_length(),
+ USERNAME_CHAR_LENGTH);
+ return 0;
+ }
+ bool get_value(const char *key,
+ enum json_types vt, const char **v, size_t *vl) const
+ {
+ enum json_types value_type;
+ int int_vl;
+ String str, *res= m_table->field[2]->val_str(&str);
+ if (!res ||
+ (value_type= json_get_object_key(res->ptr(), res->end(), key,
+ v, &int_vl)) == JSV_BAD_JSON)
+ return 1; // invalid
+ *vl= int_vl;
+ return value_type != vt;
+ }
+ const char *get_str_value(MEM_ROOT *root, const char *key) const
+ {
+ size_t value_len;
+ const char *value_start;
+ if (get_value(key, JSV_STRING, &value_start, &value_len))
+ return "";
+ char *ptr= (char*)alloca(value_len);
+ int len= json_unescape(m_table->field[2]->charset(),
+ (const uchar*)value_start,
+ (const uchar*)value_start + value_len,
+ system_charset_info,
+ (uchar*)ptr, (uchar*)ptr + value_len);
+ if (len < 0)
+ return NULL;
+ return strmake_root(root, ptr, len);
+ }
+ longlong get_int_value(const char *key, longlong def_val= 0) const
+ {
+ int err;
+ size_t value_len;
+ const char *value_start;
+ if (get_value(key, JSV_NUMBER, &value_start, &value_len))
+ return def_val;
+ const char *value_end= value_start + value_len;
+ return my_strtoll10(value_start, (char**)&value_end, &err);
+ }
+ double get_double_value(const char *key) const
+ {
+ int err;
+ size_t value_len;
+ const char *value_start;
+ if (get_value(key, JSV_NUMBER, &value_start, &value_len))
+ return 0;
+ const char *value_end= value_start + value_len;
+ return my_strtod(value_start, (char**)&value_end, &err);
+ }
+ bool get_bool_value(const char *key) const
+ {
+ size_t value_len;
+ const char *value_start;
+ if (get_value(key, JSV_TRUE, &value_start, &value_len))
+ return false;
+ return true;
+ }
+ enum json_types set_value(const char *key,
+ const char *val, size_t vlen, bool string) const
+ {
+ int value_len;
+ const char *value_start;
+ enum json_types value_type;
+ String str, *res= m_table->field[2]->val_str(&str);
+ if (!res || !res->length())
+ (res= &str)->set(STRING_WITH_LEN("{}"), m_table->field[2]->charset());
+ value_type= json_get_object_key(res->ptr(), res->end(), key,
+ &value_start, &value_len);
+ if (value_type == JSV_BAD_JSON)
+ return value_type; // invalid
+ StringBuffer<JSON_SIZE> json(res->charset());
+ json.copy(res->ptr(), value_start - res->ptr(), res->charset());
+ if (value_type == JSV_NOTHING)
+ {
+ if (value_len)
+ json.append(',');
+ json.append('"');
+ json.append(key);
+ json.append(STRING_WITH_LEN("\":"));
+ if (string)
+ json.append('"');
+ }
+ else
+ value_start+= value_len;
+ json.append(val, vlen);
+ if (!value_type && string)
+ json.append('"');
+ json.append(value_start, res->end() - value_start);
+ DBUG_ASSERT(json_valid(json.ptr(), json.length(), json.charset()));
+ m_table->field[2]->store(json.ptr(), json.length(), json.charset());
+ return value_type;
+ }
+ bool set_str_value(const char *key, const char *val, size_t vlen) const
+ {
+ char buf[JSON_SIZE];
+ int blen= json_escape(system_charset_info,
+ (const uchar*)val, (const uchar*)val + vlen,
+ m_table->field[2]->charset(),
+ (uchar*)buf, (uchar*)buf+sizeof(buf));
+ if (blen < 0)
+ return 1;
+ return set_value(key, buf, blen, true) == JSV_BAD_JSON;
+ }
+ bool set_int_value(const char *key, longlong val) const
+ {
+ char v[MY_INT64_NUM_DECIMAL_DIGITS+1];
+ size_t vlen= longlong10_to_str(val, v, -10) - v;
+ return set_value(key, v, vlen, false) == JSV_BAD_JSON;
+ }
+ bool set_double_value(const char *key, double val) const
+ {
+ char v[FLOATING_POINT_BUFFER+1];
+ size_t vlen= my_fcvt(val, TIME_SECOND_PART_DIGITS, v, NULL);
+ return set_value(key, v, vlen, false) == JSV_BAD_JSON;
+ }
+ bool set_bool_value(const char *key, bool val) const
+ {
+ return set_value(key, val ? "true" : "false", val ? 4 : 5, false) == JSV_BAD_JSON;
+ }
+};
+
+class Db_table: public Grant_table_base
+{
+ public:
+ Field* host() const { return m_table->field[0]; }
+ Field* db() const { return m_table->field[1]; }
+ Field* user() const { return m_table->field[2]; }
+ private:
+ friend class Grant_tables;
+
+ Db_table() {}
+};
+
+class Tables_priv_table: public Grant_table_base
+{
+ public:
+ Field* host() const { return m_table->field[0]; }
+ Field* db() const { return m_table->field[1]; }
+ Field* user() const { return m_table->field[2]; }
+ Field* table_name() const { return m_table->field[3]; }
+ Field* grantor() const { return m_table->field[4]; }
+ Field* timestamp() const { return m_table->field[5]; }
+ Field* table_priv() const { return m_table->field[6]; }
+ Field* column_priv() const { return m_table->field[7]; }
+
+ private:
+ friend class Grant_tables;
+
+ Tables_priv_table() {}
+};
+
+class Columns_priv_table: public Grant_table_base
+{
+ public:
+ Field* host() const { return m_table->field[0]; }
+ Field* db() const { return m_table->field[1]; }
+ Field* user() const { return m_table->field[2]; }
+ Field* table_name() const { return m_table->field[3]; }
+ Field* column_name() const { return m_table->field[4]; }
+ Field* timestamp() const { return m_table->field[5]; }
+ Field* column_priv() const { return m_table->field[6]; }
+
+ private:
+ friend class Grant_tables;
+
+ Columns_priv_table() {}
+};
+
+class Host_table: public Grant_table_base
+{
+ public:
+ Field* host() const { return m_table->field[0]; }
+ Field* db() const { return m_table->field[1]; }
+
+ private:
+ friend class Grant_tables;
+
+ Host_table() {}
+};
+
+class Procs_priv_table: public Grant_table_base
+{
+ public:
+ Field* host() const { return m_table->field[0]; }
+ Field* db() const { return m_table->field[1]; }
+ Field* user() const { return m_table->field[2]; }
+ Field* routine_name() const { return m_table->field[3]; }
+ Field* routine_type() const { return m_table->field[4]; }
+ Field* grantor() const { return m_table->field[5]; }
+ Field* proc_priv() const { return m_table->field[6]; }
+ Field* timestamp() const { return m_table->field[7]; }
+
+ private:
+ friend class Grant_tables;
+
+ Procs_priv_table() {}
+};
+
+class Proxies_priv_table: public Grant_table_base
+{
+ public:
+ Field* host() const { return m_table->field[0]; }
+ Field* user() const { return m_table->field[1]; }
+ Field* proxied_host() const { return m_table->field[2]; }
+ Field* proxied_user() const { return m_table->field[3]; }
+ Field* with_grant() const { return m_table->field[4]; }
+ Field* grantor() const { return m_table->field[5]; }
+ Field* timestamp() const { return m_table->field[6]; }
+
+ private:
+ friend class Grant_tables;
+
+ Proxies_priv_table() {}
+};
+
+class Roles_mapping_table: public Grant_table_base
+{
+ public:
+ Field* host() const { return m_table->field[0]; }
+ Field* user() const { return m_table->field[1]; }
+ Field* role() const { return m_table->field[2]; }
+ Field* admin_option() const { return m_table->field[3]; }
+
+ private:
+ friend class Grant_tables;
+
+ Roles_mapping_table() {}
+};
+
+/**
+ Class that represents a collection of grant tables.
+*/
+class Grant_tables
+{
+ public:
+ Grant_tables() : p_user_table(&m_user_table_json) { }
+
+ int open_and_lock(THD *thd, int which_tables, enum thr_lock_type lock_type)
+ {
+ DBUG_ENTER("Grant_tables::open_and_lock");
+ TABLE_LIST tables[USER_TABLE+1], *first= NULL;
+
+ DBUG_ASSERT(which_tables); /* At least one table must be opened. */
/*
We can read privilege tables even when !initialized.
This can be acl_load() - server startup or FLUSH PRIVILEGES
@@@ -1808,52 -1223,16 +1815,56 @@@
DBUG_RETURN(-1);
}
- /* The privilge columns vary based on MariaDB version. Figure out
- how many we have after we've opened the table. */
- m_user_table.compute_num_privilege_cols();
- m_db_table.compute_num_privilege_cols();
- m_tables_priv_table.compute_num_privilege_cols();
- m_columns_priv_table.compute_num_privilege_cols();
- m_host_table.compute_num_privilege_cols();
- m_procs_priv_table.compute_num_privilege_cols();
- m_proxies_priv_table.compute_num_privilege_cols();
- m_roles_mapping_table.compute_num_privilege_cols();
+ for (int i=USER_TABLE; i >=0; i--)
+ {
+ TABLE_LIST *tl= tables + i;
+ if (which_tables & (1 << i))
+ {
+ tl->init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_TABLE_NAME[i],
+ NULL, lock_type);
++ tl->open_type= OT_BASE_ONLY;
++ tl->i_s_requested_object= OPEN_TABLE_ONLY;
+ tl->updating= lock_type >= TL_WRITE_ALLOW_WRITE;
+ if (i >= FIRST_OPTIONAL_TABLE)
+ tl->open_strategy= TABLE_LIST::OPEN_IF_EXISTS;
+ tl->next_global= tl->next_local= first;
+ first= tl;
+ }
+ else
+ tl->table= NULL;
+ }
+
+ uint counter;
+ int res= really_open(thd, first, &counter);
+
+ /* if User_table_json wasn't found, let's try User_table_tabular */
+ if (!res && (which_tables & Table_user) && !(tables[USER_TABLE].table))
+ {
+ uint unused;
+ TABLE_LIST *tl= tables + USER_TABLE;
+ tl->init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_TABLE_NAME_USER,
+ NULL, lock_type);
++ tl->open_type= OT_BASE_ONLY;
++ tl->i_s_requested_object= OPEN_TABLE_ONLY;
+ tl->updating= lock_type >= TL_WRITE_ALLOW_WRITE;
+ p_user_table= &m_user_table_tabular;
+ counter++;
+ res= really_open(thd, tl, &unused);
+ }
+ if (res)
+ DBUG_RETURN(res);
+
+ if (lock_tables(thd, first, counter, MYSQL_LOCK_IGNORE_TIMEOUT))
+ DBUG_RETURN(-1);
+
+ p_user_table->set_table(tables[USER_TABLE].table);
+ m_db_table.set_table(tables[DB_TABLE].table);
+ m_tables_priv_table.set_table(tables[TABLES_PRIV_TABLE].table);
+ m_columns_priv_table.set_table(tables[COLUMNS_PRIV_TABLE].table);
+ m_host_table.set_table(tables[HOST_TABLE].table);
+ m_procs_priv_table.set_table(tables[PROCS_PRIV_TABLE].table);
+ m_proxies_priv_table.set_table(tables[PROXIES_PRIV_TABLE].table);
+ m_roles_mapping_table.set_table(tables[ROLES_MAPPING_TABLE].table);
DBUG_RETURN(0);
}
diff --cc sql/sql_base.cc
index 0e7059918c2,b1fa78b5ec6..60371813280
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@@ -721,8 -613,9 +727,10 @@@ static void mark_used_tables_as_free_fo
table->query_id= 0;
table->file->ha_reset();
}
+ else if (table->file->check_table_binlog_row_based_done)
+ table->file->clear_cached_table_binlog_row_based_flag();
}
+ DBUG_VOID_RETURN;
}
diff --cc sql/sql_class.h
index 1266e1777ce,fa2fadd598e..dd9cfbbd1c4
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@@ -39,7 -38,10 +39,8 @@@
#include "thr_timer.h"
#include "thr_malloc.h"
#include "log_slow.h" /* LOG_SLOW_DISABLE_... */
+ #include <my_tree.h>
-
#include "sql_digest_stream.h" // sql_digest_state
-
#include <mysql/psi/mysql_stage.h>
#include <mysql/psi/mysql_statement.h>
#include <mysql/psi/mysql_idle.h>
diff --cc sql/sql_lex.cc
index b0544300f1d,ef58dfb2b28..573c609de79
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@@ -8820,1605 -8266,9 +8836,1615 @@@ bool LEX::tvc_finalize_derived(
thd->parse_error();
return true;
}
- if (current_select->linkage == GLOBAL_OPTIONS_TYPE ||
+ if (current_select->get_linkage() == GLOBAL_OPTIONS_TYPE ||
unlikely(mysql_new_select(this, 1, NULL)))
return true;
- current_select->linkage= DERIVED_TABLE_TYPE;
+ current_select->set_linkage(DERIVED_TABLE_TYPE);
return tvc_finalize();
}
+
+
+void st_select_lex_unit::reset_distinct()
+{
+ union_distinct= NULL;
+ for(SELECT_LEX *sl= first_select()->next_select();
+ sl;
+ sl= sl->next_select())
+ {
+ if (sl->distinct)
+ {
+ union_distinct= sl;
+ }
+ }
+}
+
+
+void st_select_lex_unit::fix_distinct()
+{
+ if (union_distinct && this != union_distinct->master_unit())
+ reset_distinct();
+}
+
+
+void st_select_lex_unit::register_select_chain(SELECT_LEX *first_sel)
+{
+ DBUG_ASSERT(first_sel != 0);
+ slave= first_sel;
+ first_sel->prev= &slave;
+ for(SELECT_LEX *sel=first_sel; sel; sel= sel->next_select())
+ {
+ sel->master= (st_select_lex_node *)this;
+ uncacheable|= sel->uncacheable;
+ }
+}
+
+
+void st_select_lex::register_unit(SELECT_LEX_UNIT *unit,
+ Name_resolution_context *outer_context)
+{
+ if ((unit->next= slave))
+ slave->prev= &unit->next;
+ unit->prev= &slave;
+ slave= unit;
+ unit->master= this;
+ uncacheable|= unit->uncacheable;
+
+ for(SELECT_LEX *sel= unit->first_select();sel; sel= sel->next_select())
+ {
+ sel->context.outer_context= outer_context;
+ }
+}
+
+
+void st_select_lex::add_statistics(SELECT_LEX_UNIT *unit)
+{
+ for (;
+ unit;
+ unit= unit->next_unit())
+ for(SELECT_LEX *child= unit->first_select();
+ child;
+ child= child->next_select())
+ {
+ /*
+ A subselect can add fields to an outer select.
+ Reserve space for them.
+ */
+ select_n_where_fields+= child->select_n_where_fields;
+ /*
+ Aggregate functions in having clause may add fields
+ to an outer select. Count them also.
+ */
+ select_n_having_items+= child->select_n_having_items;
+ }
+}
+
+
+bool LEX::main_select_push()
+{
+ DBUG_ENTER("LEX::main_select_push");
+ current_select_number= 1;
+ builtin_select.select_number= 1;
+ if (push_select(&builtin_select))
+ DBUG_RETURN(TRUE);
+ DBUG_RETURN(FALSE);
+}
+
+void Lex_select_lock::set_to(SELECT_LEX *sel)
+{
+ if (defined_lock)
+ {
+ if (sel->master_unit() &&
+ sel == sel->master_unit()->fake_select_lex)
+ sel->master_unit()->set_lock_to_the_last_select(*this);
+ else
+ {
+ sel->parent_lex->safe_to_cache_query= 0;
+ if (update_lock)
+ {
+ sel->lock_type= TL_WRITE;
- sel->set_lock_for_tables(TL_WRITE);
++ sel->set_lock_for_tables(TL_WRITE, false);
+ }
+ else
+ {
+ sel->lock_type= TL_READ_WITH_SHARED_LOCKS;
- sel->set_lock_for_tables(TL_READ_WITH_SHARED_LOCKS);
++ sel->set_lock_for_tables(TL_READ_WITH_SHARED_LOCKS, false);
+ }
+ }
+ }
+}
+
+bool Lex_order_limit_lock::set_to(SELECT_LEX *sel)
+{
+ /*TODO: lock */
+ //if (lock.defined_lock && sel == sel->master_unit()->fake_select_lex)
+ // return TRUE;
+ if (lock.defined_timeout)
+ {
+ THD *thd= sel->parent_lex->thd;
+ if (set_statement_var_if_exists(thd,
+ C_STRING_WITH_LEN("lock_wait_timeout"),
+ lock.timeout) ||
+ set_statement_var_if_exists(thd,
+ C_STRING_WITH_LEN("innodb_lock_wait_timeout"),
+ lock.timeout))
+ return TRUE;
+ }
+ lock.set_to(sel);
+ sel->explicit_limit= limit.explicit_limit;
+ sel->select_limit= limit.select_limit;
+ sel->offset_limit= limit.offset_limit;
+ if (order_list)
+ {
+ if (sel->get_linkage() != GLOBAL_OPTIONS_TYPE &&
+ sel->olap != UNSPECIFIED_OLAP_TYPE &&
+ (sel->get_linkage() != UNION_TYPE || sel->braces))
+ {
+ my_error(ER_WRONG_USAGE, MYF(0),
+ "CUBE/ROLLUP", "ORDER BY");
+ return TRUE;
+ }
+ sel->order_list= *(order_list);
+ }
+ sel->is_set_query_expr_tail= true;
+ return FALSE;
+}
+
+
+static void change_item_list_context(List<Item> *list,
+ Name_resolution_context *context)
+{
+ List_iterator_fast<Item> it (*list);
+ Item *item;
+ while((item= it++))
+ {
+ item->walk(&Item::change_context_processor, FALSE, (void *)context);
+ }
+}
+
+
+bool LEX::insert_select_hack(SELECT_LEX *sel)
+{
+ DBUG_ENTER("LEX::insert_select_hack");
+
+ DBUG_ASSERT(first_select_lex() == &builtin_select);
+ DBUG_ASSERT(sel != NULL);
+
+ DBUG_ASSERT(builtin_select.first_inner_unit() == NULL);
+
+ if (builtin_select.link_prev)
+ {
+ if ((*builtin_select.link_prev= builtin_select.link_next))
+ ((st_select_lex *)builtin_select.link_next)->link_prev=
+ builtin_select.link_prev;
+ builtin_select.link_prev= NULL; // indicator of removal
+ }
+
+ set_main_unit(sel->master_unit());
+
+ DBUG_ASSERT(builtin_select.table_list.elements == 1);
+ TABLE_LIST *insert_table= builtin_select.table_list.first;
+
+ if (!(insert_table->next_local= sel->table_list.first))
+ {
+ sel->table_list.next= &insert_table->next_local;
+ }
+ sel->table_list.first= insert_table;
+ sel->table_list.elements++;
+ insert_table->select_lex= sel;
+
+ sel->context.first_name_resolution_table= insert_table;
+ builtin_select.context= sel->context;
+ change_item_list_context(&field_list, &sel->context);
+
+ if (sel->tvc && !sel->next_select() &&
+ (sql_command == SQLCOM_INSERT_SELECT ||
+ sql_command == SQLCOM_REPLACE_SELECT))
+ {
+ DBUG_PRINT("info", ("'Usual' INSERT detected"));
+ many_values= sel->tvc->lists_of_values;
+ sel->options= sel->tvc->select_options;
+ sel->tvc= NULL;
+ if (sql_command == SQLCOM_INSERT_SELECT)
+ sql_command= SQLCOM_INSERT;
+ else
+ sql_command= SQLCOM_REPLACE;
+ }
+
+
+ for (SELECT_LEX *sel= all_selects_list;
+ sel;
+ sel= sel->next_select_in_list())
+ {
+ if (sel->select_number != 1)
+ sel->select_number--;
+ };
+
+ DBUG_RETURN(FALSE);
+}
+
+
+/*
+ Create an Item_singlerow_subselect for a query expression.
+*/
+Item *LEX::create_item_query_expression(THD *thd,
+ const char *tok_start,
+ st_select_lex_unit *unit)
+{
+ if (!expr_allows_subselect)
+ {
+ thd->parse_error(ER_SYNTAX_ERROR, tok_start);
+ return NULL;
+ }
+
+ // Add the subtree of subquery to the current SELECT_LEX
+ SELECT_LEX *curr_sel= select_stack_head();
+ DBUG_ASSERT(current_select == curr_sel);
+ if (!curr_sel)
+ curr_sel= &builtin_select;
+ curr_sel->register_unit(unit, &curr_sel->context);
+ curr_sel->add_statistics(unit);
+
+ return new (thd->mem_root)
+ Item_singlerow_subselect(thd, unit->first_select());
+}
+
+
+/**
+ Process unit parsed in brackets
+*/
+
+bool LEX::parsed_unit_in_brackets(SELECT_LEX_UNIT *unit)
+{
+ SELECT_LEX *first_in_nest= unit->pre_last_parse->next_select()->first_nested;
+ if (first_in_nest->first_nested != first_in_nest)
+ {
+ /* There is a priority jump starting from first_in_nest */
+ if (create_priority_nest(first_in_nest) == NULL)
+ return true;
+ unit->fix_distinct();
+ }
+ push_select(unit->fake_select_lex);
+ return false;
+}
+
+
+
+/**
+ Process tail of unit parsed in brackets
+*/
+SELECT_LEX *LEX::parsed_unit_in_brackets_tail(SELECT_LEX_UNIT *unit,
+ Lex_order_limit_lock * l)
+{
+ pop_select();
+ if (l)
+ {
+ (l)->set_to(unit->fake_select_lex);
+ }
+ return unit->first_select();
+}
+
+
+/**
+ Process select parsed in brackets
+*/
+
+SELECT_LEX *LEX::parsed_select(SELECT_LEX *sel, Lex_order_limit_lock * l)
+{
+ pop_select();
+ if (l)
+ {
+ if (sel->next_select())
+ {
+ SELECT_LEX_UNIT *unit= sel->master_unit();
+ if (!unit)
+ unit= create_unit(sel);
+ if (!unit)
+ return NULL;
+ if (!unit->fake_select_lex->is_set_query_expr_tail)
+ l->set_to(unit->fake_select_lex);
+ else
+ {
+ if (!l->order_list && !unit->fake_select_lex->explicit_limit)
+ {
+ sel= unit->fake_select_lex;
+ l->order_list= &sel->order_list;
+ }
+ else
+ sel= wrap_unit_into_derived(unit);
+ if (!sel)
+ return NULL;
+ l->set_to(sel);
+ }
+ }
+ else if (!sel->is_set_query_expr_tail)
+ {
+ l->set_to(sel);
+ }
+ else
+ {
+ if (!l->order_list && !sel->explicit_limit)
+ l->order_list= &sel->order_list;
+ else
+ {
+ SELECT_LEX_UNIT *unit= create_unit(sel);
+ if (!unit)
+ return NULL;
+ sel= wrap_unit_into_derived(unit);
+ }
+ if (!sel)
+ return NULL;
+ l->set_to(sel);
+ }
+ }
+ return sel;
+}
+
+
+/**
+ Process select parsed in brackets
+*/
+
+SELECT_LEX *LEX::parsed_select_in_brackets(SELECT_LEX *sel,
+ Lex_order_limit_lock * l)
+{
+ sel->braces= TRUE;
+ return parsed_select(sel, l);
+}
+
+
+SELECT_LEX_UNIT *LEX::parsed_select_expr_start(SELECT_LEX *s1, SELECT_LEX *s2,
+ enum sub_select_type unit_type,
+ bool distinct)
+{
+ SELECT_LEX_UNIT *res;
+ SELECT_LEX *sel1;
+ SELECT_LEX *sel2;
+ if (!s1->next_select())
+ sel1= s1;
+ else
+ {
+ sel1= wrap_unit_into_derived(s1->master_unit());
+ if (!sel1)
+ return NULL;
+ }
+ if (!s2->next_select())
+ sel2= s2;
+ else
+ {
+ sel2= wrap_unit_into_derived(s2->master_unit());
+ if (!sel2)
+ return NULL;
+ }
+ sel1->link_neighbour(sel2);
+ sel2->set_linkage_and_distinct(unit_type, distinct);
+ sel2->first_nested= sel1->first_nested= sel1;
+ res= create_unit(sel1);
+ if (res == NULL)
+ return NULL;
+ res->pre_last_parse= sel1;
+ return res;
+}
+
+
+SELECT_LEX_UNIT *LEX::parsed_select_expr_cont(SELECT_LEX_UNIT *unit,
+ SELECT_LEX *s2,
+ enum sub_select_type unit_type,
+ bool distinct, bool oracle)
+{
+ SELECT_LEX *sel1;
+ if (!s2->next_select())
+ sel1= s2;
+ else
+ {
+ sel1= wrap_unit_into_derived(s2->master_unit());
+ if (!sel1)
+ return NULL;
+ }
+ SELECT_LEX *last= unit->pre_last_parse->next_select();
+
+ int cmp= oracle? 0 : cmp_unit_op(unit_type, last->get_linkage());
+ if (cmp == 0)
+ {
+ sel1->first_nested= last->first_nested;
+ }
+ else if (cmp > 0)
+ {
+ last->first_nested= unit->pre_last_parse;
+ sel1->first_nested= last;
+ }
+ else /* cmp < 0 */
+ {
+ SELECT_LEX *first_in_nest= last->first_nested;
+ if (first_in_nest->first_nested != first_in_nest)
+ {
+ /* There is a priority jump starting from first_in_nest */
+ if ((last= create_priority_nest(first_in_nest)) == NULL)
+ return NULL;
+ unit->fix_distinct();
+ }
+ sel1->first_nested= last->first_nested;
+ }
+ last->link_neighbour(sel1);
+ sel1->set_master_unit(unit);
+ sel1->set_linkage_and_distinct(unit_type, distinct);
+ unit->pre_last_parse= last;
+ return unit;
+}
+
+/**
+ Process parsed select in body
+*/
+
+SELECT_LEX_UNIT *LEX::parsed_body_select(SELECT_LEX *sel,
+ Lex_order_limit_lock * l)
+{
+ if (!(sel= parsed_select(sel, l)))
+ return NULL;
+
+ SELECT_LEX_UNIT *res= create_unit(sel);
++ if (res && sel->tvc && sel->order_list.elements)
++ {
++ if (res->add_fake_select_lex(thd))
++ return NULL;
++ SELECT_LEX *fake= res->fake_select_lex;
++ fake->order_list= sel->order_list;
++ fake->explicit_limit= sel->explicit_limit;
++ fake->select_limit= sel->select_limit;
++ fake->offset_limit= sel->offset_limit;
++ }
+ return res;
+}
+
+/**
+ Process parsed unit in body
+*/
+
+bool LEX::parsed_body_unit(SELECT_LEX_UNIT *unit)
+{
+ SELECT_LEX *first_in_nest=
+ unit->pre_last_parse->next_select()->first_nested;
+ if (first_in_nest->first_nested != first_in_nest)
+ {
+ /* There is a priority jump starting from first_in_nest */
+ if (create_priority_nest(first_in_nest) == NULL)
+ return true;
+ unit->fix_distinct();
+ }
+ push_select(unit->fake_select_lex);
+ return false;
+}
+
+/**
+ Process parsed tail of unit in body
+
+ TODO: make processing for double tail case
+*/
+
+SELECT_LEX_UNIT *LEX::parsed_body_unit_tail(SELECT_LEX_UNIT *unit,
+ Lex_order_limit_lock * l)
+{
+ pop_select();
+ if (l)
+ {
+ (l)->set_to(unit->fake_select_lex);
+ }
+ return unit;
+}
+
+/**
+ Process subselect parsing
+*/
+
+SELECT_LEX *LEX::parsed_subselect(SELECT_LEX_UNIT *unit, char *place)
+{
+ if (!expr_allows_subselect)
+ {
+ thd->parse_error(ER_SYNTAX_ERROR, place);
+ return NULL;
+ }
+
+ // Add the subtree of subquery to the current SELECT_LEX
+ SELECT_LEX *curr_sel= select_stack_head();
+ DBUG_ASSERT(current_select == curr_sel);
+ if (curr_sel)
+ {
+ curr_sel->register_unit(unit, &curr_sel->context);
+ curr_sel->add_statistics(unit);
+ }
+
+ return unit->first_select();
+}
+
+
+
+/**
+ Process INSERT-like select
+*/
+
+bool LEX::parsed_insert_select(SELECT_LEX *first_select)
+{
+ if (sql_command == SQLCOM_INSERT ||
+ sql_command == SQLCOM_REPLACE)
+ {
+ if (sql_command == SQLCOM_INSERT)
+ sql_command= SQLCOM_INSERT_SELECT;
+ else
+ sql_command= SQLCOM_REPLACE_SELECT;
+ }
+ insert_select_hack(first_select);
+ if (check_main_unit_semantics())
+ return true;
+
+ // fix "main" select
+ SELECT_LEX *blt __attribute__((unused))= pop_select();
+ DBUG_ASSERT(blt == &builtin_select);
+ push_select(first_select);
+ return false;
+}
+
+
+bool LEX::parsed_TVC_start()
+{
+ SELECT_LEX *sel;
+ many_values.empty();
+ insert_list= 0;
+ if (!(sel= alloc_select(TRUE)) ||
+ push_select(sel))
+ return true;
+ sel->init_select();
+ sel->braces= FALSE; // just initialisation
+ return false;
+}
+
+
+SELECT_LEX *LEX::parsed_TVC_end()
+{
+
+ SELECT_LEX *res= pop_select(); // above TVC select
+ if (!(res->tvc=
+ new (thd->mem_root) table_value_constr(many_values,
+ res,
+ res->options)))
+ return NULL;
+ many_values.empty();
+ return res;
+}
+
+
+TABLE_LIST *LEX::parsed_derived_select(SELECT_LEX *sel, int for_system_time,
+ LEX_CSTRING *alias)
+{
+ TABLE_LIST *res;
+ derived_tables|= DERIVED_SUBQUERY;
+ sel->set_linkage(DERIVED_TABLE_TYPE);
+ sel->braces= FALSE;
+ // Add the subtree of subquery to the current SELECT_LEX
+ SELECT_LEX *curr_sel= select_stack_head();
+ DBUG_ASSERT(current_select == curr_sel);
+ SELECT_LEX_UNIT *unit= sel->master_unit();
+ if (!unit)
+ {
+ unit= create_unit(sel);
+ if (!unit)
+ return NULL;
+ }
+ curr_sel->register_unit(unit, &curr_sel->context);
+ curr_sel->add_statistics(unit);
+
+ Table_ident *ti= new (thd->mem_root) Table_ident(unit);
+ if (ti == NULL)
+ return NULL;
+ if (!(res= curr_sel->add_table_to_list(thd, ti, alias, 0,
+ TL_READ, MDL_SHARED_READ)))
+ return NULL;
+ if (for_system_time)
+ {
+ res->vers_conditions= vers_conditions;
+ }
+ return res;
+}
+
+TABLE_LIST *LEX::parsed_derived_unit(SELECT_LEX_UNIT *unit,
+ int for_system_time,
+ LEX_CSTRING *alias)
+{
+ TABLE_LIST *res;
+ derived_tables|= DERIVED_SUBQUERY;
+ unit->first_select()->set_linkage(DERIVED_TABLE_TYPE);
+
+ // Add the subtree of subquery to the current SELECT_LEX
+ SELECT_LEX *curr_sel= select_stack_head();
+ DBUG_ASSERT(current_select == curr_sel);
+ curr_sel->register_unit(unit, &curr_sel->context);
+ curr_sel->add_statistics(unit);
+
+ Table_ident *ti= new (thd->mem_root) Table_ident(unit);
+ if (ti == NULL)
+ return NULL;
+ if (!(res= curr_sel->add_table_to_list(thd, ti, alias, 0,
+ TL_READ, MDL_SHARED_READ)))
+ return NULL;
+ if (for_system_time)
+ {
+ res->vers_conditions= vers_conditions;
+ }
+ return res;
+}
+
+bool LEX::parsed_create_view(SELECT_LEX_UNIT *unit, int check)
+{
+ SQL_I_List<TABLE_LIST> *save= &first_select_lex()->table_list;
+ set_main_unit(unit);
+ if (check_main_unit_semantics())
+ return true;
+ first_select_lex()->table_list.push_front(save);
+ current_select= first_select_lex();
+ size_t len= thd->m_parser_state->m_lip.get_cpp_ptr() -
+ create_view->select.str;
+ void *create_view_select= thd->memdup(create_view->select.str, len);
+ create_view->select.length= len;
+ create_view->select.str= (char *) create_view_select;
+ size_t not_used;
+ trim_whitespace(thd->charset(),
+ &create_view->select, ¬_used);
+ create_view->check= check;
+ parsing_options.allows_variable= TRUE;
+ return false;
+}
+
+bool LEX::select_finalize(st_select_lex_unit *expr)
+{
+ sql_command= SQLCOM_SELECT;
+ selects_allow_into= TRUE;
+ selects_allow_procedure= TRUE;
+ set_main_unit(expr);
+ return check_main_unit_semantics();
+}
+
+
+/*
+ "IN" and "EXISTS" subselect can appear in two statement types:
+
+ 1. Statements that can have table columns, such as SELECT, DELETE, UPDATE
+ 2. Statements that cannot have table columns, e.g:
+ RETURN ((1) IN (SELECT * FROM t1))
+ IF ((1) IN (SELECT * FROM t1))
+
+ Statements of the first type call master_select_push() in the beginning.
+ In such case everything is properly linked.
+
+ Statements of the second type do not call mastr_select_push().
+ Here we catch the second case and relink thd->lex->builtin_select and
+ select_lex to properly point to each other.
+
+ QQ: Shouldn't subselects of other type also call relink_hack()?
+ QQ: Can we do it at constructor time instead?
+*/
+
+void LEX::relink_hack(st_select_lex *select_lex)
+{
+ if (!select_stack_top) // Statements of the second type
+ {
+ if (!select_lex->get_master()->get_master())
+ ((st_select_lex *) select_lex->get_master())->
+ set_master(&builtin_select);
+ if (!builtin_select.get_slave())
+ builtin_select.set_slave(select_lex->get_master());
+ }
+}
+
+
+
+bool SELECT_LEX_UNIT::set_lock_to_the_last_select(Lex_select_lock l)
+{
+ if (l.defined_lock)
+ {
+ SELECT_LEX *sel= first_select();
+ while (sel->next_select())
+ sel= sel->next_select();
+ if (sel->braces)
+ {
+ my_error(ER_WRONG_USAGE, MYF(0), "lock options",
+ "End SELECT expression");
+ return TRUE;
+ }
+ l.set_to(sel);
+ }
+ return FALSE;
+}
+
+/**
+ Generate unique name for generated derived table for this SELECT
+*/
+
+bool SELECT_LEX::make_unique_derived_name(THD *thd, LEX_CSTRING *alias)
+{
+ // uint32 digits + two underscores + trailing '\0'
+ char buff[MAX_INT_WIDTH + 2 + 1];
+ alias->length= my_snprintf(buff, sizeof(buff), "__%u", select_number);
+ alias->str= thd->strmake(buff, alias->length);
+ return !alias->str;
+}
+
+
+/*
+ Make a new sp_instr_stmt and set its m_query to a concatenation
+ of two strings.
+*/
+bool LEX::new_sp_instr_stmt(THD *thd,
+ const LEX_CSTRING &prefix,
+ const LEX_CSTRING &suffix)
+{
+ LEX_STRING qbuff;
+ sp_instr_stmt *i;
+
+ if (!(i= new (thd->mem_root) sp_instr_stmt(sphead->instructions(),
+ spcont, this)))
+ return true;
+
+ qbuff.length= prefix.length + suffix.length;
+ if (!(qbuff.str= (char*) alloc_root(thd->mem_root, qbuff.length + 1)))
+ return true;
+ memcpy(qbuff.str, prefix.str, prefix.length);
+ strmake(qbuff.str + prefix.length, suffix.str, suffix.length);
+ i->m_query= qbuff;
+ return sphead->add_instr(i);
+}
+
+
+bool LEX::sp_proc_stmt_statement_finalize_buf(THD *thd, const LEX_CSTRING &qbuf)
+{
+ sphead->m_flags|= sp_get_flags_for_command(this);
+ /* "USE db" doesn't work in a procedure */
+ if (unlikely(sql_command == SQLCOM_CHANGE_DB))
+ {
+ my_error(ER_SP_BADSTATEMENT, MYF(0), "USE");
+ return true;
+ }
+ /*
+ Don't add an instruction for SET statements, since all
+ instructions for them were already added during processing
+ of "set" rule.
+ */
+ DBUG_ASSERT(sql_command != SQLCOM_SET_OPTION || var_list.is_empty());
+ if (sql_command != SQLCOM_SET_OPTION)
+ return new_sp_instr_stmt(thd, empty_clex_str, qbuf);
+ return false;
+}
+
+
+bool LEX::sp_proc_stmt_statement_finalize(THD *thd, bool no_lookahead)
+{
+ // Extract the query statement from the tokenizer
+ Lex_input_stream *lip= &thd->m_parser_state->m_lip;
+ Lex_cstring qbuf(sphead->m_tmp_query, no_lookahead ? lip->get_ptr() :
+ lip->get_tok_start());
+ return LEX::sp_proc_stmt_statement_finalize_buf(thd, qbuf);
+}
+
+
+/**
+ @brief
+ Extract the condition that can be pushed into WHERE clause
+
+ @param thd the thread handle
+ @param cond the condition from which to extract a pushed condition
+ @param remaining_cond IN/OUT the condition that will remain of cond after
+ the extraction
+ @param transformer the transformer callback function to be
+ applied to the fields of the condition so it
+ can be pushed`
+ @param arg parameter to be passed to the transformer
+
+ @details
+ This function builds the most restrictive condition depending only on
+ the fields used in the GROUP BY of this SELECT. These fields were
+ collected before in grouping_tmp_fields list of this SELECT.
+
+ First this method checks if this SELECT doesn't have any aggregation
+ functions and has no GROUP BY clause. If so cond can be entirely pushed
+ into WHERE.
+
+ Otherwise the method checks if there is a condition depending only on
+ grouping fields that can be extracted from cond.
+
+ The condition that can be pushed into WHERE should be transformed.
+ It is done by transformer.
+
+ The extracted condition is saved in cond_pushed_into_where of this select.
+ cond can remain un empty after the extraction of the condition that can be
+ pushed into WHERE. It is saved in remaining_cond.
+
+ @note
+ This method is called for pushdown conditions into materialized
+ derived tables/views optimization.
+ Item::derived_field_transformer_for_where is passed as the actual
+ callback function.
+ Also it is called for pushdown into materialized IN subqueries.
+ Item::in_subq_field_transformer_for_where is passed as the actual
+ callback function.
+*/
+
+void st_select_lex::pushdown_cond_into_where_clause(THD *thd, Item *cond,
+ Item **remaining_cond,
+ Item_transformer transformer,
+ uchar *arg)
+{
+ if (!cond_pushdown_is_allowed())
+ return;
+ thd->lex->current_select= this;
+ if (have_window_funcs())
+ {
+ Item *cond_over_partition_fields;
+ check_cond_extraction_for_grouping_fields(thd, cond);
+ cond_over_partition_fields=
+ build_cond_for_grouping_fields(thd, cond, true);
+ if (cond_over_partition_fields)
+ cond_over_partition_fields= cond_over_partition_fields->transform(thd,
+ &Item::grouping_field_transformer_for_where,
+ (uchar*) this);
+ if (cond_over_partition_fields)
+ {
+ cond_over_partition_fields->walk(
+ &Item::cleanup_excluding_const_fields_processor, 0, 0);
+ cond_pushed_into_where= cond_over_partition_fields;
+ }
+
+ return;
+ }
+
+ if (!join->group_list && !with_sum_func)
+ {
+ cond=
+ cond->transform(thd, transformer, arg);
+ if (cond)
+ {
+ cond->walk(
+ &Item::cleanup_excluding_const_fields_processor, 0, 0);
+ cond_pushed_into_where= cond;
+ }
+
+ return;
+ }
+
+ /*
+ Figure out what can be extracted from cond and pushed into
+ the WHERE clause of this select.
+ */
+ Item *cond_over_grouping_fields;
+ check_cond_extraction_for_grouping_fields(thd, cond);
+ cond_over_grouping_fields=
+ build_cond_for_grouping_fields(thd, cond, true);
+
+ /*
+ Transform references to the columns of condition that can be pushed
+ into WHERE so it can be pushed.
+ */
+ if (cond_over_grouping_fields)
+ cond_over_grouping_fields= cond_over_grouping_fields->transform(thd,
+ &Item::grouping_field_transformer_for_where,
+ (uchar*) this);
+
+ if (cond_over_grouping_fields)
+ {
+
+ /*
+ Remove top conjuncts in cond that has been pushed into the WHERE
+ clause of this select
+ */
+ cond= remove_pushed_top_conjuncts(thd, cond);
+
+ cond_over_grouping_fields->walk(
+ &Item::cleanup_excluding_const_fields_processor, 0, 0);
+ cond_pushed_into_where= cond_over_grouping_fields;
+ }
+
+ *remaining_cond= cond;
+}
+
+
+/**
+ @brief
+ Mark OR-conditions as non-pushable to avoid repeatable pushdown
+
+ @param cond the processed condition
+
+ @details
+ Consider pushdown into the materialized derived table/view.
+ Consider OR condition that can be pushed into HAVING and some
+ parts of this OR condition that can be pushed into WHERE.
+
+ On example:
+
+ SELECT *
+ FROM t1,
+ (
+ SELECT a,MAX(c) AS m_c
+ GROUP BY a
+ ) AS dt
+ WHERE ((dt.m_c>10) AND (dt.a>2)) OR ((dt.m_c<7) and (dt.a<3)) AND
+ (t1.a=v1.a);
+
+
+ Here ((dt.m_c>10) AND (dt.a>2)) OR ((dt.m_c<7) and (dt.a<3)) or1
+ can be pushed down into the HAVING of the materialized
+ derived table dt.
+
+ (dt.a>2) OR (dt.a<3) part of or1 depends only on grouping fields
+ of dt and can be pushed into WHERE.
+
+ As a result:
+
+ SELECT *
+ FROM t1,
+ (
+ SELECT a,MAX(c) AS m_c
+ WHERE (dt.a>2) OR (dt.a<3)
+ GROUP BY a
+ HAVING ((dt.m_c>10) AND (dt.a>2)) OR ((dt.m_c<7) and (dt.a<3))
+ ) AS dt
+ WHERE ((dt.m_c>10) AND (dt.a>2)) OR ((dt.m_c<7) and (dt.a<3)) AND
+ (t1.a=v1.a);
+
+
+ Here (dt.a>2) OR (dt.a<3) also remains in HAVING of dt.
+ When SELECT that defines df is processed HAVING pushdown optimization
+ is made. In HAVING pushdown optimization it will extract
+ (dt.a>2) OR (dt.a<3) condition from or1 again and push it into WHERE.
+ This will cause duplicate conditions in WHERE of dt.
+
+ To avoid repeatable pushdown such OR conditions as or1 describen
+ above are marked with NO_EXTRACTION_FL.
+
+ @note
+ This method is called for pushdown into materialized
+ derived tables/views/IN subqueries optimization.
+*/
+
+void mark_or_conds_to_avoid_pushdown(Item *cond)
+{
+ if (cond->type() == Item::COND_ITEM &&
+ ((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
+ {
+ List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
+ Item *item;
+ while ((item=li++))
+ {
+ if (item->type() == Item::COND_ITEM &&
+ ((Item_cond*) item)->functype() == Item_func::COND_OR_FUNC)
+ item->set_extraction_flag(NO_EXTRACTION_FL);
+ }
+ }
+ else if (cond->type() == Item::COND_ITEM &&
+ ((Item_cond*) cond)->functype() == Item_func::COND_OR_FUNC)
+ cond->set_extraction_flag(NO_EXTRACTION_FL);
+}
+
+/**
+ @brief
+ Get condition that can be pushed from HAVING into WHERE
+
+ @param thd the thread handle
+ @param cond the condition from which to extract the condition
+
+ @details
+ The method collects in attach_to_conds list conditions from cond
+ that can be pushed from HAVING into WHERE.
+
+ Conditions that can be pushed were marked with FULL_EXTRACTION_FL in
+ check_cond_extraction_for_grouping_fields() method.
+ Conditions that can't be pushed were marked with NO_EXTRACTION_FL.
+ Conditions which parts can be pushed weren't marked.
+
+ There are two types of conditions that can be pushed:
+ 1. Condition that can be simply moved from HAVING
+ (if cond is marked with FULL_EXTRACTION_FL or
+ cond is an AND condition and some of its parts are marked with
+ FULL_EXTRACTION_FL)
+ In this case condition is transformed and pushed into attach_to_conds
+ list.
+ 2. Part of some other condition c1 that can't be entirely pushed
+ (if с1 isn't marked with any flag).
+
+ For example:
+
+ SELECT t1.a,MAX(t1.b),t1.c
+ FROM t1
+ GROUP BY t1.a
+ HAVING ((t1.a > 5) AND (t1.c < 3)) OR (t1.a = 3);
+
+ Here (t1.a > 5) OR (t1.a = 3) from HAVING can be pushed into WHERE.
+
+ In this case build_pushable_cond() is called for c1.
+ This method builds a clone of the c1 part that can be pushed.
+
+ Transformation mentioned above is made with multiple_equality_transformer
+ transformer. It transforms all multiple equalities in the extracted
+ condition into the set of equalities.
+
+ @note
+ Conditions that can be pushed are collected in attach_to_conds in this way:
+ 1. if cond is an AND condition its parts that can be pushed into WHERE
+ are added to attach_to_conds list separately.
+ 2. in all other cases conditions are pushed into the list entirely.
+
+ @retval
+ true - if an error occurs
+ false - otherwise
+*/
+
+bool
+st_select_lex::build_pushable_cond_for_having_pushdown(THD *thd, Item *cond)
+{
+ List<Item> equalities;
+
+ /* Condition can't be pushed */
+ if (cond->get_extraction_flag() == NO_EXTRACTION_FL)
+ return false;
+
+ /**
+ Condition can be pushed entirely.
+ Transform its multiple equalities and add to attach_to_conds list.
+ */
+ if (cond->get_extraction_flag() == FULL_EXTRACTION_FL)
+ {
+ Item *result= cond->transform(thd,
+ &Item::multiple_equality_transformer,
+ (uchar *)this);
+ if (!result)
+ return true;
+ if (result->type() == Item::COND_ITEM &&
+ ((Item_cond*) result)->functype() == Item_func::COND_AND_FUNC)
+ {
+ List_iterator<Item> li(*((Item_cond*) result)->argument_list());
+ Item *item;
+ while ((item=li++))
+ {
+ if (attach_to_conds.push_back(item, thd->mem_root))
+ return true;
+ }
+ }
+ else
+ {
+ if (attach_to_conds.push_back(result, thd->mem_root))
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ There is no flag set for this condition. It means that some
+ part of this condition can be pushed.
+ */
+ if (cond->type() != Item::COND_ITEM)
+ return false;
+ if (((Item_cond *)cond)->functype() != Item_cond::COND_AND_FUNC)
+ {
+ Item *fix= cond->build_pushable_cond(thd, 0, 0);
+ if (!fix)
+ return false;
+ if (attach_to_conds.push_back(fix, thd->mem_root))
+ return true;
+ }
+ else
+ {
+ List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
+ Item *item;
+ while ((item=li++))
+ {
+ if (item->get_extraction_flag() == NO_EXTRACTION_FL)
+ continue;
+ else if (item->get_extraction_flag() == FULL_EXTRACTION_FL)
+ {
+ Item *result= item->transform(thd,
+ &Item::multiple_equality_transformer,
+ (uchar *)item);
+
+ if (!result)
+ return true;
+ if (result->type() == Item::COND_ITEM &&
+ ((Item_cond*) result)->functype() == Item_func::COND_AND_FUNC)
+ {
+ List_iterator<Item> li(*((Item_cond*) result)->argument_list());
+ Item *item;
+ while ((item=li++))
+ {
+ if (attach_to_conds.push_back(item, thd->mem_root))
+ return true;
+ }
+ }
+ else
+ {
+ if (attach_to_conds.push_back(result, thd->mem_root))
+ return true;
+ }
+ }
+ else
+ {
+ Item *fix= item->build_pushable_cond(thd, 0, 0);
+ if (!fix)
+ continue;
+ if (attach_to_conds.push_back(fix, thd->mem_root))
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+
+/**
+ Check if item is equal to some field in Field_pair 'field_pair'
+ from 'pair_list' and return found 'field_pair' if it exists.
+*/
+
+Field_pair *get_corresponding_field_pair(Item *item,
+ List<Field_pair> pair_list)
+{
+ DBUG_ASSERT(item->type() == Item::FIELD_ITEM ||
+ (item->type() == Item::REF_ITEM &&
+ ((((Item_ref *) item)->ref_type() == Item_ref::VIEW_REF) ||
+ (((Item_ref *) item)->ref_type() == Item_ref::REF))));
+
+ List_iterator<Field_pair> it(pair_list);
+ Field_pair *field_pair;
+ Item_field *field_item= (Item_field *) (item->real_item());
+ while ((field_pair= it++))
+ {
+ if (field_item->field == field_pair->field)
+ return field_pair;
+ }
+ return NULL;
+}
+
+
+/**
+ @brief
+ Collect fields from multiple equalities which are equal to grouping
+
+ @param thd the thread handle
+
+ @details
+ This method checks if multiple equalities of the WHERE clause contain
+ fields from GROUP BY of this SELECT. If so all fields of such multiple
+ equalities are collected in grouping_tmp_fields list without repetitions.
+
+ @retval
+ true - if an error occurs
+ false - otherwise
+*/
+
+bool st_select_lex::collect_fields_equal_to_grouping(THD *thd)
+{
+ if (!join->cond_equal || join->cond_equal->is_empty())
+ return false;
+
+ List_iterator_fast<Item_equal> li(join->cond_equal->current_level);
+ Item_equal *item_equal;
+
+ while ((item_equal= li++))
+ {
+ Item_equal_fields_iterator it(*item_equal);
+ Item *item;
+ while ((item= it++))
+ {
+ if (get_corresponding_field_pair(item, grouping_tmp_fields))
+ break;
+ }
+ if (!item)
+ break;
+
+ it.rewind();
+ while ((item= it++))
+ {
+ if (get_corresponding_field_pair(item, grouping_tmp_fields))
+ continue;
+ Field_pair *grouping_tmp_field=
+ new Field_pair(((Item_field *)item->real_item())->field, item);
+ if (grouping_tmp_fields.push_back(grouping_tmp_field, thd->mem_root))
+ return true;
+ }
+ }
+ return false;
+}
+
+
+/**
+ @brief
+ Remove marked top conjuncts of HAVING for having pushdown
+
+ @param thd the thread handle
+ @param cond the condition which subformulas are to be removed
+
+ @details
+ This method removes from cond all subformulas that can be moved from HAVING
+ into WHERE.
+
+ @retval
+ condition without removed subformulas
+ 0 if the whole 'cond' is removed
+*/
+
+Item *remove_pushed_top_conjuncts_for_having(THD *thd, Item *cond)
+{
+ /* Nothing to extract */
+ if (cond->get_extraction_flag() == NO_EXTRACTION_FL)
+ {
+ cond->clear_extraction_flag();
+ return cond;
+ }
+ /* cond can be pushed in WHERE entirely */
+ if (cond->get_extraction_flag() == FULL_EXTRACTION_FL)
+ {
+ cond->clear_extraction_flag();
+ return 0;
+ }
+
+ /* Some parts of cond can be pushed */
+ if (cond->type() == Item::COND_ITEM &&
+ ((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
+ {
+ List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
+ Item *item;
+ while ((item=li++))
+ {
+ if (item->get_extraction_flag() == NO_EXTRACTION_FL)
+ item->clear_extraction_flag();
+ else if (item->get_extraction_flag() == FULL_EXTRACTION_FL)
+ {
+ if (item->type() == Item::FUNC_ITEM &&
+ ((Item_func*) item)->functype() == Item_func::MULT_EQUAL_FUNC)
+ item->set_extraction_flag(DELETION_FL);
+ else
+ {
+ item->clear_extraction_flag();
+ li.remove();
+ }
+ }
+ }
+ switch (((Item_cond*) cond)->argument_list()->elements)
+ {
+ case 0:
+ return 0;
+ case 1:
+ return (((Item_cond*) cond)->argument_list()->head());
+ default:
+ return cond;
+ }
+ }
+ return cond;
+}
+
+
+/**
+ @brief
+ Extract condition that can be pushed from HAVING into WHERE
+
+ @param thd the thread handle
+ @param having the HAVING clause of this select
+ @param having_equal multiple equalities of HAVING
+
+ @details
+ This method builds a set of conditions dependent only on
+ fields used in the GROUP BY of this select (directly or indirectly
+ through equalities). These conditions are extracted from the HAVING
+ clause of this select.
+ The method saves these conditions into attach_to_conds list and removes
+ from HAVING conditions that can be entirely pushed into WHERE.
+
+ Example of the HAVING pushdown transformation:
+
+ SELECT t1.a,MAX(t1.b)
+ FROM t1
+ GROUP BY t1.a
+ HAVING (t1.a>2) AND (MAX(c)>12);
+
+ =>
+
+ SELECT t1.a,MAX(t1.b)
+ FROM t1
+ WHERE (t1.a>2)
+ GROUP BY t1.a
+ HAVING (MAX(c)>12);
+
+ In this method (t1.a>2) is not attached to the WHERE clause.
+ It is pushed into the attach_to_conds list to be attached to
+ the WHERE clause later.
+
+ In details:
+ 1. Collect fields used in the GROUP BY grouping_fields of this SELECT
+ 2. Collect fields equal to grouping_fields from the WHERE clause
+ of this SELECT and add them to the grouping_fields list.
+ 3. Extract the most restrictive condition from the HAVING clause of this
+ select that depends only on the grouping fields (directly or indirectly
+ through equality).
+ If the extracted condition is an AND condition it is transformed into a
+ list of all its conjuncts saved in attach_to_conds. Otherwise,
+ the condition is put into attach_to_conds as the only its element.
+ 4. Remove conditions from HAVING clause that can be entirely pushed
+ into WHERE.
+ Multiple equalities are not removed but marked with DELETION_FL flag.
+ They will be deleted later in substitite_for_best_equal_field() called
+ for the HAVING condition.
+ 5. Unwrap fields wrapped in Item_ref wrappers contained in the condition
+ of attach_to_conds so the condition could be pushed into WHERE.
+
+ @note
+ This method is similar to st_select_lex::pushdown_cond_into_where_clause().
+
+ @retval TRUE if an error occurs
+ @retval FALSE otherwise
+*/
+
+Item *st_select_lex::pushdown_from_having_into_where(THD *thd, Item *having)
+{
+ if (!having || !group_list.first)
+ return having;
+ if (!cond_pushdown_is_allowed())
+ return having;
+
+ st_select_lex *save_curr_select= thd->lex->current_select;
+ thd->lex->current_select= this;
+
+ /*
+ 1. Collect fields used in the GROUP BY grouping fields of this SELECT
+ 2. Collect fields equal to grouping_fields from the WHERE clause
+ of this SELECT and add them to the grouping fields list.
+ */
+ if (collect_grouping_fields(thd) ||
+ collect_fields_equal_to_grouping(thd))
+ return having;
+
+ /*
+ 3. Extract the most restrictive condition from the HAVING clause of this
+ select that depends only on the grouping fields (directly or indirectly
+ through equality).
+ If the extracted condition is an AND condition it is transformed into a
+ list of all its conjuncts saved in attach_to_conds. Otherwise,
+ the condition is put into attach_to_conds as the only its element.
+ */
+ List_iterator_fast<Item> it(attach_to_conds);
+ Item *item;
+ check_cond_extraction_for_grouping_fields(thd, having);
+ if (build_pushable_cond_for_having_pushdown(thd, having))
+ {
+ attach_to_conds.empty();
+ goto exit;
+ }
+ if (!attach_to_conds.elements)
+ goto exit;
+
+ /*
+ 4. Remove conditions from HAVING clause that can be entirely pushed
+ into WHERE.
+ Multiple equalities are not removed but marked with DELETION_FL flag.
+ They will be deleted later in substitite_for_best_equal_field() called
+ for the HAVING condition.
+ */
+ having= remove_pushed_top_conjuncts_for_having(thd, having);
+
+ /*
+ Change join->cond_equal which points to the multiple equalities of
+ the top level of HAVING.
+ Removal of AND conditions may leave only one conjunct in HAVING.
+
+ Example 1:
+ SELECT *
+ FROM t1
+ GROUP BY t1.a
+ (t1.a < 2) AND (t1.b = 2)
+
+ (t1.a < 2) is pushed into WHERE.
+ join->cond_equal should point on (t1.b = 2) multiple equality now.
+
+ Example 2:
+ SELECT *
+ FROM t1
+ GROUP BY t1.a
+ (t1.a = 2) AND (t1.b < 2)
+
+ (t1.a = 2) is pushed into WHERE.
+ join->cond_equal should be NULL now.
+ */
+ if (having &&
+ having->type() == Item::FUNC_ITEM &&
+ ((Item_func*) having)->functype() == Item_func::MULT_EQUAL_FUNC)
+ join->having_equal= new (thd->mem_root) COND_EQUAL((Item_equal *)having,
+ thd->mem_root);
+ else if (!having ||
+ having->type() != Item::COND_ITEM ||
+ ((Item_cond *)having)->functype() != Item_cond::COND_AND_FUNC)
+ join->having_equal= 0;
+
+ /*
+ 5. Unwrap fields wrapped in Item_ref wrappers contained in the condition
+ of attach_to_conds so the condition could be pushed into WHERE.
+ */
+ it.rewind();
+ while ((item=it++))
+ {
+ item= item->transform(thd,
+ &Item::field_transformer_for_having_pushdown,
+ (uchar *)this);
+
+ if (item->walk(&Item:: cleanup_processor, 0, STOP_PTR) ||
+ item->fix_fields(thd, NULL))
+ {
+ attach_to_conds.empty();
+ goto exit;
+ }
+ }
+exit:
+ thd->lex->current_select= save_curr_select;
+ return having;
+}
+
+
+bool LEX::stmt_install_plugin(const DDL_options_st &opt,
+ const Lex_ident_sys_st &name,
+ const LEX_CSTRING &soname)
+{
+ create_info.init();
+ if (add_create_options_with_check(opt))
+ return true;
+ sql_command= SQLCOM_INSTALL_PLUGIN;
+ comment= name;
+ ident= soname;
+ return false;
+}
+
+
+void LEX::stmt_install_plugin(const LEX_CSTRING &soname)
+{
+ sql_command= SQLCOM_INSTALL_PLUGIN;
+ comment= null_clex_str;
+ ident= soname;
+}
+
+
+bool LEX::stmt_uninstall_plugin_by_name(const DDL_options_st &opt,
+ const Lex_ident_sys_st &name)
+{
+ check_opt.init();
+ if (add_create_options_with_check(opt))
+ return true;
+ sql_command= SQLCOM_UNINSTALL_PLUGIN;
+ comment= name;
+ ident= null_clex_str;
+ return false;
+}
+
+
+bool LEX::stmt_uninstall_plugin_by_soname(const DDL_options_st &opt,
+ const LEX_CSTRING &soname)
+{
+ check_opt.init();
+ if (add_create_options_with_check(opt))
+ return true;
+ sql_command= SQLCOM_UNINSTALL_PLUGIN;
+ comment= null_clex_str;
+ ident= soname;
+ return false;
+}
+
+
+bool LEX::stmt_prepare_validate(const char *stmt_type)
+{
+ if (unlikely(table_or_sp_used()))
+ {
+ my_error(ER_SUBQUERIES_NOT_SUPPORTED, MYF(0), stmt_type);
+ return true;
+ }
+ return check_main_unit_semantics();
+}
+
+
+bool LEX::stmt_prepare(const Lex_ident_sys_st &ident, Item *code)
+{
+ sql_command= SQLCOM_PREPARE;
+ if (stmt_prepare_validate("PREPARE..FROM"))
+ return true;
+ prepared_stmt.set(ident, code, NULL);
+ return false;
+}
+
+
+bool LEX::stmt_execute_immediate(Item *code, List<Item> *params)
+{
+ sql_command= SQLCOM_EXECUTE_IMMEDIATE;
+ if (stmt_prepare_validate("EXECUTE IMMEDIATE"))
+ return true;
+ static const Lex_ident_sys immediate(STRING_WITH_LEN("IMMEDIATE"));
+ prepared_stmt.set(immediate, code, params);
+ return false;
+}
+
+
+bool LEX::stmt_execute(const Lex_ident_sys_st &ident, List<Item> *params)
+{
+ sql_command= SQLCOM_EXECUTE;
+ prepared_stmt.set(ident, NULL, params);
+ return stmt_prepare_validate("EXECUTE..USING");
+}
+
+
+void LEX::stmt_deallocate_prepare(const Lex_ident_sys_st &ident)
+{
+ sql_command= SQLCOM_DEALLOCATE_PREPARE;
+ prepared_stmt.set(ident, NULL, NULL);
+}
+
+
+bool LEX::stmt_alter_table_exchange_partition(Table_ident *table)
+{
+ DBUG_ASSERT(sql_command == SQLCOM_ALTER_TABLE);
+ first_select_lex()->db= table->db;
+ if (first_select_lex()->db.str == NULL &&
+ copy_db_to(&first_select_lex()->db))
+ return true;
+ name= table->table;
+ alter_info.partition_flags|= ALTER_PARTITION_EXCHANGE;
+ if (!first_select_lex()->add_table_to_list(thd, table, NULL,
+ TL_OPTION_UPDATING,
+ TL_READ_NO_INSERT,
+ MDL_SHARED_NO_WRITE))
+ return true;
+ DBUG_ASSERT(!m_sql_cmd);
+ m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table_exchange_partition();
+ return m_sql_cmd == NULL;
+}
+
+
+void LEX::stmt_purge_to(const LEX_CSTRING &to)
+{
+ type= 0;
+ sql_command= SQLCOM_PURGE;
+ to_log= to.str;
+}
+
+
+bool LEX::stmt_purge_before(Item *item)
+{
+ type= 0;
+ sql_command= SQLCOM_PURGE_BEFORE;
+ value_list.empty();
+ value_list.push_front(item, thd->mem_root);
+ return check_main_unit_semantics();
+}
+
+
+bool LEX::stmt_create_udf_function(const DDL_options_st &options,
+ enum_sp_aggregate_type agg_type,
+ const Lex_ident_sys_st &name,
+ Item_result return_type,
+ const LEX_CSTRING &soname)
+{
+ if (stmt_create_function_start(options))
+ return true;
+
+ if (unlikely(is_native_function(thd, &name)))
+ {
+ my_error(ER_NATIVE_FCT_NAME_COLLISION, MYF(0), name.str);
+ return true;
+ }
+ sql_command= SQLCOM_CREATE_FUNCTION;
+ udf.name= name;
+ udf.returns= return_type;
+ udf.dl= soname.str;
+ udf.type= agg_type == GROUP_AGGREGATE ? UDFTYPE_AGGREGATE :
+ UDFTYPE_FUNCTION;
+ stmt_create_routine_finalize();
+ return false;
+}
+
+
+bool LEX::stmt_create_stored_function_start(const DDL_options_st &options,
+ enum_sp_aggregate_type agg_type,
+ const sp_name *spname)
+{
+ if (stmt_create_function_start(options) ||
+ unlikely(!make_sp_head_no_recursive(thd, spname,
+ &sp_handler_function, agg_type)))
+ return true;
+ return false;
+}
diff --cc sql/sql_lex.h
index 58c1dd3dfae,78a96305e3b..76e8b86d12d
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@@ -1347,7 -1229,13 +1353,7 @@@ public
TABLE_LIST *convert_right_join();
List<Item>* get_item_list();
ulong get_table_join_options();
- void set_lock_for_tables(thr_lock_type lock_type);
+ void set_lock_for_tables(thr_lock_type lock_type, bool for_update);
- inline void init_order()
- {
- order_list.elements= 0;
- order_list.first= 0;
- order_list.next= &order_list.first;
- }
/*
This method created for reiniting LEX in mysql_admin_table() and can be
used only if you are going remove all SELECT_LEX & units except belonger
diff --cc sql/sql_select.cc
index 823e3ed88bf,f36a68bc7ae..fac0b03cbbc
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@@ -1315,8 -1219,9 +1315,9 @@@ JOIN::prepare(TABLE_LIST *tables_init
item->max_length)))
real_order= TRUE;
- if (item->with_sum_func() && item->type() != Item::SUM_FUNC_ITEM)
- item->split_sum_func(thd, ref_ptrs, all_fields, 0);
- if ((item->with_sum_func && item->type() != Item::SUM_FUNC_ITEM) ||
++ if ((item->with_sum_func() && item->type() != Item::SUM_FUNC_ITEM) ||
+ item->with_window_func)
+ item->split_sum_func(thd, ref_ptrs, all_fields, SPLIT_SUM_SELECT);
}
if (!real_order)
order= NULL;
@@@ -17404,22 -16743,6 +17405,26 @@@ Field *Item::create_tmp_field_int(TABL
*this, table);
}
+Field *Item::tmp_table_field_from_field_type_maybe_null(TABLE *table,
+ Tmp_field_src *src,
+ const Tmp_field_param *param,
+ bool is_explicit_null)
+{
- DBUG_ASSERT(!param->make_copy_field());
++ /*
++ item->type() == CONST_ITEM excluded due to making fields for counter
++ With help of Item_uint
++ */
++ DBUG_ASSERT(!param->make_copy_field() || type() == CONST_ITEM);
+ DBUG_ASSERT(!is_result_field());
+ Field *result;
+ if ((result= tmp_table_field_from_field_type(table)))
+ {
+ if (result && is_explicit_null)
+ result->is_created_from_null_item= true;
+ }
+ return result;
+}
+
Field *Item_sum::create_tmp_field(bool group, TABLE *table)
{
@@@ -23859,6 -23216,10 +23864,10 @@@ int setup_order(THD *thd, Ref_ptr_arra
my_error(ER_WINDOW_FUNCTION_IN_WINDOW_SPEC, MYF(0));
return 1;
}
- if (from_window_spec && (*order->item)->with_sum_func &&
++ if (from_window_spec && (*order->item)->with_sum_func() &&
+ (*order->item)->type() != Item::SUM_FUNC_ITEM)
+ (*order->item)->split_sum_func(thd, ref_pointer_array,
+ all_fields, SPLIT_SUM_SELECT);
}
return 0;
}
@@@ -23926,6 -23287,10 +23935,10 @@@ setup_group(THD *thd, Ref_ptr_array ref
my_error(ER_WINDOW_FUNCTION_IN_WINDOW_SPEC, MYF(0));
return 1;
}
- if (from_window_spec && (*ord->item)->with_sum_func &&
++ if (from_window_spec && (*ord->item)->with_sum_func() &&
+ (*ord->item)->type() != Item::SUM_FUNC_ITEM)
+ (*ord->item)->split_sum_func(thd, ref_pointer_array,
+ all_fields, SPLIT_SUM_SELECT);
}
if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY &&
context_analysis_place == IN_GROUP_BY)
diff --cc sql/sql_string.cc
index 45af08f8966,0cc653c29a9..410f52a8c74
--- a/sql/sql_string.cc
+++ b/sql/sql_string.cc
@@@ -941,7 -996,28 +941,28 @@@ String *copy_if_not_alloced(String *to,
(void) from->realloc(from_length);
return from;
}
+ if (from->uses_buffer_owned_by(to))
+ {
- DBUG_ASSERT(!from->alloced);
- DBUG_ASSERT(to->alloced);
++ DBUG_ASSERT(!from->is_alloced());
++ DBUG_ASSERT(to->is_alloced());
+ /*
+ "from" is a constant string pointing to a fragment of alloced string "to":
+ to= xxxFFFyyy
+ - FFF is the part of "to" pointed by "from"
+ - xxx is the part of "to" before "from"
+ - yyy is the part of "to" after "from"
+ */
+ uint32 xxx_length= (uint32) (from->ptr() - to->ptr());
+ uint32 yyy_length= (uint32) (to->end() - from->end());
+ DBUG_ASSERT(to->length() >= yyy_length);
+ to->length(to->length() - yyy_length); // Remove the "yyy" part
+ DBUG_ASSERT(to->length() >= xxx_length);
+ to->replace(0, xxx_length, "", 0); // Remove the "xxx" part
+ to->realloc(from_length);
- to->str_charset= from->str_charset;
++ to->set_charset(from->charset());
+ return to;
+ }
- if (to->realloc(from_length))
+ if (to->alloc(from_length))
return from; // Actually an error
if ((to->str_length=MY_MIN(from->str_length,from_length)))
memcpy(to->Ptr,from->Ptr,to->str_length);
diff --cc sql/sql_table.cc
index 28c67f0e59a,ad86cdf8514..df5dea0bfad
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@@ -10032,13 -9858,13 +10078,14 @@@ do_continue:
/* Mark that we have created table in storage engine. */
no_ha_table= false;
+ DEBUG_SYNC(thd, "alter_table_intermediate_table_created");
- new_table=
- thd->create_and_open_tmp_table(new_db_type, &frm, alter_ctx.get_tmp_path(),
- alter_ctx.new_db.str,
- alter_ctx.new_name.str,
- true, true);
+ /* Open the table since we need to copy the data. */
+ new_table= thd->create_and_open_tmp_table(&frm,
+ alter_ctx.get_tmp_path(),
+ alter_ctx.new_db.str,
+ alter_ctx.new_name.str,
+ true);
if (!new_table)
goto err_new_table_cleanup;
diff --cc sql/sql_tvc.cc
index f16d34e8041,c9b55fe210e..ef8e15df838
--- a/sql/sql_tvc.cc
+++ b/sql/sql_tvc.cc
@@@ -262,6 -263,35 +262,35 @@@ bool table_value_constr::prepare(THD *t
if (result && result->prepare(sl->item_list, unit_arg))
DBUG_RETURN(true);
+ /*
+ setup_order() for a TVC is not called when the following is true
+ (thd->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW)
+ */
+
+ thd->where="order clause";
+ ORDER *order= sl->order_list.first;
+ for (; order; order=order->next)
+ {
+ Item *order_item= *order->item;
- if (order_item->type() == Item::INT_ITEM && order_item->basic_const_item())
++ if (order_item->is_order_clause_position())
+ {
+ uint count= 0;
+ if (order->counter_used)
+ count= order->counter; // counter was once resolved
+ else
+ count= (uint) order_item->val_int();
+ if (!count || count > first_elem->elements)
+ {
+ my_error(ER_BAD_FIELD_ERROR, MYF(0),
+ order_item->full_name(), thd->where);
+ DBUG_RETURN(true);
+ }
+ order->in_field_list= 1;
+ order->counter= count;
+ order->counter_used= 1;
+ }
+ }
+
select_lex->in_tvc= false;
DBUG_RETURN(false);
}
@@@ -561,11 -643,11 +642,11 @@@ st_select_lex *wrap_tvc(THD *thd, st_se
mysql_init_select(lex);
/* Create item list as '*' for the subquery SQ */
Item *item;
- SELECT_LEX *sq_select; // select for IN subquery;
- sq_select= lex->current_select;
- sq_select->set_linkage(tvc_sl->get_linkage());
- sq_select->parsing_place= SELECT_LIST;
- item= new (thd->mem_root) Item_field(thd, &sq_select->context,
+ SELECT_LEX *wrapper_sl;
+ wrapper_sl= lex->current_select;
- wrapper_sl->linkage= tvc_sl->linkage;
++ wrapper_sl->set_linkage(tvc_sl->get_linkage());
+ wrapper_sl->parsing_place= SELECT_LIST;
+ item= new (thd->mem_root) Item_field(thd, &wrapper_sl->context,
NULL, NULL, &star_clex_str);
if (item == NULL || add_item_to_list(thd, item))
goto err;
@@@ -582,9 -664,9 +663,9 @@@
goto err;
tvc_select= lex->current_select;
derived_unit= tvc_select->master_unit();
- tvc_select->linkage= DERIVED_TABLE_TYPE;
+ tvc_select->set_linkage(DERIVED_TABLE_TYPE);
- lex->current_select= sq_select;
+ lex->current_select= wrapper_sl;
/*
Create the name of the wrapping derived table and
diff --cc sql/sql_type.cc
index 5a6b7876a1c,d07296aad7e..fc33b6d1427
--- a/sql/sql_type.cc
+++ b/sql/sql_type.cc
@@@ -134,20 -125,38 +134,46 @@@ bool Type_handler_data::init(
Type_handler_data *type_handler_data= NULL;
+ bool Float::to_string(String *val_buffer, uint dec) const
+ {
+ uint to_length= 70;
+ if (val_buffer->alloc(to_length))
+ return true;
+
+ char *to=(char*) val_buffer->ptr();
+ size_t len;
+
+ if (dec >= FLOATING_POINT_DECIMALS)
+ len= my_gcvt(m_value, MY_GCVT_ARG_FLOAT, to_length - 1, to, NULL);
+ else
+ {
+ /*
+ We are safe here because the buffer length is 70, and
+ fabs(float) < 10^39, dec < FLOATING_POINT_DECIMALS. So the resulting string
+ will be not longer than 69 chars + terminating '\0'.
+ */
+ len= my_fcvt(m_value, (int) dec, to, NULL);
+ }
+ val_buffer->length((uint) len);
+ val_buffer->set_charset(&my_charset_numeric);
+ return false;
+ }
+
+
-void Time::make_from_item(Item *item, const Options opt)
+String_ptr::String_ptr(Item *item, String *buffer)
+ :m_string_ptr(item->val_str(buffer))
+{ }
+
+
+Ascii_ptr::Ascii_ptr(Item *item, String *buffer)
+ :String_ptr(item->val_str_ascii(buffer))
+{ }
+
+
+void VDec::set(Item *item)
{
- if (item->get_date(this, opt.get_date_flags()))
- time_type= MYSQL_TIMESTAMP_NONE;
- else
- valid_MYSQL_TIME_to_valid_value(opt);
+ m_ptr= item->val_decimal(&m_buffer);
+ DBUG_ASSERT((m_ptr == NULL) == item->null_value);
}
@@@ -3519,273 -1808,272 +3545,279 @@@ void Type_handler_decimal_result::Item_
}
-/*************************************************************************/
-
-bool Type_handler::
- Column_definition_prepare_stage2_legacy(Column_definition *def,
- enum_field_types type) const
-{
- def->pack_flag= f_settype((uint) type);
- return false;
-}
-
-bool Type_handler::
- Column_definition_prepare_stage2_legacy_num(Column_definition *def,
- enum_field_types type) const
+void Type_handler_int_result::Item_update_null_value(Item *item) const
{
- def->pack_flag= def->pack_flag_numeric(def->decimals) |
- f_settype((uint) type);
- return false;
+ (void) item->val_int();
}
-bool Type_handler::
- Column_definition_prepare_stage2_legacy_real(Column_definition *def,
- enum_field_types type) const
-{
- uint dec= def->decimals;
- /*
- User specified FLOAT() or DOUBLE() without precision. Change to
- FLOATING_POINT_DECIMALS to keep things compatible with earlier MariaDB
- versions.
- */
- if (dec >= FLOATING_POINT_DECIMALS)
- dec= FLOATING_POINT_DECIMALS;
- def->pack_flag= def->pack_flag_numeric(dec) | f_settype((uint) type);
- return false;
-}
-bool Type_handler_newdecimal::
- Column_definition_prepare_stage2(Column_definition *def,
- handler *file,
- ulonglong table_flags) const
+void Type_handler_bool::Item_update_null_value(Item *item) const
{
- def->pack_flag= def->pack_flag_numeric(def->decimals);
- return false;
+ (void) item->val_bool();
}
-bool Type_handler_blob_common::
- Column_definition_prepare_stage2(Column_definition *def,
- handler *file,
- ulonglong table_flags) const
-{
- return def->prepare_stage2_blob(file, table_flags, FIELDFLAG_BLOB);
-}
-#ifdef HAVE_SPATIAL
-bool Type_handler_geometry::
- Column_definition_prepare_stage2(Column_definition *def,
- handler *file,
- ulonglong table_flags) const
-{
- if (!(table_flags & HA_CAN_GEOMETRY))
- {
- my_error(ER_CHECK_NOT_IMPLEMENTED, MYF(0), "GEOMETRY");
- return true;
- }
- return def->prepare_stage2_blob(file, table_flags, FIELDFLAG_GEOM);
-}
-#endif
+/*************************************************************************/
-bool Type_handler_varchar::
- Column_definition_prepare_stage2(Column_definition *def,
- handler *file,
- ulonglong table_flags) const
+int Type_handler_time_common::Item_save_in_field(Item *item, Field *field,
+ bool no_conversions) const
{
- return def->prepare_stage2_varchar(table_flags);
+ return item->save_time_in_field(field, no_conversions);
}
-bool Type_handler_string::
- Column_definition_prepare_stage2(Column_definition *def,
- handler *file,
- ulonglong table_flags) const
+int Type_handler_temporal_with_date::Item_save_in_field(Item *item,
+ Field *field,
+ bool no_conversions)
+ const
{
- def->pack_flag= (def->charset->state & MY_CS_BINSORT) ? FIELDFLAG_BINARY : 0;
- return false;
+ return item->save_date_in_field(field, no_conversions);
}
-bool Type_handler_enum::
- Column_definition_prepare_stage2(Column_definition *def,
- handler *file,
- ulonglong table_flags) const
+
+int Type_handler_timestamp_common::Item_save_in_field(Item *item,
+ Field *field,
+ bool no_conversions)
+ const
{
- uint dummy;
- return def->prepare_stage2_typelib("ENUM", FIELDFLAG_INTERVAL, &dummy);
+ Timestamp_or_zero_datetime_native_null tmp(field->table->in_use, item, true);
+ if (tmp.is_null())
+ return set_field_to_null_with_conversions(field, no_conversions);
+ return tmp.save_in_field(field, item->decimals);
}
-bool Type_handler_set::
- Column_definition_prepare_stage2(Column_definition *def,
- handler *file,
- ulonglong table_flags) const
+
+int Type_handler_string_result::Item_save_in_field(Item *item, Field *field,
+ bool no_conversions) const
{
- uint dup_count;
- if (def->prepare_stage2_typelib("SET", FIELDFLAG_BITFIELD, &dup_count))
- return true;
- /* Check that count of unique members is not more then 64 */
- if (def->interval->count - dup_count > sizeof(longlong)*8)
- {
- my_error(ER_TOO_BIG_SET, MYF(0), def->field_name.str);
- return true;
- }
- return false;
+ return item->save_str_in_field(field, no_conversions);
}
-bool Type_handler_bit::
- Column_definition_prepare_stage2(Column_definition *def,
- handler *file,
- ulonglong table_flags) const
+
+int Type_handler_real_result::Item_save_in_field(Item *item, Field *field,
+ bool no_conversions) const
{
- /*
- We have sql_field->pack_flag already set here, see
- mysql_prepare_create_table().
- */
- return false;
+ return item->save_real_in_field(field, no_conversions);
}
-/*************************************************************************/
-uint32 Type_handler_time::calc_pack_length(uint32 length) const
+int Type_handler_decimal_result::Item_save_in_field(Item *item, Field *field,
+ bool no_conversions) const
{
- return length > MIN_TIME_WIDTH ?
- hires_bytes(length - 1 - MIN_TIME_WIDTH) : 3;
+ return item->save_decimal_in_field(field, no_conversions);
}
-uint32 Type_handler_time2::calc_pack_length(uint32 length) const
+
+int Type_handler_int_result::Item_save_in_field(Item *item, Field *field,
+ bool no_conversions) const
{
- return length > MIN_TIME_WIDTH ?
- my_time_binary_length(length - MIN_TIME_WIDTH - 1) : 3;
+ return item->save_int_in_field(field, no_conversions);
}
-uint32 Type_handler_timestamp::calc_pack_length(uint32 length) const
+
+/***********************************************************************/
+
+bool Type_handler_row::set_comparator_func(Arg_comparator *cmp) const
{
- return length > MAX_DATETIME_WIDTH ?
- 4 + sec_part_bytes(length - 1 - MAX_DATETIME_WIDTH) : 4;
+ return cmp->set_cmp_func_row();
}
-uint32 Type_handler_timestamp2::calc_pack_length(uint32 length) const
+bool Type_handler_int_result::set_comparator_func(Arg_comparator *cmp) const
{
- return length > MAX_DATETIME_WIDTH ?
- my_timestamp_binary_length(length - MAX_DATETIME_WIDTH - 1) : 4;
+ return cmp->set_cmp_func_int();
}
-uint32 Type_handler_datetime::calc_pack_length(uint32 length) const
+bool Type_handler_real_result::set_comparator_func(Arg_comparator *cmp) const
{
- return length > MAX_DATETIME_WIDTH ?
- hires_bytes(length - 1 - MAX_DATETIME_WIDTH) : 8;
+ return cmp->set_cmp_func_real();
}
-uint32 Type_handler_datetime2::calc_pack_length(uint32 length) const
+bool Type_handler_decimal_result::set_comparator_func(Arg_comparator *cmp) const
{
- return length > MAX_DATETIME_WIDTH ?
- my_datetime_binary_length(length - MAX_DATETIME_WIDTH - 1) : 5;
+ return cmp->set_cmp_func_decimal();
}
-uint32 Type_handler_tiny_blob::calc_pack_length(uint32 length) const
+bool Type_handler_string_result::set_comparator_func(Arg_comparator *cmp) const
{
- return 1 + portable_sizeof_char_ptr;
+ return cmp->set_cmp_func_string();
}
-uint32 Type_handler_blob::calc_pack_length(uint32 length) const
+bool Type_handler_time_common::set_comparator_func(Arg_comparator *cmp) const
{
- return 2 + portable_sizeof_char_ptr;
+ return cmp->set_cmp_func_time();
}
-uint32 Type_handler_medium_blob::calc_pack_length(uint32 length) const
+bool
+Type_handler_temporal_with_date::set_comparator_func(Arg_comparator *cmp) const
{
- return 3 + portable_sizeof_char_ptr;
+ return cmp->set_cmp_func_datetime();
}
-uint32 Type_handler_long_blob::calc_pack_length(uint32 length) const
+bool
+Type_handler_timestamp_common::set_comparator_func(Arg_comparator *cmp) const
{
- return 4 + portable_sizeof_char_ptr;
+ return cmp->set_cmp_func_native();
}
-#ifdef HAVE_SPATIAL
-uint32 Type_handler_geometry::calc_pack_length(uint32 length) const
+
+/*************************************************************************/
+
+bool Type_handler_temporal_result::
+ can_change_cond_ref_to_const(Item_bool_func2 *target,
+ Item *target_expr, Item *target_value,
+ Item_bool_func2 *source,
+ Item *source_expr, Item *source_const)
+ const
{
- return 4 + portable_sizeof_char_ptr;
+ if (source->compare_type_handler()->cmp_type() != TIME_RESULT)
+ return false;
+
+ /*
+ Can't rewrite:
+ WHERE COALESCE(time_column)='00:00:00'
+ AND COALESCE(time_column)=DATE'2015-09-11'
+ to
+ WHERE DATE'2015-09-11'='00:00:00'
+ AND COALESCE(time_column)=DATE'2015-09-11'
+ because the left part will erroneously try to parse '00:00:00'
+ as DATE, not as TIME.
+
+ TODO: It could still be rewritten to:
+ WHERE DATE'2015-09-11'=TIME'00:00:00'
+ AND COALESCE(time_column)=DATE'2015-09-11'
+ i.e. we need to replace both target_expr and target_value
+ at the same time. This is not supported yet.
+ */
+ return target_value->cmp_type() == TIME_RESULT;
}
-#endif
-uint32 Type_handler_newdecimal::calc_pack_length(uint32 length) const
+
+bool Type_handler_string_result::
+ can_change_cond_ref_to_const(Item_bool_func2 *target,
+ Item *target_expr, Item *target_value,
+ Item_bool_func2 *source,
+ Item *source_expr, Item *source_const)
+ const
{
- abort(); // This shouldn't happen
- return 0;
+ if (source->compare_type_handler()->cmp_type() != STRING_RESULT)
+ return false;
+ /*
+ In this example:
+ SET NAMES utf8 COLLATE utf8_german2_ci;
+ DROP TABLE IF EXISTS t1;
+ CREATE TABLE t1 (a CHAR(10) CHARACTER SET utf8);
+ INSERT INTO t1 VALUES ('o-umlaut'),('oe');
+ SELECT * FROM t1 WHERE a='oe' COLLATE utf8_german2_ci AND a='oe';
+
+ the query should return only the row with 'oe'.
+ It should not return 'o-umlaut', because 'o-umlaut' does not match
+ the right part of the condition: a='oe'
+ ('o-umlaut' is not equal to 'oe' in utf8_general_ci,
+ which is the collation of the field "a").
+
+ If we change the right part from:
+ ... AND a='oe'
+ to
+ ... AND 'oe' COLLATE utf8_german2_ci='oe'
+ it will be evalulated to TRUE and removed from the condition,
+ so the overall query will be simplified to:
+
+ SELECT * FROM t1 WHERE a='oe' COLLATE utf8_german2_ci;
+
+ which will erroneously start to return both 'oe' and 'o-umlaut'.
+ So changing "expr" to "const" is not possible if the effective
+ collations of "target" and "source" are not exactly the same.
+
+ Note, the code before the fix for MDEV-7152 only checked that
+ collations of "source_const" and "target_value" are the same.
+ This was not enough, as the bug report demonstrated.
+ */
+ return
+ target->compare_collation() == source->compare_collation() &&
+ target_value->collation.collation == source_const->collation.collation;
}
-uint32 Type_handler_set::calc_pack_length(uint32 length) const
+
+bool Type_handler_numeric::
+ can_change_cond_ref_to_const(Item_bool_func2 *target,
+ Item *target_expr, Item *target_value,
+ Item_bool_func2 *source,
+ Item *source_expr, Item *source_const)
+ const
{
- abort(); // This shouldn't happen
- return 0;
+ /*
+ The collations of "target" and "source" do not make sense for numeric
+ data types.
+ */
+ return target->compare_type_handler() == source->compare_type_handler();
}
-uint32 Type_handler_enum::calc_pack_length(uint32 length) const
+
+/*************************************************************************/
+
+Item_cache *
+Type_handler_row::Item_get_cache(THD *thd, const Item *item) const
{
- abort(); // This shouldn't happen
- return 0;
+ return new (thd->mem_root) Item_cache_row(thd);
}
+Item_cache *
+Type_handler_int_result::Item_get_cache(THD *thd, const Item *item) const
+{
+ return new (thd->mem_root) Item_cache_int(thd, item->type_handler());
+}
-/*************************************************************************/
-Field *Type_handler::make_and_init_table_field(const LEX_CSTRING *name,
- const Record_addr &addr,
- const Type_all_attributes &attr,
- TABLE *table) const
+Item_cache *
+Type_handler_year::Item_get_cache(THD *thd, const Item *item) const
{
- Field *field= make_table_field(name, addr, attr, table);
- if (field)
- field->init(table);
- return field;
+ return new (thd->mem_root) Item_cache_year(thd, item->type_handler());
}
+Item_cache *
- Type_handler_real_result::Item_get_cache(THD *thd, const Item *item) const
++Type_handler_double::Item_get_cache(THD *thd, const Item *item) const
+{
- return new (thd->mem_root) Item_cache_real(thd);
++ return new (thd->mem_root) Item_cache_double(thd);
++}
+
-Field *Type_handler_tiny::make_table_field(const LEX_CSTRING *name,
- const Record_addr &addr,
- const Type_all_attributes &attr,
- TABLE *table) const
++Item_cache *
++Type_handler_float::Item_get_cache(THD *thd, const Item *item) const
+ {
- return new (table->in_use->mem_root)
- Field_tiny(addr.ptr, attr.max_char_length(),
- addr.null_ptr, addr.null_bit,
- Field::NONE, name, 0/*zerofill*/, attr.unsigned_flag);
++ return new (thd->mem_root) Item_cache_float(thd);
}
+Item_cache *
+Type_handler_decimal_result::Item_get_cache(THD *thd, const Item *item) const
+{
+ return new (thd->mem_root) Item_cache_decimal(thd);
+}
-Field *Type_handler_short::make_table_field(const LEX_CSTRING *name,
- const Record_addr &addr,
- const Type_all_attributes &attr,
- TABLE *table) const
+Item_cache *
+Type_handler_string_result::Item_get_cache(THD *thd, const Item *item) const
+{
+ return new (thd->mem_root) Item_cache_str(thd, item);
+}
+Item_cache *
+Type_handler_timestamp_common::Item_get_cache(THD *thd, const Item *item) const
{
- return new (table->in_use->mem_root)
- Field_short(addr.ptr, attr.max_char_length(),
- addr.null_ptr, addr.null_bit,
- Field::NONE, name, 0/*zerofill*/, attr.unsigned_flag);
+ return new (thd->mem_root) Item_cache_timestamp(thd);
}
-
-Field *Type_handler_int24::make_table_field(const LEX_CSTRING *name,
- const Record_addr &addr,
- const Type_all_attributes &attr,
- TABLE *table) const
+Item_cache *
+Type_handler_datetime_common::Item_get_cache(THD *thd, const Item *item) const
{
- return new (table->in_use->mem_root)
- Field_medium(addr.ptr, attr.max_char_length(),
- addr.null_ptr, addr.null_bit,
- Field::NONE, name,
- 0/*zerofill*/, attr.unsigned_flag);
+ return new (thd->mem_root) Item_cache_datetime(thd);
}
+Item_cache *
+Type_handler_time_common::Item_get_cache(THD *thd, const Item *item) const
+{
+ return new (thd->mem_root) Item_cache_time(thd);
+}
-Field *Type_handler_long::make_table_field(const LEX_CSTRING *name,
- const Record_addr &addr,
- const Type_all_attributes &attr,
- TABLE *table) const
+Item_cache *
+Type_handler_date_common::Item_get_cache(THD *thd, const Item *item) const
{
- return new (table->in_use->mem_root)
- Field_long(addr.ptr, attr.max_char_length(),
- addr.null_ptr, addr.null_bit,
- Field::NONE, name, 0/*zerofill*/, attr.unsigned_flag);
+ return new (thd->mem_root) Item_cache_date(thd);
}
@@@ -4706,53 -2915,144 +4738,64 @@@ Type_handler_int_result::Item_func_hybr
}
-bool Type_handler_timestamp_common::
- Item_hybrid_func_fix_attributes(THD *thd,
- const char *func_name,
- Type_handler_hybrid_field_type *handler,
- Type_all_attributes *func,
- Item **items, uint nitems) const
+my_decimal *
+Type_handler_int_result::Item_func_hybrid_field_type_val_decimal(
+ Item_func_hybrid_field_type *item,
+ my_decimal *dec) const
{
- func->aggregate_attributes_temporal(MAX_DATETIME_WIDTH, items, nitems);
- return false;
+ return item->val_decimal_from_int_op(dec);
}
-#ifdef HAVE_SPATIAL
-bool Type_handler_geometry::
- Item_hybrid_func_fix_attributes(THD *thd,
- const char *func_name,
- Type_handler_hybrid_field_type *handler,
- Type_all_attributes *func,
- Item **items, uint nitems) const
+
+void
+Type_handler_int_result::Item_func_hybrid_field_type_get_date(
+ THD *thd,
+ Item_func_hybrid_field_type *item,
+ Temporal::Warn *warn,
+ MYSQL_TIME *to,
+ date_mode_t mode) const
{
- DBUG_ASSERT(nitems > 0);
- Type_geometry_attributes gattr(items[0]->type_handler(), items[0]);
- for (uint i= 1; i < nitems; i++)
- gattr.join(items[i]);
- func->set_geometry_type(gattr.get_geometry_type());
- func->collation.set(&my_charset_bin);
- func->unsigned_flag= false;
- func->decimals= 0;
- func->max_length= (uint32) UINT_MAX32;
- func->set_maybe_null(true);
- return false;
+ new(to) Temporal_hybrid(thd, warn, item->to_longlong_hybrid_null_op(), mode);
}
-#endif
-/*************************************************************************/
+/***************************************************************************/
-bool Type_handler::
- Item_func_min_max_fix_attributes(THD *thd, Item_func_min_max *func,
- Item **items, uint nitems) const
+String *
- Type_handler_real_result::Item_func_hybrid_field_type_val_str(
++Type_handler_double::Item_func_hybrid_field_type_val_str(
+ Item_func_hybrid_field_type *item,
+ String *str) const
{
- /*
- Aggregating attributes for LEAST/GREATES is exactly the same
- with aggregating for CASE-alike functions (e.g. COALESCE)
- for the majority of data type handlers.
- */
- return Item_hybrid_func_fix_attributes(thd, func->func_name(),
- func, func, items, nitems);
+ return item->val_str_from_real_op(str);
}
-
-bool Type_handler_temporal_result::
- Item_func_min_max_fix_attributes(THD *thd, Item_func_min_max *func,
- Item **items, uint nitems) const
++String *
++Type_handler_float::Item_func_hybrid_field_type_val_str(
++ Item_func_hybrid_field_type *item,
++ String *str) const
+ {
- bool rc= Type_handler::Item_func_min_max_fix_attributes(thd, func,
- items, nitems);
- if (rc || func->maybe_null)
- return rc;
- /*
- LEAST/GREATES(non-temporal, temporal) can return NULL.
- CAST functions Item_{time|datetime|date}_typecast always set maybe_full
- to true. Here we try to detect nullability more thoroughly.
- Perhaps CAST functions should also reuse this idea eventually.
- */
- const Type_handler *hf= func->type_handler();
- for (uint i= 0; i < nitems; i++)
- {
- /*
- If items[i] does not need conversion to the current temporal data
- type, then we trust items[i]->maybe_null, which was already ORred
- to func->maybe_null in the argument loop in fix_fields().
- If items[i] requires conversion to the current temporal data type,
- then conversion can fail and return NULL even for NOT NULL items.
- */
- const Type_handler *ha= items[i]->type_handler();
- if (hf == ha)
- continue; // No conversion.
- if (ha->cmp_type() != TIME_RESULT)
- {
- func->maybe_null= true; // Conversion from non-temporal is not safe
- break;
- }
- timestamp_type tf= hf->mysql_timestamp_type();
- timestamp_type ta= ha->mysql_timestamp_type();
- if (tf == ta ||
- (tf == MYSQL_TIMESTAMP_DATETIME && ta == MYSQL_TIMESTAMP_DATE))
- {
- /*
- If handlers have the same mysql_timestamp_type(),
- then conversion is NULL safe. Conversion from DATE to DATETIME
- is also safe. This branch includes data type pairs:
- Function return type Argument type Comment
- -------------------- ------------- -------------
- TIMESTAMP TIMESTAMP no conversion
- TIMESTAMP DATETIME not possible
- TIMESTAMP DATE not possible
- DATETIME DATETIME no conversion
- DATETIME TIMESTAMP safe conversion
- DATETIME DATE safe conversion
- DATE DATE no conversion
- TIME TIME no conversion
++ Float nr(item->real_op());
++ if (item->null_value)
++ return 0;
++ nr.to_string(str, item->decimals);
++ return str;
++}
- Note, a function cannot return TIMESTAMP if it has non-TIMESTAMP
- arguments (it would return DATETIME in such case).
- */
- DBUG_ASSERT(hf->field_type() != MYSQL_TYPE_TIMESTAMP || tf == ta);
- continue;
- }
- /*
- Here we have the following data type pairs that did not match
- the condition above:
+double
+Type_handler_real_result::Item_func_hybrid_field_type_val_real(
+ Item_func_hybrid_field_type *item)
+ const
+{
+ return item->val_real_from_real_op();
+}
- Function return type Argument type Comment
- -------------------- ------------- -------
- TIMESTAMP TIME Not possible
- DATETIME TIME depends on OLD_MODE_ZERO_DATE_TIME_CAST
- DATE TIMESTAMP Not possible
- DATE DATETIME Not possible
- DATE TIME Not possible
- TIME TIMESTAMP Not possible
- TIME DATETIME Not possible
- TIME DATE Not possible
- Most pairs are not possible, because the function data type
- would be DATETIME (according to LEAST/GREATEST aggregation rules).
- Conversion to DATETIME from TIME is not safe when
- OLD_MODE_ZERO_DATE_TIME_CAST is set:
- - negative TIME values cannot be converted to not-NULL DATETIME values
- - TIME values can produce DATETIME values that do not pass
- NO_ZERO_DATE and NO_ZERO_IN_DATE tests.
- */
- DBUG_ASSERT(hf->field_type() == MYSQL_TYPE_DATETIME);
- if (!(thd->variables.old_behavior & OLD_MODE_ZERO_DATE_TIME_CAST))
- continue;
- func->maybe_null= true;
- break;
- }
- return rc;
+longlong
+Type_handler_real_result::Item_func_hybrid_field_type_val_int(
+ Item_func_hybrid_field_type *item)
+ const
+{
+ return item->val_int_from_real_op();
}
@@@ -5260,24 -3535,34 +5303,35 @@@ String *Type_handler_decimal_result:
}
- String *Type_handler_real_result::
-my_decimal *
-Type_handler_decimal_result::Item_func_hybrid_field_type_val_decimal(
- Item_func_hybrid_field_type *item,
- my_decimal *dec) const
++String *Type_handler_double::
+ Item_func_min_max_val_str(Item_func_min_max *func, String *str) const
{
- return item->val_decimal_from_decimal_op(dec);
+ return func->val_string_from_real(str);
}
-bool
-Type_handler_decimal_result::Item_func_hybrid_field_type_get_date(
- Item_func_hybrid_field_type *item,
- MYSQL_TIME *ltime,
- ulonglong fuzzydate) const
++String *Type_handler_float::
++ Item_func_min_max_val_str(Item_func_min_max *func, String *str) const
+ {
- return item->get_date_from_decimal_op(ltime, fuzzydate);
++ Float nr(func->val_real());
++ if (func->null_value)
++ return 0;
++ nr.to_string(str, func->decimals);
++ return str;
+ }
+
+
-/***************************************************************************/
+double Type_handler_string_result::
+ Item_func_min_max_val_real(Item_func_min_max *func) const
+{
+ return func->val_real_native();
+}
-String *
-Type_handler_int_result::Item_func_hybrid_field_type_val_str(
- Item_func_hybrid_field_type *item,
- String *str) const
+double Type_handler_time_common::
+ Item_func_min_max_val_real(Item_func_min_max *func) const
{
- return item->val_str_from_int_op(str);
+ return Time(current_thd, func).to_double();
}
@@@ -5888,11 -4105,20 +5942,19 @@@ bool Type_handler:
}
-double Type_handler_string_result::
- Item_func_min_max_val_real(Item_func_min_max *func) const
++bool Type_handler::
++ Item_float_typecast_fix_length_and_dec(Item_float_typecast *item) const
+ {
- return func->val_real_native();
++ item->fix_length_and_dec_generic();
++ return false;
+ }
+
+
-double Type_handler_temporal_result::
- Item_func_min_max_val_real(Item_func_min_max *func) const
+bool Type_handler::
+ Item_decimal_typecast_fix_length_and_dec(Item_decimal_typecast *item) const
{
- MYSQL_TIME ltime;
- if (func->get_date(<ime, 0))
- return 0;
- return TIME_to_double(<ime);
+ item->fix_length_and_dec_generic();
+ return false;
}
@@@ -5977,20 -4202,45 +6039,27 @@@ bool Type_handler_geometry:
}
-bool Type_handler_temporal_result::
- Item_func_min_max_get_date(Item_func_min_max *func,
- MYSQL_TIME *ltime, ulonglong fuzzydate) const
++bool Type_handler_geometry::
++ Item_float_typecast_fix_length_and_dec(Item_float_typecast *item) const
+ {
- return func->get_date_native(ltime, fuzzydate);
++ return Item_func_or_sum_illegal_param(item);
+ }
+
-bool Type_handler_time_common::
- Item_func_min_max_get_date(Item_func_min_max *func,
- MYSQL_TIME *ltime, ulonglong fuzzydate) const
++
+bool Type_handler_geometry::
+ Item_decimal_typecast_fix_length_and_dec(Item_decimal_typecast *item) const
{
- return func->get_time_native(ltime);
+ return Item_func_or_sum_illegal_param(item);
}
-/***************************************************************************/
-/**
- Get a string representation of the Item value.
- See sql_type.h for details.
-*/
-String *Type_handler_row::
- print_item_value(THD *thd, Item *item, String *str) const
+bool Type_handler_geometry::
+ Item_char_typecast_fix_length_and_dec(Item_char_typecast *item) const
{
- CHARSET_INFO *cs= thd->variables.character_set_client;
- StringBuffer<STRING_BUFFER_USUAL_SIZE> val(cs);
- str->append(STRING_WITH_LEN("ROW("));
- for (uint i= 0 ; i < item->cols(); i++)
- {
- if (i > 0)
- str->append(',');
- Item *elem= item->element_index(i);
- String *tmp= elem->type_handler()->print_item_value(thd, elem, &val);
- if (tmp)
- str->append(*tmp);
- else
- str->append(STRING_WITH_LEN("NULL"));
- }
- str->append(STRING_WITH_LEN(")"));
- return str;
+ if (item->cast_charset() != &my_charset_bin)
+ return Item_func_or_sum_illegal_param(item); // CAST(geom AS CHAR)
+ item->fix_length_and_dec_str();
+ return false; // CAST(geom AS BINARY)
}
@@@ -7006,59 -5047,52 +7075,68 @@@ Item *Type_handler_decimal_result:
}
-uint Type_handler_string_result::Item_temporal_precision(Item *item,
- bool is_time) const
+Item *Type_handler_double::
+ create_typecast_item(THD *thd, Item *item,
+ const Type_cast_attributes &attr) const
{
- MYSQL_TIME ltime;
- StringBuffer<64> buf;
- String *tmp;
- MYSQL_TIME_STATUS status;
- DBUG_ASSERT(item->fixed);
- if ((tmp= item->val_str(&buf)) &&
- !(is_time ?
- str_to_time(tmp->charset(), tmp->ptr(), tmp->length(),
- <ime, TIME_TIME_ONLY, &status) :
- str_to_datetime(tmp->charset(), tmp->ptr(), tmp->length(),
- <ime, TIME_FUZZY_DATES, &status)))
- return MY_MIN(status.precision, TIME_SECOND_PART_DIGITS);
- return MY_MIN(item->decimals, TIME_SECOND_PART_DIGITS);
+ uint len, dec;
+ if (!attr.length_specified())
+ return new (thd->mem_root) Item_double_typecast(thd, item,
+ DBL_DIG + 7,
+ NOT_FIXED_DEC);
+
+ if (get_length_and_scale(attr.length(), attr.decimals(), &len, &dec,
+ DECIMAL_MAX_PRECISION, NOT_FIXED_DEC - 1, item))
+ return NULL;
+ return new (thd->mem_root) Item_double_typecast(thd, item, len, dec);
}
-/***************************************************************************/
-uint Type_handler::Item_decimal_scale(const Item *item) const
++Item *Type_handler_float::
++ create_typecast_item(THD *thd, Item *item,
++ const Type_cast_attributes &attr) const
+ {
- return item->decimals < NOT_FIXED_DEC ?
- item->decimals :
- MY_MIN(item->max_length, DECIMAL_MAX_SCALE);
++ DBUG_ASSERT(!attr.length_specified());
++ return new (thd->mem_root) Item_float_typecast(thd, item);
+ }
+
-uint Type_handler_temporal_result::
- Item_decimal_scale_with_seconds(const Item *item) const
-{
- return item->decimals < NOT_FIXED_DEC ?
- item->decimals :
- TIME_SECOND_PART_DIGITS;
-}
+
-uint Type_handler::Item_divisor_precision_increment(const Item *item) const
+Item *Type_handler_long_blob::
+ create_typecast_item(THD *thd, Item *item,
+ const Type_cast_attributes &attr) const
{
- return item->decimals;
+ int len= -1;
+ CHARSET_INFO *real_cs= attr.charset() ?
+ attr.charset() :
+ thd->variables.collation_connection;
+ if (attr.length_specified())
+ {
+ if (attr.length() > MAX_FIELD_BLOBLENGTH)
+ {
+ char buff[1024];
+ String buf(buff, sizeof(buff), system_charset_info);
+ my_error(ER_TOO_BIG_DISPLAYWIDTH, MYF(0), item_name(item, &buf),
+ MAX_FIELD_BLOBLENGTH);
+ return NULL;
+ }
+ len= (int) attr.length();
+ }
+ return new (thd->mem_root) Item_char_typecast(thd, item, len, real_cs);
}
-uint Type_handler_temporal_result::
- Item_divisor_precision_increment_with_seconds(const Item *item) const
+Item *Type_handler_interval_DDhhmmssff::
+ create_typecast_item(THD *thd, Item *item,
+ const Type_cast_attributes &attr) const
{
- return item->decimals < NOT_FIXED_DEC ?
- item->decimals :
- TIME_SECOND_PART_DIGITS;
+ if (attr.decimals() > MAX_DATETIME_PRECISION)
+ {
+ wrong_precision_error(ER_TOO_BIG_PRECISION, item, attr.decimals(),
+ MAX_DATETIME_PRECISION);
+ return 0;
+ }
+ return new (thd->mem_root) Item_interval_DDhhmmssff_typecast(thd, item,
+ (uint)
+ attr.decimals());
}
/***************************************************************************/
diff --cc sql/sql_type.h
index 5e6d1ec47f6,ef1a44a420c..6d9d802913f
--- a/sql/sql_type.h
+++ b/sql/sql_type.h
@@@ -25,7 -25,7 +25,8 @@@
#include "sql_array.h"
#include "sql_const.h"
#include "sql_time.h"
+ #include "sql_type_real.h"
+#include "compat56.h"
class Field;
class Column_definition;
@@@ -4112,10 -1786,8 +4121,9 @@@ public
Item_param *param,
const Type_all_attributes *attr,
const st_value *value) const;
+ void Item_update_null_value(Item *item) const;
int Item_save_in_field(Item *item, Field *field, bool no_conversions) const;
Item *make_const_item_for_comparison(THD *, Item *src, const Item *cmp) const;
- Item_cache *Item_get_cache(THD *thd, const Item *item) const;
bool set_comparator_func(Arg_comparator *cmp) const;
bool Item_hybrid_func_fix_attributes(THD *thd,
const char *name,
@@@ -4145,12 -1814,9 +4151,11 @@@
my_decimal *Item_func_hybrid_field_type_val_decimal(
Item_func_hybrid_field_type *,
my_decimal *) const;
- bool Item_func_hybrid_field_type_get_date(Item_func_hybrid_field_type *,
+ void Item_func_hybrid_field_type_get_date(THD *,
+ Item_func_hybrid_field_type *,
+ Temporal::Warn *,
MYSQL_TIME *,
- ulonglong fuzzydate) const;
+ date_mode_t fuzzydate) const;
- String *Item_func_min_max_val_str(Item_func_min_max *, String *) const;
longlong Item_func_between_val_int(Item_func_between *func) const;
cmp_item *make_cmp_item(THD *thd, CHARSET_INFO *cs) const;
in_vector *make_in_vector(THD *, const Item_func_in *, uint nargs) const;
@@@ -5101,15 -2616,13 +5108,20 @@@ public
const Record_addr &addr,
const Type_all_attributes &attr,
TABLE *table) const;
+ Field *make_table_field_from_def(TABLE_SHARE *share,
+ MEM_ROOT *mem_root,
+ const LEX_CSTRING *name,
+ const Record_addr &addr,
+ const Bit_addr &bit,
+ const Column_definition_attributes *attr,
+ uint32 flags) const;
void Item_param_set_param_func(Item_param *param,
uchar **pos, ulong len) const;
+
+ Item_cache *Item_get_cache(THD *thd, const Item *item) const;
+ String *Item_func_hybrid_field_type_val_str(Item_func_hybrid_field_type *,
+ String *) const;
+ String *Item_func_min_max_val_str(Item_func_min_max *, String *) const;
};
@@@ -5144,15 -2653,13 +5156,20 @@@ public
const Record_addr &addr,
const Type_all_attributes &attr,
TABLE *table) const;
+ Field *make_table_field_from_def(TABLE_SHARE *share,
+ MEM_ROOT *mem_root,
+ const LEX_CSTRING *name,
+ const Record_addr &addr,
+ const Bit_addr &bit,
+ const Column_definition_attributes *attr,
+ uint32 flags) const;
void Item_param_set_param_func(Item_param *param,
uchar **pos, ulong len) const;
+
+ Item_cache *Item_get_cache(THD *thd, const Item *item) const;
+ String *Item_func_hybrid_field_type_val_str(Item_func_hybrid_field_type *,
+ String *) const;
+ String *Item_func_min_max_val_str(Item_func_min_max *, String *) const;
};
diff --cc sql/sql_union.cc
index c32a6ee852f,6ab2619e8e2..41f4234c13d
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@@ -981,7 -982,7 +982,24 @@@ bool st_select_lex_unit::prepare(TABLE_
types= first_sl->item_list;
goto cont;
}
--
++
++ if (sl->tvc && sl->order_list.elements &&
++ !sl->tvc->to_be_wrapped_as_with_tail())
++ {
++ if (thd->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW)
++ {
++ sl->master_unit()->fake_select_lex= 0;
++ sl->master_unit()->saved_fake_select_lex= 0;
++ }
++ else
++ {
++ sl->order_list.empty();
++ sl->explicit_limit= 0;
++ sl->select_limit= 0;
++ sl->offset_limit= 0;
++ }
++ }
++
for (;sl; sl= sl->next_select(), union_part_count++)
{
if (sl->tvc)
diff --cc sql/sql_update.cc
index 723a3f26dc9,681e3bb0b64..fe021e27505
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@@ -1639,9 -1533,12 +1639,12 @@@ int mysql_multi_update_prepare(THD *thd
LEX *lex= thd->lex;
TABLE_LIST *table_list= lex->query_tables;
TABLE_LIST *tl;
- List<Item> *fields= &lex->select_lex.item_list;
+ 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();
+
/*
if this multi-update was converted from usual update, here is table
counter else junk will be assigned here, but then replaced with real
@@@ -1723,10 -1608,12 +1726,13 @@@
thd->table_map_for_update= tables_for_update= get_table_map(fields);
- if (unsafe_key_update(lex->select_lex.leaf_tables, tables_for_update))
+ if (unsafe_key_update(lex->first_select_lex()->leaf_tables,
+ tables_for_update))
DBUG_RETURN(true);
+ TABLE_LIST **new_tables= lex->query_tables_last;
+ DBUG_ASSERT(*new_tables== NULL);
+
/*
Setup timestamp handling and locking mode
*/
diff --cc sql/sql_yacc.yy
index 70eb7803dba,f89984d848f..fd461ad05aa
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@@ -13289,15 -13417,11 +13290,15 @@@ insert
insert_lock_option
opt_ignore insert2
{
- Select->set_lock_for_tables($3);
+ Select->set_lock_for_tables($3, true);
- Lex->current_select= &Lex->select_lex;
+ Lex->current_select= Lex->first_select_lex();
}
insert_field_spec opt_insert_update
- {}
+ {
+ Lex->pop_select(); //main select
+ if (Lex->check_main_unit_semantics())
+ MYSQL_YYABORT;
+ }
;
replace:
@@@ -13313,15 -13434,11 +13314,15 @@@
}
replace_lock_option insert2
{
- Select->set_lock_for_tables($3);
+ Select->set_lock_for_tables($3, true);
- Lex->current_select= &Lex->select_lex;
+ Lex->current_select= Lex->first_select_lex();
}
insert_field_spec
- {}
+ {
+ Lex->pop_select(); //main select
+ if (Lex->check_main_unit_semantics())
+ MYSQL_YYABORT;
+ }
;
insert_lock_option:
@@@ -13583,13 -13664,13 +13584,13 @@@ update
lex->sql_command= SQLCOM_UPDATE;
lex->duplicates= DUP_ERROR;
}
- opt_low_priority opt_ignore join_table_list
+ opt_low_priority opt_ignore update_table_list
SET update_list
{
- LEX *lex= Lex;
- if (lex->first_select_lex()->table_list.elements > 1)
- lex->sql_command= SQLCOM_UPDATE_MULTI;
- else if (lex->first_select_lex()->get_table_list()->derived)
- SELECT_LEX *slex= &Lex->select_lex;
++ SELECT_LEX *slex= Lex->first_select_lex();
+ if (slex->table_list.elements > 1)
+ Lex->sql_command= SQLCOM_UPDATE_MULTI;
- else if (unlikely(slex->get_table_list()->derived))
++ else if (slex->get_table_list()->derived)
{
/* it is single table update and it is update of derived table */
my_error(ER_NON_UPDATABLE_TABLE, MYF(0),
@@@ -13602,16 -13682,9 +13602,16 @@@
be too pessimistic. We will decrease lock level if possible in
mysql_multi_update().
*/
- Select->set_lock_for_tables($3);
+ slex->set_lock_for_tables($3, slex->table_list.elements == 1);
}
- opt_where_clause opt_order_clause delete_limit_clause {}
+ opt_where_clause opt_order_clause delete_limit_clause
+ {
+ if ($10)
+ Select->order_list= *($10);
+ Lex->pop_select(); //main select
+ if (Lex->check_main_unit_semantics())
+ MYSQL_YYABORT;
+ }
;
update_list:
diff --cc sql/sql_yacc_ora.yy
index 7401e788c8e,6a05423ebc3..f6fd27bc183
--- a/sql/sql_yacc_ora.yy
+++ b/sql/sql_yacc_ora.yy
@@@ -13427,15 -13378,11 +13428,15 @@@ insert
insert_lock_option
opt_ignore insert2
{
- Select->set_lock_for_tables($3);
+ Select->set_lock_for_tables($3, true);
- Lex->current_select= &Lex->select_lex;
+ Lex->current_select= Lex->first_select_lex();
}
insert_field_spec opt_insert_update
- {}
+ {
+ Lex->pop_select(); //main select
+ if (Lex->check_main_unit_semantics())
+ MYSQL_YYABORT;
+ }
;
replace:
@@@ -13451,15 -13395,11 +13452,15 @@@
}
replace_lock_option insert2
{
- Select->set_lock_for_tables($3);
+ Select->set_lock_for_tables($3, true);
- Lex->current_select= &Lex->select_lex;
+ Lex->current_select= Lex->first_select_lex();
}
insert_field_spec
- {}
+ {
+ Lex->pop_select(); //main select
+ if (Lex->check_main_unit_semantics())
+ MYSQL_YYABORT;
+ }
;
insert_lock_option:
@@@ -13721,13 -13625,13 +13722,13 @@@ update
lex->sql_command= SQLCOM_UPDATE;
lex->duplicates= DUP_ERROR;
}
- opt_low_priority opt_ignore join_table_list
+ opt_low_priority opt_ignore update_table_list
SET update_list
{
- LEX *lex= Lex;
- if (lex->first_select_lex()->table_list.elements > 1)
- lex->sql_command= SQLCOM_UPDATE_MULTI;
- else if (lex->first_select_lex()->get_table_list()->derived)
- SELECT_LEX *slex= &Lex->select_lex;
++ SELECT_LEX *slex= Lex->first_select_lex();
+ if (slex->table_list.elements > 1)
+ Lex->sql_command= SQLCOM_UPDATE_MULTI;
- else if (unlikely(slex->get_table_list()->derived))
++ else if (slex->get_table_list()->derived)
{
/* it is single table update and it is update of derived table */
my_error(ER_NON_UPDATABLE_TABLE, MYF(0),
@@@ -13740,16 -13643,9 +13740,16 @@@
be too pessimistic. We will decrease lock level if possible in
mysql_multi_update().
*/
- Select->set_lock_for_tables($3);
+ slex->set_lock_for_tables($3, slex->table_list.elements == 1);
}
- opt_where_clause opt_order_clause delete_limit_clause {}
+ opt_where_clause opt_order_clause delete_limit_clause
+ {
+ if ($10)
+ Select->order_list= *($10);
+ Lex->pop_select(); //main select
+ if (Lex->check_main_unit_semantics())
+ MYSQL_YYABORT;
+ }
;
update_list:
diff --cc sql/wsrep_applier.cc
index 39cdef77be2,9d39b36793f..fd51dbf9439
--- a/sql/wsrep_applier.cc
+++ b/sql/wsrep_applier.cc
@@@ -11,12 -11,9 +11,12 @@@
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-1301 USA. */
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA. */
#include "mariadb.h"
+#include "mysql/service_wsrep.h"
+#include "wsrep_applier.h"
+
#include "wsrep_priv.h"
#include "wsrep_binlog.h" // wsrep_dump_rbr_buf()
#include "wsrep_xid.h"
diff --cc sql/wsrep_binlog.cc
index 80790ca604c,412af259d98..ecab4664d7b
--- a/sql/wsrep_binlog.cc
+++ b/sql/wsrep_binlog.cc
@@@ -11,10 -11,9 +11,10 @@@
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-1301 USA. */
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA. */
#include "mariadb.h"
+#include "mysql/service_wsrep.h"
#include "wsrep_binlog.h"
#include "wsrep_priv.h"
#include "log.h"
diff --cc sql/wsrep_mysqld.cc
index dba793aba55,99cad458827..044db604afc
--- a/sql/wsrep_mysqld.cc
+++ b/sql/wsrep_mysqld.cc
@@@ -11,15 -11,10 +11,15 @@@
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 02111-1301 USA */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#include "sql_plugin.h" /* wsrep_plugins_pre_init() */
+#include "my_global.h"
+#include "wsrep_server_state.h"
+
+#include "mariadb.h"
#include <mysqld.h>
+#include <transaction.h>
#include <sql_class.h>
#include <sql_parse.h>
#include <sql_base.h> /* find_temporary_table() */
diff --cc sql/wsrep_mysqld.h
index f71d998ed4e,c5749ef6da9..37301afa7be
--- a/sql/wsrep_mysqld.h
+++ b/sql/wsrep_mysqld.h
@@@ -11,8 -11,10 +11,8 @@@
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 02111-1301 USA */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
-#include <wsrep.h>
-
#ifndef WSREP_MYSQLD_H
#define WSREP_MYSQLD_H
diff --cc sql/wsrep_sst.h
index 46059a7f436,1ad8ff5b5de..eb218647bc0
--- a/sql/wsrep_sst.h
+++ b/sql/wsrep_sst.h
@@@ -11,8 -11,10 +11,8 @@@
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-1301 USA. */
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA. */
-#include <my_config.h>
-
#ifndef WSREP_SST_H
#define WSREP_SST_H
diff --cc sql/wsrep_thd.h
index 3114e02e1b8,6ce14a4eb0e..2eceb3223a8
--- a/sql/wsrep_thd.h
+++ b/sql/wsrep_thd.h
@@@ -11,8 -11,10 +11,8 @@@
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-1301 USA. */
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA. */
-#include <my_config.h>
-
#ifndef WSREP_THD_H
#define WSREP_THD_H
diff --cc sql/wsrep_var.h
index 0acb61432f0,6258b5ab66f..481df02f2d5
--- a/sql/wsrep_var.h
+++ b/sql/wsrep_var.h
@@@ -11,8 -11,10 +11,8 @@@
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-1301 USA. */
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA. */
-#include <my_config.h>
-
#ifndef WSREP_VAR_H
#define WSREP_VAR_H
diff --cc storage/innobase/buf/buf0dblwr.cc
index fb3d4d96003,8edc4768383..80c7411d48a
--- a/storage/innobase/buf/buf0dblwr.cc
+++ b/storage/innobase/buf/buf0dblwr.cc
@@@ -635,26 -646,16 +635,21 @@@ bad
<< " from the doublewrite buffer.";
}
- ulint decomp = fil_page_decompress(buf, page);
- if (!decomp || (decomp != srv_page_size
- && page_size.is_compressed())) {
+ ulint decomp = fil_page_decompress(buf, page, space->flags);
+ if (!decomp || (zip_size && decomp != srv_page_size)) {
- goto bad_doublewrite;
+ continue;
}
- if (expect_encrypted && mach_read_from_4(
- page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION)
- ? !fil_space_verify_crypt_checksum(page, page_size)
- : buf_page_is_corrupted(true, page, page_size, space)) {
+ if (expect_encrypted
+ && buf_page_get_key_version(read_buf, space->flags)) {
+ is_corrupted = !buf_page_verify_crypt_checksum(
+ page, space->flags);
+ } else {
+ is_corrupted = buf_page_is_corrupted(
+ true, page, space->flags);
+ }
+
+ if (is_corrupted) {
- if (!is_all_zero) {
- bad_doublewrite:
- ib::warn() << "A doublewrite copy of page "
- << page_id << " is corrupted.";
- }
/* Theoretically we could have another good
copy for this page in the doublewrite
buffer. If not, we will report a fatal error
diff --cc storage/innobase/fts/fts0sql.cc
index 26a51b74fff,f9b7a59d675..a38c3f7a488
--- a/storage/innobase/fts/fts0sql.cc
+++ b/storage/innobase/fts/fts0sql.cc
@@@ -88,70 -89,52 +89,52 @@@ fts_get_table_id
return(len);
}
- /******************************************************************//**
- Construct the prefix name of an FTS table.
- @return own: table name, must be freed with ut_free() */
- char*
- fts_get_table_name_prefix(
- /*======================*/
- const fts_table_t*
- fts_table) /*!< in: Auxiliary table type */
+ /** Construct the name of an internal FTS table for the given table.
+ @param[in] fts_table metadata on fulltext-indexed table
-@param[in] dict_locked whether dict_sys->mutex is being held
++@param[in] dict_locked whether dict_sys.mutex is being held
+ @return the prefix, must be freed with ut_free() */
+ char* fts_get_table_name_prefix(const fts_table_t* fts_table)
{
- int len;
- const char* slash;
- char* prefix_name;
- int dbname_len = 0;
- int prefix_name_len;
char table_id[FTS_AUX_MIN_TABLE_ID_LENGTH];
-
- slash = static_cast<const char*>(
- memchr(fts_table->parent, '/', strlen(fts_table->parent)));
-
- if (slash) {
- /* Print up to and including the separator. */
- dbname_len = static_cast<int>(slash - fts_table->parent) + 1;
- }
-
- len = fts_get_table_id(fts_table, table_id);
-
- prefix_name_len = dbname_len + 4 + len + 1;
-
- prefix_name = static_cast<char*>(
- ut_malloc_nokey(unsigned(prefix_name_len)));
-
- len = sprintf(prefix_name, "%.*sFTS_%s",
- dbname_len, fts_table->parent, table_id);
-
- ut_a(len > 0);
- ut_a(len == prefix_name_len - 1);
-
- return(prefix_name);
+ const size_t table_id_len = size_t(fts_get_table_id(fts_table,
+ table_id)) + 1;
- mutex_enter(&dict_sys->mutex);
++ mutex_enter(&dict_sys.mutex);
+ /* Include the separator as well. */
+ const size_t dbname_len = fts_table->table->name.dblen() + 1;
+ ut_ad(dbname_len > 1);
+ const size_t prefix_name_len = dbname_len + 4 + table_id_len;
+ char* prefix_name = static_cast<char*>(
+ ut_malloc_nokey(prefix_name_len));
+ memcpy(prefix_name, fts_table->table->name.m_name, dbname_len);
- mutex_exit(&dict_sys->mutex);
++ mutex_exit(&dict_sys.mutex);
+ memcpy(prefix_name + dbname_len, "FTS_", 4);
+ memcpy(prefix_name + dbname_len + 4, table_id, table_id_len);
+ return prefix_name;
}
- /******************************************************************//**
- Construct the name of an ancillary FTS table for the given table.
- Caller must allocate enough memory(usually size of MAX_FULL_NAME_LEN)
- for param 'table_name'. */
- void
- fts_get_table_name(
- /*===============*/
- const fts_table_t* fts_table,
- /*!< in: Auxiliary table type */
- char* table_name)
- /*!< in/out: aux table name */
+ /** Construct the name of an internal FTS table for the given table.
+ @param[in] fts_table metadata on fulltext-indexed table
+ @param[out] table_name a name up to MAX_FULL_NAME_LEN
-@param[in] dict_locked whether dict_sys->mutex is being held */
++@param[in] dict_locked whether dict_sys.mutex is being held */
+ void fts_get_table_name(const fts_table_t* fts_table, char* table_name,
+ bool dict_locked)
{
- int len;
- char* prefix_name;
-
- prefix_name = fts_get_table_name_prefix(fts_table);
-
- len = sprintf(table_name, "%s_%s", prefix_name, fts_table->suffix);
-
- ut_a(len > 0);
- ut_a(strlen(prefix_name) + 1 + strlen(fts_table->suffix)
- == static_cast<uint>(len));
-
- ut_free(prefix_name);
+ if (!dict_locked) {
- mutex_enter(&dict_sys->mutex);
++ mutex_enter(&dict_sys.mutex);
+ }
- ut_ad(mutex_own(&dict_sys->mutex));
++ ut_ad(mutex_own(&dict_sys.mutex));
+ /* Include the separator as well. */
+ const size_t dbname_len = fts_table->table->name.dblen() + 1;
+ ut_ad(dbname_len > 1);
+ memcpy(table_name, fts_table->table->name.m_name, dbname_len);
+ if (!dict_locked) {
- mutex_exit(&dict_sys->mutex);
++ mutex_exit(&dict_sys.mutex);
+ }
+ memcpy(table_name += dbname_len, "FTS_", 4);
+ table_name += 4;
+ table_name += fts_get_table_id(fts_table, table_name);
+ *table_name++ = '_';
+ strcpy(table_name, fts_table->suffix);
}
/******************************************************************//**
diff --cc storage/innobase/handler/ha_innodb.h
index af81b22f879,ad30ae800cc..11b69974558
--- a/storage/innobase/handler/ha_innodb.h
+++ b/storage/innobase/handler/ha_innodb.h
@@@ -13,12 -13,13 +13,12 @@@ FOR A PARTICULAR PURPOSE. See the GNU G
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, Suite 500, Boston, MA 02110-1335 USA
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
*****************************************************************************/
-
#ifdef WITH_WSREP
-# include <mysql/service_wsrep.h>
-# include "../../../wsrep/wsrep_api.h"
+#include "wsrep_api.h"
+#include <mysql/service_wsrep.h>
#endif /* WITH_WSREP */
#include "table.h"
diff --cc storage/innobase/handler/handler0alter.cc
index a8cf53b5033,0d0e597641b..cb7d0455290
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@@ -1025,9 -296,9 +1026,12 @@@ struct ha_innobase_inplace_ctx : publi
rw_lock_free(&index->lock);
dict_mem_index_free(index);
}
+ for (unsigned i = old_n_v_cols; i--; ) {
+ UT_DELETE(old_v_cols[i].v_indexes);
+ }
+ if (instant_table->fts) {
+ fts_free(instant_table);
+ }
dict_mem_table_free(instant_table);
}
mem_heap_free(heap);
@@@ -1093,40 -348,23 +1097,57 @@@
return instant_table;
}
+ /** Create an index table where indexes are ordered as follows:
+
+ IF a new primary key is defined for the table THEN
+
+ 1) New primary key
+ 2) The remaining keys in key_info
+
+ ELSE
+
+ 1) All new indexes in the order they arrive from MySQL
+
+ ENDIF
+
+ @return key definitions */
+ MY_ATTRIBUTE((nonnull, warn_unused_result, malloc))
+ inline index_def_t*
+ create_key_defs(
+ const Alter_inplace_info* ha_alter_info,
+ /*!< in: alter operation */
+ const TABLE* altered_table,
+ /*!< in: MySQL table that is being altered */
+ ulint& n_fts_add,
+ /*!< out: number of FTS indexes to be created */
+ ulint& fts_doc_id_col,
+ /*!< in: The column number for Doc ID */
+ bool& add_fts_doc_id,
+ /*!< in: whether we need to add new DOC ID
+ column for FTS index */
+ bool& add_fts_doc_idx,
+ /*!< in: whether we need to add new DOC ID
+ index for FTS index */
+ const TABLE* table);
+ /*!< in: MySQL table that is being altered */
+
+ /** Share context between partitions.
+ @param[in] ctx context from another partition of the table */
+ void set_shared_data(const inplace_alter_handler_ctx& ctx)
+ {
+ if (add_autoinc != ULINT_UNDEFINED) {
+ const ha_innobase_inplace_ctx& ha_ctx =
+ static_cast<const ha_innobase_inplace_ctx&>
+ (ctx);
+ /* When adding an AUTO_INCREMENT column to a
+ partitioned InnoDB table, we must share the
+ sequence for all partitions. */
+ ut_ad(ha_ctx.add_autoinc == add_autoinc);
+ ut_ad(ha_ctx.sequence.last());
+ sequence = ha_ctx.sequence;
+ }
+ }
+
private:
// Disable copying
ha_innobase_inplace_ctx(const ha_innobase_inplace_ctx&);
@@@ -8254,7 -6916,10 +8275,9 @@@ ha_innobase::inplace_alter_table
bool rebuild_templ = false;
DBUG_ENTER("inplace_alter_table");
DBUG_ASSERT(!srv_read_only_mode);
-
ut_ad(!sync_check_iterate(sync_check()));
- ut_ad(!rw_lock_own_flagged(&dict_operation_lock,
++ ut_ad(!rw_lock_own_flagged(&dict_sys.latch,
+ RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
DEBUG_SYNC(m_user_thd, "innodb_inplace_alter_table_enter");
diff --cc storage/innobase/handler/i_s.cc
index 110bf8bb119,79c0fa1aa3f..c06a6ef83f9
--- a/storage/innobase/handler/i_s.cc
+++ b/storage/innobase/handler/i_s.cc
@@@ -2864,25 -2867,21 +2867,21 @@@ i_s_fts_deleted_generic_fill
DBUG_RETURN(0);
}
- if (!fts_internal_tbl_name) {
- DBUG_RETURN(0);
- }
+ RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str);
- /* Prevent DDL to drop fts aux tables. */
+ /* Prevent DROP of the internal tables for fulltext indexes.
+ FIXME: acquire DDL-blocking MDL on the user table name! */
- rw_lock_s_lock(&dict_operation_lock);
+ rw_lock_s_lock(&dict_sys.latch);
- user_table = dict_table_open_on_name(
- fts_internal_tbl_name, FALSE, FALSE, DICT_ERR_IGNORE_NONE);
+ user_table = dict_table_open_on_id(
+ innodb_ft_aux_table_id, FALSE, DICT_TABLE_OP_NORMAL);
if (!user_table) {
- rw_lock_s_unlock(&dict_operation_lock);
+ rw_lock_s_unlock(&dict_sys.latch);
-
DBUG_RETURN(0);
} else if (!dict_table_has_fts_index(user_table)) {
dict_table_close(user_table, FALSE, FALSE);
-
- rw_lock_s_unlock(&dict_operation_lock);
+ rw_lock_s_unlock(&dict_sys.latch);
-
DBUG_RETURN(0);
}
@@@ -2897,6 -2896,12 +2896,12 @@@
fts_table_fetch_doc_ids(trx, &fts_table, deleted);
+ dict_table_close(user_table, FALSE, FALSE);
+
- rw_lock_s_unlock(&dict_operation_lock);
++ rw_lock_s_unlock(&dict_sys.latch);
+
+ trx_free(trx);
+
fields = table->field;
int ret = 0;
@@@ -3278,14 -3277,18 +3277,18 @@@ i_s_fts_index_cache_fill
DBUG_RETURN(0);
}
- if (!fts_internal_tbl_name) {
- DBUG_RETURN(0);
- }
+ RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str);
- user_table = dict_table_open_on_name(
- fts_internal_tbl_name, FALSE, FALSE, DICT_ERR_IGNORE_NONE);
+ /* Prevent DROP of the internal tables for fulltext indexes.
+ FIXME: acquire DDL-blocking MDL on the user table name! */
- rw_lock_s_lock(&dict_operation_lock);
++ rw_lock_s_lock(&dict_sys.latch);
+
+ user_table = dict_table_open_on_id(
+ innodb_ft_aux_table_id, FALSE, DICT_TABLE_OP_NORMAL);
if (!user_table) {
+ no_fts:
- rw_lock_s_unlock(&dict_operation_lock);
++ rw_lock_s_unlock(&dict_sys.latch);
DBUG_RETURN(0);
}
@@@ -3315,9 -3315,8 +3315,8 @@@
index_cache, thd, &conv_str, tables));
}
- ut_free(conv_str.f_str);
-
dict_table_close(user_table, FALSE, FALSE);
- rw_lock_s_unlock(&dict_operation_lock);
++ rw_lock_s_unlock(&dict_sys.latch);
DBUG_RETURN(ret);
}
@@@ -3725,19 -3724,17 +3724,17 @@@ i_s_fts_index_table_fill
DBUG_RETURN(0);
}
- if (!fts_internal_tbl_name) {
- DBUG_RETURN(0);
- }
+ RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str);
- /* Prevent DDL to drop fts aux tables. */
+ /* Prevent DROP of the internal tables for fulltext indexes.
+ FIXME: acquire DDL-blocking MDL on the user table name! */
- rw_lock_s_lock(&dict_operation_lock);
+ rw_lock_s_lock(&dict_sys.latch);
- user_table = dict_table_open_on_name(
- fts_internal_tbl_name, FALSE, FALSE, DICT_ERR_IGNORE_NONE);
+ user_table = dict_table_open_on_id(
+ innodb_ft_aux_table_id, FALSE, DICT_TABLE_OP_NORMAL);
if (!user_table) {
- rw_lock_s_unlock(&dict_operation_lock);
+ rw_lock_s_unlock(&dict_sys.latch);
-
DBUG_RETURN(0);
}
@@@ -3890,32 -3887,28 +3887,28 @@@ i_s_fts_config_fill
DBUG_RETURN(0);
}
- if (!fts_internal_tbl_name) {
- DBUG_RETURN(0);
- }
-
- DEBUG_SYNC_C("i_s_fts_config_fille_check");
-
- fields = table->field;
+ RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str);
- /* Prevent DDL to drop fts aux tables. */
+ /* Prevent DROP of the internal tables for fulltext indexes.
+ FIXME: acquire DDL-blocking MDL on the user table name! */
- rw_lock_s_lock(&dict_operation_lock);
+ rw_lock_s_lock(&dict_sys.latch);
- user_table = dict_table_open_on_name(
- fts_internal_tbl_name, FALSE, FALSE, DICT_ERR_IGNORE_NONE);
+ user_table = dict_table_open_on_id(
+ innodb_ft_aux_table_id, FALSE, DICT_TABLE_OP_NORMAL);
if (!user_table) {
+ no_fts:
- rw_lock_s_unlock(&dict_operation_lock);
+ rw_lock_s_unlock(&dict_sys.latch);
-
DBUG_RETURN(0);
- } else if (!dict_table_has_fts_index(user_table)) {
- dict_table_close(user_table, FALSE, FALSE);
-
- rw_lock_s_unlock(&dict_sys.latch);
+ }
- DBUG_RETURN(0);
+ if (!dict_table_has_fts_index(user_table)) {
+ dict_table_close(user_table, FALSE, FALSE);
+ goto no_fts;
}
+ fields = table->field;
+
trx = trx_create();
trx->op_info = "Select for FTS CONFIG TABLE";
@@@ -3967,12 -3960,12 +3960,12 @@@
fts_sql_commit(trx);
- trx_free(trx);
-
dict_table_close(user_table, FALSE, FALSE);
- rw_lock_s_unlock(&dict_operation_lock);
+ rw_lock_s_unlock(&dict_sys.latch);
+ trx_free(trx);
+
DBUG_RETURN(ret);
}
diff --cc storage/innobase/include/fts0fts.h
index bea58476e8b,b3ea718b14a..b5c81250c28
--- a/storage/innobase/include/fts0fts.h
+++ b/storage/innobase/include/fts0fts.h
@@@ -402,16 -396,11 +396,11 @@@ extern ulong fts_min_token_size
need a sync to free some memory */
extern bool fts_need_sync;
- /** Variable specifying the table that has Fulltext index to display its
- content through information schema table */
- extern char* fts_internal_tbl_name;
- extern char* fts_internal_tbl_name2;
-
#define fts_que_graph_free(graph) \
do { \
- mutex_enter(&dict_sys->mutex); \
+ mutex_enter(&dict_sys.mutex); \
que_graph_free(graph); \
- mutex_exit(&dict_sys->mutex); \
+ mutex_exit(&dict_sys.mutex); \
} while (0)
/******************************************************************//**
diff --cc storage/innobase/include/fts0priv.h
index 85331cbd31e,40978ea3f1c..f41280c22f8
--- a/storage/innobase/include/fts0priv.h
+++ b/storage/innobase/include/fts0priv.h
@@@ -131,19 -130,15 +130,15 @@@ fts_eval_sql
/*=========*/
trx_t* trx, /*!< in: transaction */
que_t* graph) /*!< in: Parsed statement */
- MY_ATTRIBUTE((warn_unused_result));
-
- /******************************************************************//**
- Construct the name of an ancillary FTS table for the given table.
- Caller must allocate enough memory(usually size of MAX_FULL_NAME_LEN)
- for param 'table_name'. */
- void
- fts_get_table_name(
- /*===============*/
- const fts_table_t*
- fts_table, /*!< in: FTS aux table info */
- char* table_name); /*!< in/out: aux table name */
+ MY_ATTRIBUTE((nonnull, warn_unused_result));
+ /** Construct the name of an internal FTS table for the given table.
+ @param[in] fts_table metadata on fulltext-indexed table
+ @param[out] table_name a name up to MAX_FULL_NAME_LEN
-@param[in] dict_locked whether dict_sys->mutex is being held */
++@param[in] dict_locked whether dict_sys.mutex is being held */
+ void fts_get_table_name(const fts_table_t* fts_table, char* table_name,
+ bool dict_locked = false)
+ MY_ATTRIBUTE((nonnull));
/******************************************************************//**
Construct the column specification part of the SQL string for selecting the
indexed FTS columns for the given table. Adds the necessary bound
@@@ -508,18 -500,13 +500,13 @@@ fts_get_table_id
char* table_id) /*!< out: table id, must be at least
FTS_AUX_MIN_TABLE_ID_LENGTH bytes
long */
- MY_ATTRIBUTE((warn_unused_result));
-
- /******************************************************************//**
- Construct the prefix name of an FTS table.
- @return own: table name, must be freed with ut_free() */
- char*
- fts_get_table_name_prefix(
- /*======================*/
- const fts_table_t*
- fts_table) /*!< in: Auxiliary table type */
- MY_ATTRIBUTE((warn_unused_result));
-
+ MY_ATTRIBUTE((nonnull, warn_unused_result));
+ /** Construct the name of an internal FTS table for the given table.
+ @param[in] fts_table metadata on fulltext-indexed table
-@param[in] dict_locked whether dict_sys->mutex is being held
++@param[in] dict_locked whether dict_sys.mutex is being held
+ @return the prefix, must be freed with ut_free() */
+ char* fts_get_table_name_prefix(const fts_table_t* fts_table)
+ MY_ATTRIBUTE((nonnull, malloc, warn_unused_result));
/******************************************************************//**
Add node positions. */
void
diff --cc storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result
index 00000000000,8d5b6270318..cb31847cdd8
mode 000000,100644..100644
--- a/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result
+++ b/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result
@@@ -1,0 -1,344 +1,342 @@@
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
+ trx_id trx_state trx_started trx_requested_lock_id trx_wait_started trx_weight trx_mysql_thread_id trx_query trx_operation_state trx_tables_in_use trx_tables_locked trx_lock_structs trx_lock_memory_bytes trx_rows_locked trx_rows_modified trx_concurrency_tickets trx_isolation_level trx_unique_checks trx_foreign_key_checks trx_last_foreign_key_error trx_is_read_only trx_autocommit_non_locking
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
+ lock_id lock_trx_id lock_mode lock_type lock_table lock_index lock_space lock_page lock_rec lock_data
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
+ requesting_trx_id requested_lock_id blocking_trx_id blocking_lock_id
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_CMP;
+ page_size compress_ops compress_ops_ok compress_time uncompress_ops uncompress_time
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_CMP_RESET;
+ page_size compress_ops compress_ops_ok compress_time uncompress_ops uncompress_time
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_CMP_PER_INDEX;
+ database_name table_name index_name compress_ops compress_ops_ok compress_time uncompress_ops uncompress_time
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_CMP_PER_INDEX_RESET;
+ database_name table_name index_name compress_ops compress_ops_ok compress_time uncompress_ops uncompress_time
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_CMPMEM;
+ page_size buffer_pool_instance pages_used pages_free relocation_ops relocation_time
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_CMPMEM_RESET;
+ page_size buffer_pool_instance pages_used pages_free relocation_ops relocation_time
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS;
+ NAME SUBSYSTEM COUNT MAX_COUNT MIN_COUNT AVG_COUNT COUNT_RESET MAX_COUNT_RESET MIN_COUNT_RESET AVG_COUNT_RESET TIME_ENABLED TIME_DISABLED TIME_ELAPSED TIME_RESET STATUS TYPE COMMENT
+ metadata_table_handles_opened metadata 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of table handles opened
+ metadata_table_handles_closed metadata 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of table handles closed
+ metadata_table_reference_count metadata 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Table reference counter
+ lock_deadlocks lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of deadlocks
+ lock_timeouts lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of lock timeouts
+ lock_rec_lock_waits lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of times enqueued into record lock wait queue
+ lock_table_lock_waits lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of times enqueued into table lock wait queue
+ lock_rec_lock_requests lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of record locks requested
+ lock_rec_lock_created lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of record locks created
+ lock_rec_lock_removed lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of record locks removed from the lock queue
+ lock_rec_locks lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Current number of record locks on tables
+ lock_table_lock_created lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of table locks created
+ lock_table_lock_removed lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of table locks removed from the lock queue
+ lock_table_locks lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Current number of table locks on tables
+ lock_row_lock_current_waits lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of row locks currently being waited for (innodb_row_lock_current_waits)
+ lock_row_lock_time lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Time spent in acquiring row locks, in milliseconds (innodb_row_lock_time)
+ lock_row_lock_time_max lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value The maximum time to acquire a row lock, in milliseconds (innodb_row_lock_time_max)
+ lock_row_lock_waits lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of times a row lock had to be waited for (innodb_row_lock_waits)
+ lock_row_lock_time_avg lock 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value The average time to acquire a row lock, in milliseconds (innodb_row_lock_time_avg)
+ buffer_pool_size server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Server buffer pool size (all buffer pools) in bytes
+ buffer_pool_reads buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of reads directly from disk (innodb_buffer_pool_reads)
+ buffer_pool_read_requests buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of logical read requests (innodb_buffer_pool_read_requests)
+ buffer_pool_write_requests buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of write requests (innodb_buffer_pool_write_requests)
+ buffer_pool_wait_free buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of times waited for free buffer (innodb_buffer_pool_wait_free)
+ buffer_pool_read_ahead buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of pages read as read ahead (innodb_buffer_pool_read_ahead)
+ buffer_pool_read_ahead_evicted buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Read-ahead pages evicted without being accessed (innodb_buffer_pool_read_ahead_evicted)
+ buffer_pool_pages_total buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Total buffer pool size in pages (innodb_buffer_pool_pages_total)
+ buffer_pool_pages_misc buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Buffer pages for misc use such as row locks or the adaptive hash index (innodb_buffer_pool_pages_misc)
+ buffer_pool_pages_data buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Buffer pages containing data (innodb_buffer_pool_pages_data)
+ buffer_pool_bytes_data buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Buffer bytes containing data (innodb_buffer_pool_bytes_data)
+ buffer_pool_pages_dirty buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Buffer pages currently dirty (innodb_buffer_pool_pages_dirty)
+ buffer_pool_bytes_dirty buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Buffer bytes currently dirty (innodb_buffer_pool_bytes_dirty)
+ buffer_pool_pages_free buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Buffer pages currently free (innodb_buffer_pool_pages_free)
+ buffer_pages_created buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of pages created (innodb_pages_created)
+ buffer_pages_written buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of pages written (innodb_pages_written)
+ buffer_index_pages_written buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of index pages written (innodb_index_pages_written)
+ buffer_non_index_pages_written buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of non index pages written (innodb_non_index_pages_written)
+ buffer_pages_read buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of pages read (innodb_pages_read)
-buffer_pages0_read buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of page 0 read (innodb_pages0_read)
+ buffer_index_sec_rec_cluster_reads buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of secondary record reads triggered cluster read
+ buffer_index_sec_rec_cluster_reads_avoided buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of secondary record reads avoided triggering cluster read
+ buffer_data_reads buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Amount of data read in bytes (innodb_data_reads)
+ buffer_data_written buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Amount of data written in bytes (innodb_data_written)
+ buffer_flush_batch_scanned buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total pages scanned as part of flush batch
+ buffer_flush_batch_num_scan buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of times buffer flush list flush is called
+ buffer_flush_batch_scanned_per_call buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Pages scanned per flush batch scan
+ buffer_flush_batch_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total pages flushed as part of flush batch
+ buffer_flush_batches buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of flush batches
+ buffer_flush_batch_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Pages queued as a flush batch
+ buffer_flush_neighbor_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total neighbors flushed as part of neighbor flush
+ buffer_flush_neighbor buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of times neighbors flushing is invoked
+ buffer_flush_neighbor_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Pages queued as a neighbor batch
+ buffer_flush_n_to_flush_requested buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of pages requested for flushing.
+ buffer_flush_n_to_flush_by_age buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of pages target by LSN Age for flushing.
+ buffer_flush_adaptive_avg_time_slot buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Avg time (ms) spent for adaptive flushing recently per slot.
+ buffer_LRU_batch_flush_avg_time_slot buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Avg time (ms) spent for LRU batch flushing recently per slot.
+ buffer_flush_adaptive_avg_time_thread buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Avg time (ms) spent for adaptive flushing recently per thread.
+ buffer_LRU_batch_flush_avg_time_thread buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Avg time (ms) spent for LRU batch flushing recently per thread.
+ buffer_flush_adaptive_avg_time_est buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Estimated time (ms) spent for adaptive flushing recently.
+ buffer_LRU_batch_flush_avg_time_est buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Estimated time (ms) spent for LRU batch flushing recently.
+ buffer_flush_avg_time buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Avg time (ms) spent for flushing recently.
+ buffer_flush_adaptive_avg_pass buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Numner of adaptive flushes passed during the recent Avg period.
+ buffer_LRU_batch_flush_avg_pass buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of LRU batch flushes passed during the recent Avg period.
+ buffer_flush_avg_pass buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of flushes passed during the recent Avg period.
+ buffer_LRU_get_free_loops buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Total loops in LRU get free.
+ buffer_LRU_get_free_waits buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Total sleep waits in LRU get free.
+ buffer_flush_avg_page_rate buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Average number of pages at which flushing is happening
+ buffer_flush_lsn_avg_rate buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Average redo generation rate
+ buffer_flush_pct_for_dirty buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Percent of IO capacity used to avoid max dirty page limit
+ buffer_flush_pct_for_lsn buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Percent of IO capacity used to avoid reusable redo space limit
+ buffer_flush_sync_waits buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of times a wait happens due to sync flushing
+ buffer_flush_adaptive_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total pages flushed as part of adaptive flushing
+ buffer_flush_adaptive buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of adaptive batches
+ buffer_flush_adaptive_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Pages queued as an adaptive batch
+ buffer_flush_sync_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total pages flushed as part of sync batches
+ buffer_flush_sync buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of sync batches
+ buffer_flush_sync_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Pages queued as a sync batch
+ buffer_flush_background_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total pages flushed as part of background batches
+ buffer_flush_background buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of background batches
+ buffer_flush_background_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Pages queued as a background batch
+ buffer_LRU_batch_scanned buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total pages scanned as part of LRU batch
+ buffer_LRU_batch_num_scan buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of times LRU batch is called
+ buffer_LRU_batch_scanned_per_call buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Pages scanned per LRU batch call
+ buffer_LRU_batch_flush_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total pages flushed as part of LRU batches
+ buffer_LRU_batches_flush buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of LRU batches
+ buffer_LRU_batch_flush_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Pages queued as an LRU batch
+ buffer_LRU_batch_evict_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total pages evicted as part of LRU batches
+ buffer_LRU_batches_evict buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of LRU batches
+ buffer_LRU_batch_evict_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Pages queued as an LRU batch
+ buffer_LRU_single_flush_scanned buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total pages scanned as part of single page LRU flush
+ buffer_LRU_single_flush_num_scan buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of times single page LRU flush is called
+ buffer_LRU_single_flush_scanned_per_call buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Page scanned per single LRU flush
+ buffer_LRU_single_flush_failure_count Buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of times attempt to flush a single page from LRU failed
+ buffer_LRU_get_free_search Buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of searches performed for a clean page
+ buffer_LRU_search_scanned buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total pages scanned as part of LRU search
+ buffer_LRU_search_num_scan buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of times LRU search is performed
+ buffer_LRU_search_scanned_per_call buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Page scanned per single LRU search
+ buffer_LRU_unzip_search_scanned buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_owner Total pages scanned as part of LRU unzip search
+ buffer_LRU_unzip_search_num_scan buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Number of times LRU unzip search is performed
+ buffer_LRU_unzip_search_scanned_per_call buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled set_member Page scanned per single LRU unzip search
+ buffer_page_read_index_leaf buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Index Leaf Pages read
+ buffer_page_read_index_non_leaf buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Index Non-leaf Pages read
+ buffer_page_read_index_ibuf_leaf buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Insert Buffer Index Leaf Pages read
+ buffer_page_read_index_ibuf_non_leaf buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Insert Buffer Index Non-Leaf Pages read
+ buffer_page_read_undo_log buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Undo Log Pages read
+ buffer_page_read_index_inode buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Index Inode Pages read
+ buffer_page_read_ibuf_free_list buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Insert Buffer Free List Pages read
+ buffer_page_read_ibuf_bitmap buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Insert Buffer Bitmap Pages read
+ buffer_page_read_system_page buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of System Pages read
+ buffer_page_read_trx_system buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Transaction System Pages read
+ buffer_page_read_fsp_hdr buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of File Space Header Pages read
+ buffer_page_read_xdes buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Extent Descriptor Pages read
+ buffer_page_read_blob buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Uncompressed BLOB Pages read
+ buffer_page_read_zblob buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of First Compressed BLOB Pages read
+ buffer_page_read_zblob2 buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Subsequent Compressed BLOB Pages read
+ buffer_page_read_other buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of other/unknown (old version of InnoDB) Pages read
+ buffer_page_written_index_leaf buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Index Leaf Pages written
+ buffer_page_written_index_non_leaf buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Index Non-leaf Pages written
+ buffer_page_written_index_ibuf_leaf buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Insert Buffer Index Leaf Pages written
+ buffer_page_written_index_ibuf_non_leaf buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Insert Buffer Index Non-Leaf Pages written
+ buffer_page_written_undo_log buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Undo Log Pages written
+ buffer_page_written_index_inode buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Index Inode Pages written
+ buffer_page_written_ibuf_free_list buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Insert Buffer Free List Pages written
+ buffer_page_written_ibuf_bitmap buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Insert Buffer Bitmap Pages written
+ buffer_page_written_system_page buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of System Pages written
+ buffer_page_written_trx_system buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Transaction System Pages written
+ buffer_page_written_fsp_hdr buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of File Space Header Pages written
+ buffer_page_written_xdes buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Extent Descriptor Pages written
+ buffer_page_written_blob buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Uncompressed BLOB Pages written
+ buffer_page_written_zblob buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of First Compressed BLOB Pages written
+ buffer_page_written_zblob2 buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Subsequent Compressed BLOB Pages written
+ buffer_page_written_other buffer_page_io 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of other/unknown (old version InnoDB) Pages written
+ os_data_reads os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of reads initiated (innodb_data_reads)
+ os_data_writes os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of writes initiated (innodb_data_writes)
+ os_data_fsyncs os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of fsync() calls (innodb_data_fsyncs)
+ os_pending_reads os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of reads pending
+ os_pending_writes os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of writes pending
+ os_log_bytes_written os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Bytes of log written (innodb_os_log_written)
+ os_log_fsyncs os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of fsync log writes (innodb_os_log_fsyncs)
+ os_log_pending_fsyncs os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of pending fsync write (innodb_os_log_pending_fsyncs)
+ os_log_pending_writes os 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of pending log file writes (innodb_os_log_pending_writes)
+ trx_rw_commits transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of read-write transactions committed
+ trx_ro_commits transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of read-only transactions committed
+ trx_nl_ro_commits transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of non-locking auto-commit read-only transactions committed
+ trx_commits_insert_update transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of transactions committed with inserts and updates
+ trx_rollbacks transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of transactions rolled back
+ trx_rollbacks_savepoint transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of transactions rolled back to savepoint
-trx_rollback_active transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of resurrected active transactions rolled back
+ trx_active_transactions transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of active transactions
+ trx_rseg_history_len transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Length of the TRX_RSEG_HISTORY list
+ trx_undo_slots_used transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of undo slots used
+ trx_undo_slots_cached transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of undo slots cached
+ trx_rseg_current_size transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Current rollback segment size in pages
+ purge_del_mark_records purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of delete-marked rows purged
+ purge_upd_exist_or_extern_records purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of purges on updates of existing records and updates on delete marked record with externally stored field
+ purge_invoked purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of times purge was invoked
+ purge_undo_log_pages purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of undo log pages handled by the purge
+ purge_dml_delay_usec purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Microseconds DML to be delayed due to purge lagging
+ purge_stop_count purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Number of times purge was stopped
+ purge_resume_count purge 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Number of times purge was resumed
+ log_checkpoints recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of checkpoints
+ log_lsn_last_flush recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value LSN of Last flush
+ log_lsn_last_checkpoint recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value LSN at last checkpoint
+ log_lsn_current recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Current LSN value
+ log_lsn_checkpoint_age recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Current LSN value minus LSN at last checkpoint
+ log_lsn_buf_pool_oldest recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value The oldest modified block LSN in the buffer pool
+ log_max_modified_age_async recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Maximum LSN difference; when exceeded, start asynchronous preflush
+ log_max_modified_age_sync recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Maximum LSN difference; when exceeded, start synchronous preflush
+ log_pending_log_flushes recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Pending log flushes
+ log_pending_checkpoint_writes recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Pending checkpoints
+ log_num_log_io recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Number of log I/Os
+ log_waits recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of log waits due to small log buffer (innodb_log_waits)
+ log_write_requests recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of log write requests (innodb_log_write_requests)
+ log_writes recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of log writes (innodb_log_writes)
+ log_padded recovery 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Bytes of log padded for log write ahead
+ compress_pages_compressed compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of pages compressed
+ compress_pages_decompressed compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of pages decompressed
+ compression_pad_increments compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of times padding is incremented to avoid compression failures
+ compression_pad_decrements compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of times padding is decremented due to good compressibility
+ compress_saved compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of bytes saved by page compression
+ compress_pages_page_compressed compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of pages compressed by page compression
+ compress_page_compressed_trim_op compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of TRIM operation performed by page compression
+ compress_pages_page_decompressed compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of pages decompressed by page compression
+ compress_pages_page_compression_error compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of page compression errors
+ compress_pages_encrypted compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of pages encrypted
+ compress_pages_decrypted compression 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of pages decrypted
+ index_page_splits index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of index page splits
+ index_page_merge_attempts index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of index page merge attempts
+ index_page_merge_successful index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of successful index page merges
+ index_page_reorg_attempts index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of index page reorganization attempts
+ index_page_reorg_successful index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of successful index page reorganizations
+ index_page_discards index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of index pages discarded
+ adaptive_hash_searches adaptive_hash_index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of successful searches using Adaptive Hash Index
+ adaptive_hash_searches_btree adaptive_hash_index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of searches using B-tree on an index search
+ adaptive_hash_pages_added adaptive_hash_index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of index pages on which the Adaptive Hash Index is built
+ adaptive_hash_pages_removed adaptive_hash_index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of index pages whose corresponding Adaptive Hash Index entries were removed
+ adaptive_hash_rows_added adaptive_hash_index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Adaptive Hash Index rows added
+ adaptive_hash_rows_removed adaptive_hash_index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Adaptive Hash Index rows removed
+ adaptive_hash_rows_deleted_no_hash_entry adaptive_hash_index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of rows deleted that did not have corresponding Adaptive Hash Index entries
+ adaptive_hash_rows_updated adaptive_hash_index 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of Adaptive Hash Index rows updated
+ file_num_open_files file_system 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Number of files currently open (innodb_num_open_files)
+ ibuf_merges_insert change_buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of inserted records merged by change buffering
+ ibuf_merges_delete_mark change_buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of deleted records merged by change buffering
+ ibuf_merges_delete change_buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of purge records merged by change buffering
+ ibuf_merges_discard_insert change_buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of insert merged operations discarded
+ ibuf_merges_discard_delete_mark change_buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of deleted merged operations discarded
+ ibuf_merges_discard_delete change_buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of purge merged operations discarded
+ ibuf_merges change_buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of change buffer merges
+ ibuf_size change_buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Change buffer size in pages
+ innodb_master_thread_sleeps server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of times (seconds) master thread sleeps
+ innodb_activity_count server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Current server activity count
+ innodb_master_active_loops server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of times master thread performs its tasks when server is active
+ innodb_master_idle_loops server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of times master thread performs its tasks when server is idle
+ innodb_background_drop_table_usec server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Time (in microseconds) spent to process drop table list
+ innodb_ibuf_merge_usec server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Time (in microseconds) spent to process change buffer merge
+ innodb_log_flush_usec server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Time (in microseconds) spent to flush log records
+ innodb_mem_validate_usec server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Time (in microseconds) spent to do memory validation
+ innodb_master_purge_usec server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Time (in microseconds) spent by master thread to purge records
+ innodb_dict_lru_usec server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Time (in microseconds) spent to process DICT LRU list
+ innodb_dict_lru_count_active server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of tables evicted from DICT LRU list in the active loop
+ innodb_dict_lru_count_idle server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of tables evicted from DICT LRU list in the idle loop
+ innodb_checkpoint_usec server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Time (in microseconds) spent by master thread to do checkpoint
+ innodb_dblwr_writes server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of doublewrite operations that have been performed (innodb_dblwr_writes)
+ innodb_dblwr_pages_written server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of pages that have been written for doublewrite operations (innodb_dblwr_pages_written)
+ innodb_page_size server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value InnoDB page size in bytes (innodb_page_size)
+ innodb_rwlock_s_spin_waits server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of rwlock spin waits due to shared latch request
+ innodb_rwlock_x_spin_waits server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of rwlock spin waits due to exclusive latch request
+ innodb_rwlock_sx_spin_waits server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of rwlock spin waits due to sx latch request
+ innodb_rwlock_s_spin_rounds server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of rwlock spin loop rounds due to shared latch request
+ innodb_rwlock_x_spin_rounds server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of rwlock spin loop rounds due to exclusive latch request
+ innodb_rwlock_sx_spin_rounds server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of rwlock spin loop rounds due to sx latch request
+ innodb_rwlock_s_os_waits server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of OS waits due to shared latch request
+ innodb_rwlock_x_os_waits server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of OS waits due to exclusive latch request
+ innodb_rwlock_sx_os_waits server 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of OS waits due to sx latch request
+ dml_reads dml 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of rows read
+ dml_inserts dml 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of rows inserted
+ dml_deletes dml 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of rows deleted
+ dml_updates dml 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of rows updated
+ dml_system_reads dml 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of system rows read
+ dml_system_inserts dml 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of system rows inserted
+ dml_system_deletes dml 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of system rows deleted
+ dml_system_updates dml 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of system rows updated
+ ddl_background_drop_indexes ddl 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of indexes waiting to be dropped after failed index creation
+ ddl_background_drop_tables ddl 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of tables in background drop table list
+ ddl_online_create_index ddl 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of indexes being created online
+ ddl_pending_alter_table ddl 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of ALTER TABLE, CREATE INDEX, DROP INDEX in progress
+ ddl_sort_file_alter_table ddl 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of sort files created during alter table
+ ddl_log_file_alter_table ddl 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of log files created during alter table
+ icp_attempts icp 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of attempts for index push-down condition checks
+ icp_no_match icp 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Index push-down condition does not match
+ icp_out_of_range icp 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Index push-down condition out of range
+ icp_match icp 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Index push-down condition matches
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
+ value
+ a
+ about
+ an
+ are
+ as
+ at
+ be
+ by
+ com
+ de
+ en
+ for
+ from
+ how
+ i
+ in
+ is
+ it
+ la
+ of
+ on
+ or
+ that
+ the
+ this
+ to
+ was
+ what
+ when
+ where
+ who
+ will
+ with
+ und
+ the
+ www
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
+ DOC_ID
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_BEING_DELETED;
+ DOC_ID
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;
+ WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE;
+ WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_CONFIG;
+ KEY VALUE
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_POOL_STATS;
+ POOL_ID POOL_SIZE FREE_BUFFERS DATABASE_PAGES OLD_DATABASE_PAGES MODIFIED_DATABASE_PAGES PENDING_DECOMPRESS PENDING_READS PENDING_FLUSH_LRU PENDING_FLUSH_LIST PAGES_MADE_YOUNG PAGES_NOT_MADE_YOUNG PAGES_MADE_YOUNG_RATE PAGES_MADE_NOT_YOUNG_RATE NUMBER_PAGES_READ NUMBER_PAGES_CREATED NUMBER_PAGES_WRITTEN PAGES_READ_RATE PAGES_CREATE_RATE PAGES_WRITTEN_RATE NUMBER_PAGES_GET HIT_RATE YOUNG_MAKE_PER_THOUSAND_GETS NOT_YOUNG_MAKE_PER_THOUSAND_GETS NUMBER_PAGES_READ_AHEAD NUMBER_READ_AHEAD_EVICTED READ_AHEAD_RATE READ_AHEAD_EVICTED_RATE LRU_IO_TOTAL LRU_IO_CURRENT UNCOMPRESS_TOTAL UNCOMPRESS_CURRENT
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE;
+ POOL_ID BLOCK_ID SPACE PAGE_NUMBER PAGE_TYPE FLUSH_TYPE FIX_COUNT IS_HASHED NEWEST_MODIFICATION OLDEST_MODIFICATION ACCESS_TIME TABLE_NAME INDEX_NAME NUMBER_RECORDS DATA_SIZE COMPRESSED_SIZE PAGE_STATE IO_FIX IS_OLD FREE_PAGE_CLOCK
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE_LRU;
+ POOL_ID LRU_POSITION SPACE PAGE_NUMBER PAGE_TYPE FLUSH_TYPE FIX_COUNT IS_HASHED NEWEST_MODIFICATION OLDEST_MODIFICATION ACCESS_TIME TABLE_NAME INDEX_NAME NUMBER_RECORDS DATA_SIZE COMPRESSED_SIZE COMPRESSED IO_FIX IS_OLD FREE_PAGE_CLOCK
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES;
+ TABLE_ID NAME FLAG N_COLS SPACE ROW_FORMAT ZIP_PAGE_SIZE SPACE_TYPE
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS;
+ TABLE_ID NAME STATS_INITIALIZED NUM_ROWS CLUST_INDEX_SIZE OTHER_INDEX_SIZE MODIFIED_COUNTER AUTOINC REF_COUNT
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES;
+ INDEX_ID NAME TABLE_ID TYPE N_FIELDS PAGE_NO SPACE MERGE_THRESHOLD
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS;
+ TABLE_ID NAME POS MTYPE PRTYPE LEN
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FIELDS;
+ INDEX_ID NAME POS
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN;
+ ID FOR_NAME REF_NAME N_COLS TYPE
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS;
+ ID FOR_COL_NAME REF_COL_NAME POS
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES;
+ SPACE NAME FLAG ROW_FORMAT PAGE_SIZE ZIP_PAGE_SIZE SPACE_TYPE FS_BLOCK_SIZE FILE_SIZE ALLOCATED_SIZE
+ SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_DATAFILES;
+ SPACE PATH
diff --cc storage/tokudb/mysql-test/rpl/r/rpl_tokudb_mixed_dml.result
index df3ea1d6de6,5f41fd328c9..a639bf6e76c
--- a/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_mixed_dml.result
+++ b/storage/tokudb/mysql-test/rpl/r/rpl_tokudb_mixed_dml.result
@@@ -680,8 -679,11 +680,10 @@@ DROP TRIGGER tr1
******************** EVENTS ********************
-GRANT EVENT ON *.* TO 'root'@'localhost';
INSERT INTO t1 VALUES(1, 'test1');
CREATE EVENT e1 ON SCHEDULE EVERY '1' SECOND COMMENT 'e_second_comment' DO DELETE FROM t1;
+ Warnings:
+ Warning 1105 Event scheduler is switched off, use SET GLOBAL event_scheduler=ON to enable it.
SHOW EVENTS;
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
test_rpl e1 root@localhost SYSTEM RECURRING NULL 1 # # NULL ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
diff --cc strings/strcoll.ic
index 9dfccb9018c,eb5b3d5fe9b..50278135dd4
--- a/strings/strcoll.ic
+++ b/strings/strcoll.ic
@@@ -12,9 -12,10 +12,9 @@@
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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
*/
-
#ifndef MY_FUNCTION_NAME
#error MY_FUNCTION_NAME is not defined
#endif
diff --cc tests/mysql_client_test.c
index 2c95bac1e21,88e28f79789..40fbffa57bc
--- a/tests/mysql_client_test.c
+++ b/tests/mysql_client_test.c
@@@ -8397,50 -8397,26 +8397,70 @@@ static void test_list_fields(
}
+ /* Test mysql_list_fields() with information_schema */
+
+ static void test_list_information_schema_fields()
+ {
+ MYSQL_RES *result;
+ int rc;
+ myheader("test_list_information_schema_fields");
+
+ rc= mysql_select_db(mysql, "information_schema");
+ myquery(rc);
+ result= mysql_list_fields(mysql, "all_plugins", NULL);
+ mytest(result);
+ rc= my_process_result_set(result);
+ DIE_UNLESS(rc == 0);
+ mysql_free_result(result);
+ rc= mysql_select_db(mysql, current_db);
+ myquery(rc);
+ }
+
+
+static void test_list_fields_blob()
+{
+ MYSQL_RES *result;
+ int rc;
+ myheader("test_list_fields_blob");
+
+ rc= mysql_query(mysql, "drop table if exists t1");
+ myquery(rc);
+
+ rc= mysql_query(mysql, "create table t1(c1 tinyblob, c2 blob, c3 mediumblob, c4 longblob)");
+ myquery(rc);
+
+ result= mysql_list_fields(mysql, "t1", NULL);
+ mytest(result);
+
+ rc= my_process_result_set(result);
+ DIE_UNLESS(rc == 0);
+
+ /*
+ All BLOB variant Fields are displayed as MYSQL_TYPE_BLOB in
+ the result set metadata. Note, some Items display the exact
+ BLOB type. This inconsistency should be fixed eventually.
+ */
+ verify_prepare_field(result, 0, "c1", "c1", MYSQL_TYPE_BLOB,
+ "t1", "t1",
+ current_db, 255, NULL);
+
+ verify_prepare_field(result, 1, "c2", "c2", MYSQL_TYPE_BLOB,
+ "t1", "t1",
+ current_db, 65535, NULL);
+
+ verify_prepare_field(result, 2, "c3", "c3", MYSQL_TYPE_BLOB,
+ "t1", "t1",
+ current_db, 16777215, NULL);
+
+ verify_prepare_field(result, 3, "c4", "c4", MYSQL_TYPE_BLOB,
+ "t1", "t1",
+ current_db, 4294967295ULL, NULL);
+
+ mysql_free_result(result);
+ myquery(mysql_query(mysql, "drop table t1"));
+}
+
+
static void test_list_fields_default()
{
int rc, i;
@@@ -20946,7 -20885,7 +20966,8 @@@ static struct my_tests_st my_tests[]=
{ "test_fetch_column", test_fetch_column },
{ "test_mem_overun", test_mem_overun },
{ "test_list_fields", test_list_fields },
+ { "test_list_information_schema_fields", test_list_information_schema_fields },
+ { "test_list_fields_blob", test_list_fields_blob },
{ "test_list_fields_default", test_list_fields_default },
{ "test_free_result", test_free_result },
{ "test_free_store_result", test_free_store_result },
1
0

[Commits] 2c9844a: MDEV-18896 Crash in convert_join_subqueries_to_semijoins : Correction
by IgorBabaev 19 May '19
by IgorBabaev 19 May '19
19 May '19
revision-id: 2c9844a438c5f0bddcb037a1e05978118f48abb6 (mariadb-5.5.64-6-g2c9844a)
parent(s): 5543b75550962f07b4adcd47a6e52accec0a7d0f
author: Igor Babaev
committer: Igor Babaev
timestamp: 2019-05-19 11:44:34 -0700
message:
MDEV-18896 Crash in convert_join_subqueries_to_semijoins : Correction
This patch complements the original patch for MDEV-18896 that prevents
conversions to semi-joins in tableless selects used in INSERT statements
in post-5.5 versions of the server.
The test case was corrected as well to ensure that potential conversion
to jtbm semi-joins is also checked (the problem was that one of
the preceeding testcases in subselect_sj.test did not restore the
state of the optimizer switch leaving the 'materialization' in the state
'off' and so blocking this check).
Noticed an inconsistency in the state of select_lex::table_list used
in INSERT statements and left a comment about this.
---
mysql-test/r/subselect_sj.result | 1 +
mysql-test/r/subselect_sj_jcl6.result | 1 +
mysql-test/t/subselect_sj.test | 2 ++
sql/opt_subselect.cc | 2 +-
sql/sql_parse.cc | 7 +++++++
5 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/mysql-test/r/subselect_sj.result b/mysql-test/r/subselect_sj.result
index 73c620b..d0b8b62 100644
--- a/mysql-test/r/subselect_sj.result
+++ b/mysql-test/r/subselect_sj.result
@@ -3181,6 +3181,7 @@ drop table t1,t2,t3;
#
# MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT
#
+set @@optimizer_switch= @subselect_sj_tmp;
create table t1 (a1 varchar(25));
create table t2 (a2 varchar(25)) ;
insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2);
diff --git a/mysql-test/r/subselect_sj_jcl6.result b/mysql-test/r/subselect_sj_jcl6.result
index 03cf368..e9a8b73 100644
--- a/mysql-test/r/subselect_sj_jcl6.result
+++ b/mysql-test/r/subselect_sj_jcl6.result
@@ -3195,6 +3195,7 @@ drop table t1,t2,t3;
#
# MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT
#
+set @@optimizer_switch= @subselect_sj_tmp;
create table t1 (a1 varchar(25));
create table t2 (a2 varchar(25)) ;
insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2);
diff --git a/mysql-test/t/subselect_sj.test b/mysql-test/t/subselect_sj.test
index aabb21b..6b59049 100644
--- a/mysql-test/t/subselect_sj.test
+++ b/mysql-test/t/subselect_sj.test
@@ -2873,6 +2873,8 @@ drop table t1,t2,t3;
--echo # MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT
--echo #
+set @@optimizer_switch= @subselect_sj_tmp;
+
create table t1 (a1 varchar(25));
create table t2 (a2 varchar(25)) ;
insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2);
diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc
index fee68d3..a0e19af 100644
--- a/sql/opt_subselect.cc
+++ b/sql/opt_subselect.cc
@@ -525,7 +525,7 @@ bool is_materialization_applicable(THD *thd, Item_in_subselect *in_subs,
parent_unit->first_select()->leaf_tables.elements && // 2
(thd->lex->sql_command == SQLCOM_SELECT || // *
thd->lex->sql_command == SQLCOM_CREATE_TABLE) && // *
- child_select->outer_select()->leaf_tables.elements && // 2A
+ child_select->outer_select()->table_list.first && // 2A
subquery_types_allow_materialization(in_subs) &&
(in_subs->is_top_level_item() || //3
optimizer_flag(thd,
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 4ed2bca..1d5733a 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -3034,6 +3034,13 @@ case SQLCOM_PREPARE:
*/
/* Skip first table, which is the table we are inserting in */
TABLE_LIST *second_table= first_table->next_local;
+ /*
+ This is a hack: this leaves select_lex->table_list in an inconsistent
+ state as 'elements' does not contain number of elements in the list.
+ Moreover, if second_table == NULL then 'next' becomes invalid.
+ TODO: fix it by removing the front element (restoring of it should
+ be done properly as well)
+ */
select_lex->table_list.first= second_table;
select_lex->context.table_list=
select_lex->context.first_name_resolution_table= second_table;
1
0

[Commits] 66349551bf3: MDEV-16214: Incorrect plan taken by the optimizer , uses INDEX instead of ref access with ORDER BY
by Varun 19 May '19
by Varun 19 May '19
19 May '19
revision-id: 66349551bf3a266fbefaebfe044abd05108723c2 (mariadb-10.3.12-205-g66349551bf3)
parent(s): 3d56adbfac394b2b3ffd22a89fe7c2978ed9a505
author: Varun Gupta
committer: Varun Gupta
timestamp: 2019-05-17 13:44:05 +0530
message:
MDEV-16214: Incorrect plan taken by the optimizer , uses INDEX instead of ref access with ORDER BY
The issue in this case is that we take in account the estimates from quick keys instead of rec_per_key.
The estimates for quick keys are better than rec_per_key only if we have ref(const), so we need to check
that all keyparts in the ref key are of the type ref(const).
---
mysql-test/main/order_by.result | 57 +++++++++++++++++++++++++++++++++++++++++
mysql-test/main/order_by.test | 37 ++++++++++++++++++++++++++
sql/sql_select.cc | 42 ++++++++++++++++++++----------
3 files changed, 122 insertions(+), 14 deletions(-)
diff --git a/mysql-test/main/order_by.result b/mysql-test/main/order_by.result
index db096acb162..8d1e471f618 100644
--- a/mysql-test/main/order_by.result
+++ b/mysql-test/main/order_by.result
@@ -3266,3 +3266,60 @@ NULLIF(GROUP_CONCAT(v1), null)
C
B
DROP TABLE t1;
+#
+# MDEV-16214: Incorrect plan taken by the optimizer , uses INDEX instead of ref access with ORDER BY
+#
+create table t1(a int);
+insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+create table t2(
+id int primary key,
+key1 int,key2 int,
+col1 int,
+key(key1), key(key2)
+);
+insert into t2
+select
+A.a + B.a*10 + C.a*100,
+A.a + 10*B.a, A.a + 10*B.a,
+123456
+from t1 A, t1 B, t1 C;
+# here type should show ref not index
+explain select
+(SELECT concat(id, '-', key1, '-', col1)
+FROM t2
+WHERE
+t2.key1 = t1.a and t2.key1 IS NOT NULL
+ORDER BY
+t2.key2 ASC
+LIMIT 1)
+from t1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t1 ALL NULL NULL NULL NULL 10
+2 DEPENDENT SUBQUERY t2 ref key1 key1 5 test.t1.a 10 Using index condition; Using where; Using filesort
+select
+(SELECT concat(id, '-', key1, '-', col1)
+FROM t2
+WHERE
+t2.key1 = t1.a and t2.key1 IS NOT NULL
+ORDER BY
+t2.key2 ASC
+LIMIT 1)
+from t1;
+(SELECT concat(id, '-', key1, '-', col1)
+FROM t2
+WHERE
+t2.key1 = t1.a and t2.key1 IS NOT NULL
+ORDER BY
+t2.key2 ASC
+LIMIT 1)
+900-0-123456
+901-1-123456
+902-2-123456
+903-3-123456
+904-4-123456
+905-5-123456
+906-6-123456
+907-7-123456
+908-8-123456
+909-9-123456
+drop table t1,t2;
diff --git a/mysql-test/main/order_by.test b/mysql-test/main/order_by.test
index d67c67de89c..58b91fbda91 100644
--- a/mysql-test/main/order_by.test
+++ b/mysql-test/main/order_by.test
@@ -2201,3 +2201,40 @@ GROUP BY id
ORDER BY id+1 DESC;
DROP TABLE t1;
+
+--echo #
+--echo # MDEV-16214: Incorrect plan taken by the optimizer , uses INDEX instead of ref access with ORDER BY
+--echo #
+
+create table t1(a int);
+insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
+
+create table t2(
+ id int primary key,
+ key1 int,key2 int,
+ col1 int,
+ key(key1), key(key2)
+);
+
+insert into t2
+ select
+ A.a + B.a*10 + C.a*100,
+ A.a + 10*B.a, A.a + 10*B.a,
+ 123456
+from t1 A, t1 B, t1 C;
+
+let $query= select
+ (SELECT concat(id, '-', key1, '-', col1)
+ FROM t2
+ WHERE
+ t2.key1 = t1.a and t2.key1 IS NOT NULL
+ ORDER BY
+ t2.key2 ASC
+ LIMIT 1)
+ from t1;
+
+--echo # here type should show ref not index
+eval explain $query;
+eval $query;
+
+drop table t1,t2;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index f36a68bc7ae..8cdcf3afc8b 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -9986,31 +9986,35 @@ static bool create_ref_for_key(JOIN *join, JOIN_TAB *j,
j->ref.null_rejecting|= (key_part_map)1 << i;
keyuse_uses_no_tables= keyuse_uses_no_tables && !keyuse->used_tables;
/*
- Todo: we should remove this check for thd->lex->describe on the next
- line. With SHOW EXPLAIN code, EXPLAIN printout code no longer depends
- on it. However, removing the check caused change in lots of query
- plans! Does the optimizer depend on the contents of
- table_ref->key_copy ? If yes, do we produce incorrect EXPLAINs?
+ We don't want to compute heavy expressions in EXPLAIN, an example would
+ select * from t1 where t1.key=(select thats very heavy);
+
+ (select thats very heavy) => is a constant here
+ eg: (select avg(order_cost) from orders) => constant but expensive
*/
if (!keyuse->val->used_tables() && !thd->lex->describe)
{ // Compare against constant
- store_key_item tmp(thd,
+ store_key_item tmp(thd,
keyinfo->key_part[i].field,
key_buff + maybe_null,
maybe_null ? key_buff : 0,
keyinfo->key_part[i].length,
keyuse->val,
FALSE);
- if (unlikely(thd->is_fatal_error))
- DBUG_RETURN(TRUE);
- tmp.copy();
+ if (unlikely(thd->is_fatal_error))
+ DBUG_RETURN(TRUE);
+ tmp.copy();
j->ref.const_ref_part_map |= key_part_map(1) << i ;
}
else
- *ref_key++= get_store_key(thd,
- keyuse,join->const_table_map,
- &keyinfo->key_part[i],
- key_buff, maybe_null);
+ {
+ *ref_key++= get_store_key(thd,
+ keyuse,join->const_table_map,
+ &keyinfo->key_part[i],
+ key_buff, maybe_null);
+ if (!keyuse->val->used_tables())
+ j->ref.const_ref_part_map |= key_part_map(1) << i ;
+ }
/*
Remember if we are going to use REF_OR_NULL
But only if field _really_ can be null i.e. we force JT_REF
@@ -25256,6 +25260,8 @@ bool JOIN_TAB::save_explain_data(Explain_table_access *eta,
{
if (!(eta->ref_list.append_str(thd->mem_root, "const")))
return 1;
+ if (thd->lex->describe)
+ key_ref++;
}
else
{
@@ -26921,7 +26927,15 @@ test_if_cheaper_ordering(const JOIN_TAB *tab, ORDER *order, TABLE *table,
*/
if (ref_key >= 0 && ref_key != MAX_KEY && tab->type == JT_REF)
{
- if (table->quick_keys.is_set(ref_key))
+ /*
+ For all the parts of the ref key we check if all of them belong
+ to the type ref(const). This is done because if all parts of the ref
+ key are of type ref(const), then we are sure that the estimates
+ provides by quick keys is better than that provide by rec_per_key.
+ */
+ if (tab->ref.const_ref_part_map == make_prev_keypart_map(tab->ref.key_parts) &&
+ table->quick_keys.is_set(ref_key) &&
+ table->quick_key_parts[ref_key] == tab->ref.key_parts)
refkey_rows_estimate= table->quick_rows[ref_key];
else
{
2
1
revision-id: db844d2c6e6f8e0d7b45631f9335759f41f5a6bf (mariadb-10.4.4-101-gdb844d2c6e6)
parent(s): bcb5ba8f3c3b955f0b83590c7098df5d98c1c01f
author: Oleksandr Byelkin
committer: Oleksandr Byelkin
timestamp: 2019-05-18 09:11:47 +0200
message:
TVC fix
---
mysql-test/main/table_value_constr.result | 20 ++++++++++----------
.../suite/compat/oracle/r/table_value_constr.result | 20 ++++++++++----------
sql/sql_lex.cc | 10 ++++++++++
sql/sql_union.cc | 19 ++++++++++++++++++-
4 files changed, 48 insertions(+), 21 deletions(-)
diff --git a/mysql-test/main/table_value_constr.result b/mysql-test/main/table_value_constr.result
index 318d0a76663..51198ea47d6 100644
--- a/mysql-test/main/table_value_constr.result
+++ b/mysql-test/main/table_value_constr.result
@@ -2337,8 +2337,8 @@ Note 1003 (values (5),(7),(1),(3),(4) limit 1,2) union /* select#2 */ select 2 A
2
explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2) union select 2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
Warnings:
@@ -2350,8 +2350,8 @@ Note 1003 (/* select#1 */ select `tvc_0`.`5` AS `5` from (values (5),(7),(1),(3)
2
explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1) union select 2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
Warnings:
@@ -2398,8 +2398,8 @@ Note 1003 /* select#1 */ select 3 AS `3` union all (/* select#3 */ select `tvc_0
3
explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2) union all select 3;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
Warnings:
@@ -2459,8 +2459,8 @@ Note 1003 (values (5),(7),(1),(3),(4) limit 3,2) union all /* select#2 */ select
5
explain extended (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3 order by 1;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
Warnings:
@@ -2473,8 +2473,8 @@ order by 1 limit 2 offset 1;
explain extended (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3
order by 1 limit 2 offset 1;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
Warnings:
diff --git a/mysql-test/suite/compat/oracle/r/table_value_constr.result b/mysql-test/suite/compat/oracle/r/table_value_constr.result
index f0c7c4eebe1..3e72167d43d 100644
--- a/mysql-test/suite/compat/oracle/r/table_value_constr.result
+++ b/mysql-test/suite/compat/oracle/r/table_value_constr.result
@@ -2331,8 +2331,8 @@ Note 1003 (values (5),(7),(1),(3),(4) limit 1,2) union /* select#2 */ select 2 A
2
explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2) union select 2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
Warnings:
@@ -2344,8 +2344,8 @@ Note 1003 (/* select#1 */ select "tvc_0"."5" AS "5" from (values (5),(7),(1),(3)
2
explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2 offset 1) union select 2;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
Warnings:
@@ -2392,8 +2392,8 @@ Note 1003 /* select#1 */ select 3 AS "3" union all (/* select#3 */ select "tvc_0
3
explain extended (values (5), (7), (1), (3), (4) order by 1 limit 2) union all select 3;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL
Warnings:
@@ -2453,8 +2453,8 @@ Note 1003 (values (5),(7),(1),(3),(4) limit 3,2) union all /* select#2 */ select
5
explain extended (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3 order by 1;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
Warnings:
@@ -2467,8 +2467,8 @@ order by 1 limit 2 offset 1;
explain extended (values (5), (7), (1), (3), (4) order by 1 limit 3 offset 1) union all select 3
order by 1 limit 2 offset 1;
id select_type table type possible_keys key key_len ref rows filtered Extra
-1 SUBQUERY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
-3 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+1 PRIMARY <derived3> ALL NULL NULL NULL NULL 5 100.00 Using filesort
+3 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL No tables used
2 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL NULL Using filesort
Warnings:
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index c02263a1ce7..fecf6d1d723 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -9283,6 +9283,16 @@ SELECT_LEX_UNIT *LEX::parsed_body_select(SELECT_LEX *sel,
return NULL;
SELECT_LEX_UNIT *res= create_unit(sel);
+ if (res && sel->tvc && sel->order_list.elements)
+ {
+ if (res->add_fake_select_lex(thd))
+ return NULL;
+ SELECT_LEX *fake= res->fake_select_lex;
+ fake->order_list= sel->order_list;
+ fake->explicit_limit= sel->explicit_limit;
+ fake->select_limit= sel->select_limit;
+ fake->offset_limit= sel->offset_limit;
+ }
return res;
}
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index c9c260548c1..c40e0cf84f8 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -982,7 +982,24 @@ bool st_select_lex_unit::prepare(TABLE_LIST *derived_arg,
types= first_sl->item_list;
goto cont;
}
-
+
+ if (sl->tvc && sl->order_list.elements &&
+ !sl->tvc->to_be_wrapped_as_with_tail())
+ {
+ if (thd->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW)
+ {
+ sl->master_unit()->fake_select_lex= 0;
+ sl->master_unit()->saved_fake_select_lex= 0;
+ }
+ else
+ {
+ sl->order_list.empty();
+ sl->explicit_limit= 0;
+ sl->select_limit= 0;
+ sl->offset_limit= 0;
+ }
+ }
+
for (;sl; sl= sl->next_select(), union_part_count++)
{
if (sl->tvc)
1
0

[Commits] 91efcc6392c: Better comment from Monty for code in make_join_select
by Sergei Petrunia 17 May '19
by Sergei Petrunia 17 May '19
17 May '19
revision-id: 91efcc6392cef920aa3697dc9789830ae9cdd379 (mariadb-10.1.39-37-g91efcc6392c)
parent(s): c84f390df20c9fa385351d3f21a6f0f48dde1803
author: Sergei Petrunia
committer: Sergei Petrunia
timestamp: 2019-05-17 19:17:19 +0300
message:
Better comment from Monty for code in make_join_select
---
sql/sql_select.cc | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index cb8c0429674..c1bec0f1c20 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -10027,8 +10027,16 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond)
/*
We plan to scan all rows.
Check again if we should use an index.
- We could have used an column from a previous table in
- the index if we are using limit and this is the first table
+
+ There are two cases:
+ 1) There could be an index usage the refers to a previous
+ table that we didn't consider before, but could be consider
+ now as a "last resort". For example
+ SELECT * from t1,t2 where t1.a between t2.a and t2.b;
+ 2) If the current table is the first non const table
+ and there is a limit it still possibly beneficial
+ to use the index even if the index range is big as
+ we can stop when we've found limit rows.
(1) - Don't switch the used index if we are using semi-join
LooseScan on this table. Using different index will not
1
0
revision-id: 8f6292fc0452f57e5b824ac7f26e6c323ebcbaee (mariadb-10.4.4-98-g8f6292fc045)
parent(s): 39786f355fadf0c25527566f1ecba79b94265c2d
author: Oleksandr Byelkin
committer: Oleksandr Byelkin
timestamp: 2019-05-17 17:43:27 +0200
message:
The test fix
---
mysql-test/main/bootstrap.result | 2 ++
1 file changed, 2 insertions(+)
diff --git a/mysql-test/main/bootstrap.result b/mysql-test/main/bootstrap.result
index 96aec014093..2c6f09e0dab 100644
--- a/mysql-test/main/bootstrap.result
+++ b/mysql-test/main/bootstrap.result
@@ -17,6 +17,8 @@ End of 5.1 tests
SELECT 'bug' as '' FROM INFORMATION_SCHEMA.ENGINES WHERE engine='innodb'
and SUPPORT='YES';
+# Kill the server
+# restart
# Kill the server
# restart
End of 5.5 tests
1
0
revision-id: 19dc4726f20732f12655f298b9aa316046968e3f (mariadb-10.4.4-95-g19dc4726f20)
parent(s): fce3074e1979638692c850d45e2dccb463e002b2
author: Oleksandr Byelkin
committer: Oleksandr Byelkin
timestamp: 2019-05-17 16:24:37 +0200
message:
test fix
---
mysql-test/main/bootstrap.test | 2 ++
1 file changed, 2 insertions(+)
diff --git a/mysql-test/main/bootstrap.test b/mysql-test/main/bootstrap.test
index e9f45f85c85..5af7274c878 100644
--- a/mysql-test/main/bootstrap.test
+++ b/mysql-test/main/bootstrap.test
@@ -76,7 +76,9 @@ SELECT 'bug' as '' FROM INFORMATION_SCHEMA.ENGINES WHERE engine='innodb'
--write_file $MYSQLTEST_VARDIR/tmp/1
use test;
EOF
+--source include/kill_mysqld.inc
--exec $MYSQLD_BOOTSTRAP_CMD < $MYSQLTEST_VARDIR/tmp/1 >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1
+--source include/start_mysqld.inc
--remove_file $MYSQLTEST_VARDIR/tmp/1
--echo End of 5.5 tests
1
0
revision-id: fce3074e1979638692c850d45e2dccb463e002b2 (mariadb-10.4.4-94-gfce3074e197)
parent(s): 509de900aff841863d3dff9e376ea5a63e337b7a
author: Oleksandr Byelkin
committer: Oleksandr Byelkin
timestamp: 2019-05-17 14:38:34 +0200
message:
test fix
---
storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result | 2 --
1 file changed, 2 deletions(-)
diff --git a/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result b/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result
index 8d5b6270318..cb31847cdd8 100644
--- a/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result
+++ b/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result
@@ -56,7 +56,6 @@ buffer_pages_written buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NUL
buffer_index_pages_written buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of index pages written (innodb_index_pages_written)
buffer_non_index_pages_written buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of non index pages written (innodb_non_index_pages_written)
buffer_pages_read buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of pages read (innodb_pages_read)
-buffer_pages0_read buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of page 0 read (innodb_pages0_read)
buffer_index_sec_rec_cluster_reads buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of secondary record reads triggered cluster read
buffer_index_sec_rec_cluster_reads_avoided buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Number of secondary record reads avoided triggering cluster read
buffer_data_reads buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled status_counter Amount of data read in bytes (innodb_data_reads)
@@ -165,7 +164,6 @@ trx_nl_ro_commits transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL N
trx_commits_insert_update transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of transactions committed with inserts and updates
trx_rollbacks transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of transactions rolled back
trx_rollbacks_savepoint transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of transactions rolled back to savepoint
-trx_rollback_active transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of resurrected active transactions rolled back
trx_active_transactions transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of active transactions
trx_rseg_history_len transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled value Length of the TRX_RSEG_HISTORY list
trx_undo_slots_used transaction 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL disabled counter Number of undo slots used
1
0
revision-id: 509de900aff841863d3dff9e376ea5a63e337b7a (mariadb-10.4.4-93-g509de900aff)
parent(s): 6c85bd30543e38155a77ceb8328646fbe121fa6d
author: Oleksandr Byelkin
committer: Oleksandr Byelkin
timestamp: 2019-05-17 13:18:09 +0200
message:
more fixes
---
mysql-test/main/grant4.test | 4 ++++
mysql-test/main/partition_innodb.result | 4 ++--
sql/sql_acl.cc | 2 +-
sql/sql_select.cc | 6 +++++-
sql/sql_statistics.cc | 2 --
5 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/mysql-test/main/grant4.test b/mysql-test/main/grant4.test
index 30f08f9eea2..a63bd158a0d 100644
--- a/mysql-test/main/grant4.test
+++ b/mysql-test/main/grant4.test
@@ -148,6 +148,7 @@ drop user mysqltest_u1@localhost;
#
# MDEV-18241 Downgrade from 10.4 to 10.3 crashes
#
+source include/switch_to_mysql_user.inc;
call mtr.add_suppression("Table 'mysql.user' doesn't exist");
call mtr.add_suppression("'mysql.user' is not of type 'TABLE'");
rename table mysql.user to mysql.user1;
@@ -160,10 +161,12 @@ create temporary table mysql.user select * from mysql.user1 limit 0;
flush privileges;
drop temporary table mysql.user;
rename table mysql.user1 to mysql.user;
+source include/switch_to_mysql_global_priv.inc;
#
# Bug#28986737: RENAMING AND REPLACING MYSQL.USER TABLE CAN LEAD TO A SERVER CRASH
#
+source include/switch_to_mysql_user.inc;
call mtr.add_suppression('mysql.user table is damaged');
rename table mysql.user to mysql.user1;
create table mysql.user (Host char(100), User char(100));
@@ -171,6 +174,7 @@ create table mysql.user (Host char(100), User char(100));
flush privileges;
drop table mysql.user;
rename table mysql.user1 to mysql.user;
+source include/switch_to_mysql_global_priv.inc;
--echo End of 5.5 tests
diff --git a/mysql-test/main/partition_innodb.result b/mysql-test/main/partition_innodb.result
index cf1248663e4..c0f36a284fd 100644
--- a/mysql-test/main/partition_innodb.result
+++ b/mysql-test/main/partition_innodb.result
@@ -417,11 +417,11 @@ t1 InnoDB 10 Dynamic 2 8192 16384 0 0 # 1 # NULL NULL latin1_swedish_ci NULL par
insert into t1 values (NULL), (NULL), (NULL), (NULL);
show table status;
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
-t1 InnoDB 10 Dynamic 5 3276 16384 0 0 # 5 # NULL NULL latin1_swedish_ci NULL partitioned 0 N
+t1 InnoDB 10 Dynamic 4 4096 16384 0 0 # 5 # NULL NULL latin1_swedish_ci NULL partitioned 0 N
insert into t1 values (NULL), (NULL), (NULL), (NULL);
show table status;
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
-t1 InnoDB 10 Dynamic 9 1820 16384 0 0 # 9 # NULL NULL latin1_swedish_ci NULL partitioned 0 N
+t1 InnoDB 10 Dynamic 8 2048 16384 0 0 # 9 # NULL NULL latin1_swedish_ci NULL partitioned 0 N
drop table t1;
create table t1 (a int)
partition by key (a)
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index a649ad0e335..f1d77c3d6d6 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -1842,7 +1842,7 @@ class Grant_tables
TABLE_LIST *tl= tables + USER_TABLE;
tl->init_one_table(&MYSQL_SCHEMA_NAME, &MYSQL_TABLE_NAME_USER,
NULL, lock_type);
- tl->updating= lock_type >= TL_WRITE_ALLOW_WRITE;
+ tl->i_s_requested_object= OPEN_TABLE_ONLY;
p_user_table= &m_user_table_tabular;
counter++;
res= really_open(thd, tl, &unused);
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 21fab0cf07b..af52255b6ff 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -17410,7 +17410,11 @@ Field *Item::tmp_table_field_from_field_type_maybe_null(TABLE *table,
const Tmp_field_param *param,
bool is_explicit_null)
{
- DBUG_ASSERT(!param->make_copy_field());
+ /*
+ item->type() == CONST_ITEM excluded due to making fields for counter
+ With help of Item_uint
+ */
+ DBUG_ASSERT(!param->make_copy_field() || type() == CONST_ITEM);
DBUG_ASSERT(!is_result_field());
Field *result;
if ((result= tmp_table_field_from_field_type(table)))
diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc
index 2bc4296e4ed..86a6e1c2222 100644
--- a/sql/sql_statistics.cc
+++ b/sql/sql_statistics.cc
@@ -4151,8 +4151,6 @@ bool is_eits_usable(Field *field)
if (!col_stats)
return false;
- DBUG_ASSERT(field->table->stats_is_read);
-
/*
(1): checks if we have EITS statistics for a particular column
(2): Don't use EITS for GEOMETRY columns
1
0