Commit a249a0ac authored by sergefp@mysql.com's avatar sergefp@mysql.com

Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-5.0-opt

into  mysql.com:/home/psergey/mysql-5.0-bug27939
parents c09d1cfe 1f6935d2
...@@ -779,4 +779,32 @@ Field Type Null Key Default Extra ...@@ -779,4 +779,32 @@ Field Type Null Key Default Extra
Name varchar(50) YES NULL Name varchar(50) YES NULL
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1,t2,tv1,tv2; DROP TABLE t1,t2,tv1,tv2;
create table t1 (a int, b int);
insert into t1 values
(NULL, 1),
(NULL, 2),
(NULL, 3),
(NULL, 4);
create table t2 (a int not null, primary key(a));
insert into t2 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t3 (a int not null, primary key(a));
insert into t3 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
flush status;
select * from t1, t2, t3 where t3.a=t1.a and t2.a=t1.b;
a b a a
explain select * from t1, t2, t3 where t3.a=t1.a and t2.a=t1.b;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 4
1 SIMPLE t2 eq_ref PRIMARY PRIMARY 4 test.t1.b 1 Using index
1 SIMPLE t3 eq_ref PRIMARY PRIMARY 4 test.t1.a 1 Using index
We expect rnd_next=5, and read_key must be 0 because of short-cutting:
show status like 'Handler_read%';
Variable_name Value
Handler_read_first 0
Handler_read_key 0
Handler_read_next 0
Handler_read_prev 0
Handler_read_rnd 0
Handler_read_rnd_next 5
drop table t1, t2, t3;
End of 5.0 tests. End of 5.0 tests.
...@@ -610,4 +610,27 @@ DESCRIBE tv2; ...@@ -610,4 +610,27 @@ DESCRIBE tv2;
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1,t2,tv1,tv2; DROP TABLE t1,t2,tv1,tv2;
# BUG#27939: Early NULLs filtering doesn't work for eq_ref access
create table t1 (a int, b int);
insert into t1 values
(NULL, 1),
(NULL, 2),
(NULL, 3),
(NULL, 4);
create table t2 (a int not null, primary key(a));
insert into t2 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
create table t3 (a int not null, primary key(a));
insert into t3 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
flush status;
select * from t1, t2, t3 where t3.a=t1.a and t2.a=t1.b;
explain select * from t1, t2, t3 where t3.a=t1.a and t2.a=t1.b;
--echo We expect rnd_next=5, and read_key must be 0 because of short-cutting:
show status like 'Handler_read%';
drop table t1, t2, t3;
--echo End of 5.0 tests. --echo End of 5.0 tests.
...@@ -5444,8 +5444,9 @@ static void add_not_null_conds(JOIN *join) ...@@ -5444,8 +5444,9 @@ static void add_not_null_conds(JOIN *join)
for (uint i=join->const_tables ; i < join->tables ; i++) for (uint i=join->const_tables ; i < join->tables ; i++)
{ {
JOIN_TAB *tab=join->join_tab+i; JOIN_TAB *tab=join->join_tab+i;
if ((tab->type == JT_REF || tab->type == JT_REF_OR_NULL) && if ((tab->type == JT_REF || tab->type == JT_EQ_REF ||
!tab->table->maybe_null) tab->type == JT_REF_OR_NULL) &&
!tab->table->maybe_null)
{ {
for (uint keypart= 0; keypart < tab->ref.key_parts; keypart++) for (uint keypart= 0; keypart < tab->ref.key_parts; keypart++)
{ {
......
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