Commit 301fd687 authored by Sergei Petrunia's avatar Sergei Petrunia

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().
parent d61bc94f
...@@ -2322,5 +2322,14 @@ b ...@@ -2322,5 +2322,14 @@ b
9 9
DROP TABLE t; 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 # End of 11.0 tests
# #
...@@ -282,6 +282,15 @@ SELECT b FROM t WHERE a > 'a' GROUP BY b HAVING b >= 6 OR b <= 0; ...@@ -282,6 +282,15 @@ SELECT b FROM t WHERE a > 'a' GROUP BY b HAVING b >= 6 OR b <= 0;
# Cleanup # Cleanup
DROP TABLE t; 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 #
--echo # End of 11.0 tests --echo # End of 11.0 tests
--echo # --echo #
...@@ -741,7 +741,12 @@ void JOIN::add_keyuses_for_splitting() ...@@ -741,7 +741,12 @@ void JOIN::add_keyuses_for_splitting()
if (ext_keyuses_for_splitting->push(keyuse_ext_end)) if (ext_keyuses_for_splitting->push(keyuse_ext_end))
goto err; 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=
select_lex->master_unit()->derived->table->stat_records();
rec_len= table->s->rec_buff_length; rec_len= table->s->rec_buff_length;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment