From 71df035551939d4200f54280493d670f31eba796 Mon Sep 17 00:00:00 2001 From: Sergey Petrunya <psergey@askmonty.org> Date: Sat, 7 Jun 2014 19:00:26 +0200 Subject: [PATCH] MDEV-6308: Server crashes in table_multi_eq_cond_selectivity with ... - In table_cond_selectivity(), reset keyuse variable between the loops. --- mysql-test/r/selectivity_no_engine.result | 28 +++++++++++++++++++++++ mysql-test/t/selectivity_no_engine.test | 28 +++++++++++++++++++++++ sql/sql_select.cc | 1 + 3 files changed, 57 insertions(+) diff --git a/mysql-test/r/selectivity_no_engine.result b/mysql-test/r/selectivity_no_engine.result index da39ec1b3b4..e07329422af 100644 --- a/mysql-test/r/selectivity_no_engine.result +++ b/mysql-test/r/selectivity_no_engine.result @@ -215,6 +215,34 @@ SELECT * FROM t1 AS t1_1, t1 AS t1_2 WHERE NOT ( t1_1.a <> 'baz'); a b a b DROP TABLE t1; # +# MDEV-6308: Server crashes in table_multi_eq_cond_selectivity with ... +# +CREATE TABLE t1 ( +id varchar(40) COLLATE utf8_bin, +dt datetime, +PRIMARY KEY (id) +); +INSERT INTO t1 VALUES ('foo','2011-04-12 05:18:08'), +('bar','2013-09-19 11:37:03'); +CREATE TABLE t2 ( +t1_id varchar(40) COLLATE utf8_bin, +f1 varchar(64), +f2 varchar(1024), +KEY (f1,f2(255)) +); +INSERT INTO t2 VALUES ('foo','baz','qux'),('bar','baz','qux'); +set optimizer_use_condition_selectivity=2; +explain +select * from t1,t2 where t1.id = t2.t1_id and t2.f2='qux' and t2.f1='baz'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 ref f1 f1 325 const,const 1 Using index condition; Using where +1 SIMPLE t1 eq_ref PRIMARY PRIMARY 122 test.t2.t1_id 1 +select * from t1,t2 where t1.id = t2.t1_id and t2.f2='qux' and t2.f1='baz'; +id dt t1_id f1 f2 +foo 2011-04-12 05:18:08 foo baz qux +bar 2013-09-19 11:37:03 bar baz qux +drop table t1,t2; +# # End of the test file # set use_stat_tables= @save_use_stat_tables; diff --git a/mysql-test/t/selectivity_no_engine.test b/mysql-test/t/selectivity_no_engine.test index 87e6b629762..4a7ad8a42c9 100644 --- a/mysql-test/t/selectivity_no_engine.test +++ b/mysql-test/t/selectivity_no_engine.test @@ -161,6 +161,34 @@ INSERT INTO t1 VALUES ('foo',1),('bar',2); SELECT * FROM t1 AS t1_1, t1 AS t1_2 WHERE NOT ( t1_1.a <> 'baz'); DROP TABLE t1; +--echo # +--echo # MDEV-6308: Server crashes in table_multi_eq_cond_selectivity with ... +--echo # +CREATE TABLE t1 ( + id varchar(40) COLLATE utf8_bin, + dt datetime, + PRIMARY KEY (id) +); + +INSERT INTO t1 VALUES ('foo','2011-04-12 05:18:08'), + ('bar','2013-09-19 11:37:03'); + +CREATE TABLE t2 ( + t1_id varchar(40) COLLATE utf8_bin, + f1 varchar(64), + f2 varchar(1024), + KEY (f1,f2(255)) +); + +INSERT INTO t2 VALUES ('foo','baz','qux'),('bar','baz','qux'); + +set optimizer_use_condition_selectivity=2; +explain +select * from t1,t2 where t1.id = t2.t1_id and t2.f2='qux' and t2.f1='baz'; +select * from t1,t2 where t1.id = t2.t1_id and t2.f2='qux' and t2.f1='baz'; + +drop table t1,t2; + --echo # --echo # End of the test file --echo # diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 6cf8cfc32b5..89b589a4748 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -7367,6 +7367,7 @@ double table_cond_selectivity(JOIN *join, uint idx, JOIN_TAB *s, Go through the "keypart{N}=..." equalities and find those that were already taken into account in table->cond_selectivity. */ + keyuse= pos->key; while (keyuse->table == table && keyuse->key == key) { if (!(keyuse->used_tables & (rem_tables | table->map))) -- 2.30.9