mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
Merge 10.4 into 10.5
This commit is contained in:
commit
1813d92d0c
234 changed files with 3048 additions and 789 deletions
|
@ -1,9 +1,9 @@
|
|||
find_path(LZ4_INCLUDE_DIR NAMES lz4.h)
|
||||
find_library(LZ4_LIBRARY NAMES lz4)
|
||||
find_library(LZ4_LIBRARIES NAMES lz4)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(
|
||||
LZ4 DEFAULT_MSG
|
||||
LZ4_LIBRARY LZ4_INCLUDE_DIR)
|
||||
LZ4_LIBRARIES LZ4_INCLUDE_DIR)
|
||||
|
||||
mark_as_advanced(LZ4_INCLUDE_DIR LZ4_LIBRARY)
|
||||
mark_as_advanced(LZ4_INCLUDE_DIR LZ4_LIBRARIES)
|
||||
|
|
|
@ -5,10 +5,6 @@
|
|||
# ZSTD_LIBRARIES - List of libraries when using zstd.
|
||||
# ZSTD_FOUND - True if zstd found.
|
||||
|
||||
if (DEFINED ZSTD_LIBRARIES)
|
||||
return()
|
||||
endif()
|
||||
|
||||
find_path(ZSTD_INCLUDE_DIR
|
||||
NAMES zstd.h
|
||||
HINTS ${ZSTD_ROOT_DIR}/include)
|
||||
|
@ -18,7 +14,7 @@ find_library(ZSTD_LIBRARIES
|
|||
HINTS ${ZSTD_ROOT_DIR}/lib)
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(zstd DEFAULT_MSG ZSTD_LIBRARIES ZSTD_INCLUDE_DIR)
|
||||
find_package_handle_standard_args(ZSTD DEFAULT_MSG ZSTD_LIBRARIES ZSTD_INCLUDE_DIR)
|
||||
|
||||
mark_as_advanced(
|
||||
ZSTD_LIBRARIES
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
|
|
|
@ -43,7 +43,8 @@ MACRO(CHECK_DTRACE)
|
|||
IF(DTRACE AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD"
|
||||
AND NOT BUGGY_GCC_NO_DTRACE_MODULES
|
||||
AND NOT BUGGY_LINUX_DTRACE
|
||||
AND NOT CMAKE_SYSTEM_NAME MATCHES "SunOS")
|
||||
AND NOT CMAKE_SYSTEM_NAME MATCHES "SunOS"
|
||||
AND NOT WIN32)
|
||||
SET(ENABLE_DTRACE ON CACHE BOOL "Enable dtrace")
|
||||
ENDIF()
|
||||
# On GNU/Hurd, dtrace is not supported
|
||||
|
|
|
@ -490,6 +490,7 @@ static int DbugParse(CODE_STATE *cs, const char *control)
|
|||
rel= control[0] == '+' || control[0] == '-';
|
||||
if ((!rel || (!stack->out_file && !stack->next)))
|
||||
{
|
||||
LockIfInitSettings(cs);
|
||||
FreeState(cs, 0);
|
||||
stack->flags= 0;
|
||||
stack->delay= 0;
|
||||
|
@ -497,10 +498,9 @@ static int DbugParse(CODE_STATE *cs, const char *control)
|
|||
stack->sub_level= 0;
|
||||
stack->out_file= sstderr;
|
||||
stack->functions= NULL;
|
||||
LockIfInitSettings(cs);
|
||||
stack->keywords= NULL;
|
||||
UnlockIfInitSettings(cs);
|
||||
stack->processes= NULL;
|
||||
UnlockIfInitSettings(cs);
|
||||
}
|
||||
else if (!stack->out_file)
|
||||
{
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# Copyright (c) 2002 MySQL AB, 2009 Sun Microsystems, Inc.
|
||||
# Use is subject to license terms.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
die <<EEE unless @ARGV;
|
||||
Usage: $0 func1 [func2 [ ...] ]
|
||||
|
|
2
debian/additions/mariadb-report
vendored
2
debian/additions/mariadb-report
vendored
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl -w
|
||||
#!/usr/bin/env perl -w
|
||||
|
||||
# mariadb-report v4.0 Oct 23 2015
|
||||
# renamed to from mysqlreport in 2020
|
||||
|
|
|
@ -119,7 +119,7 @@ my_bool xtrabackup_move_back;
|
|||
my_bool xtrabackup_decrypt_decompress;
|
||||
my_bool xtrabackup_print_param;
|
||||
my_bool xtrabackup_mysqld_args;
|
||||
my_bool help;
|
||||
my_bool xtrabackup_help;
|
||||
|
||||
my_bool xtrabackup_export;
|
||||
|
||||
|
@ -1418,7 +1418,7 @@ struct my_option xb_server_options[] =
|
|||
|
||||
{"help", '?',
|
||||
"Display this help and exit.",
|
||||
(G_PTR *) &help, (G_PTR *) &help, 0,
|
||||
(G_PTR *) &xtrabackup_help, (G_PTR *) &xtrabackup_help, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
|
||||
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
||||
|
|
66
include/scope.h
Normal file
66
include/scope.h
Normal file
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
Copyright (c) 2020, MariaDB
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; version 2 of
|
||||
the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
namespace detail
|
||||
{
|
||||
|
||||
template <typename Callable> class scope_exit
|
||||
{
|
||||
public:
|
||||
template <typename F>
|
||||
explicit scope_exit(F &&f) : function_(std::forward<F>(f))
|
||||
{
|
||||
}
|
||||
|
||||
scope_exit(scope_exit &&rhs)
|
||||
: function_(std::move(rhs.function_)), engaged_(rhs.engaged_)
|
||||
{
|
||||
rhs.release();
|
||||
}
|
||||
|
||||
scope_exit(const scope_exit &)= delete;
|
||||
scope_exit &operator=(scope_exit &&)= delete;
|
||||
scope_exit &operator=(const scope_exit &)= delete;
|
||||
|
||||
void release() { engaged_= false; }
|
||||
|
||||
~scope_exit()
|
||||
{
|
||||
if (engaged_)
|
||||
function_();
|
||||
}
|
||||
|
||||
private:
|
||||
Callable function_;
|
||||
bool engaged_= true;
|
||||
};
|
||||
|
||||
} // end namespace detail
|
||||
|
||||
template <typename Callable>
|
||||
detail::scope_exit<typename std::decay<Callable>::type>
|
||||
make_scope_exit(Callable &&f)
|
||||
{
|
||||
return detail::scope_exit<typename std::decay<Callable>::type>(
|
||||
std::forward<Callable>(f));
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# -*- cperl -*-
|
||||
|
||||
# This script processes a .gcov coverage report to honor purecov
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# -*- cperl -*-
|
||||
|
||||
# Copyright (c) 2007, 2008 MySQL AB
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# -*- cperl -*-
|
||||
|
||||
# Copyright (c) 2007 MySQL AB
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# -*- cperl -*-
|
||||
|
||||
# Copyright (c) 2007 MySQL AB
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# -*- cperl -*-
|
||||
|
||||
# Copyright (c) 2007 MySQL AB
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# -*- cperl -*-
|
||||
|
||||
# Copyright (c) 2007 MySQL AB
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# -*- cperl -*-
|
||||
|
||||
# Copyright (c) 2007 MySQL AB, 2009 Sun Microsystems, Inc.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# -*- cperl -*-
|
||||
|
||||
# Copyright (c) 2007 MySQL AB
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# -*- cperl -*-
|
||||
|
||||
# Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
|
|
|
@ -916,6 +916,19 @@ NULL
|
|||
Warnings:
|
||||
Warning 4037 Unexpected end of JSON text in argument 2 to function 'json_merge_patch'
|
||||
#
|
||||
# MDEV-22976 CAST(JSON_EXTRACT() AS DECIMAL) does not handle boolean values
|
||||
#
|
||||
SELECT
|
||||
CAST(JSON_EXTRACT('{"x":true}', '$.x') AS DOUBLE) AS cf,
|
||||
CAST(JSON_EXTRACT('{"x":true}', '$.x') AS DECIMAL) AS cd;
|
||||
cf cd
|
||||
1 1
|
||||
SELECT
|
||||
CAST(JSON_EXTRACT('{"x":false}', '$.x') AS DOUBLE) AS cf,
|
||||
CAST(JSON_EXTRACT('{"x":false}', '$.x') AS DECIMAL) AS cd;
|
||||
cf cd
|
||||
0 0
|
||||
#
|
||||
# End of 10.2 tests
|
||||
#
|
||||
#
|
||||
|
|
|
@ -537,6 +537,19 @@ SELECT JSON_MERGE_PATCH('{}');
|
|||
SELECT JSON_MERGE_PATCH('{', '[1,2,3]');
|
||||
SELECT JSON_MERGE_PATCH('{"a":"b"}', '[1,');
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-22976 CAST(JSON_EXTRACT() AS DECIMAL) does not handle boolean values
|
||||
--echo #
|
||||
|
||||
SELECT
|
||||
CAST(JSON_EXTRACT('{"x":true}', '$.x') AS DOUBLE) AS cf,
|
||||
CAST(JSON_EXTRACT('{"x":true}', '$.x') AS DECIMAL) AS cd;
|
||||
|
||||
SELECT
|
||||
CAST(JSON_EXTRACT('{"x":false}', '$.x') AS DOUBLE) AS cf,
|
||||
CAST(JSON_EXTRACT('{"x":false}', '$.x') AS DECIMAL) AS cd;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.2 tests
|
||||
--echo #
|
||||
|
|
|
@ -2209,3 +2209,13 @@ column_name
|
|||
c1
|
||||
c2
|
||||
DROP TABLE tt1, tt2;
|
||||
#
|
||||
# MDEV-13242 Wrong results for queries with row constructors and information_schema
|
||||
#
|
||||
SELECT SCHEMA_NAME from information_schema.schemata where schema_name='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
|
||||
SCHEMA_NAME
|
||||
SELECT SCHEMA_NAME from information_schema.schemata where schema_name=REPEAT('a',193);
|
||||
SCHEMA_NAME
|
||||
#
|
||||
# End of 10.1 tests
|
||||
#
|
||||
|
|
|
@ -1908,3 +1908,15 @@ SELECT count(*) FROM information_schema.columns WHERE table_schema='test' AND (t
|
|||
SELECT count(*) FROM information_schema.columns WHERE table_schema='test' AND (table_name='tt1' AND column_name='c1') OR (table_name='tt2' AND column_name='c2');
|
||||
SELECT column_name FROM information_schema.columns WHERE (table_name, column_name) IN (('tt1','c1'),('tt2', 'c2')) ORDER BY column_name;
|
||||
DROP TABLE tt1, tt2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-13242 Wrong results for queries with row constructors and information_schema
|
||||
--echo #
|
||||
|
||||
SELECT SCHEMA_NAME from information_schema.schemata where schema_name='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
|
||||
SELECT SCHEMA_NAME from information_schema.schemata where schema_name=REPEAT('a',193);
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.1 tests
|
||||
--echo #
|
||||
|
|
|
@ -2755,3 +2755,34 @@ WHERE t3.pk IN (2);
|
|||
drop view v4;
|
||||
drop table t1,t2,t3,t4;
|
||||
SET optimizer_switch=@org_optimizer_switch;
|
||||
#
|
||||
# MDEV-22866: Crash in join optimizer with constant outer join nest
|
||||
#
|
||||
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
CREATE TABLE t2 (b INT) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (3),(4);
|
||||
CREATE TABLE t3 (c INT, KEY(c)) ENGINE=MyISAM;
|
||||
CREATE TABLE t4 (d INT, KEY(d)) ENGINE=MyISAM;
|
||||
INSERT INTO t4 VALUES (5),(6);
|
||||
CREATE TABLE t5 (e INT) ENGINE=MyISAM;
|
||||
INSERT INTO t5 VALUES (7),(8);
|
||||
CREATE TABLE t6 (f INT) ENGINE=MyISAM;
|
||||
INSERT INTO t6 VALUES (9),(10);
|
||||
SELECT *
|
||||
FROM
|
||||
t1
|
||||
LEFT JOIN (
|
||||
t2 LEFT JOIN (
|
||||
t3 JOIN
|
||||
t4 ON t3.c = t4.d and t3.c >2 and t3.c<0
|
||||
) ON t2.b >= t4.d
|
||||
) ON t1.a <= t2.b
|
||||
LEFT JOIN t5 ON t2.b = t5.e
|
||||
LEFT JOIN t6 ON t3.c = t6.f;
|
||||
a b c d e f
|
||||
1 3 NULL NULL NULL NULL
|
||||
2 3 NULL NULL NULL NULL
|
||||
1 4 NULL NULL NULL NULL
|
||||
2 4 NULL NULL NULL NULL
|
||||
drop table t1,t2,t3,t4,t5,t6;
|
||||
|
|
|
@ -2252,3 +2252,38 @@ drop view v4;
|
|||
drop table t1,t2,t3,t4;
|
||||
|
||||
SET optimizer_switch=@org_optimizer_switch;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-22866: Crash in join optimizer with constant outer join nest
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
|
||||
CREATE TABLE t2 (b INT) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (3),(4);
|
||||
|
||||
CREATE TABLE t3 (c INT, KEY(c)) ENGINE=MyISAM;
|
||||
|
||||
CREATE TABLE t4 (d INT, KEY(d)) ENGINE=MyISAM;
|
||||
INSERT INTO t4 VALUES (5),(6);
|
||||
|
||||
CREATE TABLE t5 (e INT) ENGINE=MyISAM;
|
||||
INSERT INTO t5 VALUES (7),(8);
|
||||
|
||||
CREATE TABLE t6 (f INT) ENGINE=MyISAM;
|
||||
INSERT INTO t6 VALUES (9),(10);
|
||||
|
||||
SELECT *
|
||||
FROM
|
||||
t1
|
||||
LEFT JOIN (
|
||||
t2 LEFT JOIN (
|
||||
t3 JOIN
|
||||
t4 ON t3.c = t4.d and t3.c >2 and t3.c<0
|
||||
) ON t2.b >= t4.d
|
||||
) ON t1.a <= t2.b
|
||||
LEFT JOIN t5 ON t2.b = t5.e
|
||||
LEFT JOIN t6 ON t3.c = t6.f;
|
||||
|
||||
drop table t1,t2,t3,t4,t5,t6;
|
||||
|
|
|
@ -2762,3 +2762,34 @@ WHERE t3.pk IN (2);
|
|||
drop view v4;
|
||||
drop table t1,t2,t3,t4;
|
||||
SET optimizer_switch=@org_optimizer_switch;
|
||||
#
|
||||
# MDEV-22866: Crash in join optimizer with constant outer join nest
|
||||
#
|
||||
CREATE TABLE t1 (a INT) ENGINE=MyISAM;
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
CREATE TABLE t2 (b INT) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES (3),(4);
|
||||
CREATE TABLE t3 (c INT, KEY(c)) ENGINE=MyISAM;
|
||||
CREATE TABLE t4 (d INT, KEY(d)) ENGINE=MyISAM;
|
||||
INSERT INTO t4 VALUES (5),(6);
|
||||
CREATE TABLE t5 (e INT) ENGINE=MyISAM;
|
||||
INSERT INTO t5 VALUES (7),(8);
|
||||
CREATE TABLE t6 (f INT) ENGINE=MyISAM;
|
||||
INSERT INTO t6 VALUES (9),(10);
|
||||
SELECT *
|
||||
FROM
|
||||
t1
|
||||
LEFT JOIN (
|
||||
t2 LEFT JOIN (
|
||||
t3 JOIN
|
||||
t4 ON t3.c = t4.d and t3.c >2 and t3.c<0
|
||||
) ON t2.b >= t4.d
|
||||
) ON t1.a <= t2.b
|
||||
LEFT JOIN t5 ON t2.b = t5.e
|
||||
LEFT JOIN t6 ON t3.c = t6.f;
|
||||
a b c d e f
|
||||
1 3 NULL NULL NULL NULL
|
||||
2 3 NULL NULL NULL NULL
|
||||
1 4 NULL NULL NULL NULL
|
||||
2 4 NULL NULL NULL NULL
|
||||
drop table t1,t2,t3,t4,t5,t6;
|
||||
|
|
|
@ -259,6 +259,12 @@ Warning 1286 Unknown storage engine 'NonExistentEngine'
|
|||
alter table mysql.slow_log engine=memory;
|
||||
ERROR HY000: Storage engine MEMORY cannot be used for log tables
|
||||
set default_storage_engine= @save_storage_engine;
|
||||
ALTER TABLE mysql.general_log ENGINE=Aria;
|
||||
ERROR HY000: Storage engine Aria cannot be used for log tables
|
||||
ALTER TABLE mysql.general_log ENGINE=Aria transactional = 0;
|
||||
ALTER TABLE mysql.slow_log ENGINE=Aria;
|
||||
ERROR HY000: Storage engine Aria cannot be used for log tables
|
||||
ALTER TABLE mysql.slow_log ENGINE=Aria transactional = 0;
|
||||
drop table mysql.slow_log;
|
||||
drop table mysql.general_log;
|
||||
drop table mysql.general_log;
|
||||
|
|
|
@ -269,6 +269,14 @@ alter table mysql.slow_log engine=memory;
|
|||
#alter table mysql.slow_log engine=blackhole;
|
||||
set default_storage_engine= @save_storage_engine;
|
||||
|
||||
# Make sure only non-transactional Aria table can be used for logging
|
||||
--error ER_UNSUPORTED_LOG_ENGINE
|
||||
ALTER TABLE mysql.general_log ENGINE=Aria;
|
||||
ALTER TABLE mysql.general_log ENGINE=Aria transactional = 0;
|
||||
--error ER_UNSUPORTED_LOG_ENGINE
|
||||
ALTER TABLE mysql.slow_log ENGINE=Aria;
|
||||
ALTER TABLE mysql.slow_log ENGINE=Aria transactional = 0;
|
||||
|
||||
drop table mysql.slow_log;
|
||||
drop table mysql.general_log;
|
||||
|
||||
|
|
|
@ -11,5 +11,7 @@ SELECT @@datadir;
|
|||
@@datadir
|
||||
DATADIR/
|
||||
# Kill the server
|
||||
1
|
||||
FOUND 1 /is not empty. Only new or empty existing directories are accepted for --datadir/ in install.log
|
||||
connection default;
|
||||
# restart
|
||||
|
|
|
@ -18,6 +18,30 @@ SELECT @@datadir;
|
|||
# restart in the original datadir again
|
||||
--source include/kill_mysqld.inc
|
||||
rmdir $ddir;
|
||||
|
||||
# MDEV-23052
|
||||
# 1. mysql_install_db works on existing, empty directory
|
||||
mkdir $ddir;
|
||||
exec $MYSQL_INSTALL_DB_EXE --datadir=$ddir --password=foo -R > /dev/null;
|
||||
rmdir $ddir;
|
||||
|
||||
# 2. mysql_install_db rejects existing, non-empty directory, and does not
|
||||
# remove it.
|
||||
mkdir $ddir;
|
||||
write_file $ddir/1;
|
||||
EOF
|
||||
|
||||
error 1;
|
||||
exec $MYSQL_INSTALL_DB_EXE --datadir=$ddir --password=foo -R > $MYSQLTEST_VARDIR/tmp/install.log 2>&1;
|
||||
list_files $ddir;
|
||||
let $log=$MYSQLTEST_VARDIR/tmp/install.log;
|
||||
let SEARCH_FILE=$log;
|
||||
let SEARCH_PATTERN=is not empty. Only new or empty existing directories are accepted for --datadir;
|
||||
--source include/search_pattern_in_file.inc
|
||||
remove_file $log;
|
||||
|
||||
rmdir $ddir;
|
||||
|
||||
let $restart_parameters=;
|
||||
connection default;
|
||||
--source include/start_mysqld.inc
|
||||
|
|
20
mysql-test/main/nested_profiling.result
Normal file
20
mysql-test/main/nested_profiling.result
Normal file
|
@ -0,0 +1,20 @@
|
|||
SET @saved_profiling=@@GLOBAL.profiling;
|
||||
SET @saved_init_connect=@@GLOBAL.init_connect;
|
||||
SET GLOBAL init_connect="set @a=2;set @b=3";
|
||||
SET GLOBAL profiling=on;
|
||||
create user mysqltest1@localhost;
|
||||
connect con1,localhost,mysqltest1,,;
|
||||
connection con1;
|
||||
SELECT @a, @b;
|
||||
@a @b
|
||||
2 3
|
||||
SHOW PROFILES;
|
||||
Query_ID Duration Query
|
||||
1 # set @a=2;set @b=3
|
||||
2 # set @b=3
|
||||
3 # SELECT @a, @b
|
||||
connection default;
|
||||
disconnect con1;
|
||||
DROP USER mysqltest1@localhost;
|
||||
SET GLOBAL profiling=@saved_profiling;
|
||||
SET GLOBAL init_connect=@saved_init_connect;
|
42
mysql-test/main/nested_profiling.test
Normal file
42
mysql-test/main/nested_profiling.test
Normal file
|
@ -0,0 +1,42 @@
|
|||
# ==== Purpose ====
|
||||
#
|
||||
# Test verifies that "init_connect" and "init_slave" system variables work
|
||||
# fine when "profiling=on".
|
||||
#
|
||||
# ==== Implementation ====
|
||||
#
|
||||
# Steps:
|
||||
# 0 - Create regular user without super privilege so that "init_connect"
|
||||
# variable is effective.
|
||||
# 1 - Enable profiling.
|
||||
# 2 - Start a new connection which will try to execute the statements
|
||||
# specified in "init_connect". No assert should be reported.
|
||||
# 3 - Execute SHOW PROFILES to verify that statements specified in
|
||||
# "init_connect" are displayed as part of profiling.
|
||||
#
|
||||
# ==== References ====
|
||||
#
|
||||
# MDEV-22706: Assertion `!current' failed in PROFILING::start_new_query
|
||||
#
|
||||
--source include/not_embedded.inc
|
||||
--source include/have_profiling.inc
|
||||
|
||||
SET @saved_profiling=@@GLOBAL.profiling;
|
||||
SET @saved_init_connect=@@GLOBAL.init_connect;
|
||||
SET GLOBAL init_connect="set @a=2;set @b=3";
|
||||
SET GLOBAL profiling=on;
|
||||
|
||||
create user mysqltest1@localhost;
|
||||
connect (con1,localhost,mysqltest1,,);
|
||||
connection con1;
|
||||
SELECT @a, @b;
|
||||
--replace_column 2 #
|
||||
SHOW PROFILES;
|
||||
|
||||
#========== Clean up ===========
|
||||
connection default;
|
||||
disconnect con1;
|
||||
DROP USER mysqltest1@localhost;
|
||||
|
||||
SET GLOBAL profiling=@saved_profiling;
|
||||
SET GLOBAL init_connect=@saved_init_connect;
|
|
@ -108,6 +108,7 @@ select * from v1 {
|
|||
"selectivity_for_columns": [
|
||||
{
|
||||
"column_name": "a",
|
||||
"ranges": ["1 <= a <= 1"],
|
||||
"selectivity_from_histogram": 0.5
|
||||
}
|
||||
],
|
||||
|
@ -253,6 +254,7 @@ select * from (select * from t1 where t1.a=1)q {
|
|||
"selectivity_for_columns": [
|
||||
{
|
||||
"column_name": "a",
|
||||
"ranges": ["1 <= a <= 1"],
|
||||
"selectivity_from_histogram": 0.5
|
||||
}
|
||||
],
|
||||
|
@ -403,6 +405,7 @@ select * from v2 {
|
|||
"selectivity_for_columns": [
|
||||
{
|
||||
"column_name": "a",
|
||||
"ranges": ["1 <= a <= 1"],
|
||||
"selectivity_from_histogram": 0.5
|
||||
}
|
||||
],
|
||||
|
@ -2059,10 +2062,12 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 {
|
|||
"selectivity_for_columns": [
|
||||
{
|
||||
"column_name": "a",
|
||||
"ranges": ["1 <= a <= 1"],
|
||||
"selectivity_from_histogram": 0.1796875
|
||||
},
|
||||
{
|
||||
"column_name": "b",
|
||||
"ranges": ["2 <= b <= 2"],
|
||||
"selectivity_from_histogram": 0.015625
|
||||
}
|
||||
],
|
||||
|
@ -3277,10 +3282,12 @@ explain select * from t1 where pk = 2 and a=5 and b=1 {
|
|||
"selectivity_for_columns": [
|
||||
{
|
||||
"column_name": "a",
|
||||
"ranges": ["5 <= a <= 5"],
|
||||
"selectivity_from_histogram": 0.1
|
||||
},
|
||||
{
|
||||
"column_name": "b",
|
||||
"ranges": ["1 <= b <= 1"],
|
||||
"selectivity_from_histogram": 0.1
|
||||
}
|
||||
],
|
||||
|
@ -8431,6 +8438,122 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
|
|||
]
|
||||
]
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# MDEV-22665: Print ranges in the optimizer trace created for non-indexed columns when
|
||||
# optimizer_use_condition_selectivity >2
|
||||
#
|
||||
CREATE TABLE t1(a INT, b INT);
|
||||
INSERT INTO t1 SELECT seq, seq from seq_1_to_100;
|
||||
SET optimizer_trace=1;
|
||||
ANALYZE TABLE t1 PERSISTENT FOR ALL;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze status OK
|
||||
EXPLAIN EXTENDED SELECT * from t1 WHERE a between 1 and 5 and b <= 5;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 100 0.22 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` between 1 and 5 and `test`.`t1`.`b` <= 5
|
||||
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
|
||||
JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
|
||||
[
|
||||
|
||||
[
|
||||
|
||||
{
|
||||
"column_name": "a",
|
||||
"ranges":
|
||||
[
|
||||
"1 <= a <= 5"
|
||||
],
|
||||
"selectivity_from_histogram": 0.046875
|
||||
},
|
||||
|
||||
{
|
||||
"column_name": "b",
|
||||
"ranges":
|
||||
[
|
||||
"NULL < b <= 5"
|
||||
],
|
||||
"selectivity_from_histogram": 0.046875
|
||||
}
|
||||
]
|
||||
]
|
||||
EXPLAIN EXTENDED SELECT * from t1 WHERE a != 5;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 100 100.00 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` <> 5
|
||||
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
|
||||
JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
|
||||
[
|
||||
|
||||
[
|
||||
|
||||
{
|
||||
"column_name": "a",
|
||||
"ranges":
|
||||
[
|
||||
"NULL < a < 5",
|
||||
"5 < a"
|
||||
],
|
||||
"selectivity_from_histogram": 1
|
||||
}
|
||||
]
|
||||
]
|
||||
EXPLAIN EXTENDED SELECT * from t1 WHERE b >= 10 and b < 25;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 100 15.62 Using where
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`b` >= 10 and `test`.`t1`.`b` < 25
|
||||
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
|
||||
JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
|
||||
[
|
||||
|
||||
[
|
||||
|
||||
{
|
||||
"column_name": "b",
|
||||
"ranges":
|
||||
[
|
||||
"10 <= b < 25"
|
||||
],
|
||||
"selectivity_from_histogram": 0.15625
|
||||
}
|
||||
]
|
||||
]
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-22910:SIGSEGV in Opt_trace_context::is_started & SIGSEGV in Json_writer::add_table_name
|
||||
# (on optimized builds)
|
||||
#
|
||||
CREATE TABLE t1( a INT, b INT, PRIMARY KEY( a ) );
|
||||
SELECT sum(b), row_number() OVER (order by b) FROM t1 WHERE a = 101;
|
||||
sum(b) row_number() OVER (order by b)
|
||||
NULL 1
|
||||
UPDATE t1 SET b=10 WHERE a=1;
|
||||
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
|
||||
JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives'))
|
||||
[
|
||||
|
||||
[
|
||||
|
||||
{
|
||||
"index": "PRIMARY",
|
||||
"ranges":
|
||||
[
|
||||
"(1) <= (a) <= (1)"
|
||||
],
|
||||
"rowid_ordered": true,
|
||||
"using_mrr": false,
|
||||
"index_only": false,
|
||||
"rows": 0,
|
||||
"cost": 0.145,
|
||||
"chosen": true
|
||||
}
|
||||
]
|
||||
]
|
||||
DROP TABLE t1;
|
||||
# End of 10.4 tests
|
||||
#
|
||||
# Test many rows to see output of big cost numbers
|
||||
|
|
|
@ -594,8 +594,35 @@ EXPLAIN SELECT * FROM t1, t2 WHERE t1.a=t2.a ORDER BY t2.b;
|
|||
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo # End of 10.4 tests
|
||||
--echo #
|
||||
--echo # MDEV-22665: Print ranges in the optimizer trace created for non-indexed columns when
|
||||
--echo # optimizer_use_condition_selectivity >2
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a INT, b INT);
|
||||
INSERT INTO t1 SELECT seq, seq from seq_1_to_100;
|
||||
SET optimizer_trace=1;
|
||||
ANALYZE TABLE t1 PERSISTENT FOR ALL;
|
||||
EXPLAIN EXTENDED SELECT * from t1 WHERE a between 1 and 5 and b <= 5;
|
||||
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
|
||||
EXPLAIN EXTENDED SELECT * from t1 WHERE a != 5;
|
||||
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
|
||||
EXPLAIN EXTENDED SELECT * from t1 WHERE b >= 10 and b < 25;
|
||||
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-22910:SIGSEGV in Opt_trace_context::is_started & SIGSEGV in Json_writer::add_table_name
|
||||
--echo # (on optimized builds)
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1( a INT, b INT, PRIMARY KEY( a ) );
|
||||
SELECT sum(b), row_number() OVER (order by b) FROM t1 WHERE a = 101;
|
||||
UPDATE t1 SET b=10 WHERE a=1;
|
||||
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # End of 10.4 tests
|
||||
|
||||
--echo #
|
||||
--echo # Test many rows to see output of big cost numbers
|
||||
|
|
|
@ -2567,6 +2567,37 @@ sum(a) a b
|
|||
6 1 1
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# MDEV-17606: Query returns wrong results (while using CHARACTER SET utf8)
|
||||
#
|
||||
CREATE TABLE t1(l1 varchar(10), i2 int);
|
||||
INSERT INTO t1 VALUES ('e',2),('o',6),('x',4);
|
||||
CREATE TABLE t2 (v1 varchar(10) CHARACTER SET utf8, KEY v1 (v1(3)));
|
||||
INSERT INTO t2 VALUES ('k'),('rid'),('f'),('x');
|
||||
EXPLAIN EXTENDED SELECT * FROM t1 where ( t1.l1 < ANY (SELECT MAX(t2.v1) FROM t2));
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||
2 SUBQUERY t2 ALL NULL NULL NULL NULL 4 100.00
|
||||
Warnings:
|
||||
Note 1003 /* select#1 */ select `test`.`t1`.`l1` AS `l1`,`test`.`t1`.`i2` AS `i2` from `test`.`t1` where <nop>(<in_optimizer>(`test`.`t1`.`l1`,<max>(/* select#2 */ select max(`test`.`t2`.`v1`) from `test`.`t2`) > convert(<cache>(`test`.`t1`.`l1`) using utf8)))
|
||||
SELECT * FROM t1 where ( t1.l1 < ANY (SELECT MAX(t2.v1) FROM t2));
|
||||
l1 i2
|
||||
e 2
|
||||
o 6
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# MDEV-22852: SIGSEGV in sortlength (optimized builds)
|
||||
#
|
||||
SET @save_optimizer_switch=@@optimizer_switch;
|
||||
SET optimizer_switch='subquery_cache=off';
|
||||
CREATE TABLE t1 (a INT,b INT);
|
||||
INSERT INTO t1 VALUES (0,0),(0,0);
|
||||
SELECT (SELECT DISTINCT t1i.b FROM t1 t1i GROUP BY t1i.a ORDER BY MAX(t1o.b)) FROM t1 AS t1o;
|
||||
(SELECT DISTINCT t1i.b FROM t1 t1i GROUP BY t1i.a ORDER BY MAX(t1o.b))
|
||||
0
|
||||
SET @@optimizer_switch= @save_optimizer_switch;
|
||||
DROP TABLE t1;
|
||||
# End of 10.2 tests
|
||||
#
|
||||
# MDEV-19134: EXISTS() slower if ORDER BY is defined
|
||||
#
|
||||
create table t0 (a int);
|
||||
|
|
|
@ -2102,6 +2102,33 @@ eval EXPLAIN EXTENDED $query;
|
|||
eval $query;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17606: Query returns wrong results (while using CHARACTER SET utf8)
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(l1 varchar(10), i2 int);
|
||||
INSERT INTO t1 VALUES ('e',2),('o',6),('x',4);
|
||||
CREATE TABLE t2 (v1 varchar(10) CHARACTER SET utf8, KEY v1 (v1(3)));
|
||||
INSERT INTO t2 VALUES ('k'),('rid'),('f'),('x');
|
||||
|
||||
EXPLAIN EXTENDED SELECT * FROM t1 where ( t1.l1 < ANY (SELECT MAX(t2.v1) FROM t2));
|
||||
SELECT * FROM t1 where ( t1.l1 < ANY (SELECT MAX(t2.v1) FROM t2));
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-22852: SIGSEGV in sortlength (optimized builds)
|
||||
--echo #
|
||||
|
||||
SET @save_optimizer_switch=@@optimizer_switch;
|
||||
SET optimizer_switch='subquery_cache=off';
|
||||
CREATE TABLE t1 (a INT,b INT);
|
||||
INSERT INTO t1 VALUES (0,0),(0,0);
|
||||
SELECT (SELECT DISTINCT t1i.b FROM t1 t1i GROUP BY t1i.a ORDER BY MAX(t1o.b)) FROM t1 AS t1o;
|
||||
SET @@optimizer_switch= @save_optimizer_switch;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # End of 10.2 tests
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-19134: EXISTS() slower if ORDER BY is defined
|
||||
--echo #
|
||||
|
|
|
@ -584,3 +584,21 @@ ALTER TABLE t1 CHANGE no_such_col1 col1 BIGINT NULL;
|
|||
ERROR 42S22: Unknown column 'no_such_col1' in 't1'
|
||||
TRUNCATE TABLE t1;
|
||||
DROP TEMPORARY TABLE t1;
|
||||
#
|
||||
# MDEV-21695 Server crashes in TABLE::evaluate_update_default_function upon UPDATE on temporary table
|
||||
#
|
||||
SET timestamp=UNIX_TIMESTAMP('2001-01-01 10:20:30');
|
||||
CREATE TEMPORARY TABLE t1 (a DATETIME ON UPDATE CURRENT_TIMESTAMP);
|
||||
ALTER TABLE t1 ADD b INT;
|
||||
INSERT INTO t1 (b) VALUES (1),(2);
|
||||
ALTER TABLE t1 CHANGE COLUMN x xx INT;
|
||||
ERROR 42S22: Unknown column 'x' in 't1'
|
||||
UPDATE t1 SET b = 3;
|
||||
SELECT * FROM t1;
|
||||
a b
|
||||
2001-01-01 10:20:30 3
|
||||
2001-01-01 10:20:30 3
|
||||
DROP TEMPORARY TABLE t1;
|
||||
#
|
||||
# End of 10.2 tests
|
||||
#
|
||||
|
|
|
@ -639,3 +639,22 @@ ALTER TABLE t1 CHANGE no_such_col1 col1 BIGINT NULL;
|
|||
# was not dropped during the first TRUNCATE due to extra table handles.
|
||||
TRUNCATE TABLE t1;
|
||||
DROP TEMPORARY TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-21695 Server crashes in TABLE::evaluate_update_default_function upon UPDATE on temporary table
|
||||
--echo #
|
||||
|
||||
SET timestamp=UNIX_TIMESTAMP('2001-01-01 10:20:30');
|
||||
CREATE TEMPORARY TABLE t1 (a DATETIME ON UPDATE CURRENT_TIMESTAMP);
|
||||
ALTER TABLE t1 ADD b INT;
|
||||
INSERT INTO t1 (b) VALUES (1),(2);
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
ALTER TABLE t1 CHANGE COLUMN x xx INT;
|
||||
UPDATE t1 SET b = 3;
|
||||
SELECT * FROM t1;
|
||||
DROP TEMPORARY TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.2 tests
|
||||
--echo #
|
||||
|
|
|
@ -3789,6 +3789,16 @@ row_number() OVER()
|
|||
3
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-22984: Throw an error when arguments to window functions are window functions
|
||||
#
|
||||
CREATE TABLE t1(a INT, b INT);
|
||||
INSERT INTO t1 VALUES (1,1), (2,2), (3,3);
|
||||
SELECT NTILE(MAX(a) OVER (PARTITION BY a)) OVER (PARTITION BY a ORDER BY b) FROM t1;
|
||||
ERROR HY000: Window functions can not be used as arguments to group functions.
|
||||
SELECT FIRST_VALUE(MAX(a) OVER (PARTITION BY a)) OVER (ORDER BY a) AS x FROM t1 GROUP BY a;
|
||||
ERROR HY000: Window functions can not be used as arguments to group functions.
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 10.2 tests
|
||||
#
|
||||
#
|
||||
|
|
|
@ -2458,6 +2458,19 @@ ANALYZE FORMAT=JSON SELECT row_number() OVER() FROM t1;
|
|||
SELECT row_number() OVER() FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-22984: Throw an error when arguments to window functions are window functions
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a INT, b INT);
|
||||
INSERT INTO t1 VALUES (1,1), (2,2), (3,3);
|
||||
|
||||
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
||||
SELECT NTILE(MAX(a) OVER (PARTITION BY a)) OVER (PARTITION BY a ORDER BY b) FROM t1;
|
||||
--error ER_SUM_FUNC_WITH_WINDOW_FUNC_AS_ARG
|
||||
SELECT FIRST_VALUE(MAX(a) OVER (PARTITION BY a)) OVER (ORDER BY a) AS x FROM t1 GROUP BY a;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.2 tests
|
||||
--echo #
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# Call mtr in out-of-source build
|
||||
$ENV{MTR_BINDIR} = '@CMAKE_BINARY_DIR@';
|
||||
chdir('@CMAKE_SOURCE_DIR@/mysql-test');
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# -*- cperl -*-
|
||||
|
||||
# Copyright (c) 2004, 2014, Oracle and/or its affiliates.
|
||||
|
@ -267,8 +267,12 @@ our %gprof_dirs;
|
|||
|
||||
our $glob_debugger= 0;
|
||||
our $opt_gdb;
|
||||
my $opt_rr;
|
||||
my $opt_rr_dir;
|
||||
my @rr_record_args;
|
||||
our $opt_client_gdb;
|
||||
my $opt_boot_gdb;
|
||||
my $opt_boot_rr;
|
||||
our $opt_dbx;
|
||||
our $opt_client_dbx;
|
||||
my $opt_boot_dbx;
|
||||
|
@ -1159,10 +1163,14 @@ sub command_line_setup {
|
|||
'debug-common' => \$opt_debug_common,
|
||||
'debug-server' => \$opt_debug_server,
|
||||
'gdb=s' => \$opt_gdb,
|
||||
'rr' => \$opt_rr,
|
||||
'rr-arg=s' => \@rr_record_args,
|
||||
'rr-dir=s' => \$opt_rr_dir,
|
||||
'client-gdb' => \$opt_client_gdb,
|
||||
'manual-gdb' => \$opt_manual_gdb,
|
||||
'manual-lldb' => \$opt_manual_lldb,
|
||||
'boot-gdb' => \$opt_boot_gdb,
|
||||
'boot-rr' => \$opt_boot_rr,
|
||||
'manual-debug' => \$opt_manual_debug,
|
||||
'ddd' => \$opt_ddd,
|
||||
'client-ddd' => \$opt_client_ddd,
|
||||
|
@ -1638,9 +1646,9 @@ sub command_line_setup {
|
|||
$ENV{LSAN_OPTIONS}= "suppressions=${glob_mysql_test_dir}/lsan.supp:print_suppressions=0"
|
||||
if -f "$glob_mysql_test_dir/lsan.supp" and not IS_WINDOWS;
|
||||
|
||||
if ( $opt_gdb || $opt_client_gdb || $opt_ddd || $opt_client_ddd ||
|
||||
$opt_manual_gdb || $opt_manual_lldb || $opt_manual_ddd ||
|
||||
$opt_manual_debug || $opt_dbx || $opt_client_dbx || $opt_manual_dbx ||
|
||||
if ( $opt_gdb || $opt_client_gdb || $opt_ddd || $opt_client_ddd || $opt_rr ||
|
||||
$opt_manual_gdb || $opt_manual_lldb || $opt_manual_ddd ||
|
||||
$opt_manual_debug || $opt_dbx || $opt_client_dbx || $opt_manual_dbx ||
|
||||
$opt_debugger || $opt_client_debugger )
|
||||
{
|
||||
$ENV{ASAN_OPTIONS}= 'disable_coredump=0:'. $ENV{ASAN_OPTIONS};
|
||||
|
@ -3288,6 +3296,13 @@ sub mysql_install_db {
|
|||
ddd_arguments(\$args, \$exe_mysqld_bootstrap, $mysqld->name(),
|
||||
$bootstrap_sql_file);
|
||||
}
|
||||
if ($opt_boot_rr) {
|
||||
$args= ["record", @rr_record_args, $exe_mysqld_bootstrap, @$args];
|
||||
$exe_mysqld_bootstrap= "rr";
|
||||
my $rr_dir= $opt_rr_dir ? $opt_rr_dir : "$opt_vardir/rr.boot";
|
||||
$ENV{'_RR_TRACE_DIR'}= $rr_dir;
|
||||
mkpath($rr_dir);
|
||||
}
|
||||
|
||||
my $path_sql= my_find_file($install_basedir,
|
||||
["mysql", "sql/share", "share/mariadb",
|
||||
|
@ -5286,6 +5301,14 @@ sub mysqld_start ($$) {
|
|||
# Indicate the exe should not be started
|
||||
$exe= undef;
|
||||
}
|
||||
elsif ( $opt_rr )
|
||||
{
|
||||
$args= ["record", @rr_record_args, "$exe", @$args];
|
||||
$exe= "rr";
|
||||
my $rr_dir= $opt_rr_dir ? $opt_rr_dir : "$opt_vardir/rr". $mysqld->after('mysqld');
|
||||
$ENV{'_RR_TRACE_DIR'}= $rr_dir;
|
||||
mkpath($rr_dir);
|
||||
}
|
||||
else
|
||||
{
|
||||
# Default to not wait until pid file has been created
|
||||
|
@ -6470,6 +6493,15 @@ Options for strace
|
|||
stracer=<EXE> Specify name and path to the trace program to use.
|
||||
Default is "strace". Example: $0 --stracer=ktrace.
|
||||
|
||||
Options for rr (Record and Replay)
|
||||
rr Run the "mysqld" executables using rr. Default run
|
||||
option is "rr record mysqld mysqld_options"
|
||||
boot-rr Start bootstrap server in rr
|
||||
rr-arg=ARG Option to give rr record, can be specified more then once
|
||||
rr-dir=DIR The directory where rr recordings are stored. Defaults
|
||||
to 'vardir'/rr.0 (rr.boot for bootstrap instance and
|
||||
rr.1, ..., rr.N for slave instances).
|
||||
|
||||
Misc options
|
||||
user=USER User for connecting to mysqld(default: $opt_user)
|
||||
comment=STR Write STR to the output
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# Copyright (c) 2011, Oracle and/or its affiliates
|
||||
#
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
################################################################################
|
||||
#
|
||||
# This script runs the transactional stress test "stress_tx_rr" against the
|
||||
|
|
|
@ -209,7 +209,6 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
1 PRIMARY t3 ALL NULL NULL NULL NULL 7
|
||||
1 PRIMARY <derived2> ref key0 key0 18 federated.t3.name 2
|
||||
2 PUSHED DERIVED NULL NULL NULL NULL NULL NULL NULL NULL
|
||||
3 MATERIALIZED t2 ALL NULL NULL NULL NULL 7 Using temporary
|
||||
ANALYZE FORMAT=JSON
|
||||
SELECT *
|
||||
FROM federated.t3, (SELECT t1.name FROM federated.t1
|
||||
|
@ -253,25 +252,7 @@ ANALYZE
|
|||
"select_id": 2,
|
||||
"table": {
|
||||
"message": "Pushed derived"
|
||||
},
|
||||
"subqueries": [
|
||||
{
|
||||
"query_block": {
|
||||
"select_id": 3,
|
||||
"temporary_table": {
|
||||
"table": {
|
||||
"table_name": "t2",
|
||||
"access_type": "ALL",
|
||||
"r_loops": 0,
|
||||
"rows": 7,
|
||||
"r_rows": null,
|
||||
"filtered": 100,
|
||||
"r_filtered": null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -321,6 +302,78 @@ select @var;
|
|||
@var
|
||||
xxx
|
||||
select name into outfile 'tmp.txt' from federated.t1;
|
||||
#
|
||||
# MDEV-22993: Crash on EXPLAIN with PUSHED DOWN SELECT and subquery
|
||||
#
|
||||
explain
|
||||
select * from federated.t1
|
||||
where name in (select name from federated.t2);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PUSHED SELECT NULL NULL NULL NULL NULL NULL NULL NULL
|
||||
explain format=json
|
||||
select * from federated.t1
|
||||
where name in (select name from federated.t2);
|
||||
EXPLAIN
|
||||
{
|
||||
"query_block": {
|
||||
"select_id": 1,
|
||||
"table": {
|
||||
"message": "Pushed select"
|
||||
}
|
||||
}
|
||||
}
|
||||
#
|
||||
# MDEV-22993, testcase #2: EXPLAIN output doesn't make sense when
|
||||
# derived table pushdown is used.
|
||||
#
|
||||
create table t5 (a int) engine=myisam;
|
||||
insert into t5 values (1),(2);
|
||||
# Must not show lines with id=3
|
||||
explain
|
||||
select * from t5,
|
||||
(select id from federated.t1
|
||||
where name in (select name from federated.t2) or name like 'foo%') as TQ;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t5 ALL NULL NULL NULL NULL 2
|
||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 5 Using join buffer (flat, BNL join)
|
||||
2 PUSHED DERIVED NULL NULL NULL NULL NULL NULL NULL NULL
|
||||
# Must not show elements with select_id=3
|
||||
explain format=json
|
||||
select * from t5,
|
||||
(select id from federated.t1
|
||||
where name in (select name from federated.t2) or name like 'foo%') as TQ;
|
||||
EXPLAIN
|
||||
{
|
||||
"query_block": {
|
||||
"select_id": 1,
|
||||
"table": {
|
||||
"table_name": "t5",
|
||||
"access_type": "ALL",
|
||||
"rows": 2,
|
||||
"filtered": 100
|
||||
},
|
||||
"block-nl-join": {
|
||||
"table": {
|
||||
"table_name": "<derived2>",
|
||||
"access_type": "ALL",
|
||||
"rows": 5,
|
||||
"filtered": 100
|
||||
},
|
||||
"buffer_type": "flat",
|
||||
"buffer_size": "65",
|
||||
"join_type": "BNL",
|
||||
"materialized": {
|
||||
"query_block": {
|
||||
"select_id": 2,
|
||||
"table": {
|
||||
"message": "Pushed derived"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
drop table t5;
|
||||
DROP TABLE federated.t1, federated.t2, federated.t3, federated.t4;
|
||||
connection slave;
|
||||
DROP TABLE federated.t1, federated.t2;
|
||||
|
|
|
@ -167,6 +167,40 @@ select name into outfile 'tmp.txt' from federated.t1;
|
|||
let $path=`select concat(@@datadir, 'test/tmp.txt')`;
|
||||
remove_file $path;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-22993: Crash on EXPLAIN with PUSHED DOWN SELECT and subquery
|
||||
--echo #
|
||||
|
||||
explain
|
||||
select * from federated.t1
|
||||
where name in (select name from federated.t2);
|
||||
|
||||
explain format=json
|
||||
select * from federated.t1
|
||||
where name in (select name from federated.t2);
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-22993, testcase #2: EXPLAIN output doesn't make sense when
|
||||
--echo # derived table pushdown is used.
|
||||
--echo #
|
||||
|
||||
create table t5 (a int) engine=myisam;
|
||||
insert into t5 values (1),(2);
|
||||
|
||||
--echo # Must not show lines with id=3
|
||||
explain
|
||||
select * from t5,
|
||||
(select id from federated.t1
|
||||
where name in (select name from federated.t2) or name like 'foo%') as TQ;
|
||||
|
||||
--echo # Must not show elements with select_id=3
|
||||
explain format=json
|
||||
select * from t5,
|
||||
(select id from federated.t1
|
||||
where name in (select name from federated.t2) or name like 'foo%') as TQ;
|
||||
|
||||
drop table t5;
|
||||
|
||||
DROP TABLE federated.t1, federated.t2, federated.t3, federated.t4;
|
||||
|
||||
connection slave;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
|
||||
if ( (scalar(@ARGV) != 1 ) || ($ARGV[0] =~ /[^0-9]/i ) )
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
|
||||
if ( (scalar(@ARGV) != 2 ) || ($ARGV[0] =~ /[^0-9]/i ) )
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
#################################################################################
|
||||
# Author: Serge Kozlov #
|
||||
|
|
|
@ -37,7 +37,7 @@ galera_split_brain : MDEV-18280 Galera test failure on galera_split_brain and ga
|
|||
galera_ssl_upgrade : MDEV-19950 Galera test failure on galera_ssl_upgrade
|
||||
galera_sst_mariabackup_encrypt_with_key : MDEV-21484 galera_sst_mariabackup_encrypt_with_key
|
||||
galera_toi_ddl_nonconflicting : MDEV-21518 galera.galera_toi_ddl_nonconflicting
|
||||
galera_var_innodb_disallow_writes : MDEV-20928 galera.galera_var_innodb_disallow_writes
|
||||
galera_toi_truncate : MDEV-22996 Hang on galera_toi_truncate test case
|
||||
galera_var_node_address : MDEV-20485 Galera test failure
|
||||
galera_var_notify_cmd : MDEV-21905 Galera test galera_var_notify_cmd causes hang
|
||||
galera_var_reject_queries : assertion in inline_mysql_socket_send
|
||||
|
|
|
@ -19,6 +19,7 @@ innodb_lock_schedule_algorithm=FCFS
|
|||
wsrep-on=1
|
||||
|
||||
log-slave-updates
|
||||
wsrep-on=1
|
||||
|
||||
innodb-autoinc-lock-mode=2
|
||||
default-storage-engine=innodb
|
||||
|
@ -44,6 +45,7 @@ innodb_lock_schedule_algorithm=FCFS
|
|||
wsrep-on=1
|
||||
|
||||
log-slave-updates
|
||||
wsrep-on=1
|
||||
|
||||
innodb-autoinc-lock-mode=2
|
||||
default-storage-engine=innodb
|
||||
|
@ -69,6 +71,7 @@ innodb_lock_schedule_algorithm=FCFS
|
|||
wsrep-on=1
|
||||
|
||||
log-slave-updates
|
||||
wsrep-on=1
|
||||
|
||||
innodb-autoinc-lock-mode=2
|
||||
default-storage-engine=innodb
|
||||
|
|
|
@ -9,6 +9,7 @@ INSERT INTO t1 VALUES(1);
|
|||
SELECT LENGTH(@@global.gtid_binlog_state) > 1;
|
||||
LENGTH(@@global.gtid_binlog_state) > 1
|
||||
1
|
||||
connection node_1;
|
||||
connection node_2;
|
||||
gtid_binlog_state_equal
|
||||
1
|
||||
|
|
|
@ -9,6 +9,7 @@ INSERT INTO t1 VALUES(1);
|
|||
SELECT LENGTH(@@global.gtid_binlog_state) > 1;
|
||||
LENGTH(@@global.gtid_binlog_state) > 1
|
||||
1
|
||||
connection node_1;
|
||||
connection node_2;
|
||||
gtid_binlog_state_equal
|
||||
1
|
||||
|
|
|
@ -31,7 +31,6 @@ DROP TABLE t1;
|
|||
connection node_1;
|
||||
connection node_2;
|
||||
connection node_3;
|
||||
connection node_3;
|
||||
RESET MASTER;
|
||||
connection node_1;
|
||||
STOP SLAVE;
|
||||
|
@ -43,3 +42,5 @@ connection node_2;
|
|||
SET GLOBAL WSREP_ON=OFF;
|
||||
reset master;
|
||||
SET GLOBAL WSREP_ON=ON;
|
||||
connection node_3;
|
||||
RESET MASTER;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
connection node_2;
|
||||
connection node_1;
|
||||
connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1;
|
||||
connection node_1a;
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
connection node_1;
|
||||
|
@ -7,19 +8,20 @@ CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB;
|
|||
SET GLOBAL innodb_disallow_writes=ON;
|
||||
INSERT INTO t1 VALUES (1);;
|
||||
connection node_1a;
|
||||
SELECT COUNT(*) = 1 FROM t1;
|
||||
COUNT(*) = 1
|
||||
SELECT COUNT(*) AS EXPECT_0 FROM t1;
|
||||
EXPECT_0
|
||||
0
|
||||
SELECT COUNT(*) = 1 FROM t1;
|
||||
COUNT(*) = 1
|
||||
SELECT COUNT(*) AS EXPECT_0 FROM t1;
|
||||
EXPECT_0
|
||||
0
|
||||
SET GLOBAL innodb_disallow_writes=OFF;
|
||||
connection node_1;
|
||||
SELECT COUNT(*) = 1 FROM t1;
|
||||
COUNT(*) = 1
|
||||
SELECT COUNT(*) AS EXPECT_1 FROM t1;
|
||||
EXPECT_1
|
||||
1
|
||||
connection node_2;
|
||||
SELECT COUNT(*) = 1 FROM t1;
|
||||
COUNT(*) = 1
|
||||
SELECT COUNT(*) AS EXPECT_1 FROM t1;
|
||||
EXPECT_1
|
||||
1
|
||||
DROP TABLE t1;
|
||||
disconnect node_1a;
|
||||
|
|
31
mysql-test/suite/galera/r/mysql-wsrep-bugs-607.result
Normal file
31
mysql-test/suite/galera/r/mysql-wsrep-bugs-607.result
Normal file
|
@ -0,0 +1,31 @@
|
|||
connection node_2;
|
||||
connection node_1;
|
||||
#
|
||||
# test the order of wsrep XID storage after certifiation failure
|
||||
#
|
||||
connection node_1;
|
||||
set session wsrep_sync_wait=0;
|
||||
create table t1 (i int primary key, j int);
|
||||
insert into t1 values (4, 0);
|
||||
connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||
connection node_2b;
|
||||
set session wsrep_sync_wait=0;
|
||||
SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb";
|
||||
connection node_1;
|
||||
UPDATE test.t1 set j=1 where i=4;
|
||||
connection node_2b;
|
||||
SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached";
|
||||
connection node_2;
|
||||
set session wsrep_sync_wait=0;
|
||||
set session wsrep_retry_autocommit=0;
|
||||
UPDATE test.t1 SET j=2 WHERE i=4;
|
||||
connection node_2b;
|
||||
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
|
||||
SET GLOBAL debug_dbug = "";
|
||||
SET DEBUG_SYNC = "RESET";
|
||||
connection node_2;
|
||||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||||
select * from t1;
|
||||
i j
|
||||
4 1
|
||||
DROP TABLE t1;
|
|
@ -63,6 +63,7 @@ push @::global_suppressions,
|
|||
qr(WSREP: Failed to remove page file .*),
|
||||
qr(WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to .*),
|
||||
qr|WSREP: Sending JOIN failed: -107 \(Transport endpoint is not connected\). Will retry in new primary component.|,
|
||||
qr|WSREP: Trying to continue unpaused monitor|,
|
||||
);
|
||||
|
||||
sub skip_combinations {
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
--source include/galera_cluster.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
--source include/galera_have_debug_sync.inc
|
||||
|
||||
--connection node_1
|
||||
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(255)) Engine=InnoDB;
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
--source include/have_binlog_format_row.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
--source include/galera_have_debug_sync.inc
|
||||
|
||||
SET @orig_debug=@@debug_dbug;
|
||||
|
||||
--connection node_2
|
||||
|
|
|
@ -3,7 +3,10 @@
|
|||
#
|
||||
--source include/galera_cluster.inc
|
||||
--source include/have_binlog_format_row.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
--source include/galera_have_debug_sync.inc
|
||||
|
||||
SET @orig_debug=@@debug_dbug;
|
||||
|
||||
--connection node_2
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#
|
||||
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_log_bin.inc
|
||||
--source include/galera_cluster.inc
|
||||
|
||||
# As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it
|
||||
|
@ -27,6 +28,13 @@ INSERT INTO t1 VALUES(1);
|
|||
SELECT LENGTH(@@global.gtid_binlog_state) > 1;
|
||||
--let $gtid_binlog_state_node1 = `SELECT @@global.gtid_binlog_state;`
|
||||
|
||||
--connection node_1
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
|
||||
--source include/wait_condition.inc
|
||||
|
|
|
@ -5,4 +5,4 @@ log-bin=mysqld-bin
|
|||
log-slave-updates
|
||||
binlog-format=ROW
|
||||
|
||||
gtid_pos_auto_engines=InnoDB
|
||||
gtid_pos_auto_engines=InnoDB
|
||||
|
|
|
@ -11,4 +11,4 @@
|
|||
|
||||
--connection node_2
|
||||
DROP TABLE mysql.gtid_slave_pos_InnoDB;
|
||||
CALL mtr.add_suppression("The automatically created table");
|
||||
CALL mtr.add_suppression("The automatically created table");
|
||||
|
|
|
@ -59,6 +59,8 @@ SELECT COUNT(*) AS EXPECT_0 FROM t1;
|
|||
--connection node_3
|
||||
DROP TABLE t1;
|
||||
|
||||
--sleep 1
|
||||
|
||||
--connection node_1
|
||||
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
|
||||
--source include/wait_condition.inc
|
||||
|
@ -70,8 +72,6 @@ DROP TABLE t1;
|
|||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
RESET MASTER;
|
||||
|
||||
--connection node_1
|
||||
|
@ -85,3 +85,6 @@ SET GLOBAL WSREP_ON=ON;
|
|||
SET GLOBAL WSREP_ON=OFF;
|
||||
reset master;
|
||||
SET GLOBAL WSREP_ON=ON;
|
||||
|
||||
--connection node_3
|
||||
RESET MASTER;
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
--source include/galera_cluster.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
--source include/have_query_cache.inc
|
||||
--source include/galera_have_debug_sync.inc
|
||||
|
||||
CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
--source include/galera_cluster.inc
|
||||
|
||||
--connection node_1
|
||||
--replace_regex /18446744073709551/ERROR/ /[0-9]/#/
|
||||
--replace_regex /18446744073709551/ERROR/ /[0-9+]/#/
|
||||
show status like 'wsrep_cluster_conf_id';
|
||||
|
||||
--connection node_2
|
||||
--replace_regex /18446744073709551/ERROR/ /[0-9]/#/
|
||||
--replace_regex /18446744073709551/ERROR/ /[0-9+]/#/
|
||||
show status like 'wsrep_cluster_conf_id';
|
||||
|
|
|
@ -11,13 +11,10 @@
|
|||
#
|
||||
|
||||
--source include/galera_cluster.inc
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_log_bin.inc
|
||||
|
||||
# Open a separate connection to be used to run SHOW PROCESSLIST
|
||||
--let $galera_connection_name = node_1a
|
||||
--let $galera_server_number = 1
|
||||
--source include/galera_connect.inc
|
||||
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
||||
--connection node_1a
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
|
||||
|
@ -27,18 +24,27 @@ SET GLOBAL innodb_disallow_writes=ON;
|
|||
--send INSERT INTO t1 VALUES (1);
|
||||
|
||||
--connection node_1a
|
||||
SELECT COUNT(*) = 1 FROM t1;
|
||||
let $wait_condition = SELECT 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = 'INSERT INTO t1 VALUES (1)' AND State = 'Commit';
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1';
|
||||
--source include/wait_condition.inc
|
||||
SELECT COUNT(*) = 1 FROM t1;
|
||||
SELECT COUNT(*) AS EXPECT_0 FROM t1;
|
||||
let $wait_condition = SELECT 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = 'INSERT INTO t1 VALUES (1)';
|
||||
--source include/wait_condition.inc
|
||||
SELECT COUNT(*) AS EXPECT_0 FROM t1;
|
||||
|
||||
SET GLOBAL innodb_disallow_writes=OFF;
|
||||
|
||||
--connection node_1
|
||||
--reap
|
||||
SELECT COUNT(*) = 1 FROM t1;
|
||||
SELECT COUNT(*) AS EXPECT_1 FROM t1;
|
||||
|
||||
--connection node_2
|
||||
SELECT COUNT(*) = 1 FROM t1;
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1';
|
||||
--source include/wait_condition.inc
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
SELECT COUNT(*) AS EXPECT_1 FROM t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--disconnect node_1a
|
||||
|
||||
|
|
|
@ -4,7 +4,9 @@
|
|||
|
||||
--source include/galera_cluster.inc
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
--source include/galera_have_debug_sync.inc
|
||||
|
||||
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
||||
|
||||
|
|
70
mysql-test/suite/galera/t/mysql-wsrep-bugs-607.test
Normal file
70
mysql-test/suite/galera/t/mysql-wsrep-bugs-607.test
Normal file
|
@ -0,0 +1,70 @@
|
|||
--source include/galera_cluster.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
--source include/galera_have_debug_sync.inc
|
||||
--source include/have_log_bin.inc
|
||||
|
||||
#
|
||||
# Test case to stress the order of wsrep XID checkpointing.
|
||||
#
|
||||
# In buggy version, the transaction which failed certification can
|
||||
# rush to record wsrep XID checkpoint before the offending applier,
|
||||
# causing assert in innodb sys header update routine
|
||||
#
|
||||
|
||||
--echo #
|
||||
--echo # test the order of wsrep XID storage after certifiation failure
|
||||
--echo #
|
||||
|
||||
--connection node_1
|
||||
set session wsrep_sync_wait=0;
|
||||
|
||||
create table t1 (i int primary key, j int);
|
||||
|
||||
insert into t1 values (4, 0);
|
||||
|
||||
--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
||||
--connection node_2b
|
||||
set session wsrep_sync_wait=0;
|
||||
# wait for the last insert to be replicated from node 1
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM test.t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
# block applier before applying
|
||||
SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb";
|
||||
|
||||
# send update from node 1, it will pause in the sync point
|
||||
--connection node_1
|
||||
UPDATE test.t1 set j=1 where i=4;
|
||||
|
||||
--connection node_2b
|
||||
# wait until applier has reached the sync point
|
||||
SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached";
|
||||
|
||||
# look number of cert failures so far, and expect one more to happen
|
||||
--let $expected_cert_failures = `SELECT VARIABLE_VALUE+1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'`
|
||||
|
||||
# Inject a conflicting update in node 2, it should fail in certification
|
||||
--connection node_2
|
||||
set session wsrep_sync_wait=0;
|
||||
set session wsrep_retry_autocommit=0;
|
||||
--send UPDATE test.t1 SET j=2 WHERE i=4
|
||||
|
||||
--connection node_2b
|
||||
# wait until the update has hit certification failure
|
||||
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = $expected_cert_failures FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_cert_failures'
|
||||
--source include/wait_condition.inc
|
||||
|
||||
# release the applier
|
||||
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
|
||||
|
||||
SET GLOBAL debug_dbug = "";
|
||||
SET DEBUG_SYNC = "RESET";
|
||||
|
||||
--connection node_2
|
||||
--error ER_LOCK_DEADLOCK
|
||||
--reap
|
||||
select * from t1;
|
||||
|
||||
DROP TABLE t1;
|
|
@ -0,0 +1,40 @@
|
|||
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (1, 1);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
INSERT INTO t1 VALUES (2, 3);
|
||||
SET wsrep_sync_wait = 0;
|
||||
SET wsrep_on = OFF;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,after_shift_to_joining';
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
INSERT INTO t1 VALUES (3, 2);
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
INSERT INTO t1 VALUES (4, 3);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
INSERT INTO t1 VALUES (5, 2);
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,before_send_state_request';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
INSERT INTO t1 VALUES (6, 3);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
INSERT INTO t1 VALUES (7, 2);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
INSERT INTO t1 VALUES (8, 3);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,process_primary_configuration';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=before_send_state_request';
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
INSERT INTO t1 VALUES (9, 2);
|
||||
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=';
|
||||
DROP TABLE t1;
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
|
@ -0,0 +1,50 @@
|
|||
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (1, 1);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
INSERT INTO t1 VALUES (2, 3);
|
||||
SET wsrep_sync_wait = 0;
|
||||
SET wsrep_on = OFF;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,after_shift_to_joining';
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
INSERT INTO t1 VALUES (3, 2);
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
INSERT INTO t1 VALUES (4, 3);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
INSERT INTO t1 VALUES (5, 2);
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,before_send_state_request';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=before_send_state_request';
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
WSREP_DEBUG_SYNC_WAITERS after_shift_to_joining
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
INSERT INTO t1 VALUES (6, 3);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
INSERT INTO t1 VALUES (7, 2);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
INSERT INTO t1 VALUES (8, 3);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,process_primary_configuration';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
INSERT INTO t1 VALUES (9, 2);
|
||||
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
WSREP_DEBUG_SYNC_WAITERS process_primary_configuration
|
||||
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=';
|
||||
DROP TABLE t1;
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
|
@ -0,0 +1,55 @@
|
|||
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (1, 1);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
INSERT INTO t1 VALUES (2, 3);
|
||||
SET wsrep_sync_wait = 0;
|
||||
SET wsrep_on = OFF;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,after_shift_to_joining';
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
INSERT INTO t1 VALUES (3, 2);
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
INSERT INTO t1 VALUES (4, 3);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
INSERT INTO t1 VALUES (5, 2);
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,before_send_state_request';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=';
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,after_shift_to_joining';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=before_send_state_request';
|
||||
4
|
||||
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
WSREP_DEBUG_SYNC_WAITERS
|
||||
INSERT INTO t1 VALUES (6, 3);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
INSERT INTO t1 VALUES (7, 2);
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=';
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,process_primary_configuration';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
INSERT INTO t1 VALUES (8, 3);
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
INSERT INTO t1 VALUES (9, 2);
|
||||
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=process_primary_configuration';
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining';
|
||||
DROP TABLE t1;
|
||||
call mtr.add_suppression("WSREP: Send action {\(.*\), STATE_REQUEST} returned -107 \\(Transport endpoint is not connected\\)");
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
262
mysql-test/suite/galera_3nodes/t/galera_join_with_cc_A.test
Normal file
262
mysql-test/suite/galera_3nodes/t/galera_join_with_cc_A.test
Normal file
|
@ -0,0 +1,262 @@
|
|||
#
|
||||
# Tests handling of several configuration changes while a joiner gets
|
||||
# state transfer
|
||||
#
|
||||
# Variant A: sending of state transfer request delayed until two more
|
||||
# primary configuration changes happen
|
||||
#
|
||||
# Refs codersihp/galera-bugs#454
|
||||
#
|
||||
--source include/have_innodb.inc
|
||||
--source include/galera_cluster.inc
|
||||
--source include/galera_have_debug_sync.inc
|
||||
|
||||
--let $galera_connection_name = node_3
|
||||
--let $galera_server_number = 3
|
||||
--source include/galera_connect.inc
|
||||
|
||||
--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
|
||||
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (1, 1);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Isolate node_1 and update cluster state to force node 1 into joiner mode
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (2, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 2 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now reconnect node_1 but first make it block before sending state transfer
|
||||
# request
|
||||
#
|
||||
# THIS IS PC1
|
||||
#
|
||||
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
||||
SET wsrep_sync_wait = 0;
|
||||
SET wsrep_on = OFF;
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_set_sync_point.inc
|
||||
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (3, 2);
|
||||
|
||||
--connection node_1a
|
||||
--source include/galera_wait_sync_point.inc
|
||||
#
|
||||
# At this point every node thinks that node_1 is in a JOINER state
|
||||
#
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now that node_1 sent state request and became JOINER isolate node_1 again
|
||||
# and commit one more action, so that node_1 loses JOINER state
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (4, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 4 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Reconnect node_1 again
|
||||
#
|
||||
# THIS IS PC2
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
#
|
||||
# After this point node_1 is no longer JOINER and is required to start the
|
||||
# whole procedure over because it missed some actions (4th insert into t1)
|
||||
#
|
||||
|
||||
INSERT INTO t1 VALUES (5, 2);
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 5 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now let node_1 continue with IST and finish processing PC1, but make it
|
||||
# block when processing PC2 just before sending state transfer request
|
||||
#
|
||||
--connection node_1a
|
||||
--let $galera_sync_point = before_send_state_request
|
||||
--source include/galera_set_sync_point.inc
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_signal_sync_point.inc
|
||||
--let $galera_sync_point = before_send_state_request
|
||||
--source include/galera_wait_sync_point.inc
|
||||
|
||||
# since PC1 has been processed node_1 must have 3 rows in t1
|
||||
# 2 were there before PC1 and one was added while in PC1
|
||||
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now disconnect and reconnect node_1 again to get PC3
|
||||
# It still is blocked before sending state transfer request in PC2.
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (6, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 6 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
#
|
||||
# This is PC3
|
||||
#
|
||||
|
||||
INSERT INTO t1 VALUES (7, 2);
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 7 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now disconnect and reconnect node_1 again to get PC4 and allow node_1
|
||||
# to send state transfer request to be delivered in PC4 (and thus get
|
||||
# updated to PC4 seqno in state transfer.
|
||||
# Note that node_1 still processes PC2.
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (8, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
#
|
||||
# This is PC4. node_1 is still processing PC2, waiting to send state trasfer
|
||||
# request
|
||||
#
|
||||
--connection node_1a
|
||||
--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_set_sync_point.inc
|
||||
--let $galera_sync_point = before_send_state_request
|
||||
--source include/galera_signal_sync_point.inc
|
||||
# sent STR from PC2 into PC4
|
||||
|
||||
--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_wait_sync_point.inc
|
||||
#
|
||||
# Now node_1 is processing PC3, but should have completed state transfer from
|
||||
# PC4 and thus must have 8 rows in t1
|
||||
#
|
||||
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_2
|
||||
INSERT INTO t1 VALUES (9, 2);
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1a
|
||||
#--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_signal_sync_point.inc
|
||||
--source include/galera_wait_sync_point.inc
|
||||
#
|
||||
# Now node_1 is processing PC4, still must have 8 rows in t1
|
||||
#
|
||||
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_signal_sync_point.inc
|
||||
--source include/galera_clear_sync_point.inc
|
||||
|
||||
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
|
||||
--connection node_2
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
|
||||
--connection node_3
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
273
mysql-test/suite/galera_3nodes/t/galera_join_with_cc_B.test
Normal file
273
mysql-test/suite/galera_3nodes/t/galera_join_with_cc_B.test
Normal file
|
@ -0,0 +1,273 @@
|
|||
#
|
||||
# Tests handling of several configuration changes while a joiner gets
|
||||
# state transfer
|
||||
#
|
||||
# Variant B: sending of state transfer request is immediate but completion
|
||||
# of IST delayed until two more primary configuration changes happen
|
||||
#
|
||||
# Refs codersihp/galera-bugs#454
|
||||
#
|
||||
--source include/have_innodb.inc
|
||||
--source include/galera_cluster.inc
|
||||
--source include/galera_have_debug_sync.inc
|
||||
|
||||
--let $galera_connection_name = node_3
|
||||
--let $galera_server_number = 3
|
||||
--source include/galera_connect.inc
|
||||
|
||||
--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
|
||||
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (1, 1);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Isolate node_1 and update cluster state to force node 1 into joiner mode
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (2, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 2 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now reconnect node_1 but first make it block before sending state transfer
|
||||
# request
|
||||
#
|
||||
# THIS IS PC1
|
||||
#
|
||||
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
||||
SET wsrep_sync_wait = 0;
|
||||
SET wsrep_on = OFF;
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_set_sync_point.inc
|
||||
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (3, 2);
|
||||
|
||||
--connection node_1a
|
||||
--source include/galera_wait_sync_point.inc
|
||||
#
|
||||
# At this point every node thinks that node_1 is in a JOINER state
|
||||
#
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now that node_1 sent state request and became JOINER isolate node_1 again
|
||||
# and commit one more action, so that node_1 loses JOINER state
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (4, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 4 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Reconnect node_1 again
|
||||
#
|
||||
# THIS IS PC2
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
#
|
||||
# After this point node_1 is no longer JOINER and is required to start the
|
||||
# whole procedure over because it missed some actions (4th insert into t1)
|
||||
#
|
||||
|
||||
INSERT INTO t1 VALUES (5, 2);
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 5 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now let node_1 continue with IST and finish processing PC1, but make it
|
||||
# block when processing PC2 right after progressing to JOINER state and
|
||||
# before IST happens.
|
||||
#
|
||||
--connection node_1a
|
||||
--let $galera_sync_point = before_send_state_request
|
||||
--source include/galera_set_sync_point.inc
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_signal_sync_point.inc
|
||||
--let $galera_sync_point = before_send_state_request
|
||||
--source include/galera_wait_sync_point.inc
|
||||
--source include/galera_clear_sync_point.inc
|
||||
# Here node_1 is processing PC2 just before sending state request
|
||||
|
||||
# since PC1 has been processed node_1 must have 3 rows in t1
|
||||
# 2 were there before PC1 and one was added while in PC1
|
||||
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
# Proceed to sending state transfer request and block right after
|
||||
--source include/galera_signal_sync_point.inc # before_send_state_request
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_wait_sync_point.inc
|
||||
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
|
||||
|
||||
#
|
||||
# Now disconnect and reconnect node_1 again to get PC3
|
||||
# It is blocked right after shifting to JOINING state.
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (6, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 6 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
#
|
||||
# This is PC3
|
||||
#
|
||||
|
||||
INSERT INTO t1 VALUES (7, 2);
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 7 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now disconnect and reconnect node_1 again to get PC4 and allow node_1
|
||||
# to continue with IST.
|
||||
# Note that node_1 still processes PC2 and is joining.
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (8, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
#
|
||||
# This is PC4. node_1 is still processing PC2, waiting to send state trasfer
|
||||
# request
|
||||
#
|
||||
--connection node_1a
|
||||
--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_set_sync_point.inc
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_signal_sync_point.inc
|
||||
# continue with IST prepared for in PC2
|
||||
|
||||
--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_wait_sync_point.inc
|
||||
#
|
||||
# Now node_1 is processing PC3, and should have finished state transfer
|
||||
# State tranfer request was dilivered before PC3, so node_1 should have
|
||||
# received IST up to 4 rows in t1 (what was there before PC2) plus one more
|
||||
# INSERT while in PC2.
|
||||
#
|
||||
--let $wait_condition = SELECT COUNT(*) = 5 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_2
|
||||
INSERT INTO t1 VALUES (9, 2);
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1a
|
||||
#--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_signal_sync_point.inc
|
||||
--source include/galera_wait_sync_point.inc
|
||||
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
|
||||
#
|
||||
# Now node_1 is processing PC4, still must have 8 rows in t1
|
||||
#
|
||||
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_signal_sync_point.inc
|
||||
--source include/galera_clear_sync_point.inc
|
||||
|
||||
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
|
||||
--connection node_2
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
|
||||
--connection node_3
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
299
mysql-test/suite/galera_3nodes/t/galera_join_with_cc_C.test
Normal file
299
mysql-test/suite/galera_3nodes/t/galera_join_with_cc_C.test
Normal file
|
@ -0,0 +1,299 @@
|
|||
#
|
||||
# Tests handling of several configuration changes while a joiner gets
|
||||
# state transfer
|
||||
#
|
||||
# Variant C: sending of state transfer request is scheduled while in non-PRIM
|
||||
#
|
||||
# Refs codersihp/galera-bugs#454
|
||||
#
|
||||
--source include/have_innodb.inc
|
||||
--source include/galera_cluster.inc
|
||||
--source include/galera_have_debug_sync.inc
|
||||
|
||||
--let $galera_connection_name = node_3
|
||||
--let $galera_server_number = 3
|
||||
--source include/galera_connect.inc
|
||||
|
||||
--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
|
||||
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (1, 1);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Isolate node_1 and update cluster state to force node 1 into joiner mode
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (2, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 2 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now reconnect node_1 but first make it block before sending state transfer
|
||||
# request
|
||||
#
|
||||
# THIS IS PC1
|
||||
#
|
||||
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
|
||||
SET wsrep_sync_wait = 0;
|
||||
SET wsrep_on = OFF;
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_set_sync_point.inc
|
||||
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (3, 2);
|
||||
|
||||
--connection node_1a
|
||||
--source include/galera_wait_sync_point.inc
|
||||
#
|
||||
# At this point every node thinks that node_1 is in a JOINER state
|
||||
#
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now that node_1 sent state request and became JOINER isolate node_1 again
|
||||
# and commit one more action, so that node_1 loses JOINER state
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (4, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 4 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Reconnect node_1 again
|
||||
#
|
||||
# THIS IS PC2
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
#
|
||||
# After this point node_1 is no longer JOINER and is required to start the
|
||||
# whole procedure over because it missed some actions (4th insert into t1)
|
||||
#
|
||||
|
||||
INSERT INTO t1 VALUES (5, 2);
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 5 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now let node_1 continue with IST and finish processing PC1, but make it
|
||||
# block when processing PC2 right after progressing to JOINER state and
|
||||
# before IST happens.
|
||||
#
|
||||
--connection node_1a
|
||||
--let $galera_sync_point = before_send_state_request
|
||||
--source include/galera_set_sync_point.inc
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_signal_sync_point.inc
|
||||
--let $galera_sync_point = before_send_state_request
|
||||
--source include/galera_wait_sync_point.inc
|
||||
--source include/galera_clear_sync_point.inc
|
||||
# Here we are processing PC2 just before sending state request
|
||||
|
||||
# since PC1 has been processed node_1 must have 3 rows in t1
|
||||
# 2 were there before PC1 and one was added while in PC1
|
||||
--let $wait_condition = SELECT COUNT(*) = 3 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
#
|
||||
# Now disconnect and reconnect node_1 again to get PC3
|
||||
# It still is blocked before sending state transfer request in PC2.
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
# Proceed to sending state transfer request
|
||||
--connection node_1a
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_set_sync_point.inc
|
||||
--let $galera_sync_point = before_send_state_request
|
||||
--source include/galera_signal_sync_point.inc # before_send_state_request
|
||||
#
|
||||
# node_1 proceeds to sending state transfer request, it will be delivered only
|
||||
# in the next PC which is PC3. Only then the node will shift to JOINING
|
||||
#
|
||||
--echo 4
|
||||
SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_debug_sync_waiters';
|
||||
|
||||
--connection node_3
|
||||
INSERT INTO t1 VALUES (6, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 6 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
#
|
||||
# This is PC3
|
||||
#
|
||||
|
||||
INSERT INTO t1 VALUES (7, 2);
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 7 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
# node_1 is stiil processing PC2, it was let to send state transfer request
|
||||
# while in non-PRIM. Now it should be able to complete it and shift to
|
||||
# JOINING. Make it block on next PC(3) and continue to receive IST
|
||||
--connection node_1a
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_wait_sync_point.inc
|
||||
--source include/galera_clear_sync_point.inc # won't need it any more
|
||||
--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_set_sync_point.inc
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_signal_sync_point.inc
|
||||
# continue with IST while still processing PC2
|
||||
|
||||
#
|
||||
# Now disconnect and reconnect node_1 again to generate PC4.
|
||||
#
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=1';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
INSERT INTO t1 VALUES (8, 3);
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT COUNT(*) = 8 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1
|
||||
SET GLOBAL wsrep_provider_options='gmcast.isolate=0';
|
||||
|
||||
--connection node_2
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
|
||||
--source include/wait_condition.inc
|
||||
#
|
||||
# This is PC4. node_1 should complete IST, complete PC2, and continue
|
||||
# with the next item in queue
|
||||
#
|
||||
--connection node_1a
|
||||
--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_wait_sync_point.inc
|
||||
|
||||
#
|
||||
# Now node_1 is blocked before processing PC3, and should have finished state
|
||||
# transfer started while in PC2.
|
||||
# State tranfer request was dilivered in PC3 to donor, so node_1 should have
|
||||
# received IST up to 6 rows in t1 (what was there before PC3).
|
||||
#
|
||||
--let $wait_condition = SELECT COUNT(*) = 6 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_2
|
||||
INSERT INTO t1 VALUES (9, 2);
|
||||
|
||||
--connection node_3
|
||||
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1a
|
||||
# continue with processing PC3
|
||||
--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_signal_sync_point.inc
|
||||
|
||||
# wait for row that follows PC3
|
||||
--let $wait_condition = SELECT COUNT(*) = 7 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
# wait till PC4
|
||||
--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_wait_sync_point.inc
|
||||
#
|
||||
# Now node_1 is processing PC4, still must have 7 rows in t1
|
||||
#
|
||||
--let $wait_condition = SELECT COUNT(*) = 7 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
# Continue with PC4
|
||||
--let $galera_sync_point = process_primary_configuration
|
||||
--source include/galera_clear_sync_point.inc
|
||||
--source include/galera_signal_sync_point.inc
|
||||
--let $galera_sync_point = after_shift_to_joining
|
||||
--source include/galera_wait_sync_point.inc
|
||||
--source include/galera_clear_sync_point.inc
|
||||
--source include/galera_signal_sync_point.inc
|
||||
|
||||
--let $wait_condition = SELECT COUNT(*) = 9 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_1
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
call mtr.add_suppression("WSREP: Send action {\(.*\), STATE_REQUEST} returned -107 \\(Transport endpoint is not connected\\)");
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
|
||||
--connection node_2
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
||||
|
||||
--connection node_3
|
||||
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
|
|
@ -276,9 +276,9 @@ select count(*) > -1 from d_sys_virtual;
|
|||
count(*) > -1
|
||||
1
|
||||
select count(*) > -1 from information_schema.innodb_tablespaces_encryption;
|
||||
ERROR 42000: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
|
||||
ERROR 42000: Access denied; you need (at least one of) the PROCESS privilege(s) for this operation
|
||||
select count(*) > -1 from i_tablespaces_encryption;
|
||||
ERROR 42000: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
|
||||
ERROR 42000: Access denied; you need (at least one of) the PROCESS privilege(s) for this operation
|
||||
select count(*) > -1 from d_tablespaces_encryption;
|
||||
count(*) > -1
|
||||
1
|
||||
|
|
|
@ -225,6 +225,13 @@ id title body
|
|||
1 MySQL Tutorial DBMS stands for DataBase ...
|
||||
3 Optimizing MySQL In this tutorial we will show ...
|
||||
DROP TABLE articles;
|
||||
#
|
||||
# MDEV-22811 DDL fails to drop and re-create FTS index
|
||||
#
|
||||
CREATE TABLE t1 (FTS_DOC_ID BIGINT UNSIGNED PRIMARY KEY,
|
||||
f1 VARCHAR(200),FULLTEXT fidx(f1))engine=innodb;
|
||||
ALTER TABLE t1 DROP index fidx, ADD FULLTEXT INDEX(f1);
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a VARCHAR(3)) ENGINE=InnoDB;
|
||||
ALTER TABLE t1 ADD FULLTEXT KEY(a), ADD COLUMN b VARCHAR(3), ADD FULLTEXT KEY(b);
|
||||
DROP TABLE t1;
|
||||
|
|
|
@ -270,6 +270,14 @@ SELECT * FROM articles WHERE MATCH (title, body)
|
|||
|
||||
DROP TABLE articles;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-22811 DDL fails to drop and re-create FTS index
|
||||
--echo #
|
||||
CREATE TABLE t1 (FTS_DOC_ID BIGINT UNSIGNED PRIMARY KEY,
|
||||
f1 VARCHAR(200),FULLTEXT fidx(f1))engine=innodb;
|
||||
ALTER TABLE t1 DROP index fidx, ADD FULLTEXT INDEX(f1);
|
||||
DROP TABLE t1;
|
||||
|
||||
# Add more than one FTS index
|
||||
CREATE TABLE t1 (a VARCHAR(3)) ENGINE=InnoDB;
|
||||
ALTER TABLE t1 ADD FULLTEXT KEY(a), ADD COLUMN b VARCHAR(3), ADD FULLTEXT KEY(b);
|
||||
|
|
|
@ -5,3 +5,4 @@
|
|||
# Check for options overwriting
|
||||
# Check if uknown options that follow --mysqld-args are ingored
|
||||
# Check if [mariadb-client] group is not loaded (MDEV-22894)
|
||||
# Check if --help presents
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --unknown-option=xxx --target-dir=$targetdir;
|
||||
--error 2
|
||||
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --unknown-option --target-dir=$targetdir;
|
||||
--enable_result_log
|
||||
|
||||
--echo # Check for unknown options in "mariabackup" group
|
||||
--write_file $custom_cnf
|
||||
|
@ -62,3 +61,9 @@ EOF
|
|||
exec $XTRABACKUP --defaults-file=$custom_cnf --backup --target-dir=$targetdir;
|
||||
--remove_file $custom_cnf
|
||||
--rmdir $targetdir
|
||||
|
||||
--echo # Check if --help presents
|
||||
exec $XTRABACKUP --help;
|
||||
exec $XTRABACKUP -?;
|
||||
--enable_result_log
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@ rpl_spec_variables : BUG#11755836 2009-10-27 jasonh rpl_spec_variables fa
|
|||
rpl_partition_archive : MDEV-5077 2013-09-27 svoj Cannot exchange partition with archive table
|
||||
rpl_row_binlog_max_cache_size : MDEV-11092
|
||||
rpl_row_index_choice : MDEV-11666
|
||||
rpl_parallel2 : fails after MDEV-16172
|
||||
rpl_semi_sync_after_sync : fails after MDEV-16172
|
||||
rpl_slave_grp_exec: MDEV-10514
|
||||
rpl_auto_increment_update_failure : disabled for now
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
#
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
include/master-slave.inc
|
||||
[connection master]
|
||||
connection master;
|
||||
SET GLOBAL LOG_WARNINGS=2;
|
||||
connection slave;
|
||||
include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_USE_GTID=current_pos;
|
||||
include/start_slave.inc
|
||||
connection master;
|
||||
"Test Case 1: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(1), gtid('')"
|
||||
FOUND 1 /using_gtid\(1\), gtid\(\'\'\).*/ in mysqld.1.err
|
||||
connection slave;
|
||||
include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_USE_GTID=no;
|
||||
include/start_slave.inc
|
||||
connection master;
|
||||
"Test Case 2: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(0), gtid('')"
|
||||
FOUND 1 /using_gtid\(0\), gtid\(\'\'\).*/ in mysqld.1.err
|
||||
CREATE TABLE t (f INT) ENGINE=INNODB;
|
||||
INSERT INTO t VALUES(10);
|
||||
connection slave;
|
||||
connection slave;
|
||||
include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_USE_GTID=slave_pos;
|
||||
include/start_slave.inc
|
||||
connection master;
|
||||
"Test Case 3: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(1), gtid('0-1-2')"
|
||||
FOUND 1 /using_gtid\(1\), gtid\(\'0-1-2\'\).*/ in mysqld.1.err
|
||||
SET @@SESSION.gtid_domain_id=10;
|
||||
INSERT INTO t VALUES(20);
|
||||
connection slave;
|
||||
connection slave;
|
||||
include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_USE_GTID=slave_pos;
|
||||
include/start_slave.inc
|
||||
connection master;
|
||||
"Test Case 4: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(1), gtid('0-1-2,10-1-1')"
|
||||
FOUND 1 /using_gtid\(1\), gtid\(\'0-1-2,10-1-1\'\).*/ in mysqld.1.err
|
||||
"===== Clean up ====="
|
||||
connection slave;
|
||||
include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_USE_GTID=no;
|
||||
include/start_slave.inc
|
||||
connection master;
|
||||
DROP TABLE t;
|
||||
SET GLOBAL LOG_WARNINGS=default;
|
||||
include/rpl_end.inc
|
|
@ -0,0 +1,121 @@
|
|||
# ==== Purpose ====
|
||||
#
|
||||
# Test verifies that Start binlog_dump message will report GTID position
|
||||
# requested by slave when log_warnings > 1.
|
||||
#
|
||||
# ==== Implementation ====
|
||||
#
|
||||
# Steps:
|
||||
# 0 - Have LOG_WARNINGS=2
|
||||
# 1 - On a fresh slave server which has not replicated any GTIDs execute
|
||||
# "CHANGE MASTER TO MASTER_USE_GTID=current_pos;" command. Start the
|
||||
# slave.
|
||||
# 2 - In Master error log verify that pattern "using_gtid(1), gtid('')" is
|
||||
# present.
|
||||
# 3 - On slave server do STOP SLAVE and execute "CHANGE MASTER TO
|
||||
# MASTER_USE_GTID=no;" command. Start the slave threads.
|
||||
# 4 - In Master error log verify that pattern "using_gtid(0), gtid('')" is
|
||||
# present.
|
||||
# 5- Execute a DDL and DML on master server. This will generated two GTIDs
|
||||
# on the master server ('0-1-2'). Sync the slave server with master.
|
||||
# 6 - On slave do STOP SLAVE and execute "CHANGE MASTER TO
|
||||
# MASTER_USE_GTID=slave_pos;" command. Start slave threads.
|
||||
# 7 - In Master error verify that pattern "using_gtid(1), gtid('0-1-2')" is
|
||||
# present.
|
||||
# 8 - On Master change domain ID to 10 and execute a DML operation. It will
|
||||
# generate a GTID 10-1-1.
|
||||
# 9 - On slave do STOP SLAVE and execute "CHANGE MASTER TO
|
||||
# MASTER_USE_GTID=slave_pos;" command. Start slave threads.
|
||||
# 10 -In Master error verify that pattern "using_gtid(1),
|
||||
# gtid('0-1-2,10-1-1')" is present.
|
||||
#
|
||||
# ==== References ====
|
||||
#
|
||||
# MDEV-20428: "Start binlog_dump" message doesn't indicate GTID position
|
||||
#
|
||||
|
||||
--source include/have_binlog_format_mixed.inc
|
||||
--source include/have_innodb.inc
|
||||
--source include/master-slave.inc
|
||||
|
||||
--connection master
|
||||
SET GLOBAL LOG_WARNINGS=2;
|
||||
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_USE_GTID=current_pos;
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
# Check error log for correct messages.
|
||||
let $log_error_= `SELECT @@GLOBAL.log_error`;
|
||||
if(!$log_error_)
|
||||
{
|
||||
# MySQL Server on windows is started with --console and thus
|
||||
# does not know the location of its .err log, use default location
|
||||
let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||
}
|
||||
--echo "Test Case 1: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(1), gtid('')"
|
||||
--let SEARCH_FILE=$log_error_
|
||||
--let SEARCH_RANGE=-50000
|
||||
--let SEARCH_PATTERN=using_gtid\(1\), gtid\(\'\'\).*
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_USE_GTID=no;
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
--echo "Test Case 2: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(0), gtid('')"
|
||||
--let SEARCH_FILE=$log_error_
|
||||
--let SEARCH_RANGE=-50000
|
||||
--let SEARCH_PATTERN=using_gtid\(0\), gtid\(\'\'\).*
|
||||
--source include/search_pattern_in_file.inc
|
||||
CREATE TABLE t (f INT) ENGINE=INNODB;
|
||||
INSERT INTO t VALUES(10);
|
||||
save_master_pos;
|
||||
|
||||
--connection slave
|
||||
sync_with_master;
|
||||
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_USE_GTID=slave_pos;
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
--echo "Test Case 3: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(1), gtid('0-1-2')"
|
||||
--let SEARCH_FILE=$log_error_
|
||||
--let SEARCH_RANGE=-50000
|
||||
--let SEARCH_PATTERN=using_gtid\(1\), gtid\(\'0-1-2\'\).*
|
||||
--source include/search_pattern_in_file.inc
|
||||
SET @@SESSION.gtid_domain_id=10;
|
||||
INSERT INTO t VALUES(20);
|
||||
save_master_pos;
|
||||
|
||||
--connection slave
|
||||
sync_with_master;
|
||||
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_USE_GTID=slave_pos;
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
--echo "Test Case 4: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(1), gtid('0-1-2,10-1-1')"
|
||||
--let SEARCH_FILE=$log_error_
|
||||
--let SEARCH_RANGE=-50000
|
||||
--let SEARCH_PATTERN=using_gtid\(1\), gtid\(\'0-1-2,10-1-1\'\).*
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
--echo "===== Clean up ====="
|
||||
--connection slave
|
||||
--source include/stop_slave.inc
|
||||
CHANGE MASTER TO MASTER_USE_GTID=no;
|
||||
--source include/start_slave.inc
|
||||
|
||||
--connection master
|
||||
DROP TABLE t;
|
||||
SET GLOBAL LOG_WARNINGS=default;
|
||||
--source include/rpl_end.inc
|
|
@ -147,6 +147,35 @@ Variable_name Value
|
|||
Feature_system_versioning 2
|
||||
drop table t;
|
||||
#
|
||||
# MDEV-22906 Disallow system_versioning_asof in DML
|
||||
#
|
||||
create or replace table t1 (x int) with system versioning;
|
||||
create or replace table t2 (y int);
|
||||
insert into t1 values (1);
|
||||
insert into t2 values (1);
|
||||
set system_versioning_asof= '1970-01-01 00:00:00';
|
||||
delete t1, t2 from t1 join t2 where t1.x = t2.y;
|
||||
select * from t1 for system_time as of timestamp now(6);
|
||||
x
|
||||
insert into t1 values (1);
|
||||
insert into t2 values (1);
|
||||
update t1, t2 set x= 2, y= 2 where x = y;
|
||||
select * from t1 for system_time as of timestamp now(6);
|
||||
x
|
||||
2
|
||||
replace t2 select x + 1 from t1;
|
||||
select * from t2;
|
||||
y
|
||||
2
|
||||
3
|
||||
insert t2 select x + 2 from t1;
|
||||
select * from t2;
|
||||
y
|
||||
2
|
||||
3
|
||||
4
|
||||
drop tables t1, t2;
|
||||
#
|
||||
# MDEV-16991 Rounding vs truncation for TIME, DATETIME, TIMESTAMP
|
||||
#
|
||||
SET sql_mode=TIME_ROUND_FRACTIONAL;
|
||||
|
@ -157,3 +186,4 @@ SELECT @@global.system_versioning_asof;
|
|||
@@global.system_versioning_asof
|
||||
2002-01-01 00:00:00.000000
|
||||
SET @@global.system_versioning_asof= DEFAULT;
|
||||
# End of 10.4 tests
|
||||
|
|
|
@ -104,6 +104,30 @@ show status like "Feature_system_versioning";
|
|||
|
||||
drop table t;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-22906 Disallow system_versioning_asof in DML
|
||||
--echo #
|
||||
create or replace table t1 (x int) with system versioning;
|
||||
create or replace table t2 (y int);
|
||||
insert into t1 values (1);
|
||||
insert into t2 values (1);
|
||||
set system_versioning_asof= '1970-01-01 00:00:00';
|
||||
delete t1, t2 from t1 join t2 where t1.x = t2.y;
|
||||
select * from t1 for system_time as of timestamp now(6);
|
||||
|
||||
insert into t1 values (1);
|
||||
insert into t2 values (1);
|
||||
update t1, t2 set x= 2, y= 2 where x = y;
|
||||
select * from t1 for system_time as of timestamp now(6);
|
||||
|
||||
replace t2 select x + 1 from t1;
|
||||
select * from t2;
|
||||
|
||||
insert t2 select x + 2 from t1;
|
||||
select * from t2;
|
||||
|
||||
drop tables t1, t2;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-16991 Rounding vs truncation for TIME, DATETIME, TIMESTAMP
|
||||
|
@ -113,3 +137,5 @@ SET sql_mode=TIME_ROUND_FRACTIONAL;
|
|||
SET @@global.system_versioning_asof= timestamp'2001-12-31 23:59:59.9999999';
|
||||
SELECT @@global.system_versioning_asof;
|
||||
SET @@global.system_versioning_asof= DEFAULT;
|
||||
|
||||
--echo # End of 10.4 tests
|
||||
|
|
|
@ -22,9 +22,9 @@ ELSE()
|
|||
SET(CMAKE_REQUIRED_LIBRARIES ${GSSAPI_LIBS})
|
||||
SET(CMAKE_REQUIRED_FLAGS "-Werror -Wall")
|
||||
INCLUDE(CheckCXXSymbolExists)
|
||||
CHECK_CXX_SYMBOL_EXISTS(krb5_free_unparsed_name "krb5.h" HAVE_KRB5_FREE_UNPARSED_NAME)
|
||||
IF(HAVE_KRB5_FREE_UNPARSED_NAME)
|
||||
ADD_DEFINITIONS(-DHAVE_KRB5_FREE_UNPARSED_NAME=1)
|
||||
CHECK_CXX_SYMBOL_EXISTS(krb5_xfree "krb5.h" HAVE_KRB5_XFREE)
|
||||
IF(HAVE_KRB5_XFREE)
|
||||
ADD_DEFINITIONS(-DHAVE_KRB5_XFREE=1)
|
||||
ENDIF()
|
||||
|
||||
ELSE()
|
||||
|
|
|
@ -30,7 +30,7 @@ static void log_error( OM_uint32 major, OM_uint32 minor, const char *msg)
|
|||
Generate default principal service name formatted as principal name "mariadb/server.fqdn@REALM"
|
||||
*/
|
||||
#include <krb5.h>
|
||||
#ifndef HAVE_KRB5_FREE_UNPARSED_NAME
|
||||
#ifdef HAVE_KRB5_XFREE
|
||||
#define krb5_free_unparsed_name(a,b) krb5_xfree(b)
|
||||
#endif
|
||||
static char* get_default_principal_name()
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# vim:sw=8:ai:ts=8
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
package Net::HandlerSocket::HSPool;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# vim:sw=2:ai
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# vim:sw=2:ai
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# vim:sw=2:ai
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# vim:sw=2:ai
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# vim:sw=2:ai
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# vim:sw=2:ai
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# vim:sw=2:ai
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
|
||||
# vim:sw=2:ai
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue