Fixed crash in is_stat_table() when using hash joins.
Other usage if persistent statistics is checking 'stats_is_read' in caller, which is why this was not noticed earlier. Other things: - Simplified no_stat_values_provided
This commit is contained in:
parent
6991b1c47c
commit
a1b6befc78
@ -417,5 +417,31 @@ test t1 B 1 NULL
|
|||||||
test t1 B 2 NULL
|
test t1 B 2 NULL
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
|
# Crash inis_eits_usable()
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a int) ENGINE=MyISAM;
|
||||||
|
CREATE TABLE t2 (b int) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 (a) VALUES (4), (6);
|
||||||
|
INSERT INTO t2 (b) VALUES (0), (8);
|
||||||
|
set @save_join_cache_level=@@join_cache_level;
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET join_cache_level=3;
|
||||||
|
SET optimizer_switch='join_cache_hashed=on';
|
||||||
|
SET optimizer_switch='join_cache_bka=on';
|
||||||
|
set optimizer_switch='hash_join_cardinality=on';
|
||||||
|
select benchmark(1,1);
|
||||||
|
benchmark(1,1)
|
||||||
|
0
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1, t2 WHERE b=a;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
1 SIMPLE t2 hash_ALL NULL #hash#$hj 5 test.t1.a 2 Using where; Using join buffer (flat, BNLH join)
|
||||||
|
SELECT * FROM t1, t2 WHERE b=a;
|
||||||
|
a b
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
set @@optimizer_switch=@save_optimizer_switch;
|
||||||
|
set @@join_cache_level=@save_join_cache_level;
|
||||||
|
#
|
||||||
# End of 10.6 tests
|
# End of 10.6 tests
|
||||||
#
|
#
|
||||||
|
@ -269,6 +269,33 @@ alter ignore table t1 rename key `b` to `B`, LOCK=shared;
|
|||||||
select * from mysql.index_stats where table_name= "t1";
|
select * from mysql.index_stats where table_name= "t1";
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Crash inis_eits_usable()
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a int) ENGINE=MyISAM;
|
||||||
|
|
||||||
|
CREATE TABLE t2 (b int) ENGINE=MyISAM;
|
||||||
|
|
||||||
|
INSERT INTO t1 (a) VALUES (4), (6);
|
||||||
|
INSERT INTO t2 (b) VALUES (0), (8);
|
||||||
|
|
||||||
|
set @save_join_cache_level=@@join_cache_level;
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET join_cache_level=3;
|
||||||
|
SET optimizer_switch='join_cache_hashed=on';
|
||||||
|
SET optimizer_switch='join_cache_bka=on';
|
||||||
|
set optimizer_switch='hash_join_cardinality=on';
|
||||||
|
|
||||||
|
select benchmark(1,1);
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1, t2 WHERE b=a;
|
||||||
|
SELECT * FROM t1, t2 WHERE b=a;
|
||||||
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
set @@optimizer_switch=@save_optimizer_switch;
|
||||||
|
set @@join_cache_level=@save_join_cache_level;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.6 tests
|
--echo # End of 10.6 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -3125,7 +3125,8 @@ void TABLE_STATISTICS_CB::update_stats_in_table(TABLE *table)
|
|||||||
for ( ; *field_ptr; field_ptr++, column_stats++)
|
for ( ; *field_ptr; field_ptr++, column_stats++)
|
||||||
(*field_ptr)->read_stats= column_stats;
|
(*field_ptr)->read_stats= column_stats;
|
||||||
/* Mark that stats are now usable */
|
/* Mark that stats are now usable */
|
||||||
table->stats_is_read= true;
|
table->stats_is_read= (table->stats_cb->stats_available !=
|
||||||
|
TABLE_STAT_NO_STATS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3246,8 +3247,6 @@ read_statistics_for_tables(THD *thd, TABLE_LIST *tables, bool force_reload)
|
|||||||
}
|
}
|
||||||
mysql_mutex_unlock(&table_share->LOCK_statistics);
|
mysql_mutex_unlock(&table_share->LOCK_statistics);
|
||||||
table->stats_cb->update_stats_in_table(table);
|
table->stats_cb->update_stats_in_table(table);
|
||||||
table->stats_is_read= (stats_cb->stats_available !=
|
|
||||||
TABLE_STAT_NO_STATS);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4312,11 +4311,9 @@ bool is_eits_usable(Field *field)
|
|||||||
Column_statistics* col_stats= field->read_stats;
|
Column_statistics* col_stats= field->read_stats;
|
||||||
|
|
||||||
// check if column_statistics was allocated for this field
|
// check if column_statistics was allocated for this field
|
||||||
if (!col_stats)
|
if (!col_stats || !field->table->stats_is_read)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DBUG_ASSERT(field->table->stats_is_read);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
(1): checks if we have EITS statistics for a particular column
|
(1): checks if we have EITS statistics for a particular column
|
||||||
(2): Don't use EITS for GEOMETRY columns
|
(2): Don't use EITS for GEOMETRY columns
|
||||||
|
@ -445,9 +445,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool no_stat_values_provided()
|
bool no_stat_values_provided()
|
||||||
{
|
{
|
||||||
if (column_stat_nulls == no_values_provided_bitmap())
|
return (column_stat_nulls == no_values_provided_bitmap());
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user