Merge 10.1 into 10.2

This commit is contained in:
Marko Mäkelä 2019-05-28 15:56:24 +03:00
commit d59e15bdb9
37 changed files with 1498 additions and 297 deletions

View File

@ -37,7 +37,7 @@ IF(CMAKE_VERSION VERSION_LESS "3.6.0")
SET(CPACK_PACKAGE_FILE_NAME "${CPACK_RPM_PACKAGE_NAME}-${VERSION}-${RPM}-${CMAKE_SYSTEM_PROCESSOR}") SET(CPACK_PACKAGE_FILE_NAME "${CPACK_RPM_PACKAGE_NAME}-${VERSION}-${RPM}-${CMAKE_SYSTEM_PROCESSOR}")
ELSE() ELSE()
SET(CPACK_RPM_FILE_NAME "RPM-DEFAULT") SET(CPACK_RPM_FILE_NAME "RPM-DEFAULT")
SET(CPACK_RPM_DEBUGINFO_PACKAGE ON) SET(CPACK_RPM_DEBUGINFO_PACKAGE ON CACHE INTERNAL "")
ENDIF() ENDIF()
SET(CPACK_RPM_PACKAGE_RELEASE "1%{?dist}") SET(CPACK_RPM_PACKAGE_RELEASE "1%{?dist}")

4
debian/po/ca.po vendored
View File

@ -203,13 +203,13 @@ msgstr ""
#~ msgid "" #~ msgid ""
#~ "MySQL will only install if you have a non-numeric hostname that is " #~ "MySQL will only install if you have a non-numeric hostname that is "
#~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command " #~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command "
#~ "returns \"myhostname\" then there must be a line like \"10.2.0.1 " #~ "returns \"myhostname\" then there must be a line like \"10.0.0.1 "
#~ "myhostname\"." #~ "myhostname\"."
#~ msgstr "" #~ msgstr ""
#~ "El MySQL només s'instal·la en cas de tenir un nom d'ordinador central que " #~ "El MySQL només s'instal·la en cas de tenir un nom d'ordinador central que "
#~ "no sigui numèric i que es pugui resoldre a través del fitxer /etc/hosts. " #~ "no sigui numèric i que es pugui resoldre a través del fitxer /etc/hosts. "
#~ "Ex. si l'ordre \"hostname\" retorna \"myhostname\", llavors hi ha d'haver " #~ "Ex. si l'ordre \"hostname\" retorna \"myhostname\", llavors hi ha d'haver "
#~ "una línia com la següent \"10.2.0.1 myhostname\"." #~ "una línia com la següent \"10.0.0.1 myhostname\"."
#, fuzzy #, fuzzy
#~ msgid "" #~ msgid ""

4
debian/po/cs.po vendored
View File

@ -310,13 +310,13 @@ msgstr ""
#~ msgid "" #~ msgid ""
#~ "MySQL will only install if you have a non-numeric hostname that is " #~ "MySQL will only install if you have a non-numeric hostname that is "
#~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command " #~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command "
#~ "returns \"myhostname\" then there must be a line like \"10.2.0.1 " #~ "returns \"myhostname\" then there must be a line like \"10.0.0.1 "
#~ "myhostname\"." #~ "myhostname\"."
#~ msgstr "" #~ msgstr ""
#~ "MySQL se nainstaluje pouze v případě, že používáte nenumerické jméno " #~ "MySQL se nainstaluje pouze v případě, že používáte nenumerické jméno "
#~ "počítače, které se dá přeložit přes soubor /etc/hosts. Např. když příkaz " #~ "počítače, které se dá přeložit přes soubor /etc/hosts. Např. když příkaz "
#~ "\"hostname\" vrátí \"diamond\", tak v /etc/hosts musí existovat obdobný " #~ "\"hostname\" vrátí \"diamond\", tak v /etc/hosts musí existovat obdobný "
#~ "řádek jako \"10.2.0.1 diamond\"." #~ "řádek jako \"10.0.0.1 diamond\"."
#~ msgid "" #~ msgid ""
#~ "A new mysql user \"debian-sys-maint\" will be created. This mysql account " #~ "A new mysql user \"debian-sys-maint\" will be created. This mysql account "

4
debian/po/da.po vendored
View File

@ -336,12 +336,12 @@ msgstr ""
#~ msgid "" #~ msgid ""
#~ "MySQL will only install if you have a non-numeric hostname that is " #~ "MySQL will only install if you have a non-numeric hostname that is "
#~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command " #~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command "
#~ "returns \"myhostname\" then there must be a line like \"10.2.0.1 " #~ "returns \"myhostname\" then there must be a line like \"10.0.0.1 "
#~ "myhostname\"." #~ "myhostname\"."
#~ msgstr "" #~ msgstr ""
#~ "MySQL vil kun blive installeret, hvis du har et ikke-numerisk værtsnavn, " #~ "MySQL vil kun blive installeret, hvis du har et ikke-numerisk værtsnavn, "
#~ "som kan slås op i filen /ets/hosts. Hvis f.eks. kommandoen \"hostname\" " #~ "som kan slås op i filen /ets/hosts. Hvis f.eks. kommandoen \"hostname\" "
#~ "svarer med \"mitvaertsnavn\", skal du have en linje a'la \"10.2.0.1 " #~ "svarer med \"mitvaertsnavn\", skal du have en linje a'la \"10.0.0.1 "
#~ "mitvaertsnavn\" i /etc/hosts." #~ "mitvaertsnavn\" i /etc/hosts."
#~ msgid "" #~ msgid ""

4
debian/po/es.po vendored
View File

@ -354,13 +354,13 @@ msgstr ""
#~ msgid "" #~ msgid ""
#~ "MySQL will only install if you have a non-numeric hostname that is " #~ "MySQL will only install if you have a non-numeric hostname that is "
#~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command " #~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command "
#~ "returns \"myhostname\" then there must be a line like \"10.2.0.1 " #~ "returns \"myhostname\" then there must be a line like \"10.0.0.1 "
#~ "myhostname\"." #~ "myhostname\"."
#~ msgstr "" #~ msgstr ""
#~ "Sólo se instalará MySQL si tiene un nombre de equipo que no sea una " #~ "Sólo se instalará MySQL si tiene un nombre de equipo que no sea una "
#~ "dirección IP y pueda resolverse a través del archivo /etc/hosts. Por " #~ "dirección IP y pueda resolverse a través del archivo /etc/hosts. Por "
#~ "ejemplo, si la orden «hostname» devuelve «MiNombreEquipo» entonces deberá " #~ "ejemplo, si la orden «hostname» devuelve «MiNombreEquipo» entonces deberá "
#~ "existir una línea «10.2.0.1 MiNombreEquipo» en dicho archivo." #~ "existir una línea «10.0.0.1 MiNombreEquipo» en dicho archivo."
#~ msgid "" #~ msgid ""
#~ "A new mysql user \"debian-sys-maint\" will be created. This mysql account " #~ "A new mysql user \"debian-sys-maint\" will be created. This mysql account "

4
debian/po/pt_BR.po vendored
View File

@ -322,13 +322,13 @@ msgstr ""
#~ msgid "" #~ msgid ""
#~ "MySQL will only install if you have a non-numeric hostname that is " #~ "MySQL will only install if you have a non-numeric hostname that is "
#~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command " #~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command "
#~ "returns \"myhostname\" then there must be a line like \"10.2.0.1 " #~ "returns \"myhostname\" then there must be a line like \"10.0.0.1 "
#~ "myhostname\"." #~ "myhostname\"."
#~ msgstr "" #~ msgstr ""
#~ "O MySQL será instalado somente caso você possua um nome de host NÃO " #~ "O MySQL será instalado somente caso você possua um nome de host NÃO "
#~ "NUMÉRICO que possa ser resolvido através do arquivo /etc/hosts, ou seja, " #~ "NUMÉRICO que possa ser resolvido através do arquivo /etc/hosts, ou seja, "
#~ "caso o comando \"hostname\" retorne \"myhostname\", uma linha como " #~ "caso o comando \"hostname\" retorne \"myhostname\", uma linha como "
#~ "\"10.2.0.1 myhostname\" deverá existir no arquivo /etc/hosts." #~ "\"10.0.0.1 myhostname\" deverá existir no arquivo /etc/hosts."
#~ msgid "" #~ msgid ""
#~ "A new mysql user \"debian-sys-maint\" will be created. This mysql account " #~ "A new mysql user \"debian-sys-maint\" will be created. This mysql account "

4
debian/po/tr.po vendored
View File

@ -202,12 +202,12 @@ msgstr ""
#~ msgid "" #~ msgid ""
#~ "MySQL will only install if you have a non-numeric hostname that is " #~ "MySQL will only install if you have a non-numeric hostname that is "
#~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command " #~ "resolvable via the /etc/hosts file. E.g. if the \"hostname\" command "
#~ "returns \"myhostname\" then there must be a line like \"10.2.0.1 " #~ "returns \"myhostname\" then there must be a line like \"10.0.0.1 "
#~ "myhostname\"." #~ "myhostname\"."
#~ msgstr "" #~ msgstr ""
#~ "MySQL sadece /etc/hosts dosyası yoluyla çözülebilir NUMERİK OLMAYAN bir " #~ "MySQL sadece /etc/hosts dosyası yoluyla çözülebilir NUMERİK OLMAYAN bir "
#~ "makine adına sahipseniz kurulacaktır. Örneğin, eğer \"hostname\" komutu " #~ "makine adına sahipseniz kurulacaktır. Örneğin, eğer \"hostname\" komutu "
#~ "\"makinem\" ismini döndürüyorsa, bu dosya içinde \"10.2.0.1 makinem\" " #~ "\"makinem\" ismini döndürüyorsa, bu dosya içinde \"10.0.0.1 makinem\" "
#~ "gibi bir satır olmalıdır." #~ "gibi bir satır olmalıdır."
#, fuzzy #, fuzzy

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2010, 2017, MariaDB Corporation. /* Copyright (C) 2010, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -13,6 +13,9 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
#ifndef MY_VALGRIND_INCLUDED
#define MY_VALGRIND_INCLUDED
/* clang -> gcc */ /* clang -> gcc */
#ifndef __has_feature #ifndef __has_feature
# define __has_feature(x) 0 # define __has_feature(x) 0
@ -33,6 +36,7 @@
# define MEM_NOACCESS(a,len) VALGRIND_MAKE_MEM_NOACCESS(a,len) # define MEM_NOACCESS(a,len) VALGRIND_MAKE_MEM_NOACCESS(a,len)
# define MEM_CHECK_ADDRESSABLE(a,len) VALGRIND_CHECK_MEM_IS_ADDRESSABLE(a,len) # define MEM_CHECK_ADDRESSABLE(a,len) VALGRIND_CHECK_MEM_IS_ADDRESSABLE(a,len)
# define MEM_CHECK_DEFINED(a,len) VALGRIND_CHECK_MEM_IS_DEFINED(a,len) # define MEM_CHECK_DEFINED(a,len) VALGRIND_CHECK_MEM_IS_DEFINED(a,len)
# define REDZONE_SIZE 8
#elif defined(__SANITIZE_ADDRESS__) #elif defined(__SANITIZE_ADDRESS__)
# include <sanitizer/asan_interface.h> # include <sanitizer/asan_interface.h>
/* How to do manual poisoning: /* How to do manual poisoning:
@ -41,11 +45,13 @@ https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning */
# define MEM_NOACCESS(a,len) ASAN_POISON_MEMORY_REGION(a,len) # define MEM_NOACCESS(a,len) ASAN_POISON_MEMORY_REGION(a,len)
# define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0) # define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0)
# define MEM_CHECK_DEFINED(a,len) ((void) 0) # define MEM_CHECK_DEFINED(a,len) ((void) 0)
# define REDZONE_SIZE 8
#else #else
# define MEM_UNDEFINED(a,len) ((void) (a), (void) (len)) # define MEM_UNDEFINED(a,len) ((void) (a), (void) (len))
# define MEM_NOACCESS(a,len) ((void) 0) # define MEM_NOACCESS(a,len) ((void) 0)
# define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0) # define MEM_CHECK_ADDRESSABLE(a,len) ((void) 0)
# define MEM_CHECK_DEFINED(a,len) ((void) 0) # define MEM_CHECK_DEFINED(a,len) ((void) 0)
# define REDZONE_SIZE 0
#endif /* HAVE_VALGRIND_MEMCHECK_H */ #endif /* HAVE_VALGRIND_MEMCHECK_H */
#ifndef DBUG_OFF #ifndef DBUG_OFF
@ -56,3 +62,5 @@ https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning */
#define TRASH_ALLOC(A,B) do { TRASH_FILL(A,B,0xA5); MEM_UNDEFINED(A,B); } while(0) #define TRASH_ALLOC(A,B) do { TRASH_FILL(A,B,0xA5); MEM_UNDEFINED(A,B); } while(0)
#define TRASH_FREE(A,B) do { TRASH_FILL(A,B,0x8F); MEM_NOACCESS(A,B); } while(0) #define TRASH_FREE(A,B) do { TRASH_FILL(A,B,0x8F); MEM_NOACCESS(A,B); } while(0)
#endif /* MY_VALGRIND_INCLUDED */

View File

@ -1,6 +1,6 @@
'\" t '\" t
.\" .\"
.TH "\FBMYSQLIMPORT\FR" "1" "3 April 2017" "MariaDB 10\&.2" "MariaDB Database System" .TH "\FBMYSQLIMPORT\FR" "1" "21 May 2019" "MariaDB 10\&.2" "MariaDB Database System"
.\" ----------------------------------------------------------------- .\" -----------------------------------------------------------------
.\" * set default formatting .\" * set default formatting
.\" ----------------------------------------------------------------- .\" -----------------------------------------------------------------
@ -346,6 +346,22 @@ option\&.
.sp -1 .sp -1
.IP \(bu 2.3 .IP \(bu 2.3
.\} .\}
.\" mysqlimport: ignore-foreign-keys option
.\" ignore-foreign-keys option: mysqlimport
\fB\-\-ignore\-foreign\-keys\fR,
\fB\-k\fR
.sp
Disable foreign key checks while importing the data\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
.\" mysqlimport: ignore-lines option .\" mysqlimport: ignore-lines option
.\" ignore-lines option: mysqlimport .\" ignore-lines option: mysqlimport
\fB\-\-ignore\-lines=\fR\fB\fIN\fR\fR \fB\-\-ignore\-lines=\fR\fB\fIN\fR\fR

View File

