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