diff options
author | Igor Babaev <igor@askmonty.org> | 2013-04-05 11:24:28 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2013-04-05 11:24:28 -0700 |
commit | daaa5834c9fb567924c21d467983c1ec3401f832 (patch) | |
tree | 4c5f62da0d45779c5c7bd453f9d1ced35306e988 | |
parent | 4079a5dc3f98a2c7c53567106b362fc04538c7b6 (diff) | |
download | mariadb-git-daaa5834c9fb567924c21d467983c1ec3401f832.tar.gz |
Fixed bug mdev-4370.
Don't try to a histogram if it is not read into the cache for statistical data.
It may happen so if optimizer_use_condition_selectivity is set to 3. This
setting orders the optimizer not use histograms to calculate selectivity.
-rw-r--r-- | mysql-test/r/selectivity.result | 28 | ||||
-rw-r--r-- | mysql-test/r/selectivity_innodb.result | 28 | ||||
-rw-r--r-- | mysql-test/t/selectivity.test | 27 | ||||
-rw-r--r-- | sql/sql_statistics.cc | 4 | ||||
-rw-r--r-- | sql/sql_statistics.h | 2 |
5 files changed, 87 insertions, 2 deletions
diff --git a/mysql-test/r/selectivity.result b/mysql-test/r/selectivity.result index 760c7796302..ed8e7f8bd36 100644 --- a/mysql-test/r/selectivity.result +++ b/mysql-test/r/selectivity.result @@ -794,4 +794,32 @@ SELECT 1 FROM t1, t2 WHERE pk = 6 AND a = 2 AND b = 10; 1 DROP TABLE t1,t2; set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; +# +# Bug mdev-4370: Histograms have bean created, but the query is run after +# FLUSH TABLES with optimizer_use_condition_selectivity=3 +# +set use_stat_tables=PREFERABLY; +set histogram_size=10; +set histogram_type='SINGLE_PREC_HB'; +CREATE TABLE t1 (a int); +INSERT INTO t1 VALUES (9), (1); +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +FLUSH TABLES; +set optimizer_use_condition_selectivity=3; +EXPLAIN EXTENDED +SELECT * FROM t1 WHERE a > 3; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 75.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` > 3) +SELECT * FROM t1 WHERE a > 3; +a +9 +set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; +DROP TABLE t1; +set histogram_size=@save_histogram_size; +set histogram_type=@save_histogram_type; +set use_stat_tables=@save_use_stat_tables; set use_stat_tables=@save_use_stat_tables; diff --git a/mysql-test/r/selectivity_innodb.result b/mysql-test/r/selectivity_innodb.result index cc9b5475ac1..256b93d8cb5 100644 --- a/mysql-test/r/selectivity_innodb.result +++ b/mysql-test/r/selectivity_innodb.result @@ -801,6 +801,34 @@ SELECT 1 FROM t1, t2 WHERE pk = 6 AND a = 2 AND b = 10; 1 DROP TABLE t1,t2; set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; +# +# Bug mdev-4370: Histograms have bean created, but the query is run after +# FLUSH TABLES with optimizer_use_condition_selectivity=3 +# +set use_stat_tables=PREFERABLY; +set histogram_size=10; +set histogram_type='SINGLE_PREC_HB'; +CREATE TABLE t1 (a int); +INSERT INTO t1 VALUES (9), (1); +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +FLUSH TABLES; +set optimizer_use_condition_selectivity=3; +EXPLAIN EXTENDED +SELECT * FROM t1 WHERE a > 3; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 75.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (`test`.`t1`.`a` > 3) +SELECT * FROM t1 WHERE a > 3; +a +9 +set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; +DROP TABLE t1; +set histogram_size=@save_histogram_size; +set histogram_type=@save_histogram_type; +set use_stat_tables=@save_use_stat_tables; set use_stat_tables=@save_use_stat_tables; set optimizer_switch=@save_optimizer_switch_for_selectivity_test; SET SESSION STORAGE_ENGINE=DEFAULT; diff --git a/mysql-test/t/selectivity.test b/mysql-test/t/selectivity.test index 4d0ec2d9128..aab8c504f3c 100644 --- a/mysql-test/t/selectivity.test +++ b/mysql-test/t/selectivity.test @@ -384,5 +384,32 @@ DROP TABLE t1,t2; set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; +--echo # +--echo # Bug mdev-4370: Histograms have bean created, but the query is run after +--echo # FLUSH TABLES with optimizer_use_condition_selectivity=3 +--echo # + +set use_stat_tables=PREFERABLY; +set histogram_size=10; +set histogram_type='SINGLE_PREC_HB'; + +CREATE TABLE t1 (a int); +INSERT INTO t1 VALUES (9), (1); +ANALYZE TABLE t1; +FLUSH TABLES; + +set optimizer_use_condition_selectivity=3; + +EXPLAIN EXTENDED +SELECT * FROM t1 WHERE a > 3; +SELECT * FROM t1 WHERE a > 3; + +set optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; + +DROP TABLE t1; + +set histogram_size=@save_histogram_size; +set histogram_type=@save_histogram_type; +set use_stat_tables=@save_use_stat_tables; set use_stat_tables=@save_use_stat_tables; diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index 6c33b88d9ad..b556c37c3fb 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -3369,7 +3369,7 @@ double get_column_range_cardinality(Field *field, col_stats->min_value && col_stats->max_value) { Histogram *hist= &col_stats->histogram; - if (hist->get_size() > 0) + if (hist->is_available()) { double pos= field->middle_point_pos(col_stats->min_value, col_stats->max_value); @@ -3406,7 +3406,7 @@ double get_column_range_cardinality(Field *field, max_mp_pos= 1.0; Histogram *hist= &col_stats->histogram; - if (hist->get_size() == 0) + if (!hist->is_available()) sel= (max_mp_pos - min_mp_pos); else sel= hist->range_selectivity(min_mp_pos, max_mp_pos); diff --git a/sql/sql_statistics.h b/sql/sql_statistics.h index e005ff86291..14ffe3351d0 100644 --- a/sql/sql_statistics.h +++ b/sql/sql_statistics.h @@ -195,6 +195,8 @@ public: void set_values (uchar *vals) { values= (uchar *) vals; } + bool is_available() { return get_size() > 0 && get_values(); } + void set_value(uint i, double val) { switch (type) { |