@ -2977,3 +2977,404 @@ Note 1003 select straight_join `test`.`t1`.`c1` AS `c1` from `test`.`t1` where <
DROP TABLE t1, t2; DROP TABLE t1, t2;
set optimizer_switch=@exit_optimizer_switch; set optimizer_switch=@exit_optimizer_switch;
set join_cache_level=@exit_join_cache_level; set join_cache_level=@exit_join_cache_level;
#
# Bug mdev-12812: EXPLAIN for query with many expensive derived
#
CREATE TABLE t1
(id int auto_increment primary key,
uid int NOT NULL,
gp_id int NOT NULL,
r int NOT NULL
);
INSERT INTO t1(uid,gp_id,r) VALUES
(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),
(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),
(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),
(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),
(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),
(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),
(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),
(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),
(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),
(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),
(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),
(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),
(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),
(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),
(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),
(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),
(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),
(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),
(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),
(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),
(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),
(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),
(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),
(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),
(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),
(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),
(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),
(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),
(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),
(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),
(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),
(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),
(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),
(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),
(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),
(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),
(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),
(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),
(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),
(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),
(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),
(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),
(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),
(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),
(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1);
CREATE TABLE t2 (id int) ;
INSERT INTO t2 VALUES (1);
explain SELECT 1 FROM t2 JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_1 ON gp_1.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_2 ON gp_2.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p1 ON p1.r=1 AND p1.uid=t2.id
JOIN t1 p3 ON p3.r=3 AND p3.uid=t2.id
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_3 ON gp_3.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p1 ON p1.r=1 AND p1.uid=t2.id
JOIN t1 p3 ON p3.r=3 AND p3.uid=t2.id
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_4 ON gp_4.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p1 ON p1.r=1 AND p1.uid=t2.id
JOIN t1 p3 ON p3.r=3 AND p3.uid=t2.id
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_5 ON gp_5.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p1 ON p1.r=1 AND p1.uid=t2.id
JOIN t1 p3 ON p3.r=3 AND p3.uid=t2.id
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_6 ON gp_6.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p1 ON p1.r=1 AND p1.uid=t2.id
JOIN t1 p3 ON p3.r=3 AND p3.uid=t2.id
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
WHERE p1.gp_id=7) gp_7 ON gp_7.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_8 ON gp_8.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_9 ON gp_9.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_14 ON gp_14.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_15 ON gp_15.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_16 ON gp_16.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
)gp_17 ON gp_17.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
)gp_18 ON gp_18.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
)gp_19 ON gp_19.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
) gp_20 ON gp_20.id=t2.id ;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t2 system NULL NULL NULL NULL 1
1 PRIMARY t2 system NULL NULL NULL NULL 1
1 PRIMARY t2 system NULL NULL NULL NULL 1
1 PRIMARY t2 system NULL NULL NULL NULL 1
1 PRIMARY t2 system NULL NULL NULL NULL 1
1 PRIMARY t2 system NULL NULL NULL NULL 1
1 PRIMARY p4 ALL NULL NULL NULL NULL 550 Using where
1 PRIMARY p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
1 PRIMARY p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p4 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p1 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p3 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p4 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p1 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p3 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p4 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p1 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p3 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p4 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived17> ALL NULL NULL NULL NULL 50328437500000 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived14> ALL NULL NULL NULL NULL 27680640625000000 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived7> ALL NULL NULL NULL NULL 7798774269472204800 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived8> ALL NULL NULL NULL NULL 7798774269472204800 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived9> ALL NULL NULL NULL NULL -3222391729959550976 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived10> ALL NULL NULL NULL NULL -3222391729959550976 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived11> ALL NULL NULL NULL NULL -3222391729959550976 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived12> ALL NULL NULL NULL NULL -3222391729959550976 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived13> ALL NULL NULL NULL NULL -3222391729959550976 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived15> ALL NULL NULL NULL NULL -3222391729959550976 Using where; Using join buffer (incremental, BNL join)
1 PRIMARY <derived16> ALL NULL NULL NULL NULL -3222391729959550976 Using where; Using join buffer (incremental, BNL join)
17 DERIVED t2 system NULL NULL NULL NULL 1
17 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where
17 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
17 DERIVED p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
17 DERIVED p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
17 DERIVED p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
16 DERIVED t2 system NULL NULL NULL NULL 1
16 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where
16 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
16 DERIVED p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
16 DERIVED p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
16 DERIVED p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
16 DERIVED p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
16 DERIVED p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
15 DERIVED t2 system NULL NULL NULL NULL 1
15 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where
15 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
15 DERIVED p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
15 DERIVED p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
15 DERIVED p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
15 DERIVED p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
15 DERIVED p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
14 DERIVED t2 system NULL NULL NULL NULL 1
14 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where
14 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
14 DERIVED p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
14 DERIVED p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
14 DERIVED p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
14 DERIVED p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
13 DERIVED t2 system NULL NULL NULL NULL 1
13 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where
13 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
13 DERIVED p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
13 DERIVED p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
13 DERIVED p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
13 DERIVED p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
13 DERIVED p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
12 DERIVED t2 system NULL NULL NULL NULL 1
12 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where
12 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
12 DERIVED p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
12 DERIVED p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
12 DERIVED p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
12 DERIVED p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
12 DERIVED p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
11 DERIVED t2 system NULL NULL NULL NULL 1
11 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where
11 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
11 DERIVED p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
11 DERIVED p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
11 DERIVED p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
11 DERIVED p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
11 DERIVED p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
10 DERIVED t2 system NULL NULL NULL NULL 1
10 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where
10 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
10 DERIVED p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
10 DERIVED p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
10 DERIVED p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
10 DERIVED p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
10 DERIVED p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
9 DERIVED t2 system NULL NULL NULL NULL 1
9 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where
9 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
9 DERIVED p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
9 DERIVED p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
9 DERIVED p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
9 DERIVED p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
9 DERIVED p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
8 DERIVED t2 system NULL NULL NULL NULL 1
8 DERIVED p1 ALL NULL NULL NULL NULL 550 Using where
8 DERIVED p3 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
8 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
8 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
8 DERIVED p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
8 DERIVED p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
8 DERIVED p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
8 DERIVED p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
8 DERIVED p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
7 DERIVED t2 system NULL NULL NULL NULL 1
7 DERIVED p1 ALL NULL NULL NULL NULL 550 Using where
7 DERIVED p3 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (flat, BNL join)
7 DERIVED p4 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
7 DERIVED p5 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
7 DERIVED p6 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
7 DERIVED p7 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
7 DERIVED p8 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
7 DERIVED p9 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
7 DERIVED p10 ALL NULL NULL NULL NULL 550 Using where; Using join buffer (incremental, BNL join)
DROP TABLE t1, t2;

View File

