mirror of
https://github.com/MariaDB/server.git
synced 2025-04-14 11:15:34 +02:00
MDEV-6519: Assertion `join->best_read < double(...)' failed after adding a key to a TokuDB table...
- calculate_cond_selectivity_for_table() should handle the case where index statistics is not available (zeros are returned in rec_per_key)
This commit is contained in:
parent
6871731053
commit
1b960d9fd6
3 changed files with 74 additions and 1 deletions
|
@ -3547,7 +3547,19 @@ bool calculate_cond_selectivity_for_table(THD *thd, TABLE *table, Item *cond)
|
|||
*/
|
||||
double f1= key_info->actual_rec_per_key(i-1);
|
||||
double f2= key_info->actual_rec_per_key(i);
|
||||
table->cond_selectivity*= f1 / f2;
|
||||
double selectivity_mult;
|
||||
if (f1 > 0 && f2 > 0)
|
||||
selectivity_mult= f1 / f2;
|
||||
else
|
||||
{
|
||||
/*
|
||||
No statistics available, assume the selectivity is proportional
|
||||
to the number of key parts.
|
||||
(i=0 means 1 keypart, i=1 means 2 keyparts, so use i+1)
|
||||
*/
|
||||
selectivity_mult= ((double)(i+1)) / i;
|
||||
}
|
||||
table->cond_selectivity*= selectivity_mult;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
28
storage/tokudb/mysql-test/tokudb_mariadb/r/mdev6519.result
Normal file
28
storage/tokudb/mysql-test/tokudb_mariadb/r/mdev6519.result
Normal file
|
@ -0,0 +1,28 @@
|
|||
drop table if exists t1;
|
||||
SET @tmp_ust= @@use_stat_tables;
|
||||
SET @tmp_oucs= @@optimizer_use_condition_selectivity;
|
||||
SET use_stat_tables = PREFERABLY;
|
||||
SET optimizer_use_condition_selectivity = 2;
|
||||
CREATE TABLE t1 (
|
||||
code CHAR(2),
|
||||
name VARCHAR(32),
|
||||
population INT,
|
||||
house_seats TINYINT,
|
||||
PRIMARY KEY(code),
|
||||
KEY (house_seats)
|
||||
) ENGINE=TokuDB;
|
||||
INSERT INTO t1 VALUES ('AL','Alabama',4833722,7),('AK','Alaska',735132,1);
|
||||
ANALYZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status Engine-independent statistics collected
|
||||
test.t1 analyze status OK
|
||||
ALTER TABLE t1 ADD KEY (name(4),house_seats);
|
||||
SELECT * FROM t1 WHERE
|
||||
population BETWEEN 1000000 AND 2000000
|
||||
AND name LIKE 'New %'
|
||||
AND house_seats IN (1, 2, 3)
|
||||
AND code IN ('NJ', 'NM');
|
||||
code name population house_seats
|
||||
drop table t1;
|
||||
SET use_stat_tables = @tmp_ust;
|
||||
SET optimizer_use_condition_selectivity = @tmp_oucs;
|
33
storage/tokudb/mysql-test/tokudb_mariadb/t/mdev6519.test
Normal file
33
storage/tokudb/mysql-test/tokudb_mariadb/t/mdev6519.test
Normal file
|
@ -0,0 +1,33 @@
|
|||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
SET @tmp_ust= @@use_stat_tables;
|
||||
SET @tmp_oucs= @@optimizer_use_condition_selectivity;
|
||||
|
||||
SET use_stat_tables = PREFERABLY;
|
||||
SET optimizer_use_condition_selectivity = 2;
|
||||
|
||||
CREATE TABLE t1 (
|
||||
code CHAR(2),
|
||||
name VARCHAR(32),
|
||||
population INT,
|
||||
house_seats TINYINT,
|
||||
PRIMARY KEY(code),
|
||||
KEY (house_seats)
|
||||
) ENGINE=TokuDB;
|
||||
|
||||
INSERT INTO t1 VALUES ('AL','Alabama',4833722,7),('AK','Alaska',735132,1);
|
||||
ANALYZE TABLE t1;
|
||||
ALTER TABLE t1 ADD KEY (name(4),house_seats);
|
||||
|
||||
SELECT * FROM t1 WHERE
|
||||
population BETWEEN 1000000 AND 2000000
|
||||
AND name LIKE 'New %'
|
||||
AND house_seats IN (1, 2, 3)
|
||||
AND code IN ('NJ', 'NM');
|
||||
|
||||
drop table t1;
|
||||
SET use_stat_tables = @tmp_ust;
|
||||
SET optimizer_use_condition_selectivity = @tmp_oucs;
|
||||
|
Loading…
Add table
Reference in a new issue