diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6477c4042d6..8a46fec0dc6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -265,8 +265,6 @@ IF(SECURITY_HARDENED AND NOT WITH_ASAN AND NOT WITH_UBSAN AND NOT WITH_TSAN AND
MY_CHECK_AND_SET_COMPILER_FLAG("-D_FORTIFY_SOURCE=2" RELEASE RELWITHDEBINFO)
ENDIF()
-INCLUDE(wsrep)
-
OPTION(WITH_DBUG_TRACE "Enable DBUG_ENTER()/DBUG_RETURN()/DBUG_PRINT()" ON)
IF(WITH_DBUG_TRACE)
FOREACH(LANG C CXX)
@@ -277,7 +275,12 @@ ENDIF()
# Always enable debug sync for debug builds.
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC")
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC")
-
+
+IF(CMAKE_COMPILER_IS_GNUCC AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "10")
+ # Enable extra checks when using a recent enough version of GNU libstdc++
+ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG -D_GLIBCXX_ASSERTIONS")
+ENDIF()
+
OPTION(ENABLE_GCOV "Enable gcov (debug, Linux builds only)" OFF)
IF (ENABLE_GCOV)
MY_CHECK_AND_SET_COMPILER_FLAG("-DHAVE_gcov -fprofile-arcs -ftest-coverage -lgcov" DEBUG)
@@ -338,6 +341,8 @@ ELSEIF(TRASH_FREED_MEMORY MATCHES "AUTO" AND NOT WIN32 AND NOT WITH_VALGRIND AND
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DTRASH_FREED_MEMORY")
ENDIF()
+INCLUDE(wsrep)
+
# Set commonly used variables
IF(WIN32)
SET(DEFAULT_MYSQL_HOME "C:/Program Files/MariaDB ${MYSQL_BASE_VERSION}")
diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc
index 3d22f091ac1..a5b86b3987f 100644
--- a/client/mysqlbinlog.cc
+++ b/client/mysqlbinlog.cc
@@ -3546,7 +3546,8 @@ int main(int argc, char** argv)
{
if (!opt_version)
{
- usage();
+ error("Please provide the log file(s). Run with '--help' for usage "
+ "instructions.");
retval= ERROR_STOP;
}
goto err;
diff --git a/client/mysqldump.c b/client/mysqldump.c
index 459d03dfe2e..8de9fe0a0aa 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -3123,8 +3123,9 @@ static uint get_table_structure(const char *table, const char *db, char *table_t
if (opt_header)
dynstr_set_checked(&select_field_names_for_header, "");
}
- insert_option= ((delayed && opt_ignore) ? " DELAYED IGNORE " :
- delayed ? " DELAYED " : opt_ignore ? " IGNORE " : "");
+
+ insert_option= ((delayed && opt_ignore) ? "DELAYED IGNORE " :
+ delayed ? "DELAYED " : opt_ignore ? "IGNORE " : "");
verbose_msg("-- Retrieving table structure for table %s...\n", table);
diff --git a/cmake/pcre.cmake b/cmake/pcre.cmake
index 752f882d4a8..31880d21328 100644
--- a/cmake/pcre.cmake
+++ b/cmake/pcre.cmake
@@ -49,16 +49,16 @@ MACRO(BUNDLE_PCRE2)
SET(pcre2_flags${v} "${pcre2_flags${v}} -std=c99 ")
IF(MSVC)
# Suppress a warning
- STRING(APPEND pcre2_flags${v} " /wd4244 " )
+ STRING(APPEND pcre2_flags${v} " /wd4244 /wd4267 " )
# Disable asan support
- STRING(REPLACE "-fsanitize=address" "" pcre2_flags${v} "${CMAKE_C_FLAGS${v}}")
+ STRING(REPLACE "-fsanitize=address" "" pcre2_flags${v} "${pcre2_flags${v}}")
ENDIF()
ENDFOREACH()
ExternalProject_Add(
pcre2
PREFIX "${dir}"
- URL "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-10.42.zip"
- URL_MD5 fe90992fbfb03f854bd9f344074f49eb
+ URL "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.43/pcre2-10.43.zip"
+ URL_MD5 b58f050f2fdd6f2ca5774a2975377a85
INSTALL_COMMAND ""
CMAKE_ARGS
"-DCMAKE_WARN_DEPRECATED=FALSE"
diff --git a/cmake/zlib.cmake b/cmake/zlib.cmake
index 9e085189e4f..ee47eb427d9 100644
--- a/cmake/zlib.cmake
+++ b/cmake/zlib.cmake
@@ -37,10 +37,14 @@ MACRO (MYSQL_CHECK_ZLIB_WITH_COMPRESS)
IF(WITH_ZLIB STREQUAL "bundled")
MYSQL_USE_BUNDLED_ZLIB()
ELSE()
- INCLUDE(FindZLIB)
+ FIND_PACKAGE(PkgConfig QUIET)
+ IF(PKG_CONFIG_FOUND AND (COMMAND PKG_GET_VARIABLE) AND (NOT WIN32))
+ PKG_GET_VARIABLE(ZLIB_ROOT zlib prefix)
+ ENDIF()
+ FIND_PACKAGE(ZLIB)
IF(ZLIB_FOUND)
INCLUDE(CheckFunctionExists)
- SET(CMAKE_REQUIRED_LIBRARIES z)
+ SET(CMAKE_REQUIRED_LIBRARIES ${ZLIB_LIBRARIES})
CHECK_FUNCTION_EXISTS(crc32 HAVE_CRC32)
CHECK_FUNCTION_EXISTS(compressBound HAVE_COMPRESSBOUND)
CHECK_FUNCTION_EXISTS(deflateBound HAVE_DEFLATEBOUND)
diff --git a/include/my_sys.h b/include/my_sys.h
index 17ddccbec58..e4ab497a0e8 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -154,7 +154,7 @@ char *guess_malloc_library();
void sf_report_leaked_memory(my_thread_id id);
int sf_sanity();
extern my_thread_id (*sf_malloc_dbug_id)(void);
-#define SAFEMALLOC_REPORT_MEMORY(X) sf_report_leaked_memory(X)
+#define SAFEMALLOC_REPORT_MEMORY(X) if (!sf_leaking_memory) sf_report_leaked_memory(X)
#else
#define SAFEMALLOC_REPORT_MEMORY(X) do {} while(0)
#endif
diff --git a/mysql-test/include/have_innodb.inc b/mysql-test/include/have_innodb.inc
index 8c9cdb54363..1e853d186b1 100644
--- a/mysql-test/include/have_innodb.inc
+++ b/mysql-test/include/have_innodb.inc
@@ -3,6 +3,11 @@
# will be skipped unless innodb is enabled
#
--disable_query_log
+if (`select version() like '%debug%'`)
+{
+SET STATEMENT sql_log_bin=0 FOR
+call mtr.add_suppression("InnoDB: Trying to delete tablespace.*pending operations");
+}
if (`select count(*) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like 'MSAN%'`)
{
SET STATEMENT sql_log_bin=0 FOR
diff --git a/mysql-test/main/func_hybrid_type.result b/mysql-test/main/func_hybrid_type.result
index bf965a9f5ce..e6c08dab45c 100644
--- a/mysql-test/main/func_hybrid_type.result
+++ b/mysql-test/main/func_hybrid_type.result
@@ -4313,5 +4313,30 @@ ERROR HY000: Illegal parameter data types bigint unsigned and row for operation
SELECT @@max_allowed_packet=ROW(1,1);
ERROR HY000: Illegal parameter data types bigint unsigned and row for operation '='
#
+# MDEV-21034 GREATEST() and LEAST() malfunction for NULL
+#
+SELECT 5 AS c1 FROM dual WHERE GREATEST(1, NULL);
+c1
+SELECT 5 AS c1 FROM dual WHERE LEAST(1, NULL);
+c1
+CREATE TABLE t0 (c0 INT);
+INSERT INTO t0 VALUES (1);
+SELECT * FROM t0 WHERE GREATEST(c0, NULL);
+c0
+SELECT * FROM t0 WHERE LEAST(c0, NULL);
+c0
+DROP TABLE t0;
+SELECT 5 AS c1 FROM dual WHERE GREATEST(1e0, NULL);
+c1
+SELECT 5 AS c1 FROM dual WHERE LEAST(1e0, NULL);
+c1
+CREATE TABLE t0 (c0 DOUBLE);
+INSERT INTO t0 VALUES (1);
+SELECT * FROM t0 WHERE GREATEST(c0, NULL);
+c0
+SELECT * FROM t0 WHERE LEAST(c0, NULL);
+c0
+DROP TABLE t0;
+#
# End of 10.5 tests
#
diff --git a/mysql-test/main/func_hybrid_type.test b/mysql-test/main/func_hybrid_type.test
index 508cdcfb668..2ebfb3cfdf1 100644
--- a/mysql-test/main/func_hybrid_type.test
+++ b/mysql-test/main/func_hybrid_type.test
@@ -1115,6 +1115,29 @@ SELECT 0x20+ROW(1,1);
--error ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
SELECT @@max_allowed_packet=ROW(1,1);
+--echo #
+--echo # MDEV-21034 GREATEST() and LEAST() malfunction for NULL
+--echo #
+
+SELECT 5 AS c1 FROM dual WHERE GREATEST(1, NULL);
+SELECT 5 AS c1 FROM dual WHERE LEAST(1, NULL);
+
+CREATE TABLE t0 (c0 INT);
+INSERT INTO t0 VALUES (1);
+SELECT * FROM t0 WHERE GREATEST(c0, NULL);
+SELECT * FROM t0 WHERE LEAST(c0, NULL);
+DROP TABLE t0;
+
+SELECT 5 AS c1 FROM dual WHERE GREATEST(1e0, NULL);
+SELECT 5 AS c1 FROM dual WHERE LEAST(1e0, NULL);
+
+CREATE TABLE t0 (c0 DOUBLE);
+INSERT INTO t0 VALUES (1);
+SELECT * FROM t0 WHERE GREATEST(c0, NULL);
+SELECT * FROM t0 WHERE LEAST(c0, NULL);
+DROP TABLE t0;
+
+
--echo #
--echo # End of 10.5 tests
--echo #
diff --git a/mysql-test/main/func_math.result b/mysql-test/main/func_math.result
index 1c6c780e380..5422cae4ee7 100644
--- a/mysql-test/main/func_math.result
+++ b/mysql-test/main/func_math.result
@@ -3711,5 +3711,20 @@ SELECT CRC32(ExtractValue('', '/a/b')) AS f;
f
0
#
+# MDEV-33534 UBSAN: Negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in my_double_round from sql/item_func.cc|
+#
+SELECT TRUNCATE(EXP(-1.e-2),-1.e+30) AS c1;
+c1
+0
+SELECT (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) AS c1;
+c1
+0
+SELECT (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) * (LAST_DAY('1-03-30 1:29:12') MOD 1 + COS(-1)) AS c1;
+c1
+0
+SELECT(ASIN(-1)+ LN(-1)) % (ATAN(-1) MOD FLOOR(1)) * (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) * (LAST_DAY('1-03-30 1:29:12') MOD 1 + COS(-1)) AS c1;
+c1
+NULL
+#
# End of 10.5 tests
#
diff --git a/mysql-test/main/func_math.test b/mysql-test/main/func_math.test
index d4e853938ad..b32a1a4634b 100644
--- a/mysql-test/main/func_math.test
+++ b/mysql-test/main/func_math.test
@@ -1980,6 +1980,16 @@ DROP TABLE t2, t1;
SELECT CRC32(ExtractValue('', '/a/b')) AS f;
+--echo #
+--echo # MDEV-33534 UBSAN: Negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in my_double_round from sql/item_func.cc|
+--echo #
+
+SELECT TRUNCATE(EXP(-1.e-2),-1.e+30) AS c1;
+SELECT (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) AS c1;
+SELECT (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) * (LAST_DAY('1-03-30 1:29:12') MOD 1 + COS(-1)) AS c1;
+SELECT(ASIN(-1)+ LN(-1)) % (ATAN(-1) MOD FLOOR(1)) * (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) * (LAST_DAY('1-03-30 1:29:12') MOD 1 + COS(-1)) AS c1;
+
+
--echo #
--echo # End of 10.5 tests
--echo #
diff --git a/mysql-test/main/func_regexp.result b/mysql-test/main/func_regexp.result
index e0a4702c095..8e32732e12d 100644
--- a/mysql-test/main/func_regexp.result
+++ b/mysql-test/main/func_regexp.result
@@ -178,4 +178,18 @@ select 'foo' regexp x from t1 order by x desc;
0
1
drop table t1;
+#
+# MDEV-21076 NOT NULL and UNIQUE constraints cause SUM() to yield an incorrect result
+#
+CREATE TABLE t0(c0 INT NOT NULL, c1 CHAR UNIQUE);
+INSERT INTO t0 VALUES (0, 1);
+INSERT INTO t0 VALUES (0, '');
+SELECT (c1 RLIKE c1), (c0 IS NULL) FROM t0;
+(c1 RLIKE c1) (c0 IS NULL)
+1 0
+1 0
+SELECT SUM(a.t) FROM (SELECT (c1 RLIKE c1) = (c0 IS NULL) as t FROM t0) as a;
+SUM(a.t)
+0
+DROP TABLE t0;
# End of 10.5 tests
diff --git a/mysql-test/main/func_regexp.test b/mysql-test/main/func_regexp.test
index b9e2ef197d6..48a273f6979 100644
--- a/mysql-test/main/func_regexp.test
+++ b/mysql-test/main/func_regexp.test
@@ -121,4 +121,16 @@ select 'foo' regexp x from t1 order by x asc;
select 'foo' regexp x from t1 order by x desc;
drop table t1;
+--echo #
+--echo # MDEV-21076 NOT NULL and UNIQUE constraints cause SUM() to yield an incorrect result
+--echo #
+
+CREATE TABLE t0(c0 INT NOT NULL, c1 CHAR UNIQUE);
+INSERT INTO t0 VALUES (0, 1);
+INSERT INTO t0 VALUES (0, '');
+SELECT (c1 RLIKE c1), (c0 IS NULL) FROM t0;
+SELECT SUM(a.t) FROM (SELECT (c1 RLIKE c1) = (c0 IS NULL) as t FROM t0) as a;
+DROP TABLE t0;
+
+
--echo # End of 10.5 tests
diff --git a/mysql-test/main/mysqldump-max.result b/mysql-test/main/mysqldump-max.result
index 7dd1030eac1..bb3946460cc 100644
--- a/mysql-test/main/mysqldump-max.result
+++ b/mysql-test/main/mysqldump-max.result
@@ -102,7 +102,7 @@ CREATE TABLE `t1` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t1` VALUES
+INSERT DELAYED IGNORE INTO `t1` VALUES
(1,'first value'),
(2,'first value'),
(3,'first value'),
@@ -119,7 +119,7 @@ CREATE TABLE `t2` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t2` VALUES
+INSERT DELAYED IGNORE INTO `t2` VALUES
(1,'first value'),
(2,'first value'),
(3,'first value'),
@@ -136,7 +136,7 @@ CREATE TABLE `t3` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t3` VALUES
+INSERT DELAYED IGNORE INTO `t3` VALUES
(1,'first value'),
(2,'first value'),
(3,'first value'),
@@ -153,7 +153,7 @@ CREATE TABLE `t4` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t4` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t4` VALUES
+INSERT DELAYED IGNORE INTO `t4` VALUES
(1,'first value'),
(2,'first value'),
(3,'first value'),
@@ -170,7 +170,7 @@ CREATE TABLE `t5` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t5` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t5` VALUES
+INSERT DELAYED IGNORE INTO `t5` VALUES
(1,'first value'),
(2,'first value'),
(3,'first value'),
@@ -187,7 +187,7 @@ CREATE TABLE `t6` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t6` DISABLE KEYS */;
-INSERT IGNORE INTO `t6` VALUES
+INSERT IGNORE INTO `t6` VALUES
(1,'first value'),
(2,'first value'),
(3,'first value'),
@@ -229,7 +229,7 @@ CREATE TABLE `t1` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT DELAYED INTO `t1` VALUES
+INSERT DELAYED INTO `t1` VALUES
(1,'first value'),
(2,'first value'),
(3,'first value'),
@@ -246,7 +246,7 @@ CREATE TABLE `t2` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t2` DISABLE KEYS */;
-INSERT DELAYED INTO `t2` VALUES
+INSERT DELAYED INTO `t2` VALUES
(1,'first value'),
(2,'first value'),
(3,'first value'),
@@ -263,7 +263,7 @@ CREATE TABLE `t3` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t3` DISABLE KEYS */;
-INSERT DELAYED INTO `t3` VALUES
+INSERT DELAYED INTO `t3` VALUES
(1,'first value'),
(2,'first value'),
(3,'first value'),
@@ -280,7 +280,7 @@ CREATE TABLE `t4` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t4` DISABLE KEYS */;
-INSERT DELAYED INTO `t4` VALUES
+INSERT DELAYED INTO `t4` VALUES
(1,'first value'),
(2,'first value'),
(3,'first value'),
@@ -297,7 +297,7 @@ CREATE TABLE `t5` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t5` DISABLE KEYS */;
-INSERT DELAYED INTO `t5` VALUES
+INSERT DELAYED INTO `t5` VALUES
(1,'first value'),
(2,'first value'),
(3,'first value'),
diff --git a/mysql-test/main/mysqldump-system.result b/mysql-test/main/mysqldump-system.result
index 559f6f29f44..f83f75947b8 100644
--- a/mysql-test/main/mysqldump-system.result
+++ b/mysql-test/main/mysqldump-system.result
@@ -1300,28 +1300,28 @@ USE mysql;
LOCK TABLES `column_stats` WRITE;
/*!40000 ALTER TABLE `column_stats` DISABLE KEYS */;
-INSERT IGNORE INTO `column_stats` VALUES
+INSERT IGNORE INTO `column_stats` VALUES
('mysql','tz','Time_zone_id','1','5',0.0000,4.0000,98.2500,4,'JSON_HB','{\"target_histogram_size\": 254, \"collected_at\": \"2022-01-07 07:07:00\", \"collected_by\": \"version\", \"histogram_hb\": [{\"start\": \"1\", \"size\": 0.340966921, \"ndv\": 1}, {\"start\": \"3\", \"size\": 0.328244275, \"ndv\": 1}, {\"start\": \"4\", \"size\": 0.328244275, \"ndv\": 1}, {\"start\": \"5\", \"end\": \"5\", \"size\": 0.002544529, \"ndv\": 1}]}');
/*!40000 ALTER TABLE `column_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `index_stats` WRITE;
/*!40000 ALTER TABLE `index_stats` DISABLE KEYS */;
-INSERT IGNORE INTO `index_stats` VALUES
+INSERT IGNORE INTO `index_stats` VALUES
('mysql','tz','PRIMARY',1,98.2500);
/*!40000 ALTER TABLE `index_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `table_stats` WRITE;
/*!40000 ALTER TABLE `table_stats` DISABLE KEYS */;
-INSERT IGNORE INTO `table_stats` VALUES
+INSERT IGNORE INTO `table_stats` VALUES
('mysql','tz',393);
/*!40000 ALTER TABLE `table_stats` ENABLE KEYS */;
UNLOCK TABLES;
LOCK TABLES `innodb_index_stats` WRITE;
/*!40000 ALTER TABLE `innodb_index_stats` DISABLE KEYS */;
-INSERT IGNORE INTO `innodb_index_stats` VALUES
+INSERT IGNORE INTO `innodb_index_stats` VALUES
('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx01',4,1,'Time_zone_id'),
('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx02',393,1,'Time_zone_id,Transition_time'),
('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_leaf_pages',1,NULL,'Number of leaf pages in the index'),
@@ -1331,7 +1331,7 @@ UNLOCK TABLES;
LOCK TABLES `innodb_table_stats` WRITE;
/*!40000 ALTER TABLE `innodb_table_stats` DISABLE KEYS */;
-INSERT IGNORE INTO `innodb_table_stats` VALUES
+INSERT IGNORE INTO `innodb_table_stats` VALUES
('mysql','tz','2019-12-31 21:00:00',393,1,0);
/*!40000 ALTER TABLE `innodb_table_stats` ENABLE KEYS */;
UNLOCK TABLES;
@@ -1340,7 +1340,7 @@ USE mysql;
LOCK TABLES `time_zone` WRITE;
/*!40000 ALTER TABLE `time_zone` DISABLE KEYS */;
-INSERT IGNORE INTO `time_zone` VALUES
+INSERT IGNORE INTO `time_zone` VALUES
(1,'N'),
(2,'N'),
(3,'N'),
@@ -1351,7 +1351,7 @@ UNLOCK TABLES;
LOCK TABLES `time_zone_name` WRITE;
/*!40000 ALTER TABLE `time_zone_name` DISABLE KEYS */;
-INSERT IGNORE INTO `time_zone_name` VALUES
+INSERT IGNORE INTO `time_zone_name` VALUES
('Europe/Moscow',3),
('Japan',5),
('leap/Europe/Moscow',4),
@@ -1363,7 +1363,7 @@ UNLOCK TABLES;
LOCK TABLES `time_zone_leap_second` WRITE;
/*!40000 ALTER TABLE `time_zone_leap_second` DISABLE KEYS */;
-INSERT IGNORE INTO `time_zone_leap_second` VALUES
+INSERT IGNORE INTO `time_zone_leap_second` VALUES
(78796800,1),
(94694401,2),
(126230402,3),
@@ -1391,7 +1391,7 @@ UNLOCK TABLES;
LOCK TABLES `time_zone_transition` WRITE;
/*!40000 ALTER TABLE `time_zone_transition` DISABLE KEYS */;
-INSERT IGNORE INTO `time_zone_transition` VALUES
+INSERT IGNORE INTO `time_zone_transition` VALUES
(1,-1693706400,0),
(1,-1680483600,1),
(1,-1663455600,2),
@@ -1790,7 +1790,7 @@ UNLOCK TABLES;
LOCK TABLES `time_zone_transition_type` WRITE;
/*!40000 ALTER TABLE `time_zone_transition_type` DISABLE KEYS */;
-INSERT IGNORE INTO `time_zone_transition_type` VALUES
+INSERT IGNORE INTO `time_zone_transition_type` VALUES
(1,0,7200,1,'MEST'),
(1,1,3600,0,'MET'),
(1,2,7200,1,'MEST'),
diff --git a/mysql-test/main/mysqldump.result b/mysql-test/main/mysqldump.result
index 9fb5f0bd51f..4e9e5ceec44 100644
--- a/mysql-test/main/mysqldump.result
+++ b/mysql-test/main/mysqldump.result
@@ -768,7 +768,7 @@ CREATE TABLE `t1` (
LOCK TABLES `t1` WRITE;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT IGNORE INTO `t1` VALUES
+INSERT IGNORE INTO `t1` VALUES
(1),
(2),
(3),
@@ -807,7 +807,7 @@ CREATE TABLE `t1` (
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
-INSERT DELAYED IGNORE INTO `t1` VALUES
+INSERT DELAYED IGNORE INTO `t1` VALUES
(1),
(2),
(3),
@@ -5688,7 +5688,7 @@ CREATE TABLE `nonunique_table_name` (
UNIQUE KEY `i1` (`i1`)
) ENGINE=MEMORY AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT DELAYED INTO `nonunique_table_name` VALUES
+INSERT DELAYED INTO `nonunique_table_name` VALUES
(1),
(2);
/*!40101 SET @saved_cs_client = @@character_set_client */;
@@ -5710,7 +5710,7 @@ CREATE TABLE `basetable` (
`id` smallint(6) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-INSERT DELAYED INTO `basetable` VALUES
+INSERT DELAYED INTO `basetable` VALUES
(5),
(6);
/*!40101 SET @saved_cs_client = @@character_set_client */;
diff --git a/mysql-test/suite/galera/t/MDEV-26597.test b/mysql-test/suite/galera/t/MDEV-26597.test
index 783a52cad50..465f1130443 100644
--- a/mysql-test/suite/galera/t/MDEV-26597.test
+++ b/mysql-test/suite/galera/t/MDEV-26597.test
@@ -18,7 +18,7 @@ SHOW WARNINGS;
SET SESSION wsrep_sync_wait = 0;
--source include/kill_galera.inc
---let $start_mysqld_params = ""
+--let $start_mysqld_params =
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
--source include/start_mysqld.inc
diff --git a/mysql-test/suite/galera/t/MDEV-29142.test b/mysql-test/suite/galera/t/MDEV-29142.test
index 7e9776b005b..f7a8b329089 100644
--- a/mysql-test/suite/galera/t/MDEV-29142.test
+++ b/mysql-test/suite/galera/t/MDEV-29142.test
@@ -50,12 +50,12 @@ SET SESSION wsrep_sync_wait = 0;
--source include/kill_galera.inc
--remove_file $MYSQLTEST_VARDIR/mysqld.1/data/grastate.dat
---let $start_mysqld_params = "--wsrep-new-cluster"
+--let $start_mysqld_params =--wsrep-new-cluster
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--source include/start_mysqld.inc
--connection node_2
---let $start_mysqld_params = ""
+--let $start_mysqld_params =
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
--source include/start_mysqld.inc
diff --git a/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test b/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test
index 94ea008cb16..cfa5f8bcead 100644
--- a/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test
+++ b/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test
@@ -30,7 +30,7 @@
--echo Starting server ...
--let $restart_noprint=2
---let $start_mysqld_params="--wsrep-new-cluster"
+--let $start_mysqld_params=--wsrep-new-cluster
--source include/start_mysqld.inc
--source include/wait_until_ready.inc
diff --git a/mysql-test/suite/galera_3nodes/disabled.def b/mysql-test/suite/galera_3nodes/disabled.def
index ffed5432097..f71f726c4f9 100644
--- a/mysql-test/suite/galera_3nodes/disabled.def
+++ b/mysql-test/suite/galera_3nodes/disabled.def
@@ -19,5 +19,4 @@ galera_ipv6_mariabackup_section : temporarily disabled at the request of Codersh
# Opensuse/suse/rocky9/rocky84/rhel9/rhel8-ppc64le .. - all same IPv6 isn't configured right or skipping or galera
galera_ipv6_rsync : Can't connect to server on '::1' (115)
galera_ipv6_rsync_section : Can't connect to server on '::1' (115)
-MDEV-29171 : MDEV-33842 galera_3nodes.MDEV-29171 fails on shutdown_server
GCF-354 : MDEV-25614 Galera test failure on GCF-354
diff --git a/mysql-test/suite/galera_3nodes/r/MDEV-29171.result b/mysql-test/suite/galera_3nodes/r/MDEV-29171.result
index 371ce006dd3..55513ff53af 100644
--- a/mysql-test/suite/galera_3nodes/r/MDEV-29171.result
+++ b/mysql-test/suite/galera_3nodes/r/MDEV-29171.result
@@ -19,20 +19,40 @@ connection node_2;
connection node_1;
connection node_1;
# restart: --wsrep_new_cluster --wsrep_gtid_domain_id=200
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
+VARIABLE_VALUE
+Primary
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
+VARIABLE_VALUE
+Synced
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 200
connection node_2;
# restart
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
+VARIABLE_VALUE
+Primary
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
+VARIABLE_VALUE
+Synced
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 200
+connection node_1;
connection node_3;
# restart: --wsrep_sst_donor=node2
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
+VARIABLE_VALUE
+Primary
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
+VARIABLE_VALUE
+Synced
show variables like 'wsrep_gtid_domain_id';
Variable_name Value
wsrep_gtid_domain_id 200
connection node_1;
+connection node_1;
set global wsrep_gtid_domain_id=100;
connection node_2;
set global wsrep_gtid_domain_id=100;
diff --git a/mysql-test/suite/galera_3nodes/t/MDEV-29171.test b/mysql-test/suite/galera_3nodes/t/MDEV-29171.test
index bfb7abf9a8b..1ce33bee974 100644
--- a/mysql-test/suite/galera_3nodes/t/MDEV-29171.test
+++ b/mysql-test/suite/galera_3nodes/t/MDEV-29171.test
@@ -50,6 +50,16 @@ select @@wsrep_gtid_domain_id,@@wsrep_node_name;
--connection node_1
--let $restart_parameters = --wsrep_new_cluster --wsrep_gtid_domain_id=200
--source include/start_mysqld.inc
+
+--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
+--source include/wait_condition.inc
+--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
+--source include/wait_condition.inc
+--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'
+--source include/wait_condition.inc
+
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
show variables like 'wsrep_gtid_domain_id';
#
@@ -59,8 +69,21 @@ show variables like 'wsrep_gtid_domain_id';
--let $restart_parameters =
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
--source include/start_mysqld.inc
+
+--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
+--source include/wait_condition.inc
+--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
+--source include/wait_condition.inc
+--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'
+--source include/wait_condition.inc
+
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
show variables like 'wsrep_gtid_domain_id';
+--connection node_1
+--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
+--source include/wait_condition.inc
#
# Restart node_3, select node_2 as donor
@@ -70,9 +93,23 @@ show variables like 'wsrep_gtid_domain_id';
--let $restart_parameters = --wsrep_sst_donor="node2"
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.3.expect
--source include/start_mysqld.inc
+
+--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
+--source include/wait_condition.inc
+--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
+--source include/wait_condition.inc
+--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'
+--source include/wait_condition.inc
+
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
+SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
+
# Expect domain id 200
show variables like 'wsrep_gtid_domain_id';
+--connection node_1
+--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
+--source include/wait_condition.inc
#
# Cleanup
diff --git a/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.cnf b/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.cnf
index 5bd03178d1f..c27490faf36 100644
--- a/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.cnf
+++ b/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.cnf
@@ -33,3 +33,6 @@ log_slave_updates=ON
log_bin=mariadb-bin-log
binlog-format=row
wsrep-gtid-mode=ON
+
+[sst]
+transferfmt=@ENV.MTR_GALERA_TFMT
diff --git a/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test b/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test
index 5332b1a1579..f6f50fd50c9 100644
--- a/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test
+++ b/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test
@@ -38,12 +38,12 @@ SET SESSION wsrep_sync_wait = 0;
--source include/kill_galera.inc
--remove_file $MYSQLTEST_VARDIR/mysqld.1/data/grastate.dat
---let $start_mysqld_params = "--wsrep-new-cluster"
+--let $start_mysqld_params =--wsrep-new-cluster
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
--source include/start_mysqld.inc
--connection node_2
---let $start_mysqld_params = ""
+--let $start_mysqld_params =
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect
--source include/start_mysqld.inc
diff --git a/mysql-test/suite/innodb/r/innodb-alter-debug.result b/mysql-test/suite/innodb/r/innodb-alter-debug.result
index c55b4a3ddd5..fd33581ffab 100644
--- a/mysql-test/suite/innodb/r/innodb-alter-debug.result
+++ b/mysql-test/suite/innodb/r/innodb-alter-debug.result
@@ -108,11 +108,11 @@ DROP TABLE t;
# MDEV-26772 InnoDB DDL fails with DUPLICATE KEY error
#
create table t1(f1 int not null primary key,
-f2 int not null, index idx(f2))engine=innodb;
+f2 int not null, index idx(f2), index i(f2,f1))engine=innodb;
insert into t1 values(1, 1);
connect con1,localhost,root,,,;
SET DEBUG_SYNC='before_delete_table_stats SIGNAL blocked WAIT_FOR go';
-SET innodb_lock_wait_timeout=0;
+SET STATEMENT innodb_lock_wait_timeout=0 FOR
ALTER TABLE t1 FORCE, ALGORITHM=COPY;
connection default;
SET DEBUG_SYNC='now WAIT_FOR blocked';
@@ -124,6 +124,17 @@ connection con1;
connection default;
COMMIT;
SET DEBUG_SYNC=RESET;
+RENAME TABLE mysql.innodb_table_stats TO mysql.innodb_table_stats_hidden;
+connection con1;
+SET DEBUG_SYNC='innodb_commit_inplace_before_lock SIGNAL blocked WAIT_FOR go';
+ALTER TABLE t1 DROP INDEX i;
+connection default;
+SET DEBUG_SYNC='now WAIT_FOR blocked';
+RENAME TABLE mysql.innodb_table_stats_hidden TO mysql.innodb_table_stats;
+SET DEBUG_SYNC='now SIGNAL go';
+connection con1;
+connection default;
+SET DEBUG_SYNC=RESET;
connection con1;
ALTER TABLE t1 RENAME KEY idx TO idx1, ALGORITHM=COPY;
disconnect con1;
diff --git a/mysql-test/suite/innodb/r/insert_into_empty.result b/mysql-test/suite/innodb/r/insert_into_empty.result
index 691fbc25fdc..78d934940b7 100644
--- a/mysql-test/suite/innodb/r/insert_into_empty.result
+++ b/mysql-test/suite/innodb/r/insert_into_empty.result
@@ -251,6 +251,15 @@ c1
1984
3331
DROP TABLE t1;
+#
+# MDEV-33979 Disallow bulk insert operation during
+# partition update statement
+#
+CREATE TABLE t1(a INT KEY)ENGINE=InnoDB
+PARTITION BY KEY(a) PARTITIONS 16;
+INSERT INTO t1 VALUES(1);
+UPDATE t1 SET a = 2 WHERE a = 1;
+DROP TABLE t1;
# End of 10.6 tests
#
# MDEV-26947 UNIQUE column checks fail in InnoDB resulting
diff --git a/mysql-test/suite/innodb/t/innodb-alter-debug.test b/mysql-test/suite/innodb/t/innodb-alter-debug.test
index c4a68ac71b7..6b94bfd214f 100644
--- a/mysql-test/suite/innodb/t/innodb-alter-debug.test
+++ b/mysql-test/suite/innodb/t/innodb-alter-debug.test
@@ -144,15 +144,14 @@ DROP TABLE t;
--echo #
create table t1(f1 int not null primary key,
-
- f2 int not null, index idx(f2))engine=innodb;
+ f2 int not null, index idx(f2), index i(f2,f1))engine=innodb;
insert into t1 values(1, 1);
connect(con1,localhost,root,,,);
SET DEBUG_SYNC='before_delete_table_stats SIGNAL blocked WAIT_FOR go';
-SET innodb_lock_wait_timeout=0;
-send ALTER TABLE t1 FORCE, ALGORITHM=COPY;
+send SET STATEMENT innodb_lock_wait_timeout=0 FOR
+ALTER TABLE t1 FORCE, ALGORITHM=COPY;
connection default;
SET DEBUG_SYNC='now WAIT_FOR blocked';
@@ -167,6 +166,21 @@ connection default;
COMMIT;
SET DEBUG_SYNC=RESET;
+RENAME TABLE mysql.innodb_table_stats TO mysql.innodb_table_stats_hidden;
+connection con1;
+SET DEBUG_SYNC='innodb_commit_inplace_before_lock SIGNAL blocked WAIT_FOR go';
+send ALTER TABLE t1 DROP INDEX i;
+
+connection default;
+SET DEBUG_SYNC='now WAIT_FOR blocked';
+RENAME TABLE mysql.innodb_table_stats_hidden TO mysql.innodb_table_stats;
+SET DEBUG_SYNC='now SIGNAL go';
+
+connection con1;
+reap;
+connection default;
+SET DEBUG_SYNC=RESET;
+
connection con1;
ALTER TABLE t1 RENAME KEY idx TO idx1, ALGORITHM=COPY;
disconnect con1;
diff --git a/mysql-test/suite/innodb/t/insert_into_empty.test b/mysql-test/suite/innodb/t/insert_into_empty.test
index 3e5474d54d5..cc631bcae73 100644
--- a/mysql-test/suite/innodb/t/insert_into_empty.test
+++ b/mysql-test/suite/innodb/t/insert_into_empty.test
@@ -271,6 +271,16 @@ connection default;
disconnect con1;
SELECT * FROM t1;
DROP TABLE t1;
+
+--echo #
+--echo # MDEV-33979 Disallow bulk insert operation during
+--echo # partition update statement
+--echo #
+CREATE TABLE t1(a INT KEY)ENGINE=InnoDB
+ PARTITION BY KEY(a) PARTITIONS 16;
+INSERT INTO t1 VALUES(1);
+UPDATE t1 SET a = 2 WHERE a = 1;
+DROP TABLE t1;
--echo # End of 10.6 tests
--echo #
diff --git a/mysql-test/suite/mariabackup/incremental_encrypted.test b/mysql-test/suite/mariabackup/incremental_encrypted.test
index ddf7e492a56..d4619e1f454 100644
--- a/mysql-test/suite/mariabackup/incremental_encrypted.test
+++ b/mysql-test/suite/mariabackup/incremental_encrypted.test
@@ -7,6 +7,12 @@ if (!$EXAMPLE_KEY_MANAGEMENT_SO)
}
call mtr.add_suppression("InnoDB: New log files created");
+if (`select @@innodb_page_size=65536`)
+{
+ # this needs too much memory for 32bit
+ source include/have_64bit.inc;
+}
+
let $basedir=$MYSQLTEST_VARDIR/tmp/backup;
let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1;
diff --git a/mysql-test/suite/perfschema/include/stage_setup.inc b/mysql-test/suite/perfschema/include/stage_setup.inc
index 683c4561c15..ba97d9094a9 100644
--- a/mysql-test/suite/perfschema/include/stage_setup.inc
+++ b/mysql-test/suite/perfschema/include/stage_setup.inc
@@ -121,12 +121,23 @@ begin
where thread_id = my_thread_id
and nesting_event_id = my_statement_id
order by event_id asc;
- # Ignore query cache as it may not be enabled
- select username, event_name, nesting_event_type
- from performance_schema.events_stages_history
- where thread_id = my_thread_id
- and nesting_event_id = my_statement_id and
- event_name not like "%query cache%"
+ # 1. Ignore query cache as it may not be enabled
+ # 2. MDL wait consists of short 1 second waits (this is not configurable)
+ # repeated until lock_wait_timeout is reached. The stage is changed
+ # to Waiting and back every second. To have predictable result here
+ # the query filters all sequences of X, "Waiting for MDL", X,
+ # leaving just X.
+ with h as (
+ select event_id, username, event_name, nesting_event_type,
+ lag(event_name) over (order by event_id) = lead(event_name) over (order by event_id)
+ and event_name = "stage/sql/Waiting for stored function metadata lock" as v1,
+ lag(event_name, 2) over (order by event_id) = event_name
+ and lag(event_name, 1) over (order by event_id) = "stage/sql/Waiting for stored function metadata lock" as v2
+ from performance_schema.events_stages_history
+ where thread_id = my_thread_id
+ and nesting_event_id = my_statement_id and
+ event_name not like "%query cache%"
+ ) select username, event_name, nesting_event_type from h where v1 is not true and v2 is not true
order by event_id asc;
end;
else
diff --git a/mysql-test/suite/rpl/r/rpl_gtid_stop_start.result b/mysql-test/suite/rpl/r/rpl_gtid_stop_start.result
index ae0050c353a..e8633cd45bb 100644
--- a/mysql-test/suite/rpl/r/rpl_gtid_stop_start.result
+++ b/mysql-test/suite/rpl/r/rpl_gtid_stop_start.result
@@ -111,6 +111,10 @@ a
6
7
*** MDEV-4486: Allow to start old-style replication even if mysql.gtid_slave_pos is unavailable
+connection server_1;
+INSERT INTO t1 VALUES (8);
+DELETE FROM t1 WHERE a=8;
+connection server_2;
connection server_2;
include/stop_slave.inc
CHANGE MASTER TO master_use_gtid= no;
diff --git a/mysql-test/suite/rpl/t/rpl_gtid_stop_start.test b/mysql-test/suite/rpl/t/rpl_gtid_stop_start.test
index b5ff294908b..acce6651b8d 100644
--- a/mysql-test/suite/rpl/t/rpl_gtid_stop_start.test
+++ b/mysql-test/suite/rpl/t/rpl_gtid_stop_start.test
@@ -173,6 +173,24 @@ SELECT * FROM t1 ORDER BY a;
--echo *** MDEV-4486: Allow to start old-style replication even if mysql.gtid_slave_pos is unavailable
+# In GTID mode, the old-style replication position is also updated. But during
+# GTID connect, the old-style position is not known until receiving the fake
+# GTID list event, which contains the required position value. If we happened
+# to stop the slave above before this fake GTID list event, the test could fail
+# with duplicate key errors due to switching to non-GTID mode at a wrong
+# position too far back in the binlog.
+#
+# Work-around this by injecting an extra dummt event and syncing the slave to
+# it, ensuring the old-style position will be updated.
+#
+# This work-around could be removed after MDEV-33996 is fixed.
+--connection server_1
+INSERT INTO t1 VALUES (8);
+DELETE FROM t1 WHERE a=8;
+--save_master_pos
+--connection server_2
+--sync_with_master
+
--connection server_2
--source include/stop_slave.inc
CHANGE MASTER TO master_use_gtid= no;
diff --git a/mysys/my_thr_init.c b/mysys/my_thr_init.c
index 2e8decd7d06..b2436d2be27 100644
--- a/mysys/my_thr_init.c
+++ b/mysys/my_thr_init.c
@@ -220,7 +220,11 @@ void my_thread_global_end(void)
fprintf(stderr,
"Error in my_thread_global_end(): %d threads didn't exit\n",
THR_thread_count);
-#endif
+#endif /* HAVE_PTHREAD_KILL */
+#ifdef SAFEMALLOC
+ /* We know we will have memoryleaks, suppress the leak report */
+ sf_leaking_memory= 1;
+#endif /* SAFEMALLOC */
all_threads_killed= 0;
break;
}
@@ -234,9 +238,7 @@ void my_thread_global_end(void)
that could use them.
*/
if (all_threads_killed)
- {
my_thread_destroy_internal_mutex();
- }
my_thread_global_init_done= 0;
}
diff --git a/sql/item_func.cc b/sql/item_func.cc
index f2d35887c14..9743c9a2793 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -2641,12 +2641,12 @@ void Item_func_round::fix_arg_hex_hybrid()
}
-double my_double_round(double value, longlong dec, bool dec_unsigned,
+double my_double_round(double value, longlong dec_value, bool dec_unsigned,
bool truncate)
{
double tmp;
- bool dec_negative= (dec < 0) && !dec_unsigned;
- ulonglong abs_dec= dec_negative ? -dec : dec;
+ const Longlong_hybrid dec(dec_value, dec_unsigned);
+ const ulonglong abs_dec= dec.abs();
/*
tmp2 is here to avoid return the value with 80 bit precision
This will fix that the test round(0.1,1) = round(0.1,1) is true
@@ -2661,22 +2661,24 @@ double my_double_round(double value, longlong dec, bool dec_unsigned,
volatile double value_div_tmp= value / tmp;
volatile double value_mul_tmp= value * tmp;
- if (!dec_negative && std::isinf(tmp)) // "dec" is too large positive number
+ if (!dec.neg() && std::isinf(tmp)) // "dec" is a too large positive number
return value;
- if (dec_negative && std::isinf(tmp))
- tmp2= 0.0;
- else if (!dec_negative && std::isinf(value_mul_tmp))
+ if (dec.neg() && std::isinf(tmp)) // "dec" is a too small negative number
+ return 0.0;
+
+ // Handle "dec" with a reasonably small absolute value
+ if (!dec.neg() && std::isinf(value_mul_tmp))
tmp2= value;
else if (truncate)
{
if (value >= 0.0)
- tmp2= dec < 0 ? floor(value_div_tmp) * tmp : floor(value_mul_tmp) / tmp;
+ tmp2= dec.neg() ? floor(value_div_tmp) * tmp : floor(value_mul_tmp) / tmp;
else
- tmp2= dec < 0 ? ceil(value_div_tmp) * tmp : ceil(value_mul_tmp) / tmp;
+ tmp2= dec.neg() ? ceil(value_div_tmp) * tmp : ceil(value_mul_tmp) / tmp;
}
else
- tmp2=dec < 0 ? rint(value_div_tmp) * tmp : rint(value_mul_tmp) / tmp;
+ tmp2=dec.neg() ? rint(value_div_tmp) * tmp : rint(value_mul_tmp) / tmp;
return tmp2;
}
@@ -3025,7 +3027,7 @@ double Item_func_min_max::val_real_native()
value=tmp;
}
if ((null_value= args[i]->null_value))
- break;
+ return 0;
}
return value;
}
@@ -3046,7 +3048,7 @@ longlong Item_func_min_max::val_int_native()
value=tmp;
}
if ((null_value= args[i]->null_value))
- break;
+ return 0;
}
return value;
}
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 966ba0143b5..c37e038cd64 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1920,6 +1920,7 @@ extern "C" void unireg_abort(int exit_code)
wsrep_sst_auth_free();
#endif // WITH_WSREP
+ wait_for_signal_thread_to_end();
clean_up(!opt_abort && (exit_code || !opt_bootstrap)); /* purecov: inspected */
DBUG_PRINT("quit",("done with cleanup in unireg_abort"));
mysqld_exit(exit_code);
diff --git a/sql/wsrep_schema.cc b/sql/wsrep_schema.cc
index 5fd4a04d7e9..d9baf69999a 100644
--- a/sql/wsrep_schema.cc
+++ b/sql/wsrep_schema.cc
@@ -1265,25 +1265,12 @@ int Wsrep_schema::remove_fragments(THD* thd,
DBUG_RETURN(ret);
}
-int Wsrep_schema::replay_transaction(THD* orig_thd,
- Relay_log_info* rli,
- const wsrep::ws_meta& ws_meta,
- const std::vector& fragments)
+static int replay_transaction(THD* thd,
+ THD* orig_thd,
+ Relay_log_info* rli,
+ const wsrep::ws_meta& ws_meta,
+ const std::vector& fragments)
{
- DBUG_ENTER("Wsrep_schema::replay_transaction");
- DBUG_ASSERT(!fragments.empty());
-
- THD *thd= new THD(next_thread_id(), true);
- if (!thd)
- {
- WSREP_WARN("Could not open allocate memory for THD");
- DBUG_RETURN(1);
- }
-
- thd->thread_stack= (orig_thd ? orig_thd->thread_stack :
- (char*) &thd);
- wsrep_assign_from_threadvars(thd);
-
Wsrep_schema_impl::wsrep_off wsrep_off(thd);
Wsrep_schema_impl::binlog_off binlog_off(thd);
Wsrep_schema_impl::sql_safe_updates sql_safe_updates(thd);
@@ -1304,8 +1291,7 @@ int Wsrep_schema::replay_transaction(THD* orig_thd,
{
WSREP_WARN("Could not open SR table for read: %d", error);
Wsrep_schema_impl::finish_stmt(thd);
- my_free(thd);
- DBUG_RETURN(1);
+ return 1;
}
frag_table= frag_table_l.table;
@@ -1391,24 +1377,36 @@ int Wsrep_schema::replay_transaction(THD* orig_thd,
if (key)
my_free(key);
+
+ return ret;
+}
+
+int Wsrep_schema::replay_transaction(THD* orig_thd,
+ Relay_log_info* rli,
+ const wsrep::ws_meta& ws_meta,
+ const std::vector& fragments)
+{
+ DBUG_ENTER("Wsrep_schema::replay_transaction");
+ DBUG_ASSERT(!fragments.empty());
+
+ THD *thd= new THD(next_thread_id(), true);
+ if (!thd)
+ {
+ WSREP_WARN("Could not allocate memory for THD");
+ DBUG_RETURN(1);
+ }
+
+ thd->thread_stack= (orig_thd ? orig_thd->thread_stack : (char *) &thd);
+ wsrep_assign_from_threadvars(thd);
+
+ int ret= ::replay_transaction(thd, orig_thd, rli, ws_meta, fragments);
+
delete thd;
DBUG_RETURN(ret);
}
-
-int Wsrep_schema::recover_sr_transactions(THD *orig_thd)
+static int recover_sr_transactions(THD* storage_thd, THD* orig_thd)
{
- DBUG_ENTER("Wsrep_schema::recover_sr_transactions");
-
- THD *storage_thd= new THD(next_thread_id(), true);
- if (!storage_thd)
- {
- WSREP_WARN("Could not open allocate memory for THD");
- DBUG_RETURN(1);
- }
- storage_thd->thread_stack= (orig_thd ? orig_thd->thread_stack :
- (char*) &storage_thd);
- wsrep_assign_from_threadvars(storage_thd);
TABLE* frag_table= 0;
TABLE_LIST frag_table_l;
TABLE* cluster_table= 0;
@@ -1431,14 +1429,14 @@ int Wsrep_schema::recover_sr_transactions(THD *orig_thd)
&cluster_table_l))
{
Wsrep_schema_impl::finish_stmt(storage_thd);
- DBUG_RETURN(1);
+ return 1;
}
cluster_table= cluster_table_l.table;
if (Wsrep_schema_impl::init_for_scan(cluster_table))
{
Wsrep_schema_impl::finish_stmt(storage_thd);
- DBUG_RETURN(1);
+ return 1;
}
if ((error= Wsrep_schema_impl::next_record(cluster_table)))
@@ -1449,12 +1447,12 @@ int Wsrep_schema::recover_sr_transactions(THD *orig_thd)
if (error == HA_ERR_END_OF_FILE)
{
WSREP_INFO("Cluster table is empty, not recovering transactions");
- DBUG_RETURN(0);
+ return 0;
}
else
{
WSREP_ERROR("Failed to read cluster table: %d", error);
- DBUG_RETURN(1);
+ return 1;
}
}
@@ -1561,6 +1559,25 @@ int Wsrep_schema::recover_sr_transactions(THD *orig_thd)
trans_commit(storage_thd);
storage_thd->set_mysys_var(0);
out:
+ return ret;
+}
+
+int Wsrep_schema::recover_sr_transactions(THD *orig_thd)
+{
+ DBUG_ENTER("Wsrep_schema::recover_sr_transactions");
+
+ THD *storage_thd= new THD(next_thread_id(), true);
+ if (!storage_thd)
+ {
+ WSREP_WARN("Could not allocate memory for THD");
+ DBUG_RETURN(1);
+ }
+ storage_thd->thread_stack=
+ (orig_thd ? orig_thd->thread_stack : (char *) &storage_thd);
+ wsrep_assign_from_threadvars(storage_thd);
+
+ int ret= ::recover_sr_transactions(storage_thd, orig_thd);
+
delete storage_thd;
DBUG_RETURN(ret);
}
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index fc8106b5cfc..dfe034ec2a5 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -8713,6 +8713,7 @@ ha_innobase::delete_row(
: PLAIN_DELETE;
trx->fts_next_doc_id = 0;
+ ut_ad(!trx->is_bulk_insert());
error = row_update_for_mysql(m_prebuilt);
#ifdef WITH_WSREP
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index fb3a4f5fa07..12851ef7102 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -10249,6 +10249,7 @@ when rebuilding the table.
@param ctx In-place ALTER TABLE context
@param altered_table MySQL table that is being altered
@param old_table MySQL table as it is before the ALTER operation
+@param statistics_exist whether to update InnoDB persistent statistics
@param trx Data dictionary transaction
@param table_name Table name in MySQL
@retval true Failure
@@ -10522,6 +10523,7 @@ when not rebuilding the table.
@param ha_alter_info Data used during in-place alter
@param ctx In-place ALTER TABLE context
@param old_table MySQL table as it is before the ALTER operation
+@param statistics_exist whether to update InnoDB persistent statistics
@param trx Data dictionary transaction
@param table_name Table name in MySQL
@retval true Failure
@@ -10535,6 +10537,7 @@ commit_try_norebuild(
ha_innobase_inplace_ctx*ctx,
TABLE* altered_table,
const TABLE* old_table,
+ bool statistics_exist,
trx_t* trx,
const char* table_name)
{
@@ -10649,6 +10652,10 @@ commit_try_norebuild(
goto handle_error;
}
+ if (!statistics_exist) {
+ continue;
+ }
+
error = dict_stats_delete_from_index_stats(db, table,
index->name, trx);
switch (error) {
@@ -10660,7 +10667,8 @@ commit_try_norebuild(
}
}
- if (const size_t size = ha_alter_info->rename_keys.size()) {
+ if (!statistics_exist) {
+ } else if (const size_t size = ha_alter_info->rename_keys.size()) {
char tmp_name[5];
char db[MAX_DB_UTF8_LEN], table[MAX_TABLE_UTF8_LEN];
@@ -11407,6 +11415,8 @@ err_index:
}
}
+ DEBUG_SYNC(m_user_thd, "innodb_commit_inplace_before_lock");
+
DBUG_EXECUTE_IF("stats_lock_fail",
error = DB_LOCK_WAIT_TIMEOUT;
trx_rollback_for_mysql(trx););
@@ -11490,7 +11500,9 @@ fail:
goto fail;
}
} else if (commit_try_norebuild(ha_alter_info, ctx,
- altered_table, table, trx,
+ altered_table, table,
+ table_stats && index_stats,
+ trx,
table_share->table_name.str)) {
goto fail;
}
diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc
index abeecbd48ba..74d3adb2871 100644
--- a/storage/innobase/mtr/mtr0mtr.cc
+++ b/storage/innobase/mtr/mtr0mtr.cc
@@ -564,7 +564,6 @@ void mtr_t::commit_shrink(fil_space_t &space, uint32_t size)
ut_ad(!is_inside_ibuf());
ut_ad(!high_level_read_only);
ut_ad(m_modifications);
- ut_ad(m_made_dirty);
ut_ad(!m_memo.empty());
ut_ad(!recv_recovery_is_on());
ut_ad(m_log_mode == MTR_LOG_ALL);
diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc
index b022636f9b5..1f319aae84c 100644
--- a/storage/innobase/row/row0ins.cc
+++ b/storage/innobase/row/row0ins.cc
@@ -2713,7 +2713,9 @@ err_exit:
&& !index->table->n_rec_locks
&& !index->table->is_active_ddl()
&& !index->table->has_spatial_index()
- && !index->table->versioned()) {
+ && !index->table->versioned()
+ && (!dict_table_is_partition(index->table)
+ || thd_sql_command(trx->mysql_thd) == SQLCOM_INSERT)) {
DEBUG_SYNC_C("empty_root_page_insert");
trx->bulk_insert = true;
diff --git a/storage/maria/CMakeLists.txt b/storage/maria/CMakeLists.txt
index f55d78f0162..a566580dca3 100644
--- a/storage/maria/CMakeLists.txt
+++ b/storage/maria/CMakeLists.txt
@@ -124,7 +124,7 @@ ENDIF()
IF (CURL_FOUND)
INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIRS})
MYSQL_ADD_PLUGIN(s3 ha_s3.cc ${S3_SOURCES} COMPONENT s3-engine
- LINK_LIBRARIES ${CURL_LIBRARIES} z STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf)
+ LINK_LIBRARIES ${CURL_LIBRARIES} ${ZLIB_LIBRARY} STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf)
ENDIF()
SET(CPACK_RPM_s3-engine_PACKAGE_SUMMARY "Amazon S3 archival storage engine for MariaDB" PARENT_SCOPE)
diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result
new file mode 100644
index 00000000000..ce8ebdc3966
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result
@@ -0,0 +1,24 @@
+CREATE FUNCTION spider_direct_sql RETURNS INT SONAME 'ha_spider.so';
+SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"');
+ERROR HY000: Plugin 'SPIDER' is not loaded
+CREATE FUNCTION spider_bg_direct_sql RETURNS INT SONAME 'ha_spider.so';
+SELECT spider_bg_direct_sql ('SELECT * FROM s','a','srv "b"');
+ERROR HY000: Plugin 'SPIDER' is not loaded
+CREATE FUNCTION spider_copy_tables RETURNS INT SONAME 'ha_spider.so';
+SELECT spider_copy_tables ('t', '0', '0');
+ERROR HY000: Plugin 'SPIDER' is not loaded
+CREATE FUNCTION spider_flush_table_mon_cache RETURNS INT SONAME 'ha_spider.so';
+SELECT spider_flush_table_mon_cache ();
+spider_flush_table_mon_cache ()
+1
+install soname 'ha_spider';
+SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"');
+ERROR HY000: The foreign server name you are trying to reference does not exist. Data source error: b
+call mtr.add_suppression(".*\\[Error\\] (mysqld|mariadbd): Can't find record in 'spider_tables'");
+SELECT spider_copy_tables ('t', '0', '0');
+ERROR HY000: Can't find record in 'spider_tables'
+SELECT spider_flush_table_mon_cache ();
+spider_flush_table_mon_cache ()
+1
+Warnings:
+Warning 1620 Plugin is busy and will be uninstalled on shutdown
diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test
new file mode 100644
index 00000000000..e1d917e7147
--- /dev/null
+++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test
@@ -0,0 +1,30 @@
+CREATE FUNCTION spider_direct_sql RETURNS INT SONAME 'ha_spider.so';
+--error ER_PLUGIN_IS_NOT_LOADED
+SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"');
+
+CREATE FUNCTION spider_bg_direct_sql RETURNS INT SONAME 'ha_spider.so';
+--error ER_PLUGIN_IS_NOT_LOADED
+SELECT spider_bg_direct_sql ('SELECT * FROM s','a','srv "b"');
+
+CREATE FUNCTION spider_copy_tables RETURNS INT SONAME 'ha_spider.so';
+--error ER_PLUGIN_IS_NOT_LOADED
+SELECT spider_copy_tables ('t', '0', '0');
+
+# spider_flush_table_mon_cache does not require spider init to function
+CREATE FUNCTION spider_flush_table_mon_cache RETURNS INT SONAME 'ha_spider.so';
+SELECT spider_flush_table_mon_cache ();
+
+# The function functions properly after the plugin is installed
+install soname 'ha_spider';
+
+--error ER_FOREIGN_SERVER_DOESNT_EXIST
+SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"');
+
+call mtr.add_suppression(".*\\[Error\\] (mysqld|mariadbd): Can't find record in 'spider_tables'");
+--error ER_KEY_NOT_FOUND
+SELECT spider_copy_tables ('t', '0', '0');
+
+SELECT spider_flush_table_mon_cache ();
+
+--disable_query_log
+--source ../../include/clean_up_spider.inc
diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc
index 498f4051e0d..3297d95e013 100644
--- a/storage/spider/spd_copy_tables.cc
+++ b/storage/spider/spd_copy_tables.cc
@@ -1146,12 +1146,20 @@ error:
DBUG_RETURN(0);
}
+#undef my_error
+extern "C" void my_error(unsigned int nr, unsigned long MyFlags, ...);
+
my_bool spider_copy_tables_init_body(
UDF_INIT *initid,
UDF_ARGS *args,
char *message
) {
DBUG_ENTER("spider_copy_tables_init_body");
+ if (!spider_hton_ptr)
+ {
+ my_error(ER_PLUGIN_IS_NOT_LOADED, MYF(0), "SPIDER");
+ goto error;
+ }
if (args->arg_count != 3 && args->arg_count != 4)
{
strcpy(message, "spider_copy_tables() requires 3 or 4 arguments");
diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc
index c522de2f203..da07c80bf63 100644
--- a/storage/spider/spd_direct_sql.cc
+++ b/storage/spider/spd_direct_sql.cc
@@ -1611,6 +1611,9 @@ error:
DBUG_RETURN(0);
}
+#undef my_error
+extern "C" void my_error(unsigned int nr, unsigned long MyFlags, ...);
+
my_bool spider_direct_sql_init_body(
UDF_INIT *initid,
UDF_ARGS *args,
@@ -1619,6 +1622,11 @@ my_bool spider_direct_sql_init_body(
) {
SPIDER_BG_DIRECT_SQL *bg_direct_sql;
DBUG_ENTER("spider_direct_sql_init_body");
+ if (!spider_hton_ptr)
+ {
+ my_error(ER_PLUGIN_IS_NOT_LOADED, MYF(0), "SPIDER");
+ goto error;
+ }
if (args->arg_count != 3)
{
strcpy(message, "spider_(bg)_direct_sql() requires 3 arguments");
diff --git a/tpool/tpool_generic.cc b/tpool/tpool_generic.cc
index f0637044639..a4d6c405bdf 100644
--- a/tpool/tpool_generic.cc
+++ b/tpool/tpool_generic.cc
@@ -722,9 +722,6 @@ static int throttling_interval_ms(size_t n_threads,size_t concurrency)
/* Create a new worker.*/
bool thread_pool_generic::add_thread()
{
- if (m_thread_creation_pending.test_and_set())
- return false;
-
size_t n_threads = thread_count();
if (n_threads >= m_max_threads)
@@ -750,6 +747,14 @@ bool thread_pool_generic::add_thread()
}
}
+ /* Check and set "thread creation pending" flag before creating the thread. We
+ reset the flag in thread_pool_generic::worker_main in new thread created. The
+ flag must be reset back in case we fail to create the thread. If this flag is
+ not reset all future attempt to create thread for this pool would not work as
+ we would return from here. */
+ if (m_thread_creation_pending.test_and_set())
+ return false;
+
worker_data *thread_data = m_thread_data_cache.get();
m_active_threads.push_back(thread_data);
try
@@ -769,6 +774,7 @@ bool thread_pool_generic::add_thread()
"current number of threads in pool %zu\n", e.what(), thread_count());
warning_written = true;
}
+ m_thread_creation_pending.clear();
return false;
}
return true;