1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

Merge 10.9 into 10.10

This commit is contained in:
Marko Mäkelä
2023-02-16 11:36:38 +02:00
326 changed files with 2897 additions and 1774 deletions

View File

@@ -326,8 +326,8 @@ class Load_log_processor
} }
public: public:
Load_log_processor() {} Load_log_processor() = default;
~Load_log_processor() {} ~Load_log_processor() = default;
int init() int init()
{ {

View File

@@ -86,7 +86,7 @@
#include <m_string.h> #include <m_string.h>
#include <errno.h> #include <errno.h>
#ifdef HAVE_gcov #ifdef HAVE_gcov
extern void __gcov_flush(); #include <gcov.h>
#endif #endif
#ifndef DBUG_OFF #ifndef DBUG_OFF
@@ -2212,7 +2212,7 @@ void _db_suicide_()
fprintf(stderr, "SIGKILL myself\n"); fprintf(stderr, "SIGKILL myself\n");
fflush(stderr); fflush(stderr);
#ifdef HAVE_gcov #ifdef HAVE_gcov
__gcov_flush(); __gcov_dump();
#endif #endif
retval= kill(getpid(), SIGKILL); retval= kill(getpid(), SIGKILL);
@@ -2262,7 +2262,7 @@ my_bool _db_my_assert(const char *file, int line, const char *msg)
fprintf(stderr, "%s:%d: assert: %s\n", file, line, msg); fprintf(stderr, "%s:%d: assert: %s\n", file, line, msg);
fflush(stderr); fflush(stderr);
#ifdef HAVE_gcov #ifdef HAVE_gcov
__gcov_flush(); __gcov_dump();
#endif #endif
} }
return a; return a;

View File

@@ -104,13 +104,6 @@ fi
case "${LSBNAME}" case "${LSBNAME}"
in in
# Debian # Debian
stretch)
# MDEV-16525 libzstd-dev-1.1.3 minimum version
sed -e '/libzstd-dev/d' \
-e 's/libcurl4/libcurl3/g' -i debian/control
remove_rocksdb_tools
disable_pmem
;&
buster) buster)
disable_libfmt disable_libfmt
replace_uring_with_aio replace_uring_with_aio

View File

@@ -1290,7 +1290,7 @@ struct my_option xb_client_options[]= {
{"rsync", OPT_RSYNC, {"rsync", OPT_RSYNC,
"Uses the rsync utility to optimize local file " "Uses the rsync utility to optimize local file "
"transfers. When this option is specified, innobackupex uses rsync " "transfers. When this option is specified, " XB_TOOL_NAME " uses rsync "
"to copy all non-InnoDB files instead of spawning a separate cp for " "to copy all non-InnoDB files instead of spawning a separate cp for "
"each file, which can be much faster for servers with a large number " "each file, which can be much faster for servers with a large number "
"of databases or tables. This option cannot be used together with " "of databases or tables. This option cannot be used together with "
@@ -1398,7 +1398,7 @@ struct my_option xb_client_options[]= {
{"ftwrl-wait-query-type", OPT_LOCK_WAIT_QUERY_TYPE, {"ftwrl-wait-query-type", OPT_LOCK_WAIT_QUERY_TYPE,
"This option specifies which types of queries are allowed to complete " "This option specifies which types of queries are allowed to complete "
"before innobackupex will issue the global lock. Default is all.", "before " XB_TOOL_NAME " will issue the global lock. Default is all.",
(uchar *) &opt_lock_wait_query_type, (uchar *) &opt_lock_wait_query_type, (uchar *) &opt_lock_wait_query_type, (uchar *) &opt_lock_wait_query_type,
&query_type_typelib, GET_ENUM, REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, &query_type_typelib, GET_ENUM, REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0,
0}, 0},
@@ -1418,26 +1418,26 @@ struct my_option xb_client_options[]= {
NULL, NULL, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, NULL, NULL, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
{"kill-long-queries-timeout", OPT_KILL_LONG_QUERIES_TIMEOUT, {"kill-long-queries-timeout", OPT_KILL_LONG_QUERIES_TIMEOUT,
"This option specifies the number of seconds innobackupex waits " "This option specifies the number of seconds " XB_TOOL_NAME " waits "
"between starting FLUSH TABLES WITH READ LOCK and killing those " "between starting FLUSH TABLES WITH READ LOCK and killing those "
"queries that block it. Default is 0 seconds, which means " "queries that block it. Default is 0 seconds, which means "
"innobackupex will not attempt to kill any queries.", XB_TOOL_NAME " will not attempt to kill any queries.",
(uchar *) &opt_kill_long_queries_timeout, (uchar *) &opt_kill_long_queries_timeout,
(uchar *) &opt_kill_long_queries_timeout, 0, GET_UINT, REQUIRED_ARG, 0, 0, (uchar *) &opt_kill_long_queries_timeout, 0, GET_UINT, REQUIRED_ARG, 0, 0,
0, 0, 0, 0}, 0, 0, 0, 0},
{"ftwrl-wait-timeout", OPT_LOCK_WAIT_TIMEOUT, {"ftwrl-wait-timeout", OPT_LOCK_WAIT_TIMEOUT,
"This option specifies time in seconds that innobackupex should wait " "This option specifies time in seconds that " XB_TOOL_NAME " should wait "
"for queries that would block FTWRL before running it. If there are " "for queries that would block FTWRL before running it. If there are "
"still such queries when the timeout expires, innobackupex terminates " "still such queries when the timeout expires, " XB_TOOL_NAME " terminates "
"with an error. Default is 0, in which case innobackupex does not " "with an error. Default is 0, in which case " XB_TOOL_NAME " does not "
"wait for queries to complete and starts FTWRL immediately.", "wait for queries to complete and starts FTWRL immediately.",
(uchar *) &opt_lock_wait_timeout, (uchar *) &opt_lock_wait_timeout, 0, (uchar *) &opt_lock_wait_timeout, (uchar *) &opt_lock_wait_timeout, 0,
GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"ftwrl-wait-threshold", OPT_LOCK_WAIT_THRESHOLD, {"ftwrl-wait-threshold", OPT_LOCK_WAIT_THRESHOLD,
"This option specifies the query run time threshold which is used by " "This option specifies the query run time threshold which is used by "
"innobackupex to detect long-running queries with a non-zero value " XB_TOOL_NAME " to detect long-running queries with a non-zero value "
"of --ftwrl-wait-timeout. FTWRL is not started until such " "of --ftwrl-wait-timeout. FTWRL is not started until such "
"long-running queries exist. This option has no effect if " "long-running queries exist. This option has no effect if "
"--ftwrl-wait-timeout is 0. Default value is 60 seconds.", "--ftwrl-wait-timeout is 0. Default value is 60 seconds.",
@@ -1918,6 +1918,17 @@ xb_get_one_option(const struct my_option *opt,
break; break;
case OPT_INNODB_FLUSH_METHOD: case OPT_INNODB_FLUSH_METHOD:
#ifdef _WIN32
/* From: storage/innobase/handler/ha_innodb.cc:innodb_init_params */
switch (srv_file_flush_method) {
case SRV_ALL_O_DIRECT_FSYNC + 1 /* "async_unbuffered"="unbuffered" */:
srv_file_flush_method= SRV_ALL_O_DIRECT_FSYNC;
break;
case SRV_ALL_O_DIRECT_FSYNC + 2 /* "normal"="fsync" */:
srv_file_flush_method= SRV_FSYNC;
break;
}
#endif
ut_a(srv_file_flush_method ut_a(srv_file_flush_method
<= IF_WIN(SRV_ALL_O_DIRECT_FSYNC, SRV_O_DIRECT_NO_FSYNC)); <= IF_WIN(SRV_ALL_O_DIRECT_FSYNC, SRV_O_DIRECT_NO_FSYNC));
ADD_PRINT_PARAM_OPT(innodb_flush_method_names[srv_file_flush_method]); ADD_PRINT_PARAM_OPT(innodb_flush_method_names[srv_file_flush_method]);
@@ -3104,7 +3115,8 @@ static bool xtrabackup_copy_logfile()
mysql_mutex_lock(&recv_sys.mutex); mysql_mutex_lock(&recv_sys.mutex);
} }
msg(">> log scanned up to (" LSN_PF ")", recv_sys.lsn); if (verbose)
msg(">> log scanned up to (" LSN_PF ")", recv_sys.lsn);
return false; return false;
} }
@@ -3147,7 +3159,7 @@ static void log_copying_thread()
my_thread_end(); my_thread_end();
} }
/** whether io_watching_thread() is active; protected by log_sys.mutex */ /** whether io_watching_thread() is active; protected by recv_sys.mutex */
static bool have_io_watching_thread; static bool have_io_watching_thread;
/* io throttle watching (rough) */ /* io throttle watching (rough) */

View File

@@ -27,6 +27,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
#include "changed_page_bitmap.h" #include "changed_page_bitmap.h"
#include <set> #include <set>
#define XB_TOOL_NAME "mariadb-backup"
struct xb_delta_info_t struct xb_delta_info_t
{ {
xb_delta_info_t(ulint page_size, ulint zip_size, uint32_t space_id) xb_delta_info_t(ulint page_size, ulint zip_size, uint32_t space_id)

View File

@@ -12,6 +12,9 @@ IF(MSVC_INTEL)
SET(WOLFSSL_X86_64_BUILD 1) SET(WOLFSSL_X86_64_BUILD 1)
SET(HAVE_INTEL_RDSEED 1) SET(HAVE_INTEL_RDSEED 1)
SET(HAVE_INTEL_RDRAND 1) SET(HAVE_INTEL_RDRAND 1)
ELSEIF(CMAKE_ASM_COMPILER_ID MATCHES "Clang" AND CMAKE_VERSION VERSION_LESS 3.16)
# WolfSSL 5.5.4 bug workaround below does not work, due to some CMake bug
ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64") ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64")
SET(WOLFSSL_X86_64_BUILD 1) SET(WOLFSSL_X86_64_BUILD 1)
IF(CMAKE_C_COMPILER_ID MATCHES GNU AND CMAKE_C_COMPILER_VERSION VERSION_LESS 4.9) IF(CMAKE_C_COMPILER_ID MATCHES GNU AND CMAKE_C_COMPILER_VERSION VERSION_LESS 4.9)

View File

@@ -27,12 +27,11 @@
// Derive your class from this struct to insert to a linked list. // Derive your class from this struct to insert to a linked list.
template <class Tag= void> struct ilist_node template <class Tag= void> struct ilist_node
{ {
ilist_node() noexcept
#ifndef DBUG_OFF #ifndef DBUG_OFF
: next(NULL), prev(NULL) ilist_node() noexcept : next(NULL), prev(NULL) {}
#else
ilist_node() = default;
#endif #endif
{
}
ilist_node(ilist_node *next, ilist_node *prev) noexcept ilist_node(ilist_node *next, ilist_node *prev) noexcept
: next(next), prev(prev) : next(next), prev(prev)

View File

@@ -39,7 +39,7 @@ public:
Atomic_relaxed(const Atomic_relaxed<Type> &rhs) Atomic_relaxed(const Atomic_relaxed<Type> &rhs)
{ m.store(rhs, std::memory_order_relaxed); } { m.store(rhs, std::memory_order_relaxed); }
Atomic_relaxed(Type val) : m(val) {} Atomic_relaxed(Type val) : m(val) {}
Atomic_relaxed() {} Atomic_relaxed() = default;
Type load(std::memory_order o= std::memory_order_relaxed) const Type load(std::memory_order o= std::memory_order_relaxed) const
{ return m.load(o); } { return m.load(o); }

View File

@@ -31,7 +31,7 @@ public:
Atomic_counter(const Atomic_counter<Type> &rhs) Atomic_counter(const Atomic_counter<Type> &rhs)
{ m_counter.store(rhs, std::memory_order_relaxed); } { m_counter.store(rhs, std::memory_order_relaxed); }
Atomic_counter(Type val): m_counter(val) {} Atomic_counter(Type val): m_counter(val) {}
Atomic_counter() {} Atomic_counter() = default;
Type operator++(int) { return add(1); } Type operator++(int) { return add(1); }
Type operator--(int) { return sub(1); } Type operator--(int) { return sub(1); }

View File

@@ -81,7 +81,7 @@ public:
span(const span &other) : data_(other.data_), size_(other.size_) {} span(const span &other) : data_(other.data_), size_(other.size_) {}
~span(){}; ~span() = default;
span &operator=(const span &other) span &operator=(const span &other)
{ {

View File

@@ -0,0 +1,18 @@
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
# Uncode code points that have a variable length case mapping in utf8
# (e.g. LOWER('2-byte-character') -> '3-byte-character'
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
DROP TABLE case_folding;

View File

@@ -3041,6 +3041,51 @@ SELECT 'chž'< 'i';
SELECT 'a' COLLATE utf8_czech_test_bad_w2; SELECT 'a' COLLATE utf8_czech_test_bad_w2;
ERROR HY000: Unknown collation: 'utf8_czech_test_bad_w2' ERROR HY000: Unknown collation: 'utf8_czech_test_bad_w2'
# #
# End of 10.2 tests
#
#
# Start of 10.3 tests
#
#
# MDEV-30556 UPPER() returns an empty string for U+0251 in Unicode-5.2.0+ collations for utf8
#
SET NAMES utf8mb4 COLLATE utf8mb4_test_520_nopad_ci;
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
Table Create Table
case_folding CREATE TABLE `case_folding` (
`code` int(1) NOT NULL,
`c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_test_520_nopad_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
23A E2B1A5 C8BA Ⱥ
23E E2B1A6 C8BE Ⱦ
23F C8BF E2B1BE ȿ
240 C980 E2B1BF ɀ
250 C990 E2B1AF ɐ
251 C991 E2B1AD ɑ
252 C992 E2B1B0 ɒ
26B C9AB E2B1A2 ɫ
271 C9B1 E2B1AE ɱ
27D C9BD E2B1A4 ɽ
DROP TABLE case_folding;
#
# End of 10.3 tests
#
#
# MDEV-7947 my_charset_same: strcmp() takes 0.37% in OLTP RO # MDEV-7947 my_charset_same: strcmp() takes 0.37% in OLTP RO
# #
SHOW COLLATION LIKE 'latin1_test_replace'; SHOW COLLATION LIKE 'latin1_test_replace';
@@ -3048,6 +3093,9 @@ Collation Charset Id Default Compiled Sortlen
SELECT 'foo' = 'foo ' COLLATE latin1_test_replace; SELECT 'foo' = 'foo ' COLLATE latin1_test_replace;
ERROR HY000: Unknown collation: 'latin1_test_replace' ERROR HY000: Unknown collation: 'latin1_test_replace'
# #
# End of 10.5 tests
#
#
# MDEV-27042 UCA: Resetting contractions to ignorable does not work well # MDEV-27042 UCA: Resetting contractions to ignorable does not work well
# #
CREATE TABLE t1 ( CREATE TABLE t1 (
@@ -3082,6 +3130,9 @@ tèl.123 10020E8B0F2E025D0E2A0E2B0E2C
tex.123 10020E8B105A025D0E2A0E2B0E2C tex.123 10020E8B105A025D0E2A0E2B0E2C
DROP TABLE t1; DROP TABLE t1;
# #
# End of 10.8 tests
#
#
# MDEV-27009 Add UCA-14.0.0 collations # MDEV-27009 Add UCA-14.0.0 collations
# #
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_test01_as_ci, comment VARCHAR(128)); CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_test01_as_ci, comment VARCHAR(128));
@@ -3178,3 +3229,6 @@ is_400 0
is_520 0 is_520 0
is_1400 1 is_1400 1
DROP TABLE t1; DROP TABLE t1;
#
# End of 10.10 tests
#

View File

@@ -611,6 +611,27 @@ SELECT 'chž'< 'i';
--error ER_UNKNOWN_COLLATION --error ER_UNKNOWN_COLLATION
SELECT 'a' COLLATE utf8_czech_test_bad_w2; SELECT 'a' COLLATE utf8_czech_test_bad_w2;
--echo #
--echo # End of 10.2 tests
--echo #
--echo #
--echo # Start of 10.3 tests
--echo #
--echo #
--echo # MDEV-30556 UPPER() returns an empty string for U+0251 in Unicode-5.2.0+ collations for utf8
--echo #
SET NAMES utf8mb4 COLLATE utf8mb4_test_520_nopad_ci;
--source include/ctype_casefolding.inc
--echo #
--echo # End of 10.3 tests
--echo #
--echo # --echo #
--echo # MDEV-7947 my_charset_same: strcmp() takes 0.37% in OLTP RO --echo # MDEV-7947 my_charset_same: strcmp() takes 0.37% in OLTP RO
@@ -620,6 +641,9 @@ SHOW COLLATION LIKE 'latin1_test_replace';
--error ER_UNKNOWN_COLLATION --error ER_UNKNOWN_COLLATION
SELECT 'foo' = 'foo ' COLLATE latin1_test_replace; SELECT 'foo' = 'foo ' COLLATE latin1_test_replace;
--echo #
--echo # End of 10.5 tests
--echo #
--echo # --echo #
--echo # MDEV-27042 UCA: Resetting contractions to ignorable does not work well --echo # MDEV-27042 UCA: Resetting contractions to ignorable does not work well
@@ -640,6 +664,9 @@ SELECT * FROM t1 WHERE phone<>'123' ORDER BY BINARY phone;
SELECT phone, HEX(WEIGHT_STRING(phone)) FROM t1 ORDER BY phone, BINARY phone; SELECT phone, HEX(WEIGHT_STRING(phone)) FROM t1 ORDER BY phone, BINARY phone;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # End of 10.8 tests
--echo #
--echo # --echo #
--echo # MDEV-27009 Add UCA-14.0.0 collations --echo # MDEV-27009 Add UCA-14.0.0 collations
@@ -669,3 +696,7 @@ FROM t1
ORDER BY a, HEX(a); ORDER BY a, HEX(a);
--horizontal_results --horizontal_results
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # End of 10.10 tests
--echo #

View File

@@ -8204,7 +8204,7 @@ INSERT INTO t1 VALUES (_utf32 0x2CEE);
SELECT hex(c), hex(lower(c)), hex(upper(c)), hex(weight_string(c)), c SELECT hex(c), hex(lower(c)), hex(upper(c)), hex(weight_string(c)), c
FROM t1 ORDER BY c, BINARY c; FROM t1 ORDER BY c, BINARY c;
hex(c) hex(lower(c)) hex(upper(c)) hex(weight_string(c)) c hex(c) hex(lower(c)) hex(upper(c)) hex(weight_string(c)) c
C8BA C8BA 1214 Ⱥ C8BA E2B1A5 C8BA 1214 Ⱥ
E2B1A5 E2B1A5 C8BA 1214 ⱥ E2B1A5 E2B1A5 C8BA 1214 ⱥ
C680 C680 C983 122D ƀ C680 C680 C983 122D ƀ
C983 C680 C983 122D Ƀ C983 C680 C983 122D Ƀ
@@ -8229,7 +8229,7 @@ E2B1AA E2B1AA E2B1A9 1328 ⱪ
C8BD C69A C8BD 133B Ƚ C8BD C69A C8BD 133B Ƚ
E2B1A0 E2B1A1 E2B1A0 133F Ⱡ E2B1A0 E2B1A1 E2B1A0 133F Ⱡ
E2B1A1 E2B1A1 E2B1A0 133F ⱡ E2B1A1 E2B1A1 E2B1A0 133F ⱡ
C9AB C9AB 1340 ɫ C9AB C9AB E2B1A2 1340 ɫ
E2B1A2 C9AB E2B1A2 1340 Ɫ E2B1A2 C9AB E2B1A2 1340 Ɫ
E1B5BD E1B5BD E2B1A3 13B8 ᵽ E1B5BD E1B5BD E2B1A3 13B8 ᵽ
E2B1A3 E1B5BD E2B1A3 13B8 Ᵽ E2B1A3 E1B5BD E2B1A3 13B8 Ᵽ
@@ -8237,11 +8237,11 @@ C98A C98B C98A 13D2 Ɋ
C98B C98B C98A 13D2 ɋ C98B C98B C98A 13D2 ɋ
C98C C98D C98C 13E4 Ɍ C98C C98D C98C 13E4 Ɍ
C98D C98D C98C 13E4 ɍ C98D C98D C98C 13E4 ɍ
C9BD C9BD 13FC ɽ C9BD C9BD E2B1A4 13FC ɽ
E2B1A4 C9BD E2B1A4 13FC Ɽ E2B1A4 C9BD E2B1A4 13FC Ɽ
EA9CA8 EA9CA9 EA9CA8 143314AD Ꜩ EA9CA8 EA9CA9 EA9CA8 143314AD Ꜩ
EA9CA9 EA9CA9 EA9CA8 143314AD ꜩ EA9CA9 EA9CA9 EA9CA8 143314AD ꜩ
C8BE C8BE 143C Ⱦ C8BE E2B1A6 C8BE 143C Ⱦ
E2B1A6 E2B1A6 C8BE 143C ⱦ E2B1A6 E2B1A6 C8BE 143C ⱦ
C984 CA89 C984 145B Ʉ C984 CA89 C984 145B Ʉ
CA89 CA89 C984 145B ʉ CA89 CA89 C984 145B ʉ

View File

@@ -588,6 +588,180 @@ DROP TABLE t1;
# End of 10.2 tests # End of 10.2 tests
# #
# #
# Start of 10.3 tests
#
#
# MDEV-30556 UPPER() returns an empty string for U+0251 in Unicode-5.2.0+ collations for utf8
#
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_ci /*Unicode-4.0 folding*/;
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
Table Create Table
case_folding CREATE TABLE `case_folding` (
`code` int(1) NOT NULL,
`c` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
23A C8BA C8BA Ⱥ
23E C8BE C8BE Ⱦ
23F C8BF C8BF ȿ
240 C980 C980 ɀ
250 C990 C990 ɐ
251 C991 C991 ɑ
252 C992 C992 ɒ
26B C9AB C9AB ɫ
271 C9B1 C9B1 ɱ
27D C9BD C9BD ɽ
DROP TABLE case_folding;
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_ci;
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
Table Create Table
case_folding CREATE TABLE `case_folding` (
`code` int(1) NOT NULL,
`c` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_520_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
23A E2B1A5 C8BA Ⱥ
23E E2B1A6 C8BE Ⱦ
23F C8BF E2B1BE ȿ
240 C980 E2B1BF ɀ
250 C990 E2B1AF ɐ
251 C991 E2B1AD ɑ
252 C992 E2B1B0 ɒ
26B C9AB E2B1A2 ɫ
271 C9B1 E2B1AE ɱ
27D C9BD E2B1A4 ɽ
DROP TABLE case_folding;
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_nopad_ci;
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
Table Create Table
case_folding CREATE TABLE `case_folding` (
`code` int(1) NOT NULL,
`c` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_520_nopad_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
23A E2B1A5 C8BA Ⱥ
23E E2B1A6 C8BE Ⱦ
23F C8BF E2B1BE ȿ
240 C980 E2B1BF ɀ
250 C990 E2B1AF ɐ
251 C991 E2B1AD ɑ
252 C992 E2B1B0 ɒ
26B C9AB E2B1A2 ɫ
271 C9B1 E2B1AE ɱ
27D C9BD E2B1A4 ɽ
DROP TABLE case_folding;
SET NAMES utf8mb3 COLLATE utf8mb3_myanmar_ci;
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
Table Create Table
case_folding CREATE TABLE `case_folding` (
`code` int(1) NOT NULL,
`c` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_myanmar_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
23A E2B1A5 C8BA Ⱥ
23E E2B1A6 C8BE Ⱦ
23F C8BF E2B1BE ȿ
240 C980 E2B1BF ɀ
250 C990 E2B1AF ɐ
251 C991 E2B1AD ɑ
252 C992 E2B1B0 ɒ
26B C9AB E2B1A2 ɫ
271 C9B1 E2B1AE ɱ
27D C9BD E2B1A4 ɽ
DROP TABLE case_folding;
SET NAMES utf8mb3 COLLATE utf8mb3_thai_520_w2;
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
Table Create Table
case_folding CREATE TABLE `case_folding` (
`code` int(1) NOT NULL,
`c` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_thai_520_w2 DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
23A E2B1A5 C8BA Ⱥ
23E E2B1A6 C8BE Ⱦ
23F C8BF E2B1BE ȿ
240 C980 E2B1BF ɀ
250 C990 E2B1AF ɐ
251 C991 E2B1AD ɑ
252 C992 E2B1B0 ɒ
26B C9AB E2B1A2 ɫ
271 C9B1 E2B1AE ɱ
27D C9BD E2B1A4 ɽ
DROP TABLE case_folding;
#
# End of 10.3 tests
#
#
# Start of 10.10 tests # Start of 10.10 tests
# #
# #

View File

@@ -22,6 +22,35 @@ SET NAMES utf8 COLLATE utf8_unicode_nopad_ci;
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #
--echo #
--echo # Start of 10.3 tests
--echo #
--echo #
--echo # MDEV-30556 UPPER() returns an empty string for U+0251 in Unicode-5.2.0+ collations for utf8
--echo #
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_ci /*Unicode-4.0 folding*/;
--source include/ctype_casefolding.inc
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_ci;
--source include/ctype_casefolding.inc
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_nopad_ci;
--source include/ctype_casefolding.inc
SET NAMES utf8mb3 COLLATE utf8mb3_myanmar_ci;
--source include/ctype_casefolding.inc
SET NAMES utf8mb3 COLLATE utf8mb3_thai_520_w2;
--source include/ctype_casefolding.inc
--echo #
--echo # End of 10.3 tests
--echo #
--echo # --echo #
--echo # Start of 10.10 tests --echo # Start of 10.10 tests
--echo # --echo #
@@ -47,7 +76,6 @@ SELECT f1();
DROP FUNCTION f1; DROP FUNCTION f1;
SET NAMES utf8mb3; SET NAMES utf8mb3;
--echo # --echo #
--echo # End of 10.10 tests --echo # End of 10.10 tests
--echo # --echo #

View File

@@ -6606,7 +6606,178 @@ SET NAMES utf8mb4;
# End of 10.2 tests # End of 10.2 tests
# #
# #
# End of 10.9 tests # Start of 10.3 tests
#
#
# MDEV-30556 UPPER() returns an empty string for U+0251 in Unicode-5.2.0+ collations for utf8
#
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci /*Unicode-4.0 folding*/;
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
Table Create Table
case_folding CREATE TABLE `case_folding` (
`code` int(1) NOT NULL,
`c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
23A C8BA C8BA Ⱥ
23E C8BE C8BE Ⱦ
23F C8BF C8BF ȿ
240 C980 C980 ɀ
250 C990 C990 ɐ
251 C991 C991 ɑ
252 C992 C992 ɒ
26B C9AB C9AB ɫ
271 C9B1 C9B1 ɱ
27D C9BD C9BD ɽ
DROP TABLE case_folding;
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci;
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
Table Create Table
case_folding CREATE TABLE `case_folding` (
`code` int(1) NOT NULL,
`c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
23A E2B1A5 C8BA Ⱥ
23E E2B1A6 C8BE Ⱦ
23F C8BF E2B1BE ȿ
240 C980 E2B1BF ɀ
250 C990 E2B1AF ɐ
251 C991 E2B1AD ɑ
252 C992 E2B1B0 ɒ
26B C9AB E2B1A2 ɫ
271 C9B1 E2B1AE ɱ
27D C9BD E2B1A4 ɽ
DROP TABLE case_folding;
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_nopad_ci;
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
Table Create Table
case_folding CREATE TABLE `case_folding` (
`code` int(1) NOT NULL,
`c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_nopad_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
23A E2B1A5 C8BA Ⱥ
23E E2B1A6 C8BE Ⱦ
23F C8BF E2B1BE ȿ
240 C980 E2B1BF ɀ
250 C990 E2B1AF ɐ
251 C991 E2B1AD ɑ
252 C992 E2B1B0 ɒ
26B C9AB E2B1A2 ɫ
271 C9B1 E2B1AE ɱ
27D C9BD E2B1A4 ɽ
DROP TABLE case_folding;
SET NAMES utf8mb4 COLLATE utf8mb4_myanmar_ci;
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
Table Create Table
case_folding CREATE TABLE `case_folding` (
`code` int(1) NOT NULL,
`c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_myanmar_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
23A E2B1A5 C8BA Ⱥ
23E E2B1A6 C8BE Ⱦ
23F C8BF E2B1BE ȿ
240 C980 E2B1BF ɀ
250 C990 E2B1AF ɐ
251 C991 E2B1AD ɑ
252 C992 E2B1B0 ɒ
26B C9AB E2B1A2 ɫ
271 C9B1 E2B1AE ɱ
27D C9BD E2B1A4 ɽ
DROP TABLE case_folding;
SET NAMES utf8mb4 COLLATE utf8mb4_thai_520_w2;
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
SHOW CREATE TABLE case_folding;
Table Create Table
case_folding CREATE TABLE `case_folding` (
`code` int(1) NOT NULL,
`c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_thai_520_w2 DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
INSERT INTO case_folding (code) VALUES
(0x23A),
(0x23E),
(0x23F),
(0x240),
(0x250),
(0x251),
(0x252),
(0x26B),
(0x271),
(0x27D);
UPDATE case_folding SET c=CHAR(code USING ucs2);
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
23A E2B1A5 C8BA Ⱥ
23E E2B1A6 C8BE Ⱦ
23F C8BF E2B1BE ȿ
240 C980 E2B1BF ɀ
250 C990 E2B1AF ɐ
251 C991 E2B1AD ɑ
252 C992 E2B1B0 ɒ
26B C9AB E2B1A2 ɫ
271 C9B1 E2B1AE ɱ
27D C9BD E2B1A4 ɽ
DROP TABLE case_folding;
#
# End of 10.3 tests
# #
# #
# MDEV-27009 Add UCA-14.0.0 collations # MDEV-27009 Add UCA-14.0.0 collations
@@ -11208,5 +11379,5 @@ DROP TABLE t1;
DROP PROCEDURE exec_verbose; DROP PROCEDURE exec_verbose;
DROP PROCEDURE test_styles; DROP PROCEDURE test_styles;
# #
# End of 10.9 tests # End of 10.10 tests
# #

View File

@@ -109,8 +109,33 @@ SET NAMES utf8mb4;
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #
--echo # --echo #
--echo # End of 10.9 tests --echo # Start of 10.3 tests
--echo #
--echo #
--echo # MDEV-30556 UPPER() returns an empty string for U+0251 in Unicode-5.2.0+ collations for utf8
--echo #
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci /*Unicode-4.0 folding*/;
--source include/ctype_casefolding.inc
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci;
--source include/ctype_casefolding.inc
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_nopad_ci;
--source include/ctype_casefolding.inc
SET NAMES utf8mb4 COLLATE utf8mb4_myanmar_ci;
--source include/ctype_casefolding.inc
SET NAMES utf8mb4 COLLATE utf8mb4_thai_520_w2;
--source include/ctype_casefolding.inc
--echo #
--echo # End of 10.3 tests
--echo # --echo #
--echo # --echo #
@@ -402,5 +427,5 @@ DROP PROCEDURE exec_verbose;
DROP PROCEDURE test_styles; DROP PROCEDURE test_styles;
--echo # --echo #
--echo # End of 10.9 tests --echo # End of 10.10 tests
--echo # --echo #

View File

@@ -2,7 +2,7 @@ SET DEBUG_SYNC= 'RESET';
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: '' debug_sync ON - current signals: ''
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2 HIT_LIMIT 3';
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 EXECUTE 2';
SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 HIT_LIMIT 3'; SET DEBUG_SYNC='p0 SIGNAL s1 WAIT_FOR s2 TIMEOUT 6 HIT_LIMIT 3';
@@ -150,34 +150,34 @@ SET @myvar= 'now SIGNAL from_myvar';
SET DEBUG_SYNC= @myvar; SET DEBUG_SYNC= @myvar;
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 'from_myvar' debug_sync ON - current signals: 'from_myvar'
SET DEBUG_SYNC= LEFT('now SIGNAL from_function_cut_here', 24); SET DEBUG_SYNC= LEFT('now SIGNAL from_function_cut_here', 24);
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 'from_function' debug_sync ON - current signals: 'from_myvar,from_function'
SET DEBUG_SYNC= 'now SIGNAL something'; SET DEBUG_SYNC= 'now SIGNAL something';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 'something' debug_sync ON - current signals: 'something,from_function,from_myvar'
SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0'; SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0';
Warnings: Warnings:
Warning #### debug sync point wait timed out Warning #### debug sync point wait timed out
SET DEBUG_SYNC= 'now SIGNAL nothing'; SET DEBUG_SYNC= 'now SIGNAL nothing';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 'nothing' debug_sync ON - current signals: 'something,from_function,nothing,from_myvar'
SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0'; SET DEBUG_SYNC= 'now WAIT_FOR nothing TIMEOUT 0';
SET DEBUG_SYNC= 'now SIGNAL something EXECUTE 0'; SET DEBUG_SYNC= 'now SIGNAL something EXECUTE 0';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 'nothing' debug_sync ON - current signals: 'something,from_function,from_myvar'
SET DEBUG_SYNC= 'now WAIT_FOR anotherthing TIMEOUT 0 EXECUTE 0'; SET DEBUG_SYNC= 'now WAIT_FOR anotherthing TIMEOUT 0 EXECUTE 0';
SET DEBUG_SYNC= 'now HIT_LIMIT 1'; SET DEBUG_SYNC= 'now HIT_LIMIT 1';
ERROR HY000: debug sync point hit limit reached ERROR HY000: debug sync point hit limit reached
SET DEBUG_SYNC= 'RESET'; SET DEBUG_SYNC= 'RESET';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: '' debug_sync ON - current signals: ''
SET DEBUG_SYNC= 'p1abcd SIGNAL s1 EXECUTE 2'; SET DEBUG_SYNC= 'p1abcd SIGNAL s1 EXECUTE 2';
SET DEBUG_SYNC= 'p2abc SIGNAL s2 EXECUTE 2'; SET DEBUG_SYNC= 'p2abc SIGNAL s2 EXECUTE 2';
SET DEBUG_SYNC= 'p9abcdef SIGNAL s9 EXECUTE 2'; SET DEBUG_SYNC= 'p9abcdef SIGNAL s9 EXECUTE 2';
@@ -190,23 +190,30 @@ SET DEBUG_SYNC= 'p3abcdef SIGNAL s3 EXECUTE 2';
SET DEBUG_SYNC= 'p4a TEST'; SET DEBUG_SYNC= 'p4a TEST';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 's4' debug_sync ON - current signals: 's4'
SET DEBUG_SYNC= 'p1abcd TEST'; SET DEBUG_SYNC= 'p1abcd TEST';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 's1' debug_sync ON - current signals: 's4,s1'
SET DEBUG_SYNC= 'p7 TEST'; SET DEBUG_SYNC= 'p7 TEST';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 's7' debug_sync ON - current signals: 's1,s7,s4'
SET DEBUG_SYNC= 'p9abcdef TEST'; SET DEBUG_SYNC= 'p9abcdef TEST';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 's9' debug_sync ON - current signals: 's1,s7,s4,s9'
SET DEBUG_SYNC= 'p3abcdef TEST'; SET DEBUG_SYNC= 'p3abcdef TEST';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 's3' debug_sync ON - current signals: 's1,s3,s4,s9,s7'
SET DEBUG_SYNC= 'now WAIT_FOR s9';
SET DEBUG_SYNC= 'now WAIT_FOR s1';
SET DEBUG_SYNC= 'now WAIT_FOR s4';
SET DEBUG_SYNC= 'now WAIT_FOR s7';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value
debug_sync ON - current signals: 's3'
SET DEBUG_SYNC= 'p1abcd CLEAR'; SET DEBUG_SYNC= 'p1abcd CLEAR';
SET DEBUG_SYNC= 'p2abc CLEAR'; SET DEBUG_SYNC= 'p2abc CLEAR';
SET DEBUG_SYNC= 'p5abcde CLEAR'; SET DEBUG_SYNC= 'p5abcde CLEAR';
@@ -219,19 +226,19 @@ SET DEBUG_SYNC= 'p7 CLEAR';
SET DEBUG_SYNC= 'p1abcd TEST'; SET DEBUG_SYNC= 'p1abcd TEST';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 's3' debug_sync ON - current signals: 's3'
SET DEBUG_SYNC= 'p7 TEST'; SET DEBUG_SYNC= 'p7 TEST';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 's3' debug_sync ON - current signals: 's3'
SET DEBUG_SYNC= 'p9abcdef TEST'; SET DEBUG_SYNC= 'p9abcdef TEST';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: 's3' debug_sync ON - current signals: 's3'
SET DEBUG_SYNC= 'RESET'; SET DEBUG_SYNC= 'RESET';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value Variable_name Value
debug_sync ON - current signal: '' debug_sync ON - current signals: ''
CREATE USER mysqltest_1@localhost; CREATE USER mysqltest_1@localhost;
GRANT SUPER ON *.* TO mysqltest_1@localhost; GRANT SUPER ON *.* TO mysqltest_1@localhost;
connect con1,localhost,mysqltest_1,,; connect con1,localhost,mysqltest_1,,;
@@ -292,4 +299,24 @@ disconnect con1;
disconnect con2; disconnect con2;
connection default; connection default;
DROP TABLE t1; DROP TABLE t1;
#
# Test NO_CLEAR_EVENT flag. The signal should still be visible after
# the wait has completed succesfully.
#
SET DEBUG_SYNC= 'now SIGNAL s1';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value
debug_sync ON - current signals: 's1'
SET DEBUG_SYNC= 'now WAIT_FOR s1 NO_CLEAR_EVENT';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value
debug_sync ON - current signals: 's1'
SET DEBUG_SYNC= 'now WAIT_FOR s1';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value
debug_sync ON - current signals: ''
SET DEBUG_SYNC= 'now SIGNAL s1,s2,s5,s7';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
Variable_name Value
debug_sync ON - current signals: 's2,s7,s1,s5'
SET DEBUG_SYNC= 'RESET'; SET DEBUG_SYNC= 'RESET';

View File

@@ -231,15 +231,12 @@ SHOW VARIABLES LIKE 'DEBUG_SYNC';
# immediately after setting of the DEBUG_SYNC variable. # immediately after setting of the DEBUG_SYNC variable.
# So it is executed before the SET statement ends. # So it is executed before the SET statement ends.
# #
# NOTE: There is only one global signal (say "signal post" or "flag mast"). # NOTE: There can be multiple active signals at the same time.
# A SIGNAL action writes its signal into it ("sets a flag"). # A SIGNAL action appends its signal into signals set.
# The signal persists until explicitly overwritten. # The signal persists until waited on.
# To avoid confusion for later tests, it is recommended to clear # To avoid confusion for later tests, it is recommended to clear
# the signal by signalling "empty" ("setting the 'empty' flag"): # the signal set by running
# SET DEBUG_SYNC= 'now SIGNAL empty';
# Preferably you can reset the whole facility with:
# SET DEBUG_SYNC= 'RESET'; # SET DEBUG_SYNC= 'RESET';
# The signal is then '' (really empty) which connot be done otherwise.
# #
# #
@@ -298,6 +295,16 @@ SET DEBUG_SYNC= 'p9abcdef TEST';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
SET DEBUG_SYNC= 'p3abcdef TEST'; SET DEBUG_SYNC= 'p3abcdef TEST';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
#
# Wait for all signals currently active except s3.
#
SET DEBUG_SYNC= 'now WAIT_FOR s9';
SET DEBUG_SYNC= 'now WAIT_FOR s1';
SET DEBUG_SYNC= 'now WAIT_FOR s4';
SET DEBUG_SYNC= 'now WAIT_FOR s7';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
# #
# Clear the actions. # Clear the actions.
# #
@@ -320,7 +327,7 @@ SHOW VARIABLES LIKE 'DEBUG_SYNC';
SET DEBUG_SYNC= 'p9abcdef TEST'; SET DEBUG_SYNC= 'p9abcdef TEST';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
# #
# Now cleanup. Actions are clear already, but signal needs to be cleared. # Now cleanup. Actions are clear already, but s3 signal needs to be cleared.
# #
SET DEBUG_SYNC= 'RESET'; SET DEBUG_SYNC= 'RESET';
SHOW VARIABLES LIKE 'DEBUG_SYNC'; SHOW VARIABLES LIKE 'DEBUG_SYNC';
@@ -418,10 +425,24 @@ disconnect con2;
connection default; connection default;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # Test NO_CLEAR_EVENT flag. The signal should still be visible after
--echo # the wait has completed succesfully.
--echo #
SET DEBUG_SYNC= 'now SIGNAL s1';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
SET DEBUG_SYNC= 'now WAIT_FOR s1 NO_CLEAR_EVENT';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
SET DEBUG_SYNC= 'now WAIT_FOR s1';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
SET DEBUG_SYNC= 'now SIGNAL s1,s2,s5,s7';
SHOW VARIABLES LIKE 'DEBUG_SYNC';
# #
# Cleanup after test case. # Cleanup after test case.
# Otherwise signal would contain 'flushed' here, # Otherwise signal would confuse the next test.
# which could confuse the next test.
# #
SET DEBUG_SYNC= 'RESET'; SET DEBUG_SYNC= 'RESET';

View File

@@ -525,3 +525,35 @@ DELETE v2 FROM v2;
ERROR HY000: Can not delete from join view 'test.v2' ERROR HY000: Can not delete from join view 'test.v2'
DROP VIEW v2, v1; DROP VIEW v2, v1;
DROP TABLE t1, t2; DROP TABLE t1, t2;
End of 5.5 tests
#
# MDEV-30586: DELETE with WHERE containing nested subquery
# with set function aggregated in outer subquery
#
create table t1 (a int);
insert into t1 values (3), (7), (1);
create table t2 (b int);
insert into t2 values (2), (1), (4), (7);
create table t3 (a int, b int);
insert into t3 values (2,10), (7,30), (2,30), (1,10), (7,40);
select * from t1
where t1.a in (select t3.a from t3 group by t3.a
having t3.a > any (select t2.b from t2
where t2.b*10 < sum(t3.b)));
a
7
delete from t1
where t1.a in (select t3.a from t3 group by t3.a
having t3.a > any (select t2.b from t2
where t2.b*10 < sum(t3.b)));
select * from t1
where t1.a in (select t3.a from t3 group by t3.a
having t3.a > any (select t2.b from t2
where t2.b*10 < sum(t3.b)));
a
update t1 set t1.a=t1.a+10
where t1.a in (select t3.a from t3 group by t3.a
having t3.a > any (select t2.b from t2
where t2.b*10 < sum(t3.b)));
drop table t1,t2,t3;
End of 10.4 tests

View File

@@ -582,3 +582,44 @@ DELETE v2 FROM v2;
DROP VIEW v2, v1; DROP VIEW v2, v1;
DROP TABLE t1, t2; DROP TABLE t1, t2;
--echo End of 5.5 tests
--echo #
--echo # MDEV-30586: DELETE with WHERE containing nested subquery
--echo # with set function aggregated in outer subquery
--echo #
create table t1 (a int);
insert into t1 values (3), (7), (1);
create table t2 (b int);
insert into t2 values (2), (1), (4), (7);
create table t3 (a int, b int);
insert into t3 values (2,10), (7,30), (2,30), (1,10), (7,40);
let $c=
t1.a in (select t3.a from t3 group by t3.a
having t3.a > any (select t2.b from t2
where t2.b*10 < sum(t3.b)));
eval
select * from t1
where $c;
eval
delete from t1
where $c;
eval
select * from t1
where $c;
eval
update t1 set t1.a=t1.a+10
where $c;
drop table t1,t2,t3;
--echo End of 10.4 tests

View File

@@ -16,3 +16,61 @@ ERROR 42S02: Table 'test.t2' doesn't exist
show status like "Empty_queries"; show status like "Empty_queries";
Variable_name Value Variable_name Value
Empty_queries 2 Empty_queries 2
# End of 4.1 tests
#
# MDEV-30333 Wrong result with not_null_range_scan and LEFT JOIN with empty table
#
set @save_optimizer_switch=@@optimizer_switch;
CREATE TABLE t1 (a INT, b INT) ENGINE=MyISAM;
INSERT INTO t1 (b) VALUES (1),(2);
CREATE TABLE t2 (c INT) ENGINE=MyISAM;
SET optimizer_switch= 'not_null_range_scan=off';
explain extended SELECT b FROM t1 LEFT JOIN t2 ON t2.c = a WHERE a IS NULL ORDER BY b;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t2 system NULL NULL NULL NULL 0 0.00 Const row not found
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where; Using filesort
Warnings:
Note 1003 select `test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` is null order by `test`.`t1`.`b`
SELECT b FROM t1 LEFT JOIN t2 ON t2.c = a WHERE a IS NULL ORDER BY b;
b
1
2
SET optimizer_switch = 'not_null_range_scan=on';
explain extended SELECT b FROM t1 LEFT JOIN t2 ON t2.c = a WHERE a IS NULL ORDER BY b;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t2 system NULL NULL NULL NULL 0 0.00 Const row not found
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 100.00 Using where; Using filesort
Warnings:
Note 1003 select `test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` is null order by `test`.`t1`.`b`
SELECT b FROM t1 LEFT JOIN t2 ON t2.c = a WHERE a IS NULL ORDER BY b;
b
1
2
flush tables;
SELECT b FROM t1 LEFT JOIN t2 ON t2.c = a WHERE a IS NULL ORDER BY b;
b
1
2
drop table t1,t2;
# Second test in MDEV-30333
CREATE TABLE t1 (a int, b varchar(10)) ENGINE=MyISAM;
INSERT INTO t1 VALUES (69,'foo'),(71,'bar');
CREATE TABLE t2 (c int) ENGINE=MyISAM;
INSERT INTO t2 VALUES (1),(2);
CREATE TABLE t3 (d int, e int, KEY(e)) ENGINE=MyISAM;
SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 ON t3.e = t3.d ON 1;
a b c d e
69 foo 1 NULL NULL
71 bar 1 NULL NULL
69 foo 2 NULL NULL
71 bar 2 NULL NULL
SET optimizer_switch = 'not_null_range_scan=on';
SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 ON t3.e = t3.d ON 1;
a b c d e
69 foo 1 NULL NULL
71 bar 1 NULL NULL
69 foo 2 NULL NULL
71 bar 2 NULL NULL
DROP TABLE t1, t2, t3;
set @@optimizer_switch=@save_optimizer_switch;
End of 10.5 tests

View File

@@ -21,4 +21,38 @@ drop table t1;
select * from t2; select * from t2;
show status like "Empty_queries"; show status like "Empty_queries";
# End of 4.1 tests --echo # End of 4.1 tests
--echo #
--echo # MDEV-30333 Wrong result with not_null_range_scan and LEFT JOIN with empty table
--echo #
set @save_optimizer_switch=@@optimizer_switch;
CREATE TABLE t1 (a INT, b INT) ENGINE=MyISAM;
INSERT INTO t1 (b) VALUES (1),(2);
CREATE TABLE t2 (c INT) ENGINE=MyISAM;
SET optimizer_switch= 'not_null_range_scan=off'; # Default
explain extended SELECT b FROM t1 LEFT JOIN t2 ON t2.c = a WHERE a IS NULL ORDER BY b;
SELECT b FROM t1 LEFT JOIN t2 ON t2.c = a WHERE a IS NULL ORDER BY b;
SET optimizer_switch = 'not_null_range_scan=on';
explain extended SELECT b FROM t1 LEFT JOIN t2 ON t2.c = a WHERE a IS NULL ORDER BY b;
SELECT b FROM t1 LEFT JOIN t2 ON t2.c = a WHERE a IS NULL ORDER BY b;
flush tables;
SELECT b FROM t1 LEFT JOIN t2 ON t2.c = a WHERE a IS NULL ORDER BY b;
drop table t1,t2;
--echo # Second test in MDEV-30333
CREATE TABLE t1 (a int, b varchar(10)) ENGINE=MyISAM;
INSERT INTO t1 VALUES (69,'foo'),(71,'bar');
CREATE TABLE t2 (c int) ENGINE=MyISAM;
INSERT INTO t2 VALUES (1),(2);
CREATE TABLE t3 (d int, e int, KEY(e)) ENGINE=MyISAM;
SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 ON t3.e = t3.d ON 1;
SET optimizer_switch = 'not_null_range_scan=on';
SELECT * FROM t1 LEFT JOIN t2 LEFT JOIN t3 ON t3.e = t3.d ON 1;
DROP TABLE t1, t2, t3;
set @@optimizer_switch=@save_optimizer_switch;
--echo End of 10.5 tests

View File

@@ -1378,3 +1378,31 @@ a
bar bar
foo foo
DROP TABLE t; DROP TABLE t;
#
# MDEV-30324: Wrong result upon SELECT DISTINCT .. WITH TIES using index
#
CREATE TABLE t1 (a int, b char(3), KEY (a));
INSERT INTO t1 VALUES (2,'foo'),(3,'bar'),(3,'bar'),(3,'zzz');
EXPLAIN SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 1 ROWS WITH TIES;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL a 5 NULL 1 Using temporary
SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 1 ROWS WITH TIES;
a b
2 foo
EXPLAIN SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 2 ROWS WITH TIES;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index NULL a 5 NULL 2 Using temporary
SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 2 ROWS WITH TIES;
a b
2 foo
3 bar
3 zzz
EXPLAIN SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 3 ROWS WITH TIES;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using temporary; Using filesort
SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 3 ROWS WITH TIES;
a b
2 foo
3 bar
3 zzz
DROP TABLE t1;

View File

@@ -1059,3 +1059,22 @@ SELECT a FROM t ORDER BY a FETCH FIRST 2 ROWS WITH TIES;
# Cleanup # Cleanup
DROP TABLE t; DROP TABLE t;
--echo #
--echo # MDEV-30324: Wrong result upon SELECT DISTINCT .. WITH TIES using index
--echo #
CREATE TABLE t1 (a int, b char(3), KEY (a));
INSERT INTO t1 VALUES (2,'foo'),(3,'bar'),(3,'bar'),(3,'zzz');
EXPLAIN SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 1 ROWS WITH TIES;
--sorted_result
SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 1 ROWS WITH TIES;
EXPLAIN SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 2 ROWS WITH TIES;
--sorted_result
SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 2 ROWS WITH TIES;
EXPLAIN SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 3 ROWS WITH TIES;
--sorted_result
SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 3 ROWS WITH TIES;
# Cleanup
DROP TABLE t1;

View File

@@ -1623,6 +1623,21 @@ id doc
{"$oid":"611c0a463b150154132f6636"} { "_id" : { "$oid" : "611c0a463b150154132f6636" }, "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : 1.0 } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } {"$oid":"611c0a463b150154132f6636"} { "_id" : { "$oid" : "611c0a463b150154132f6636" }, "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : 1.0 } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] }
DROP TABLE arrNestTest; DROP TABLE arrNestTest;
# #
# MDEV-30412 JSON_OBJECTAGG doesn't escape double quote in key
#
SELECT JSON_OBJECTAGG('"', 1);
JSON_OBJECTAGG('"', 1)
{"\"":1}
SELECT JSON_OBJECTAGG('\"', 1);
JSON_OBJECTAGG('\"', 1)
{"\"":1}
SELECT JSON_OBJECTAGG('\\', 1);
JSON_OBJECTAGG('\\', 1)
{"\\":1}
#
# End of 10.5 tests
#
#
# MDEV-26054 Server crashes in Item_func_json_arrayagg::get_str_from_field # MDEV-26054 Server crashes in Item_func_json_arrayagg::get_str_from_field
# #
CREATE TABLE t (a VARCHAR(8)); CREATE TABLE t (a VARCHAR(8));
@@ -1649,7 +1664,7 @@ JSON_INSERT(JSON_OBJECT(l1, l2, l3, l4), '$.k3', 'v3') JSON_SET(JSON_OBJECT(l1,
{"k1": "v1", "k2": "v2", "k3": "v3"} {"k1": "v1", "k2": "new v2"} {"k1": "v1", "k2": "new v2"} {"k1": "v1", "k2": "v2", "k3": "v3"} {"k1": "v1", "k2": "new v2"} {"k1": "v1", "k2": "new v2"}
DROP TABLE t; DROP TABLE t;
# #
# End of 10.5 tests # End of 10.6 tests
# #
# #
# Beginning of 10.9 tests # Beginning of 10.9 tests
@@ -2536,9 +2551,6 @@ JSON_EXTRACT(j, '$[*]')
[{"key1": 3, "key2": 3}, {"key3": 3, "key4": 3}, {"key5": 3}] [{"key1": 3, "key2": 3}, {"key3": 3, "key4": 3}, {"key5": 3}]
DROP TABLE t1; DROP TABLE t1;
# #
# End of 10.9 Test
#
#
# MDEV-29381: JSON paths containing dashes are reported as syntax errors in procedures # MDEV-29381: JSON paths containing dashes are reported as syntax errors in procedures
# #
SELECT JSON_EXTRACT('{ "my-key": 1 }', '$."my-key"'); SELECT JSON_EXTRACT('{ "my-key": 1 }', '$."my-key"');
@@ -2547,3 +2559,6 @@ JSON_EXTRACT('{ "my-key": 1 }', '$."my-key"')
SELECT JSON_EXTRACT('{ "my-key": 1 }', '$.my-key'); SELECT JSON_EXTRACT('{ "my-key": 1 }', '$.my-key');
JSON_EXTRACT('{ "my-key": 1 }', '$.my-key') JSON_EXTRACT('{ "my-key": 1 }', '$.my-key')
1 1
#
# End of 10.9 Test
#

View File

@@ -1067,6 +1067,18 @@ INSERT INTO test.arrNestTest (doc) VALUES ('{ "_id" : { "$oid" : "611c0a463b1501
SELECT * FROM arrNestTest; SELECT * FROM arrNestTest;
DROP TABLE arrNestTest; DROP TABLE arrNestTest;
--echo #
--echo # MDEV-30412 JSON_OBJECTAGG doesn't escape double quote in key
--echo #
SELECT JSON_OBJECTAGG('"', 1);
SELECT JSON_OBJECTAGG('\"', 1);
SELECT JSON_OBJECTAGG('\\', 1);
--echo #
--echo # End of 10.5 tests
--echo #
--echo # --echo #
--echo # MDEV-26054 Server crashes in Item_func_json_arrayagg::get_str_from_field --echo # MDEV-26054 Server crashes in Item_func_json_arrayagg::get_str_from_field
--echo # --echo #
@@ -1078,7 +1090,6 @@ SELECT JSON_ARRAYAGG(a) AS f FROM v;
DROP VIEW v; DROP VIEW v;
DROP TABLE t; DROP TABLE t;
--echo # --echo #
--echo # MDEV-29264 JSON functions overflow error based ON LONGTEXT field --echo # MDEV-29264 JSON functions overflow error based ON LONGTEXT field
--echo # --echo #
@@ -1090,8 +1101,9 @@ SELECT JSON_INSERT(JSON_OBJECT(l1, l2, l3, l4), '$.k3', 'v3'),JSON_SET(JSON_OBJE
DROP TABLE t; DROP TABLE t;
--echo # --echo #
--echo # End of 10.5 tests --echo # End of 10.6 tests
--echo # --echo #
--echo # --echo #
--echo # Beginning of 10.9 tests --echo # Beginning of 10.9 tests
--echo # --echo #
@@ -1733,13 +1745,13 @@ SELECT JSON_EXTRACT(j, '$[*]') FROM t1 ;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # End of 10.9 Test
--echo #
--echo # --echo #
--echo # MDEV-29381: JSON paths containing dashes are reported as syntax errors in procedures --echo # MDEV-29381: JSON paths containing dashes are reported as syntax errors in procedures
--echo # --echo #
SELECT JSON_EXTRACT('{ "my-key": 1 }', '$."my-key"'); SELECT JSON_EXTRACT('{ "my-key": 1 }', '$."my-key"');
SELECT JSON_EXTRACT('{ "my-key": 1 }', '$.my-key'); SELECT JSON_EXTRACT('{ "my-key": 1 }', '$.my-key');
--echo #
--echo # End of 10.9 Test
--echo #

View File

@@ -1269,3 +1269,123 @@ EXPLAIN
} }
} }
DROP TABLES t1, t2; DROP TABLES t1, t2;
# End of 10.3 tests
#
# MDEV-28538: multi-table UPDATE/DELETE with possible exists-to-in
#
create table t1 (c1 int, c2 int, c3 int, index idx(c2));
insert into t1 values
(1,1,1),(3,2,2),(1,3,3),
(2,1,4),(2,2,5),(4,3,6),
(2,4,7),(2,5,8);
create table t2 (c1 int, c2 int, c3 int, index idx(c2));
insert into t2 values
(1,7,1),(1,8,2),(1,3,3),
(2,1,4),(2,2,5),(2,3,6),
(2,4,7),(2,5,8);
create table t3 (c1 int, c2 int, c3 int, index idx(c2));
insert into t3 values
(1,1,1),(1,2,2),(1,3,3),
(2,1,4),(2,2,5),(2,3,6),
(2,4,7),(2,5,8);
insert into t3 select c1+1, c2+2, c3 from t3;
insert into t3 select c1, c2+2, c3 from t3;
analyze table t1,t2,t3 persistent for all;
Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK
test.t2 analyze status Engine-independent statistics collected
test.t2 analyze status OK
test.t3 analyze status Engine-independent statistics collected
test.t3 analyze status OK
explain select * from t1,t3
where t1.c2 = t3.c2 and
t1.c1 > 1 and
exists (select 'X' from t2 where t2.c1 = t1.c1 and t2.c2 > 4);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL idx NULL NULL NULL 8 Using where
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
1 PRIMARY t3 ref idx idx 5 test.t1.c2 3
2 MATERIALIZED t2 range idx idx 5 NULL 3 Using index condition; Using where
explain delete from t1 using t1,t3
where t1.c2 = t3.c2 and
t1.c1 > 1 and
exists (select 'X' from t2 where t2.c1 = t1.c1 and t2.c2 > 4);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL idx NULL NULL NULL 8 Using where
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
1 PRIMARY t3 ref idx idx 5 test.t1.c2 3 Using index
2 MATERIALIZED t2 range idx idx 5 NULL 3 Using where
explain update t1,t3 set t1.c1 = t1.c1+10
where t1.c2 = t3.c2 and
t1.c1 > 1 and
exists (select 'X' from t2 where t2.c1 = t1.c1 and t2.c2 > 4);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL idx NULL NULL NULL 8 Using where
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
1 PRIMARY t3 ref idx idx 5 test.t1.c2 3 Using index
2 MATERIALIZED t2 range idx idx 5 NULL 3 Using where
create table t as select * from t1;
select * from t1,t3
where t1.c2 = t3.c2 and
t1.c1 > 1 and
exists (select 'X' from t2 where t2.c1 = t1.c1 and t2.c2 > 4);
c1 c2 c3 c1 c2 c3
2 1 4 1 1 1
2 1 4 2 1 4
2 2 5 1 2 2
2 2 5 2 2 5
2 4 7 2 4 7
2 4 7 2 4 2
2 4 7 3 4 5
2 4 7 1 4 2
2 4 7 2 4 5
2 5 8 2 5 8
2 5 8 2 5 3
2 5 8 3 5 6
2 5 8 1 5 3
2 5 8 2 5 6
2 5 8 2 5 1
2 5 8 3 5 4
select * from t1;
c1 c2 c3
1 1 1
3 2 2
1 3 3
2 1 4
2 2 5
4 3 6
2 4 7
2 5 8
delete from t1 using t1,t3
where t1.c2 = t3.c2 and
t1.c1 > 1 and
exists (select 'X' from t2 where t2.c1 = t1.c1 and t2.c2 > 4);
select * from t1;
c1 c2 c3
1 1 1
3 2 2
1 3 3
4 3 6
truncate table t1;
insert into t1 select * from t;
analyze table t1 persistent for all;
Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status Table is already up to date
update t1,t3 set t1.c1 = t1.c1+10
where t1.c2 = t3.c2 and
t1.c1 > 1 and
exists (select 'X' from t2 where t2.c1 = t1.c1 and t2.c2 > 4);
select * from t1;
c1 c2 c3
1 1 1
3 2 2
1 3 3
12 1 4
12 2 5
4 3 6
12 4 7
12 5 8
drop table t1,t2,t3,t;
# End of 10.4 tests

View File

@@ -1130,3 +1130,73 @@ EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=2 WHERE t2.part=1 AND
EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=3 WHERE t2.part=2 AND t1.part=2; EXPLAIN FORMAT=JSON UPDATE t2 JOIN t1 USING(a) SET t2.part=3 WHERE t2.part=2 AND t1.part=2;
DROP TABLES t1, t2; DROP TABLES t1, t2;
--echo # End of 10.3 tests
--echo #
--echo # MDEV-28538: multi-table UPDATE/DELETE with possible exists-to-in
--echo #
create table t1 (c1 int, c2 int, c3 int, index idx(c2));
insert into t1 values
(1,1,1),(3,2,2),(1,3,3),
(2,1,4),(2,2,5),(4,3,6),
(2,4,7),(2,5,8);
create table t2 (c1 int, c2 int, c3 int, index idx(c2));
insert into t2 values
(1,7,1),(1,8,2),(1,3,3),
(2,1,4),(2,2,5),(2,3,6),
(2,4,7),(2,5,8);
create table t3 (c1 int, c2 int, c3 int, index idx(c2));
insert into t3 values
(1,1,1),(1,2,2),(1,3,3),
(2,1,4),(2,2,5),(2,3,6),
(2,4,7),(2,5,8);
insert into t3 select c1+1, c2+2, c3 from t3;
insert into t3 select c1, c2+2, c3 from t3;
analyze table t1,t2,t3 persistent for all;
let $c=
t1.c2 = t3.c2 and
t1.c1 > 1 and
exists (select 'X' from t2 where t2.c1 = t1.c1 and t2.c2 > 4);
let $q1=
select * from t1,t3
where $c;
eval explain $q1;
let $q2=
delete from t1 using t1,t3
where $c;
eval explain $q2;
let $q3=
update t1,t3 set t1.c1 = t1.c1+10
where $c;
eval explain $q3;
create table t as select * from t1;
eval $q1;
select * from t1;
eval $q2;
select * from t1;
truncate table t1;
insert into t1 select * from t;
analyze table t1 persistent for all;
eval $q3;
select * from t1;
drop table t1,t2,t3,t;
--echo # End of 10.4 tests

View File

@@ -76,7 +76,8 @@ rollback;
explain update t1 set c1=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 > 3; explain update t1 set c1=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 > 3;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where 1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where
2 DEPENDENT SUBQUERY a ALL NULL NULL NULL NULL 8 Using where 1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
2 MATERIALIZED a ALL NULL NULL NULL NULL 8
start transaction; start transaction;
update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3; update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
affected rows: 4 affected rows: 4
@@ -317,7 +318,8 @@ rollback;
explain update t1 set c1=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 > 3; explain update t1 set c1=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 > 3;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 range t1_c2 t1_c2 5 NULL 2 Using where 1 PRIMARY t1 range t1_c2 t1_c2 5 NULL 2 Using where
2 DEPENDENT SUBQUERY a ref t1_c2 t1_c2 5 test.t1.c2 4 Using index 1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
2 MATERIALIZED a range t1_c2 t1_c2 5 NULL 2 Using where; Using index
start transaction; start transaction;
update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3; update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
affected rows: 4 affected rows: 4
@@ -558,7 +560,8 @@ rollback;
explain update t1 set c1=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 > 3; explain update t1 set c1=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 > 3;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 range t1_c2 t1_c2 5 NULL 2 Using where 1 PRIMARY t1 range t1_c2 t1_c2 5 NULL 2 Using where
2 DEPENDENT SUBQUERY a ref t1_c2 t1_c2 5 test.t1.c2 1 Using index 1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
2 MATERIALIZED a range t1_c2 t1_c2 5 NULL 2 Using where; Using index
start transaction; start transaction;
update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3; update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
affected rows: 4 affected rows: 4
@@ -800,7 +803,8 @@ rollback;
explain update t1 set c1=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 > 3; explain update t1 set c1=0 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 > 3;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 range t1_c2 t1_c2 5 NULL 2 Using where 1 PRIMARY t1 range t1_c2 t1_c2 5 NULL 2 Using where
2 DEPENDENT SUBQUERY a ref t1_c2 t1_c2 5 test.t1.c2 1 Using index 1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
2 MATERIALIZED a range t1_c2 t1_c2 5 NULL 2 Using where; Using index
start transaction; start transaction;
update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3; update t1 set c1=c1+10 where exists (select 'X' from t1 a where a.c2 = t1.c2) and c2 >= 3;
affected rows: 4 affected rows: 4

View File

@@ -145,6 +145,7 @@ my $opt_start_exit;
my $start_only; my $start_only;
my $file_wsrep_provider; my $file_wsrep_provider;
my $num_saved_cores= 0; # Number of core files saved in vardir/log/ so far. my $num_saved_cores= 0; # Number of core files saved in vardir/log/ so far.
my $test_name_for_report;
our @global_suppressions; our @global_suppressions;
@@ -515,13 +516,13 @@ sub main {
} }
if ( not @$completed ) { if ( not @$completed ) {
my $test_name= mtr_grab_file($path_testlog); if ($test_name_for_report)
$test_name =~ s/^CURRENT_TEST:\s//; {
chomp($test_name); my $tinfo = My::Test->new(name => $test_name_for_report);
my $tinfo = My::Test->new(name => $test_name); $tinfo->{result}= 'MTR_RES_FAILED';
$tinfo->{result}= 'MTR_RES_FAILED'; $tinfo->{comment}=' ';
$tinfo->{comment}=' '; mtr_report_test($tinfo);
mtr_report_test($tinfo); }
mtr_error("Test suite aborted"); mtr_error("Test suite aborted");
} }
@@ -3740,8 +3741,8 @@ sub resfile_report_test ($) {
sub run_testcase ($$) { sub run_testcase ($$) {
my ($tinfo, $server_socket)= @_; my ($tinfo, $server_socket)= @_;
my $print_freq=20; my $print_freq=20;
$test_name_for_report= $tinfo->{name};
mtr_verbose("Running test:", $tinfo->{name}); mtr_verbose("Running test:", $test_name_for_report);
$ENV{'MTR_TEST_NAME'} = $tinfo->{name}; $ENV{'MTR_TEST_NAME'} = $tinfo->{name};
resfile_report_test($tinfo) if $opt_resfile; resfile_report_test($tinfo) if $opt_resfile;
@@ -5130,12 +5131,10 @@ sub mysqld_start ($$) {
if (!$rc) if (!$rc)
{ {
# Report failure about the last test case before exit # Report failure about the last test case before exit
my $test_name= mtr_grab_file($path_current_testlog); my $tinfo = My::Test->new(name => $test_name_for_report);
$test_name =~ s/^CURRENT_TEST:\s//;
my $tinfo = My::Test->new(name => $test_name);
$tinfo->{result}= 'MTR_RES_FAILED'; $tinfo->{result}= 'MTR_RES_FAILED';
$tinfo->{failures}= 1; $tinfo->{failures}= 1;
$tinfo->{logfile}=get_log_from_proc($mysqld->{'proc'}, $tinfo->{name}); $tinfo->{logfile}=get_log_from_proc($mysqld->{'proc'}, $test_name_for_report);
report_option('verbose', 1); report_option('verbose', 1);
mtr_report_test($tinfo); mtr_report_test($tinfo);
} }

View File

@@ -1,23 +0,0 @@
connection node_2;
connection node_1;
CREATE TABLE t1 (c1 BIGINT NOT NULL PRIMARY KEY, c2 BINARY (10), c3 DATETIME);
SELECT get_lock ('test2', 0);
get_lock ('test2', 0)
1
DROP TABLE t1;
CREATE TABLE t1 (c1 SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY);
INSERT INTO t1 VALUES (1);
SET SESSION wsrep_trx_fragment_size=10;
SET SESSION autocommit=0;
SELECT * FROM t1 WHERE c1 <=0 ORDER BY c1 DESC;
c1
INSERT INTO t1 VALUES (4),(3),(1),(2);
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE;
ERROR 42S01: Table 't1' already exists
ALTER TABLE t1 DROP COLUMN c2;
ERROR 42000: Can't DROP COLUMN `c2`; check that it exists
SELECT get_lock ('test', 1.5);
get_lock ('test', 1.5)
1
DROP TABLE t1;

View File

@@ -0,0 +1,6 @@
connection node_2;
connection node_1;
BACKUP STAGE START;
START TRANSACTION;
COMMIT;
BACKUP STAGE END;

View File

@@ -1,18 +0,0 @@
connection node_2;
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
connection node_2a;
SELECT GET_LOCK("foo", 1000);
GET_LOCK("foo", 1000)
1
connection node_2;
SET AUTOCOMMIT=OFF;
INSERT INTO t1 VALUES (1);
SELECT GET_LOCK("foo", 1000);;
connection node_1;
INSERT INTO t1 VALUES (1);
connection node_2;
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
wsrep_local_aborts_increment
1
DROP TABLE t1;

View File

@@ -0,0 +1,24 @@
connection node_2;
connection node_1;
CREATE TABLE t (c DOUBLE,c2 INT,PRIMARY KEY(c)) ENGINE=InnoDB;
INSERT INTO t values (1,1);
SELECT GET_LOCK('a',1);
ERROR 42000: This version of MariaDB doesn't yet support 'GET_LOCK in cluster (WSREP_ON=ON)'
SHOW WARNINGS;
Level Code Message
Error 1235 This version of MariaDB doesn't yet support 'GET_LOCK in cluster (WSREP_ON=ON)'
SELECT * FROM t;
c c2
1 1
SELECT RELEASE_LOCK('a');
ERROR 42000: This version of MariaDB doesn't yet support 'RELEASE_LOCK in cluster (WSREP_ON=ON)'
SHOW WARNINGS;
Level Code Message
Error 1235 This version of MariaDB doesn't yet support 'RELEASE_LOCK in cluster (WSREP_ON=ON)'
SELECT RELEASE_ALL_LOCKS();
ERROR 42000: This version of MariaDB doesn't yet support 'RELEASE_ALL_LOCKS in cluster (WSREP_ON=ON)'
SHOW WARNINGS;
Level Code Message
Error 1235 This version of MariaDB doesn't yet support 'RELEASE_ALL_LOCKS in cluster (WSREP_ON=ON)'
COMMIT;
DROP TABLE t;

View File

@@ -1,20 +0,0 @@
--source include/galera_cluster.inc
--source include/have_sequence.inc
CREATE TABLE t1 (c1 BIGINT NOT NULL PRIMARY KEY, c2 BINARY (10), c3 DATETIME);
SELECT get_lock ('test2', 0);
DROP TABLE t1;
CREATE TABLE t1 (c1 SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY);
INSERT INTO t1 VALUES (1);
SET SESSION wsrep_trx_fragment_size=10;
SET SESSION autocommit=0;
SELECT * FROM t1 WHERE c1 <=0 ORDER BY c1 DESC;
--error ER_LOCK_DEADLOCK
INSERT INTO t1 VALUES (4),(3),(1),(2);
--error ER_TABLE_EXISTS_ERROR
CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE;
--error ER_CANT_DROP_FIELD_OR_KEY
ALTER TABLE t1 DROP COLUMN c2;
SELECT get_lock ('test', 1.5);
DROP TABLE t1;

View File

@@ -0,0 +1,6 @@
--source include/galera_cluster.inc
BACKUP STAGE START;
START TRANSACTION;
COMMIT;
BACKUP STAGE END;

View File

@@ -1,36 +0,0 @@
--source include/galera_cluster.inc
--source include/have_innodb.inc
#
# Test a local transaction being aborted by a slave one while it is running a GET_LOCK()
#
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
--let $galera_connection_name = node_2a
--let $galera_server_number = 2
--source include/galera_connect.inc
--connection node_2a
SELECT GET_LOCK("foo", 1000);
--connection node_2
SET AUTOCOMMIT=OFF;
--let $wsrep_local_bf_aborts_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'`
INSERT INTO t1 VALUES (1);
--send SELECT GET_LOCK("foo", 1000);
--connection node_1
INSERT INTO t1 VALUES (1);
--connection node_2
--error ER_LOCK_DEADLOCK
--reap
--let $wsrep_local_bf_aborts_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'`
# Check that wsrep_local_bf_aborts has been incremented by exactly 1
--disable_query_log
--eval SELECT $wsrep_local_bf_aborts_after - $wsrep_local_bf_aborts_before = 1 AS wsrep_local_aborts_increment;
--enable_query_log
DROP TABLE t1;

View File

@@ -0,0 +1,18 @@
--source include/galera_cluster.inc
CREATE TABLE t (c DOUBLE,c2 INT,PRIMARY KEY(c)) ENGINE=InnoDB;
INSERT INTO t values (1,1);
--error ER_NOT_SUPPORTED_YET
SELECT GET_LOCK('a',1);
SHOW WARNINGS;
SELECT * FROM t;
--error ER_NOT_SUPPORTED_YET
SELECT RELEASE_LOCK('a');
SHOW WARNINGS;
# New in 10.5
--error ER_NOT_SUPPORTED_YET
SELECT RELEASE_ALL_LOCKS();
SHOW WARNINGS;
COMMIT;
DROP TABLE t;

View File

@@ -51,7 +51,7 @@ ADD INDEX(a,b,d), ADD INDEX(a,d,b), ADD INDEX(b,c,d), ADD INDEX(b,d,c),
ALGORITHM=COPY; ALGORITHM=COPY;
connection default; connection default;
SET DEBUG_SYNC='now WAIT_FOR hung'; SET DEBUG_SYNC='now WAIT_FOR hung';
# restart: --innodb-force-recovery=3 # restart: --innodb-force-recovery=3 --debug_dbug=+d,recv_ran_out_of_buffer
disconnect hang; disconnect hang;
FTS_INDEX_1.ibd FTS_INDEX_1.ibd
FTS_INDEX_2.ibd FTS_INDEX_2.ibd

View File

@@ -405,3 +405,21 @@ nb_corrupted_rows
0 0
DROP TABLE t1; DROP TABLE t1;
# End of 10.7 tests # End of 10.7 tests
#
# MDEV-30426 Assertion !rec_offs_nth_extern(offsets2, n)
# during bulk insert
#
CREATE TABLE t1(f1 TEXT NOT NULL, f2 TEXT NOT NULL,
f3 TEXT NOT NULL, f4 TEXT NOT NULL,
f5 TEXT NOT NULL, f6 TEXT NOT NULL,
PRIMARY KEY(f6(10)))ENGINE=InnoDB;
BEGIN;
INSERT INTO t1 VALUES
(repeat('a', 200), repeat('b', 200), repeat('c', 200),
repeat('d', 200), repeat('e', 200), repeat('f', 200)),
(repeat('b', 20000), repeat('c', 16000), repeat('d', 12000),
repeat('e', 12000), repeat('f', 12000), repeat('f', 12000));
ERROR HY000: Got error 1 "Operation not permitted" during COMMIT
COMMIT;
DROP TABLE t1;
# End of 10.8 tests

View File

@@ -31,11 +31,12 @@ pk f1 f2 f3
3 t q 1 3 t q 1
5 z t NULL 5 z t NULL
SET DEBUG_SYNC='now SIGNAL default_dml'; SET DEBUG_SYNC='now SIGNAL default_dml';
SET DEBUG_SYNC='now SIGNAL con2_dml';
connection default; connection default;
SET DEBUG_SYNC='now WAIT_FOR default_dml'; SET DEBUG_SYNC='now WAIT_FOR default_dml';
UPDATE t3 AS alias1 LEFT JOIN t3 AS alias2 ON ( alias1.f1 <> alias1.f2 ) SET alias1.f3 = 59 WHERE ( EXISTS ( SELECT t1.f3 FROM t1 WHERE t1.f1 = alias1.f1 ) ) OR alias2.f1 = 'h'; UPDATE t3 AS alias1 LEFT JOIN t3 AS alias2 ON ( alias1.f1 <> alias1.f2 ) SET alias1.f3 = 59 WHERE ( EXISTS ( SELECT t1.f3 FROM t1 WHERE t1.f1 = alias1.f1 ) ) OR alias2.f1 = 'h';
connect con2,localhost,root,,test; connect con2,localhost,root,,test;
set debug_sync='now WAIT_FOR default_dml'; set debug_sync='now WAIT_FOR con2_dml';
SET DEBUG_SYNC='now SIGNAL con1_dml2'; SET DEBUG_SYNC='now SIGNAL con1_dml2';
disconnect con2; disconnect con2;
connection con1; connection con1;

View File

@@ -1,3 +1,7 @@
call mtr.add_suppression("InnoDB: The change buffer is corrupted");
call mtr.add_suppression("InnoDB: Plugin initialization aborted at srv0start.cc");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed.");
CREATE TABLE t1(c TEXT, KEY(c(3072)))ENGINE=InnoDB; CREATE TABLE t1(c TEXT, KEY(c(3072)))ENGINE=InnoDB;
CREATE PROCEDURE dorepeat() CREATE PROCEDURE dorepeat()
LOOP LOOP
@@ -10,3 +14,19 @@ CALL dorepeat();
connection default; connection default;
# restart: --innodb_buffer_pool_size=5242880 # restart: --innodb_buffer_pool_size=5242880
DROP TABLE t1; DROP TABLE t1;
DROP PROCEDURE dorepeat;
#
# MDEV-30552 InnoDB recovery crashes when error
# handling scenario
#
SET DEBUG_DBUG="+d,ib_log_checkpoint_avoid_hard";
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
INSERT INTO t1 SELECT * FROM seq_1_to_65536;
# restart: with restart_parameters
# restart
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
DROP TABLE t1;

View File

@@ -57,7 +57,7 @@ ALTER TABLE t ADD INDEX(b,c,d,a),ADD INDEX(b,c,a,d),ADD INDEX(b,a,c,d),ADD INDEX
connection default; connection default;
SET DEBUG_SYNC='now WAIT_FOR hung'; SET DEBUG_SYNC='now WAIT_FOR hung';
let $shutdown_timeout=0; let $shutdown_timeout=0;
--let $restart_parameters= --innodb-force-recovery=3 --let $restart_parameters= --innodb-force-recovery=3 --debug_dbug="+d,recv_ran_out_of_buffer"
--source include/restart_mysqld.inc --source include/restart_mysqld.inc
disconnect hang; disconnect hang;
let $shutdown_timeout=; let $shutdown_timeout=;

View File

@@ -0,0 +1 @@
--innodb_sort_buffer_size=65536

View File

@@ -424,3 +424,22 @@ SELECT COUNT(*) AS nb_corrupted_rows FROM t1 WHERE data != REPEAT('X', @@innodb_
DROP TABLE t1; DROP TABLE t1;
--echo # End of 10.7 tests --echo # End of 10.7 tests
--echo #
--echo # MDEV-30426 Assertion !rec_offs_nth_extern(offsets2, n)
--echo # during bulk insert
--echo #
CREATE TABLE t1(f1 TEXT NOT NULL, f2 TEXT NOT NULL,
f3 TEXT NOT NULL, f4 TEXT NOT NULL,
f5 TEXT NOT NULL, f6 TEXT NOT NULL,
PRIMARY KEY(f6(10)))ENGINE=InnoDB;
BEGIN;
--error ER_ERROR_DURING_COMMIT
INSERT INTO t1 VALUES
(repeat('a', 200), repeat('b', 200), repeat('c', 200),
repeat('d', 200), repeat('e', 200), repeat('f', 200)),
(repeat('b', 20000), repeat('c', 16000), repeat('d', 12000),
repeat('e', 12000), repeat('f', 12000), repeat('f', 12000));
COMMIT;
DROP TABLE t1;
--echo # End of 10.8 tests

View File

@@ -35,6 +35,7 @@ SET DEBUG_SYNC='now WAIT_FOR con1_dml';
begin; begin;
SELECT * FROM t1 for update; # Holds x lock of all records in the table t1 SELECT * FROM t1 for update; # Holds x lock of all records in the table t1
SET DEBUG_SYNC='now SIGNAL default_dml'; SET DEBUG_SYNC='now SIGNAL default_dml';
SET DEBUG_SYNC='now SIGNAL con2_dml';
--connection default --connection default
SET DEBUG_SYNC='now WAIT_FOR default_dml'; SET DEBUG_SYNC='now WAIT_FOR default_dml';
@@ -42,7 +43,7 @@ SET DEBUG_SYNC='now WAIT_FOR default_dml';
# It holds the lock of all record in t3 and tries to acquire record lock for the table t1. # It holds the lock of all record in t3 and tries to acquire record lock for the table t1.
--connect (con2,localhost,root,,test) --connect (con2,localhost,root,,test)
set debug_sync='now WAIT_FOR default_dml'; set debug_sync='now WAIT_FOR con2_dml';
let $wait_condition= let $wait_condition=
select count(*) > 0 from information_schema.innodb_lock_waits; select count(*) > 0 from information_schema.innodb_lock_waits;
--source include/wait_condition.inc --source include/wait_condition.inc

View File

@@ -1,5 +1,11 @@
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/big_test.inc --source include/big_test.inc
--source include/have_sequence.inc
--source include/maybe_debug.inc
call mtr.add_suppression("InnoDB: The change buffer is corrupted");
call mtr.add_suppression("InnoDB: Plugin initialization aborted at srv0start.cc");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed.");
CREATE TABLE t1(c TEXT, KEY(c(3072)))ENGINE=InnoDB; CREATE TABLE t1(c TEXT, KEY(c(3072)))ENGINE=InnoDB;
DELIMITER |; DELIMITER |;
@@ -19,3 +25,27 @@ let $shutdown_timeout=0;
let $restart_parameters=--innodb_buffer_pool_size=5242880; let $restart_parameters=--innodb_buffer_pool_size=5242880;
--source include/restart_mysqld.inc --source include/restart_mysqld.inc
DROP TABLE t1; DROP TABLE t1;
DROP PROCEDURE dorepeat;
--echo #
--echo # MDEV-30552 InnoDB recovery crashes when error
--echo # handling scenario
--echo #
if ($have_debug) {
SET DEBUG_DBUG="+d,ib_log_checkpoint_avoid_hard";
let $restart_parameters=--innodb_buffer_pool_size=5242880 --debug_dbug="+d,ibuf_init_corrupt";
}
if (!$have_debug) {
--echo SET DEBUG_DBUG="+d,ib_log_checkpoint_avoid_hard";
let $restart_parameters=--innodb_buffer_pool_size=5242880;
}
CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB;
INSERT INTO t1 SELECT * FROM seq_1_to_65536;
let $restart_noprint=1;
let $shutdown_timeout=0;
--source include/restart_mysqld.inc
let $restart_noprint=0;
let $restart_parameters=;
--source include/restart_mysqld.inc
SHOW CREATE TABLE t1;
DROP TABLE t1;

View File

@@ -0,0 +1,12 @@
#
# MDEV-30492 Crash when use mariabackup.exe with config 'innodb_flush_method=async_unbuffered'
#
# xtrabackup backup
# xtrabackup prepare
# shutdown server
# remove datadir
# xtrabackup move back
# restart
#
# End of 10.4 tests
#

View File

@@ -0,0 +1,24 @@
--source include/windows.inc
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
--echo #
--echo # MDEV-30492 Crash when use mariabackup.exe with config 'innodb_flush_method=async_unbuffered'
--echo #
echo # xtrabackup backup;
--disable_result_log
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --innodb_flush_method=normal --backup --target-dir=$targetdir;
--enable_result_log
echo # xtrabackup prepare;
--disable_result_log
exec $XTRABACKUP --prepare --innodb-flush-method=async_unbuffered --target-dir=$targetdir;
-- source include/restart_and_restore.inc
--enable_result_log
rmdir $targetdir;
--echo #
--echo # End of 10.4 tests
--echo #

View File

@@ -1,3 +1,4 @@
SET names utf8;
select * from information_schema.locales; select * from information_schema.locales;
ID NAME DESCRIPTION MAX_MONTH_NAME_LENGTH MAX_DAY_NAME_LENGTH DECIMAL_POINT THOUSAND_SEP ERROR_MESSAGE_LANGUAGE ID NAME DESCRIPTION MAX_MONTH_NAME_LENGTH MAX_DAY_NAME_LENGTH DECIMAL_POINT THOUSAND_SEP ERROR_MESSAGE_LANGUAGE
0 en_US English - United States 9 9 . , english 0 en_US English - United States 9 9 . , english
@@ -52,7 +53,7 @@ ID NAME DESCRIPTION MAX_MONTH_NAME_LENGTH MAX_DAY_NAME_LENGTH DECIMAL_POINT THOU
49 ta_IN Tamil - India 10 8 . , english 49 ta_IN Tamil - India 10 8 . , english
50 te_IN Telugu - India 10 9 . , english 50 te_IN Telugu - India 10 9 . , english
51 th_TH Thai - Thailand 10 8 . , english 51 th_TH Thai - Thailand 10 8 . , english
52 tr_TR Turkish - Turkey 7 9 , . english 52 tr_TR Turkish - Türkiye 7 9 , . english
53 uk_UA Ukrainian - Ukraine 8 9 , . ukrainian 53 uk_UA Ukrainian - Ukraine 8 9 , . ukrainian
54 ur_PK Urdu - Pakistan 6 6 . , english 54 ur_PK Urdu - Pakistan 6 6 . , english
55 vi_VN Vietnamese - Vietnam 16 11 , . english 55 vi_VN Vietnamese - Vietnam 16 11 , . english
@@ -165,7 +166,7 @@ Id Name Description Error_Message_Language
49 ta_IN Tamil - India english 49 ta_IN Tamil - India english
50 te_IN Telugu - India english 50 te_IN Telugu - India english
51 th_TH Thai - Thailand english 51 th_TH Thai - Thailand english
52 tr_TR Turkish - Turkey english 52 tr_TR Turkish - Türkiye english
53 uk_UA Ukrainian - Ukraine ukrainian 53 uk_UA Ukrainian - Ukraine ukrainian
54 ur_PK Urdu - Pakistan english 54 ur_PK Urdu - Pakistan english
55 vi_VN Vietnamese - Vietnam english 55 vi_VN Vietnamese - Vietnam english

View File

@@ -2,6 +2,7 @@ if (`select count(*) = 0 from information_schema.plugins where plugin_name = 'lo
{ {
--skip LOCALES plugin is not active --skip LOCALES plugin is not active
} }
SET names utf8;
select * from information_schema.locales; select * from information_schema.locales;
show locales; show locales;

View File

@@ -35,9 +35,19 @@ connection master;
insert into t1 values (1); insert into t1 values (1);
# Sleep 3 to create gap between events # Sleep 3 to create gap between events
insert into t1 values (2); insert into t1 values (2);
include/save_master_pos.inc
connection slave; connection slave;
LOCK TABLES t1 WRITE; LOCK TABLES t1 WRITE;
SET @@global.debug_dbug="+d,pause_sql_thread_on_next_event";
START SLAVE IO_THREAD; START SLAVE IO_THREAD;
# Before we start processing the events, we ensure both transactions
# were written into the relay log. Otherwise, if the IO thread takes too
# long to queue the events, the sql thread can think it has caught up
# too quickly.
SET DEBUG_SYNC='now WAIT_FOR paused_on_event';
include/sync_io_with_master.inc
SET @@global.debug_dbug="-d,pause_sql_thread_on_next_event";
SET DEBUG_SYNC='now SIGNAL sql_thread_continue';
# Wait for first transaction to complete SQL delay and begin execution.. # Wait for first transaction to complete SQL delay and begin execution..
# Validate SBM calculation doesn't use the second transaction because SQL thread shouldn't have gone idle.. # Validate SBM calculation doesn't use the second transaction because SQL thread shouldn't have gone idle..
# ..and that SBM wasn't calculated using prior committed transactions # ..and that SBM wasn't calculated using prior committed transactions
@@ -50,6 +60,8 @@ UNLOCK TABLES;
include/stop_slave.inc include/stop_slave.inc
CHANGE MASTER TO master_delay=0; CHANGE MASTER TO master_delay=0;
set @@GLOBAL.slave_parallel_threads=4; set @@GLOBAL.slave_parallel_threads=4;
SET @@global.debug_dbug="";
SET DEBUG_SYNC='RESET';
include/start_slave.inc include/start_slave.inc
connection master; connection master;
DROP TABLE t1; DROP TABLE t1;

View File

@@ -12,9 +12,12 @@
# #
--source include/master-slave.inc --source include/master-slave.inc
--source include/have_debug.inc
--source include/have_debug_sync.inc
--connection slave --connection slave
--source include/stop_slave.inc --source include/stop_slave.inc
--let $old_debug_dbug= `SELECT @@global.debug_dbug`
--let $master_delay= 3 --let $master_delay= 3
--eval change master to master_delay=$master_delay, master_use_gtid=Slave_Pos --eval change master to master_delay=$master_delay, master_use_gtid=Slave_Pos
--let $old_slave_threads= `SELECT @@GLOBAL.slave_parallel_threads` --let $old_slave_threads= `SELECT @@GLOBAL.slave_parallel_threads`
@@ -82,12 +85,24 @@ sleep 3;
--eval insert into t1 values ($insert_ctr) --eval insert into t1 values ($insert_ctr)
--inc $insert_ctr --inc $insert_ctr
--let $ts_trx_after_ins= `SELECT UNIX_TIMESTAMP()` --let $ts_trx_after_ins= `SELECT UNIX_TIMESTAMP()`
--source include/save_master_pos.inc
--connection slave --connection slave
LOCK TABLES t1 WRITE; LOCK TABLES t1 WRITE;
SET @@global.debug_dbug="+d,pause_sql_thread_on_next_event";
START SLAVE IO_THREAD; START SLAVE IO_THREAD;
--echo # Before we start processing the events, we ensure both transactions
--echo # were written into the relay log. Otherwise, if the IO thread takes too
--echo # long to queue the events, the sql thread can think it has caught up
--echo # too quickly.
SET DEBUG_SYNC='now WAIT_FOR paused_on_event';
--source include/sync_io_with_master.inc
SET @@global.debug_dbug="-d,pause_sql_thread_on_next_event";
SET DEBUG_SYNC='now SIGNAL sql_thread_continue';
--echo # Wait for first transaction to complete SQL delay and begin execution.. --echo # Wait for first transaction to complete SQL delay and begin execution..
--let $wait_condition= SELECT count(*) FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock%' AND command LIKE 'Slave_Worker'; --let $wait_condition= SELECT count(*) FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock%' AND command LIKE 'Slave_Worker';
--source include/wait_condition.inc --source include/wait_condition.inc
@@ -120,6 +135,8 @@ UNLOCK TABLES;
--source include/stop_slave.inc --source include/stop_slave.inc
--eval CHANGE MASTER TO master_delay=0 --eval CHANGE MASTER TO master_delay=0
--eval set @@GLOBAL.slave_parallel_threads=$old_slave_threads --eval set @@GLOBAL.slave_parallel_threads=$old_slave_threads
--eval SET @@global.debug_dbug="$old_debug_dbug"
SET DEBUG_SYNC='RESET';
--source include/start_slave.inc --source include/start_slave.inc
--connection master --connection master

View File

@@ -19,11 +19,12 @@ a b c
1 NULL NULL 1 NULL NULL
set debug_sync='now SIGNAL go'; set debug_sync='now SIGNAL go';
set debug_sync='now WAIT_FOR parked2'; set debug_sync='now WAIT_FOR parked2';
set debug_sync='before_wait_for_refs SIGNAL waiting WAIT_FOR go2'; set debug_sync='before_wait_for_refs SIGNAL waiting WAIT_FOR go3';
drop table t1;; drop table t1;;
connection con2; connection con2;
set debug_sync='now WAIT_FOR waiting'; set debug_sync='now WAIT_FOR waiting';
set debug_sync='now SIGNAL go2'; set debug_sync='now SIGNAL go2';
set debug_sync='now SIGNAL go3';
connection default; connection default;
connection con1; connection con1;
connection default; connection default;

View File

@@ -20,15 +20,12 @@ set debug_sync='now WAIT_FOR parked';
select * from t1; select * from t1;
set debug_sync='now SIGNAL go'; set debug_sync='now SIGNAL go';
set debug_sync='now WAIT_FOR parked2'; set debug_sync='now WAIT_FOR parked2';
set debug_sync='before_wait_for_refs SIGNAL waiting WAIT_FOR go2'; set debug_sync='before_wait_for_refs SIGNAL waiting WAIT_FOR go3';
--send drop table t1; --send drop table t1;
--connection con2 --connection con2
set debug_sync='now WAIT_FOR waiting'; set debug_sync='now WAIT_FOR waiting';
set debug_sync='now SIGNAL go2'; set debug_sync='now SIGNAL go2';
set debug_sync='now SIGNAL go3';
# Write out show processlist if the debug sync point times out
let $wait_condition= select count(*)=0 from information_schema.processlist where state like "%debug%";
source include/wait_condition.inc;
--connection default --connection default
--reap --reap

View File

@@ -2,17 +2,17 @@ select @@global.debug_sync;
ERROR HY000: Variable 'debug_sync' is a SESSION variable ERROR HY000: Variable 'debug_sync' is a SESSION variable
select @@session.debug_sync; select @@session.debug_sync;
@@session.debug_sync @@session.debug_sync
ON - current signal: '' ON - current signals: ''
show global variables like "debug_sync"; show global variables like "debug_sync";
Variable_name Value Variable_name Value
show session variables like "debug_sync"; show session variables like "debug_sync";
Variable_name Value Variable_name Value
debug_sync ON - current signal: '' debug_sync ON - current signals: ''
select * from information_schema.global_variables where variable_name="debug_sync"; select * from information_schema.global_variables where variable_name="debug_sync";
VARIABLE_NAME VARIABLE_VALUE VARIABLE_NAME VARIABLE_VALUE
select * from information_schema.session_variables where variable_name="debug_sync"; select * from information_schema.session_variables where variable_name="debug_sync";
VARIABLE_NAME VARIABLE_VALUE VARIABLE_NAME VARIABLE_VALUE
DEBUG_SYNC ON - current signal: '' DEBUG_SYNC ON - current signals: ''
set @@session.debug_sync=1; set @@session.debug_sync=1;
ERROR 42000: Incorrect argument type to variable 'debug_sync' ERROR 42000: Incorrect argument type to variable 'debug_sync'
set @@session.debug_sync=1.1; set @@session.debug_sync=1.1;

View File

@@ -77,7 +77,7 @@ READ_ONLY YES
COMMAND_LINE_ARGUMENT OPTIONAL COMMAND_LINE_ARGUMENT OPTIONAL
GLOBAL_VALUE_PATH NULL GLOBAL_VALUE_PATH NULL
VARIABLE_NAME DEBUG_SYNC VARIABLE_NAME DEBUG_SYNC
SESSION_VALUE ON - current signal: '' SESSION_VALUE ON - current signals: ''
GLOBAL_VALUE NULL GLOBAL_VALUE NULL
GLOBAL_VALUE_ORIGIN COMPILE-TIME GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE DEFAULT_VALUE

View File

@@ -393,6 +393,8 @@ static int add_collation(struct charset_info_st *cs)
&my_charset_utf8mb4_unicode_ci, &my_charset_utf8mb4_unicode_ci,
cs); cs);
newcs->m_ctype= my_charset_utf8mb4_unicode_ci.m_ctype; newcs->m_ctype= my_charset_utf8mb4_unicode_ci.m_ctype;
if (init_state_maps(newcs))
return MY_XML_ERROR;
newcs->state|= MY_CS_AVAILABLE | MY_CS_LOADED; newcs->state|= MY_CS_AVAILABLE | MY_CS_LOADED;
#endif #endif
} }

View File

@@ -376,7 +376,7 @@ uchar *my_large_malloc(size_t *size, myf my_flags)
ptr= NULL; ptr= NULL;
if (my_flags & MY_WME) if (my_flags & MY_WME)
{ {
if (large_page_size) if (large_page_size && errno == ENOMEM)
{ {
my_printf_error(EE_OUTOFMEMORY, my_printf_error(EE_OUTOFMEMORY,
"Couldn't allocate %zu bytes (Large/HugeTLB memory " "Couldn't allocate %zu bytes (Large/HugeTLB memory "

View File

@@ -34,6 +34,9 @@
#include <execinfo.h> #include <execinfo.h>
#endif #endif
#ifdef HAVE_gcov
#include <gcov.h>
#endif
/** /**
Default handler for printing stacktrace Default handler for printing stacktrace
*/ */
@@ -409,9 +412,6 @@ end:
/* Produce a core for the thread */ /* Produce a core for the thread */
void my_write_core(int sig) void my_write_core(int sig)
{ {
#ifdef HAVE_gcov
extern void __gcov_flush(void);
#endif
signal(sig, SIG_DFL); signal(sig, SIG_DFL);
#ifdef HAVE_gcov #ifdef HAVE_gcov
/* /*
@@ -419,7 +419,7 @@ void my_write_core(int sig)
information from this process, causing gcov output to be incomplete. information from this process, causing gcov output to be incomplete.
So we force the writing of coverage information here before terminating. So we force the writing of coverage information here before terminating.
*/ */
__gcov_flush(); __gcov_dump();
#endif #endif
pthread_kill(pthread_self(), sig); pthread_kill(pthread_self(), sig);
#if defined(P_MYID) && !defined(SCO) #if defined(P_MYID) && !defined(SCO)

View File

@@ -101,7 +101,7 @@ public:
uchar source_tail[MY_AES_BLOCK_SIZE]; uchar source_tail[MY_AES_BLOCK_SIZE];
MyCTX_nopad() : MyCTX() { } MyCTX_nopad() : MyCTX() { }
~MyCTX_nopad() { } ~MyCTX_nopad() = default;
int init(const EVP_CIPHER *cipher, int encrypt, const uchar *key, uint klen, int init(const EVP_CIPHER *cipher, int encrypt, const uchar *key, uint klen,
const uchar *iv, uint ivlen) const uchar *iv, uint ivlen)

View File

@@ -189,9 +189,7 @@ database::database(const config& c)
{ {
} }
database::~database() database::~database() = default;
{
}
dbcontext_ptr dbcontext_ptr
database::create_context(bool for_write) volatile database::create_context(bool for_write) volatile
@@ -226,9 +224,7 @@ dbcontext::dbcontext(volatile database *d, bool for_write)
user_level_lock_timeout = d->get_conf().get_int("wrlock_timeout", 12); user_level_lock_timeout = d->get_conf().get_int("wrlock_timeout", 12);
} }
dbcontext::~dbcontext() dbcontext::~dbcontext() = default;
{
}
namespace { namespace {

View File

@@ -27,7 +27,7 @@ struct dbcontext_i;
typedef std::auto_ptr<dbcontext_i> dbcontext_ptr; typedef std::auto_ptr<dbcontext_i> dbcontext_ptr;
struct database_i { struct database_i {
virtual ~database_i() { } virtual ~database_i() = default;
virtual dbcontext_ptr create_context(bool for_write) volatile = 0; virtual dbcontext_ptr create_context(bool for_write) volatile = 0;
virtual void stop() volatile = 0; virtual void stop() volatile = 0;
virtual const config& get_conf() const volatile = 0; virtual const config& get_conf() const volatile = 0;
@@ -57,7 +57,7 @@ struct prep_stmt {
}; };
struct dbcallback_i { struct dbcallback_i {
virtual ~dbcallback_i () { } virtual ~dbcallback_i() = default;
virtual void dbcb_set_prep_stmt(size_t pst_id, const prep_stmt& v) = 0; virtual void dbcb_set_prep_stmt(size_t pst_id, const prep_stmt& v) = 0;
virtual const prep_stmt *dbcb_get_prep_stmt(size_t pst_id) const = 0; virtual const prep_stmt *dbcb_get_prep_stmt(size_t pst_id) const = 0;
virtual void dbcb_resp_short(uint32_t code, const char *msg) = 0; virtual void dbcb_resp_short(uint32_t code, const char *msg) = 0;
@@ -111,7 +111,7 @@ struct cmd_exec_args {
}; };
struct dbcontext_i { struct dbcontext_i {
virtual ~dbcontext_i() { } virtual ~dbcontext_i() = default;
virtual void init_thread(const void *stack_bottom, virtual void init_thread(const void *stack_bottom,
volatile int& shutdown_flag) = 0; volatile int& shutdown_flag) = 0;
virtual void term_thread() = 0; virtual void term_thread() = 0;

View File

@@ -47,7 +47,7 @@ struct hstcpsvr_i;
typedef std::auto_ptr<hstcpsvr_i> hstcpsvr_ptr; typedef std::auto_ptr<hstcpsvr_i> hstcpsvr_ptr;
struct hstcpsvr_i { struct hstcpsvr_i {
virtual ~hstcpsvr_i() { } virtual ~hstcpsvr_i() = default;
virtual std::string start_listen() = 0; virtual std::string start_listen() = 0;
static hstcpsvr_ptr create(const config& conf); static hstcpsvr_ptr create(const config& conf);
}; };

View File

@@ -24,7 +24,7 @@ struct hstcpsvr_worker_arg {
}; };
struct hstcpsvr_worker_i { struct hstcpsvr_worker_i {
virtual ~hstcpsvr_worker_i() { } virtual ~hstcpsvr_worker_i() = default;
virtual void run() = 0; virtual void run() = 0;
static hstcpsvr_worker_ptr create(const hstcpsvr_worker_arg& arg); static hstcpsvr_worker_ptr create(const hstcpsvr_worker_arg& arg);
}; };

View File

@@ -33,7 +33,7 @@ struct hstcpcli_i;
typedef std::auto_ptr<hstcpcli_i> hstcpcli_ptr; typedef std::auto_ptr<hstcpcli_i> hstcpcli_ptr;
struct hstcpcli_i { struct hstcpcli_i {
virtual ~hstcpcli_i() { } virtual ~hstcpcli_i() = default;
virtual void close() = 0; virtual void close() = 0;
virtual int reconnect() = 0; virtual int reconnect() = 0;
virtual bool stable_point() = 0; virtual bool stable_point() = 0;

View File

@@ -13,7 +13,7 @@ namespace dena {
/* boost::noncopyable */ /* boost::noncopyable */
struct noncopyable { struct noncopyable {
noncopyable() { } noncopyable() = default;
private: private:
noncopyable(const noncopyable&); noncopyable(const noncopyable&);
noncopyable& operator =(const noncopyable&); noncopyable& operator =(const noncopyable&);

View File

@@ -153,7 +153,7 @@ class time_collector
public: public:
time_collector(utility& u): m_utility(&u) { flush(); } time_collector(utility& u): m_utility(&u) { flush(); }
~time_collector() { } ~time_collector() = default;
uint32_t count(uint index) { return m_count[index]; } uint32_t count(uint index) { return m_count[index]; }
uint64_t total(uint index) { return m_total[index]; } uint64_t total(uint index) { return m_total[index]; }
void flush() void flush()

View File

@@ -36,8 +36,8 @@ public:
static Create_func_trt<TRT_FIELD> s_singleton; static Create_func_trt<TRT_FIELD> s_singleton;
protected: protected:
Create_func_trt<TRT_FIELD>() {} Create_func_trt<TRT_FIELD>() = default;
virtual ~Create_func_trt<TRT_FIELD>() {} virtual ~Create_func_trt<TRT_FIELD>() = default;
}; };
template<TR_table::field_id_t TRT_FIELD> template<TR_table::field_id_t TRT_FIELD>
@@ -132,8 +132,8 @@ public:
static Create_func_trt_trx_sees<Item_func_trt_trx_seesX> s_singleton; static Create_func_trt_trx_sees<Item_func_trt_trx_seesX> s_singleton;
protected: protected:
Create_func_trt_trx_sees<Item_func_trt_trx_seesX>() {} Create_func_trt_trx_sees<Item_func_trt_trx_seesX>() = default;
virtual ~Create_func_trt_trx_sees<Item_func_trt_trx_seesX>() {} virtual ~Create_func_trt_trx_sees<Item_func_trt_trx_seesX>() = default;
}; };
template<class X> template<class X>

View File

@@ -18,6 +18,7 @@
#include "mariadb.h" #include "mariadb.h"
#include "debug_sync.h" #include "debug_sync.h"
#include <cstring>
#if defined(ENABLED_DEBUG_SYNC) #if defined(ENABLED_DEBUG_SYNC)
@@ -48,6 +49,8 @@ struct st_debug_sync_action
String wait_for; /* signal to wait for */ String wait_for; /* signal to wait for */
String sync_point; /* sync point name */ String sync_point; /* sync point name */
bool need_sort; /* if new action, array needs sort */ bool need_sort; /* if new action, array needs sort */
bool clear_event; /* do not clear signal when waited
for if false. */
}; };
/* Debug sync control. Referenced by THD. */ /* Debug sync control. Referenced by THD. */
@@ -67,21 +70,99 @@ struct st_debug_sync_control
}; };
/** /**
Definitions for the debug sync facility. Definitions for the debug sync facility.
1. Global string variable to hold a "signal" ("signal post", "flag mast"). 1. Global string variable to hold a set of of "signals".
2. Global condition variable for signaling and waiting. 2. Global condition variable for signaling and waiting.
3. Global mutex to synchronize access to the above. 3. Global mutex to synchronize access to the above.
*/ */
struct st_debug_sync_globals struct st_debug_sync_globals
{ {
String ds_signal; /* signal variable */ Hash_set<LEX_CSTRING> ds_signal_set; /* A set of active signals */
mysql_cond_t ds_cond; /* condition variable */ mysql_cond_t ds_cond; /* condition variable */
mysql_mutex_t ds_mutex; /* mutex variable */ mysql_mutex_t ds_mutex; /* mutex variable */
ulonglong dsp_hits; /* statistics */ ulonglong dsp_hits; /* statistics */
ulonglong dsp_executed; /* statistics */ ulonglong dsp_executed; /* statistics */
ulonglong dsp_max_active; /* statistics */ ulonglong dsp_max_active; /* statistics */
st_debug_sync_globals() : ds_signal_set(PSI_NOT_INSTRUMENTED, signal_key) {};
~st_debug_sync_globals()
{
clear_set();
}
void clear_set()
{
Hash_set<LEX_CSTRING>::Iterator it{ds_signal_set};
LEX_CSTRING *s;
while ((s= it++))
my_free(s);
ds_signal_set.clear();
}
/* Hash key function for ds_signal_set. */
static uchar *signal_key(const LEX_CSTRING *str, size_t *klen, my_bool)
{
*klen= str->length;
return (uchar*) str->str;
}
/**
Return true if the signal is found in global signal list.
@param signal_name Signal name identifying the signal.
@note
If signal is found in the global signal set, it means that the
signal thread has signalled to the waiting thread. This method
must be called with the debug_sync_global.ds_mutex held.
@retval true if signal is found in the global signal list.
@retval false otherwise.
*/
inline bool is_signalled(const char *signal_name, size_t length)
{
return ds_signal_set.find(signal_name, length);
}
void clear_signal(const String &signal_name)
{
DBUG_ENTER("clear_signal");
LEX_CSTRING *record= ds_signal_set.find(signal_name.ptr(),
signal_name.length());
if (record)
{
ds_signal_set.remove(record);
my_free(record);
}
DBUG_VOID_RETURN;
}
bool set_signal(const char *signal_name, size_t length)
{
/* Need to check if the signal is already in the hash set, because
Hash_set doesn't differentiate between OOM and key already in. */
if (is_signalled(signal_name, length))
return FALSE;
/* LEX_CSTRING and the string allocated with only one malloc. */
LEX_CSTRING *s= (LEX_CSTRING *) my_malloc(PSI_NOT_INSTRUMENTED,
sizeof(LEX_CSTRING) + length + 1,
MYF(0));
char *str= (char *)(s + 1);
memcpy(str, signal_name, length);
str[length]= '\0';
s->length= length;
s->str= str;
if (ds_signal_set.insert(s))
return TRUE;
return FALSE;
}
}; };
static st_debug_sync_globals debug_sync_global; /* All globals in one object */ static st_debug_sync_globals debug_sync_global; /* All globals in one object */
/** /**
@@ -161,7 +242,7 @@ int debug_sync_init(void)
int rc; int rc;
/* Initialize the global variables. */ /* Initialize the global variables. */
debug_sync_global.ds_signal.length(0); debug_sync_global.clear_set();
if ((rc= mysql_cond_init(key_debug_sync_globals_ds_cond, if ((rc= mysql_cond_init(key_debug_sync_globals_ds_cond,
&debug_sync_global.ds_cond, NULL)) || &debug_sync_global.ds_cond, NULL)) ||
(rc= mysql_mutex_init(key_debug_sync_globals_ds_mutex, (rc= mysql_mutex_init(key_debug_sync_globals_ds_mutex,
@@ -195,7 +276,7 @@ void debug_sync_end(void)
debug_sync_C_callback_ptr= NULL; debug_sync_C_callback_ptr= NULL;
/* Destroy the global variables. */ /* Destroy the global variables. */
debug_sync_global.ds_signal.free(); debug_sync_global.clear_set();
mysql_cond_destroy(&debug_sync_global.ds_cond); mysql_cond_destroy(&debug_sync_global.ds_cond);
mysql_mutex_destroy(&debug_sync_global.ds_mutex); mysql_mutex_destroy(&debug_sync_global.ds_mutex);
@@ -271,6 +352,40 @@ void debug_sync_init_thread(THD *thd)
} }
/**
Returns an allocated buffer containing a comma-separated C string of all
active signals.
Buffer must be freed by the caller.
*/
static const char *get_signal_set_as_string()
{
mysql_mutex_assert_owner(&debug_sync_global.ds_mutex);
size_t req_size= 1; // In case of empty set for the end '\0' char.
for (size_t i= 0; i < debug_sync_global.ds_signal_set.size(); i++)
req_size+= debug_sync_global.ds_signal_set.at(i)->length + 1;
char *buf= (char *) my_malloc(PSI_NOT_INSTRUMENTED, req_size, MYF(0));
if (!buf)
return nullptr;
memset(buf, '\0', req_size);
char *cur_pos= buf;
for (size_t i= 0; i < debug_sync_global.ds_signal_set.size(); i++)
{
const LEX_CSTRING *signal= debug_sync_global.ds_signal_set.at(i);
memcpy(cur_pos, signal->str, signal->length);
if (i != debug_sync_global.ds_signal_set.size() - 1)
cur_pos[signal->length]= ',';
else
cur_pos[signal->length] = '\0';
cur_pos+= signal->length + 1;
}
return buf;
}
/** /**
End the debug sync facility at thread end. End the debug sync facility at thread end.
@@ -554,7 +669,7 @@ static void debug_sync_reset(THD *thd)
/* Clear the global signal. */ /* Clear the global signal. */
mysql_mutex_lock(&debug_sync_global.ds_mutex); mysql_mutex_lock(&debug_sync_global.ds_mutex);
debug_sync_global.ds_signal.length(0); debug_sync_global.clear_set();
mysql_mutex_unlock(&debug_sync_global.ds_mutex); mysql_mutex_unlock(&debug_sync_global.ds_mutex);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
@@ -1175,6 +1290,7 @@ static bool debug_sync_eval_action(THD *thd, char *action_str, char *action_end)
/* Set default for EXECUTE and TIMEOUT options. */ /* Set default for EXECUTE and TIMEOUT options. */
action->execute= 1; action->execute= 1;
action->timeout= opt_debug_sync_timeout; action->timeout= opt_debug_sync_timeout;
action->clear_event= true;
/* Get next token. If none follows, set action. */ /* Get next token. If none follows, set action. */
if (!(ptr= debug_sync_token(&token, &token_length, ptr, action_end))) if (!(ptr= debug_sync_token(&token, &token_length, ptr, action_end)))
@@ -1225,6 +1341,16 @@ static bool debug_sync_eval_action(THD *thd, char *action_str, char *action_end)
goto set_action; goto set_action;
} }
/*
Try NO_CLEAR_EVENT.
*/
if (!my_strcasecmp(system_charset_info, token, "NO_CLEAR_EVENT"))
{
action->clear_event= false;
/* Get next token. If none follows, set action. */
if (!(ptr = debug_sync_token(&token, &token_length, ptr, action_end))) goto set_action;
}
/* /*
Try HIT_LIMIT. Try HIT_LIMIT.
*/ */
@@ -1325,13 +1451,19 @@ uchar *debug_sync_value_ptr(THD *thd)
if (opt_debug_sync_timeout) if (opt_debug_sync_timeout)
{ {
static char on[]= "ON - current signal: '"; static char on[]= "ON - current signals: '";
// Ensure exclusive access to debug_sync_global.ds_signal // Ensure exclusive access to debug_sync_global.ds_signal
mysql_mutex_lock(&debug_sync_global.ds_mutex); mysql_mutex_lock(&debug_sync_global.ds_mutex);
size_t lgt= (sizeof(on) /* includes '\0' */ + size_t lgt= sizeof(on) + 1; /* +1 as we'll have to append ' at the end. */
debug_sync_global.ds_signal.length() + 1 /* for '\'' */);
for (size_t i= 0; i < debug_sync_global.ds_signal_set.size(); i++)
{
/* Assume each signal is separated by a comma, hence +1. */
lgt+= debug_sync_global.ds_signal_set.at(i)->length + 1;
}
char *vend; char *vend;
char *vptr; char *vptr;
@@ -1339,10 +1471,15 @@ uchar *debug_sync_value_ptr(THD *thd)
{ {
vend= value + lgt - 1; /* reserve space for '\0'. */ vend= value + lgt - 1; /* reserve space for '\0'. */
vptr= debug_sync_bmove_len(value, vend, STRING_WITH_LEN(on)); vptr= debug_sync_bmove_len(value, vend, STRING_WITH_LEN(on));
vptr= debug_sync_bmove_len(vptr, vend, debug_sync_global.ds_signal.ptr(), for (size_t i= 0; i < debug_sync_global.ds_signal_set.size(); i++)
debug_sync_global.ds_signal.length()); {
if (vptr < vend) const LEX_CSTRING *s= debug_sync_global.ds_signal_set.at(i);
*(vptr++)= '\''; vptr= debug_sync_bmove_len(vptr, vend, s->str, s->length);
if (i != debug_sync_global.ds_signal_set.size() - 1)
*(vptr++)= ',';
}
DBUG_ASSERT(vptr < vend);
*(vptr++)= '\'';
*vptr= '\0'; /* We have one byte reserved for the worst case. */ *vptr= '\0'; /* We have one byte reserved for the worst case. */
} }
mysql_mutex_unlock(&debug_sync_global.ds_mutex); mysql_mutex_unlock(&debug_sync_global.ds_mutex);
@@ -1358,6 +1495,9 @@ uchar *debug_sync_value_ptr(THD *thd)
} }
/** /**
Execute requested action at a synchronization point. Execute requested action at a synchronization point.
@@ -1413,12 +1553,28 @@ static void debug_sync_execute(THD *thd, st_debug_sync_action *action)
read access too, to create a memory barrier in order to avoid that read access too, to create a memory barrier in order to avoid that
threads just reads an old cached version of the signal. threads just reads an old cached version of the signal.
*/ */
mysql_mutex_lock(&debug_sync_global.ds_mutex); mysql_mutex_lock(&debug_sync_global.ds_mutex);
if (action->signal.length()) if (action->signal.length())
{ {
/* Copy the signal to the global variable. */ int offset= 0, pos;
if (debug_sync_global.ds_signal.copy(action->signal)) bool error= false;
/* This loop covers all signals in the list except for the last one.
Split the signal string by commas and set a signal in the global
variable for each one. */
while (!error && (pos= action->signal.strstr(",", 1, offset)) > 0)
{
error= debug_sync_global.set_signal(action->signal.ptr() + offset,
pos - offset);
offset= pos + 1;
}
if (error ||
/* The last signal in the list. */
debug_sync_global.set_signal(action->signal.ptr() + offset,
action->signal.length() - offset))
{ {
/* /*
Error is reported by my_malloc(). Error is reported by my_malloc().
@@ -1461,31 +1617,43 @@ static void debug_sync_execute(THD *thd, st_debug_sync_action *action)
restore_current_mutex = false; restore_current_mutex = false;
set_timespec(abstime, action->timeout); set_timespec(abstime, action->timeout);
DBUG_EXECUTE("debug_sync_exec", DBUG_EXECUTE("debug_sync_exec", {
/* Functions as DBUG_PRINT args can change keyword and line nr. */ const char *signal_set= get_signal_set_as_string();
DBUG_PRINT("debug_sync_exec", if (!signal_set)
("wait for '%s' at: '%s' curr: '%s'", {
sig_wait, dsp_name, DBUG_PRINT("debug_sync_exec",
debug_sync_global.ds_signal.c_ptr()));); ("Out of memory when fetching signal set"));
}
else
{
/* Functions as DBUG_PRINT args can change keyword and line nr. */
DBUG_PRINT("debug_sync_exec",
("wait for '%s' at: '%s', curr: '%s'",
sig_wait, dsp_name, signal_set));
my_free((void *)signal_set);
}});
/* /*
Wait until global signal string matches the wait_for string. Wait until the signal set contains the wait_for string.
Interrupt when thread or query is killed or facility disabled. Interrupt when thread or query is killed or facility is disabled.
The facility can become disabled when some thread cannot get The facility can become disabled when some thread cannot get
the required dynamic memory allocated. the required dynamic memory allocated.
*/ */
while (stringcmp(&debug_sync_global.ds_signal, &action->wait_for) && while (!debug_sync_global.is_signalled(action->wait_for.ptr(),
!(thd->killed & KILL_HARD_BIT) && opt_debug_sync_timeout) action->wait_for.length()) &&
!(thd->killed & KILL_HARD_BIT) &&
opt_debug_sync_timeout)
{ {
error= mysql_cond_timedwait(&debug_sync_global.ds_cond, error= mysql_cond_timedwait(&debug_sync_global.ds_cond,
&debug_sync_global.ds_mutex, &debug_sync_global.ds_mutex,
&abstime); &abstime);
DBUG_EXECUTE("debug_sync", // TODO turn this into a for loop printing.
DBUG_EXECUTE("debug_sync", {
/* Functions as DBUG_PRINT args can change keyword and line nr. */ /* Functions as DBUG_PRINT args can change keyword and line nr. */
DBUG_PRINT("debug_sync", DBUG_PRINT("debug_sync",
("awoke from %s global: %s error: %d", ("awoke from %s error: %d",
sig_wait, debug_sync_global.ds_signal.c_ptr(), sig_wait, error));});
error)););
if (unlikely(error == ETIMEDOUT || error == ETIME)) if (unlikely(error == ETIMEDOUT || error == ETIME))
{ {
// We should not make the statement fail, even if in strict mode. // We should not make the statement fail, even if in strict mode.
@@ -1498,6 +1666,10 @@ static void debug_sync_execute(THD *thd, st_debug_sync_action *action)
} }
error= 0; error= 0;
} }
if (action->clear_event)
debug_sync_global.clear_signal(action->wait_for);
DBUG_EXECUTE("debug_sync_exec", DBUG_EXECUTE("debug_sync_exec",
if (thd->killed) if (thd->killed)
DBUG_PRINT("debug_sync_exec", DBUG_PRINT("debug_sync_exec",
@@ -1571,10 +1743,10 @@ static void debug_sync(THD *thd, const char *sync_point_name, size_t name_len)
st_debug_sync_control *ds_control= thd->debug_sync_control; st_debug_sync_control *ds_control= thd->debug_sync_control;
st_debug_sync_action *action; st_debug_sync_action *action;
DBUG_ENTER("debug_sync"); DBUG_ENTER("debug_sync");
DBUG_PRINT("debug_sync_point", ("hit: '%s'", sync_point_name));
DBUG_ASSERT(sync_point_name); DBUG_ASSERT(sync_point_name);
DBUG_ASSERT(name_len); DBUG_ASSERT(name_len);
DBUG_ASSERT(ds_control); DBUG_ASSERT(ds_control);
DBUG_PRINT("debug_sync_point", ("hit: '%s'", sync_point_name));
/* Statistics. */ /* Statistics. */
ds_control->dsp_hits++; ds_control->dsp_hits++;

View File

@@ -56,7 +56,7 @@ public:
derived_handler(THD *thd_arg, handlerton *ht_arg) derived_handler(THD *thd_arg, handlerton *ht_arg)
: thd(thd_arg), ht(ht_arg), derived(0),table(0), tmp_table_param(0), : thd(thd_arg), ht(ht_arg), derived(0),table(0), tmp_table_param(0),
unit(0), select(0) {} unit(0), select(0) {}
virtual ~derived_handler() {} virtual ~derived_handler() = default;
/* /*
Functions to scan data. All these returns 0 if ok, error code in case Functions to scan data. All these returns 0 if ok, error code in case

View File

@@ -328,9 +328,7 @@ Event_queue_element::Event_queue_element():
SYNOPSIS SYNOPSIS
Event_queue_element::Event_queue_element() Event_queue_element::Event_queue_element()
*/ */
Event_queue_element::~Event_queue_element() Event_queue_element::~Event_queue_element() = default;
{
}
/* /*
@@ -356,9 +354,7 @@ Event_timed::Event_timed():
Event_timed::~Event_timed() Event_timed::~Event_timed()
*/ */
Event_timed::~Event_timed() Event_timed::~Event_timed() = default;
{
}
/* /*

View File

@@ -71,7 +71,7 @@ class Event_parse_data;
class Event_db_repository class Event_db_repository
{ {
public: public:
Event_db_repository(){} Event_db_repository() = default;
bool bool
create_event(THD *thd, Event_parse_data *parse_data, create_event(THD *thd, Event_parse_data *parse_data,

View File

@@ -605,7 +605,7 @@ public:
name.length= 0; name.length= 0;
}; };
Virtual_column_info* clone(THD *thd); Virtual_column_info* clone(THD *thd);
~Virtual_column_info() {}; ~Virtual_column_info() = default;
enum_vcol_info_type get_vcol_type() const enum_vcol_info_type get_vcol_type() const
{ {
return vcol_type; return vcol_type;
@@ -895,7 +895,7 @@ public:
Field(uchar *ptr_arg,uint32 length_arg,uchar *null_ptr_arg, Field(uchar *ptr_arg,uint32 length_arg,uchar *null_ptr_arg,
uchar null_bit_arg, utype unireg_check_arg, uchar null_bit_arg, utype unireg_check_arg,
const LEX_CSTRING *field_name_arg); const LEX_CSTRING *field_name_arg);
virtual ~Field() {} virtual ~Field() = default;
virtual Type_numeric_attributes type_numeric_attributes() const virtual Type_numeric_attributes type_numeric_attributes() const
{ {
@@ -5859,8 +5859,8 @@ public:
Field *from_field,*to_field; Field *from_field,*to_field;
String tmp; // For items String tmp; // For items
Copy_field() {} Copy_field() = default;
~Copy_field() {} ~Copy_field() = default;
void set(Field *to,Field *from,bool save); // Field to field void set(Field *to,Field *from,bool save); // Field to field
void set(uchar *to,Field *from); // Field to string void set(uchar *to,Field *from); // Field to string
void (*do_copy)(Copy_field *); void (*do_copy)(Copy_field *);

View File

@@ -238,22 +238,11 @@ public:
/** /**
We need an assignment operator, see filesort(). We need an assignment operator, see filesort().
This happens to have the same semantics as the one that would be This happens to have the same semantics as the one that would be
generated by the compiler. We still implement it here, to show shallow generated by the compiler.
assignment explicitly: we have two objects sharing the same array. Note that this is a shallow copy. We have two objects sharing the same
array.
*/ */
Filesort_buffer &operator=(const Filesort_buffer &rhs) Filesort_buffer &operator=(const Filesort_buffer &rhs) = default;
{
m_next_rec_ptr= rhs.m_next_rec_ptr;
m_rawmem= rhs.m_rawmem;
m_record_pointers= rhs.m_record_pointers;
m_sort_keys= rhs.m_sort_keys;
m_num_records= rhs.m_num_records;
m_record_length= rhs.m_record_length;
m_sort_length= rhs.m_sort_length;
m_size_in_bytes= rhs.m_size_in_bytes;
m_idx= rhs.m_idx;
return *this;
}
uint get_sort_length() const { return m_sort_length; } uint get_sort_length() const { return m_sort_length; }
void set_sort_length(uint val) { m_sort_length= val; } void set_sort_length(uint val) { m_sort_length= val; }

View File

@@ -344,7 +344,7 @@ public:
{ {
return complete_ring() || complete_poly(); return complete_ring() || complete_poly();
} }
virtual ~Gcalc_shape_transporter() {} virtual ~Gcalc_shape_transporter() = default;
}; };

View File

@@ -77,7 +77,7 @@ public:
group_by_handler(THD *thd_arg, handlerton *ht_arg) group_by_handler(THD *thd_arg, handlerton *ht_arg)
: thd(thd_arg), ht(ht_arg), table(0) {} : thd(thd_arg), ht(ht_arg), table(0) {}
virtual ~group_by_handler() {} virtual ~group_by_handler() = default;
/* /*
Functions to scan data. All these returns 0 if ok, error code in case Functions to scan data. All these returns 0 if ok, error code in case

View File

@@ -889,7 +889,7 @@ struct xid_t {
long bqual_length; long bqual_length;
char data[XIDDATASIZE]; // not \0-terminated ! char data[XIDDATASIZE]; // not \0-terminated !
xid_t() {} /* Remove gcc warning */ xid_t() = default; /* Remove gcc warning */
bool eq(struct xid_t *xid) const bool eq(struct xid_t *xid) const
{ return !xid->is_null() && eq(xid->gtrid_length, xid->bqual_length, xid->data); } { return !xid->is_null() && eq(xid->gtrid_length, xid->bqual_length, xid->data); }
bool eq(long g, long b, const char *d) const bool eq(long g, long b, const char *d) const
@@ -1581,7 +1581,7 @@ struct handlerton
public: public:
virtual bool add_table(const char *tname, size_t tlen) = 0; virtual bool add_table(const char *tname, size_t tlen) = 0;
virtual bool add_file(const char *fname) = 0; virtual bool add_file(const char *fname) = 0;
protected: virtual ~discovered_list() {} protected: virtual ~discovered_list() = default;
}; };
/* /*
@@ -1824,7 +1824,7 @@ struct THD_TRANS
m_unsafe_rollback_flags= 0; m_unsafe_rollback_flags= 0;
} }
bool is_empty() const { return ha_list == NULL; } bool is_empty() const { return ha_list == NULL; }
THD_TRANS() {} /* Remove gcc warning */ THD_TRANS() = default; /* Remove gcc warning */
unsigned int m_unsafe_rollback_flags; unsigned int m_unsafe_rollback_flags;
/* /*
@@ -2065,7 +2065,7 @@ struct Table_period_info: Sql_alloc
struct start_end_t struct start_end_t
{ {
start_end_t() {}; start_end_t() = default;
start_end_t(const LEX_CSTRING& _start, const LEX_CSTRING& _end) : start_end_t(const LEX_CSTRING& _start, const LEX_CSTRING& _end) :
start(_start), start(_start),
end(_end) {} end(_end) {}
@@ -2425,9 +2425,9 @@ struct KEY_PAIR
class inplace_alter_handler_ctx : public Sql_alloc class inplace_alter_handler_ctx : public Sql_alloc
{ {
public: public:
inplace_alter_handler_ctx() {} inplace_alter_handler_ctx() = default;
virtual ~inplace_alter_handler_ctx() {} virtual ~inplace_alter_handler_ctx() = default;
virtual void set_shared_data(const inplace_alter_handler_ctx& ctx) {} virtual void set_shared_data(const inplace_alter_handler_ctx& ctx) {}
}; };
@@ -2682,8 +2682,8 @@ typedef struct st_key_create_information
class TABLEOP_HOOKS class TABLEOP_HOOKS
{ {
public: public:
TABLEOP_HOOKS() {} TABLEOP_HOOKS() = default;
virtual ~TABLEOP_HOOKS() {} virtual ~TABLEOP_HOOKS() = default;
inline void prelock(TABLE **tables, uint count) inline void prelock(TABLE **tables, uint count)
{ {
@@ -2724,7 +2724,7 @@ typedef class Item COND;
typedef struct st_ha_check_opt typedef struct st_ha_check_opt
{ {
st_ha_check_opt() {} /* Remove gcc warning */ st_ha_check_opt() = default; /* Remove gcc warning */
uint flags; /* isam layer flags (e.g. for myisamchk) */ uint flags; /* isam layer flags (e.g. for myisamchk) */
uint sql_flags; /* sql layer flags - for something myisamchk cannot do */ uint sql_flags; /* sql layer flags - for something myisamchk cannot do */
time_t start_time; /* When check/repair starts */ time_t start_time; /* When check/repair starts */
@@ -3103,8 +3103,8 @@ uint calculate_key_len(TABLE *, uint, const uchar *, key_part_map);
class Handler_share class Handler_share
{ {
public: public:
Handler_share() {} Handler_share() = default;
virtual ~Handler_share() {} virtual ~Handler_share() = default;
}; };
enum class Compare_keys : uint32_t enum class Compare_keys : uint32_t
@@ -5266,7 +5266,7 @@ public:
const LEX_CSTRING *wild_arg); const LEX_CSTRING *wild_arg);
Discovered_table_list(THD *thd_arg, Dynamic_array<LEX_CSTRING*> *tables_arg) Discovered_table_list(THD *thd_arg, Dynamic_array<LEX_CSTRING*> *tables_arg)
: thd(thd_arg), wild(NULL), with_temps(true), tables(tables_arg) {} : thd(thd_arg), wild(NULL), with_temps(true), tables(tables_arg) {}
~Discovered_table_list() {} ~Discovered_table_list() = default;
bool add_table(const char *tname, size_t tlen); bool add_table(const char *tname, size_t tlen);
bool add_file(const char *fname); bool add_file(const char *fname);

View File

@@ -35,7 +35,7 @@ class hash_filo_element
private: private:
hash_filo_element *next_used,*prev_used; hash_filo_element *next_used,*prev_used;
public: public:
hash_filo_element() {} hash_filo_element() = default;
hash_filo_element *next() hash_filo_element *next()
{ return next_used; } { return next_used; }
hash_filo_element *prev() hash_filo_element *prev()

View File

@@ -74,8 +74,7 @@ Host_errors::Host_errors()
m_local(0) m_local(0)
{} {}
Host_errors::~Host_errors() Host_errors::~Host_errors() = default;
{}
void Host_errors::reset() void Host_errors::reset()
{ {

View File

@@ -326,7 +326,7 @@ private:
TABLE_LIST *save_next_local; TABLE_LIST *save_next_local;
public: public:
Name_resolution_context_state() {} /* Remove gcc warning */ Name_resolution_context_state() = default; /* Remove gcc warning */
public: public:
/* Save the state of a name resolution context. */ /* Save the state of a name resolution context. */
@@ -427,7 +427,7 @@ class sp_rcontext;
class Sp_rcontext_handler class Sp_rcontext_handler
{ {
public: public:
virtual ~Sp_rcontext_handler() {} virtual ~Sp_rcontext_handler() = default;
/** /**
A prefix used for SP variable names in queries: A prefix used for SP variable names in queries:
- EXPLAIN EXTENDED - EXPLAIN EXTENDED
@@ -500,8 +500,8 @@ public:
required, otherwise we only reading it and SELECT required, otherwise we only reading it and SELECT
privilege might be required. privilege might be required.
*/ */
Settable_routine_parameter() {} Settable_routine_parameter() = default;
virtual ~Settable_routine_parameter() {} virtual ~Settable_routine_parameter() = default;
virtual void set_required_privilege(bool rw) {}; virtual void set_required_privilege(bool rw) {};
/* /*
@@ -583,7 +583,7 @@ class Rewritable_query_parameter
limit_clause_param(false) limit_clause_param(false)
{ } { }
virtual ~Rewritable_query_parameter() { } virtual ~Rewritable_query_parameter() = default;
virtual bool append_for_log(THD *thd, String *str) = 0; virtual bool append_for_log(THD *thd, String *str) = 0;
}; };
@@ -743,7 +743,7 @@ public:
class Item_const class Item_const
{ {
public: public:
virtual ~Item_const() {} virtual ~Item_const() = default;
virtual const Type_all_attributes *get_type_all_attributes_from_const() const= 0; virtual const Type_all_attributes *get_type_all_attributes_from_const() const= 0;
virtual bool const_is_null() const { return false; } virtual bool const_is_null() const { return false; }
virtual const longlong *const_ptr_longlong() const { return NULL; } virtual const longlong *const_ptr_longlong() const { return NULL; }
@@ -2922,8 +2922,8 @@ class Field_enumerator
{ {
public: public:
virtual void visit_field(Item_field *field)= 0; virtual void visit_field(Item_field *field)= 0;
virtual ~Field_enumerator() {}; /* purecov: inspected */ virtual ~Field_enumerator() = default;; /* purecov: inspected */
Field_enumerator() {} /* Remove gcc warning */ Field_enumerator() = default; /* Remove gcc warning */
}; };
class Item_string; class Item_string;
@@ -3455,7 +3455,7 @@ public:
Item_result_field(THD *thd, Item_result_field *item): Item_result_field(THD *thd, Item_result_field *item):
Item_fixed_hybrid(thd, item), result_field(item->result_field) Item_fixed_hybrid(thd, item), result_field(item->result_field)
{} {}
~Item_result_field() {} /* Required with gcc 2.95 */ ~Item_result_field() = default;
Field *get_tmp_table_field() override { return result_field; } Field *get_tmp_table_field() override { return result_field; }
Field *create_tmp_field_ex(MEM_ROOT *root, TABLE *table, Tmp_field_src *src, Field *create_tmp_field_ex(MEM_ROOT *root, TABLE *table, Tmp_field_src *src,
const Tmp_field_param *param) override const Tmp_field_param *param) override
@@ -7711,7 +7711,7 @@ public:
*/ */
virtual void close()= 0; virtual void close()= 0;
virtual ~Item_iterator() {} virtual ~Item_iterator() = default;
}; };

View File

@@ -61,7 +61,7 @@ Cached_item *new_Cached_item(THD *thd, Item *item, bool pass_through_ref)
} }
} }
Cached_item::~Cached_item() {} Cached_item::~Cached_item() = default;
/** /**
Compare with old value and replace value with new value. Compare with old value and replace value with new value.

View File

@@ -252,8 +252,7 @@ protected:
Item_bool_func(thd, a), value(a_value), affirmative(a_affirmative) Item_bool_func(thd, a), value(a_value), affirmative(a_affirmative)
{} {}
~Item_func_truth() ~Item_func_truth() = default;
{}
private: private:
/** /**
True for <code>X IS [NOT] TRUE</code>, True for <code>X IS [NOT] TRUE</code>,
@@ -275,7 +274,7 @@ class Item_func_istrue : public Item_func_truth
{ {
public: public:
Item_func_istrue(THD *thd, Item *a): Item_func_truth(thd, a, true, true) {} Item_func_istrue(THD *thd, Item *a): Item_func_truth(thd, a, true, true) {}
~Item_func_istrue() {} ~Item_func_istrue() = default;
LEX_CSTRING func_name_cstring() const override LEX_CSTRING func_name_cstring() const override
{ {
static LEX_CSTRING name= {STRING_WITH_LEN("istrue") }; static LEX_CSTRING name= {STRING_WITH_LEN("istrue") };
@@ -295,7 +294,7 @@ class Item_func_isnottrue : public Item_func_truth
public: public:
Item_func_isnottrue(THD *thd, Item *a): Item_func_isnottrue(THD *thd, Item *a):
Item_func_truth(thd, a, true, false) {} Item_func_truth(thd, a, true, false) {}
~Item_func_isnottrue() {} ~Item_func_isnottrue() = default;
LEX_CSTRING func_name_cstring() const override LEX_CSTRING func_name_cstring() const override
{ {
static LEX_CSTRING name= {STRING_WITH_LEN("isnottrue") }; static LEX_CSTRING name= {STRING_WITH_LEN("isnottrue") };
@@ -317,7 +316,7 @@ class Item_func_isfalse : public Item_func_truth
{ {
public: public:
Item_func_isfalse(THD *thd, Item *a): Item_func_truth(thd, a, false, true) {} Item_func_isfalse(THD *thd, Item *a): Item_func_truth(thd, a, false, true) {}
~Item_func_isfalse() {} ~Item_func_isfalse() = default;
LEX_CSTRING func_name_cstring() const override LEX_CSTRING func_name_cstring() const override
{ {
static LEX_CSTRING name= {STRING_WITH_LEN("isfalse") }; static LEX_CSTRING name= {STRING_WITH_LEN("isfalse") };
@@ -337,7 +336,7 @@ class Item_func_isnotfalse : public Item_func_truth
public: public:
Item_func_isnotfalse(THD *thd, Item *a): Item_func_isnotfalse(THD *thd, Item *a):
Item_func_truth(thd, a, false, false) {} Item_func_truth(thd, a, false, false) {}
~Item_func_isnotfalse() {} ~Item_func_isnotfalse() = default;
LEX_CSTRING func_name_cstring() const override LEX_CSTRING func_name_cstring() const override
{ {
static LEX_CSTRING name= {STRING_WITH_LEN("isnotfalse") }; static LEX_CSTRING name= {STRING_WITH_LEN("isnotfalse") };
@@ -1450,13 +1449,13 @@ public:
CHARSET_INFO *collation; CHARSET_INFO *collation;
uint count; uint count;
uint used_count; uint used_count;
in_vector() {} in_vector() = default;
in_vector(THD *thd, uint elements, uint element_length, qsort2_cmp cmp_func, in_vector(THD *thd, uint elements, uint element_length, qsort2_cmp cmp_func,
CHARSET_INFO *cmp_coll) CHARSET_INFO *cmp_coll)
:base((char*) thd_calloc(thd, elements * element_length)), :base((char*) thd_calloc(thd, elements * element_length)),
size(element_length), compare(cmp_func), collation(cmp_coll), size(element_length), compare(cmp_func), collation(cmp_coll),
count(elements), used_count(elements) {} count(elements), used_count(elements) {}
virtual ~in_vector() {} virtual ~in_vector() = default;
virtual void set(uint pos,Item *item)=0; virtual void set(uint pos,Item *item)=0;
virtual uchar *get_value(Item *item)=0; virtual uchar *get_value(Item *item)=0;
void sort() void sort()
@@ -1662,7 +1661,7 @@ class cmp_item :public Sql_alloc
public: public:
CHARSET_INFO *cmp_charset; CHARSET_INFO *cmp_charset;
cmp_item() { cmp_charset= &my_charset_bin; } cmp_item() { cmp_charset= &my_charset_bin; }
virtual ~cmp_item() {} virtual ~cmp_item() = default;
virtual void store_value(Item *item)= 0; virtual void store_value(Item *item)= 0;
/** /**
@returns result (TRUE, FALSE or UNKNOWN) of @returns result (TRUE, FALSE or UNKNOWN) of
@@ -1691,7 +1690,7 @@ class cmp_item_string : public cmp_item_scalar
protected: protected:
String *value_res; String *value_res;
public: public:
cmp_item_string () {} cmp_item_string () = default;
cmp_item_string (CHARSET_INFO *cs) { cmp_charset= cs; } cmp_item_string (CHARSET_INFO *cs) { cmp_charset= cs; }
void set_charset(CHARSET_INFO *cs) { cmp_charset= cs; } void set_charset(CHARSET_INFO *cs) { cmp_charset= cs; }
friend class cmp_item_sort_string; friend class cmp_item_sort_string;
@@ -1757,7 +1756,7 @@ class cmp_item_int : public cmp_item_scalar
{ {
longlong value; longlong value;
public: public:
cmp_item_int() {} /* Remove gcc warning */ cmp_item_int() = default; /* Remove gcc warning */
void store_value(Item *item) void store_value(Item *item)
{ {
value= item->val_int(); value= item->val_int();
@@ -1790,7 +1789,7 @@ class cmp_item_temporal: public cmp_item_scalar
protected: protected:
longlong value; longlong value;
public: public:
cmp_item_temporal() {} cmp_item_temporal() = default;
int compare(cmp_item *ci); int compare(cmp_item *ci);
}; };
@@ -1846,7 +1845,7 @@ class cmp_item_real : public cmp_item_scalar
{ {
double value; double value;
public: public:
cmp_item_real() {} /* Remove gcc warning */ cmp_item_real() = default; /* Remove gcc warning */
void store_value(Item *item) void store_value(Item *item)
{ {
value= item->val_real(); value= item->val_real();
@@ -1876,7 +1875,7 @@ class cmp_item_decimal : public cmp_item_scalar
{ {
my_decimal value; my_decimal value;
public: public:
cmp_item_decimal() {} /* Remove gcc warning */ cmp_item_decimal() = default; /* Remove gcc warning */
void store_value(Item *item); void store_value(Item *item);
int cmp(Item *arg); int cmp(Item *arg);
int cmp_not_null(const Value *val); int cmp_not_null(const Value *val);
@@ -3718,8 +3717,8 @@ Item *and_expressions(Item *a, Item *b, Item **org_item);
class Comp_creator class Comp_creator
{ {
public: public:
Comp_creator() {} /* Remove gcc warning */ Comp_creator() = default; /* Remove gcc warning */
virtual ~Comp_creator() {} /* Remove gcc warning */ virtual ~Comp_creator() = default; /* Remove gcc warning */
/** /**
Create operation with given arguments. Create operation with given arguments.
*/ */
@@ -3738,8 +3737,8 @@ public:
class Eq_creator :public Comp_creator class Eq_creator :public Comp_creator
{ {
public: public:
Eq_creator() {} /* Remove gcc warning */ Eq_creator() = default; /* Remove gcc warning */
virtual ~Eq_creator() {} /* Remove gcc warning */ virtual ~Eq_creator() = default; /* Remove gcc warning */
Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const;
Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const;
const char* symbol(bool invert) const { return invert? "<>" : "="; } const char* symbol(bool invert) const { return invert? "<>" : "="; }
@@ -3750,8 +3749,8 @@ public:
class Ne_creator :public Comp_creator class Ne_creator :public Comp_creator
{ {
public: public:
Ne_creator() {} /* Remove gcc warning */ Ne_creator() = default; /* Remove gcc warning */
virtual ~Ne_creator() {} /* Remove gcc warning */ virtual ~Ne_creator() = default; /* Remove gcc warning */
Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const;
Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const;
const char* symbol(bool invert) const { return invert? "=" : "<>"; } const char* symbol(bool invert) const { return invert? "=" : "<>"; }
@@ -3762,8 +3761,8 @@ public:
class Gt_creator :public Comp_creator class Gt_creator :public Comp_creator
{ {
public: public:
Gt_creator() {} /* Remove gcc warning */ Gt_creator() = default; /* Remove gcc warning */
virtual ~Gt_creator() {} /* Remove gcc warning */ virtual ~Gt_creator() = default; /* Remove gcc warning */
Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const;
Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const;
const char* symbol(bool invert) const { return invert? "<=" : ">"; } const char* symbol(bool invert) const { return invert? "<=" : ">"; }
@@ -3774,8 +3773,8 @@ public:
class Lt_creator :public Comp_creator class Lt_creator :public Comp_creator
{ {
public: public:
Lt_creator() {} /* Remove gcc warning */ Lt_creator() = default; /* Remove gcc warning */
virtual ~Lt_creator() {} /* Remove gcc warning */ virtual ~Lt_creator() = default; /* Remove gcc warning */
Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const;
Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const;
const char* symbol(bool invert) const { return invert? ">=" : "<"; } const char* symbol(bool invert) const { return invert? ">=" : "<"; }
@@ -3786,8 +3785,8 @@ public:
class Ge_creator :public Comp_creator class Ge_creator :public Comp_creator
{ {
public: public:
Ge_creator() {} /* Remove gcc warning */ Ge_creator() = default; /* Remove gcc warning */
virtual ~Ge_creator() {} /* Remove gcc warning */ virtual ~Ge_creator() = default; /* Remove gcc warning */
Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const;
Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const;
const char* symbol(bool invert) const { return invert? "<" : ">="; } const char* symbol(bool invert) const { return invert? "<" : ">="; }
@@ -3798,8 +3797,8 @@ public:
class Le_creator :public Comp_creator class Le_creator :public Comp_creator
{ {
public: public:
Le_creator() {} /* Remove gcc warning */ Le_creator() = default; /* Remove gcc warning */
virtual ~Le_creator() {} /* Remove gcc warning */ virtual ~Le_creator() = default; /* Remove gcc warning */
Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const;
Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const;
const char* symbol(bool invert) const { return invert? ">" : "<="; } const char* symbol(bool invert) const { return invert? ">" : "<="; }

File diff suppressed because it is too large Load Diff

View File

@@ -63,9 +63,9 @@ public:
protected: protected:
/** Constructor */ /** Constructor */
Create_func() {} Create_func() = default;
/** Destructor */ /** Destructor */
virtual ~Create_func() {} virtual ~Create_func() = default;
}; };
@@ -88,9 +88,9 @@ public:
protected: protected:
/** Constructor. */ /** Constructor. */
Create_func_arg0() {} Create_func_arg0() = default;
/** Destructor. */ /** Destructor. */
virtual ~Create_func_arg0() {} virtual ~Create_func_arg0() = default;
}; };
@@ -114,9 +114,9 @@ public:
protected: protected:
/** Constructor. */ /** Constructor. */
Create_func_arg1() {} Create_func_arg1() = default;
/** Destructor. */ /** Destructor. */
virtual ~Create_func_arg1() {} virtual ~Create_func_arg1() = default;
}; };
@@ -141,9 +141,9 @@ public:
protected: protected:
/** Constructor. */ /** Constructor. */
Create_func_arg2() {} Create_func_arg2() = default;
/** Destructor. */ /** Destructor. */
virtual ~Create_func_arg2() {} virtual ~Create_func_arg2() = default;
}; };
@@ -169,9 +169,9 @@ public:
protected: protected:
/** Constructor. */ /** Constructor. */
Create_func_arg3() {} Create_func_arg3() = default;
/** Destructor. */ /** Destructor. */
virtual ~Create_func_arg3() {} virtual ~Create_func_arg3() = default;
}; };
@@ -203,9 +203,9 @@ public:
protected: protected:
/** Constructor. */ /** Constructor. */
Create_native_func() {} Create_native_func() = default;
/** Destructor. */ /** Destructor. */
virtual ~Create_native_func() {} virtual ~Create_native_func() = default;
}; };
@@ -246,9 +246,9 @@ public:
protected: protected:
/** Constructor. */ /** Constructor. */
Create_qfunc() {} Create_qfunc() = default;
/** Destructor. */ /** Destructor. */
virtual ~Create_qfunc() {} virtual ~Create_qfunc() = default;
}; };
@@ -295,9 +295,9 @@ public:
protected: protected:
/** Constructor. */ /** Constructor. */
Create_udf_func() {} Create_udf_func() = default;
/** Destructor. */ /** Destructor. */
virtual ~Create_udf_func() {} virtual ~Create_udf_func() = default;
}; };
#endif #endif

View File

@@ -3994,7 +3994,7 @@ class Interruptible_wait
Interruptible_wait(THD *thd) Interruptible_wait(THD *thd)
: m_thd(thd) {} : m_thd(thd) {}
~Interruptible_wait() {} ~Interruptible_wait() = default;
public: public:
/** /**

View File

@@ -469,7 +469,7 @@ public:
class Handler class Handler
{ {
public: public:
virtual ~Handler() { } virtual ~Handler() = default;
virtual String *val_str(Item_handled_func *, String *) const= 0; virtual String *val_str(Item_handled_func *, String *) const= 0;
virtual String *val_str_ascii(Item_handled_func *, String *) const= 0; virtual String *val_str_ascii(Item_handled_func *, String *) const= 0;
virtual double val_real(Item_handled_func *) const= 0; virtual double val_real(Item_handled_func *) const= 0;
@@ -3866,8 +3866,7 @@ public:
Item_func_sp(THD *thd, Name_resolution_context *context_arg, Item_func_sp(THD *thd, Name_resolution_context *context_arg,
sp_name *name, const Sp_handler *sph, List<Item> &list); sp_name *name, const Sp_handler *sph, List<Item> &list);
virtual ~Item_func_sp() virtual ~Item_func_sp() = default;
{}
void update_used_tables() override; void update_used_tables() override;

View File

@@ -1531,9 +1531,7 @@ exit:
} }
Item_func_spatial_operation::~Item_func_spatial_operation() Item_func_spatial_operation::~Item_func_spatial_operation() = default;
{
}
String *Item_func_spatial_operation::val_str(String *str_value) String *Item_func_spatial_operation::val_str(String *str_value)
@@ -2788,8 +2786,8 @@ public:
static Create_func_area s_singleton; static Create_func_area s_singleton;
protected: protected:
Create_func_area() {} Create_func_area() = default;
virtual ~Create_func_area() {} virtual ~Create_func_area() = default;
}; };
@@ -2804,8 +2802,8 @@ public:
static Create_func_as_wkb s_singleton; static Create_func_as_wkb s_singleton;
protected: protected:
Create_func_as_wkb() {} Create_func_as_wkb() = default;
virtual ~Create_func_as_wkb() {} virtual ~Create_func_as_wkb() = default;
}; };
@@ -2820,8 +2818,8 @@ public:
static Create_func_as_wkt s_singleton; static Create_func_as_wkt s_singleton;
protected: protected:
Create_func_as_wkt() {} Create_func_as_wkt() = default;
virtual ~Create_func_as_wkt() {} virtual ~Create_func_as_wkt() = default;
}; };
@@ -2837,8 +2835,8 @@ public:
static Create_func_centroid s_singleton; static Create_func_centroid s_singleton;
protected: protected:
Create_func_centroid() {} Create_func_centroid() = default;
virtual ~Create_func_centroid() {} virtual ~Create_func_centroid() = default;
}; };
@@ -2853,8 +2851,8 @@ public:
static Create_func_convexhull s_singleton; static Create_func_convexhull s_singleton;
protected: protected:
Create_func_convexhull() {} Create_func_convexhull() = default;
virtual ~Create_func_convexhull() {} virtual ~Create_func_convexhull() = default;
}; };
@@ -2869,8 +2867,8 @@ public:
static Create_func_pointonsurface s_singleton; static Create_func_pointonsurface s_singleton;
protected: protected:
Create_func_pointonsurface() {} Create_func_pointonsurface() = default;
virtual ~Create_func_pointonsurface() {} virtual ~Create_func_pointonsurface() = default;
}; };
@@ -2886,8 +2884,8 @@ public:
static Create_func_mbr_contains s_singleton; static Create_func_mbr_contains s_singleton;
protected: protected:
Create_func_mbr_contains() {} Create_func_mbr_contains() = default;
virtual ~Create_func_mbr_contains() {} virtual ~Create_func_mbr_contains() = default;
}; };
@@ -2902,8 +2900,8 @@ public:
static Create_func_contains s_singleton; static Create_func_contains s_singleton;
protected: protected:
Create_func_contains() {} Create_func_contains() = default;
virtual ~Create_func_contains() {} virtual ~Create_func_contains() = default;
}; };
@@ -2918,8 +2916,8 @@ public:
static Create_func_crosses s_singleton; static Create_func_crosses s_singleton;
protected: protected:
Create_func_crosses() {} Create_func_crosses() = default;
virtual ~Create_func_crosses() {} virtual ~Create_func_crosses() = default;
}; };
@@ -2934,8 +2932,8 @@ public:
static Create_func_dimension s_singleton; static Create_func_dimension s_singleton;
protected: protected:
Create_func_dimension() {} Create_func_dimension() = default;
virtual ~Create_func_dimension() {} virtual ~Create_func_dimension() = default;
}; };
@@ -2951,8 +2949,8 @@ public:
static Create_func_mbr_disjoint s_singleton; static Create_func_mbr_disjoint s_singleton;
protected: protected:
Create_func_mbr_disjoint() {} Create_func_mbr_disjoint() = default;
virtual ~Create_func_mbr_disjoint() {} virtual ~Create_func_mbr_disjoint() = default;
}; };
@@ -2967,8 +2965,8 @@ public:
static Create_func_disjoint s_singleton; static Create_func_disjoint s_singleton;
protected: protected:
Create_func_disjoint() {} Create_func_disjoint() = default;
virtual ~Create_func_disjoint() {} virtual ~Create_func_disjoint() = default;
}; };
@@ -2983,8 +2981,8 @@ public:
static Create_func_distance s_singleton; static Create_func_distance s_singleton;
protected: protected:
Create_func_distance() {} Create_func_distance() = default;
virtual ~Create_func_distance() {} virtual ~Create_func_distance() = default;
}; };
@@ -2996,8 +2994,8 @@ public:
static Create_func_distance_sphere s_singleton; static Create_func_distance_sphere s_singleton;
protected: protected:
Create_func_distance_sphere() {} Create_func_distance_sphere() = default;
virtual ~Create_func_distance_sphere() {} virtual ~Create_func_distance_sphere() = default;
}; };
@@ -3031,8 +3029,8 @@ public:
static Create_func_endpoint s_singleton; static Create_func_endpoint s_singleton;
protected: protected:
Create_func_endpoint() {} Create_func_endpoint() = default;
virtual ~Create_func_endpoint() {} virtual ~Create_func_endpoint() = default;
}; };
@@ -3047,8 +3045,8 @@ public:
static Create_func_envelope s_singleton; static Create_func_envelope s_singleton;
protected: protected:
Create_func_envelope() {} Create_func_envelope() = default;
virtual ~Create_func_envelope() {} virtual ~Create_func_envelope() = default;
}; };
class Create_func_boundary : public Create_func_arg1 class Create_func_boundary : public Create_func_arg1
@@ -3062,8 +3060,8 @@ public:
static Create_func_boundary s_singleton; static Create_func_boundary s_singleton;
protected: protected:
Create_func_boundary() {} Create_func_boundary() = default;
virtual ~Create_func_boundary() {} virtual ~Create_func_boundary() = default;
}; };
@@ -3079,8 +3077,8 @@ public:
static Create_func_mbr_equals s_singleton; static Create_func_mbr_equals s_singleton;
protected: protected:
Create_func_mbr_equals() {} Create_func_mbr_equals() = default;
virtual ~Create_func_mbr_equals() {} virtual ~Create_func_mbr_equals() = default;
}; };
@@ -3096,8 +3094,8 @@ public:
static Create_func_equals s_singleton; static Create_func_equals s_singleton;
protected: protected:
Create_func_equals() {} Create_func_equals() = default;
virtual ~Create_func_equals() {} virtual ~Create_func_equals() = default;
}; };
@@ -3113,8 +3111,8 @@ public:
static Create_func_exteriorring s_singleton; static Create_func_exteriorring s_singleton;
protected: protected:
Create_func_exteriorring() {} Create_func_exteriorring() = default;
virtual ~Create_func_exteriorring() {} virtual ~Create_func_exteriorring() = default;
}; };
@@ -3128,8 +3126,8 @@ public:
static Create_func_geometry_from_text s_singleton; static Create_func_geometry_from_text s_singleton;
protected: protected:
Create_func_geometry_from_text() {} Create_func_geometry_from_text() = default;
virtual ~Create_func_geometry_from_text() {} virtual ~Create_func_geometry_from_text() = default;
}; };
@@ -3179,8 +3177,8 @@ public:
static Create_func_geometry_from_wkb s_singleton; static Create_func_geometry_from_wkb s_singleton;
protected: protected:
Create_func_geometry_from_wkb() {} Create_func_geometry_from_wkb() = default;
virtual ~Create_func_geometry_from_wkb() {} virtual ~Create_func_geometry_from_wkb() = default;
}; };
@@ -3229,8 +3227,8 @@ public:
static Create_func_geometry_from_json s_singleton; static Create_func_geometry_from_json s_singleton;
protected: protected:
Create_func_geometry_from_json() {} Create_func_geometry_from_json() = default;
virtual ~Create_func_geometry_from_json() {} virtual ~Create_func_geometry_from_json() = default;
}; };
@@ -3289,8 +3287,8 @@ public:
static Create_func_as_geojson s_singleton; static Create_func_as_geojson s_singleton;
protected: protected:
Create_func_as_geojson() {} Create_func_as_geojson() = default;
virtual ~Create_func_as_geojson() {} virtual ~Create_func_as_geojson() = default;
}; };
@@ -3349,8 +3347,8 @@ public:
static Create_func_geometry_type s_singleton; static Create_func_geometry_type s_singleton;
protected: protected:
Create_func_geometry_type() {} Create_func_geometry_type() = default;
virtual ~Create_func_geometry_type() {} virtual ~Create_func_geometry_type() = default;
}; };
@@ -3366,8 +3364,8 @@ public:
static Create_func_geometryn s_singleton; static Create_func_geometryn s_singleton;
protected: protected:
Create_func_geometryn() {} Create_func_geometryn() = default;
virtual ~Create_func_geometryn() {} virtual ~Create_func_geometryn() = default;
}; };
@@ -3383,8 +3381,8 @@ public:
static Create_func_gis_debug s_singleton; static Create_func_gis_debug s_singleton;
protected: protected:
Create_func_gis_debug() {} Create_func_gis_debug() = default;
virtual ~Create_func_gis_debug() {} virtual ~Create_func_gis_debug() = default;
}; };
#endif #endif
@@ -3400,8 +3398,8 @@ public:
static Create_func_glength s_singleton; static Create_func_glength s_singleton;
protected: protected:
Create_func_glength() {} Create_func_glength() = default;
virtual ~Create_func_glength() {} virtual ~Create_func_glength() = default;
}; };
@@ -3417,8 +3415,8 @@ public:
static Create_func_interiorringn s_singleton; static Create_func_interiorringn s_singleton;
protected: protected:
Create_func_interiorringn() {} Create_func_interiorringn() = default;
virtual ~Create_func_interiorringn() {} virtual ~Create_func_interiorringn() = default;
}; };
@@ -3433,8 +3431,8 @@ public:
static Create_func_relate s_singleton; static Create_func_relate s_singleton;
protected: protected:
Create_func_relate() {} Create_func_relate() = default;
virtual ~Create_func_relate() {} virtual ~Create_func_relate() = default;
}; };
@@ -3450,8 +3448,8 @@ public:
static Create_func_mbr_intersects s_singleton; static Create_func_mbr_intersects s_singleton;
protected: protected:
Create_func_mbr_intersects() {} Create_func_mbr_intersects() = default;
virtual ~Create_func_mbr_intersects() {} virtual ~Create_func_mbr_intersects() = default;
}; };
@@ -3467,8 +3465,8 @@ public:
static Create_func_intersects s_singleton; static Create_func_intersects s_singleton;
protected: protected:
Create_func_intersects() {} Create_func_intersects() = default;
virtual ~Create_func_intersects() {} virtual ~Create_func_intersects() = default;
}; };
@@ -3484,8 +3482,8 @@ public:
static Create_func_intersection s_singleton; static Create_func_intersection s_singleton;
protected: protected:
Create_func_intersection() {} Create_func_intersection() = default;
virtual ~Create_func_intersection() {} virtual ~Create_func_intersection() = default;
}; };
@@ -3501,8 +3499,8 @@ public:
static Create_func_difference s_singleton; static Create_func_difference s_singleton;
protected: protected:
Create_func_difference() {} Create_func_difference() = default;
virtual ~Create_func_difference() {} virtual ~Create_func_difference() = default;
}; };
@@ -3518,8 +3516,8 @@ public:
static Create_func_union s_singleton; static Create_func_union s_singleton;
protected: protected:
Create_func_union() {} Create_func_union() = default;
virtual ~Create_func_union() {} virtual ~Create_func_union() = default;
}; };
@@ -3535,8 +3533,8 @@ public:
static Create_func_symdifference s_singleton; static Create_func_symdifference s_singleton;
protected: protected:
Create_func_symdifference() {} Create_func_symdifference() = default;
virtual ~Create_func_symdifference() {} virtual ~Create_func_symdifference() = default;
}; };
@@ -3551,8 +3549,8 @@ public:
static Create_func_buffer s_singleton; static Create_func_buffer s_singleton;
protected: protected:
Create_func_buffer() {} Create_func_buffer() = default;
virtual ~Create_func_buffer() {} virtual ~Create_func_buffer() = default;
}; };
@@ -3567,8 +3565,8 @@ public:
static Create_func_isclosed s_singleton; static Create_func_isclosed s_singleton;
protected: protected:
Create_func_isclosed() {} Create_func_isclosed() = default;
virtual ~Create_func_isclosed() {} virtual ~Create_func_isclosed() = default;
}; };
@@ -3583,8 +3581,8 @@ public:
static Create_func_isring s_singleton; static Create_func_isring s_singleton;
protected: protected:
Create_func_isring() {} Create_func_isring() = default;
virtual ~Create_func_isring() {} virtual ~Create_func_isring() = default;
}; };
@@ -3599,8 +3597,8 @@ public:
static Create_func_isempty s_singleton; static Create_func_isempty s_singleton;
protected: protected:
Create_func_isempty() {} Create_func_isempty() = default;
virtual ~Create_func_isempty() {} virtual ~Create_func_isempty() = default;
}; };
@@ -3615,8 +3613,8 @@ public:
static Create_func_issimple s_singleton; static Create_func_issimple s_singleton;
protected: protected:
Create_func_issimple() {} Create_func_issimple() = default;
virtual ~Create_func_issimple() {} virtual ~Create_func_issimple() = default;
}; };
@@ -3632,8 +3630,8 @@ public:
static Create_func_numgeometries s_singleton; static Create_func_numgeometries s_singleton;
protected: protected:
Create_func_numgeometries() {} Create_func_numgeometries() = default;
virtual ~Create_func_numgeometries() {} virtual ~Create_func_numgeometries() = default;
}; };
@@ -3648,8 +3646,8 @@ public:
static Create_func_numinteriorring s_singleton; static Create_func_numinteriorring s_singleton;
protected: protected:
Create_func_numinteriorring() {} Create_func_numinteriorring() = default;
virtual ~Create_func_numinteriorring() {} virtual ~Create_func_numinteriorring() = default;
}; };
@@ -3664,8 +3662,8 @@ public:
static Create_func_numpoints s_singleton; static Create_func_numpoints s_singleton;
protected: protected:
Create_func_numpoints() {} Create_func_numpoints() = default;
virtual ~Create_func_numpoints() {} virtual ~Create_func_numpoints() = default;
}; };
@@ -3681,8 +3679,8 @@ public:
static Create_func_mbr_overlaps s_singleton; static Create_func_mbr_overlaps s_singleton;
protected: protected:
Create_func_mbr_overlaps() {} Create_func_mbr_overlaps() = default;
virtual ~Create_func_mbr_overlaps() {} virtual ~Create_func_mbr_overlaps() = default;
}; };
@@ -3698,8 +3696,8 @@ public:
static Create_func_overlaps s_singleton; static Create_func_overlaps s_singleton;
protected: protected:
Create_func_overlaps() {} Create_func_overlaps() = default;
virtual ~Create_func_overlaps() {} virtual ~Create_func_overlaps() = default;
}; };
@@ -3717,8 +3715,8 @@ public:
static Create_func_pointn s_singleton; static Create_func_pointn s_singleton;
protected: protected:
Create_func_pointn() {} Create_func_pointn() = default;
virtual ~Create_func_pointn() {} virtual ~Create_func_pointn() = default;
}; };
@@ -3735,8 +3733,8 @@ public:
static Create_func_srid s_singleton; static Create_func_srid s_singleton;
protected: protected:
Create_func_srid() {} Create_func_srid() = default;
virtual ~Create_func_srid() {} virtual ~Create_func_srid() = default;
}; };
@@ -3752,8 +3750,8 @@ public:
static Create_func_startpoint s_singleton; static Create_func_startpoint s_singleton;
protected: protected:
Create_func_startpoint() {} Create_func_startpoint() = default;
virtual ~Create_func_startpoint() {} virtual ~Create_func_startpoint() = default;
}; };
@@ -3770,8 +3768,8 @@ public:
static Create_func_touches s_singleton; static Create_func_touches s_singleton;
protected: protected:
Create_func_touches() {} Create_func_touches() = default;
virtual ~Create_func_touches() {} virtual ~Create_func_touches() = default;
}; };
@@ -3787,8 +3785,8 @@ public:
static Create_func_mbr_within s_singleton; static Create_func_mbr_within s_singleton;
protected: protected:
Create_func_mbr_within() {} Create_func_mbr_within() = default;
virtual ~Create_func_mbr_within() {} virtual ~Create_func_mbr_within() = default;
}; };
@@ -3804,8 +3802,8 @@ public:
static Create_func_within s_singleton; static Create_func_within s_singleton;
protected: protected:
Create_func_within() {} Create_func_within() = default;
virtual ~Create_func_within() {} virtual ~Create_func_within() = default;
}; };
@@ -3820,8 +3818,8 @@ public:
static Create_func_x s_singleton; static Create_func_x s_singleton;
protected: protected:
Create_func_x() {} Create_func_x() = default;
virtual ~Create_func_x() {} virtual ~Create_func_x() = default;
}; };
@@ -3836,8 +3834,8 @@ public:
static Create_func_y s_singleton; static Create_func_y s_singleton;
protected: protected:
Create_func_y() {} Create_func_y() = default;
virtual ~Create_func_y() {} virtual ~Create_func_y() = default;
}; };

View File

@@ -4239,7 +4239,7 @@ bool Item_func_json_objectagg::add()
result.append(STRING_WITH_LEN(", ")); result.append(STRING_WITH_LEN(", "));
result.append('"'); result.append('"');
result.append(*key); st_append_escaped(&result,key);
result.append(STRING_WITH_LEN("\":")); result.append(STRING_WITH_LEN("\":"));
buf.length(0); buf.length(0);

View File

@@ -2906,7 +2906,9 @@ bool Item_exists_subselect::select_prepare_to_be_in()
bool trans_res= FALSE; bool trans_res= FALSE;
DBUG_ENTER("Item_exists_subselect::select_prepare_to_be_in"); DBUG_ENTER("Item_exists_subselect::select_prepare_to_be_in");
if (!optimizer && if (!optimizer &&
thd->lex->sql_command == SQLCOM_SELECT && (thd->lex->sql_command == SQLCOM_SELECT ||
thd->lex->sql_command == SQLCOM_UPDATE_MULTI ||
thd->lex->sql_command == SQLCOM_DELETE_MULTI) &&
!unit->first_select()->is_part_of_union() && !unit->first_select()->is_part_of_union() &&
optimizer_flag(thd, OPTIMIZER_SWITCH_EXISTS_TO_IN) && optimizer_flag(thd, OPTIMIZER_SWITCH_EXISTS_TO_IN) &&
(is_top_level_item() || (is_top_level_item() ||

View File

@@ -831,7 +831,7 @@ public:
item= si; item= si;
maybe_null= 0; maybe_null= 0;
} }
virtual ~subselect_engine() {}; // to satisfy compiler virtual ~subselect_engine() = default;; // to satisfy compiler
virtual void cleanup()= 0; virtual void cleanup()= 0;
/* /*

View File

@@ -59,7 +59,7 @@ protected:
public: public:
Aggregator (Item_sum *arg): item_sum(arg) {} Aggregator (Item_sum *arg): item_sum(arg) {}
virtual ~Aggregator () {} /* Keep gcc happy */ virtual ~Aggregator () = default; /* Keep gcc happy */
enum Aggregator_type { SIMPLE_AGGREGATOR, DISTINCT_AGGREGATOR }; enum Aggregator_type { SIMPLE_AGGREGATOR, DISTINCT_AGGREGATOR };
virtual Aggregator_type Aggrtype() = 0; virtual Aggregator_type Aggrtype() = 0;

View File

@@ -215,7 +215,7 @@ public:
m_message[0]= '\0'; m_message[0]= '\0';
} }
virtual ~Silence_log_table_errors() {} virtual ~Silence_log_table_errors() = default;
virtual bool handle_condition(THD *thd, virtual bool handle_condition(THD *thd,
uint sql_errno, uint sql_errno,
@@ -772,14 +772,10 @@ end:
} }
Log_to_csv_event_handler::Log_to_csv_event_handler() Log_to_csv_event_handler::Log_to_csv_event_handler() = default;
{
}
Log_to_csv_event_handler::~Log_to_csv_event_handler() Log_to_csv_event_handler::~Log_to_csv_event_handler() = default;
{
}
void Log_to_csv_event_handler::cleanup() void Log_to_csv_event_handler::cleanup()

View File

@@ -42,8 +42,8 @@ class TC_LOG
{ {
public: public:
int using_heuristic_recover(); int using_heuristic_recover();
TC_LOG() {} TC_LOG() = default;
virtual ~TC_LOG() {} virtual ~TC_LOG() = default;
virtual int open(const char *opt_name)=0; virtual int open(const char *opt_name)=0;
virtual void close()=0; virtual void close()=0;
@@ -100,7 +100,7 @@ extern PSI_cond_key key_COND_prepare_ordered;
class TC_LOG_DUMMY: public TC_LOG // use it to disable the logging class TC_LOG_DUMMY: public TC_LOG // use it to disable the logging
{ {
public: public:
TC_LOG_DUMMY() {} TC_LOG_DUMMY() = default;
int open(const char *opt_name) { return 0; } int open(const char *opt_name) { return 0; }
void close() { } void close() { }
/* /*
@@ -308,7 +308,7 @@ class MYSQL_LOG
{ {
public: public:
MYSQL_LOG(); MYSQL_LOG();
virtual ~MYSQL_LOG() {} virtual ~MYSQL_LOG() = default;
void init_pthread_objects(); void init_pthread_objects();
void cleanup(); void cleanup();
bool open( bool open(
@@ -983,7 +983,7 @@ public:
class Log_event_handler class Log_event_handler
{ {
public: public:
Log_event_handler() {} Log_event_handler() = default;
virtual bool init()= 0; virtual bool init()= 0;
virtual void cleanup()= 0; virtual void cleanup()= 0;
@@ -997,7 +997,7 @@ public:
const char *command_type, size_t command_type_len, const char *command_type, size_t command_type_len,
const char *sql_text, size_t sql_text_len, const char *sql_text, size_t sql_text_len,
CHARSET_INFO *client_cs)= 0; CHARSET_INFO *client_cs)= 0;
virtual ~Log_event_handler() {} virtual ~Log_event_handler() = default;
}; };

View File

@@ -154,7 +154,7 @@ public:
reinit_io_cache(m_cache, WRITE_CACHE, 0L, FALSE, TRUE); reinit_io_cache(m_cache, WRITE_CACHE, 0L, FALSE, TRUE);
} }
~Write_on_release_cache() {} ~Write_on_release_cache() = default;
bool flush_data() bool flush_data()
{ {
@@ -4159,9 +4159,7 @@ Ignorable_log_event::Ignorable_log_event(const uchar *buf,
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
Ignorable_log_event::~Ignorable_log_event() Ignorable_log_event::~Ignorable_log_event() = default;
{
}
bool copy_event_cache_to_file_and_reinit(IO_CACHE *cache, FILE *file) bool copy_event_cache_to_file_and_reinit(IO_CACHE *cache, FILE *file)
{ {

View File

@@ -2615,8 +2615,7 @@ public:
*/ */
Load_log_event(const uchar *buf, uint event_len, Load_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event* description_event);
~Load_log_event() ~Load_log_event() = default;
{}
Log_event_type get_type_code() Log_event_type get_type_code()
{ {
return sql_ex.new_format() ? NEW_LOAD_EVENT: LOAD_EVENT; return sql_ex.new_format() ? NEW_LOAD_EVENT: LOAD_EVENT;
@@ -2700,13 +2699,13 @@ public:
void pack_info(Protocol* protocol); void pack_info(Protocol* protocol);
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
#else #else
Start_log_event_v3() {} Start_log_event_v3() = default;
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
#endif #endif
Start_log_event_v3(const uchar *buf, uint event_len, Start_log_event_v3(const uchar *buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event* description_event);
~Start_log_event_v3() {} ~Start_log_event_v3() = default;
Log_event_type get_type_code() { return START_EVENT_V3;} Log_event_type get_type_code() { return START_EVENT_V3;}
my_off_t get_header_len(my_off_t l __attribute__((unused))) my_off_t get_header_len(my_off_t l __attribute__((unused)))
{ return LOG_EVENT_MINIMAL_HEADER_LEN; } { return LOG_EVENT_MINIMAL_HEADER_LEN; }
@@ -2996,7 +2995,7 @@ Intvar_log_event(THD* thd_arg,uchar type_arg, ulonglong val_arg,
Intvar_log_event(const uchar *buf, Intvar_log_event(const uchar *buf,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~Intvar_log_event() {} ~Intvar_log_event() = default;
Log_event_type get_type_code() { return INTVAR_EVENT;} Log_event_type get_type_code() { return INTVAR_EVENT;}
const char* get_var_type_name(); const char* get_var_type_name();
int get_data_size() { return 9; /* sizeof(type) + sizeof(val) */;} int get_data_size() { return 9; /* sizeof(type) + sizeof(val) */;}
@@ -3077,7 +3076,7 @@ class Rand_log_event: public Log_event
Rand_log_event(const uchar *buf, Rand_log_event(const uchar *buf,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~Rand_log_event() {} ~Rand_log_event() = default;
Log_event_type get_type_code() { return RAND_EVENT;} Log_event_type get_type_code() { return RAND_EVENT;}
int get_data_size() { return 16; /* sizeof(ulonglong) * 2*/ } int get_data_size() { return 16; /* sizeof(ulonglong) * 2*/ }
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
@@ -3157,7 +3156,7 @@ public:
Xid_log_event(const uchar *buf, Xid_log_event(const uchar *buf,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~Xid_log_event() {} ~Xid_log_event() = default;
Log_event_type get_type_code() { return XID_EVENT;} Log_event_type get_type_code() { return XID_EVENT;}
int get_data_size() { return sizeof(xid); } int get_data_size() { return sizeof(xid); }
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
@@ -3377,7 +3376,7 @@ public:
User_var_log_event(const uchar *buf, uint event_len, User_var_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~User_var_log_event() {} ~User_var_log_event() = default;
Log_event_type get_type_code() { return USER_VAR_EVENT;} Log_event_type get_type_code() { return USER_VAR_EVENT;}
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
bool write(); bool write();
@@ -3427,7 +3426,7 @@ public:
const Format_description_log_event *description_event): const Format_description_log_event *description_event):
Log_event(buf, description_event) Log_event(buf, description_event)
{} {}
~Stop_log_event() {} ~Stop_log_event() = default;
Log_event_type get_type_code() { return STOP_EVENT;} Log_event_type get_type_code() { return STOP_EVENT;}
bool is_valid() const { return 1; } bool is_valid() const { return 1; }
@@ -3722,7 +3721,7 @@ public:
#endif #endif
Gtid_log_event(const uchar *buf, uint event_len, Gtid_log_event(const uchar *buf, uint event_len,
const Format_description_log_event *description_event); const Format_description_log_event *description_event);
~Gtid_log_event() { } ~Gtid_log_event() = default;
Log_event_type get_type_code() { return GTID_EVENT; } Log_event_type get_type_code() { return GTID_EVENT; }
enum_logged_status logged_status() { return LOGGED_NO_DATA; } enum_logged_status logged_status() { return LOGGED_NO_DATA; }
int get_data_size() int get_data_size()
@@ -3975,7 +3974,7 @@ public:
Append_block_log_event(const uchar *buf, uint event_len, Append_block_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event); *description_event);
~Append_block_log_event() {} ~Append_block_log_event() = default;
Log_event_type get_type_code() { return APPEND_BLOCK_EVENT;} Log_event_type get_type_code() { return APPEND_BLOCK_EVENT;}
int get_data_size() { return block_len + APPEND_BLOCK_HEADER_LEN ;} int get_data_size() { return block_len + APPEND_BLOCK_HEADER_LEN ;}
bool is_valid() const { return block != 0; } bool is_valid() const { return block != 0; }
@@ -4016,7 +4015,7 @@ public:
Delete_file_log_event(const uchar *buf, uint event_len, Delete_file_log_event(const uchar *buf, uint event_len,
const Format_description_log_event* description_event); const Format_description_log_event* description_event);
~Delete_file_log_event() {} ~Delete_file_log_event() = default;
Log_event_type get_type_code() { return DELETE_FILE_EVENT;} Log_event_type get_type_code() { return DELETE_FILE_EVENT;}
int get_data_size() { return DELETE_FILE_HEADER_LEN ;} int get_data_size() { return DELETE_FILE_HEADER_LEN ;}
bool is_valid() const { return file_id != 0; } bool is_valid() const { return file_id != 0; }
@@ -4056,7 +4055,7 @@ public:
Execute_load_log_event(const uchar *buf, uint event_len, Execute_load_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event); *description_event);
~Execute_load_log_event() {} ~Execute_load_log_event() = default;
Log_event_type get_type_code() { return EXEC_LOAD_EVENT;} Log_event_type get_type_code() { return EXEC_LOAD_EVENT;}
int get_data_size() { return EXEC_LOAD_HEADER_LEN ;} int get_data_size() { return EXEC_LOAD_HEADER_LEN ;}
bool is_valid() const { return file_id != 0; } bool is_valid() const { return file_id != 0; }
@@ -4096,7 +4095,7 @@ public:
Begin_load_query_log_event(const uchar *buf, uint event_len, Begin_load_query_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event); *description_event);
~Begin_load_query_log_event() {} ~Begin_load_query_log_event() = default;
Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; } Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; }
private: private:
#if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION)
@@ -4154,7 +4153,7 @@ public:
Execute_load_query_log_event(const uchar *buf, uint event_len, Execute_load_query_log_event(const uchar *buf, uint event_len,
const Format_description_log_event const Format_description_log_event
*description_event); *description_event);
~Execute_load_query_log_event() {} ~Execute_load_query_log_event() = default;
Log_event_type get_type_code() { return EXECUTE_LOAD_QUERY_EVENT; } Log_event_type get_type_code() { return EXECUTE_LOAD_QUERY_EVENT; }
bool is_valid() const { return Query_log_event::is_valid() && file_id != 0; } bool is_valid() const { return Query_log_event::is_valid() && file_id != 0; }
@@ -4192,7 +4191,7 @@ public:
{} {}
/* constructor for hopelessly corrupted events */ /* constructor for hopelessly corrupted events */
Unknown_log_event(): Log_event(), what(ENCRYPTED) {} Unknown_log_event(): Log_event(), what(ENCRYPTED) {}
~Unknown_log_event() {} ~Unknown_log_event() = default;
bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); bool print(FILE* file, PRINT_EVENT_INFO* print_event_info);
Log_event_type get_type_code() { return UNKNOWN_EVENT;} Log_event_type get_type_code() { return UNKNOWN_EVENT;}
bool is_valid() const { return 1; } bool is_valid() const { return 1; }

View File

@@ -415,7 +415,7 @@ public:
virtual bool needs_notification(const MDL_ticket *ticket) const = 0; virtual bool needs_notification(const MDL_ticket *ticket) const = 0;
virtual bool conflicting_locks(const MDL_ticket *ticket) const = 0; virtual bool conflicting_locks(const MDL_ticket *ticket) const = 0;
virtual bitmap_t hog_lock_types_bitmap() const = 0; virtual bitmap_t hog_lock_types_bitmap() const = 0;
virtual ~MDL_lock_strategy() {} virtual ~MDL_lock_strategy() = default;
}; };
@@ -426,7 +426,7 @@ public:
*/ */
struct MDL_scoped_lock : public MDL_lock_strategy struct MDL_scoped_lock : public MDL_lock_strategy
{ {
MDL_scoped_lock() {} MDL_scoped_lock() = default;
virtual const bitmap_t *incompatible_granted_types_bitmap() const virtual const bitmap_t *incompatible_granted_types_bitmap() const
{ return m_granted_incompatible; } { return m_granted_incompatible; }
virtual const bitmap_t *incompatible_waiting_types_bitmap() const virtual const bitmap_t *incompatible_waiting_types_bitmap() const
@@ -463,7 +463,7 @@ public:
*/ */
struct MDL_object_lock : public MDL_lock_strategy struct MDL_object_lock : public MDL_lock_strategy
{ {
MDL_object_lock() {} MDL_object_lock() = default;
virtual const bitmap_t *incompatible_granted_types_bitmap() const virtual const bitmap_t *incompatible_granted_types_bitmap() const
{ return m_granted_incompatible; } { return m_granted_incompatible; }
virtual const bitmap_t *incompatible_waiting_types_bitmap() const virtual const bitmap_t *incompatible_waiting_types_bitmap() const
@@ -507,7 +507,7 @@ public:
struct MDL_backup_lock: public MDL_lock_strategy struct MDL_backup_lock: public MDL_lock_strategy
{ {
MDL_backup_lock() {} MDL_backup_lock() = default;
virtual const bitmap_t *incompatible_granted_types_bitmap() const virtual const bitmap_t *incompatible_granted_types_bitmap() const
{ return m_granted_incompatible; } { return m_granted_incompatible; }
virtual const bitmap_t *incompatible_waiting_types_bitmap() const virtual const bitmap_t *incompatible_waiting_types_bitmap() const
@@ -1875,13 +1875,11 @@ bool MDL_lock::has_pending_conflicting_lock(enum_mdl_type type)
MDL_wait_for_graph_visitor::~MDL_wait_for_graph_visitor() MDL_wait_for_graph_visitor::~MDL_wait_for_graph_visitor()
{ = default;
}
MDL_wait_for_subgraph::~MDL_wait_for_subgraph() MDL_wait_for_subgraph::~MDL_wait_for_subgraph()
{ = default;
}
/** /**
Check if ticket represents metadata lock of "stronger" or equal type Check if ticket represents metadata lock of "stronger" or equal type

View File

@@ -60,7 +60,7 @@ typedef unsigned short mdl_bitmap_t;
class MDL_context_owner class MDL_context_owner
{ {
public: public:
virtual ~MDL_context_owner() {} virtual ~MDL_context_owner() = default;
/** /**
Enter a condition wait. Enter a condition wait.
@@ -471,7 +471,7 @@ public:
{ {
mdl_key_init(namespace_arg, db_arg, name_arg); mdl_key_init(namespace_arg, db_arg, name_arg);
} }
MDL_key() {} /* To use when part of MDL_request. */ MDL_key() = default; /* To use when part of MDL_request. */
/** /**
Get thread state name to be used in case when we have to Get thread state name to be used in case when we have to
@@ -640,7 +640,7 @@ public:
virtual bool inspect_edge(MDL_context *dest) = 0; virtual bool inspect_edge(MDL_context *dest) = 0;
virtual ~MDL_wait_for_graph_visitor(); virtual ~MDL_wait_for_graph_visitor();
MDL_wait_for_graph_visitor() {} MDL_wait_for_graph_visitor() = default;
}; };
/** /**
@@ -799,7 +799,7 @@ private:
class MDL_savepoint class MDL_savepoint
{ {
public: public:
MDL_savepoint() {}; MDL_savepoint() = default;;
private: private:
MDL_savepoint(MDL_ticket *stmt_ticket, MDL_ticket *trans_ticket) MDL_savepoint(MDL_ticket *stmt_ticket, MDL_ticket *trans_ticket)

Some files were not shown because too many files have changed in this diff Show More