@ -2885,6 +2885,37 @@ Klaipeda Lithuania xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Panevezys Lithuania xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Panevezys Lithuania xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
set join_cache_level=default; set join_cache_level=default;
set join_buffer_size=default; set join_buffer_size=default;
#
# MDEV-17752: Plan changes from hash_index_merge to index_merge with new optimizer defaults
#
set @save_optimizer_use_condition_selectivity=@@optimizer_use_condition_selectivity;
set @save_use_stat_tables=@@use_stat_tables;
set optimizer_use_condition_selectivity=4;
set use_stat_tables='preferably';
use world;
set join_cache_level=4;
CREATE INDEX City_Name ON City(Name);
ANALYZE TABLE City, Country;
EXPLAIN
SELECT Country.Name, Country.Population, City.Name, City.Population
FROM Country LEFT JOIN City
ON City.Country=Country.Code AND City.Population > 5000000
WHERE Country.Name LIKE 'C%' AND Country.Population > 10000000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Country range Name Name 302 NULL 15 Using index condition; Using where; Rowid-ordered scan
1 SIMPLE City hash_range Population,Country #hash#Country:Population 3:4 world.Country.Code 25 Using where; Rowid-ordered scan; Using join buffer (flat, BNLH join)
EXPLAIN
SELECT Country.Name, Country.Population, City.Name, City.Population
FROM Country LEFT JOIN City
ON City.Country=Country.Code AND
(City.Population > 5000000 OR City.Name LIKE 'Za%')
WHERE Country.Name LIKE 'C%' AND Country.Population > 10000000;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Country range Name Name 302 NULL 15 Using index condition; Using where; Rowid-ordered scan
1 SIMPLE City hash_index_merge Population,Country,City_Name #hash#Country:Population,City_Name 3:4,35 world.Country.Code 96 Using sort_union(Population,City_Name); Using where; Using join buffer (flat, BNLH join)
set @@optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
set @@use_stat_tables=@save_use_stat_tables;
set join_cache_level=default;
DROP DATABASE world; DROP DATABASE world;
use test; use test;
CREATE TABLE t1( CREATE TABLE t1(

View File

@ -1342,7 +1342,7 @@ EXPLAIN SELECT * FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON c21=c31) ON c11=c21;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 1 SIMPLE t1 ALL NULL NULL NULL NULL 2
1 SIMPLE t2 hash_ALL NULL #hash#$hj 5 test.t1.c11 0 Using where; Using join buffer (flat, BNLH join) 1 SIMPLE t2 hash_ALL NULL #hash#$hj 5 test.t1.c11 0 Using where; Using join buffer (flat, BNLH join)
1 SIMPLE t3 ALL NULL NULL NULL NULL 0 Using where; Using join buffer (incremental, BNL join) 1 SIMPLE t3 hash_ALL NULL #hash#$hj 5 test.t1.c11 0 Using where; Using join buffer (incremental, BNLH join)
DROP TABLE t1,t2,t3; DROP TABLE t1,t2,t3;
CREATE TABLE t1 (goods int(12) NOT NULL, price varchar(128) NOT NULL); CREATE TABLE t1 (goods int(12) NOT NULL, price varchar(128) NOT NULL);
INSERT INTO t1 VALUES (23, 2340), (26, 9900); INSERT INTO t1 VALUES (23, 2340), (26, 9900);

View File

@ -2445,7 +2445,7 @@ t1.b1+'0' t2.b2 + '0'
0 0 0 0
1 1 1 1
DROP TABLE t1, t2; DROP TABLE t1, t2;
set @join_cache_level= @save_join_cache_level; set @@join_cache_level= @save_join_cache_level;
# #
# MDEV-14779: using left join causes incorrect results with materialization and derived tables # MDEV-14779: using left join causes incorrect results with materialization and derived tables
# #
@ -2511,4 +2511,141 @@ ORDER BY tb1.i1;
v2 v2
DROP TABLE t1,t2; DROP TABLE t1,t2;
# end of 5.5 tests # end of 5.5 tests
#
# MDEV-19258: chained right joins all converted to inner joins
#
CREATE TABLE t1 (
id int NOT NULL AUTO_INCREMENT,
timestamp bigint NOT NULL,
modifiedBy varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
);
CREATE TABLE t2 (
id int NOT NULL,
REV int NOT NULL,
REVTYPE tinyint DEFAULT NULL,
profile_id int DEFAULT NULL,
PRIMARY KEY (id,REV)
);
CREATE TABLE t3 (
id int NOT NULL,
REV int NOT NULL,
person_id int DEFAULT NULL,
PRIMARY KEY (id,REV)
);
CREATE TABLE t4 (
id int NOT NULL,
REV int NOT NULL,
PRIMARY KEY (id,REV)
);
INSERT INTO t1 VALUES
(1,1294391193890,'Cxqy$*9.kKeE'),(2,1294643906883,'rE4wqGV0gif@'),
(3,1294643927456,'L?3yt(%dY$Br'),(4,1294644343525,'WH&ObiZ$#2S4'),
(5,1294644616416,'YXnCbt?olUZ0'),(6,1294644954537,'8Npe4!(#lU@k'),
(7,1294645046659,'knc0GhXB1#ib'),(8,1294645183829,'w*oPpVfuS8^m'),
(9,1294645386701,'hwXR@3qVzrbU'),(10,1294645525982,'BeLW*Y9ndP0l'),
(11,1294645627723,'nTegib^)qZ$I'),(12,1294650860266,'u62C^Kzx3wH8'),
(13,1294657613745,'4&BkFjGa!qLg'),(14,1294660627161,')anpt312SCoh'),
(15,1294661023336,'LtJ2PX?*kTmx'),(16,1294662838066,'POGRr@?#ofpl'),
(17,1294663020989,'o.)1EOT2jnF7'),(18,1294663308065,'&TZ0F0LHE6.h'),
(19,1294664900039,'j)kSC%^In$9d'),(20,1294668904556,'97glN50)cAo.'),
(21,1294728056853,'lrKZxmw?I.Ek'),(22,1294728157174,'@P*SRg!pT.q?'),
(23,1294728327099,'W9gPrptF.)8n'),(24,1294728418481,'$q*c^sM&URd#'),
(25,1294728729620,'9*f4&bTPRtHo'),(26,1294728906014,')4VtTEnS7$oI'),
(27,1294732190003,'8dkNSPq2u3AQ'),(28,1294733205065,'SV2N6IoEf438'),
(29,1294741984927,'rBKj.0S^Ey%*'),(30,1294751748352,'j$2DvlBqk)Fw'),
(31,1294753902212,'C$N6OrEw8elz'),(32,1294758120598,'DCSVZw!rnxXq'),
(33,1294761769556,'OTS@QU8a6s5c'),(34,1294816845305,'IUE2stG0D3L5'),
(35,1294816966909,'Xd16yka.9nHe'),(36,1294817116302,'lOQHZpm%!8qb'),
(37,1294817374775,'^&pE3IhNf7ey'),(38,1294817538907,'oEn4#7C0Vhfp'),
(39,1294818482950,'bx54J*O0Va&?'),(40,1294819047024,'J%@a&1.qgdb?'),
(41,1294821826077,'C9kojr$L3Phz'),(42,1294825454458,'gG#BOnM80ZPi'),
(43,1294904129918,'F^!TrjM#zdvc'),(44,1294904254166,'Va&Tb)k0RvlM'),
(45,1294904414964,'dJjq0M6HvhR#'),(46,1294904505784,'nJmxg)ELqY(b'),
(47,1294904602835,'dhF#or$Vge!7'),(48,1294904684728,'?bIh5E3l!0em'),
(49,1294904877898,'Y*WflOdcxnk.'),(50,1294905002390,'*?H!lUgez5A.'),
(51,1294905096043,'wlEIY3n9uz!p'),(52,1294905404621,'T?qv3H6&hlQD'),
(53,1294905603922,'S@Bhys^Ti7bt'),(54,1294905788416,'KR?a5NVukz#l'),
(55,1294905993190,'A*&q4kWhED!o'),(56,1294906205254,'fT0%7z0DF6h*'),
(57,1294906319680,'LhzdW4?ivjR0'),(58,1294906424296,'h0KDlns%U*6T'),
(59,1294906623844,'b$CfB1noI6Ax'),(60,1294911258896,'#T1*LP!3$Oys');
INSERT INTO t2 VALUES
(1,1,0,10209),(1,42480,1,10209),(1,61612,1,10209),(1,257545,1,10209),
(1,385332,1,10209),(1,1687999,1,10209),(3,1,0,10210),(3,617411,2,10210),
(4,11,0,14),(4,95149,1,10211),(4,607890,2,10211),(5,1,0,10212),
(6,1,0,10213),(6,93344,1,10213),(6,295578,1,10213),(6,295579,1,10213),
(6,295644,1,10213),(7,1,0,10214),(7,12,1,7),(7,688796,1,10214),
(7,1140433,1,10214),(7,1715227,1,10214),(8,1,0,10215),(8,74253,1,10215),
(8,93345,1,10215),(8,12,2,2),(9,1,0,10216),(9,93342,1,10216),
(9,122354,1,10216),(9,301499,2,10216),(10,11,0,5),(10,93343,1,10217),
(10,122355,1,10217),(10,123050,1,10217),(10,301500,2,10217),(11,1,0,10218),
(11,87852,1,10218),(11,605499,2,10218),(12,1,0,10219),(12,88024,1,10219),
(12,605892,2,10219),(13,1,0,10220);
INSERT INTO t3 VALUES
(1,1,300003),(1,117548,NULL),(2,1,300003),(2,117548,300006),
(3,1,300153),(3,117548,NULL),(4,1,300153),(4,117548,NULL),
(5,1,300153),(5,117548,NULL),(6,1,300182),(6,117548,NULL),
(7,1,300205),(7,117548,NULL),(8,1,300217),(8,117548,NULL),
(9,1,300290),(9,117548,NULL),(10,1,300290),(10,117548,NULL),
(11,1,300405),(11,117548,NULL),(12,1,300670),(12,117548,NULL),
(13,1,300670),(13,117548,NULL),(14,1,300006),(14,117548,NULL),
(15,1,300671),(15,117548,NULL),(16,1,300732),(16,117548,NULL);
INSERT INTO t4 VALUES
(300000,1),(300001,1),(300003,1),(300004,1),
(300005,1),(300005,688796),(300006,1),(300006,97697),
(300009,1),(300010,1),(300011,1),(300012,1),(300013,1),
(300014,1),(300015,1),(300016,1),(300017,1),(300018,1),
(300019,1),(300020,1),(300021,1),(300022,1),(300023,1),
(300024,1),(300025,1),(300026,1),(300027,1),(300028,1);
# This should have join order of t2,t3,t4,t1
EXPLAIN EXTENDED SELECT *
FROM t1 INNER JOIN t2 ON t2.REV=t1.id
INNER JOIN t3 ON t3.id=t2.profile_id
INNER JOIN t4 ON t4.id=t3.person_id
WHERE t1.timestamp < 1294664900039 AND t1.timestamp > 1294644616416 AND
t2.REVTYPE=2;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t2 ALL NULL NULL NULL NULL 42 100.00 Using where
1 SIMPLE t3 ref PRIMARY PRIMARY 4 test.t2.profile_id 1 100.00 Using where
1 SIMPLE t4 ref PRIMARY PRIMARY 4 test.t3.person_id 1 100.00 Using index
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.REV 1 100.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`timestamp` AS `timestamp`,`test`.`t1`.`modifiedBy` AS `modifiedBy`,`test`.`t2`.`id` AS `id`,`test`.`t2`.`REV` AS `REV`,`test`.`t2`.`REVTYPE` AS `REVTYPE`,`test`.`t2`.`profile_id` AS `profile_id`,`test`.`t3`.`id` AS `id`,`test`.`t3`.`REV` AS `REV`,`test`.`t3`.`person_id` AS `person_id`,`test`.`t4`.`id` AS `id`,`test`.`t4`.`REV` AS `REV` from `test`.`t1` join `test`.`t2` join `test`.`t3` join `test`.`t4` where `test`.`t2`.`REVTYPE` = 2 and `test`.`t4`.`id` = `test`.`t3`.`person_id` and `test`.`t3`.`id` = `test`.`t2`.`profile_id` and `test`.`t1`.`id` = `test`.`t2`.`REV` and `test`.`t1`.`timestamp` < 1294664900039 and `test`.`t1`.`timestamp` > 1294644616416
SELECT *
FROM t1 INNER JOIN t2 ON t2.REV=t1.id
INNER JOIN t3 ON t3.id=t2.profile_id
INNER JOIN t4 ON t4.id=t3.person_id
WHERE t1.timestamp < 1294664900039 AND t1.timestamp > 1294644616416 AND
t2.REVTYPE=2;
id timestamp modifiedBy id REV REVTYPE profile_id id REV person_id id REV
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 1 300003 300003 1
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 117548 300006 300006 1
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 117548 300006 300006 97697
# This should have join order of t2,t3,t4,t1 with the same plan as above
# because all RIGHT JOIN operations are converted into INNER JOIN
EXPLAIN EXTENDED SELECT *
FROM t1 RIGHT JOIN t2 ON t2.REV=t1.id
RIGHT JOIN t3 ON t3.id=t2.profile_id
RIGHT JOIN t4 ON t4.id=t3.person_id
WHERE t1.timestamp < 1294664900039 AND t1.timestamp > 1294644616416
AND t2.REVTYPE=2;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t2 ALL NULL NULL NULL NULL 42 100.00 Using where
1 SIMPLE t3 ref PRIMARY PRIMARY 4 test.t2.profile_id 1 100.00 Using where
1 SIMPLE t4 ref PRIMARY PRIMARY 4 test.t3.person_id 1 100.00 Using index
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.REV 1 100.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`timestamp` AS `timestamp`,`test`.`t1`.`modifiedBy` AS `modifiedBy`,`test`.`t2`.`id` AS `id`,`test`.`t2`.`REV` AS `REV`,`test`.`t2`.`REVTYPE` AS `REVTYPE`,`test`.`t2`.`profile_id` AS `profile_id`,`test`.`t3`.`id` AS `id`,`test`.`t3`.`REV` AS `REV`,`test`.`t3`.`person_id` AS `person_id`,`test`.`t4`.`id` AS `id`,`test`.`t4`.`REV` AS `REV` from `test`.`t4` join `test`.`t3` join `test`.`t2` join `test`.`t1` where `test`.`t2`.`REVTYPE` = 2 and `test`.`t1`.`id` = `test`.`t2`.`REV` and `test`.`t3`.`id` = `test`.`t2`.`profile_id` and `test`.`t4`.`id` = `test`.`t3`.`person_id` and `test`.`t1`.`timestamp` < 1294664900039 and `test`.`t1`.`timestamp` > 1294644616416
SELECT *
FROM t1 RIGHT JOIN t2 ON t2.REV=t1.id
RIGHT JOIN t3 ON t3.id=t2.profile_id
RIGHT JOIN t4 ON t4.id=t3.person_id
WHERE t1.timestamp < 1294664900039 AND t1.timestamp > 1294644616416
AND t2.REVTYPE=2;
id timestamp modifiedBy id REV REVTYPE profile_id id REV person_id id REV
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 1 300003 300003 1
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 117548 300006 300006 1
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 117548 300006 300006 97697
DROP TABLE t1,t2,t3,t4;
# end of 10.1 tests
SET optimizer_switch=@save_optimizer_switch; SET optimizer_switch=@save_optimizer_switch;

View File

@ -2456,7 +2456,7 @@ t1.b1+'0' t2.b2 + '0'
0 0 0 0
1 1 1 1
DROP TABLE t1, t2; DROP TABLE t1, t2;
set @join_cache_level= @save_join_cache_level; set @@join_cache_level= @save_join_cache_level;
# #
# MDEV-14779: using left join causes incorrect results with materialization and derived tables # MDEV-14779: using left join causes incorrect results with materialization and derived tables
# #
@ -2522,6 +2522,143 @@ ORDER BY tb1.i1;
v2 v2
DROP TABLE t1,t2; DROP TABLE t1,t2;
# end of 5.5 tests # end of 5.5 tests
#
# MDEV-19258: chained right joins all converted to inner joins
#
CREATE TABLE t1 (
id int NOT NULL AUTO_INCREMENT,
timestamp bigint NOT NULL,
modifiedBy varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
);
CREATE TABLE t2 (
id int NOT NULL,
REV int NOT NULL,
REVTYPE tinyint DEFAULT NULL,
profile_id int DEFAULT NULL,
PRIMARY KEY (id,REV)
);
CREATE TABLE t3 (
id int NOT NULL,
REV int NOT NULL,
person_id int DEFAULT NULL,
PRIMARY KEY (id,REV)
);
CREATE TABLE t4 (
id int NOT NULL,
REV int NOT NULL,
PRIMARY KEY (id,REV)
);
INSERT INTO t1 VALUES
(1,1294391193890,'Cxqy$*9.kKeE'),(2,1294643906883,'rE4wqGV0gif@'),
(3,1294643927456,'L?3yt(%dY$Br'),(4,1294644343525,'WH&ObiZ$#2S4'),
(5,1294644616416,'YXnCbt?olUZ0'),(6,1294644954537,'8Npe4!(#lU@k'),
(7,1294645046659,'knc0GhXB1#ib'),(8,1294645183829,'w*oPpVfuS8^m'),
(9,1294645386701,'hwXR@3qVzrbU'),(10,1294645525982,'BeLW*Y9ndP0l'),
(11,1294645627723,'nTegib^)qZ$I'),(12,1294650860266,'u62C^Kzx3wH8'),
(13,1294657613745,'4&BkFjGa!qLg'),(14,1294660627161,')anpt312SCoh'),
(15,1294661023336,'LtJ2PX?*kTmx'),(16,1294662838066,'POGRr@?#ofpl'),
(17,1294663020989,'o.)1EOT2jnF7'),(18,1294663308065,'&TZ0F0LHE6.h'),
(19,1294664900039,'j)kSC%^In$9d'),(20,1294668904556,'97glN50)cAo.'),
(21,1294728056853,'lrKZxmw?I.Ek'),(22,1294728157174,'@P*SRg!pT.q?'),
(23,1294728327099,'W9gPrptF.)8n'),(24,1294728418481,'$q*c^sM&URd#'),
(25,1294728729620,'9*f4&bTPRtHo'),(26,1294728906014,')4VtTEnS7$oI'),
(27,1294732190003,'8dkNSPq2u3AQ'),(28,1294733205065,'SV2N6IoEf438'),
(29,1294741984927,'rBKj.0S^Ey%*'),(30,1294751748352,'j$2DvlBqk)Fw'),
(31,1294753902212,'C$N6OrEw8elz'),(32,1294758120598,'DCSVZw!rnxXq'),
(33,1294761769556,'OTS@QU8a6s5c'),(34,1294816845305,'IUE2stG0D3L5'),
(35,1294816966909,'Xd16yka.9nHe'),(36,1294817116302,'lOQHZpm%!8qb'),
(37,1294817374775,'^&pE3IhNf7ey'),(38,1294817538907,'oEn4#7C0Vhfp'),
(39,1294818482950,'bx54J*O0Va&?'),(40,1294819047024,'J%@a&1.qgdb?'),
(41,1294821826077,'C9kojr$L3Phz'),(42,1294825454458,'gG#BOnM80ZPi'),
(43,1294904129918,'F^!TrjM#zdvc'),(44,1294904254166,'Va&Tb)k0RvlM'),
(45,1294904414964,'dJjq0M6HvhR#'),(46,1294904505784,'nJmxg)ELqY(b'),
(47,1294904602835,'dhF#or$Vge!7'),(48,1294904684728,'?bIh5E3l!0em'),
(49,1294904877898,'Y*WflOdcxnk.'),(50,1294905002390,'*?H!lUgez5A.'),
(51,1294905096043,'wlEIY3n9uz!p'),(52,1294905404621,'T?qv3H6&hlQD'),
(53,1294905603922,'S@Bhys^Ti7bt'),(54,1294905788416,'KR?a5NVukz#l'),
(55,1294905993190,'A*&q4kWhED!o'),(56,1294906205254,'fT0%7z0DF6h*'),
(57,1294906319680,'LhzdW4?ivjR0'),(58,1294906424296,'h0KDlns%U*6T'),
(59,1294906623844,'b$CfB1noI6Ax'),(60,1294911258896,'#T1*LP!3$Oys');
INSERT INTO t2 VALUES
(1,1,0,10209),(1,42480,1,10209),(1,61612,1,10209),(1,257545,1,10209),
(1,385332,1,10209),(1,1687999,1,10209),(3,1,0,10210),(3,617411,2,10210),
(4,11,0,14),(4,95149,1,10211),(4,607890,2,10211),(5,1,0,10212),
(6,1,0,10213),(6,93344,1,10213),(6,295578,1,10213),(6,295579,1,10213),
(6,295644,1,10213),(7,1,0,10214),(7,12,1,7),(7,688796,1,10214),
(7,1140433,1,10214),(7,1715227,1,10214),(8,1,0,10215),(8,74253,1,10215),
(8,93345,1,10215),(8,12,2,2),(9,1,0,10216),(9,93342,1,10216),
(9,122354,1,10216),(9,301499,2,10216),(10,11,0,5),(10,93343,1,10217),
(10,122355,1,10217),(10,123050,1,10217),(10,301500,2,10217),(11,1,0,10218),
(11,87852,1,10218),(11,605499,2,10218),(12,1,0,10219),(12,88024,1,10219),
(12,605892,2,10219),(13,1,0,10220);
INSERT INTO t3 VALUES
(1,1,300003),(1,117548,NULL),(2,1,300003),(2,117548,300006),
(3,1,300153),(3,117548,NULL),(4,1,300153),(4,117548,NULL),
(5,1,300153),(5,117548,NULL),(6,1,300182),(6,117548,NULL),
(7,1,300205),(7,117548,NULL),(8,1,300217),(8,117548,NULL),
(9,1,300290),(9,117548,NULL),(10,1,300290),(10,117548,NULL),
(11,1,300405),(11,117548,NULL),(12,1,300670),(12,117548,NULL),
(13,1,300670),(13,117548,NULL),(14,1,300006),(14,117548,NULL),
(15,1,300671),(15,117548,NULL),(16,1,300732),(16,117548,NULL);
INSERT INTO t4 VALUES
(300000,1),(300001,1),(300003,1),(300004,1),
(300005,1),(300005,688796),(300006,1),(300006,97697),
(300009,1),(300010,1),(300011,1),(300012,1),(300013,1),
(300014,1),(300015,1),(300016,1),(300017,1),(300018,1),
(300019,1),(300020,1),(300021,1),(300022,1),(300023,1),
(300024,1),(300025,1),(300026,1),(300027,1),(300028,1);
# This should have join order of t2,t3,t4,t1
EXPLAIN EXTENDED SELECT *
FROM t1 INNER JOIN t2 ON t2.REV=t1.id
INNER JOIN t3 ON t3.id=t2.profile_id
INNER JOIN t4 ON t4.id=t3.person_id
WHERE t1.timestamp < 1294664900039 AND t1.timestamp > 1294644616416 AND
t2.REVTYPE=2;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t2 ALL NULL NULL NULL NULL 42 100.00 Using where
1 SIMPLE t3 ref PRIMARY PRIMARY 4 test.t2.profile_id 1 100.00 Using where
1 SIMPLE t4 ref PRIMARY PRIMARY 4 test.t3.person_id 1 100.00 Using index
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.REV 1 100.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`timestamp` AS `timestamp`,`test`.`t1`.`modifiedBy` AS `modifiedBy`,`test`.`t2`.`id` AS `id`,`test`.`t2`.`REV` AS `REV`,`test`.`t2`.`REVTYPE` AS `REVTYPE`,`test`.`t2`.`profile_id` AS `profile_id`,`test`.`t3`.`id` AS `id`,`test`.`t3`.`REV` AS `REV`,`test`.`t3`.`person_id` AS `person_id`,`test`.`t4`.`id` AS `id`,`test`.`t4`.`REV` AS `REV` from `test`.`t1` join `test`.`t2` join `test`.`t3` join `test`.`t4` where `test`.`t2`.`REVTYPE` = 2 and `test`.`t4`.`id` = `test`.`t3`.`person_id` and `test`.`t3`.`id` = `test`.`t2`.`profile_id` and `test`.`t1`.`id` = `test`.`t2`.`REV` and `test`.`t1`.`timestamp` < 1294664900039 and `test`.`t1`.`timestamp` > 1294644616416
SELECT *
FROM t1 INNER JOIN t2 ON t2.REV=t1.id
INNER JOIN t3 ON t3.id=t2.profile_id
INNER JOIN t4 ON t4.id=t3.person_id
WHERE t1.timestamp < 1294664900039 AND t1.timestamp > 1294644616416 AND
t2.REVTYPE=2;
id timestamp modifiedBy id REV REVTYPE profile_id id REV person_id id REV
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 1 300003 300003 1
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 117548 300006 300006 1
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 117548 300006 300006 97697
# This should have join order of t2,t3,t4,t1 with the same plan as above
# because all RIGHT JOIN operations are converted into INNER JOIN
EXPLAIN EXTENDED SELECT *
FROM t1 RIGHT JOIN t2 ON t2.REV=t1.id
RIGHT JOIN t3 ON t3.id=t2.profile_id
RIGHT JOIN t4 ON t4.id=t3.person_id
WHERE t1.timestamp < 1294664900039 AND t1.timestamp > 1294644616416
AND t2.REVTYPE=2;
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t2 ALL NULL NULL NULL NULL 42 100.00 Using where
1 SIMPLE t3 ref PRIMARY PRIMARY 4 test.t2.profile_id 1 100.00 Using where
1 SIMPLE t4 ref PRIMARY PRIMARY 4 test.t3.person_id 1 100.00 Using index
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 test.t2.REV 1 100.00 Using where
Warnings:
Note 1003 select `test`.`t1`.`id` AS `id`,`test`.`t1`.`timestamp` AS `timestamp`,`test`.`t1`.`modifiedBy` AS `modifiedBy`,`test`.`t2`.`id` AS `id`,`test`.`t2`.`REV` AS `REV`,`test`.`t2`.`REVTYPE` AS `REVTYPE`,`test`.`t2`.`profile_id` AS `profile_id`,`test`.`t3`.`id` AS `id`,`test`.`t3`.`REV` AS `REV`,`test`.`t3`.`person_id` AS `person_id`,`test`.`t4`.`id` AS `id`,`test`.`t4`.`REV` AS `REV` from `test`.`t4` join `test`.`t3` join `test`.`t2` join `test`.`t1` where `test`.`t2`.`REVTYPE` = 2 and `test`.`t1`.`id` = `test`.`t2`.`REV` and `test`.`t3`.`id` = `test`.`t2`.`profile_id` and `test`.`t4`.`id` = `test`.`t3`.`person_id` and `test`.`t1`.`timestamp` < 1294664900039 and `test`.`t1`.`timestamp` > 1294644616416
SELECT *
FROM t1 RIGHT JOIN t2 ON t2.REV=t1.id
RIGHT JOIN t3 ON t3.id=t2.profile_id
RIGHT JOIN t4 ON t4.id=t3.person_id
WHERE t1.timestamp < 1294664900039 AND t1.timestamp > 1294644616416
AND t2.REVTYPE=2;
id timestamp modifiedBy id REV REVTYPE profile_id id REV person_id id REV
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 1 300003 300003 1
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 117548 300006 300006 1
12 1294650860266 u62C^Kzx3wH8 8 12 2 2 2 117548 300006 300006 97697
DROP TABLE t1,t2,t3,t4;
# end of 10.1 tests
SET optimizer_switch=@save_optimizer_switch; SET optimizer_switch=@save_optimizer_switch;
set join_cache_level=default; set join_cache_level=default;
show variables like 'join_cache_level'; show variables like 'join_cache_level';

View File

@ -3193,6 +3193,7 @@ drop table t1,t2,t3;
# #
# MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT # MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT
# #
set @@optimizer_switch= @subselect_sj_tmp;
create table t1 (a1 varchar(25)); create table t1 (a1 varchar(25));
create table t2 (a2 varchar(25)) ; create table t2 (a2 varchar(25)) ;
insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2); insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2);

