summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Babaev <igor@askmonty.org>2012-01-24 23:34:02 -0800
committerIgor Babaev <igor@askmonty.org>2012-01-24 23:34:02 -0800
commit51847a0fba6c1072b58e641cffc028838272c9ec (patch)
tree64c722b6629cd2cb0eed6a04eb90375fd69d708c
parent507e1927e103892d48568fe2c9a3d953e5ca7ad7 (diff)
downloadmariadb-git-51847a0fba6c1072b58e641cffc028838272c9ec.tar.gz
Fixed LP bug #921167.
The fields ext_key_flags and ext_key_part_map must be initialized for any key, even for a MyISAM key that never is considered by the optimizer as one extended by hidden components.
-rw-r--r--mysql-test/r/innodb_ext_key.result47
-rw-r--r--mysql-test/t/innodb_ext_key.test39
-rw-r--r--sql/table.cc2
3 files changed, 87 insertions, 1 deletions
diff --git a/mysql-test/r/innodb_ext_key.result b/mysql-test/r/innodb_ext_key.result
index c76038a5f4f..ec980b2e73b 100644
--- a/mysql-test/r/innodb_ext_key.result
+++ b/mysql-test/r/innodb_ext_key.result
@@ -65,7 +65,7 @@ explain
select count(*) from lineitem
where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01';
id select_type table type possible_keys key key_len ref rows Extra
-1 SIMPLE lineitem const PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity i_l_shipdate 12 const,const,const 1 Using index
+1 SIMPLE lineitem const PRIMARY,i_l_shipdate,i_l_orderkey,i_l_orderkey_quantity PRIMARY 8 const,const 1
flush status;
select count(*) from lineitem
where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01';
@@ -632,5 +632,50 @@ a b c
DROP VIEW v;
DROP TABLE t1,t2,t3;
set optimizer_switch=@save_optimizer_switch;
+#
+# LP Bug #921167: query containing IN subquery
+# + extended_keys = on
+#
+CREATE TABLE t1 (
+a int NOT NULL, b varchar(1) NOT NULL, KEY(a), KEY(b,a)
+) ENGINE=MyISAM;
+INSERT INTO t1 VALUES
+(0,'j'), (8,'v'), (1,'c'), (8,'m'), (9,'d'),
+(24,'d'), (6,'y'), (1,'t'), (6,'d'), (2,'s');
+CREATE TABLE t2 (
+c int NOT NULL PRIMARY KEY
+) ENGINE=MyISAM;
+INSERT INTO t2 VALUES
+(10), (11), (12), (13), (14),
+(15), (16), (17), (18), (19), (24);
+set @save_optimizer_switch=@@optimizer_switch;
+SET optimizer_switch = 'extended_keys=off';
+EXPLAIN
+SELECT a FROM t1 AS t, t2
+WHERE c = a AND b IN (SELECT b FROM t1, t2 WHERE b = t.b);
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t index a,b b 7 NULL 10 Using index
+1 PRIMARY t1 ref b b 3 test.t.b 2 Using index; FirstMatch(t)
+1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 test.t.a 1 Using index
+1 PRIMARY t2 index NULL PRIMARY 4 NULL 11 Using index; FirstMatch(t2)
+SELECT a FROM t1 AS t, t2
+WHERE c = a AND b IN (SELECT b FROM t1, t2 WHERE b = t.b);
+a
+24
+SET optimizer_switch = 'extended_keys=on';
+EXPLAIN
+SELECT a FROM t1 AS t, t2
+WHERE c = a AND b IN (SELECT b FROM t1, t2 WHERE b = t.b);
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t index a,b b 7 NULL 10 Using index
+1 PRIMARY t1 ref b b 3 test.t.b 2 Using index; FirstMatch(t)
+1 PRIMARY t2 eq_ref PRIMARY PRIMARY 4 test.t.a 1 Using index
+1 PRIMARY t2 index NULL PRIMARY 4 NULL 11 Using index; FirstMatch(t2)
+SELECT a FROM t1 AS t, t2
+WHERE c = a AND b IN (SELECT b FROM t1, t2 WHERE b = t.b);
+a
+24
+set optimizer_switch=@save_optimizer_switch;
+DROP TABLE t1,t2;
set optimizer_switch=@save_ext_key_optimizer_switch;
SET SESSION STORAGE_ENGINE=DEFAULT;
diff --git a/mysql-test/t/innodb_ext_key.test b/mysql-test/t/innodb_ext_key.test
index 4519cf92865..8175c60b381 100644
--- a/mysql-test/t/innodb_ext_key.test
+++ b/mysql-test/t/innodb_ext_key.test
@@ -342,5 +342,44 @@ DROP TABLE t1,t2,t3;
set optimizer_switch=@save_optimizer_switch;
+--echo #
+--echo # LP Bug #921167: query containing IN subquery
+--echo # + extended_keys = on
+--echo #
+
+CREATE TABLE t1 (
+ a int NOT NULL, b varchar(1) NOT NULL, KEY(a), KEY(b,a)
+) ENGINE=MyISAM;
+INSERT INTO t1 VALUES
+ (0,'j'), (8,'v'), (1,'c'), (8,'m'), (9,'d'),
+ (24,'d'), (6,'y'), (1,'t'), (6,'d'), (2,'s');
+
+CREATE TABLE t2 (
+ c int NOT NULL PRIMARY KEY
+) ENGINE=MyISAM;
+INSERT INTO t2 VALUES
+ (10), (11), (12), (13), (14),
+ (15), (16), (17), (18), (19), (24);
+
+set @save_optimizer_switch=@@optimizer_switch;
+
+SET optimizer_switch = 'extended_keys=off';
+EXPLAIN
+SELECT a FROM t1 AS t, t2
+ WHERE c = a AND b IN (SELECT b FROM t1, t2 WHERE b = t.b);
+SELECT a FROM t1 AS t, t2
+ WHERE c = a AND b IN (SELECT b FROM t1, t2 WHERE b = t.b);
+
+SET optimizer_switch = 'extended_keys=on';
+EXPLAIN
+SELECT a FROM t1 AS t, t2
+ WHERE c = a AND b IN (SELECT b FROM t1, t2 WHERE b = t.b);
+SELECT a FROM t1 AS t, t2
+ WHERE c = a AND b IN (SELECT b FROM t1, t2 WHERE b = t.b);
+
+set optimizer_switch=@save_optimizer_switch;
+
+DROP TABLE t1,t2;
+
set optimizer_switch=@save_ext_key_optimizer_switch;
SET SESSION STORAGE_ENGINE=DEFAULT;
diff --git a/sql/table.cc b/sql/table.cc
index af7e0d1f753..318e32da2f3 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -907,6 +907,8 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
key_part->store_length=key_part->length;
}
keyinfo->ext_key_parts= keyinfo->key_parts;
+ keyinfo->ext_key_flags= keyinfo->flags;
+ keyinfo->ext_key_part_map= 0;
if (share->use_ext_keys && i)
{
keyinfo->ext_key_flags= keyinfo->flags | HA_NOSAME;