Merge olga.mysql.com:/home/igor/mysql-5.0-opt
into olga.mysql.com:/home/igor/mysql-5.1-opt mysql-test/r/subselect3.result: Auto merged sql/item_subselect.cc: Auto merged sql/sql_select.h: Auto merged
This commit is contained in:
commit
6fa4fdd29c
@ -711,3 +711,34 @@ a
|
|||||||
1
|
1
|
||||||
4
|
4
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
CREATE TABLE t1 (id int);
|
||||||
|
CREATE TABLE t2 (id int PRIMARY KEY);
|
||||||
|
CREATE TABLE t3 (id int PRIMARY KEY, name varchar(10));
|
||||||
|
INSERT INTO t1 VALUES (2), (NULL), (3), (1);
|
||||||
|
INSERT INTO t2 VALUES (234), (345), (457);
|
||||||
|
INSERT INTO t3 VALUES (222,'bbb'), (333,'ccc'), (111,'aaa');
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1
|
||||||
|
WHERE t1.id NOT IN (SELECT t2.id FROM t2,t3
|
||||||
|
WHERE t3.name='xxx' AND t2.id=t3.id);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 4 Using where
|
||||||
|
2 DEPENDENT SUBQUERY t2 eq_ref PRIMARY PRIMARY 4 func 1 Using where; Using index; Full scan on NULL key
|
||||||
|
2 DEPENDENT SUBQUERY t3 eq_ref PRIMARY PRIMARY 4 func 1 Using where; Full scan on NULL key
|
||||||
|
SELECT * FROM t1
|
||||||
|
WHERE t1.id NOT IN (SELECT t2.id FROM t2,t3
|
||||||
|
WHERE t3.name='xxx' AND t2.id=t3.id);
|
||||||
|
id
|
||||||
|
2
|
||||||
|
NULL
|
||||||
|
3
|
||||||
|
1
|
||||||
|
SELECT (t1.id IN (SELECT t2.id FROM t2,t3
|
||||||
|
WHERE t3.name='xxx' AND t2.id=t3.id)) AS x
|
||||||
|
FROM t1;
|
||||||
|
x
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
DROP TABLE t1,t2,t3;
|
||||||
|
@ -546,3 +546,28 @@ SELECT a FROM t1, t2 WHERE a=b AND (b NOT IN (SELECT a FROM t1));
|
|||||||
SELECT a FROM t1, t2 WHERE a=b AND (b NOT IN (SELECT a FROM t1 WHERE a > 4));
|
SELECT a FROM t1, t2 WHERE a=b AND (b NOT IN (SELECT a FROM t1 WHERE a > 4));
|
||||||
|
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #28375: crash for NOT IN subquery predicate when left operand becomes NULL
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (id int);
|
||||||
|
CREATE TABLE t2 (id int PRIMARY KEY);
|
||||||
|
CREATE TABLE t3 (id int PRIMARY KEY, name varchar(10));
|
||||||
|
INSERT INTO t1 VALUES (2), (NULL), (3), (1);
|
||||||
|
INSERT INTO t2 VALUES (234), (345), (457);
|
||||||
|
INSERT INTO t3 VALUES (222,'bbb'), (333,'ccc'), (111,'aaa');
|
||||||
|
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1
|
||||||
|
WHERE t1.id NOT IN (SELECT t2.id FROM t2,t3
|
||||||
|
WHERE t3.name='xxx' AND t2.id=t3.id);
|
||||||
|
SELECT * FROM t1
|
||||||
|
WHERE t1.id NOT IN (SELECT t2.id FROM t2,t3
|
||||||
|
WHERE t3.name='xxx' AND t2.id=t3.id);
|
||||||
|
|
||||||
|
SELECT (t1.id IN (SELECT t2.id FROM t2,t3
|
||||||
|
WHERE t3.name='xxx' AND t2.id=t3.id)) AS x
|
||||||
|
FROM t1;
|
||||||
|
|
||||||
|
DROP TABLE t1,t2,t3;
|
||||||
|
@ -1872,6 +1872,8 @@ int subselect_single_select_engine::exec()
|
|||||||
if (cond_guard && !*cond_guard)
|
if (cond_guard && !*cond_guard)
|
||||||
{
|
{
|
||||||
/* Change the access method to full table scan */
|
/* Change the access method to full table scan */
|
||||||
|
tab->save_read_first_record= tab->read_first_record;
|
||||||
|
tab->save_read_record= tab->read_record.read_record;
|
||||||
tab->read_first_record= init_read_record_seq;
|
tab->read_first_record= init_read_record_seq;
|
||||||
tab->read_record.record= tab->table->record[0];
|
tab->read_record.record= tab->table->record[0];
|
||||||
tab->read_record.thd= join->thd;
|
tab->read_record.thd= join->thd;
|
||||||
@ -1892,8 +1894,8 @@ int subselect_single_select_engine::exec()
|
|||||||
JOIN_TAB *tab= *ptab;
|
JOIN_TAB *tab= *ptab;
|
||||||
tab->read_record.record= 0;
|
tab->read_record.record= 0;
|
||||||
tab->read_record.ref_length= 0;
|
tab->read_record.ref_length= 0;
|
||||||
tab->read_first_record= join_read_always_key_or_null;
|
tab->read_first_record= tab->save_read_first_record;
|
||||||
tab->read_record.read_record= join_read_next_same_or_null;
|
tab->read_record.read_record= tab->save_read_record;
|
||||||
}
|
}
|
||||||
executed= 1;
|
executed= 1;
|
||||||
thd->where= save_where;
|
thd->where= save_where;
|
||||||
|
@ -160,6 +160,13 @@ typedef struct st_join_table {
|
|||||||
Read_record_func read_first_record;
|
Read_record_func read_first_record;
|
||||||
Next_select_func next_select;
|
Next_select_func next_select;
|
||||||
READ_RECORD read_record;
|
READ_RECORD read_record;
|
||||||
|
/*
|
||||||
|
Currently the following two fields are used only for a [NOT] IN subquery
|
||||||
|
if it is executed by an alternative full table scan when the left operand of
|
||||||
|
the subquery predicate is evaluated to NULL.
|
||||||
|
*/
|
||||||
|
Read_record_func save_read_first_record;/* to save read_first_record */
|
||||||
|
int (*save_read_record) (READ_RECORD *);/* to save read_record.read_record */
|
||||||
double worst_seeks;
|
double worst_seeks;
|
||||||
key_map const_keys; /* Keys with constant part */
|
key_map const_keys; /* Keys with constant part */
|
||||||
key_map checked_keys; /* Keys checked in find_best */
|
key_map checked_keys; /* Keys checked in find_best */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user