View File

@ -3207,6 +3207,7 @@ drop table t1,t2,t3;
# #
# MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT # MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT
# #
set @@optimizer_switch= @subselect_sj_tmp;
create table t1 (a1 varchar(25)); create table t1 (a1 varchar(25));
create table t2 (a2 varchar(25)) ; create table t2 (a2 varchar(25)) ;
insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2); insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2);

View File

@ -7,24 +7,27 @@ SET @@GLOBAL.rpl_semi_sync_master_timeout=100;
connection slave; connection slave;
include/stop_slave.inc include/stop_slave.inc
SET @@GLOBAL.replicate_events_marked_for_skip=FILTER_ON_MASTER; SET @@GLOBAL.replicate_events_marked_for_skip=FILTER_ON_MASTER;
SET @@GLOBAL. rpl_semi_sync_slave_enabled = 1; SET @@GLOBAL.rpl_semi_sync_slave_enabled = 1;
include/start_slave.inc include/start_slave.inc
connection master; connection master;
CREATE TABLE t1 (a INT) ENGINE=innodb; CREATE TABLE t1 (a INT) ENGINE=innodb;
SET @@GLOBAL.debug_dbug= "d,dbug_master_binlog_over_2GB"; SET @@GLOBAL.debug_dbug="d,dbug_master_binlog_over_2GB";
SET @@SESSION.skip_replication=1; SET @@SESSION.skip_replication=1;
INSERT INTO t1 SET a=1; INSERT INTO t1 SET a=1;
SET @@SESSION.skip_replication=0; SET @@SESSION.skip_replication=0;
INSERT INTO t1 SET a=0; INSERT INTO t1 SET a=0;
SET @@GLOBAL.debug_dbug="";
FLUSH LOGS;
connection slave; connection slave;
connection master; connection master;
SET @@GLOBAL.debug_dbug=""; SET @@GLOBAL.debug_dbug=@@GLOBAL.debug_dbug;
SET @@GLOBAL. rpl_semi_sync_master_timeout = 10000; SET @@GLOBAL.rpl_semi_sync_master_timeout = 10000;
SET @@GLOBAL. rpl_semi_sync_master_enabled = 0; SET @@GLOBAL.rpl_semi_sync_master_enabled = 0;
connection master; connection master;
DROP TABLE t1; DROP TABLE t1;
connection slave; connection slave;
include/stop_slave.inc include/stop_slave.inc
SET @@GLOBAL. rpl_semi_sync_slave_enabled = 0; SET @@GLOBAL.rpl_semi_sync_slave_enabled = 0;
SET @@GLOBAL.replicate_events_marked_for_skip = REPLICATE; SET @@GLOBAL.replicate_events_marked_for_skip = REPLICATE;
include/start_slave.inc
include/rpl_end.inc include/rpl_end.inc

View File

@ -16,29 +16,34 @@ source include/master-slave.inc;
# Suppress warnings that might be generated during the test # Suppress warnings that might be generated during the test
call mtr.add_suppression("Timeout waiting for reply of binlog"); call mtr.add_suppression("Timeout waiting for reply of binlog");
--let $sav_enabled_master=`SELECT @@GLOBAL.rpl_semi_sync_master_enabled ` --let $sav_enabled_master=`SELECT @@GLOBAL.rpl_semi_sync_master_enabled`
--let $sav_timeout_master=`SELECT @@GLOBAL.rpl_semi_sync_master_timeout ` --let $sav_timeout_master=`SELECT @@GLOBAL.rpl_semi_sync_master_timeout`
SET @@GLOBAL.rpl_semi_sync_master_enabled = 1; SET @@GLOBAL.rpl_semi_sync_master_enabled = 1;
SET @@GLOBAL.rpl_semi_sync_master_timeout=100; SET @@GLOBAL.rpl_semi_sync_master_timeout=100;
--connection slave --connection slave
--let $sav_skip_marked_slave=`SELECT @@GLOBAL.replicate_events_marked_for_skip`
--let $sav_enabled_slave=`SELECT @@GLOBAL.rpl_semi_sync_slave_enabled`
source include/stop_slave.inc; source include/stop_slave.inc;
--let $sav_skip_marked_slave=`SELECT @@GLOBAL.replicate_events_marked_for_skip `
SET @@GLOBAL.replicate_events_marked_for_skip=FILTER_ON_MASTER; SET @@GLOBAL.replicate_events_marked_for_skip=FILTER_ON_MASTER;
--let $sav_enabled_slave=`SELECT @@GLOBAL.rpl_semi_sync_slave_enabled ` SET @@GLOBAL.rpl_semi_sync_slave_enabled = 1;
SET @@GLOBAL. rpl_semi_sync_slave_enabled = 1;
source include/start_slave.inc; source include/start_slave.inc;
--connection master --connection master
CREATE TABLE t1 (a INT) ENGINE=innodb; CREATE TABLE t1 (a INT) ENGINE=innodb;
# Make the following events as if they offset over 2GB from the beginning of binlog # Make the following events as if they offset over 2GB from the beginning of binlog
SET @@GLOBAL.debug_dbug= "d,dbug_master_binlog_over_2GB"; --let $sav_debug_dbug=@@GLOBAL.debug_dbug
SET @@GLOBAL.debug_dbug="d,dbug_master_binlog_over_2GB";
SET @@SESSION.skip_replication=1; SET @@SESSION.skip_replication=1;
INSERT INTO t1 SET a=1; INSERT INTO t1 SET a=1;
SET @@SESSION.skip_replication=0; SET @@SESSION.skip_replication=0;
INSERT INTO t1 SET a=0; INSERT INTO t1 SET a=0;
SET @@GLOBAL.debug_dbug="";
# The current binlog is inconsistent so let's rotate it away
# to clean up simulation results.
FLUSH LOGS;
--sync_slave_with_master --sync_slave_with_master
@ -46,17 +51,17 @@ INSERT INTO t1 SET a=0;
# Clean up # Clean up
# #
--connection master --connection master
SET @@GLOBAL.debug_dbug=""; --eval SET @@GLOBAL.debug_dbug=$sav_debug_dbug
--eval SET @@GLOBAL. rpl_semi_sync_master_timeout = $sav_timeout_master --eval SET @@GLOBAL.rpl_semi_sync_master_timeout = $sav_timeout_master
--eval SET @@GLOBAL. rpl_semi_sync_master_enabled = $sav_enabled_master --eval SET @@GLOBAL.rpl_semi_sync_master_enabled = $sav_enabled_master
--connection master --connection master
DROP TABLE t1; DROP TABLE t1;
--sync_slave_with_master --sync_slave_with_master
source include/stop_slave.inc; source include/stop_slave.inc;
--eval SET @@GLOBAL. rpl_semi_sync_slave_enabled = $sav_enabled_slave --eval SET @@GLOBAL.rpl_semi_sync_slave_enabled = $sav_enabled_slave
--eval SET @@GLOBAL.replicate_events_marked_for_skip = $sav_skip_marked_slave --eval SET @@GLOBAL.replicate_events_marked_for_skip = $sav_skip_marked_slave
--let $rpl_only_running_threads= 1 source include/start_slave.inc;
--source include/rpl_end.inc --source include/rpl_end.inc

View File

@ -1952,3 +1952,263 @@ DROP TABLE t1, t2;
# The following command must be the last one the file # The following command must be the last one the file
set optimizer_switch=@exit_optimizer_switch; set optimizer_switch=@exit_optimizer_switch;
set join_cache_level=@exit_join_cache_level; set join_cache_level=@exit_join_cache_level;
--echo #
--echo # Bug mdev-12812: EXPLAIN for query with many expensive derived
--echo #
CREATE TABLE t1
(id int auto_increment primary key,
uid int NOT NULL,
gp_id int NOT NULL,
r int NOT NULL
);
INSERT INTO t1(uid,gp_id,r) VALUES
(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),
(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),
(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),
(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),
(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),(1,1,1),
(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),
(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),
(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),
(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),
(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),(1,2,1),
(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),
(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),
(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),
(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),
(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),(1,3,1),
(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),
(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),
(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),
(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),
(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),(1,4,1),
(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),
(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),
(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),
(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),
(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),(1,5,1),
(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),
(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),
(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),
(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),
(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),(1,6,1),
(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),
(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),
(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),
(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),
(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),(1,7,1),
(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),
(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),
(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),
(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),
(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),(1,8,1),
(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),
(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),
(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),
(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),
(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),(1,9,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),
(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,10,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),(1,11,1),
(1,11,1);
CREATE TABLE t2 (id int) ;
INSERT INTO t2 VALUES (1);
explain SELECT 1 FROM t2 JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_1 ON gp_1.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_2 ON gp_2.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p1 ON p1.r=1 AND p1.uid=t2.id
JOIN t1 p3 ON p3.r=3 AND p3.uid=t2.id
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_3 ON gp_3.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p1 ON p1.r=1 AND p1.uid=t2.id
JOIN t1 p3 ON p3.r=3 AND p3.uid=t2.id
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_4 ON gp_4.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p1 ON p1.r=1 AND p1.uid=t2.id
JOIN t1 p3 ON p3.r=3 AND p3.uid=t2.id
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_5 ON gp_5.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p1 ON p1.r=1 AND p1.uid=t2.id
JOIN t1 p3 ON p3.r=3 AND p3.uid=t2.id
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_6 ON gp_6.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p1 ON p1.r=1 AND p1.uid=t2.id
JOIN t1 p3 ON p3.r=3 AND p3.uid=t2.id
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
WHERE p1.gp_id=7) gp_7 ON gp_7.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_8 ON gp_8.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_9 ON gp_9.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_14 ON gp_14.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_15 ON gp_15.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
) gp_16 ON gp_16.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
)gp_17 ON gp_17.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
)gp_18 ON gp_18.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
JOIN t1 p9 ON p9.r=9 AND p9.uid=t2.id
JOIN t1 p10 ON p10.r=10 AND p10.uid=t2.id
)gp_19 ON gp_19.id=t2.id
JOIN
(SELECT t2.id
FROM t2
JOIN t1 p4 ON p4.r=4 AND p4.uid=t2.id
JOIN t1 p5 ON p5.r=5 AND p5.uid=t2.id
JOIN t1 p6 ON p6.r=6 AND p6.uid=t2.id
JOIN t1 p7 ON p7.r=7 AND p7.uid=t2.id
JOIN t1 p8 ON p8.r=8 AND p8.uid=t2.id
) gp_20 ON gp_20.id=t2.id ;
DROP TABLE t1, t2;

View File

@ -967,6 +967,40 @@ SELECT City.Name, Country.Name, Country.PopulationBar FROM City,Country
set join_cache_level=default; set join_cache_level=default;
set join_buffer_size=default; set join_buffer_size=default;
--echo #
--echo # MDEV-17752: Plan changes from hash_index_merge to index_merge with new optimizer defaults
--echo #
set @save_optimizer_use_condition_selectivity=@@optimizer_use_condition_selectivity;
set @save_use_stat_tables=@@use_stat_tables;
set optimizer_use_condition_selectivity=4;
set use_stat_tables='preferably';
use world;
set join_cache_level=4;
CREATE INDEX City_Name ON City(Name);
--disable_result_log
ANALYZE TABLE City, Country;
--enable_result_log
EXPLAIN
SELECT Country.Name, Country.Population, City.Name, City.Population
FROM Country LEFT JOIN City
ON City.Country=Country.Code AND City.Population > 5000000
WHERE Country.Name LIKE 'C%' AND Country.Population > 10000000;
EXPLAIN
SELECT Country.Name, Country.Population, City.Name, City.Population
FROM Country LEFT JOIN City
ON City.Country=Country.Code AND
(City.Population > 5000000 OR City.Name LIKE 'Za%')
WHERE Country.Name LIKE 'C%' AND Country.Population > 10000000;
set @@optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity;
set @@use_stat_tables=@save_use_stat_tables;
set join_cache_level=default;
DROP DATABASE world; DROP DATABASE world;
use test; use test;

View File

@ -1976,7 +1976,7 @@ set @save_join_cache_level= @@join_cache_level;
SET @@join_cache_level = 3; SET @@join_cache_level = 3;
SELECT t1.b1+'0' , t2.b2 + '0' FROM t1 LEFT JOIN t2 ON b1 = b2; SELECT t1.b1+'0' , t2.b2 + '0' FROM t1 LEFT JOIN t2 ON b1 = b2;
DROP TABLE t1, t2; DROP TABLE t1, t2;
set @join_cache_level= @save_join_cache_level; set @@join_cache_level= @save_join_cache_level;
--echo # --echo #
--echo # MDEV-14779: using left join causes incorrect results with materialization and derived tables --echo # MDEV-14779: using left join causes incorrect results with materialization and derived tables
@ -2042,4 +2042,129 @@ DROP TABLE t1,t2;
--echo # end of 5.5 tests --echo # end of 5.5 tests
--echo #
--echo # MDEV-19258: chained right joins all converted to inner joins
--echo #
CREATE TABLE t1 (
id int NOT NULL AUTO_INCREMENT,
timestamp bigint NOT NULL,
modifiedBy varchar(255) DEFAULT NULL,
PRIMARY KEY (id)
);
CREATE TABLE t2 (
id int NOT NULL,
REV int NOT NULL,
REVTYPE tinyint DEFAULT NULL,
profile_id int DEFAULT NULL,
PRIMARY KEY (id,REV)
);
CREATE TABLE t3 (
id int NOT NULL,
REV int NOT NULL,
person_id int DEFAULT NULL,
PRIMARY KEY (id,REV)
);
CREATE TABLE t4 (
id int NOT NULL,
REV int NOT NULL,
PRIMARY KEY (id,REV)
);
INSERT INTO t1 VALUES
(1,1294391193890,'Cxqy$*9.kKeE'),(2,1294643906883,'rE4wqGV0gif@'),
(3,1294643927456,'L?3yt(%dY$Br'),(4,1294644343525,'WH&ObiZ$#2S4'),
(5,1294644616416,'YXnCbt?olUZ0'),(6,1294644954537,'8Npe4!(#lU@k'),
(7,1294645046659,'knc0GhXB1#ib'),(8,1294645183829,'w*oPpVfuS8^m'),
(9,1294645386701,'hwXR@3qVzrbU'),(10,1294645525982,'BeLW*Y9ndP0l'),
(11,1294645627723,'nTegib^)qZ$I'),(12,1294650860266,'u62C^Kzx3wH8'),
(13,1294657613745,'4&BkFjGa!qLg'),(14,1294660627161,')anpt312SCoh'),
(15,1294661023336,'LtJ2PX?*kTmx'),(16,1294662838066,'POGRr@?#ofpl'),
(17,1294663020989,'o.)1EOT2jnF7'),(18,1294663308065,'&TZ0F0LHE6.h'),
(19,1294664900039,'j)kSC%^In$9d'),(20,1294668904556,'97glN50)cAo.'),
(21,1294728056853,'lrKZxmw?I.Ek'),(22,1294728157174,'@P*SRg!pT.q?'),
(23,1294728327099,'W9gPrptF.)8n'),(24,1294728418481,'$q*c^sM&URd#'),
(25,1294728729620,'9*f4&bTPRtHo'),(26,1294728906014,')4VtTEnS7$oI'),
(27,1294732190003,'8dkNSPq2u3AQ'),(28,1294733205065,'SV2N6IoEf438'),
(29,1294741984927,'rBKj.0S^Ey%*'),(30,1294751748352,'j$2DvlBqk)Fw'),
(31,1294753902212,'C$N6OrEw8elz'),(32,1294758120598,'DCSVZw!rnxXq'),
(33,1294761769556,'OTS@QU8a6s5c'),(34,1294816845305,'IUE2stG0D3L5'),
(35,1294816966909,'Xd16yka.9nHe'),(36,1294817116302,'lOQHZpm%!8qb'),
(37,1294817374775,'^&pE3IhNf7ey'),(38,1294817538907,'oEn4#7C0Vhfp'),
(39,1294818482950,'bx54J*O0Va&?'),(40,1294819047024,'J%@a&1.qgdb?'),
(41,1294821826077,'C9kojr$L3Phz'),(42,1294825454458,'gG#BOnM80ZPi'),
(43,1294904129918,'F^!TrjM#zdvc'),(44,1294904254166,'Va&Tb)k0RvlM'),
(45,1294904414964,'dJjq0M6HvhR#'),(46,1294904505784,'nJmxg)ELqY(b'),
(47,1294904602835,'dhF#or$Vge!7'),(48,1294904684728,'?bIh5E3l!0em'),
(49,1294904877898,'Y*WflOdcxnk.'),(50,1294905002390,'*?H!lUgez5A.'),
(51,1294905096043,'wlEIY3n9uz!p'),(52,1294905404621,'T?qv3H6&hlQD'),
(53,1294905603922,'S@Bhys^Ti7bt'),(54,1294905788416,'KR?a5NVukz#l'),
(55,1294905993190,'A*&q4kWhED!o'),(56,1294906205254,'fT0%7z0DF6h*'),
(57,1294906319680,'LhzdW4?ivjR0'),(58,1294906424296,'h0KDlns%U*6T'),
(59,1294906623844,'b$CfB1noI6Ax'),(60,1294911258896,'#T1*LP!3$Oys');
INSERT INTO t2 VALUES
(1,1,0,10209),(1,42480,1,10209),(1,61612,1,10209),(1,257545,1,10209),
(1,385332,1,10209),(1,1687999,1,10209),(3,1,0,10210),(3,617411,2,10210),
(4,11,0,14),(4,95149,1,10211),(4,607890,2,10211),(5,1,0,10212),
(6,1,0,10213),(6,93344,1,10213),(6,295578,1,10213),(6,295579,1,10213),
(6,295644,1,10213),(7,1,0,10214),(7,12,1,7),(7,688796,1,10214),
(7,1140433,1,10214),(7,1715227,1,10214),(8,1,0,10215),(8,74253,1,10215),
(8,93345,1,10215),(8,12,2,2),(9,1,0,10216),(9,93342,1,10216),
(9,122354,1,10216),(9,301499,2,10216),(10,11,0,5),(10,93343,1,10217),
(10,122355,1,10217),(10,123050,1,10217),(10,301500,2,10217),(11,1,0,10218),
(11,87852,1,10218),(11,605499,2,10218),(12,1,0,10219),(12,88024,1,10219),
(12,605892,2,10219),(13,1,0,10220);
INSERT INTO t3 VALUES
(1,1,300003),(1,117548,NULL),(2,1,300003),(2,117548,300006),
(3,1,300153),(3,117548,NULL),(4,1,300153),(4,117548,NULL),
(5,1,300153),(5,117548,NULL),(6,1,300182),(6,117548,NULL),
(7,1,300205),(7,117548,NULL),(8,1,300217),(8,117548,NULL),
(9,1,300290),(9,117548,NULL),(10,1,300290),(10,117548,NULL),
(11,1,300405),(11,117548,NULL),(12,1,300670),(12,117548,NULL),
(13,1,300670),(13,117548,NULL),(14,1,300006),(14,117548,NULL),
(15,1,300671),(15,117548,NULL),(16,1,300732),(16,117548,NULL);
INSERT INTO t4 VALUES
(300000,1),(300001,1),(300003,1),(300004,1),
(300005,1),(300005,688796),(300006,1),(300006,97697),
(300009,1),(300010,1),(300011,1),(300012,1),(300013,1),
(300014,1),(300015,1),(300016,1),(300017,1),(300018,1),
(300019,1),(300020,1),(300021,1),(300022,1),(300023,1),
(300024,1),(300025,1),(300026,1),(300027,1),(300028,1);
let $q1=
SELECT *
FROM t1 INNER JOIN t2 ON t2.REV=t1.id
INNER JOIN t3 ON t3.id=t2.profile_id
INNER JOIN t4 ON t4.id=t3.person_id
WHERE t1.timestamp < 1294664900039 AND t1.timestamp > 1294644616416 AND
t2.REVTYPE=2;
--echo # This should have join order of t2,t3,t4,t1
eval EXPLAIN EXTENDED $q1;
eval $q1;
let $q2=
SELECT *
FROM t1 RIGHT JOIN t2 ON t2.REV=t1.id
RIGHT JOIN t3 ON t3.id=t2.profile_id
RIGHT JOIN t4 ON t4.id=t3.person_id
WHERE t1.timestamp < 1294664900039 AND t1.timestamp > 1294644616416
AND t2.REVTYPE=2;
--echo # This should have join order of t2,t3,t4,t1 with the same plan as above
--echo # because all RIGHT JOIN operations are converted into INNER JOIN
eval EXPLAIN EXTENDED $q2;
eval $q2;
DROP TABLE t1,t2,t3,t4;
--echo # end of 10.1 tests
SET optimizer_switch=@save_optimizer_switch; SET optimizer_switch=@save_optimizer_switch;

View File

@ -2877,6 +2877,8 @@ drop table t1,t2,t3;
--echo # MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT --echo # MDEV-18896: IN subquery in WHERE of a table-less query used for INSERT
--echo # --echo #
set @@optimizer_switch= @subselect_sj_tmp;
create table t1 (a1 varchar(25)); create table t1 (a1 varchar(25));
create table t2 (a2 varchar(25)) ; create table t2 (a2 varchar(25)) ;
insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2); insert into t1 select 'xxx' from dual where 'xxx' in (select a2 from t2);

View File

@ -149,6 +149,7 @@ EOF
load data infile 'mdev8605.txt' into table t1 fields terminated by ','; load data infile 'mdev8605.txt' into table t1 fields terminated by ',';
select * from t1; select * from t1;
drop table t1; drop table t1;
--remove_file $datadir/test/mdev8605.txt
# timestamps (on NULL = NOW()) # timestamps (on NULL = NOW())
create table t1 (a timestamp, b int auto_increment primary key); create table t1 (a timestamp, b int auto_increment primary key);
@ -218,6 +219,7 @@ load data infile 'sep8605.txt' into table t1 fields terminated by ','
(@a,a2,a3,b,c) set a1=100-@a; (@a,a2,a3,b,c) set a1=100-@a;
select 100-a1,a2,a3,b,c from t1; select 100-a1,a2,a3,b,c from t1;
delete from t1; delete from t1;
--remove_file $datadir/test/sep8605.txt
--write_file $datadir/test/fix8605.txt --write_file $datadir/test/fix8605.txt
00012010-11-12 01:02:030010000000000000000 00012010-11-12 01:02:030010000000000000000
@ -231,6 +233,7 @@ set statement timestamp=777777777 for
load data infile 'fix8605.txt' into table t1 fields terminated by ''; load data infile 'fix8605.txt' into table t1 fields terminated by '';
select * from t1; select * from t1;
delete from t1; delete from t1;
--remove_file $datadir/test/fix8605.txt
--write_file $datadir/test/xml8605.txt --write_file $datadir/test/xml8605.txt
<data> <data>
@ -300,6 +303,7 @@ set statement timestamp=777777777 for
load xml infile 'xml8605.txt' into table t1 rows identified by '<row>'; load xml infile 'xml8605.txt' into table t1 rows identified by '<row>';
select * from t1; select * from t1;
drop table t1; drop table t1;
--remove_file $datadir/test/xml8605.txt
# explicit DEFAULT # explicit DEFAULT
create table t1 (a int not null default 5, b int, c int); create table t1 (a int not null default 5, b int, c int);

View File

@ -217,7 +217,7 @@ void *alloc_root(MEM_ROOT *mem_root, size_t length)
DBUG_SET("-d,simulate_out_of_memory"); DBUG_SET("-d,simulate_out_of_memory");
DBUG_RETURN((void*) 0); /* purecov: inspected */ DBUG_RETURN((void*) 0); /* purecov: inspected */
}); });
length= ALIGN_SIZE(length); length= ALIGN_SIZE(length) + REDZONE_SIZE;
if ((*(prev= &mem_root->free)) != NULL) if ((*(prev= &mem_root->free)) != NULL)
{ {
if ((*prev)->left < length && if ((*prev)->left < length &&
@ -265,6 +265,7 @@ void *alloc_root(MEM_ROOT *mem_root, size_t length)
mem_root->used= next; mem_root->used= next;
mem_root->first_block_usage= 0; mem_root->first_block_usage= 0;
} }
point+= REDZONE_SIZE;
TRASH_ALLOC(point, original_length); TRASH_ALLOC(point, original_length);
DBUG_PRINT("exit",("ptr: %p", point)); DBUG_PRINT("exit",("ptr: %p", point));
DBUG_RETURN((void*) point); DBUG_RETURN((void*) point);

View File

@ -1,5 +1,5 @@
/* Copyright (c) 2006, 2016, Oracle and/or its affiliates. /* Copyright (c) 2006, 2016, Oracle and/or its affiliates.
Copyright (c) 2010, 2017, MariaDB Corporation. Copyright (c) 2010, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -566,11 +566,11 @@ extern mysql_mutex_t
LOCK_item_func_sleep, LOCK_status, LOCK_show_status, LOCK_item_func_sleep, LOCK_status, LOCK_show_status,
LOCK_error_log, LOCK_delayed_insert, LOCK_short_uuid_generator, LOCK_error_log, LOCK_delayed_insert, LOCK_short_uuid_generator,
LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone, LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone,
LOCK_slave_list, LOCK_active_mi, LOCK_manager, LOCK_slave_list, LOCK_active_mi, LOCK_manager, LOCK_user_conn,
LOCK_global_system_variables, LOCK_user_conn,
LOCK_prepared_stmt_count, LOCK_error_messages, LOCK_connection_count, LOCK_prepared_stmt_count, LOCK_error_messages, LOCK_connection_count,
LOCK_slave_background; LOCK_slave_background;
extern MYSQL_PLUGIN_IMPORT mysql_mutex_t LOCK_thread_count; extern MYSQL_PLUGIN_IMPORT mysql_mutex_t LOCK_thread_count,
LOCK_global_system_variables;
extern mysql_mutex_t LOCK_start_thread; extern mysql_mutex_t LOCK_start_thread;
#ifdef HAVE_OPENSSL #ifdef HAVE_OPENSSL
extern char* des_key_file; extern char* des_key_file;

View File

@ -1,5 +1,5 @@
/* /*
Copyright (c) 2010, 2015, MariaDB Copyright (c) 2010, 2019, MariaDB
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -28,6 +28,7 @@
#include <my_global.h> #include <my_global.h>
#include "sql_base.h" #include "sql_base.h"
#include "sql_const.h"
#include "sql_select.h" #include "sql_select.h"
#include "filesort.h" #include "filesort.h"
#include "opt_subselect.h" #include "opt_subselect.h"
@ -523,7 +524,7 @@ bool is_materialization_applicable(THD *thd, Item_in_subselect *in_subs,
if (optimizer_flag(thd, OPTIMIZER_SWITCH_MATERIALIZATION) && // 0 if (optimizer_flag(thd, OPTIMIZER_SWITCH_MATERIALIZATION) && // 0
!child_select->is_part_of_union() && // 1 !child_select->is_part_of_union() && // 1
parent_unit->first_select()->leaf_tables.elements && // 2 parent_unit->first_select()->leaf_tables.elements && // 2
child_select->outer_select()->leaf_tables.elements && // 2A child_select->outer_select()->table_list.first && // 2A
subquery_types_allow_materialization(in_subs) && subquery_types_allow_materialization(in_subs) &&
(in_subs->is_top_level_item() || //3 (in_subs->is_top_level_item() || //3
optimizer_flag(thd, optimizer_flag(thd,
@ -1383,8 +1384,8 @@ void get_delayed_table_estimates(TABLE *table,
*startup_cost= item->jtbm_read_time; *startup_cost= item->jtbm_read_time;
/* Calculate cost of scanning the temptable */ /* Calculate cost of scanning the temptable */
double data_size= item->jtbm_record_count * double data_size= COST_MULT(item->jtbm_record_count,
hash_sj_engine->tmp_table->s->reclength; hash_sj_engine->tmp_table->s->reclength);
/* Do like in handler::read_time */ /* Do like in handler::read_time */
*scan_time= data_size/IO_SIZE + 2; *scan_time= data_size/IO_SIZE + 2;
} }
@ -2463,7 +2464,8 @@ bool optimize_semijoin_nests(JOIN *join, table_map all_table_map)
int tableno; int tableno;
double rows= 1.0; double rows= 1.0;
while ((tableno = tm_it.next_bit()) != Table_map_iterator::BITMAP_END) while ((tableno = tm_it.next_bit()) != Table_map_iterator::BITMAP_END)
rows *= join->map2table[tableno]->table->quick_condition_rows; rows= COST_MULT(rows,
join->map2table[tableno]->table->quick_condition_rows);
sjm->rows= MY_MIN(sjm->rows, rows); sjm->rows= MY_MIN(sjm->rows, rows);
} }
memcpy((uchar*) sjm->positions, memcpy((uchar*) sjm->positions,
@ -2576,7 +2578,7 @@ static uint get_tmp_table_rec_length(Ref_ptr_array p_items, uint elements)
static double static double
get_tmp_table_lookup_cost(THD *thd, double row_count, uint row_size) get_tmp_table_lookup_cost(THD *thd, double row_count, uint row_size)
{ {
if (row_count * row_size > thd->variables.max_heap_table_size) if (row_count > thd->variables.max_heap_table_size / (double) row_size)
return (double) DISK_TEMPTABLE_LOOKUP_COST; return (double) DISK_TEMPTABLE_LOOKUP_COST;
else else
return (double) HEAP_TEMPTABLE_LOOKUP_COST; return (double) HEAP_TEMPTABLE_LOOKUP_COST;
@ -2982,8 +2984,11 @@ bool Sj_materialization_picker::check_qep(JOIN *join,
} }
double mat_read_time= prefix_cost.total_cost(); double mat_read_time= prefix_cost.total_cost();
mat_read_time += mat_info->materialization_cost.total_cost() + mat_read_time=
prefix_rec_count * mat_info->lookup_cost.total_cost(); COST_ADD(mat_read_time,
COST_ADD(mat_info->materialization_cost.total_cost(),
COST_MULT(prefix_rec_count,
mat_info->lookup_cost.total_cost())));
/* /*
NOTE: When we pick to use SJM[-Scan] we don't memcpy its POSITION NOTE: When we pick to use SJM[-Scan] we don't memcpy its POSITION
@ -3023,9 +3028,12 @@ bool Sj_materialization_picker::check_qep(JOIN *join,
} }
/* Add materialization cost */ /* Add materialization cost */
prefix_cost += mat_info->materialization_cost.total_cost() + prefix_cost=
prefix_rec_count * mat_info->scan_cost.total_cost(); COST_ADD(prefix_cost,
prefix_rec_count *= mat_info->rows; COST_ADD(mat_info->materialization_cost.total_cost(),
COST_MULT(prefix_rec_count,
mat_info->scan_cost.total_cost())));
prefix_rec_count= COST_MULT(prefix_rec_count, mat_info->rows);
uint i; uint i;
table_map rem_tables= remaining_tables; table_map rem_tables= remaining_tables;
@ -3039,8 +3047,8 @@ bool Sj_materialization_picker::check_qep(JOIN *join,
{ {
best_access_path(join, join->positions[i].table, rem_tables, i, best_access_path(join, join->positions[i].table, rem_tables, i,
disable_jbuf, prefix_rec_count, &curpos, &dummy); disable_jbuf, prefix_rec_count, &curpos, &dummy);
prefix_rec_count *= curpos.records_read; prefix_rec_count= COST_MULT(prefix_rec_count, curpos.records_read);
prefix_cost += curpos.read_time; prefix_cost= COST_ADD(prefix_cost, curpos.read_time);
} }
*strategy= SJ_OPT_MATERIALIZE_SCAN; *strategy= SJ_OPT_MATERIALIZE_SCAN;
@ -3347,16 +3355,18 @@ bool Duplicate_weedout_picker::check_qep(JOIN *join,
for (uint j= first_dupsweedout_table; j <= idx; j++) for (uint j= first_dupsweedout_table; j <= idx; j++)
{ {
POSITION *p= join->positions + j; POSITION *p= join->positions + j;
current_fanout *= p->records_read; current_fanout= COST_MULT(current_fanout, p->records_read);
dups_cost += p->read_time + current_fanout / TIME_FOR_COMPARE; dups_cost= COST_ADD(dups_cost,
COST_ADD(p->read_time,
current_fanout / TIME_FOR_COMPARE));
if (p->table->emb_sj_nest) if (p->table->emb_sj_nest)
{ {
sj_inner_fanout *= p->records_read; sj_inner_fanout= COST_MULT(sj_inner_fanout, p->records_read);
dups_removed_fanout |= p->table->table->map; dups_removed_fanout |= p->table->table->map;
} }
else else
{ {
sj_outer_fanout *= p->records_read; sj_outer_fanout= COST_MULT(sj_outer_fanout, p->records_read);
temptable_rec_size += p->table->table->file->ref_length; temptable_rec_size += p->table->table->file->ref_length;
} }
} }
@ -3375,12 +3385,13 @@ bool Duplicate_weedout_picker::check_qep(JOIN *join,
sj_outer_fanout, sj_outer_fanout,
temptable_rec_size); temptable_rec_size);
double write_cost= join->positions[first_tab].prefix_record_count* double write_cost= COST_MULT(join->positions[first_tab].prefix_record_count,
sj_outer_fanout * one_write_cost; sj_outer_fanout * one_write_cost);
double full_lookup_cost= join->positions[first_tab].prefix_record_count* double full_lookup_cost=
sj_outer_fanout* sj_inner_fanout * COST_MULT(join->positions[first_tab].prefix_record_count,
one_lookup_cost; COST_MULT(sj_outer_fanout,
dups_cost += write_cost + full_lookup_cost; sj_inner_fanout * one_lookup_cost));
dups_cost= COST_ADD(dups_cost, COST_ADD(write_cost, full_lookup_cost));
*read_time= dups_cost; *read_time= dups_cost;
*record_count= prefix_rec_count * sj_outer_fanout; *record_count= prefix_rec_count * sj_outer_fanout;
@ -3527,8 +3538,8 @@ static void recalculate_prefix_record_count(JOIN *join, uint start, uint end)
if (j == join->const_tables) if (j == join->const_tables)
prefix_count= 1.0; prefix_count= 1.0;
else else
prefix_count= join->best_positions[j-1].prefix_record_count * prefix_count= COST_MULT(join->best_positions[j-1].prefix_record_count,
join->best_positions[j-1].records_read; join->best_positions[j-1].records_read);
join->best_positions[j].prefix_record_count= prefix_count; join->best_positions[j].prefix_record_count= prefix_count;
} }
@ -5874,14 +5885,16 @@ bool JOIN::choose_subquery_plan(table_map join_tables)
The cost of executing the subquery and storing its result in an indexed The cost of executing the subquery and storing its result in an indexed
temporary table. temporary table.
*/ */
double materialization_cost= inner_read_time_1 + double materialization_cost= COST_ADD(inner_read_time_1,
write_cost * inner_record_count_1; COST_MULT(write_cost,
inner_record_count_1));
materialize_strategy_cost= materialization_cost + materialize_strategy_cost= COST_ADD(materialization_cost,
outer_lookup_keys * lookup_cost; COST_MULT(outer_lookup_keys,
lookup_cost));
/* C.2 Compute the cost of the IN=>EXISTS strategy. */ /* C.2 Compute the cost of the IN=>EXISTS strategy. */
in_exists_strategy_cost= outer_lookup_keys * inner_read_time_2; in_exists_strategy_cost= COST_MULT(outer_lookup_keys, inner_read_time_2);
/* C.3 Compare the costs and choose the cheaper strategy. */ /* C.3 Compare the costs and choose the cheaper strategy. */
if (materialize_strategy_cost >= in_exists_strategy_cost) if (materialize_strategy_cost >= in_exists_strategy_cost)

View File

@ -236,6 +236,14 @@
#define HEAP_TEMPTABLE_LOOKUP_COST 0.05 #define HEAP_TEMPTABLE_LOOKUP_COST 0.05
#define DISK_TEMPTABLE_LOOKUP_COST 1.0 #define DISK_TEMPTABLE_LOOKUP_COST 1.0
#define COST_MAX (DBL_MAX * (1.0 - DBL_EPSILON))
#define COST_ADD(c,d) (COST_MAX - (d) > (c) ? (c) + (d) : COST_MAX)
#define COST_MULT(c,f) (COST_MAX / (f) > (c) ? (c) * (f) : COST_MAX)
#define MY_CHARSET_BIN_MB_MAXLEN 1 #define MY_CHARSET_BIN_MB_MAXLEN 1
/** Don't pack string keys shorter than this (if PACK_KEYS=1 isn't used). */ /** Don't pack string keys shorter than this (if PACK_KEYS=1 isn't used). */

View File

@ -4530,6 +4530,13 @@ end_with_restore_list:
*/ */
/* Skip first table, which is the table we are inserting in */ /* Skip first table, which is the table we are inserting in */
TABLE_LIST *second_table= first_table->next_local; TABLE_LIST *second_table= first_table->next_local;
/*
This is a hack: this leaves select_lex->table_list in an inconsistent
state as 'elements' does not contain number of elements in the list.
Moreover, if second_table == NULL then 'next' becomes invalid.
TODO: fix it by removing the front element (restoring of it should
be done properly as well)
*/
select_lex->table_list.first= second_table; select_lex->table_list.first= second_table;
select_lex->context.table_list= select_lex->context.table_list=
select_lex->context.first_name_resolution_table= second_table; select_lex->context.first_name_resolution_table= second_table;

View File

@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2016 Oracle and/or its affiliates. /* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
Copyright (c) 2009, 2019 MariaDB Corporation Copyright (c) 2009, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
@ -6514,7 +6514,7 @@ best_access_path(JOIN *join,
else else
tmp= table->file->read_time(key, 1, tmp= table->file->read_time(key, 1,
(ha_rows) MY_MIN(tmp,s->worst_seeks)); (ha_rows) MY_MIN(tmp,s->worst_seeks));
tmp*= record_count; tmp= COST_MULT(tmp, record_count);
} }
} }
else else
@ -6679,18 +6679,18 @@ best_access_path(JOIN *join,
else else
tmp= table->file->read_time(key, 1, tmp= table->file->read_time(key, 1,
(ha_rows) MY_MIN(tmp,s->worst_seeks)); (ha_rows) MY_MIN(tmp,s->worst_seeks));
tmp*= record_count; tmp= COST_MULT(tmp, record_count);
} }
else else
tmp= best_time; // Do nothing tmp= best_time; // Do nothing
} }
tmp += s->startup_cost; tmp= COST_ADD(tmp, s->startup_cost);
loose_scan_opt.check_ref_access_part2(key, start_key, records, tmp); loose_scan_opt.check_ref_access_part2(key, start_key, records, tmp);
} /* not ft_key */ } /* not ft_key */
if (tmp + 0.0001 < best_time - records/(double) TIME_FOR_COMPARE) if (tmp + 0.0001 < best_time - records/(double) TIME_FOR_COMPARE)
{ {
best_time= tmp + records/(double) TIME_FOR_COMPARE; best_time= COST_ADD(tmp, records/(double) TIME_FOR_COMPARE);
best= tmp; best= tmp;
best_records= records; best_records= records;
best_key= start_key; best_key= start_key;
@ -6724,14 +6724,18 @@ best_access_path(JOIN *join,
use_cond_selectivity); use_cond_selectivity);
tmp= s->quick ? s->quick->read_time : s->scan_time(); tmp= s->quick ? s->quick->read_time : s->scan_time();
tmp+= (s->records - rnd_records)/(double) TIME_FOR_COMPARE; double cmp_time= (s->records - rnd_records)/(double) TIME_FOR_COMPARE;
tmp= COST_ADD(tmp, cmp_time);
/* We read the table as many times as join buffer becomes full. */ /* We read the table as many times as join buffer becomes full. */
tmp*= (1.0 + floor((double) cache_record_length(join,idx) *
record_count / double refills= (1.0 + floor((double) cache_record_length(join,idx) *
(double) thd->variables.join_buff_size)); record_count /
best_time= tmp + (double) thd->variables.join_buff_size));
(record_count*join_sel) / TIME_FOR_COMPARE * rnd_records; tmp= COST_MULT(tmp, refills);
best_time= COST_ADD(tmp,
COST_MULT((record_count*join_sel) / TIME_FOR_COMPARE,
rnd_records));
best= tmp; best= tmp;
records= rnd_records; records= rnd_records;
best_key= hj_start_key; best_key= hj_start_key;
@ -6757,7 +6761,8 @@ best_access_path(JOIN *join,
'range' access using index IDX, and the best way to perform 'ref' 'range' access using index IDX, and the best way to perform 'ref'
access is to use the same index IDX, with the same or more key parts. access is to use the same index IDX, with the same or more key parts.
(note: it is not clear how this rule is/should be extended to (note: it is not clear how this rule is/should be extended to
index_merge quick selects) index_merge quick selects). Also if we have a hash join we prefer that
over a table scan
(3) See above note about InnoDB. (3) See above note about InnoDB.
(4) NOT ("FORCE INDEX(...)" is used for table and there is 'ref' access (4) NOT ("FORCE INDEX(...)" is used for table and there is 'ref' access
path, but there is no quick select) path, but there is no quick select)
@ -6773,6 +6778,7 @@ best_access_path(JOIN *join,
be used for cases with small datasets, which is annoying. be used for cases with small datasets, which is annoying.
*/ */
if ((records >= s->found_records || best > s->read_time) && // (1) if ((records >= s->found_records || best > s->read_time) && // (1)
!(best_key && best_key->key == MAX_KEY) && // (2)
!(s->quick && best_key && s->quick->index == best_key->key && // (2) !(s->quick && best_key && s->quick->index == best_key->key && // (2)
best_max_key_part >= s->table->quick_key_parts[best_key->key]) &&// (2) best_max_key_part >= s->table->quick_key_parts[best_key->key]) &&// (2)
!((s->table->file->ha_table_flags() & HA_TABLE_SCAN_ON_INDEX) && // (3) !((s->table->file->ha_table_flags() & HA_TABLE_SCAN_ON_INDEX) && // (3)
@ -6800,9 +6806,9 @@ best_access_path(JOIN *join,
access (see first else-branch below), but we don't take it into access (see first else-branch below), but we don't take it into
account here for range/index_merge access. Find out why this is so. account here for range/index_merge access. Find out why this is so.
*/ */
tmp= record_count * double cmp_time= (s->found_records - rnd_records)/(double) TIME_FOR_COMPARE;
(s->quick->read_time + tmp= COST_MULT(record_count,
(s->found_records - rnd_records)/(double) TIME_FOR_COMPARE); COST_ADD(s->quick->read_time, cmp_time));
loose_scan_opt.check_range_access(join, idx, s->quick); loose_scan_opt.check_range_access(join, idx, s->quick);
} }
@ -6821,16 +6827,15 @@ best_access_path(JOIN *join,
- read the whole table record - read the whole table record
- skip rows which does not satisfy join condition - skip rows which does not satisfy join condition
*/ */
tmp= record_count * double cmp_time= (s->records - rnd_records)/(double) TIME_FOR_COMPARE;
(tmp + tmp= COST_MULT(record_count, COST_ADD(tmp,cmp_time));
(s->records - rnd_records)/(double) TIME_FOR_COMPARE);
} }
else else
{ {
/* We read the table as many times as join buffer becomes full. */ double refills= (1.0 + floor((double) cache_record_length(join,idx) *
tmp*= (1.0 + floor((double) cache_record_length(join,idx) * (record_count /
record_count / (double) thd->variables.join_buff_size)));
(double) thd->variables.join_buff_size)); tmp= COST_MULT(tmp, refills);
/* /*
We don't make full cartesian product between rows in the scanned We don't make full cartesian product between rows in the scanned
table and existing records because we skip all rows from the table and existing records because we skip all rows from the
@ -6838,7 +6843,8 @@ best_access_path(JOIN *join,
we read the table (see flush_cached_records for details). Here we we read the table (see flush_cached_records for details). Here we
take into account cost to read and skip these records. take into account cost to read and skip these records.
*/ */
tmp+= (s->records - rnd_records)/(double) TIME_FOR_COMPARE; double cmp_time= (s->records - rnd_records)/(double) TIME_FOR_COMPARE;
tmp= COST_ADD(tmp, cmp_time);
} }
} }
@ -6849,9 +6855,9 @@ best_access_path(JOIN *join,
tmp give us total cost of using TABLE SCAN tmp give us total cost of using TABLE SCAN
*/ */
if (best == DBL_MAX || if (best == DBL_MAX ||
(tmp + record_count/(double) TIME_FOR_COMPARE*rnd_records < COST_ADD(tmp, record_count/(double) TIME_FOR_COMPARE*rnd_records) <
(best_key->is_for_hash_join() ? best_time : (best_key->is_for_hash_join() ? best_time :
best + record_count/(double) TIME_FOR_COMPARE*records))) COST_ADD(best, record_count/(double) TIME_FOR_COMPARE*records)))
{ {
/* /*
If the table has a range (s->quick is set) make_join_select() If the table has a range (s->quick is set) make_join_select()
@ -7362,9 +7368,10 @@ optimize_straight_join(JOIN *join, table_map join_tables)
join->positions + idx, &loose_scan_pos); join->positions + idx, &loose_scan_pos);
/* compute the cost of the new plan extended with 's' */ /* compute the cost of the new plan extended with 's' */
record_count*= join->positions[idx].records_read; record_count= COST_MULT(record_count, join->positions[idx].records_read);
read_time+= join->positions[idx].read_time + read_time= COST_ADD(read_time,
record_count / (double) TIME_FOR_COMPARE; COST_ADD(join->positions[idx].read_time,
record_count / (double) TIME_FOR_COMPARE));
advance_sj_state(join, join_tables, idx, &record_count, &read_time, advance_sj_state(join, join_tables, idx, &record_count, &read_time,
&loose_scan_pos); &loose_scan_pos);
@ -7554,9 +7561,10 @@ greedy_search(JOIN *join,
swap_variables(JOIN_TAB*, join->best_ref[idx], join->best_ref[best_idx]); swap_variables(JOIN_TAB*, join->best_ref[idx], join->best_ref[best_idx]);
/* compute the cost of the new plan extended with 'best_table' */ /* compute the cost of the new plan extended with 'best_table' */
record_count*= join->positions[idx].records_read; record_count= COST_MULT(record_count, join->positions[idx].records_read);
read_time+= join->positions[idx].read_time + read_time= COST_ADD(read_time,
record_count / (double) TIME_FOR_COMPARE; COST_ADD(join->positions[idx].read_time,
record_count / (double) TIME_FOR_COMPARE));
remaining_tables&= ~(best_table->table->map); remaining_tables&= ~(best_table->table->map);
--size_remain; --size_remain;
@ -7663,11 +7671,13 @@ void JOIN::get_partial_cost_and_fanout(int end_tab_idx,
} }
if (tab->records_read && (cur_table_map & filter_map)) if (tab->records_read && (cur_table_map & filter_map))
{ {
record_count *= tab->records_read; record_count= COST_MULT(record_count, tab->records_read);
read_time += tab->read_time + record_count / (double) TIME_FOR_COMPARE; read_time= COST_ADD(read_time,
COST_ADD(tab->read_time,
record_count / (double) TIME_FOR_COMPARE));
if (tab->emb_sj_nest) if (tab->emb_sj_nest)
sj_inner_fanout *= tab->records_read; sj_inner_fanout= COST_MULT(sj_inner_fanout, tab->records_read);
} }
if (i == last_sj_table) if (i == last_sj_table)
{ {
@ -7705,8 +7715,8 @@ void JOIN::get_prefix_cost_and_fanout(uint n_tables,
{ {
if (best_positions[i].records_read) if (best_positions[i].records_read)
{ {
record_count *= best_positions[i].records_read; record_count= COST_MULT(record_count, best_positions[i].records_read);
read_time += best_positions[i].read_time; read_time= COST_ADD(read_time, best_positions[i].read_time);
} }
} }
*read_time_arg= read_time;// + record_count / TIME_FOR_COMPARE; *read_time_arg= read_time;// + record_count / TIME_FOR_COMPARE;
@ -8267,13 +8277,12 @@ best_extension_by_limited_search(JOIN *join,
best_access_path(join, s, remaining_tables, idx, disable_jbuf, best_access_path(join, s, remaining_tables, idx, disable_jbuf,
record_count, join->positions + idx, &loose_scan_pos); record_count, join->positions + idx, &loose_scan_pos);
/* Compute the cost of extending the plan with 's', avoid overflow */ /* Compute the cost of extending the plan with 's' */
if (position->records_read < DBL_MAX / record_count) current_record_count= COST_MULT(record_count, position->records_read);
current_record_count= record_count * position->records_read; current_read_time=COST_ADD(read_time,
else COST_ADD(position->read_time,
current_record_count= DBL_MAX; current_record_count /
current_read_time=read_time + position->read_time + (double) TIME_FOR_COMPARE));
current_record_count / (double) TIME_FOR_COMPARE;
advance_sj_state(join, remaining_tables, idx, &current_record_count, advance_sj_state(join, remaining_tables, idx, &current_record_count,
&current_read_time, &loose_scan_pos); &current_read_time, &loose_scan_pos);
@ -8355,12 +8364,12 @@ best_extension_by_limited_search(JOIN *join,
if (join->sort_by_table && if (join->sort_by_table &&
join->sort_by_table != join->sort_by_table !=
join->positions[join->const_tables].table->table) join->positions[join->const_tables].table->table)
/* /*
We may have to make a temp table, note that this is only a We may have to make a temp table, note that this is only a
heuristic since we cannot know for sure at this point. heuristic since we cannot know for sure at this point.
Hence it may be wrong. Hence it may be wrong.
*/ */
current_read_time+= current_record_count; current_read_time= COST_ADD(current_read_time, current_record_count);
if (current_read_time < join->best_read) if (current_read_time < join->best_read)
{ {
memcpy((uchar*) join->best_positions, (uchar*) join->positions, memcpy((uchar*) join->best_positions, (uchar*) join->positions,
@ -8678,8 +8687,8 @@ prev_record_reads(POSITION *positions, uint idx, table_map found_ref)
#max_nested_outer_joins=64-1) will not make it any more precise. #max_nested_outer_joins=64-1) will not make it any more precise.
*/ */
if (pos->records_read) if (pos->records_read)
found*= pos->records_read; found= COST_MULT(found, pos->records_read);
} }
} }
return found; return found;
} }
@ -14824,8 +14833,20 @@ simplify_joins(JOIN *join, List<TABLE_LIST> *join_list, COND *conds, bool top,
table->table->maybe_null= FALSE; table->table->maybe_null= FALSE;
table->outer_join= 0; table->outer_join= 0;
if (!(straight_join || table->straight)) if (!(straight_join || table->straight))
table->dep_tables= table->embedding && !table->embedding->sj_subq_pred ? {
table->embedding->dep_tables : 0; table->dep_tables= 0;
TABLE_LIST *embedding= table->embedding;
while (embedding)
{
if (embedding->nested_join->join_list.head()->outer_join)
{
if (!embedding->sj_subq_pred)
table->dep_tables= embedding->dep_tables;
break;
}
embedding= embedding->embedding;
}
}
if (table->on_expr) if (table->on_expr)
{ {
/* Add ON expression to the WHERE or upper-level ON condition. */ /* Add ON expression to the WHERE or upper-level ON condition. */
@ -15348,11 +15369,12 @@ void optimize_wo_join_buffering(JOIN *join, uint first_tab, uint last_tab,
pos= loose_scan_pos; pos= loose_scan_pos;
reopt_remaining_tables &= ~rs->table->map; reopt_remaining_tables &= ~rs->table->map;
rec_count *= pos.records_read; rec_count= COST_MULT(rec_count, pos.records_read);
cost += pos.read_time; cost= COST_ADD(cost, pos.read_time);
if (!rs->emb_sj_nest) if (!rs->emb_sj_nest)
*outer_rec_count *= pos.records_read; *outer_rec_count= COST_MULT(*outer_rec_count, pos.records_read);
} }
join->cur_sj_inner_tables= save_cur_sj_inner_tables; join->cur_sj_inner_tables= save_cur_sj_inner_tables;

View File

@ -2205,8 +2205,8 @@ buf_LRU_old_ratio_update_instance(
buf_pool_t* buf_pool,/*!< in: buffer pool instance */ buf_pool_t* buf_pool,/*!< in: buffer pool instance */
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust) /*!< in: TRUE=adjust the LRU list; bool adjust) /*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
{ {
uint ratio; uint ratio;
@ -2248,8 +2248,8 @@ buf_LRU_old_ratio_update(
/*=====================*/ /*=====================*/
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust) /*!< in: TRUE=adjust the LRU list; bool adjust) /*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
{ {
uint new_ratio = 0; uint new_ratio = 0;

View File

@ -17951,11 +17951,13 @@ innodb_adaptive_hash_index_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
if (*(my_bool*) save) { if (*(my_bool*) save) {
btr_search_enable(); btr_search_enable();
} else { } else {
btr_search_disable(true); btr_search_disable(true);
} }
mysql_mutex_lock(&LOCK_global_system_variables);
} }
#endif /* BTR_CUR_HASH_ADAPT */ #endif /* BTR_CUR_HASH_ADAPT */
@ -17977,7 +17979,9 @@ innodb_cmp_per_index_update(
/* Reset the stats whenever we enable the table /* Reset the stats whenever we enable the table
INFORMATION_SCHEMA.innodb_cmp_per_index. */ INFORMATION_SCHEMA.innodb_cmp_per_index. */
if (!srv_cmp_per_index_enabled && *(my_bool*) save) { if (!srv_cmp_per_index_enabled && *(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
page_zip_reset_stat_per_index(); page_zip_reset_stat_per_index();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
srv_cmp_per_index_enabled = !!(*(my_bool*) save); srv_cmp_per_index_enabled = !!(*(my_bool*) save);
@ -17998,9 +18002,11 @@ innodb_old_blocks_pct_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
innobase_old_blocks_pct = static_cast<uint>( mysql_mutex_unlock(&LOCK_global_system_variables);
buf_LRU_old_ratio_update( uint ratio = buf_LRU_old_ratio_update(*static_cast<const uint*>(save),
*static_cast<const uint*>(save), TRUE)); true);
mysql_mutex_lock(&LOCK_global_system_variables);
innobase_old_blocks_pct = ratio;
} }
/****************************************************************//** /****************************************************************//**
@ -18018,9 +18024,10 @@ innodb_change_buffer_max_size_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
srv_change_buffer_max_size = srv_change_buffer_max_size = *static_cast<const uint*>(save);
(*static_cast<const uint*>(save)); mysql_mutex_unlock(&LOCK_global_system_variables);
ibuf_max_size_update(srv_change_buffer_max_size); ibuf_max_size_update(srv_change_buffer_max_size);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
@ -18063,15 +18070,19 @@ innodb_make_page_dirty(
{ {
mtr_t mtr; mtr_t mtr;
ulong space_id = *static_cast<const ulong*>(save); ulong space_id = *static_cast<const ulong*>(save);
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_space_t* space = fil_space_acquire_silent(space_id); fil_space_t* space = fil_space_acquire_silent(space_id);
if (space == NULL) { if (space == NULL) {
func_exit_no_space:
mysql_mutex_lock(&LOCK_global_system_variables);
return; return;
} }
if (srv_saved_page_number_debug >= space->size) { if (srv_saved_page_number_debug >= space->size) {
func_exit:
fil_space_release(space); fil_space_release(space);
return; goto func_exit_no_space;
} }
mtr.start(); mtr.start();
@ -18092,7 +18103,7 @@ innodb_make_page_dirty(
MLOG_2BYTES, &mtr); MLOG_2BYTES, &mtr);
} }
mtr.commit(); mtr.commit();
fil_space_release(space); goto func_exit;
} }
#endif // UNIV_DEBUG #endif // UNIV_DEBUG
/*************************************************************//** /*************************************************************//**
@ -18742,8 +18753,11 @@ innodb_buffer_pool_evict_update(
{ {
if (const char* op = *static_cast<const char*const*>(save)) { if (const char* op = *static_cast<const char*const*>(save)) {
if (!strcmp(op, "uncompressed")) { if (!strcmp(op, "uncompressed")) {
mysql_mutex_unlock(&LOCK_global_system_variables);
for (uint tries = 0; tries < 10000; tries++) { for (uint tries = 0; tries < 10000; tries++) {
if (innodb_buffer_pool_evict_uncompressed()) { if (innodb_buffer_pool_evict_uncompressed()) {
mysql_mutex_lock(
&LOCK_global_system_variables);
return; return;
} }
@ -19060,6 +19074,8 @@ checkpoint_now_set(
check function */ check function */
{ {
if (*(my_bool*) save) { if (*(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
while (log_sys->last_checkpoint_lsn while (log_sys->last_checkpoint_lsn
+ SIZE_OF_MLOG_CHECKPOINT + SIZE_OF_MLOG_CHECKPOINT
+ (log_sys->append_on_checkpoint != NULL + (log_sys->append_on_checkpoint != NULL
@ -19074,6 +19090,8 @@ checkpoint_now_set(
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
ib::warn() << "Checkpoint set failed " << err; ib::warn() << "Checkpoint set failed " << err;
} }
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
@ -19095,7 +19113,9 @@ buf_flush_list_now_set(
check function */ check function */
{ {
if (*(my_bool*) save) { if (*(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_flush_sync_all_buf_pools(); buf_flush_sync_all_buf_pools();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
@ -19180,7 +19200,9 @@ buffer_pool_dump_now(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_dump_start(); buf_dump_start();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
@ -19203,7 +19225,9 @@ buffer_pool_load_now(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_load_start(); buf_load_start();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
@ -19226,7 +19250,9 @@ buffer_pool_load_abort(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_load_abort(); buf_load_abort();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
@ -19280,88 +19306,63 @@ innodb_log_write_ahead_size_update(
/** Update innodb_status_output or innodb_status_output_locks, /** Update innodb_status_output or innodb_status_output_locks,
which control InnoDB "status monitor" output to the error log. which control InnoDB "status monitor" output to the error log.
@param[out] var_ptr current value @param[out] var current value
@param[in] save to-be-assigned value */ @param[in] save to-be-assigned value */
static static
void void
innodb_status_output_update( innodb_status_output_update(THD*,st_mysql_sys_var*,void*var,const void*save)
/*========================*/
THD* thd __attribute__((unused)),
struct st_mysql_sys_var* var __attribute__((unused)),
void* var_ptr __attribute__((unused)),
const void* save __attribute__((unused)))
{ {
*static_cast<my_bool*>(var_ptr) = *static_cast<const my_bool*>(save); *static_cast<my_bool*>(var) = *static_cast<const my_bool*>(save);
mysql_mutex_unlock(&LOCK_global_system_variables);
/* Wakeup server monitor thread. */ /* Wakeup server monitor thread. */
os_event_set(srv_monitor_event); os_event_set(srv_monitor_event);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_threads.
Update the system variable innodb_encryption_threads */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_threads_update( innodb_encryption_threads_update(THD*,st_mysql_sys_var*,void*,const void*save)
/*=============================*/
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_thread_cnt(*static_cast<const uint*>(save)); fil_crypt_set_thread_cnt(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_rotate_key_age.
Update the system variable innodb_encryption_rotate_key_age */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_rotate_key_age_update( innodb_encryption_rotate_key_age_update(THD*,st_mysql_sys_var*,void*,
/*====================================*/ const void*save)
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_rotate_key_age(*static_cast<const uint*>(save)); fil_crypt_set_rotate_key_age(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_rotation_iops.
Update the system variable innodb_encryption_rotation_iops */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_rotation_iops_update( innodb_encryption_rotation_iops_update(THD*,st_mysql_sys_var*,void*,
/*===================================*/ const void*save)
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_rotation_iops(*static_cast<const uint*>(save)); fil_crypt_set_rotation_iops(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encrypt_tables.
Update the system variable innodb_encrypt_tables*/ @param[in] save to-be-assigned value */
static static
void void
innodb_encrypt_tables_update( innodb_encrypt_tables_update(THD*,st_mysql_sys_var*,void*,const void*save)
/*=========================*/
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_encrypt_tables(*static_cast<const ulong*>(save)); fil_crypt_set_encrypt_tables(*static_cast<const ulong*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/** Update the innodb_log_checksums parameter. /** Update the innodb_log_checksums parameter.
@ -20660,13 +20661,16 @@ innobase_disallow_writes_update(
variable */ variable */
const void* save) /* in: temporary storage */ const void* save) /* in: temporary storage */
{ {
*(my_bool*)var_ptr = *(my_bool*)save; const my_bool val = *static_cast<const my_bool*>(save);
*static_cast<my_bool*>(var_ptr) = val;
ut_a(srv_allow_writes_event); ut_a(srv_allow_writes_event);
if (*(my_bool*)var_ptr) { mysql_mutex_unlock(&LOCK_global_system_variables);
if (val) {
os_event_reset(srv_allow_writes_event); os_event_reset(srv_allow_writes_event);
} else { } else {
os_event_set(srv_allow_writes_event); os_event_set(srv_allow_writes_event);
} }
mysql_mutex_lock(&LOCK_global_system_variables);
} }
static MYSQL_SYSVAR_BOOL(disallow_writes, innobase_disallow_writes, static MYSQL_SYSVAR_BOOL(disallow_writes, innobase_disallow_writes,

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2018, MariaDB Corporation. Copyright (c) 2017, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@ -191,8 +191,8 @@ buf_LRU_old_ratio_update(
/*=====================*/ /*=====================*/
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust);/*!< in: TRUE=adjust the LRU list; bool adjust);/*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
/********************************************************************//** /********************************************************************//**
Update the historical stats that we are collecting for LRU eviction Update the historical stats that we are collecting for LRU eviction

View File

@ -27,7 +27,6 @@ Completed by Sunny Bains and Marko Makela
#include <my_config.h> #include <my_config.h>
#include <log.h> #include <log.h>
#include <sql_class.h> #include <sql_class.h>
#include <math.h> #include <math.h>
#include "row0merge.h" #include "row0merge.h"
@ -50,12 +49,6 @@ Completed by Sunny Bains and Marko Makela
#include "ut0stage.h" #include "ut0stage.h"
#include "fil0crypt.h" #include "fil0crypt.h"
float my_log2f(float n)
{
/* log(n) / log(2) is log2. */
return (float)(log((double)n) / log((double)2));
}
/* Ignore posix_fadvise() on those platforms where it does not exist */ /* Ignore posix_fadvise() on those platforms where it does not exist */
#if defined _WIN32 #if defined _WIN32
# define posix_fadvise(fd, offset, len, advice) /* nothing */ # define posix_fadvise(fd, offset, len, advice) /* nothing */
@ -3193,18 +3186,13 @@ row_merge_sort(
stage->begin_phase_sort(log2(num_runs)); stage->begin_phase_sort(log2(num_runs));
} }
/* Find the number N which 2^N is greater or equal than num_runs */
/* N is merge sort running count */
total_merge_sort_count = (ulint) ceil(my_log2f((float)num_runs));
if(total_merge_sort_count <= 0) {
total_merge_sort_count=1;
}
/* If num_runs are less than 1, nothing to merge */ /* If num_runs are less than 1, nothing to merge */
if (num_runs <= 1) { if (num_runs <= 1) {
DBUG_RETURN(error); DBUG_RETURN(error);
} }
total_merge_sort_count = ulint(ceil(log2(double(num_runs))));
/* "run_offset" records each run's first offset number */ /* "run_offset" records each run's first offset number */
run_offset = (ulint*) ut_malloc_nokey(file->offset * sizeof(ulint)); run_offset = (ulint*) ut_malloc_nokey(file->offset * sizeof(ulint));

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2018, MariaDB Corporation. Copyright (c) 2017, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@ -2408,8 +2408,8 @@ buf_LRU_old_ratio_update_instance(
buf_pool_t* buf_pool,/*!< in: buffer pool instance */ buf_pool_t* buf_pool,/*!< in: buffer pool instance */
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust) /*!< in: TRUE=adjust the LRU list; bool adjust) /*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
{ {
uint ratio; uint ratio;
@ -2447,17 +2447,17 @@ buf_LRU_old_ratio_update_instance(
Updates buf_pool->LRU_old_ratio. Updates buf_pool->LRU_old_ratio.
@return updated old_pct */ @return updated old_pct */
UNIV_INTERN UNIV_INTERN
ulint uint
buf_LRU_old_ratio_update( buf_LRU_old_ratio_update(
/*=====================*/ /*=====================*/
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust) /*!< in: TRUE=adjust the LRU list; bool adjust) /*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
{ {
ulint i; ulint i;
ulint new_ratio = 0; uint new_ratio = 0;
for (i = 0; i < srv_buf_pool_instances; i++) { for (i = 0; i < srv_buf_pool_instances; i++) {
buf_pool_t* buf_pool; buf_pool_t* buf_pool;

View File

@ -17815,11 +17815,13 @@ innodb_adaptive_hash_index_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
if (*(my_bool*) save) { if (*(my_bool*) save) {
btr_search_enable(); btr_search_enable();
} else { } else {
btr_search_disable(); btr_search_disable();
} }
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************//** /****************************************************************//**
@ -17840,7 +17842,9 @@ innodb_cmp_per_index_update(
/* Reset the stats whenever we enable the table /* Reset the stats whenever we enable the table
INFORMATION_SCHEMA.innodb_cmp_per_index. */ INFORMATION_SCHEMA.innodb_cmp_per_index. */
if (!srv_cmp_per_index_enabled && *(my_bool*) save) { if (!srv_cmp_per_index_enabled && *(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
page_zip_reset_stat_per_index(); page_zip_reset_stat_per_index();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
srv_cmp_per_index_enabled = !!(*(my_bool*) save); srv_cmp_per_index_enabled = !!(*(my_bool*) save);
@ -17861,9 +17865,11 @@ innodb_old_blocks_pct_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
innobase_old_blocks_pct = static_cast<uint>( mysql_mutex_unlock(&LOCK_global_system_variables);
buf_LRU_old_ratio_update( uint ratio = buf_LRU_old_ratio_update(*static_cast<const uint*>(save),
*static_cast<const uint*>(save), TRUE)); true);
mysql_mutex_lock(&LOCK_global_system_variables);
innobase_old_blocks_pct = ratio;
} }
/****************************************************************//** /****************************************************************//**
@ -17881,9 +17887,10 @@ innodb_change_buffer_max_size_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
innobase_change_buffer_max_size = innobase_change_buffer_max_size = *static_cast<const uint*>(save);
(*static_cast<const uint*>(save)); mysql_mutex_unlock(&LOCK_global_system_variables);
ibuf_max_size_update(innobase_change_buffer_max_size); ibuf_max_size_update(innobase_change_buffer_max_size);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
@ -17927,6 +17934,7 @@ innodb_make_page_dirty(
{ {
mtr_t mtr; mtr_t mtr;
ulong space_id = *static_cast<const ulong*>(save); ulong space_id = *static_cast<const ulong*>(save);
mysql_mutex_unlock(&LOCK_global_system_variables);
mtr_start(&mtr); mtr_start(&mtr);
@ -17944,6 +17952,7 @@ innodb_make_page_dirty(
MLOG_2BYTES, &mtr); MLOG_2BYTES, &mtr);
} }
mtr_commit(&mtr); mtr_commit(&mtr);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
#endif // UNIV_DEBUG #endif // UNIV_DEBUG
@ -18589,8 +18598,11 @@ innodb_buffer_pool_evict_update(
{ {
if (const char* op = *static_cast<const char*const*>(save)) { if (const char* op = *static_cast<const char*const*>(save)) {
if (!strcmp(op, "uncompressed")) { if (!strcmp(op, "uncompressed")) {
mysql_mutex_unlock(&LOCK_global_system_variables);
for (uint tries = 0; tries < 10000; tries++) { for (uint tries = 0; tries < 10000; tries++) {
if (innodb_buffer_pool_evict_uncompressed()) { if (innodb_buffer_pool_evict_uncompressed()) {
mysql_mutex_lock(
&LOCK_global_system_variables);
return; return;
} }
@ -19127,7 +19139,9 @@ purge_run_now_set(
check function */ check function */
{ {
if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) { if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) {
mysql_mutex_unlock(&LOCK_global_system_variables);
trx_purge_run(); trx_purge_run();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
@ -19150,7 +19164,9 @@ purge_stop_now_set(
check function */ check function */
{ {
if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) { if (*(my_bool*) save && trx_purge_state() != PURGE_STATE_DISABLED) {
mysql_mutex_unlock(&LOCK_global_system_variables);
trx_purge_stop(); trx_purge_stop();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
@ -19172,6 +19188,8 @@ checkpoint_now_set(
check function */ check function */
{ {
if (*(my_bool*) save) { if (*(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
while (log_sys->last_checkpoint_lsn < log_sys->lsn) { while (log_sys->last_checkpoint_lsn < log_sys->lsn) {
log_make_checkpoint_at(LSN_MAX, TRUE); log_make_checkpoint_at(LSN_MAX, TRUE);
fil_flush_file_spaces(FIL_LOG); fil_flush_file_spaces(FIL_LOG);
@ -19185,6 +19203,8 @@ checkpoint_now_set(
"system tablespace at checkpoint err=%s", "system tablespace at checkpoint err=%s",
ut_strerr(err)); ut_strerr(err));
} }
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
@ -19206,8 +19226,10 @@ buf_flush_list_now_set(
check function */ check function */
{ {
if (*(my_bool*) save) { if (*(my_bool*) save) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_flush_list(ULINT_MAX, LSN_MAX, NULL); buf_flush_list(ULINT_MAX, LSN_MAX, NULL);
buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST); buf_flush_wait_batch_end(NULL, BUF_FLUSH_LIST);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
@ -19334,7 +19356,9 @@ buffer_pool_dump_now(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_dump_start(); buf_dump_start();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
@ -19357,7 +19381,9 @@ buffer_pool_load_now(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_load_start(); buf_load_start();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
@ -19380,96 +19406,71 @@ buffer_pool_load_abort(
check function */ check function */
{ {
if (*(my_bool*) save && !srv_read_only_mode) { if (*(my_bool*) save && !srv_read_only_mode) {
mysql_mutex_unlock(&LOCK_global_system_variables);
buf_load_abort(); buf_load_abort();
mysql_mutex_lock(&LOCK_global_system_variables);
} }
} }
/** Update innodb_status_output or innodb_status_output_locks, /** Update innodb_status_output or innodb_status_output_locks,
which control InnoDB "status monitor" output to the error log. which control InnoDB "status monitor" output to the error log.
@param[in] thd thread handle @param[out] var current value
@param[in] var system variable
@param[out] var_ptr current value
@param[in] save to-be-assigned value */ @param[in] save to-be-assigned value */
static static
void void
innodb_status_output_update( innodb_status_output_update(THD*,st_mysql_sys_var*,void*var,const void*save)
/*========================*/
THD* thd __attribute__((unused)),
struct st_mysql_sys_var* var __attribute__((unused)),
void* var_ptr __attribute__((unused)),
const void* save __attribute__((unused)))
{ {
*static_cast<my_bool*>(var_ptr) = *static_cast<const my_bool*>(save); *static_cast<my_bool*>(var) = *static_cast<const my_bool*>(save);
mysql_mutex_unlock(&LOCK_global_system_variables);
/* Wakeup server monitor thread. */ /* Wakeup server monitor thread. */
os_event_set(srv_monitor_event); os_event_set(srv_monitor_event);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_threads.
Update the system variable innodb_encryption_threads */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_threads_update( innodb_encryption_threads_update(THD*,st_mysql_sys_var*,void*,const void*save)
/*=============================*/
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_thread_cnt(*static_cast<const uint*>(save)); fil_crypt_set_thread_cnt(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_rotate_key_age.
Update the system variable innodb_encryption_rotate_key_age */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_rotate_key_age_update( innodb_encryption_rotate_key_age_update(THD*,st_mysql_sys_var*,void*,
/*====================================*/ const void*save)
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_rotate_key_age(*static_cast<const uint*>(save)); fil_crypt_set_rotate_key_age(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encryption_rotation_iops.
Update the system variable innodb_encryption_rotation_iops */ @param[in] save to-be-assigned value */
static static
void void
innodb_encryption_rotation_iops_update( innodb_encryption_rotation_iops_update(THD*,st_mysql_sys_var*,void*,
/*===================================*/ const void*save)
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_rotation_iops(*static_cast<const uint*>(save)); fil_crypt_set_rotation_iops(*static_cast<const uint*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
/****************************************************************** /** Update the system variable innodb_encrypt_tables.
Update the system variable innodb_encrypt_tables*/ @param[in] save to-be-assigned value */
static static
void void
innodb_encrypt_tables_update( innodb_encrypt_tables_update(THD*,st_mysql_sys_var*,void*,const void*save)
/*=========================*/
THD* thd, /*!< in: thread handle */
struct st_mysql_sys_var* var, /*!< in: pointer to
system variable */
void* var_ptr,/*!< out: where the
formal string goes */
const void* save) /*!< in: immediate result
from check function */
{ {
mysql_mutex_unlock(&LOCK_global_system_variables);
fil_crypt_set_encrypt_tables(*static_cast<const ulong*>(save)); fil_crypt_set_encrypt_tables(*static_cast<const ulong*>(save));
mysql_mutex_lock(&LOCK_global_system_variables);
} }
static SHOW_VAR innodb_status_variables_export[]= { static SHOW_VAR innodb_status_variables_export[]= {
@ -20907,12 +20908,15 @@ innobase_disallow_writes_update(
variable */ variable */
const void* save) /* in: temporary storage */ const void* save) /* in: temporary storage */
{ {
*(my_bool*)var_ptr = *(my_bool*)save; const my_bool val = *static_cast<const my_bool*>(save);
*static_cast<my_bool*>(var_ptr) = val;
ut_a(srv_allow_writes_event); ut_a(srv_allow_writes_event);
if (*(my_bool*)var_ptr) mysql_mutex_unlock(&LOCK_global_system_variables);
if (val)
os_event_reset(srv_allow_writes_event); os_event_reset(srv_allow_writes_event);
else else
os_event_set(srv_allow_writes_event); os_event_set(srv_allow_writes_event);
mysql_mutex_lock(&LOCK_global_system_variables);
} }
static MYSQL_SYSVAR_BOOL(disallow_writes, innobase_disallow_writes, static MYSQL_SYSVAR_BOOL(disallow_writes, innobase_disallow_writes,

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2018, MariaDB Corporation. Copyright (c) 2017, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under 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 the terms of the GNU General Public License as published by the Free Software
@ -208,13 +208,13 @@ buf_LRU_make_block_old(
Updates buf_pool->LRU_old_ratio. Updates buf_pool->LRU_old_ratio.
@return updated old_pct */ @return updated old_pct */
UNIV_INTERN UNIV_INTERN
ulint uint
buf_LRU_old_ratio_update( buf_LRU_old_ratio_update(
/*=====================*/ /*=====================*/
uint old_pct,/*!< in: Reserve this percentage of uint old_pct,/*!< in: Reserve this percentage of
the buffer pool for "old" blocks. */ the buffer pool for "old" blocks. */
ibool adjust);/*!< in: TRUE=adjust the LRU list; bool adjust);/*!< in: true=adjust the LRU list;
FALSE=just assign buf_pool->LRU_old_ratio false=just assign buf_pool->LRU_old_ratio
during the initialization of InnoDB */ during the initialization of InnoDB */
/********************************************************************//** /********************************************************************//**
Update the historical stats that we are collecting for LRU eviction Update the historical stats that we are collecting for LRU eviction

View File

@ -27,6 +27,7 @@ Completed by Sunny Bains and Marko Makela
#include <my_config.h> #include <my_config.h>
#include <log.h> #include <log.h>
#include <sql_class.h> #include <sql_class.h>
#include <math.h>
#include "row0merge.h" #include "row0merge.h"
#include "row0ext.h" #include "row0ext.h"
@ -42,15 +43,8 @@ Completed by Sunny Bains and Marko Makela
#include "row0import.h" #include "row0import.h"
#include "handler0alter.h" #include "handler0alter.h"
#include "ha_prototypes.h" #include "ha_prototypes.h"
#include "math.h" /* log2() */
#include "fil0crypt.h" #include "fil0crypt.h"
float my_log2f(float n)
{
/* log(n) / log(2) is log2. */
return (float)(log((double)n) / log((double)2));
}
/* Ignore posix_fadvise() on those platforms where it does not exist */ /* Ignore posix_fadvise() on those platforms where it does not exist */
#if defined __WIN__ #if defined __WIN__
# define posix_fadvise(fd, offset, len, advice) /* nothing */ # define posix_fadvise(fd, offset, len, advice) /* nothing */
@ -2516,18 +2510,13 @@ row_merge_sort(
/* Record the number of merge runs we need to perform */ /* Record the number of merge runs we need to perform */
num_runs = file->offset; num_runs = file->offset;
/* Find the number N which 2^N is greater or equal than num_runs */
/* N is merge sort running count */
total_merge_sort_count = (ulint) ceil(my_log2f(num_runs));
if(total_merge_sort_count <= 0) {
total_merge_sort_count=1;
}
/* If num_runs are less than 1, nothing to merge */ /* If num_runs are less than 1, nothing to merge */
if (num_runs <= 1) { if (num_runs <= 1) {
DBUG_RETURN(error); DBUG_RETURN(error);
} }
total_merge_sort_count = ceil(log2f(num_runs));
/* "run_offset" records each run's first offset number */ /* "run_offset" records each run's first offset number */
run_offset = (ulint*) mem_alloc(file->offset * sizeof(ulint)); run_offset = (ulint*) mem_alloc(file->offset * sizeof(ulint));