Commit 801a4ebc authored by Igor Babaev's avatar Igor Babaev

Merge.

parents 4fadcc2b b79316f5
...@@ -794,3 +794,30 @@ WHERE t4.f2 = t3.f2 AND t4.f2 = t.f1 ORDER BY f; ...@@ -794,3 +794,30 @@ WHERE t4.f2 = t3.f2 AND t4.f2 = t.f1 ORDER BY f;
f f
x x
DROP TABLE t1,t2,t3,t4; DROP TABLE t1,t2,t3,t4;
#
# LP bug #806431: join over materialized derived with key
#
CREATE TABLE t1 (a int, b int);
INSERT INTO t1 VALUES (0,0),(3,0),(1,0);
CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT a,b FROM t1 ;
SET SESSION optimizer_switch='derived_with_keys=off';
SELECT * FROM t1 AS t JOIN v1 AS v WHERE t.a = v.b AND t.b = v.b;
a b a b
0 0 0 0
0 0 3 0
0 0 1 0
SET SESSION optimizer_switch='derived_with_keys=on';
EXPLAIN
SELECT * FROM t1 AS t JOIN v1 AS v WHERE t.a = v.b AND t.b = v.b;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t ALL NULL NULL NULL NULL 3 Using where
1 PRIMARY <derived2> ref key0 key0 5 test.t.a 2
2 DERIVED t1 ALL NULL NULL NULL NULL 3
SELECT * FROM t1 AS t JOIN v1 AS v WHERE t.a = v.b AND t.b = v.b;
a b a b
0 0 1 0
0 0 3 0
0 0 0 0
SET SESSION optimizer_switch=default;
DROP VIEW v1;
DROP TABLE t1;
...@@ -414,3 +414,24 @@ SELECT t.f1 AS f ...@@ -414,3 +414,24 @@ SELECT t.f1 AS f
DROP TABLE t1,t2,t3,t4; DROP TABLE t1,t2,t3,t4;
--echo #
--echo # LP bug #806431: join over materialized derived with key
--echo #
CREATE TABLE t1 (a int, b int);
INSERT INTO t1 VALUES (0,0),(3,0),(1,0);
CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT a,b FROM t1 ;
SET SESSION optimizer_switch='derived_with_keys=off';
SELECT * FROM t1 AS t JOIN v1 AS v WHERE t.a = v.b AND t.b = v.b;
SET SESSION optimizer_switch='derived_with_keys=on';
EXPLAIN
SELECT * FROM t1 AS t JOIN v1 AS v WHERE t.a = v.b AND t.b = v.b;
SELECT * FROM t1 AS t JOIN v1 AS v WHERE t.a = v.b AND t.b = v.b;
SET SESSION optimizer_switch=default;
DROP VIEW v1;
DROP TABLE t1;
...@@ -8342,17 +8342,29 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys) ...@@ -8342,17 +8342,29 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys)
return TRUE; return TRUE;
uint keyno= 0; uint keyno= 0;
KEYUSE *first_keyuse= keyuse; KEYUSE *first_keyuse= keyuse;
uint prev_part= (uint) (-1); uint prev_part= keyuse->keypart;
uint parts= 0; uint parts= 0;
uint i= 0; uint i= 0;
do
for ( ; i < count && keyno < keys; )
{ {
keyuse->key= keyno; do
keyuse->keypart_map= (key_part_map) (1 << parts); {
keyuse++; keyuse->key= keyno;
if (++i == count || keyuse->used_tables != first_keyuse->used_tables) keyuse->keypart_map= (key_part_map) (1 << parts);
keyuse++;
i++;
}
while (i < count && keyuse->used_tables == first_keyuse->used_tables &&
keyuse->keypart == prev_part);
parts++;
if (i < count && keyuse->used_tables == first_keyuse->used_tables)
{
prev_part= keyuse->keypart;
}
else
{ {
if (table->add_tmp_key(keyno, ++parts, if (table->add_tmp_key(keyno, parts,
get_next_field_for_derived_key, get_next_field_for_derived_key,
(uchar *) &first_keyuse, (uchar *) &first_keyuse,
FALSE)) FALSE))
...@@ -8361,14 +8373,10 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys) ...@@ -8361,14 +8373,10 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys)
first_keyuse= keyuse; first_keyuse= keyuse;
keyno++; keyno++;
parts= 0; parts= 0;
prev_part= (uint) (-1);
}
else if (keyuse->keypart != prev_part)
{
parts++;
prev_part= keyuse->keypart; prev_part= keyuse->keypart;
} }
} while (keyno < keys); }
return FALSE; return FALSE;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment