From 3d002a70ac50c1f2e17cff940cee13c6c57c6a58 Mon Sep 17 00:00:00 2001
From: Igor Babaev <igor@askmonty.org>
Date: Wed, 29 Jun 2011 16:05:16 -0700
Subject: [PATCH] Fixed LP bug #803410. Due to this bug in the function
 generate_derived_keys_for_table some key definitions to access materialized
 derived tables or materialized views were constructed with invalid info for
 their key parts. This could make the server crash when it optimized queries
 using materialized derived tables or materialized views.

---
 mysql-test/r/derived_view.result | 22 ++++++++++++++++++++++
 mysql-test/t/derived_view.test   | 21 +++++++++++++++++++++
 sql/sql_select.cc                |  1 +
 3 files changed, 44 insertions(+)

diff --git a/mysql-test/r/derived_view.result b/mysql-test/r/derived_view.result
index be6050ab48e..c78b2a41d19 100644
--- a/mysql-test/r/derived_view.result
+++ b/mysql-test/r/derived_view.result
@@ -703,3 +703,25 @@ a
 NULL
 DROP VIEW v1;
 DROP TABLE t1,t2,t3;
+#
+# LP bug #803410: materialized view/dt accessed by two-component key                       
+#                 
+CREATE TABLE t1 (a varchar(1));
+INSERT INTO t1 VALUES ('c');
+CREATE TABLE t2 (a varchar(1) , KEY (a)) ;
+INSERT INTO t2 VALUES ('c'), (NULL), ('r');
+CREATE TABLE t3 (a varchar(1), b varchar(1));
+INSERT INTO t3 VALUES ('e', 'c'), ('c', 'c'), ('c', 'r');
+CREATE VIEW v1 AS SELECT a, MIN(b) AS b FROM t3 GROUP BY a;
+EXPLAIN
+SELECT * FROM t1, t2, v1 WHERE t2.a=t1.a AND t2.a=v1.a AND t2.a=v1.b;
+id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
+1	PRIMARY	t1	system	NULL	NULL	NULL	NULL	1	
+1	PRIMARY	t2	ref	a	a	4	const	1	Using index
+1	PRIMARY	<derived2>	ref	key1	key1	10	test.t1.a,test.t1.a	2	Using where
+2	DERIVED	t3	ALL	NULL	NULL	NULL	NULL	3	Using temporary; Using filesort
+SELECT * FROM t1, t2, v1 WHERE t2.a=t1.a AND t2.a=v1.a AND t2.a=v1.b;
+a	a	a	b
+c	c	c	c
+DROP VIEW v1;
+DROP TABLE t1,t2,t3;
diff --git a/mysql-test/t/derived_view.test b/mysql-test/t/derived_view.test
index f4fc17bd3b2..7acc796472f 100644
--- a/mysql-test/t/derived_view.test
+++ b/mysql-test/t/derived_view.test
@@ -322,3 +322,24 @@ SELECT t.a FROM t1 LEFT JOIN
 DROP VIEW v1;
 DROP TABLE t1,t2,t3;
 
+--echo #
+--echo # LP bug #803410: materialized view/dt accessed by two-component key                       
+--echo #                 
+
+CREATE TABLE t1 (a varchar(1));
+INSERT INTO t1 VALUES ('c');
+
+CREATE TABLE t2 (a varchar(1) , KEY (a)) ;
+INSERT INTO t2 VALUES ('c'), (NULL), ('r');
+
+CREATE TABLE t3 (a varchar(1), b varchar(1));
+INSERT INTO t3 VALUES ('e', 'c'), ('c', 'c'), ('c', 'r');
+
+CREATE VIEW v1 AS SELECT a, MIN(b) AS b FROM t3 GROUP BY a;
+
+EXPLAIN
+SELECT * FROM t1, t2, v1 WHERE t2.a=t1.a AND t2.a=v1.a AND t2.a=v1.b;
+SELECT * FROM t1, t2, v1 WHERE t2.a=t1.a AND t2.a=v1.a AND t2.a=v1.b;
+
+DROP VIEW v1;
+DROP TABLE t1,t2,t3;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index b1924209b35..b1a858de709 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -8293,6 +8293,7 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys)
       first_keyuse= keyuse;
       keyno++;
       parts= 0;
+      prev_part= (uint) (-1);
     }
     else if (keyuse->keypart != prev_part)
     {
-- 
2.30.9