summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Petrunia <sergey@mariadb.com>2023-05-05 11:16:23 +0300
committerSergei Petrunia <sergey@mariadb.com>2023-05-05 11:16:23 +0300
commit2594da7a33580bf03590502a011679c878487d0c (patch)
tree17e66bbb18d268b33055612ba00144d187e2fa88
parent7973ffde0fede83049a1d611c379b9ee61dea9c9 (diff)
downloadmariadb-git-2594da7a33580bf03590502a011679c878487d0c.tar.gz
MDEV-31194: Server crash or assertion failure with join_cache_level=4mariadb-10.4.29
The problem, introduced in patch for MDEV-26301: When check_join_cache_usage() decides not to use join buffer, it must adjust the access method accordingly. For BNL-H joins this means switching from pseudo-"ref access"(with index=MAX_KEY) to some other access method. Failing to do this will cause assertions down the line when code that is not aware of BNL-H will try to initialize index use for ref access with index=MAX_KEY. The fix is to follow the regular code path to disable the join buffer for the join_tab ("goto no_join_cache") instead of just returning from check_join_cache_usage().
-rw-r--r--mysql-test/main/derived_split_innodb.result16
-rw-r--r--mysql-test/main/derived_split_innodb.test23
-rw-r--r--sql/sql_select.cc2
3 files changed, 40 insertions, 1 deletions
diff --git a/mysql-test/main/derived_split_innodb.result b/mysql-test/main/derived_split_innodb.result
index a2dd1470d15..736e6a2c020 100644
--- a/mysql-test/main/derived_split_innodb.result
+++ b/mysql-test/main/derived_split_innodb.result
@@ -794,4 +794,20 @@ a b a b a b grp_id count(*)
5 5 5 2 5 3 5 100
drop table t1,t2,t3;
drop table t10, t11;
+#
+# MDEV-31194: Server crash or assertion failure with join_cache_level=4
+# (a followup to the above bug, MDEV-26301)
+#
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES (3),(4);
+CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=Aria;
+INSERT INTO t2 VALUES (1),(2);
+set @tmp1= @@optimizer_switch, @tmp2= @@join_cache_level;
+set
+optimizer_switch= 'derived_with_keys=off',
+join_cache_level= 4;
+SELECT t1.* FROM t1 JOIN (SELECT id, COUNT(*) FROM t2 GROUP BY id) sq ON sq.id= t1.a;
+a
+set optimizer_switch= @tmp1, join_cache_level= @tmp2;
+DROP TABLE t1, t2;
# End of 10.4 tests
diff --git a/mysql-test/main/derived_split_innodb.test b/mysql-test/main/derived_split_innodb.test
index a26c9af4e64..b8dd5ad20e1 100644
--- a/mysql-test/main/derived_split_innodb.test
+++ b/mysql-test/main/derived_split_innodb.test
@@ -439,4 +439,27 @@ eval $q;
drop table t1,t2,t3;
drop table t10, t11;
+
+--echo #
+--echo # MDEV-31194: Server crash or assertion failure with join_cache_level=4
+--echo # (a followup to the above bug, MDEV-26301)
+--echo #
+CREATE TABLE t1 (a INT);
+INSERT INTO t1 VALUES (3),(4);
+
+CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=Aria;
+INSERT INTO t2 VALUES (1),(2);
+
+set @tmp1= @@optimizer_switch, @tmp2= @@join_cache_level;
+set
+ optimizer_switch= 'derived_with_keys=off',
+ join_cache_level= 4;
+
+SELECT t1.* FROM t1 JOIN (SELECT id, COUNT(*) FROM t2 GROUP BY id) sq ON sq.id= t1.a;
+
+set optimizer_switch= @tmp1, join_cache_level= @tmp2;
+
+# Cleanup
+DROP TABLE t1, t2;
+
--echo # End of 10.4 tests
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 5e2ce06add7..bfe17bb43e1 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -12873,7 +12873,7 @@ uint check_join_cache_usage(JOIN_TAB *tab,
join->return_tab= 0;
if (tab->no_forced_join_cache)
- return 0;
+ goto no_join_cache;
/*
Don't use join cache if @@join_cache_level==0 or this table is the first