mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Fixed bug mdev-5204.
Always use the value of table::file->stats.records when checking whether a table with HA_STATS_RECORDS_IS_EXACT flag contains not more than 1 record.
This commit is contained in:
@ -381,3 +381,39 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# Bug mdev-5204: invalid impossible where after reading const tables
|
||||||
|
# when use_stat_tables = 'preferably'
|
||||||
|
#
|
||||||
|
set use_stat_tables = 'preferably';
|
||||||
|
CREATE TABLE t1 (id int PRIMARY KEY) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status OK
|
||||||
|
CREATE TABLE t2 (name char(3)) ENGINE=MyISAM;
|
||||||
|
ANALYZE TABLE t2;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t2 analyze status Table is already up to date
|
||||||
|
INSERT INTO t2 VALUES ('USA'),('AUS');
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
id name
|
||||||
|
1 AUS
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 Using index
|
||||||
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 0 Using where
|
||||||
|
ANALYZE TABLE t2;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t2 analyze status OK
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
id name
|
||||||
|
1 AUS
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 Using index
|
||||||
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
@ -408,5 +408,41 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
#
|
||||||
|
# Bug mdev-5204: invalid impossible where after reading const tables
|
||||||
|
# when use_stat_tables = 'preferably'
|
||||||
|
#
|
||||||
|
set use_stat_tables = 'preferably';
|
||||||
|
CREATE TABLE t1 (id int PRIMARY KEY) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 analyze status OK
|
||||||
|
CREATE TABLE t2 (name char(3)) ENGINE=MyISAM;
|
||||||
|
ANALYZE TABLE t2;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t2 analyze status Table is already up to date
|
||||||
|
INSERT INTO t2 VALUES ('USA'),('AUS');
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
id name
|
||||||
|
1 AUS
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 Using index
|
||||||
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 0 Using where
|
||||||
|
ANALYZE TABLE t2;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t2 analyze status OK
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
id name
|
||||||
|
1 AUS
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 Using index
|
||||||
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
set optimizer_switch=@save_optimizer_switch_for_stat_tables_test;
|
set optimizer_switch=@save_optimizer_switch_for_stat_tables_test;
|
||||||
SET SESSION STORAGE_ENGINE=DEFAULT;
|
SET SESSION STORAGE_ENGINE=DEFAULT;
|
||||||
|
@ -205,3 +205,31 @@ DROP TABLE t1;
|
|||||||
|
|
||||||
set use_stat_tables=@save_use_stat_tables;
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug mdev-5204: invalid impossible where after reading const tables
|
||||||
|
--echo # when use_stat_tables = 'preferably'
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
set use_stat_tables = 'preferably';
|
||||||
|
|
||||||
|
CREATE TABLE t1 (id int PRIMARY KEY) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
ANALYZE TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t2 (name char(3)) ENGINE=MyISAM;
|
||||||
|
ANALYZE TABLE t2;
|
||||||
|
INSERT INTO t2 VALUES ('USA'),('AUS');
|
||||||
|
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
|
||||||
|
ANALYZE TABLE t2;
|
||||||
|
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 STRAIGHT_JOIN t2 WHERE name IN ( 'AUS','YEM' ) AND id = 1;
|
||||||
|
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
set use_stat_tables=@save_use_stat_tables;
|
||||||
|
@ -3691,7 +3691,7 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
|
|||||||
// All dep. must be constants
|
// All dep. must be constants
|
||||||
if (s->dependent & ~(found_const_table_map))
|
if (s->dependent & ~(found_const_table_map))
|
||||||
continue;
|
continue;
|
||||||
if (table->stat_records() <= 1L &&
|
if (table->file->stats.records <= 1L &&
|
||||||
(table->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT) &&
|
(table->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT) &&
|
||||||
!table->pos_in_table_list->embedding &&
|
!table->pos_in_table_list->embedding &&
|
||||||
!((outer_join & table->map) &&
|
!((outer_join & table->map) &&
|
||||||
|
Reference in New Issue
Block a user