From ef5bb0814a2fe9093f48ed155b2cf179a8fd14c9 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Wed, 22 Feb 2023 12:11:55 +0300 Subject: [PATCH] MDEV-30693: Assertion `dbl_records <= s->records' failed in apply_selectivity_for_table on SELECT The crash happened due to rows=2 vs rows=1 difference between how the estimate of number of rows in a derived table is computed in TABLE_LIST::fetch_number_of_rows() and JOIN::add_keyuses_for_splitting(). Made JOIN::add_keyuses_for_splitting() use the result of computations in TABLE_LIST::fetch_number_of_rows(). --- mysql-test/main/selectivity_innodb.result | 9 +++++++++ mysql-test/main/selectivity_innodb.test | 9 +++++++++ sql/opt_split.cc | 7 ++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/selectivity_innodb.result b/mysql-test/main/selectivity_innodb.result index a147bdffc0f..9d6ac0b61ba 100644 --- a/mysql-test/main/selectivity_innodb.result +++ b/mysql-test/main/selectivity_innodb.result @@ -2322,5 +2322,14 @@ b 9 DROP TABLE t; # +# MDEV-30693: Assertion `dbl_records <= s->records' failed in apply_selectivity_for_table on SELECT +# +set @tmp_oucs= @@optimizer_use_condition_selectivity; +CREATE TABLE t1 (c INT KEY) ENGINE=InnoDB; +SELECT * FROM (SELECT * FROM t1) a JOIN (SELECT * FROM (SELECT * FROM t1 GROUP BY c) d WHERE c>1) b ON a.c=b.c; +c c +DROP TABLE t1; +SET optimizer_use_condition_selectivity=1; +# # End of 11.0 tests # diff --git a/mysql-test/main/selectivity_innodb.test b/mysql-test/main/selectivity_innodb.test index dc06287a1f9..efdb3c1853b 100644 --- a/mysql-test/main/selectivity_innodb.test +++ b/mysql-test/main/selectivity_innodb.test @@ -282,6 +282,15 @@ SELECT b FROM t WHERE a > 'a' GROUP BY b HAVING b >= 6 OR b <= 0; # Cleanup DROP TABLE t; +--echo # +--echo # MDEV-30693: Assertion `dbl_records <= s->records' failed in apply_selectivity_for_table on SELECT +--echo # +set @tmp_oucs= @@optimizer_use_condition_selectivity; +CREATE TABLE t1 (c INT KEY) ENGINE=InnoDB; +SELECT * FROM (SELECT * FROM t1) a JOIN (SELECT * FROM (SELECT * FROM t1 GROUP BY c) d WHERE c>1) b ON a.c=b.c; +DROP TABLE t1; +SET optimizer_use_condition_selectivity=1; + --echo # --echo # End of 11.0 tests --echo # diff --git a/sql/opt_split.cc b/sql/opt_split.cc index 99082813d7f..f2d536cd47b 100644 --- a/sql/opt_split.cc +++ b/sql/opt_split.cc @@ -741,7 +741,12 @@ void JOIN::add_keyuses_for_splitting() if (ext_keyuses_for_splitting->push(keyuse_ext_end)) goto err; - spl_opt_info->unsplit_card= join_record_count; + /* + Use the number of rows that was computed by + TABLE_LIST::fetch_number_of_rows(): + */ + spl_opt_info->unsplit_card= + rows2double(select_lex->master_unit()->derived->table->stat_records()); rec_len= table->s->rec_buff_length;