mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
Merge commit '10.3' into 10.4
This commit is contained in:
commit
b8c0e49670
61 changed files with 1158 additions and 222 deletions
|
|
@ -147,11 +147,10 @@ FUNCTION(DTRACE_INSTRUMENT target)
|
|||
# Note: DTrace probes in static libraries are unusable currently
|
||||
# (see explanation for DTRACE_INSTRUMENT_STATIC_LIBS below)
|
||||
# but maybe one day this will be fixed.
|
||||
GET_TARGET_PROPERTY(target_location ${target} LOCATION)
|
||||
ADD_CUSTOM_COMMAND(
|
||||
TARGET ${target} POST_BUILD
|
||||
COMMAND ${CMAKE_AR} r ${target_location} ${outfile}
|
||||
COMMAND ${CMAKE_RANLIB} ${target_location}
|
||||
COMMAND ${CMAKE_AR} r $<TARGET_FILE:${target}> ${outfile}
|
||||
COMMAND ${CMAKE_RANLIB} $<TARGET_FILE:${target}>
|
||||
)
|
||||
# Used in DTRACE_INSTRUMENT_WITH_STATIC_LIBS
|
||||
SET(TARGET_OBJECT_DIRECTORY_${target} ${objdir} CACHE INTERNAL "")
|
||||
|
|
|
|||
|
|
@ -261,93 +261,6 @@ GET_FILENAME_COMPONENT(BINARY_PARENTDIR ${CMAKE_BINARY_DIR} PATH)
|
|||
SET(DEBUGBUILDDIR "${BINARY_PARENTDIR}/debug" CACHE INTERNAL "Directory of debug build")
|
||||
|
||||
|
||||
FUNCTION(INSTALL_DEBUG_TARGET target)
|
||||
RETURN() # XXX unused?
|
||||
CMAKE_PARSE_ARGUMENTS(ARG
|
||||
""
|
||||
"DESTINATION;RENAME;PDB_DESTINATION;COMPONENT"
|
||||
""
|
||||
${ARGN}
|
||||
)
|
||||
GET_TARGET_PROPERTY(target_type ${target} TYPE)
|
||||
IF(ARG_RENAME)
|
||||
SET(RENAME_PARAM RENAME ${ARG_RENAME}${CMAKE_${target_type}_SUFFIX})
|
||||
ELSE()
|
||||
SET(RENAME_PARAM)
|
||||
ENDIF()
|
||||
IF(NOT ARG_DESTINATION)
|
||||
MESSAGE(FATAL_ERROR "Need DESTINATION parameter for INSTALL_DEBUG_TARGET")
|
||||
ENDIF()
|
||||
GET_TARGET_PROPERTY(target_location ${target} LOCATION)
|
||||
IF(CMAKE_GENERATOR MATCHES "Makefiles|Ninja")
|
||||
STRING(REPLACE "${CMAKE_BINARY_DIR}" "${DEBUGBUILDDIR}" debug_target_location "${target_location}")
|
||||
ELSE()
|
||||
STRING(REPLACE "${CMAKE_CFG_INTDIR}" "Debug" debug_target_location "${target_location}" )
|
||||
ENDIF()
|
||||
IF(NOT ARG_COMPONENT)
|
||||
SET(ARG_COMPONENT DebugBinaries)
|
||||
ENDIF()
|
||||
|
||||
# Define permissions
|
||||
# For executable files
|
||||
SET(PERMISSIONS_EXECUTABLE
|
||||
PERMISSIONS
|
||||
OWNER_READ OWNER_WRITE OWNER_EXECUTE
|
||||
GROUP_READ GROUP_EXECUTE
|
||||
WORLD_READ WORLD_EXECUTE)
|
||||
|
||||
# Permissions for shared library (honors CMAKE_INSTALL_NO_EXE which is
|
||||
# typically set on Debian)
|
||||
IF(CMAKE_INSTALL_SO_NO_EXE)
|
||||
SET(PERMISSIONS_SHARED_LIBRARY
|
||||
PERMISSIONS
|
||||
OWNER_READ OWNER_WRITE
|
||||
GROUP_READ
|
||||
WORLD_READ)
|
||||
ELSE()
|
||||
SET(PERMISSIONS_SHARED_LIBRARY ${PERMISSIONS_EXECUTABLE})
|
||||
ENDIF()
|
||||
|
||||
# Shared modules get the same permissions as shared libraries
|
||||
SET(PERMISSIONS_MODULE_LIBRARY ${PERMISSIONS_SHARED_LIBRARY})
|
||||
|
||||
# Define permissions for static library
|
||||
SET(PERMISSIONS_STATIC_LIBRARY
|
||||
PERMISSIONS
|
||||
OWNER_READ OWNER_WRITE
|
||||
GROUP_READ
|
||||
WORLD_READ)
|
||||
|
||||
INSTALL(FILES ${debug_target_location}
|
||||
DESTINATION ${ARG_DESTINATION}
|
||||
${RENAME_PARAM}
|
||||
${PERMISSIONS_${target_type}}
|
||||
CONFIGURATIONS Release RelWithDebInfo
|
||||
COMPONENT ${ARG_COMPONENT}
|
||||
OPTIONAL)
|
||||
|
||||
IF(MSVC)
|
||||
GET_FILENAME_COMPONENT(ext ${debug_target_location} EXT)
|
||||
STRING(REPLACE "${ext}" ".pdb" debug_pdb_target_location "${debug_target_location}" )
|
||||
IF (RENAME_PARAM)
|
||||
IF(NOT ARG_PDB_DESTINATION)
|
||||
STRING(REPLACE "${ext}" ".pdb" "${ARG_RENAME}" pdb_rename)
|
||||
SET(PDB_RENAME_PARAM RENAME "${pdb_rename}")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
IF(NOT ARG_PDB_DESTINATION)
|
||||
SET(ARG_PDB_DESTINATION "${ARG_DESTINATION}")
|
||||
ENDIF()
|
||||
INSTALL(FILES ${debug_pdb_target_location}
|
||||
DESTINATION ${ARG_PDB_DESTINATION}
|
||||
${PDB_RENAME_PARAM}
|
||||
CONFIGURATIONS Release RelWithDebInfo
|
||||
COMPONENT ${ARG_COMPONENT}
|
||||
OPTIONAL)
|
||||
ENDIF()
|
||||
ENDFUNCTION()
|
||||
|
||||
|
||||
FUNCTION(INSTALL_MYSQL_TEST from to)
|
||||
IF(INSTALL_MYSQLTESTDIR)
|
||||
INSTALL(
|
||||
|
|
|
|||
|
|
@ -123,6 +123,7 @@ SET(HAVE_PTHREAD_ATTR_GETSTACKSIZE CACHE INTERNAL "")
|
|||
SET(HAVE_PTHREAD_ATTR_SETSCOPE CACHE INTERNAL "")
|
||||
SET(HAVE_PTHREAD_ATTR_SETSTACKSIZE CACHE INTERNAL "")
|
||||
SET(HAVE_PTHREAD_CONDATTR_CREATE CACHE INTERNAL "")
|
||||
SET(HAVE_PTHREAD_GETAFFINITY_NP CACHE INTERNAL "")
|
||||
SET(HAVE_PTHREAD_INIT CACHE INTERNAL "")
|
||||
SET(HAVE_PTHREAD_KEY_DELETE CACHE INTERNAL "")
|
||||
SET(HAVE_PTHREAD_RWLOCK_RDLOCK CACHE INTERNAL "")
|
||||
|
|
|
|||
|
|
@ -249,7 +249,6 @@ MACRO(MYSQL_ADD_PLUGIN)
|
|||
SET(ARG_COMPONENT Server)
|
||||
ENDIF()
|
||||
MYSQL_INSTALL_TARGETS(${target} DESTINATION ${INSTALL_PLUGINDIR} COMPONENT ${ARG_COMPONENT})
|
||||
#INSTALL_DEBUG_TARGET(${target} DESTINATION ${INSTALL_PLUGINDIR}/debug COMPONENT ${ARG_COMPONENT})
|
||||
ENDIF()
|
||||
|
||||
GET_FILENAME_COMPONENT(subpath ${CMAKE_CURRENT_SOURCE_DIR} NAME)
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@ MACRO (MYSQL_CHECK_SSL)
|
|||
|
||||
SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||
SET(CMAKE_REQUIRED_LIBRARIES ${SSL_LIBRARIES})
|
||||
SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
|
||||
CHECK_SYMBOL_EXISTS(ERR_remove_thread_state "openssl/err.h"
|
||||
HAVE_ERR_remove_thread_state)
|
||||
CHECK_SYMBOL_EXISTS(EVP_aes_128_ctr "openssl/evp.h"
|
||||
|
|
|
|||
|
|
@ -192,6 +192,7 @@
|
|||
#cmakedefine HAVE_PTHREAD_ATTR_SETSCOPE 1
|
||||
#cmakedefine HAVE_PTHREAD_ATTR_SETSTACKSIZE 1
|
||||
#cmakedefine HAVE_PTHREAD_CONDATTR_CREATE 1
|
||||
#cmakedefine HAVE_PTHREAD_GETAFFINITY_NP 1
|
||||
#cmakedefine HAVE_PTHREAD_KEY_DELETE 1
|
||||
#cmakedefine HAVE_PTHREAD_KILL 1
|
||||
#cmakedefine HAVE_PTHREAD_RWLOCK_RDLOCK 1
|
||||
|
|
|
|||
|
|
@ -379,6 +379,7 @@ CHECK_FUNCTION_EXISTS (pthread_attr_setscope HAVE_PTHREAD_ATTR_SETSCOPE)
|
|||
CHECK_FUNCTION_EXISTS (pthread_attr_getguardsize HAVE_PTHREAD_ATTR_GETGUARDSIZE)
|
||||
CHECK_FUNCTION_EXISTS (pthread_attr_setstacksize HAVE_PTHREAD_ATTR_SETSTACKSIZE)
|
||||
CHECK_FUNCTION_EXISTS (pthread_condattr_create HAVE_PTHREAD_CONDATTR_CREATE)
|
||||
CHECK_FUNCTION_EXISTS (pthread_getaffinity_np HAVE_PTHREAD_GETAFFINITY_NP)
|
||||
CHECK_FUNCTION_EXISTS (pthread_key_delete HAVE_PTHREAD_KEY_DELETE)
|
||||
CHECK_FUNCTION_EXISTS (pthread_rwlock_rdlock HAVE_PTHREAD_RWLOCK_RDLOCK)
|
||||
CHECK_FUNCTION_EXISTS (pthread_sigmask HAVE_PTHREAD_SIGMASK)
|
||||
|
|
|
|||
1
debian/autobake-deb.sh
vendored
1
debian/autobake-deb.sh
vendored
|
|
@ -77,7 +77,6 @@ fi
|
|||
if ! apt-cache madison libzstd-dev | grep 'libzstd-dev' >/dev/null 2>&1
|
||||
then
|
||||
sed '/libzstd-dev/d' -i debian/control
|
||||
sed '/libzstd1/d' -i debian/control
|
||||
fi
|
||||
|
||||
# The binaries should be fully hardened by default. However TokuDB compilation seems to fail on
|
||||
|
|
|
|||
2
debian/libmariadb-dev.install
vendored
2
debian/libmariadb-dev.install
vendored
|
|
@ -4,6 +4,6 @@ usr/lib/*/libmariadb.so
|
|||
usr/lib/*/libmariadbclient.a
|
||||
usr/lib/*/libmariadbclient.so
|
||||
usr/lib/*/libmysqlservices.a
|
||||
usr/lib/*/pkgconfig/mariadb.pc
|
||||
usr/share/aclocal/mysql.m4
|
||||
usr/share/man/man1/mysql_config.1
|
||||
usr/share/pkgconfig/mariadb.pc
|
||||
|
|
|
|||
1
debian/libmariadb3.install
vendored
1
debian/libmariadb3.install
vendored
|
|
@ -3,4 +3,3 @@ usr/lib/mysql/plugin/client_ed25519.so
|
|||
usr/lib/mysql/plugin/dialog.so
|
||||
usr/lib/mysql/plugin/mysql_clear_password.so
|
||||
usr/lib/mysql/plugin/sha256_password.so
|
||||
usr/lib/mysql/plugin/client_ed25519.so
|
||||
|
|
|
|||
2
debian/mariadb-server-10.4.install
vendored
2
debian/mariadb-server-10.4.install
vendored
|
|
@ -5,8 +5,8 @@ debian/additions/mysql.init usr/share/mysql
|
|||
debian/additions/mysqld_safe_syslog.cnf etc/mysql/conf.d
|
||||
etc/apparmor.d/usr.sbin.mysqld
|
||||
etc/security/user_map.conf
|
||||
lib/systemd/system/mariadb@bootstrap.service.d/use_galera_new_cluster.conf
|
||||
lib/*/security/pam_user_map.so
|
||||
lib/systemd/system/mariadb@bootstrap.service.d/use_galera_new_cluster.conf
|
||||
usr/bin/aria_chk
|
||||
usr/bin/aria_dump_log
|
||||
usr/bin/aria_ftdump
|
||||
|
|
|
|||
|
|
@ -36,11 +36,103 @@ insert into t3 select
|
|||
123456
|
||||
from t1 A, t1 B;
|
||||
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
|
||||
set optimizer_switch='mrr=on';
|
||||
--replace_column 9 #
|
||||
explain
|
||||
select * from t3 force index (key_col) where key_col < 3;
|
||||
select * from t3 force index (key_col) where key_col < 3;
|
||||
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
|
||||
drop table t1,t3;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-21544: partitioned table is joined with BKA+MRR
|
||||
--echo #
|
||||
|
||||
set @save_join_cache_level=@@join_cache_level;
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
|
||||
create table t0 (
|
||||
tp int, a int, b int not null, c varchar(12), index idx (a,b)
|
||||
);
|
||||
insert into t0 values
|
||||
(1,3,30,'yyzy'), (1,3,30,'yxxyy'), (1,3,30,'yyxy'), (1,3,30,'xxyy'),
|
||||
(1,3,30,'yyxz'), (1,3,30,'yyzz'), (1,3,30,'xxyzy'), (1,3,30,'yyyy'),
|
||||
(1,3,30,'yzzy'), (1,93,30,'zzzy'),
|
||||
(2,3,40,'yxx'), (2,4,40,'xx'), (2,3,10,'zxz'),
|
||||
(2,3,40,'yyx'), (2,4,40,'xxx'), (2,3,10,'zyyz'),
|
||||
(2,3,40,'xzzzz'), (2,4,40,'yyyxx'), (2,3,10,'zyz'),
|
||||
(2,3,40,'xxx'), (2,4,40,'xx'), (2,3,10,'zzz'),
|
||||
(2,3,40,'yyxzx'), (2,4,40,'xyx'), (2,3,10,'xzz'),
|
||||
(2,3,40,'xxxzz'), (2,4,40,'xxz'), (2,3,10,'zzzy'),
|
||||
(2,3,40,'zzxxx'), (2,4,40,'zxx'), (2,3,10,'yzzz'),
|
||||
(2,3,40,'xyyxx'), (2,4,40,'xzzzx'), (2,3,10,'zzxxz'),
|
||||
(2,3,40,'yzxxx'), (2,4,40,'xxzy'), (2,3,10,'zzzyx'),
|
||||
(2,93,40,'xzx'), (2,94,40,'xz'), (2,93,10,'zyyyz'),
|
||||
(3,4,30,'yx'), (3,4,30,'yyxxx'), (3,4,30,'zzyy'), (3,4,30,'zxyy'),
|
||||
(3,4,30,'xxyy'), (3,4,30,'yyzx'), (3,4,30,'zyyy'), (3,4,30,'yzy'),
|
||||
(3,4,30,'zzzyy'), (3,94,30,'yyz');
|
||||
|
||||
create table t1 (
|
||||
tp int, a int, b int not null, c varchar(12), index idx (a,b)
|
||||
)
|
||||
partition by list (tp)
|
||||
( partition p1 values in (1),
|
||||
partition p2 values in (2),
|
||||
partition p3 values in (3));
|
||||
insert into t1 select * from t0;
|
||||
|
||||
# tables t0 and t1 contain the same set of records.
|
||||
|
||||
create table t2 (a int, index idx(a));
|
||||
insert into t2 values
|
||||
(1), (2), (3), (4), (5);
|
||||
insert into t2 select a+10 from t2;
|
||||
insert into t2 select a+20 from t2;
|
||||
|
||||
analyze table t0,t1,t2;
|
||||
|
||||
set join_cache_level=6;
|
||||
set optimizer_switch='mrr=on';
|
||||
|
||||
let $q1=
|
||||
select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = t2.a-1;
|
||||
eval explain extended $q1;
|
||||
eval $q1;
|
||||
|
||||
let $q2=
|
||||
select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = t2.a-1;
|
||||
eval explain extended $q2;
|
||||
eval $q2;
|
||||
|
||||
let $q1=
|
||||
select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = 4;
|
||||
eval explain extended $q1;
|
||||
eval $q1;
|
||||
|
||||
let $q2=
|
||||
select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = 4;
|
||||
eval explain extended $q2;
|
||||
eval $q2;
|
||||
|
||||
insert into t2 values
|
||||
(3), (4), (5);
|
||||
analyze table t2;
|
||||
|
||||
let $q1=
|
||||
select * from t2 left join t0 on t2.a=t0.a where t2.a in (3,4) and t0.b is null;
|
||||
eval explain extended $q1;
|
||||
eval $q1;
|
||||
|
||||
let $q2=
|
||||
select * from t2 left join t1 on t2.a=t1.a where t2.a in (3,4) and t1.b is null;
|
||||
eval explain extended $q2;
|
||||
eval $q2;
|
||||
|
||||
set join_cache_level=@save_join_cache_level;
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
|
||||
drop table t0,t1,t2;
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ SET GLOBAL read_only = @start_read_only;
|
|||
alter user boo;
|
||||
ERROR HY000: Operation ALTER USER failed for 'boo'
|
||||
#--warning ER_CANNOT_USER
|
||||
alter if exists user boo;
|
||||
alter user if exists boo;
|
||||
Warnings:
|
||||
Error 1133 Can't find any matching row in the user table
|
||||
Note 1396 Operation ALTER USER failed for 'boo'
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ SET GLOBAL read_only = @start_read_only;
|
|||
--error ER_CANNOT_USER
|
||||
alter user boo;
|
||||
--echo #--warning ER_CANNOT_USER
|
||||
alter if exists user boo;
|
||||
alter user if exists boo;
|
||||
|
||||
--echo # Test password related altering.
|
||||
alter user foo identified by 'something';
|
||||
|
|
|
|||
|
|
@ -608,7 +608,7 @@ Create temporary tables Databases To use CREATE TEMPORARY TABLE
|
|||
Create view Tables To create new views
|
||||
Create user Server Admin To create new users
|
||||
Delete Tables To delete existing rows
|
||||
Delete versioning rows Tables To delete versioning table historical rows
|
||||
Delete history Tables To delete versioning table historical rows
|
||||
Drop Databases,Tables To drop databases, tables, and views
|
||||
Event Server Admin To create, alter, drop and execute events
|
||||
Execute Functions,Procedures To execute stored routines
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ alter user user1@localhost account unlock;
|
|||
#
|
||||
alter user inexistentUser@localhost account lock;
|
||||
ERROR HY000: Operation ALTER USER failed for 'inexistentUser'@'localhost'
|
||||
alter if exists user inexistentUser@localhost account lock;
|
||||
alter user if exists inexistentUser@localhost account lock;
|
||||
Warnings:
|
||||
Error 1133 Can't find any matching row in the user table
|
||||
Note 1396 Operation ALTER USER failed for 'inexistentUser'@'localhost'
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ alter user user1@localhost account unlock;
|
|||
--error ER_CANNOT_USER
|
||||
alter user inexistentUser@localhost account lock;
|
||||
|
||||
alter if exists user inexistentUser@localhost account lock;
|
||||
alter user if exists inexistentUser@localhost account lock;
|
||||
|
||||
--echo #
|
||||
--echo # Passing an existing user to CREATE should not be allowed
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@ SELECT 2;
|
|||
|
||||
--connection default
|
||||
SELECT 0;
|
||||
let $count_sessions=11;
|
||||
--source include/wait_until_count_sessions.inc
|
||||
show status like "Threads_connected";
|
||||
|
||||
SET GLOBAL log_warnings=@save_log_warnings;
|
||||
|
|
|
|||
|
|
@ -10,3 +10,13 @@ Could not open required defaults file: MYSQL_TEST_DIR/with.ext
|
|||
Fatal error in defaults handling. Program aborted
|
||||
Could not open required defaults file: MYSQL_TEST_DIR/no_extension
|
||||
Fatal error in defaults handling. Program aborted
|
||||
#
|
||||
# MDEV-21374: When "--help --verbose" prints out configuration file paths,
|
||||
# the --defaults-file option is not considered
|
||||
#
|
||||
# Test on `defaults-file`
|
||||
Default options are read from the following files in the given order:
|
||||
MYSQLTEST_VARDIR/my.cnf
|
||||
# Test on `defaults-extra-file`
|
||||
Default options are read from the following files in the given order:
|
||||
<first-defaults> MYSQLTEST_VARDIR/my_test.cnf ~/.my.cnf
|
||||
|
|
|
|||
|
|
@ -29,3 +29,19 @@ exec $MYSQLD --defaults-file=with.ext --print-defaults 2>&1;
|
|||
--error 1
|
||||
exec $MYSQLD --defaults-file=no_extension --print-defaults 2>&1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-21374: When "--help --verbose" prints out configuration file paths,
|
||||
--echo # the --defaults-file option is not considered
|
||||
--echo #
|
||||
|
||||
--echo # Test on `defaults-file`
|
||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
exec $MYSQLD --defaults-file=$MYSQLTEST_VARDIR/my.cnf --help --verbose | grep -A 1 'Default options are read';
|
||||
|
||||
--echo # Test on `defaults-extra-file`
|
||||
# <first-defaults> = `/etc/my.cnf /etc/mysql/my.cnf`
|
||||
# Using sysconfdir configuration, we don't always have `/etc/mysql/my.cnf`, so replace them with a regex as well.
|
||||
copy_file $MYSQLTEST_VARDIR/my.cnf $MYSQLTEST_VARDIR/my_test.cnf;
|
||||
--replace_regex /.*my_test.cnf/<first-defaults> MYSQLTEST_VARDIR\/my_test.cnf/
|
||||
exec $MYSQLD --defaults-extra-file=$MYSQLTEST_VARDIR/my_test.cnf --help --verbose | grep -A 1 'Default options are read';
|
||||
remove_file $MYSQLTEST_VARDIR/my_test.cnf;
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ A.a,
|
|||
B.a,
|
||||
123456
|
||||
from t1 A, t1 B;
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
set optimizer_switch='mrr=on';
|
||||
explain
|
||||
select * from t3 force index (key_col) where key_col < 3;
|
||||
|
|
@ -76,4 +77,164 @@ ID part_id key_col col2
|
|||
27 7 2 123456
|
||||
28 8 2 123456
|
||||
29 9 2 123456
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
drop table t1,t3;
|
||||
#
|
||||
# MDEV-21544: partitioned table is joined with BKA+MRR
|
||||
#
|
||||
set @save_join_cache_level=@@join_cache_level;
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
create table t0 (
|
||||
tp int, a int, b int not null, c varchar(12), index idx (a,b)
|
||||
);
|
||||
insert into t0 values
|
||||
(1,3,30,'yyzy'), (1,3,30,'yxxyy'), (1,3,30,'yyxy'), (1,3,30,'xxyy'),
|
||||
(1,3,30,'yyxz'), (1,3,30,'yyzz'), (1,3,30,'xxyzy'), (1,3,30,'yyyy'),
|
||||
(1,3,30,'yzzy'), (1,93,30,'zzzy'),
|
||||
(2,3,40,'yxx'), (2,4,40,'xx'), (2,3,10,'zxz'),
|
||||
(2,3,40,'yyx'), (2,4,40,'xxx'), (2,3,10,'zyyz'),
|
||||
(2,3,40,'xzzzz'), (2,4,40,'yyyxx'), (2,3,10,'zyz'),
|
||||
(2,3,40,'xxx'), (2,4,40,'xx'), (2,3,10,'zzz'),
|
||||
(2,3,40,'yyxzx'), (2,4,40,'xyx'), (2,3,10,'xzz'),
|
||||
(2,3,40,'xxxzz'), (2,4,40,'xxz'), (2,3,10,'zzzy'),
|
||||
(2,3,40,'zzxxx'), (2,4,40,'zxx'), (2,3,10,'yzzz'),
|
||||
(2,3,40,'xyyxx'), (2,4,40,'xzzzx'), (2,3,10,'zzxxz'),
|
||||
(2,3,40,'yzxxx'), (2,4,40,'xxzy'), (2,3,10,'zzzyx'),
|
||||
(2,93,40,'xzx'), (2,94,40,'xz'), (2,93,10,'zyyyz'),
|
||||
(3,4,30,'yx'), (3,4,30,'yyxxx'), (3,4,30,'zzyy'), (3,4,30,'zxyy'),
|
||||
(3,4,30,'xxyy'), (3,4,30,'yyzx'), (3,4,30,'zyyy'), (3,4,30,'yzy'),
|
||||
(3,4,30,'zzzyy'), (3,94,30,'yyz');
|
||||
create table t1 (
|
||||
tp int, a int, b int not null, c varchar(12), index idx (a,b)
|
||||
)
|
||||
partition by list (tp)
|
||||
( partition p1 values in (1),
|
||||
partition p2 values in (2),
|
||||
partition p3 values in (3));
|
||||
insert into t1 select * from t0;
|
||||
create table t2 (a int, index idx(a));
|
||||
insert into t2 values
|
||||
(1), (2), (3), (4), (5);
|
||||
insert into t2 select a+10 from t2;
|
||||
insert into t2 select a+20 from t2;
|
||||
analyze table t0,t1,t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t0 analyze status Engine-independent statistics collected
|
||||
test.t0 analyze status OK
|
||||
test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze status OK
|
||||
test.t2 analyze status Engine-independent statistics collected
|
||||
test.t2 analyze status OK
|
||||
set join_cache_level=6;
|
||||
set optimizer_switch='mrr=on';
|
||||
explain extended select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = t2.a-1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t0 ref idx idx 5 test.t2.a 12 100.00 Using index condition(BKA); Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t0`.`tp` AS `tp`,`test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t0`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t0` join `test`.`t2` where `test`.`t0`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t0`.`b` / 10 = `test`.`t2`.`a` - 1
|
||||
select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = t2.a-1;
|
||||
tp a b c a
|
||||
3 4 30 yx 4
|
||||
3 4 30 yyxxx 4
|
||||
3 4 30 zzyy 4
|
||||
3 4 30 zxyy 4
|
||||
3 4 30 xxyy 4
|
||||
3 4 30 yyzx 4
|
||||
3 4 30 zyyy 4
|
||||
3 4 30 yzy 4
|
||||
3 4 30 zzzyy 4
|
||||
explain extended select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = t2.a-1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t1 ref idx idx 5 test.t2.a 12 100.00 Using index condition(BKA); Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`tp` AS `tp`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t1`.`b` / 10 = `test`.`t2`.`a` - 1
|
||||
select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = t2.a-1;
|
||||
tp a b c a
|
||||
3 4 30 yx 4
|
||||
3 4 30 yyxxx 4
|
||||
3 4 30 zzyy 4
|
||||
3 4 30 zxyy 4
|
||||
3 4 30 xxyy 4
|
||||
3 4 30 yyzx 4
|
||||
3 4 30 zyyy 4
|
||||
3 4 30 yzy 4
|
||||
3 4 30 zzzyy 4
|
||||
explain extended select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = 4;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t0 ref idx idx 5 test.t2.a 12 100.00 Using index condition; Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t0`.`tp` AS `tp`,`test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t0`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t0` join `test`.`t2` where `test`.`t0`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t0`.`b` / 10 = 4
|
||||
select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = 4;
|
||||
tp a b c a
|
||||
2 3 40 yxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyx 3
|
||||
2 4 40 xxx 4
|
||||
2 3 40 xzzzz 3
|
||||
2 4 40 yyyxx 4
|
||||
2 3 40 xxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyxzx 3
|
||||
2 4 40 xyx 4
|
||||
2 3 40 xxxzz 3
|
||||
2 4 40 xxz 4
|
||||
2 3 40 zzxxx 3
|
||||
2 4 40 zxx 4
|
||||
2 3 40 xyyxx 3
|
||||
2 4 40 xzzzx 4
|
||||
2 3 40 yzxxx 3
|
||||
2 4 40 xxzy 4
|
||||
explain extended select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = 4;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t1 ref idx idx 5 test.t2.a 12 100.00 Using index condition(BKA); Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`tp` AS `tp`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t1`.`b` / 10 = 4
|
||||
select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = 4;
|
||||
tp a b c a
|
||||
2 3 40 yxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyx 3
|
||||
2 4 40 xxx 4
|
||||
2 3 40 xzzzz 3
|
||||
2 4 40 yyyxx 4
|
||||
2 3 40 xxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyxzx 3
|
||||
2 4 40 xyx 4
|
||||
2 3 40 xxxzz 3
|
||||
2 4 40 xxz 4
|
||||
2 3 40 zzxxx 3
|
||||
2 4 40 zxx 4
|
||||
2 3 40 xyyxx 3
|
||||
2 4 40 xzzzx 4
|
||||
2 3 40 yzxxx 3
|
||||
2 4 40 xxzy 4
|
||||
insert into t2 values
|
||||
(3), (4), (5);
|
||||
analyze table t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t2 analyze status Engine-independent statistics collected
|
||||
test.t2 analyze status OK
|
||||
explain extended select * from t2 left join t0 on t2.a=t0.a where t2.a in (3,4) and t0.b is null;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 4 100.00 Using where; Using index
|
||||
1 SIMPLE t0 ref idx idx 5 test.t2.a 12 100.00 Using where; Not exists; Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`a` AS `a`,`test`.`t0`.`tp` AS `tp`,`test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t0`.`c` AS `c` from `test`.`t2` left join `test`.`t0` on(`test`.`t0`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` is not null) where `test`.`t2`.`a` in (3,4) and `test`.`t0`.`b` is null
|
||||
select * from t2 left join t0 on t2.a=t0.a where t2.a in (3,4) and t0.b is null;
|
||||
a tp a b c
|
||||
explain extended select * from t2 left join t1 on t2.a=t1.a where t2.a in (3,4) and t1.b is null;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 4 100.00 Using where; Using index
|
||||
1 SIMPLE t1 ref idx idx 5 test.t2.a 12 100.00 Using where; Not exists; Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`a` AS `a`,`test`.`t1`.`tp` AS `tp`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c` from `test`.`t2` left join `test`.`t1` on(`test`.`t1`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` is not null) where `test`.`t2`.`a` in (3,4) and `test`.`t1`.`b` is null
|
||||
select * from t2 left join t1 on t2.a=t1.a where t2.a in (3,4) and t1.b is null;
|
||||
a tp a b c
|
||||
set join_cache_level=@save_join_cache_level;
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
drop table t0,t1,t2;
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ A.a,
|
|||
B.a,
|
||||
123456
|
||||
from t1 A, t1 B;
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
set optimizer_switch='mrr=on';
|
||||
explain
|
||||
select * from t3 force index (key_col) where key_col < 3;
|
||||
|
|
@ -76,4 +77,164 @@ ID part_id key_col col2
|
|||
27 7 2 123456
|
||||
28 8 2 123456
|
||||
29 9 2 123456
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
drop table t1,t3;
|
||||
#
|
||||
# MDEV-21544: partitioned table is joined with BKA+MRR
|
||||
#
|
||||
set @save_join_cache_level=@@join_cache_level;
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
create table t0 (
|
||||
tp int, a int, b int not null, c varchar(12), index idx (a,b)
|
||||
);
|
||||
insert into t0 values
|
||||
(1,3,30,'yyzy'), (1,3,30,'yxxyy'), (1,3,30,'yyxy'), (1,3,30,'xxyy'),
|
||||
(1,3,30,'yyxz'), (1,3,30,'yyzz'), (1,3,30,'xxyzy'), (1,3,30,'yyyy'),
|
||||
(1,3,30,'yzzy'), (1,93,30,'zzzy'),
|
||||
(2,3,40,'yxx'), (2,4,40,'xx'), (2,3,10,'zxz'),
|
||||
(2,3,40,'yyx'), (2,4,40,'xxx'), (2,3,10,'zyyz'),
|
||||
(2,3,40,'xzzzz'), (2,4,40,'yyyxx'), (2,3,10,'zyz'),
|
||||
(2,3,40,'xxx'), (2,4,40,'xx'), (2,3,10,'zzz'),
|
||||
(2,3,40,'yyxzx'), (2,4,40,'xyx'), (2,3,10,'xzz'),
|
||||
(2,3,40,'xxxzz'), (2,4,40,'xxz'), (2,3,10,'zzzy'),
|
||||
(2,3,40,'zzxxx'), (2,4,40,'zxx'), (2,3,10,'yzzz'),
|
||||
(2,3,40,'xyyxx'), (2,4,40,'xzzzx'), (2,3,10,'zzxxz'),
|
||||
(2,3,40,'yzxxx'), (2,4,40,'xxzy'), (2,3,10,'zzzyx'),
|
||||
(2,93,40,'xzx'), (2,94,40,'xz'), (2,93,10,'zyyyz'),
|
||||
(3,4,30,'yx'), (3,4,30,'yyxxx'), (3,4,30,'zzyy'), (3,4,30,'zxyy'),
|
||||
(3,4,30,'xxyy'), (3,4,30,'yyzx'), (3,4,30,'zyyy'), (3,4,30,'yzy'),
|
||||
(3,4,30,'zzzyy'), (3,94,30,'yyz');
|
||||
create table t1 (
|
||||
tp int, a int, b int not null, c varchar(12), index idx (a,b)
|
||||
)
|
||||
partition by list (tp)
|
||||
( partition p1 values in (1),
|
||||
partition p2 values in (2),
|
||||
partition p3 values in (3));
|
||||
insert into t1 select * from t0;
|
||||
create table t2 (a int, index idx(a));
|
||||
insert into t2 values
|
||||
(1), (2), (3), (4), (5);
|
||||
insert into t2 select a+10 from t2;
|
||||
insert into t2 select a+20 from t2;
|
||||
analyze table t0,t1,t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t0 analyze status Engine-independent statistics collected
|
||||
test.t0 analyze status OK
|
||||
test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze status OK
|
||||
test.t2 analyze status Engine-independent statistics collected
|
||||
test.t2 analyze status OK
|
||||
set join_cache_level=6;
|
||||
set optimizer_switch='mrr=on';
|
||||
explain extended select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = t2.a-1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t0 ref idx idx 5 test.t2.a 12 100.00 Using index condition(BKA); Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t0`.`tp` AS `tp`,`test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t0`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t0` join `test`.`t2` where `test`.`t0`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t0`.`b` / 10 = `test`.`t2`.`a` - 1
|
||||
select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = t2.a-1;
|
||||
tp a b c a
|
||||
3 4 30 yx 4
|
||||
3 4 30 yyxxx 4
|
||||
3 4 30 zzyy 4
|
||||
3 4 30 zxyy 4
|
||||
3 4 30 xxyy 4
|
||||
3 4 30 yyzx 4
|
||||
3 4 30 zyyy 4
|
||||
3 4 30 yzy 4
|
||||
3 4 30 zzzyy 4
|
||||
explain extended select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = t2.a-1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t1 ref idx idx 5 test.t2.a 12 100.00 Using index condition(BKA); Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`tp` AS `tp`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t1`.`b` / 10 = `test`.`t2`.`a` - 1
|
||||
select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = t2.a-1;
|
||||
tp a b c a
|
||||
3 4 30 yx 4
|
||||
3 4 30 yyxxx 4
|
||||
3 4 30 zzyy 4
|
||||
3 4 30 zxyy 4
|
||||
3 4 30 xxyy 4
|
||||
3 4 30 yyzx 4
|
||||
3 4 30 zyyy 4
|
||||
3 4 30 yzy 4
|
||||
3 4 30 zzzyy 4
|
||||
explain extended select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = 4;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t0 ref idx idx 5 test.t2.a 12 100.00 Using index condition; Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t0`.`tp` AS `tp`,`test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t0`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t0` join `test`.`t2` where `test`.`t0`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t0`.`b` / 10 = 4
|
||||
select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = 4;
|
||||
tp a b c a
|
||||
2 3 40 yxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyx 3
|
||||
2 4 40 xxx 4
|
||||
2 3 40 xzzzz 3
|
||||
2 4 40 yyyxx 4
|
||||
2 3 40 xxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyxzx 3
|
||||
2 4 40 xyx 4
|
||||
2 3 40 xxxzz 3
|
||||
2 4 40 xxz 4
|
||||
2 3 40 zzxxx 3
|
||||
2 4 40 zxx 4
|
||||
2 3 40 xyyxx 3
|
||||
2 4 40 xzzzx 4
|
||||
2 3 40 yzxxx 3
|
||||
2 4 40 xxzy 4
|
||||
explain extended select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = 4;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t1 ref idx idx 5 test.t2.a 12 100.00 Using index condition(BKA); Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`tp` AS `tp`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t1`.`b` / 10 = 4
|
||||
select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = 4;
|
||||
tp a b c a
|
||||
2 3 40 yxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyx 3
|
||||
2 4 40 xxx 4
|
||||
2 3 40 xzzzz 3
|
||||
2 4 40 yyyxx 4
|
||||
2 3 40 xxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyxzx 3
|
||||
2 4 40 xyx 4
|
||||
2 3 40 xxxzz 3
|
||||
2 4 40 xxz 4
|
||||
2 3 40 zzxxx 3
|
||||
2 4 40 zxx 4
|
||||
2 3 40 xyyxx 3
|
||||
2 4 40 xzzzx 4
|
||||
2 3 40 yzxxx 3
|
||||
2 4 40 xxzy 4
|
||||
insert into t2 values
|
||||
(3), (4), (5);
|
||||
analyze table t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t2 analyze status Engine-independent statistics collected
|
||||
test.t2 analyze status OK
|
||||
explain extended select * from t2 left join t0 on t2.a=t0.a where t2.a in (3,4) and t0.b is null;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 4 100.00 Using where; Using index
|
||||
1 SIMPLE t0 ref idx idx 5 test.t2.a 12 100.00 Using where; Not exists; Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`a` AS `a`,`test`.`t0`.`tp` AS `tp`,`test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t0`.`c` AS `c` from `test`.`t2` left join `test`.`t0` on(`test`.`t0`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` is not null) where `test`.`t2`.`a` in (3,4) and `test`.`t0`.`b` is null
|
||||
select * from t2 left join t0 on t2.a=t0.a where t2.a in (3,4) and t0.b is null;
|
||||
a tp a b c
|
||||
explain extended select * from t2 left join t1 on t2.a=t1.a where t2.a in (3,4) and t1.b is null;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 4 100.00 Using where; Using index
|
||||
1 SIMPLE t1 ref idx idx 5 test.t2.a 12 100.00 Using where; Not exists; Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`a` AS `a`,`test`.`t1`.`tp` AS `tp`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c` from `test`.`t2` left join `test`.`t1` on(`test`.`t1`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` is not null) where `test`.`t2`.`a` in (3,4) and `test`.`t1`.`b` is null
|
||||
select * from t2 left join t1 on t2.a=t1.a where t2.a in (3,4) and t1.b is null;
|
||||
a tp a b c
|
||||
set join_cache_level=@save_join_cache_level;
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
drop table t0,t1,t2;
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ A.a,
|
|||
B.a,
|
||||
123456
|
||||
from t1 A, t1 B;
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
set optimizer_switch='mrr=on';
|
||||
explain
|
||||
select * from t3 force index (key_col) where key_col < 3;
|
||||
|
|
@ -76,8 +77,168 @@ ID part_id key_col col2
|
|||
27 7 2 123456
|
||||
28 8 2 123456
|
||||
29 9 2 123456
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
drop table t1,t3;
|
||||
#
|
||||
# MDEV-21544: partitioned table is joined with BKA+MRR
|
||||
#
|
||||
set @save_join_cache_level=@@join_cache_level;
|
||||
set @save_optimizer_switch=@@optimizer_switch;
|
||||
create table t0 (
|
||||
tp int, a int, b int not null, c varchar(12), index idx (a,b)
|
||||
);
|
||||
insert into t0 values
|
||||
(1,3,30,'yyzy'), (1,3,30,'yxxyy'), (1,3,30,'yyxy'), (1,3,30,'xxyy'),
|
||||
(1,3,30,'yyxz'), (1,3,30,'yyzz'), (1,3,30,'xxyzy'), (1,3,30,'yyyy'),
|
||||
(1,3,30,'yzzy'), (1,93,30,'zzzy'),
|
||||
(2,3,40,'yxx'), (2,4,40,'xx'), (2,3,10,'zxz'),
|
||||
(2,3,40,'yyx'), (2,4,40,'xxx'), (2,3,10,'zyyz'),
|
||||
(2,3,40,'xzzzz'), (2,4,40,'yyyxx'), (2,3,10,'zyz'),
|
||||
(2,3,40,'xxx'), (2,4,40,'xx'), (2,3,10,'zzz'),
|
||||
(2,3,40,'yyxzx'), (2,4,40,'xyx'), (2,3,10,'xzz'),
|
||||
(2,3,40,'xxxzz'), (2,4,40,'xxz'), (2,3,10,'zzzy'),
|
||||
(2,3,40,'zzxxx'), (2,4,40,'zxx'), (2,3,10,'yzzz'),
|
||||
(2,3,40,'xyyxx'), (2,4,40,'xzzzx'), (2,3,10,'zzxxz'),
|
||||
(2,3,40,'yzxxx'), (2,4,40,'xxzy'), (2,3,10,'zzzyx'),
|
||||
(2,93,40,'xzx'), (2,94,40,'xz'), (2,93,10,'zyyyz'),
|
||||
(3,4,30,'yx'), (3,4,30,'yyxxx'), (3,4,30,'zzyy'), (3,4,30,'zxyy'),
|
||||
(3,4,30,'xxyy'), (3,4,30,'yyzx'), (3,4,30,'zyyy'), (3,4,30,'yzy'),
|
||||
(3,4,30,'zzzyy'), (3,94,30,'yyz');
|
||||
create table t1 (
|
||||
tp int, a int, b int not null, c varchar(12), index idx (a,b)
|
||||
)
|
||||
partition by list (tp)
|
||||
( partition p1 values in (1),
|
||||
partition p2 values in (2),
|
||||
partition p3 values in (3));
|
||||
insert into t1 select * from t0;
|
||||
create table t2 (a int, index idx(a));
|
||||
insert into t2 values
|
||||
(1), (2), (3), (4), (5);
|
||||
insert into t2 select a+10 from t2;
|
||||
insert into t2 select a+20 from t2;
|
||||
analyze table t0,t1,t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t0 analyze status Engine-independent statistics collected
|
||||
test.t0 analyze status OK
|
||||
test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze status OK
|
||||
test.t2 analyze status Engine-independent statistics collected
|
||||
test.t2 analyze status OK
|
||||
set join_cache_level=6;
|
||||
set optimizer_switch='mrr=on';
|
||||
explain extended select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = t2.a-1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t0 ref idx idx 5 test.t2.a 12 100.00 Using index condition(BKA); Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t0`.`tp` AS `tp`,`test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t0`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t0` join `test`.`t2` where `test`.`t0`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t0`.`b` / 10 = `test`.`t2`.`a` - 1
|
||||
select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = t2.a-1;
|
||||
tp a b c a
|
||||
3 4 30 yx 4
|
||||
3 4 30 yyxxx 4
|
||||
3 4 30 zzyy 4
|
||||
3 4 30 zxyy 4
|
||||
3 4 30 xxyy 4
|
||||
3 4 30 yyzx 4
|
||||
3 4 30 zyyy 4
|
||||
3 4 30 yzy 4
|
||||
3 4 30 zzzyy 4
|
||||
explain extended select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = t2.a-1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t1 ref idx idx 5 test.t2.a 12 100.00 Using index condition(BKA); Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`tp` AS `tp`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t1`.`b` / 10 = `test`.`t2`.`a` - 1
|
||||
select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = t2.a-1;
|
||||
tp a b c a
|
||||
3 4 30 yx 4
|
||||
3 4 30 yyxxx 4
|
||||
3 4 30 zzyy 4
|
||||
3 4 30 zxyy 4
|
||||
3 4 30 xxyy 4
|
||||
3 4 30 yyzx 4
|
||||
3 4 30 zyyy 4
|
||||
3 4 30 yzy 4
|
||||
3 4 30 zzzyy 4
|
||||
explain extended select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = 4;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t0 ref idx idx 5 test.t2.a 12 100.00 Using index condition; Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t0`.`tp` AS `tp`,`test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t0`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t0` join `test`.`t2` where `test`.`t0`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t0`.`b` / 10 = 4
|
||||
select * from t0,t2 where t2.a in (3,4) and t0.a=t2.a and (t0.b / 10) = 4;
|
||||
tp a b c a
|
||||
2 3 40 yxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyx 3
|
||||
2 4 40 xxx 4
|
||||
2 3 40 xzzzz 3
|
||||
2 4 40 yyyxx 4
|
||||
2 3 40 xxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyxzx 3
|
||||
2 4 40 xyx 4
|
||||
2 3 40 xxxzz 3
|
||||
2 4 40 xxz 4
|
||||
2 3 40 zzxxx 3
|
||||
2 4 40 zxx 4
|
||||
2 3 40 xyyxx 3
|
||||
2 4 40 xzzzx 4
|
||||
2 3 40 yzxxx 3
|
||||
2 4 40 xxzy 4
|
||||
explain extended select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = 4;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 2 100.00 Using where; Using index
|
||||
1 SIMPLE t1 ref idx idx 5 test.t2.a 12 100.00 Using index condition(BKA); Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t1`.`tp` AS `tp`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c`,`test`.`t2`.`a` AS `a` from `test`.`t1` join `test`.`t2` where `test`.`t1`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` in (3,4) and `test`.`t1`.`b` / 10 = 4
|
||||
select * from t1,t2 where t2.a in (3,4) and t1.a=t2.a and (t1.b / 10) = 4;
|
||||
tp a b c a
|
||||
2 3 40 yxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyx 3
|
||||
2 4 40 xxx 4
|
||||
2 3 40 xzzzz 3
|
||||
2 4 40 yyyxx 4
|
||||
2 3 40 xxx 3
|
||||
2 4 40 xx 4
|
||||
2 3 40 yyxzx 3
|
||||
2 4 40 xyx 4
|
||||
2 3 40 xxxzz 3
|
||||
2 4 40 xxz 4
|
||||
2 3 40 zzxxx 3
|
||||
2 4 40 zxx 4
|
||||
2 3 40 xyyxx 3
|
||||
2 4 40 xzzzx 4
|
||||
2 3 40 yzxxx 3
|
||||
2 4 40 xxzy 4
|
||||
insert into t2 values
|
||||
(3), (4), (5);
|
||||
analyze table t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t2 analyze status Engine-independent statistics collected
|
||||
test.t2 analyze status OK
|
||||
explain extended select * from t2 left join t0 on t2.a=t0.a where t2.a in (3,4) and t0.b is null;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 4 100.00 Using where; Using index
|
||||
1 SIMPLE t0 ref idx idx 5 test.t2.a 12 100.00 Using where; Not exists; Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`a` AS `a`,`test`.`t0`.`tp` AS `tp`,`test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t0`.`c` AS `c` from `test`.`t2` left join `test`.`t0` on(`test`.`t0`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` is not null) where `test`.`t2`.`a` in (3,4) and `test`.`t0`.`b` is null
|
||||
select * from t2 left join t0 on t2.a=t0.a where t2.a in (3,4) and t0.b is null;
|
||||
a tp a b c
|
||||
explain extended select * from t2 left join t1 on t2.a=t1.a where t2.a in (3,4) and t1.b is null;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE t2 range idx idx 5 NULL 4 100.00 Using where; Using index
|
||||
1 SIMPLE t1 ref idx idx 5 test.t2.a 12 100.00 Using where; Not exists; Using join buffer (flat, BKA join); Rowid-ordered scan
|
||||
Warnings:
|
||||
Note 1003 select `test`.`t2`.`a` AS `a`,`test`.`t1`.`tp` AS `tp`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t1`.`c` AS `c` from `test`.`t2` left join `test`.`t1` on(`test`.`t1`.`a` = `test`.`t2`.`a` and `test`.`t2`.`a` is not null) where `test`.`t2`.`a` in (3,4) and `test`.`t1`.`b` is null
|
||||
select * from t2 left join t1 on t2.a=t1.a where t2.a in (3,4) and t1.b is null;
|
||||
a tp a b c
|
||||
set join_cache_level=@save_join_cache_level;
|
||||
set optimizer_switch=@save_optimizer_switch;
|
||||
drop table t0,t1,t2;
|
||||
#
|
||||
# MDEV-21628: Index condition pushdown for a simple condition over
|
||||
# index fields is not used for ref access of partitioned tables when employing BKA
|
||||
#
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ galera_binlog_stmt_autoinc : MDEV-19959 Galera test failure on galera_binlog_stm
|
|||
galera_encrypt_tmp_files : Get error failed to enable encryption of temporary files
|
||||
galera_ftwrl : MDEV-21525 galera.galera_ftwrl
|
||||
galera_gcache_recover_manytrx : MDEV-18834 Galera test failure
|
||||
galera_ist_mariabackup : MDEV-18829 test leaves port open
|
||||
galera_ist_progress : MDEV-15236 fails when trying to read transfer status
|
||||
galera_kill_largechanges : MDEV-18179 Galera test failure on galera.galera_kill_largechanges
|
||||
galera_kill_nochanges : MDEV-18280 Galera test failure on galera_split_brain and galera_kill_nochanges
|
||||
|
|
@ -44,7 +43,7 @@ galera_sst_mariabackup_table_options: MDEV-19741 Galera test failure on galera.g
|
|||
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_var_node_address : MDEV-20485 Galera test failure
|
||||
galera_var_notify_cmd : MDEV-21488,MDEV-20600
|
||||
galera_var_notify_cmd : MDEV-21905 Galera test galera_var_notify_cmd causes hang
|
||||
galera_var_reject_queries : assertion in inline_mysql_socket_send
|
||||
galera_var_retry_autocommit: MDEV-18181 Galera test failure on galera.galera_var_retry_autocommit
|
||||
galera_wan : MDEV-17259 Test failure on galera.galera_wan
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
connection node_2;
|
||||
connection node_1;
|
||||
SELECT @@WSREP_ON;
|
||||
@@WSREP_ON
|
||||
1
|
||||
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
|
||||
SELECT @@wsrep_on;
|
||||
@@wsrep_on
|
||||
|
|
|
|||
|
|
@ -11,19 +11,19 @@ SET SESSION wsrep_OSU_method = "RSU";
|
|||
ALTER TABLE t1 ADD PRIMARY KEY (f1);
|
||||
SET SESSION wsrep_OSU_method = "TOI";
|
||||
INSERT INTO t1 (f1) SELECT 200000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5;
|
||||
SELECT COUNT(*) = 300000 FROM t1;
|
||||
COUNT(*) = 300000
|
||||
1
|
||||
SELECT MAX(f1) = 299999 FROM t1;
|
||||
MAX(f1) = 299999
|
||||
1
|
||||
SELECT COUNT(*) AS EXPECT_300000 FROM t1;
|
||||
EXPECT_300000
|
||||
300000
|
||||
SELECT MAX(f1) AS EXPECT_299999 FROM t1;
|
||||
EXPECT_299999
|
||||
299999
|
||||
connection node_1;
|
||||
SELECT COUNT(*) = 300000 FROM t1;
|
||||
COUNT(*) = 300000
|
||||
1
|
||||
SELECT MAX(f1) = 299999 FROM t1;
|
||||
MAX(f1) = 299999
|
||||
1
|
||||
SELECT COUNT(*) AS EXPECT_300000 FROM t1;
|
||||
EXPECT_300000
|
||||
300000
|
||||
SELECT MAX(f1) AS EXPECT_299999 FROM t1;
|
||||
EXPECT_299999
|
||||
299999
|
||||
SET SESSION wsrep_OSU_method = "RSU";
|
||||
ALTER TABLE t1 ADD PRIMARY KEY (f1);
|
||||
SET SESSION wsrep_OSU_method = "TOI";
|
||||
|
|
|
|||
101
mysql-test/suite/galera/r/galera_slave_replay.result
Normal file
101
mysql-test/suite/galera/r/galera_slave_replay.result
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
|
||||
connection node_2a;
|
||||
connection node_2;
|
||||
connection node_1;
|
||||
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
|
||||
connection node_3;
|
||||
SET GLOBAL wsrep_on=OFF;
|
||||
RESET MASTER;
|
||||
SET GLOBAL wsrep_on=ON;
|
||||
connection node_2a;
|
||||
START SLAVE;
|
||||
connection node_3;
|
||||
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb;
|
||||
INSERT INTO t1 VALUES (1, 'a');
|
||||
INSERT INTO t1 VALUES (3, 'a');
|
||||
set binlog_format=STATEMENT;
|
||||
SET AUTOCOMMIT=ON;
|
||||
START TRANSACTION;
|
||||
SELECT * FROM t1 FOR UPDATE;
|
||||
f1 f2
|
||||
1 a
|
||||
3 a
|
||||
UPDATE t1 SET f2 = 'c' WHERE f1 > 1;
|
||||
connection node_2a;
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
connection node_1;
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
connection node_2a;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,commit_monitor_master_enter_sync';
|
||||
SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb";
|
||||
connection node_1;
|
||||
INSERT INTO test.t1 VALUES (2, 'b');
|
||||
connection node_3;
|
||||
COMMIT;
|
||||
connection node_2a;
|
||||
SET SESSION wsrep_on = 0;
|
||||
SET SESSION wsrep_on = 1;
|
||||
SET GLOBAL debug_dbug = "";
|
||||
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
|
||||
connection node_2a;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=commit_monitor_master_enter_sync';
|
||||
connection node_3;
|
||||
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a';
|
||||
COUNT(*) = 1
|
||||
1
|
||||
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c';
|
||||
COUNT(*) = 1
|
||||
1
|
||||
SELECT * FROM t1;
|
||||
f1 f2
|
||||
1 a
|
||||
3 c
|
||||
connection node_2a;
|
||||
set session wsrep_sync_wait=15;
|
||||
set session wsrep_sync_wait=0;
|
||||
wsrep_local_replays
|
||||
1
|
||||
SELECT * FROM t1;
|
||||
f1 f2
|
||||
1 a
|
||||
2 b
|
||||
3 c
|
||||
SET DEBUG_SYNC = "RESET";
|
||||
#
|
||||
# test phase with real abort
|
||||
#
|
||||
connection node_3;
|
||||
set binlog_format=ROW;
|
||||
insert into t1 values (4, 'd');
|
||||
SET AUTOCOMMIT=ON;
|
||||
START TRANSACTION;
|
||||
UPDATE t1 SET f2 = 'd' WHERE f1 = 3;
|
||||
connection node_2a;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=d,commit_monitor_master_enter_sync';
|
||||
SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb";
|
||||
connection node_3;
|
||||
UPDATE test.t1 SET f2 = 'e' WHERE f1 = 3;
|
||||
connection node_3;
|
||||
COMMIT;
|
||||
connection node_2a;
|
||||
SET GLOBAL debug_dbug = "";
|
||||
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
|
||||
connection node_2a;
|
||||
SET GLOBAL wsrep_provider_options = 'dbug=';
|
||||
SET GLOBAL wsrep_provider_options = 'signal=commit_monitor_master_enter_sync';
|
||||
SET DEBUG_SYNC = "RESET";
|
||||
connection node_2a;
|
||||
set session wsrep_sync_wait=15;
|
||||
SELECT COUNT(*) = 1 FROM test.t1 WHERE f2 = 'e';
|
||||
COUNT(*) = 1
|
||||
1
|
||||
set session wsrep_sync_wait=0;
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
DROP TABLE t1;
|
||||
connection node_3;
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL wsrep_on=OFF;
|
||||
RESET MASTER;
|
||||
SET GLOBAL wsrep_on=ON;
|
||||
|
|
@ -1,11 +1,11 @@
|
|||
connection node_1;
|
||||
SET SESSION wsrep_sync_wait=15;
|
||||
SELECT COUNT(DISTINCT uuid) FROM mtr_wsrep_notify.membership;
|
||||
COUNT(DISTINCT uuid)
|
||||
SELECT COUNT(DISTINCT uuid) AS EXPECT_2 FROM mtr_wsrep_notify.membership;
|
||||
EXPECT_2
|
||||
2
|
||||
SELECT MAX(size) FROM mtr_wsrep_notify.status;
|
||||
MAX(size)
|
||||
SELECT MAX(size) AS EXPECT_2 FROM mtr_wsrep_notify.status;
|
||||
EXPECT_2
|
||||
2
|
||||
SELECT COUNT(DISTINCT idx) FROM mtr_wsrep_notify.status;
|
||||
COUNT(DISTINCT idx)
|
||||
1
|
||||
SELECT COUNT(DISTINCT idx) AS EXPECT_2 FROM mtr_wsrep_notify.status;
|
||||
EXPECT_2
|
||||
2
|
||||
DROP SCHEMA mtr_wsrep_notify;
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ VARIABLE_VALUE = 'ON'
|
|||
1
|
||||
SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
||||
VARIABLE_VALUE = 0
|
||||
0
|
||||
1
|
||||
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||
VARIABLE_VALUE = 'ON'
|
||||
1
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
--source include/have_innodb.inc
|
||||
--source include/have_log_bin.inc
|
||||
--source include/galera_cluster.inc
|
||||
SELECT @@WSREP_ON;
|
||||
|
||||
# As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it
|
||||
# we open the node_3 connection here
|
||||
|
|
|
|||
|
|
@ -26,14 +26,20 @@ SET SESSION wsrep_OSU_method = "TOI";
|
|||
# Insert values after the ALTER
|
||||
INSERT INTO t1 (f1) SELECT 200000 + (10000 * a1.f1) + (1000 * a2.f1) + (100 * a3.f1) + (10 * a4.f1) + a5.f1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5;
|
||||
|
||||
--let $wait_condition = SELECT COUNT(*) = 300000 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
SELECT COUNT(*) = 300000 FROM t1;
|
||||
SELECT MAX(f1) = 299999 FROM t1;
|
||||
SELECT COUNT(*) AS EXPECT_300000 FROM t1;
|
||||
SELECT MAX(f1) AS EXPECT_299999 FROM t1;
|
||||
|
||||
--connection node_1
|
||||
--reap
|
||||
SELECT COUNT(*) = 300000 FROM t1;
|
||||
SELECT MAX(f1) = 299999 FROM t1;
|
||||
|
||||
--let $wait_condition = SELECT COUNT(*) = 300000 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
SELECT COUNT(*) AS EXPECT_300000 FROM t1;
|
||||
SELECT MAX(f1) AS EXPECT_299999 FROM t1;
|
||||
|
||||
SET SESSION wsrep_OSU_method = "RSU";
|
||||
ALTER TABLE t1 ADD PRIMARY KEY (f1);
|
||||
|
|
|
|||
1
mysql-test/suite/galera/t/galera_slave_replay.cnf
Normal file
1
mysql-test/suite/galera/t/galera_slave_replay.cnf
Normal file
|
|
@ -0,0 +1 @@
|
|||
!include ../galera_2nodes_as_slave.cnf
|
||||
203
mysql-test/suite/galera/t/galera_slave_replay.test
Normal file
203
mysql-test/suite/galera/t/galera_slave_replay.test
Normal file
|
|
@ -0,0 +1,203 @@
|
|||
#
|
||||
# This test tests the operation of transaction replay for async replication slave.
|
||||
# If a potentially conflicting galera transaction arrives at
|
||||
# just the right time during the commit and has lock conflict with async replication transaction
|
||||
# applied by slave SQL thread, then the async replication transaction should either abort
|
||||
# or rollback and replay (depending on the nature of lock conflict).
|
||||
#
|
||||
|
||||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/have_debug_sync.inc
|
||||
|
||||
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
|
||||
|
||||
--connection node_2a
|
||||
--source include/galera_cluster.inc
|
||||
--source include/galera_have_debug_sync.inc
|
||||
|
||||
#
|
||||
# node 3 is native MariaDB server operating as async replication master
|
||||
#
|
||||
--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3
|
||||
--connection node_3
|
||||
SET GLOBAL wsrep_on=OFF;
|
||||
RESET MASTER;
|
||||
SET GLOBAL wsrep_on=ON;
|
||||
|
||||
--connection node_2a
|
||||
#
|
||||
# count the number of wsrep replay's done in the node
|
||||
#
|
||||
--let $wsrep_local_replays_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'`
|
||||
|
||||
|
||||
#
|
||||
# nodes 1 and 2 form a galera cluster, node 2 operates as slave for native MariaDB naster in node 3
|
||||
#
|
||||
--disable_query_log
|
||||
--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$NODE_MYPORT_3;
|
||||
--enable_query_log
|
||||
START SLAVE;
|
||||
|
||||
--connection node_3
|
||||
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb;
|
||||
INSERT INTO t1 VALUES (1, 'a');
|
||||
INSERT INTO t1 VALUES (3, 'a');
|
||||
|
||||
#
|
||||
# use statement format replication to cause a false positive conflict with async replication transaction
|
||||
# and galera replication. The conflict will be on GAP lock, and slave SQL thread should rollback
|
||||
# and replay
|
||||
#
|
||||
set binlog_format=STATEMENT;
|
||||
|
||||
SET AUTOCOMMIT=ON;
|
||||
START TRANSACTION;
|
||||
|
||||
SELECT * FROM t1 FOR UPDATE;
|
||||
UPDATE t1 SET f2 = 'c' WHERE f1 > 1;
|
||||
|
||||
--connection node_2a
|
||||
# wait for create table and inserts to be replicated from master
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
--let $wait_condition = SELECT COUNT(*) = 2 FROM test.t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
# wait for create table and inserts to be replicated in cluster
|
||||
--connection node_1
|
||||
SET SESSION wsrep_sync_wait = 0;
|
||||
--let $wait_condition = SELECT COUNT(*) = 2 FROM test.t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
--connection node_2a
|
||||
# Block the future commit of async replication
|
||||
--let $galera_sync_point = commit_monitor_master_enter_sync
|
||||
--source include/galera_set_sync_point.inc
|
||||
|
||||
# block also the applier before applying begins
|
||||
SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb";
|
||||
|
||||
#
|
||||
# now inject a conflicting insert from node 1, it will replicate with
|
||||
# earlier seqno (than async transaction) and pause before applying in node 2
|
||||
#
|
||||
--connection node_1
|
||||
INSERT INTO test.t1 VALUES (2, 'b');
|
||||
|
||||
#
|
||||
# send the update from master, this will succeed here, beceuase of async replication.
|
||||
# async replication will apply this in node 2 and pause before commit phase,
|
||||
--connection node_3
|
||||
--error 0
|
||||
COMMIT;
|
||||
|
||||
# Wait until async slave commit is blocked in node_2
|
||||
--connection node_2a
|
||||
--source include/galera_wait_sync_point.inc
|
||||
|
||||
#
|
||||
# release the applier
|
||||
# note: have to clear wsrep_apply_cb sync point first, as async replication will go for replay
|
||||
# and as this sync point, after BF applier is released to progress
|
||||
#
|
||||
SET GLOBAL debug_dbug = "";
|
||||
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
|
||||
|
||||
# Unblock the async slave commit
|
||||
--connection node_2a
|
||||
--source include/galera_clear_sync_point.inc
|
||||
--source include/galera_signal_sync_point.inc
|
||||
|
||||
--connection node_3
|
||||
|
||||
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a';
|
||||
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c';
|
||||
SELECT * FROM t1;
|
||||
|
||||
--connection node_2a
|
||||
|
||||
# wsrep_local_replays has increased by 1
|
||||
set session wsrep_sync_wait=15;
|
||||
--let $wsrep_local_replays_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_replays'`
|
||||
set session wsrep_sync_wait=0;
|
||||
|
||||
--disable_query_log
|
||||
--eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old = 1 AS wsrep_local_replays;
|
||||
--enable_query_log
|
||||
|
||||
#
|
||||
# replaying of async transaction should be effective, and row 3 having 'c' in f2
|
||||
#
|
||||
SELECT * FROM t1;
|
||||
SET DEBUG_SYNC = "RESET";
|
||||
|
||||
#********************************************************************************
|
||||
# test phase 2
|
||||
#********************************************************************************
|
||||
|
||||
--echo #
|
||||
--echo # test phase with real abort
|
||||
--echo #
|
||||
|
||||
--connection node_3
|
||||
|
||||
set binlog_format=ROW;
|
||||
|
||||
insert into t1 values (4, 'd');
|
||||
|
||||
SET AUTOCOMMIT=ON;
|
||||
START TRANSACTION;
|
||||
|
||||
UPDATE t1 SET f2 = 'd' WHERE f1 = 3;
|
||||
|
||||
--connection node_2a
|
||||
# wait for the last insert to be replicated from master
|
||||
--let $wait_condition = SELECT COUNT(*) = 4 FROM test.t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
# Block the commit
|
||||
--let $galera_sync_point = commit_monitor_master_enter_sync
|
||||
--source include/galera_set_sync_point.inc
|
||||
|
||||
# block applier
|
||||
SET GLOBAL debug_dbug = "d,sync.wsrep_apply_cb";
|
||||
|
||||
# Inject a conflicting update from node 3
|
||||
--connection node_3
|
||||
UPDATE test.t1 SET f2 = 'e' WHERE f1 = 3;
|
||||
|
||||
# send the update from master
|
||||
--connection node_3
|
||||
--error 0
|
||||
COMMIT;
|
||||
|
||||
--connection node_2a
|
||||
|
||||
# release the applier
|
||||
SET GLOBAL debug_dbug = "";
|
||||
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb";
|
||||
|
||||
|
||||
# Unblock the async slave commit
|
||||
--connection node_2a
|
||||
--source include/galera_clear_sync_point.inc
|
||||
--source include/galera_signal_sync_point.inc
|
||||
SET DEBUG_SYNC = "RESET";
|
||||
|
||||
--connection node_2a
|
||||
|
||||
set session wsrep_sync_wait=15;
|
||||
SELECT COUNT(*) = 1 FROM test.t1 WHERE f2 = 'e';
|
||||
set session wsrep_sync_wait=0;
|
||||
|
||||
STOP SLAVE;
|
||||
RESET SLAVE;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--connection node_3
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL wsrep_on=OFF;
|
||||
RESET MASTER;
|
||||
SET GLOBAL wsrep_on=ON;
|
||||
|
|
@ -0,0 +1 @@
|
|||
--wsrep_notify_cmd=$MYSQL_TEST_DIR/std_data/wsrep_notify.sh --wsrep-sync-wait=0
|
||||
|
|
@ -1,13 +0,0 @@
|
|||
!include ../galera_2nodes.cnf
|
||||
|
||||
[mysqld.1]
|
||||
wsrep_notify_cmd=$MYSQL_TEST_DIR/std_data/wsrep_notify.sh
|
||||
wsrep-sync-wait=0
|
||||
|
||||
[mysqld.2]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -4,9 +4,15 @@
|
|||
#
|
||||
|
||||
--source include/galera_cluster.inc
|
||||
--source include/force_restart.inc
|
||||
|
||||
--connection node_1
|
||||
SET SESSION wsrep_sync_wait=15;
|
||||
SELECT COUNT(DISTINCT uuid) FROM mtr_wsrep_notify.membership;
|
||||
SELECT MAX(size) FROM mtr_wsrep_notify.status;
|
||||
SELECT COUNT(DISTINCT idx) FROM mtr_wsrep_notify.status;
|
||||
--let $wait_condition = SELECT COUNT(DISTINCT uuid) = 2 FROM mtr_wsrep_notify.membership;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
SELECT COUNT(DISTINCT uuid) AS EXPECT_2 FROM mtr_wsrep_notify.membership;
|
||||
SELECT MAX(size) AS EXPECT_2 FROM mtr_wsrep_notify.status;
|
||||
SELECT COUNT(DISTINCT idx) AS EXPECT_2 FROM mtr_wsrep_notify.status;
|
||||
|
||||
# CLEANUP
|
||||
DROP SCHEMA mtr_wsrep_notify;
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
--wsrep-new-cluster
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
!include ../galera_2nodes.cnf
|
||||
|
||||
[mysqld.1]
|
||||
wsrep-new-cluster
|
||||
|
||||
[mysqld.2]
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -6,6 +6,19 @@
|
|||
|
||||
--source include/galera_cluster.inc
|
||||
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||
--source include/wait_condition.inc
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'on' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
||||
--source include/wait_condition.inc
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
||||
--source include/wait_condition.inc
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||
--source include/wait_condition.inc
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
||||
--source include/wait_condition.inc
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
||||
SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
||||
|
|
@ -15,6 +28,19 @@ SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VAR
|
|||
|
||||
--connection node_2
|
||||
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||
--source include/wait_condition.inc
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'on' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
||||
--source include/wait_condition.inc
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
||||
--source include/wait_condition.inc
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
|
||||
--source include/wait_condition.inc
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state';
|
||||
--source include/wait_condition.inc
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||
SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_connected';
|
||||
SELECT VARIABLE_VALUE = 0 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_index';
|
||||
|
|
|
|||
|
|
@ -27,25 +27,24 @@ INSERT INTO t1 VALUES (2,3);
|
|||
--connection node_2a
|
||||
SET session wsrep_sync_wait=0;
|
||||
SET session wsrep_causal_reads=OFF;
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
--sleep 1
|
||||
--send FLUSH TABLES t1 WITH READ LOCK;
|
||||
|
||||
--connection node_2
|
||||
# let the flush table wait in pause state before we unlock
|
||||
# table otherwise there is window where-in flush table is
|
||||
# yet to wait in pause and unlock allows alter table to proceed.
|
||||
# this is because send in asynchronous.
|
||||
--sleep 3
|
||||
# this will release existing lock but will not resume
|
||||
# the cluster as there is new FTRL that is still pausing it.
|
||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%committed%';
|
||||
--source include/wait_condition.inc
|
||||
|
||||
UNLOCK TABLES;
|
||||
SHOW CREATE TABLE t1;
|
||||
|
||||
--connection node_2a
|
||||
--reap
|
||||
UNLOCK TABLES;
|
||||
--sleep 2
|
||||
|
||||
--let $wait_condition = SELECT COUNT(*) = 2 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
SELECT * from t1;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded");
|
||||
call mtr.add_suppression("InnoDB: Table '.*' tablespace is set as discarded.");
|
||||
call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded.");
|
||||
CREATE TABLE mdev21563(f1 VARCHAR(100), FULLTEXT idx(f1))ENGINE=InnoDB;
|
||||
set debug_dbug="+d,fts_instrument_sync_request";
|
||||
INSERT INTO mdev21563 VALUES('This is a test');
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
--source include/have_innodb.inc
|
||||
--source include/have_debug.inc
|
||||
--source include/not_embedded.inc
|
||||
call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded");
|
||||
call mtr.add_suppression("InnoDB: Table '.*' tablespace is set as discarded.");
|
||||
call mtr.add_suppression("InnoDB: Tablespace for table .* is set as discarded.");
|
||||
|
||||
CREATE TABLE mdev21563(f1 VARCHAR(100), FULLTEXT idx(f1))ENGINE=InnoDB;
|
||||
set debug_dbug="+d,fts_instrument_sync_request";
|
||||
|
|
|
|||
|
|
@ -102,7 +102,3 @@ SET_TARGET_PROPERTIES(thr_timer PROPERTIES COMPILE_FLAGS "-DMAIN")
|
|||
ADD_EXECUTABLE(test_hash hash.c)
|
||||
TARGET_LINK_LIBRARIES(test_hash mysys)
|
||||
SET_TARGET_PROPERTIES(test_hash PROPERTIES COMPILE_FLAGS "-DMAIN")
|
||||
|
||||
IF(MSVC)
|
||||
INSTALL_DEBUG_TARGET(mysys DESTINATION ${INSTALL_LIBDIR}/debug)
|
||||
ENDIF()
|
||||
|
|
|
|||
|
|
@ -56,6 +56,18 @@ static ElfW(Addr) offset= 0;
|
|||
#define offset 0
|
||||
#endif
|
||||
|
||||
#ifndef bfd_get_section_flags
|
||||
#define bfd_get_section_flags(H, S) bfd_section_flags(S)
|
||||
#endif /* bfd_get_section_flags */
|
||||
|
||||
#ifndef bfd_get_section_size
|
||||
#define bfd_get_section_size(S) bfd_section_size(S)
|
||||
#endif /* bfd_get_section_size */
|
||||
|
||||
#ifndef bfd_get_section_vma
|
||||
#define bfd_get_section_vma(H, S) bfd_section_vma(S)
|
||||
#endif /* bfd_get_section_vma */
|
||||
|
||||
/**
|
||||
finds a file name, a line number, and a function name corresponding to addr.
|
||||
|
||||
|
|
|
|||
|
|
@ -1035,6 +1035,11 @@ void my_print_default_files(const char *conf_file)
|
|||
char name[FN_REFLEN], **ext;
|
||||
|
||||
puts("\nDefault options are read from the following files in the given order:");
|
||||
if (my_defaults_file)
|
||||
{
|
||||
puts(my_defaults_file);
|
||||
return;
|
||||
}
|
||||
|
||||
if (dirname_length(conf_file))
|
||||
fputs(conf_file,stdout);
|
||||
|
|
@ -1059,7 +1064,12 @@ void my_print_default_files(const char *conf_file)
|
|||
if (**dirs)
|
||||
pos= *dirs;
|
||||
else if (my_defaults_extra_file)
|
||||
{
|
||||
pos= my_defaults_extra_file;
|
||||
fputs(pos, stdout);
|
||||
fputs(" ", stdout);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
continue;
|
||||
end= convert_dirname(name, pos, NullS);
|
||||
|
|
|
|||
|
|
@ -21,10 +21,36 @@
|
|||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined(__FreeBSD__) && defined(HAVE_PTHREAD_GETAFFINITY_NP)
|
||||
#include <pthread_np.h>
|
||||
#include <sys/cpuset.h>
|
||||
#endif
|
||||
|
||||
static int ncpus=0;
|
||||
|
||||
int my_getncpus()
|
||||
int my_getncpus(void)
|
||||
{
|
||||
#if (defined(__linux__) || defined(__FreeBSD__)) && defined(HAVE_PTHREAD_GETAFFINITY_NP)
|
||||
cpu_set_t set;
|
||||
|
||||
if (!ncpus)
|
||||
{
|
||||
if (pthread_getaffinity_np(pthread_self(), sizeof(set), &set) == 0)
|
||||
{
|
||||
ncpus= CPU_COUNT(&set);
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef _SC_NPROCESSORS_ONLN
|
||||
ncpus= sysconf(_SC_NPROCESSORS_ONLN);
|
||||
#else
|
||||
ncpus= 2;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#else /* __linux__ || FreeBSD && HAVE_PTHREAD_GETAFFINITY_NP */
|
||||
|
||||
if (!ncpus)
|
||||
{
|
||||
#ifdef _SC_NPROCESSORS_ONLN
|
||||
|
|
@ -46,5 +72,8 @@ int my_getncpus()
|
|||
ncpus= 2;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* __linux__ || FreeBSD && HAVE_PTHREAD_GETAFFINITY_NP */
|
||||
|
||||
return ncpus;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,24 @@
|
|||
INCLUDE (CheckIncludeFiles)
|
||||
INCLUDE (CheckFunctionExists)
|
||||
|
||||
CHECK_INCLUDE_FILES (security/pam_ext.h HAVE_PAM_EXT_H)
|
||||
CHECK_INCLUDE_FILES (security/pam_appl.h HAVE_PAM_APPL_H)
|
||||
CHECK_FUNCTION_EXISTS (strndup HAVE_STRNDUP)
|
||||
|
||||
SET(CMAKE_REQUIRED_LIBRARIES pam)
|
||||
CHECK_FUNCTION_EXISTS(pam_syslog HAVE_PAM_SYSLOG)
|
||||
SET(CMAKE_REQUIRED_LIBRARIES)
|
||||
|
||||
IF(HAVE_PAM_SYSLOG)
|
||||
ADD_DEFINITIONS(-DHAVE_PAM_SYSLOG)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_PAM_EXT_H)
|
||||
ADD_DEFINITIONS(-DHAVE_PAM_EXT_H)
|
||||
ENDIF()
|
||||
|
||||
IF(HAVE_PAM_APPL_H)
|
||||
ADD_DEFINITIONS(-DHAVE_PAM_APPL_H)
|
||||
IF(HAVE_STRNDUP)
|
||||
ADD_DEFINITIONS(-DHAVE_STRNDUP)
|
||||
ENDIF(HAVE_STRNDUP)
|
||||
|
|
|
|||
|
|
@ -39,14 +39,36 @@ and usually end up in /var/log/secure file.
|
|||
#include <grp.h>
|
||||
#include <pwd.h>
|
||||
|
||||
#ifdef HAVE_PAM_EXT_H
|
||||
#include <security/pam_ext.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_PAM_APPL_H
|
||||
#include <unistd.h>
|
||||
#include <security/pam_appl.h>
|
||||
#endif
|
||||
|
||||
#include <security/pam_modules.h>
|
||||
|
||||
#ifndef HAVE_PAM_SYSLOG
|
||||
#include <stdarg.h>
|
||||
static void
|
||||
pam_syslog (const pam_handle_t *pamh, int priority,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start (args, fmt);
|
||||
vsyslog (priority, fmt, args);
|
||||
va_end (args);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define FILENAME "/etc/security/user_map.conf"
|
||||
#define skip(what) while (*s && (what)) s++
|
||||
#define SYSLOG_DEBUG if (mode_debug) pam_syslog
|
||||
|
||||
#define GROUP_BUFFER_SIZE 100
|
||||
|
||||
static const char debug_keyword[]= "debug";
|
||||
|
||||
static int populate_user_groups(const char *user, gid_t **groups)
|
||||
{
|
||||
|
|
@ -128,10 +150,6 @@ static void print_groups(pam_handle_t *pamh, const gid_t *user_groups, int ng)
|
|||
ng, (ng == 1) ? "group" : "groups", buf+1);
|
||||
}
|
||||
|
||||
|
||||
static const char debug_keyword[]= "debug";
|
||||
#define SYSLOG_DEBUG if (mode_debug) pam_syslog
|
||||
|
||||
int pam_sm_authenticate(pam_handle_t *pamh, int flags,
|
||||
int argc, const char *argv[])
|
||||
{
|
||||
|
|
|
|||
|
|
@ -31,7 +31,4 @@ IF(WIN32)
|
|||
LINK_LIBRARIES Secur32
|
||||
MODULE_ONLY COMPONENT ClientPlugins)
|
||||
|
||||
#IF(MSVC)
|
||||
# INSTALL_DEBUG_TARGET(auth_win_client DESTINATION ${INSTALL_LIBDIR}/debug)
|
||||
#ENDIF()
|
||||
ENDIF(WIN32)
|
||||
|
|
|
|||
|
|
@ -6297,9 +6297,10 @@ static bool partition_multi_range_key_skip_record(range_seq_t seq,
|
|||
{
|
||||
PARTITION_PART_KEY_MULTI_RANGE_HLD *hld=
|
||||
(PARTITION_PART_KEY_MULTI_RANGE_HLD *)seq;
|
||||
PARTITION_KEY_MULTI_RANGE *pkmr= (PARTITION_KEY_MULTI_RANGE *)range_info;
|
||||
DBUG_ENTER("partition_multi_range_key_skip_record");
|
||||
DBUG_RETURN(hld->partition->m_seq_if->skip_record(hld->partition->m_seq,
|
||||
range_info, rowid));
|
||||
pkmr->ptr, rowid));
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -6308,9 +6309,10 @@ static bool partition_multi_range_key_skip_index_tuple(range_seq_t seq,
|
|||
{
|
||||
PARTITION_PART_KEY_MULTI_RANGE_HLD *hld=
|
||||
(PARTITION_PART_KEY_MULTI_RANGE_HLD *)seq;
|
||||
PARTITION_KEY_MULTI_RANGE *pkmr= (PARTITION_KEY_MULTI_RANGE *)range_info;
|
||||
DBUG_ENTER("partition_multi_range_key_skip_index_tuple");
|
||||
DBUG_RETURN(hld->partition->m_seq_if->skip_index_tuple(hld->partition->m_seq,
|
||||
range_info));
|
||||
pkmr->ptr));
|
||||
}
|
||||
|
||||
ha_rows ha_partition::multi_range_read_info_const(uint keyno,
|
||||
|
|
|
|||
|
|
@ -224,7 +224,7 @@ typedef struct st_partition_key_multi_range
|
|||
|
||||
|
||||
/*
|
||||
List of ranges to be scanned in a certain [sub]partition.
|
||||
List of ranges to be scanned in a certain [sub]partition
|
||||
|
||||
The idea is that there's a list of ranges to be scanned in the table
|
||||
(formed by PARTITION_KEY_MULTI_RANGE structures),
|
||||
|
|
@ -260,10 +260,10 @@ typedef struct st_partition_part_key_multi_range_hld
|
|||
/* Owner object */
|
||||
ha_partition *partition;
|
||||
|
||||
// id of the the partition this structure is for
|
||||
/* id of the the partition this structure is for */
|
||||
uint32 part_id;
|
||||
|
||||
// Current range we're iterating through.
|
||||
/* Current range we're iterating through */
|
||||
PARTITION_PART_KEY_MULTI_RANGE *partition_part_key_multi_range;
|
||||
} PARTITION_PART_KEY_MULTI_RANGE_HLD;
|
||||
|
||||
|
|
@ -869,28 +869,31 @@ public:
|
|||
uint m_mrr_new_full_buffer_size;
|
||||
MY_BITMAP m_mrr_used_partitions;
|
||||
uint *m_stock_range_seq;
|
||||
// not used: uint m_current_range_seq;
|
||||
/* not used: uint m_current_range_seq; */
|
||||
|
||||
// Value of mrr_mode passed to ha_partition::multi_range_read_init
|
||||
/* Value of mrr_mode passed to ha_partition::multi_range_read_init */
|
||||
uint m_mrr_mode;
|
||||
|
||||
// Value of n_ranges passed to ha_partition::multi_range_read_init
|
||||
/* Value of n_ranges passed to ha_partition::multi_range_read_init */
|
||||
uint m_mrr_n_ranges;
|
||||
|
||||
/*
|
||||
Ordered MRR mode: m_range_info[N] has the range_id of the last record that
|
||||
we've got from partition N.
|
||||
we've got from partition N
|
||||
*/
|
||||
range_id_t *m_range_info;
|
||||
|
||||
// TRUE <=> This ha_partition::multi_range_read_next() call is the first one
|
||||
/*
|
||||
TRUE <=> This ha_partition::multi_range_read_next() call is the first one
|
||||
*/
|
||||
bool m_multi_range_read_first;
|
||||
// not used: uint m_mrr_range_init_flags;
|
||||
|
||||
/* not used: uint m_mrr_range_init_flags; */
|
||||
|
||||
/* Number of elements in the list pointed by m_mrr_range_first. Not used */
|
||||
uint m_mrr_range_length;
|
||||
|
||||
// Linked list of ranges to scan
|
||||
/* Linked list of ranges to scan */
|
||||
PARTITION_KEY_MULTI_RANGE *m_mrr_range_first;
|
||||
PARTITION_KEY_MULTI_RANGE *m_mrr_range_current;
|
||||
|
||||
|
|
@ -899,21 +902,19 @@ public:
|
|||
*/
|
||||
uint *m_part_mrr_range_length;
|
||||
|
||||
/*
|
||||
For each partition: List of ranges to scan in this partition.
|
||||
*/
|
||||
/* For each partition: List of ranges to scan in this partition */
|
||||
PARTITION_PART_KEY_MULTI_RANGE **m_part_mrr_range_first;
|
||||
PARTITION_PART_KEY_MULTI_RANGE **m_part_mrr_range_current;
|
||||
PARTITION_PART_KEY_MULTI_RANGE_HLD *m_partition_part_key_multi_range_hld;
|
||||
|
||||
/*
|
||||
Sequence of ranges to be scanned (TODO: why not stores this in
|
||||
Sequence of ranges to be scanned (TODO: why not store this in
|
||||
handler::mrr_{iter,funcs}?)
|
||||
*/
|
||||
range_seq_t m_seq;
|
||||
RANGE_SEQ_IF *m_seq_if;
|
||||
|
||||
// Range iterator structure to be supplied to partitions
|
||||
/* Range iterator structure to be supplied to partitions */
|
||||
RANGE_SEQ_IF m_part_seq_if;
|
||||
|
||||
virtual int multi_range_key_create_key(
|
||||
|
|
|
|||
|
|
@ -9053,10 +9053,16 @@ int Xid_log_event::do_apply_event(rpl_group_info *rgi)
|
|||
thd->variables.option_bits&= ~OPTION_GTID_BEGIN;
|
||||
res= trans_commit(thd); /* Automatically rolls back on error. */
|
||||
thd->mdl_context.release_transactional_locks();
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
if (WSREP(thd)) mysql_mutex_lock(&thd->LOCK_thd_data);
|
||||
if ((!res || (WSREP(thd) && thd->wsrep_trx().state() == wsrep::transaction::s_must_replay )) && sub_id)
|
||||
#else
|
||||
if (likely(!res) && sub_id)
|
||||
#endif /* WITH_WSREP */
|
||||
rpl_global_gtid_slave_state->update_state_hash(sub_id, >id, hton, rgi);
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
if (WSREP(thd)) mysql_mutex_unlock(&thd->LOCK_thd_data);
|
||||
#endif /* WITH_WSREP */
|
||||
/*
|
||||
Increment the global status commit count variable
|
||||
*/
|
||||
|
|
|
|||
31
sql/slave.cc
31
sql/slave.cc
|
|
@ -3959,19 +3959,26 @@ apply_event_and_update_pos_apply(Log_event* ev, THD* thd, rpl_group_info *rgi,
|
|||
exec_res= ev->apply_event(rgi);
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
if (WSREP_ON)
|
||||
{
|
||||
mysql_mutex_lock(&thd->LOCK_thd_data);
|
||||
if (exec_res &&
|
||||
thd->wsrep_trx().state() != wsrep::transaction::s_executing)
|
||||
{
|
||||
WSREP_DEBUG("SQL apply failed, res %d conflict state: %s",
|
||||
exec_res, wsrep_thd_transaction_state_str(thd));
|
||||
rli->abort_slave= 1;
|
||||
rli->report(ERROR_LEVEL, ER_UNKNOWN_COM_ERROR, rgi->gtid_info(),
|
||||
"Node has dropped from cluster");
|
||||
if (WSREP_ON) {
|
||||
if (exec_res) {
|
||||
mysql_mutex_lock(&thd->LOCK_thd_data);
|
||||
switch(thd->wsrep_trx().state()) {
|
||||
case wsrep::transaction::s_must_replay:
|
||||
/* this transaction will be replayed,
|
||||
so not raising slave error here */
|
||||
WSREP_DEBUG("SQL apply failed for MUST_REPLAY, res %d", exec_res);
|
||||
exec_res = 0;
|
||||
break;
|
||||
default:
|
||||
WSREP_DEBUG("SQL apply failed, res %d conflict state: %s",
|
||||
exec_res, wsrep_thd_transaction_state_str(thd));
|
||||
rli->abort_slave= 1;
|
||||
rli->report(ERROR_LEVEL, ER_UNKNOWN_COM_ERROR, rgi->gtid_info(),
|
||||
"Node has dropped from cluster");
|
||||
break;
|
||||
}
|
||||
mysql_mutex_unlock(&thd->LOCK_thd_data);
|
||||
}
|
||||
mysql_mutex_unlock(&thd->LOCK_thd_data);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -593,7 +593,7 @@ static struct show_privileges_st sys_privileges[]=
|
|||
{"Create view", "Tables", "To create new views"},
|
||||
{"Create user", "Server Admin", "To create new users"},
|
||||
{"Delete", "Tables", "To delete existing rows"},
|
||||
{"Delete versioning rows", "Tables", "To delete versioning table historical rows"},
|
||||
{"Delete history", "Tables", "To delete versioning table historical rows"},
|
||||
{"Drop", "Databases,Tables", "To drop databases, tables, and views"},
|
||||
#ifdef HAVE_EVENT_SCHEDULER
|
||||
{"Event","Server Admin","To create, alter, drop and execute events"},
|
||||
|
|
|
|||
|
|
@ -7970,10 +7970,10 @@ alter:
|
|||
lex->server_options.reset($3);
|
||||
} OPTIONS_SYM '(' server_options_list ')' { }
|
||||
/* ALTER USER foo is allowed for MySQL compatibility. */
|
||||
| ALTER opt_if_exists USER_SYM clear_privileges grant_list
|
||||
| ALTER USER_SYM opt_if_exists clear_privileges grant_list
|
||||
opt_require_clause opt_resource_options opt_account_locking opt_password_expiration
|
||||
{
|
||||
Lex->create_info.set($2);
|
||||
Lex->create_info.set($3);
|
||||
Lex->sql_command= SQLCOM_ALTER_USER;
|
||||
}
|
||||
| ALTER SEQUENCE_SYM opt_if_exists
|
||||
|
|
|
|||
|
|
@ -8071,10 +8071,10 @@ alter:
|
|||
lex->server_options.reset($3);
|
||||
} OPTIONS_SYM '(' server_options_list ')' { }
|
||||
/* ALTER USER foo is allowed for MySQL compatibility. */
|
||||
| ALTER opt_if_exists USER_SYM clear_privileges grant_list
|
||||
| ALTER USER_SYM opt_if_exists clear_privileges grant_list
|
||||
opt_require_clause opt_resource_options opt_account_locking opt_password_expiration
|
||||
{
|
||||
Lex->create_info.set($2);
|
||||
Lex->create_info.set($3);
|
||||
Lex->sql_command= SQLCOM_ALTER_USER;
|
||||
}
|
||||
| ALTER SEQUENCE_SYM opt_if_exists
|
||||
|
|
|
|||
|
|
@ -54,8 +54,9 @@ static void wsrep_replication_process(THD *thd,
|
|||
Wsrep_applier_service applier_service(thd);
|
||||
|
||||
/* thd->system_thread_info.rpl_sql_info isn't initialized. */
|
||||
thd->system_thread_info.rpl_sql_info=
|
||||
new rpl_sql_thread_info(thd->wsrep_rgi->rli->mi->rpl_filter);
|
||||
if (!thd->slave_thread)
|
||||
thd->system_thread_info.rpl_sql_info=
|
||||
new rpl_sql_thread_info(thd->wsrep_rgi->rli->mi->rpl_filter);
|
||||
|
||||
WSREP_INFO("Starting applier thread %llu", thd->thread_id);
|
||||
enum wsrep::provider::status
|
||||
|
|
@ -67,7 +68,8 @@ static void wsrep_replication_process(THD *thd,
|
|||
mysql_cond_broadcast(&COND_wsrep_slave_threads);
|
||||
mysql_mutex_unlock(&LOCK_wsrep_slave_threads);
|
||||
|
||||
delete thd->system_thread_info.rpl_sql_info;
|
||||
if (!thd->slave_thread)
|
||||
delete thd->system_thread_info.rpl_sql_info;
|
||||
delete thd->wsrep_rgi->rli->mi;
|
||||
delete thd->wsrep_rgi->rli;
|
||||
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ IF(UNIX)
|
|||
ENDIF()
|
||||
|
||||
CONFIGURE_FILE(mariadb.pc.in ${CMAKE_CURRENT_BINARY_DIR}/mariadb.pc @ONLY)
|
||||
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/mariadb.pc DESTINATION ${INSTALL_SHAREDIR}/pkgconfig COMPONENT Development)
|
||||
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/mariadb.pc DESTINATION ${INSTALL_LIBDIR}/pkgconfig COMPONENT Development)
|
||||
|
||||
INSTALL(FILES mysql.m4 DESTINATION ${INSTALL_SHAREDIR}/aclocal COMPONENT Development)
|
||||
|
||||
|
|
|
|||
|
|
@ -20,4 +20,4 @@ Description: @CPACK_PACKAGE_DESCRIPTION_SUMMARY@
|
|||
URL: @CPACK_PACKAGE_URL@
|
||||
Version: @VERSION@
|
||||
Libs: -L${libdir} @LIBS_FOR_CLIENTS@
|
||||
Cflags: -I${includedir} -I${includedir}/.. @CFLAGS_FOR_CLIENTS@
|
||||
Cflags: -I${includedir} @CFLAGS_FOR_CLIENTS@
|
||||
|
|
|
|||
|
|
@ -144,7 +144,7 @@ TimeoutStopSec=900
|
|||
## isn't executed.
|
||||
##
|
||||
|
||||
# Number of files limit. previously [mysqld_safe] open-file-limit
|
||||
# Number of files limit. previously [mysqld_safe] open-files-limit
|
||||
LimitNOFILE=16364
|
||||
|
||||
# Maximium core size. previously [mysqld_safe] core-file-size
|
||||
|
|
|
|||
|
|
@ -267,7 +267,7 @@ Group=mysql
|
|||
## isn't executed.
|
||||
##
|
||||
|
||||
# Number of files limit. previously [mysqld_safe] open-file-limit
|
||||
# Number of files limit. previously [mysqld_safe] open-files-limit
|
||||
LimitNOFILE=16364
|
||||
|
||||
# Maximium core size. previously [mysqld_safe] core-file-size
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue