Merge 5.5 into 10.1

This commit is contained in:
Marko Mäkelä 2019-05-28 11:25:45 +03:00
commit bf8fe324d2
12 changed files with 802 additions and 91 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}")

View File

@ -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 */ #endif /* HAVE_VALGRIND */
#ifndef DBUG_OFF #ifndef DBUG_OFF
@ -55,3 +61,5 @@ https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning */
#endif #endif
#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

@ -2651,3 +2651,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

@ -3189,6 +3189,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

@ -3203,6 +3203,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

@ -1934,3 +1934,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

@ -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

@ -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) 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"
@ -522,7 +523,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;
} }
@ -2467,7 +2468,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,
@ -2581,7 +2583,7 @@ static uint get_tmp_table_rec_length(Item **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;
@ -2987,8 +2989,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
@ -3028,9 +3033,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;
@ -3044,8 +3052,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;
@ -3352,16 +3360,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;
} }
} }
@ -3380,12 +3390,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;
@ -3532,8 +3543,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;
} }
@ -5882,14 +5893,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

@ -234,6 +234,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

@ -4022,6 +4022,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, 2018 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
@ -6153,7 +6153,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
@ -6318,18 +6318,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;
@ -6363,14 +6363,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) *
double refills= (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));
best_time= tmp + tmp= COST_MULT(tmp, refills);
(record_count*join_sel) / TIME_FOR_COMPARE * rnd_records; 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;
@ -6441,9 +6445,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);
} }
@ -6462,16 +6466,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
@ -6479,7 +6482,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);
} }
} }
@ -6490,9 +6494,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()
@ -7021,9 +7025,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);
@ -7213,9 +7218,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;
@ -7322,10 +7328,12 @@ 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)
@ -7364,8 +7372,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;
@ -7926,13 +7934,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);
@ -8019,7 +8026,7 @@ best_extension_by_limited_search(JOIN *join,
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,
@ -8063,11 +8070,11 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
DBUG_PRINT("best",("read_time: %g record_count: %g",read_time, DBUG_PRINT("best",("read_time: %g record_count: %g",read_time,
record_count)); record_count));
read_time+=record_count/(double) TIME_FOR_COMPARE; read_time= COST_ADD(read_time, record_count/(double) TIME_FOR_COMPARE);
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)
read_time+=record_count; // We have to make a temp table read_time= COST_ADD(read_time, record_count); // We have to make a temp table
if (read_time < join->best_read) if (read_time < join->best_read)
{ {
memcpy((uchar*) join->best_positions,(uchar*) join->positions, memcpy((uchar*) join->best_positions,(uchar*) join->positions,
@ -8076,7 +8083,8 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
} }
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
if (read_time+record_count/(double) TIME_FOR_COMPARE >= join->best_read) if (COST_ADD(read_time, record_count/(double) TIME_FOR_COMPARE)
>= join->best_read)
DBUG_RETURN(FALSE); /* Found better before */ DBUG_RETURN(FALSE); /* Found better before */
JOIN_TAB *s; JOIN_TAB *s;
@ -8098,8 +8106,8 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
Go to the next level only if there hasn't been a better key on Go to the next level only if there hasn't been a better key on
this level! This will cut down the search for a lot simple cases! this level! This will cut down the search for a lot simple cases!
*/ */
double current_record_count=record_count*records; double current_record_count= COST_MULT(record_count, records);
double current_read_time=read_time+best; double current_read_time= COST_ADD(read_time, best);
advance_sj_state(join, rest_tables, idx, &current_record_count, advance_sj_state(join, rest_tables, idx, &current_record_count,
&current_read_time, &loose_scan_pos); &current_read_time, &loose_scan_pos);
@ -8436,7 +8444,7 @@ 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;
@ -15171,11 +15179,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;