Commit 199f667c authored by bell@sanja.is.com.ua's avatar bell@sanja.is.com.ua

merging

parents 61488a7b 2883c3a8
...@@ -133,8 +133,13 @@ typedef struct st_net { ...@@ -133,8 +133,13 @@ typedef struct st_net {
unsigned int *return_status; unsigned int *return_status;
unsigned char reading_or_writing; unsigned char reading_or_writing;
char save_char; char save_char;
my_bool report_error; /* We should report error (we have unreported error) */
my_bool no_send_ok; my_bool no_send_ok;
gptr query_cache_query; /*
Pointer to query object in query cache, do not equal NULL (0) for
queries in cache that have not stored its results yet
*/
gptr query_cache_query;
} NET; } NET;
#define packet_error (~(unsigned long) 0) #define packet_error (~(unsigned long) 0)
......
...@@ -27,6 +27,7 @@ test_name=$1 ...@@ -27,6 +27,7 @@ test_name=$1
[ -z $test_name ] && usage [ -z $test_name ] && usage
result_file=$RESULT_DIR/$test_name.result result_file=$RESULT_DIR/$test_name.result
reject_file=$RESULT_DIR/$test_name.reject
[ -f $result_file ] && die "result file $result_file has already been created" [ -f $result_file ] && die "result file $result_file has already been created"
...@@ -34,8 +35,6 @@ touch $result_file ...@@ -34,8 +35,6 @@ touch $result_file
echo "Running the test case against empty file, will fail, but don't worry" echo "Running the test case against empty file, will fail, but don't worry"
./mysql-test-run --local $test_name ./mysql-test-run --local $test_name
reject_file=$result_file.reject
if [ -f $reject_file ] ; then if [ -f $reject_file ] ; then
echo "Below are the contents of the reject file:" echo "Below are the contents of the reject file:"
echo "-----start---------------------" echo "-----start---------------------"
......
...@@ -2,8 +2,8 @@ drop table if exists t1; ...@@ -2,8 +2,8 @@ drop table if exists t1;
CREATE TABLE t1 (id CHAR(12) not null, PRIMARY KEY (id)); CREATE TABLE t1 (id CHAR(12) not null, PRIMARY KEY (id));
insert into t1 values ('000000000001'),('000000000002'); insert into t1 values ('000000000001'),('000000000002');
explain select * from t1 where id=000000000001; explain select * from t1 where id=000000000001;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 12 NULL 2 where used; Using index 1 SIMPLE t1 index PRIMARY PRIMARY 12 NULL 2 where used; Using index
select * from t1 where id=000000000001; select * from t1 where id=000000000001;
id id
000000000001 000000000001
......
...@@ -62,8 +62,8 @@ create table t1 (a int auto_increment not null primary key, B CHAR(20)); ...@@ -62,8 +62,8 @@ create table t1 (a int auto_increment not null primary key, B CHAR(20));
insert into t1 (b) values ("hello"),("my"),("world"); insert into t1 (b) values ("hello"),("my"),("world");
create table t2 (key (b)) select * from t1; create table t2 (key (b)) select * from t1;
explain select * from t2 where b="world"; explain select * from t2 where b="world";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 ref B B 21 const 1 where used 1 SIMPLE t2 ref B B 21 const 1 where used
select * from t2 where b="world"; select * from t2 where b="world";
a B a B
3 world 3 world
......
...@@ -172,10 +172,10 @@ b ...@@ -172,10 +172,10 @@ b
INSERT INTO t2 values (1),(2),(3); INSERT INTO t2 values (1),(2),(3);
INSERT INTO t3 VALUES (1,'1'),(2,'2'),(1,'1'),(2,'2'); INSERT INTO t3 VALUES (1,'1'),(2,'2'),(1,'1'),(2,'2');
explain SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a; explain SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t3 index a a 5 NULL 6 Using index; Using temporary 1 SIMPLE t3 index a a 5 NULL 6 Using index; Using temporary
t2 index a a 4 NULL 5 Using index; Distinct 1 SIMPLE t2 index a a 4 NULL 5 Using index; Distinct
t1 eq_ref PRIMARY PRIMARY 4 t2.a 1 where used; Distinct 1 SIMPLE t1 eq_ref PRIMARY PRIMARY 4 t2.a 1 where used; Distinct
SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a; SELECT distinct t3.a FROM t3,t2,t1 WHERE t3.a=t1.b AND t1.a=t2.a;
a a
1 1
...@@ -188,9 +188,9 @@ insert into t3 select * from t4; ...@@ -188,9 +188,9 @@ insert into t3 select * from t4;
insert into t4 select * from t3; insert into t4 select * from t3;
insert into t3 select * from t4; insert into t3 select * from t4;
explain select distinct t1.a from t1,t3 where t1.a=t3.a; explain select distinct t1.a from t1,t3 where t1.a=t3.a;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 2 Using index; Using temporary 1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 2 Using index; Using temporary
t3 ref a a 5 t1.a 10 Using index; Distinct 1 SIMPLE t3 ref a a 5 t1.a 10 Using index; Distinct
select distinct t1.a from t1,t3 where t1.a=t3.a; select distinct t1.a from t1,t3 where t1.a=t3.a;
a a
1 1
...@@ -274,14 +274,14 @@ on j_lj_t3.id=t3_lj.id ...@@ -274,14 +274,14 @@ on j_lj_t3.id=t3_lj.id
WHERE WHERE
((t1.id=j_lj_t2.id AND t2_lj.id IS NULL) OR (t1.id=t2.id AND t2.idx=2)) ((t1.id=j_lj_t2.id AND t2_lj.id IS NULL) OR (t1.id=t2.id AND t2.idx=2))
AND ((t1.id=j_lj_t3.id AND t3_lj.id IS NULL) OR (t1.id=t3.id AND t3.idx=2)); AND ((t1.id=j_lj_t3.id AND t3_lj.id IS NULL) OR (t1.id=t3.id AND t3.idx=2));
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index id id 4 NULL 2 Using index; Using temporary 1 SIMPLE t1 index id id 4 NULL 2 Using index; Using temporary
t2 index id id 8 NULL 1 Using index; Distinct 1 SIMPLE t2 index id id 8 NULL 1 Using index; Distinct
t3 index id id 8 NULL 1 Using index; Distinct 1 SIMPLE t3 index id id 8 NULL 1 Using index; Distinct
j_lj_t2 index id id 4 NULL 2 where used; Using index; Distinct 1 SIMPLE j_lj_t2 index id id 4 NULL 2 where used; Using index; Distinct
t2_lj index id id 8 NULL 1 where used; Using index; Distinct 1 SIMPLE t2_lj index id id 8 NULL 1 where used; Using index; Distinct
j_lj_t3 index id id 4 NULL 2 where used; Using index; Distinct 1 SIMPLE j_lj_t3 index id id 4 NULL 2 where used; Using index; Distinct
t3_lj index id id 8 NULL 1 where used; Using index; Distinct 1 SIMPLE t3_lj index id id 8 NULL 1 where used; Using index; Distinct
SELECT DISTINCT SELECT DISTINCT
t1.id t1.id
from from
......
...@@ -9,22 +9,22 @@ select * from t1 where str="foo"; ...@@ -9,22 +9,22 @@ select * from t1 where str="foo";
id str id str
3 foo 3 foo
explain select * from t1 where str is null; explain select * from t1 where str is null;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref str str 11 const 1 where used 1 SIMPLE t1 ref str str 11 const 1 where used
explain select * from t1 where str="foo"; explain select * from t1 where str="foo";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 const str str 11 const 1 1 SIMPLE t1 const str str 11 const 1
explain select * from t1 ignore key (str) where str="foo"; explain select * from t1 ignore key (str) where str="foo";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 where used 1 SIMPLE t1 ALL NULL NULL NULL NULL 4 where used
explain select * from t1 use key (str,str) where str="foo"; explain select * from t1 use key (str,str) where str="foo";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 const str str 11 const 1 1 SIMPLE t1 const str str 11 const 1
explain select * from t1 use key (str,str,foo) where str="foo"; explain select * from t1 use key (str,str,foo) where str="foo";
Key column 'foo' doesn't exist in table Key column 'foo' doesn't exist in table
explain select * from t1 ignore key (str,str,foo) where str="foo"; explain select * from t1 ignore key (str,str,foo) where str="foo";
Key column 'foo' doesn't exist in table Key column 'foo' doesn't exist in table
drop table t1; drop table t1;
explain select 1; explain select 1;
Comment id select_type table type possible_keys key key_len ref rows Extra
No tables used 1 SIMPLE No tables used
...@@ -225,19 +225,19 @@ key (score) ...@@ -225,19 +225,19 @@ key (score)
); );
INSERT INTO t1 VALUES (1,1,1),(2,2,2),(2,1,1),(3,3,3),(4,3,3),(5,3,3); INSERT INTO t1 VALUES (1,1,1),(2,2,2),(2,1,1),(3,3,3),(4,3,3),(5,3,3);
explain select userid,count(*) from t1 group by userid desc; explain select userid,count(*) from t1 group by userid desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort 1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort
select userid,count(*) from t1 group by userid desc; select userid,count(*) from t1 group by userid desc;
userid count(*) userid count(*)
3 3 3 3
2 1 2 1
1 2 1 2
explain select spid,count(*) from t1 where spid between 1 and 2 group by spid desc; explain select spid,count(*) from t1 where spid between 1 and 2 group by spid desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range spID spID 5 NULL 2 where used; Using index 1 SIMPLE t1 range spID spID 5 NULL 2 where used; Using index
explain select spid,count(*) from t1 where spid between 1 and 2 group by spid; explain select spid,count(*) from t1 where spid between 1 and 2 group by spid;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range spID spID 5 NULL 2 where used; Using index 1 SIMPLE t1 range spID spID 5 NULL 2 where used; Using index
select spid,count(*) from t1 where spid between 1 and 2 group by spid; select spid,count(*) from t1 where spid between 1 and 2 group by spid;
spid count(*) spid count(*)
1 1 1 1
...@@ -247,8 +247,8 @@ spid count(*) ...@@ -247,8 +247,8 @@ spid count(*)
2 2 2 2
1 1 1 1
explain select sql_big_result spid,sum(userid) from t1 group by spid desc; explain select sql_big_result spid,sum(userid) from t1 group by spid desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 6 Using filesort 1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using filesort
select sql_big_result spid,sum(userid) from t1 group by spid desc; select sql_big_result spid,sum(userid) from t1 group by spid desc;
spid sum(userid) spid sum(userid)
5 3 5 3
...@@ -257,8 +257,8 @@ spid sum(userid) ...@@ -257,8 +257,8 @@ spid sum(userid)
2 3 2 3
1 1 1 1
explain select sql_big_result score,count(*) from t1 group by score desc; explain select sql_big_result score,count(*) from t1 group by score desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL score 3 NULL 6 Using index 1 SIMPLE t1 index NULL score 3 NULL 6 Using index
select sql_big_result score,count(*) from t1 group by score desc; select sql_big_result score,count(*) from t1 group by score desc;
score count(*) score count(*)
3 3 3 3
......
...@@ -65,8 +65,8 @@ a ...@@ -65,8 +65,8 @@ a
869751 869751
alter table t1 type=myisam; alter table t1 type=myisam;
explain select * from t1 where a in (869751,736494,226312,802616); explain select * from t1 where a in (869751,736494,226312,802616);
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range uniq_id uniq_id 4 NULL 4 where used; Using index 1 SIMPLE t1 range uniq_id uniq_id 4 NULL 4 where used; Using index
drop table t1; drop table t1;
create table t1 (x int not null, y int not null, key x (x), unique y (y)) create table t1 (x int not null, y int not null, key x (x), unique y (y))
type=heap; type=heap;
...@@ -84,9 +84,9 @@ x y x y ...@@ -84,9 +84,9 @@ x y x y
2 5 2 2 2 5 2 2
2 6 2 2 2 6 2 2
explain select * from t1,t1 as t2 where t1.x=t2.y; explain select * from t1,t1 as t2 where t1.x=t2.y;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL x NULL NULL NULL 6 1 SIMPLE t1 ALL x NULL NULL NULL 6
t2 eq_ref y y 4 t1.x 1 1 SIMPLE t2 eq_ref y y 4 t1.x 1
drop table t1; drop table t1;
create table t1 (a int) type=heap; create table t1 (a int) type=heap;
insert into t1 values(1); insert into t1 values(1);
...@@ -158,18 +158,18 @@ drop table t1; ...@@ -158,18 +158,18 @@ drop table t1;
create table t1 (btn char(10) not null, key(btn)) type=heap; create table t1 (btn char(10) not null, key(btn)) type=heap;
insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i");
explain select * from t1 where btn like "q%"; explain select * from t1 where btn like "q%";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL btn NULL NULL NULL 14 where used 1 SIMPLE t1 ALL btn NULL NULL NULL 14 where used
select * from t1 where btn like "q%"; select * from t1 where btn like "q%";
btn btn
alter table t1 add column new_col char(1) not null, add key (btn,new_col), drop key btn; alter table t1 add column new_col char(1) not null, add key (btn,new_col), drop key btn;
update t1 set new_col=btn; update t1 set new_col=btn;
explain select * from t1 where btn="a"; explain select * from t1 where btn="a";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL btn NULL NULL NULL 14 where used 1 SIMPLE t1 ALL btn NULL NULL NULL 14 where used
explain select * from t1 where btn="a" and new_col="a"; explain select * from t1 where btn="a" and new_col="a";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref btn btn 11 const,const 10 where used 1 SIMPLE t1 ref btn btn 11 const,const 10 where used
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
a int default NULL, a int default NULL,
...@@ -181,16 +181,16 @@ INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3); ...@@ -181,16 +181,16 @@ INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3);
SELECT * FROM t1 WHERE a=NULL; SELECT * FROM t1 WHERE a=NULL;
a b a b
explain SELECT * FROM t1 WHERE a IS NULL; explain SELECT * FROM t1 WHERE a IS NULL;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a a 5 const 10 where used 1 SIMPLE t1 ref a a 5 const 10 where used
SELECT * FROM t1 WHERE a<=>NULL; SELECT * FROM t1 WHERE a<=>NULL;
a b a b
NULL 99 NULL 99
SELECT * FROM t1 WHERE b=NULL; SELECT * FROM t1 WHERE b=NULL;
a b a b
explain SELECT * FROM t1 WHERE b IS NULL; explain SELECT * FROM t1 WHERE b IS NULL;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref b b 5 const 1 where used 1 SIMPLE t1 ref b b 5 const 1 where used
SELECT * FROM t1 WHERE b<=>NULL; SELECT * FROM t1 WHERE b<=>NULL;
a b a b
99 NULL 99 NULL
......
...@@ -65,8 +65,8 @@ a ...@@ -65,8 +65,8 @@ a
869751 869751
alter table t1 type=myisam; alter table t1 type=myisam;
explain select * from t1 where a in (869751,736494,226312,802616); explain select * from t1 where a in (869751,736494,226312,802616);
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range uniq_id uniq_id 4 NULL 4 where used; Using index 1 SIMPLE t1 range uniq_id uniq_id 4 NULL 4 where used; Using index
drop table t1; drop table t1;
create table t1 (x int not null, y int not null, key x using BTREE (x), unique y using BTREE (y)) create table t1 (x int not null, y int not null, key x using BTREE (x), unique y using BTREE (y))
type=heap; type=heap;
...@@ -84,9 +84,9 @@ x y x y ...@@ -84,9 +84,9 @@ x y x y
2 5 2 2 2 5 2 2
2 6 2 2 2 6 2 2
explain select * from t1,t1 as t2 where t1.x=t2.y; explain select * from t1,t1 as t2 where t1.x=t2.y;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL x NULL NULL NULL 6 1 SIMPLE t1 ALL x NULL NULL NULL 6
t2 eq_ref y y 4 t1.x 1 1 SIMPLE t2 eq_ref y y 4 t1.x 1
drop table t1; drop table t1;
create table t1 (a int) type=heap; create table t1 (a int) type=heap;
insert into t1 values(1); insert into t1 values(1);
...@@ -120,18 +120,18 @@ a b ...@@ -120,18 +120,18 @@ a b
1 6 1 6
1 6 1 6
explain select * from tx where a=x order by a,b; explain select * from tx where a=x order by a,b;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
tx ref a a x const x where used x SIMPLE tx ref a a x const x where used
explain select * from tx where a=x order by b; explain select * from tx where a=x order by b;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
tx ref a a x const x where used x SIMPLE tx ref a a x const x where used
select * from t1 where b=1; select * from t1 where b=1;
a b a b
1 1 1 1
1 1 1 1
explain select * from tx where b=x; explain select * from tx where b=x;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
tx ref b b x const x where used x SIMPLE tx ref b b x const x where used
drop table t1; drop table t1;
create table t1 (id int unsigned not null, primary key using BTREE (id)) type=HEAP; create table t1 (id int unsigned not null, primary key using BTREE (id)) type=HEAP;
insert into t1 values(1); insert into t1 values(1);
...@@ -171,18 +171,18 @@ drop table t1; ...@@ -171,18 +171,18 @@ drop table t1;
create table t1 (btn char(10) not null, key using BTREE (btn)) type=heap; create table t1 (btn char(10) not null, key using BTREE (btn)) type=heap;
insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i");
explain select * from t1 where btn like "q%"; explain select * from t1 where btn like "q%";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL btn NULL NULL NULL 14 where used 1 SIMPLE t1 ALL btn NULL NULL NULL 14 where used
select * from t1 where btn like "q%"; select * from t1 where btn like "q%";
btn btn
alter table t1 add column new_col char(1) not null, add key using BTREE (btn,new_col), drop key btn; alter table t1 add column new_col char(1) not null, add key using BTREE (btn,new_col), drop key btn;
update t1 set new_col=btn; update t1 set new_col=btn;
explain select * from t1 where btn="a"; explain select * from t1 where btn="a";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref btn btn 10 const 1 where used 1 SIMPLE t1 ref btn btn 10 const 1 where used
explain select * from t1 where btn="a" and new_col="a"; explain select * from t1 where btn="a" and new_col="a";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref btn btn 11 const,const 1 where used 1 SIMPLE t1 ref btn btn 11 const,const 1 where used
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
a int default NULL, a int default NULL,
...@@ -194,16 +194,16 @@ INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3); ...@@ -194,16 +194,16 @@ INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3);
SELECT * FROM t1 WHERE a=NULL; SELECT * FROM t1 WHERE a=NULL;
a b a b
explain SELECT * FROM t1 WHERE a IS NULL; explain SELECT * FROM t1 WHERE a IS NULL;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a a 5 const 1 where used 1 SIMPLE t1 ref a a 5 const 1 where used
SELECT * FROM t1 WHERE a<=>NULL; SELECT * FROM t1 WHERE a<=>NULL;
a b a b
NULL 99 NULL 99
SELECT * FROM t1 WHERE b=NULL; SELECT * FROM t1 WHERE b=NULL;
a b a b
explain SELECT * FROM t1 WHERE b IS NULL; explain SELECT * FROM t1 WHERE b IS NULL;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref b b 5 const 1 where used 1 SIMPLE t1 ref b b 5 const 1 where used
SELECT * FROM t1 WHERE b<=>NULL; SELECT * FROM t1 WHERE b<=>NULL;
a b a b
99 NULL 99 NULL
......
...@@ -65,8 +65,8 @@ a ...@@ -65,8 +65,8 @@ a
869751 869751
alter table t1 type=myisam; alter table t1 type=myisam;
explain select * from t1 where a in (869751,736494,226312,802616); explain select * from t1 where a in (869751,736494,226312,802616);
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range uniq_id uniq_id 4 NULL 4 where used; Using index 1 SIMPLE t1 range uniq_id uniq_id 4 NULL 4 where used; Using index
drop table t1; drop table t1;
create table t1 (x int not null, y int not null, key x using HASH (x), unique y using HASH (y)) create table t1 (x int not null, y int not null, key x using HASH (x), unique y using HASH (y))
type=heap; type=heap;
...@@ -84,9 +84,9 @@ x y x y ...@@ -84,9 +84,9 @@ x y x y
2 5 2 2 2 5 2 2
2 6 2 2 2 6 2 2
explain select * from t1,t1 as t2 where t1.x=t2.y; explain select * from t1,t1 as t2 where t1.x=t2.y;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL x NULL NULL NULL 6 1 SIMPLE t1 ALL x NULL NULL NULL 6
t2 eq_ref y y 4 t1.x 1 1 SIMPLE t2 eq_ref y y 4 t1.x 1
drop table t1; drop table t1;
create table t1 (a int) type=heap; create table t1 (a int) type=heap;
insert into t1 values(1); insert into t1 values(1);
...@@ -158,18 +158,18 @@ drop table t1; ...@@ -158,18 +158,18 @@ drop table t1;
create table t1 (btn char(10) not null, key using HASH (btn)) type=heap; create table t1 (btn char(10) not null, key using HASH (btn)) type=heap;
insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i"); insert into t1 values ("hello"),("hello"),("hello"),("hello"),("hello"),("a"),("b"),("c"),("d"),("e"),("f"),("g"),("h"),("i");
explain select * from t1 where btn like "q%"; explain select * from t1 where btn like "q%";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL btn NULL NULL NULL 14 where used 1 SIMPLE t1 ALL btn NULL NULL NULL 14 where used
select * from t1 where btn like "q%"; select * from t1 where btn like "q%";
btn btn
alter table t1 add column new_col char(1) not null, add key using HASH (btn,new_col), drop key btn; alter table t1 add column new_col char(1) not null, add key using HASH (btn,new_col), drop key btn;
update t1 set new_col=btn; update t1 set new_col=btn;
explain select * from t1 where btn="a"; explain select * from t1 where btn="a";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL btn NULL NULL NULL 14 where used 1 SIMPLE t1 ALL btn NULL NULL NULL 14 where used
explain select * from t1 where btn="a" and new_col="a"; explain select * from t1 where btn="a" and new_col="a";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref btn btn 11 const,const 10 where used 1 SIMPLE t1 ref btn btn 11 const,const 10 where used
drop table t1; drop table t1;
CREATE TABLE t1 ( CREATE TABLE t1 (
a int default NULL, a int default NULL,
...@@ -181,16 +181,16 @@ INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3); ...@@ -181,16 +181,16 @@ INSERT INTO t1 VALUES (NULL,99),(99,NULL),(1,1),(2,2),(1,3);
SELECT * FROM t1 WHERE a=NULL; SELECT * FROM t1 WHERE a=NULL;
a b a b
explain SELECT * FROM t1 WHERE a IS NULL; explain SELECT * FROM t1 WHERE a IS NULL;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a a 5 const 10 where used 1 SIMPLE t1 ref a a 5 const 10 where used
SELECT * FROM t1 WHERE a<=>NULL; SELECT * FROM t1 WHERE a<=>NULL;
a b a b
NULL 99 NULL 99
SELECT * FROM t1 WHERE b=NULL; SELECT * FROM t1 WHERE b=NULL;
a b a b
explain SELECT * FROM t1 WHERE b IS NULL; explain SELECT * FROM t1 WHERE b IS NULL;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref b b 5 const 1 where used 1 SIMPLE t1 ref b b 5 const 1 where used
SELECT * FROM t1 WHERE b<=>NULL; SELECT * FROM t1 WHERE b<=>NULL;
a b a b
99 NULL 99 NULL
......
...@@ -139,14 +139,14 @@ id parent_id level ...@@ -139,14 +139,14 @@ id parent_id level
1010 102 2 1010 102 2
1015 102 2 1015 102 2
explain select level from t1 where level=1; explain select level from t1 where level=1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref level level 1 const 12 where used; Using index 1 SIMPLE t1 ref level level 1 const 12 where used; Using index
explain select level,id from t1 where level=1; explain select level,id from t1 where level=1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref level level 1 const 12 where used; Using index 1 SIMPLE t1 ref level level 1 const 12 where used; Using index
explain select level,id,parent_id from t1 where level=1; explain select level,id,parent_id from t1 where level=1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref level level 1 const 12 where used 1 SIMPLE t1 ref level level 1 const 12 where used
select level,id from t1 where level=1; select level,id from t1 where level=1;
level id level id
1 1002 1 1002
...@@ -596,8 +596,8 @@ id parent_id level ...@@ -596,8 +596,8 @@ id parent_id level
1025 102 2 1025 102 2
1016 102 2 1016 102 2
explain select level from t1 where level=1; explain select level from t1 where level=1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref level level 1 const 6 where used; Using index 1 SIMPLE t1 ref level level 1 const 6 where used; Using index
select level,id from t1 where level=1; select level,id from t1 where level=1;
level id level id
1 1004 1 1004
...@@ -758,8 +758,8 @@ DROP TABLE t1; ...@@ -758,8 +758,8 @@ DROP TABLE t1;
create table t1 (a int primary key,b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int, a1 int, a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int, b1 int, b2 int, b3 int, b4 int, b5 int, b6 int) type = innodb; create table t1 (a int primary key,b int, c int, d int, e int, f int, g int, h int, i int, j int, k int, l int, m int, n int, o int, p int, q int, r int, s int, t int, u int, v int, w int, x int, y int, z int, a1 int, a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int, b1 int, b2 int, b3 int, b4 int, b5 int, b6 int) type = innodb;
insert into t1 values (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1); insert into t1 values (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);
explain select * from t1 where a > 0 and a < 50; explain select * from t1 where a > 0 and a < 50;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range PRIMARY PRIMARY 4 NULL 1 where used 1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 1 where used
drop table t1; drop table t1;
create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(30),primary key (id,id2),index index_id3 (id3)) type=innodb; create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(30),primary key (id,id2),index index_id3 (id3)) type=innodb;
insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL'); insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL');
...@@ -892,29 +892,29 @@ drop table t1; ...@@ -892,29 +892,29 @@ drop table t1;
create table t1 (a int not null, b int not null, c int not null, primary key (a),key(b)) type=innodb; create table t1 (a int not null, b int not null, c int not null, primary key (a),key(b)) type=innodb;
insert into t1 values (3,3,3),(1,1,1),(2,2,2),(4,4,4); insert into t1 values (3,3,3),(1,1,1),(2,2,2),(4,4,4);
explain select * from t1 order by a; explain select * from t1 order by a;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL PRIMARY 4 NULL 4 1 SIMPLE t1 index NULL PRIMARY 4 NULL 4
explain select * from t1 order by b; explain select * from t1 order by b;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL b 4 NULL 4 1 SIMPLE t1 index NULL b 4 NULL 4
explain select * from t1 order by c; explain select * from t1 order by c;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 Using filesort 1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort
explain select a from t1 order by a; explain select a from t1 order by a;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL PRIMARY 4 NULL 4 Using index 1 SIMPLE t1 index NULL PRIMARY 4 NULL 4 Using index
explain select b from t1 order by b; explain select b from t1 order by b;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL b 4 NULL 4 Using index 1 SIMPLE t1 index NULL b 4 NULL 4 Using index
explain select a,b from t1 order by b; explain select a,b from t1 order by b;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL b 4 NULL 4 Using index 1 SIMPLE t1 index NULL b 4 NULL 4 Using index
explain select a,b from t1; explain select a,b from t1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL b 4 NULL 4 Using index 1 SIMPLE t1 index NULL b 4 NULL 4 Using index
explain select a,b,c from t1; explain select a,b,c from t1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 1 SIMPLE t1 ALL NULL NULL NULL NULL 4
drop table t1; drop table t1;
create table t1 (t int not null default 1, key (t)) type=innodb; create table t1 (t int not null default 1, key (t)) type=innodb;
desc t1; desc t1;
......
...@@ -90,12 +90,12 @@ grp a c id a c d ...@@ -90,12 +90,12 @@ grp a c id a c d
2 3 c NULL NULL NULL NULL 2 3 c NULL NULL NULL NULL
NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
explain select t1.*,t2.* from t1,t2 where t1.a=t2.a and isnull(t2.a)=1; explain select t1.*,t2.* from t1,t2 where t1.a=t2.a and isnull(t2.a)=1;
Comment id select_type table type possible_keys key key_len ref rows Extra
Impossible WHERE noticed after reading const tables 1 SIMPLE Impossible WHERE noticed after reading const tables
explain select t1.*,t2.* from t1 left join t2 on t1.a=t2.a where isnull(t2.a)=1; explain select t1.*,t2.* from t1 left join t2 on t1.a=t2.a where isnull(t2.a)=1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 7 1 SIMPLE t1 ALL NULL NULL NULL NULL 7
t2 eq_ref PRIMARY PRIMARY 8 t1.a 1 where used 1 SIMPLE t2 eq_ref PRIMARY PRIMARY 8 t1.a 1 where used
select t1.*,t2.*,t3.a from t1 left join t2 on (t1.a=t2.a) left join t1 as t3 on (t2.a=t3.a); select t1.*,t2.*,t3.a from t1 left join t2 on (t1.a=t2.a) left join t1 as t3 on (t2.a=t3.a);
grp a c id a c d a grp a c id a c d a
1 1 a 1 1 a 1 1 1 1 a 1 1 a 1 1
...@@ -311,13 +311,13 @@ select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where ...@@ -311,13 +311,13 @@ select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where
name name id name name id
Lilliana Angelovska NULL NULL Lilliana Angelovska NULL NULL
explain select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where t2.id is null; explain select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where t2.id is null;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 3 1 SIMPLE t1 ALL NULL NULL NULL NULL 3
t2 ALL NULL NULL NULL NULL 3 where used; Not exists 1 SIMPLE t2 ALL NULL NULL NULL NULL 3 where used; Not exists
explain select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where t2.name is null; explain select t1.name, t2.name, t2.id from t1 left join t2 on (t1.id = t2.owner) where t2.name is null;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 3 1 SIMPLE t1 ALL NULL NULL NULL NULL 3
t2 ALL NULL NULL NULL NULL 3 where used 1 SIMPLE t2 ALL NULL NULL NULL NULL 3 where used
select count(*) from t1 left join t2 on (t1.id = t2.owner); select count(*) from t1 left join t2 on (t1.id = t2.owner);
count(*) count(*)
4 4
...@@ -331,13 +331,13 @@ select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where ...@@ -331,13 +331,13 @@ select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where
name name id name name id
Lilliana Angelovska NULL NULL Lilliana Angelovska NULL NULL
explain select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where t2.id is null; explain select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where t2.id is null;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 3 1 SIMPLE t1 ALL NULL NULL NULL NULL 3
t2 ALL NULL NULL NULL NULL 3 where used; Not exists 1 SIMPLE t2 ALL NULL NULL NULL NULL 3 where used; Not exists
explain select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where t2.name is null; explain select t1.name, t2.name, t2.id from t2 right join t1 on (t1.id = t2.owner) where t2.name is null;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 3 1 SIMPLE t1 ALL NULL NULL NULL NULL 3
t2 ALL NULL NULL NULL NULL 3 where used 1 SIMPLE t2 ALL NULL NULL NULL NULL 3 where used
select count(*) from t2 right join t1 on (t1.id = t2.owner); select count(*) from t2 right join t1 on (t1.id = t2.owner);
count(*) count(*)
4 4
...@@ -618,9 +618,9 @@ UNIQUE id (id,idx) ...@@ -618,9 +618,9 @@ UNIQUE id (id,idx)
); );
INSERT INTO t2 VALUES (1,1); INSERT INTO t2 VALUES (1,1);
explain SELECT * from t1 left join t2 on t1.id=t2.id where t2.id IS NULL; explain SELECT * from t1 left join t2 on t1.id=t2.id where t2.id IS NULL;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 2 1 SIMPLE t1 ALL NULL NULL NULL NULL 2
t2 index id id 8 NULL 1 where used; Using index; Not exists 1 SIMPLE t2 index id id 8 NULL 1 where used; Using index; Not exists
SELECT * from t1 left join t2 on t1.id=t2.id where t2.id IS NULL; SELECT * from t1 left join t2 on t1.id=t2.id where t2.id IS NULL;
id name id idx id name id idx
2 no NULL NULL 2 no NULL NULL
...@@ -638,9 +638,9 @@ create table t2 (fooID smallint unsigned not null, barID smallint unsigned not n ...@@ -638,9 +638,9 @@ create table t2 (fooID smallint unsigned not null, barID smallint unsigned not n
insert into t1 (fooID) values (10),(20),(30); insert into t1 (fooID) values (10),(20),(30);
insert into t2 values (10,1),(20,2),(30,3); insert into t2 values (10,1),(20,2),(30,3);
explain select * from t2 left join t1 on t1.fooID = t2.fooID and t1.fooID = 30; explain select * from t2 left join t1 on t1.fooID = t2.fooID and t1.fooID = 30;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 index NULL PRIMARY 4 NULL 3 Using index 1 SIMPLE t2 index NULL PRIMARY 4 NULL 3 Using index
t1 eq_ref PRIMARY PRIMARY 2 const 1 where used; Using index 1 SIMPLE t1 eq_ref PRIMARY PRIMARY 2 const 1 where used; Using index
select * from t2 left join t1 on t1.fooID = t2.fooID and t1.fooID = 30; select * from t2 left join t1 on t1.fooID = t2.fooID and t1.fooID = 30;
fooID barID fooID fooID barID fooID
10 1 NULL 10 1 NULL
......
...@@ -34,9 +34,9 @@ C c a a ...@@ -34,9 +34,9 @@ C c a a
D E a a D E a a
a a a a a a a a
explain select t1.*,t2.* from t1,t1 as t2 where t1.A=t2.B; explain select t1.*,t2.* from t1,t1 as t2 where t1.A=t2.B;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL a NULL NULL NULL 5 1 SIMPLE t1 ALL a NULL NULL NULL 5
t2 ALL b NULL NULL NULL 5 where used 1 SIMPLE t2 ALL b NULL NULL NULL 5 where used
select t1.*,t2.* from t1,t1 as t2 where t1.A=t2.B order by binary t1.a,t2.a; select t1.*,t2.* from t1,t1 as t2 where t1.A=t2.B order by binary t1.a,t2.a;
a b a b a b a b
A B a a A B a a
......
...@@ -12,9 +12,9 @@ select * from t1 where t1 like "a_\%"; ...@@ -12,9 +12,9 @@ select * from t1 where t1 like "a_\%";
t1 t1
AB% AB%
describe select * from t1 where t1="ABC"; describe select * from t1 where t1="ABC";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 const PRIMARY PRIMARY 3 const 1 1 SIMPLE t1 const PRIMARY PRIMARY 3 const 1
describe select * from t1 where t1="ABCD"; describe select * from t1 where t1="ABCD";
Comment id select_type table type possible_keys key key_len ref rows Extra
Impossible WHERE noticed after reading const tables 1 SIMPLE Impossible WHERE noticed after reading const tables
drop table t1; drop table t1;
...@@ -34,11 +34,11 @@ insert into t2 select NULL,message from t1; ...@@ -34,11 +34,11 @@ insert into t2 select NULL,message from t1;
insert into t1 select NULL,message from t2; insert into t1 select NULL,message from t2;
create table t3 (a int not null, b char(20), key(a)) type=MERGE UNION=(test.t1,test.t2); create table t3 (a int not null, b char(20), key(a)) type=MERGE UNION=(test.t1,test.t2);
explain select * from t3 where a < 10; explain select * from t3 where a < 10;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t3 range a a 4 NULL 10 where used 1 SIMPLE t3 range a a 4 NULL 10 where used
explain select * from t3 where a > 10 and a < 20; explain select * from t3 where a > 10 and a < 20;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t3 range a a 4 NULL 10 where used 1 SIMPLE t3 range a a 4 NULL 10 where used
select * from t3 where a = 10; select * from t3 where a = 10;
a b a b
10 Testing 10 Testing
...@@ -84,8 +84,8 @@ a b ...@@ -84,8 +84,8 @@ a b
19 Testing 19 Testing
19 Testing 19 Testing
explain select a from t3 order by a desc limit 10; explain select a from t3 order by a desc limit 10;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t3 index NULL a 4 NULL 1131 Using index 1 SIMPLE t3 index NULL a 4 NULL 1131 Using index
select a from t3 order by a desc limit 10; select a from t3 order by a desc limit 10;
a a
699 699
......
...@@ -51,29 +51,29 @@ drop table t1; ...@@ -51,29 +51,29 @@ drop table t1;
create table t1 (a int not null, b int not null, c int not null, primary key (a),key(b)) type=myisam; create table t1 (a int not null, b int not null, c int not null, primary key (a),key(b)) type=myisam;
insert into t1 values (3,3,3),(1,1,1),(2,2,2),(4,4,4); insert into t1 values (3,3,3),(1,1,1),(2,2,2),(4,4,4);
explain select * from t1 order by a; explain select * from t1 order by a;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 Using filesort 1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort
explain select * from t1 order by b; explain select * from t1 order by b;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 Using filesort 1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort
explain select * from t1 order by c; explain select * from t1 order by c;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 Using filesort 1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort
explain select a from t1 order by a; explain select a from t1 order by a;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL PRIMARY 4 NULL 4 Using index 1 SIMPLE t1 index NULL PRIMARY 4 NULL 4 Using index
explain select b from t1 order by b; explain select b from t1 order by b;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL b 4 NULL 4 Using index 1 SIMPLE t1 index NULL b 4 NULL 4 Using index
explain select a,b from t1 order by b; explain select a,b from t1 order by b;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 Using filesort 1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort
explain select a,b from t1; explain select a,b from t1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 1 SIMPLE t1 ALL NULL NULL NULL NULL 4
explain select a,b,c from t1; explain select a,b,c from t1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 1 SIMPLE t1 ALL NULL NULL NULL NULL 4
drop table t1; drop table t1;
CREATE TABLE `t1` ( CREATE TABLE `t1` (
`post_id` mediumint(8) unsigned NOT NULL auto_increment, `post_id` mediumint(8) unsigned NOT NULL auto_increment,
......
...@@ -2,38 +2,38 @@ drop table if exists t1; ...@@ -2,38 +2,38 @@ drop table if exists t1;
create table t1 (a int, b int not null,unique key (a,b),index(b)) type=myisam; create table t1 (a int, b int not null,unique key (a,b),index(b)) type=myisam;
insert ignore into t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(null,7),(9,9),(8,8),(7,7),(null,9),(null,9),(6,6); insert ignore into t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(null,7),(9,9),(8,8),(7,7),(null,9),(null,9),(6,6);
explain select * from t1 where a is null; explain select * from t1 where a is null;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a a 5 const 3 where used; Using index 1 SIMPLE t1 ref a a 5 const 3 where used; Using index
explain select * from t1 where a is null and b = 2; explain select * from t1 where a is null and b = 2;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a,b a 9 const,const 1 where used; Using index 1 SIMPLE t1 ref a,b a 9 const,const 1 where used; Using index
explain select * from t1 where a is null and b = 7; explain select * from t1 where a is null and b = 7;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a,b a 9 const,const 1 where used; Using index 1 SIMPLE t1 ref a,b a 9 const,const 1 where used; Using index
explain select * from t1 where a=2 and b = 2; explain select * from t1 where a=2 and b = 2;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 const a,b a 9 const,const 1 1 SIMPLE t1 const a,b a 9 const,const 1
explain select * from t1 where a<=>b limit 2; explain select * from t1 where a<=>b limit 2;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL a 9 NULL 12 where used; Using index 1 SIMPLE t1 index NULL a 9 NULL 12 where used; Using index
explain select * from t1 where (a is null or a > 0 and a < 3) and b < 5 limit 3; explain select * from t1 where (a is null or a > 0 and a < 3) and b < 5 limit 3;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a,b a 9 NULL 3 where used; Using index 1 SIMPLE t1 range a,b a 9 NULL 3 where used; Using index
explain select * from t1 where (a is null or a = 7) and b=7; explain select * from t1 where (a is null or a = 7) and b=7;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a,b b 4 const 2 where used 1 SIMPLE t1 ref a,b b 4 const 2 where used
explain select * from t1 where (a is null and b>a) or a is null and b=7 limit 2; explain select * from t1 where (a is null and b>a) or a is null and b=7 limit 2;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a,b a 5 const 3 where used; Using index 1 SIMPLE t1 ref a,b a 5 const 3 where used; Using index
explain select * from t1 where a is null and b=9 or a is null and b=7 limit 3; explain select * from t1 where a is null and b=9 or a is null and b=7 limit 3;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a,b a 9 NULL 2 where used; Using index 1 SIMPLE t1 range a,b a 9 NULL 2 where used; Using index
explain select * from t1 where a > 1 and a < 3 limit 1; explain select * from t1 where a > 1 and a < 3 limit 1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 5 NULL 1 where used; Using index 1 SIMPLE t1 range a a 5 NULL 1 where used; Using index
explain select * from t1 where a > 8 and a < 9; explain select * from t1 where a > 8 and a < 9;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 5 NULL 1 where used; Using index 1 SIMPLE t1 range a a 5 NULL 1 where used; Using index
select * from t1 where a is null; select * from t1 where a is null;
a b a b
NULL 7 NULL 7
...@@ -65,44 +65,44 @@ NULL 9 ...@@ -65,44 +65,44 @@ NULL 9
NULL 9 NULL 9
alter table t1 modify b blob not null, add c int not null, drop key a, add unique key (a,b(20),c), drop key b, add key (b(10)); alter table t1 modify b blob not null, add c int not null, drop key a, add unique key (a,b(20),c), drop key b, add key (b(10));
explain select * from t1 where a is null and b = 2; explain select * from t1 where a is null and b = 2;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a,b a 5 const 3 where used 1 SIMPLE t1 ref a,b a 5 const 3 where used
explain select * from t1 where a is null and b = 2 and c=0; explain select * from t1 where a is null and b = 2 and c=0;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a,b a 5 const 3 where used 1 SIMPLE t1 ref a,b a 5 const 3 where used
explain select * from t1 where a is null and b = 7 and c=0; explain select * from t1 where a is null and b = 7 and c=0;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a,b a 5 const 3 where used 1 SIMPLE t1 ref a,b a 5 const 3 where used
explain select * from t1 where a=2 and b = 2; explain select * from t1 where a=2 and b = 2;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a,b a 5 const 1 where used 1 SIMPLE t1 ref a,b a 5 const 1 where used
explain select * from t1 where a<=>b limit 2; explain select * from t1 where a<=>b limit 2;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 12 where used 1 SIMPLE t1 ALL NULL NULL NULL NULL 12 where used
explain select * from t1 where (a is null or a > 0 and a < 3) and b < 5 and c=0 limit 3; explain select * from t1 where (a is null or a > 0 and a < 3) and b < 5 and c=0 limit 3;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a,b a 5 NULL 5 where used 1 SIMPLE t1 range a,b a 5 NULL 5 where used
explain select * from t1 where (a is null or a = 7) and b=7 and c=0; explain select * from t1 where (a is null or a = 7) and b=7 and c=0;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a,b a 5 NULL 4 where used 1 SIMPLE t1 range a,b a 5 NULL 4 where used
explain select * from t1 where (a is null and b>a) or a is null and b=7 limit 2; explain select * from t1 where (a is null and b>a) or a is null and b=7 limit 2;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a,b a 5 const 3 where used 1 SIMPLE t1 ref a,b a 5 const 3 where used
explain select * from t1 where a is null and b=9 or a is null and b=7 limit 3; explain select * from t1 where a is null and b=9 or a is null and b=7 limit 3;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a,b a 5 const 3 where used 1 SIMPLE t1 ref a,b a 5 const 3 where used
explain select * from t1 where a > 1 and a < 3 limit 1; explain select * from t1 where a > 1 and a < 3 limit 1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 5 NULL 1 where used 1 SIMPLE t1 range a a 5 NULL 1 where used
explain select * from t1 where a is null and b=7 or a > 1 and a < 3 limit 1; explain select * from t1 where a is null and b=7 or a > 1 and a < 3 limit 1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a,b a 5 NULL 4 where used 1 SIMPLE t1 range a,b a 5 NULL 4 where used
explain select * from t1 where a > 8 and a < 9; explain select * from t1 where a > 8 and a < 9;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 5 NULL 1 where used 1 SIMPLE t1 range a a 5 NULL 1 where used
explain select * from t1 where b like "6%"; explain select * from t1 where b like "6%";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range b b 12 NULL 1 where used 1 SIMPLE t1 range b b 12 NULL 1 where used
select * from t1 where a is null; select * from t1 where a is null;
a b c a b c
NULL 7 0 NULL 7 0
...@@ -151,11 +151,11 @@ PRIMARY KEY (id) ...@@ -151,11 +151,11 @@ PRIMARY KEY (id)
INSERT INTO t1 VALUES (1,NULL),(2,NULL),(3,1),(4,2),(5,NULL),(6,NULL),(7,3),(8,4),(9,NULL),(10,NULL); INSERT INTO t1 VALUES (1,NULL),(2,NULL),(3,1),(4,2),(5,NULL),(6,NULL),(7,3),(8,4),(9,NULL),(10,NULL);
INSERT INTO t2 VALUES (1,NULL),(2,NULL),(3,1),(4,2),(5,NULL),(6,NULL),(7,3),(8,4),(9,NULL),(10,NULL); INSERT INTO t2 VALUES (1,NULL),(2,NULL),(3,1),(4,2),(5,NULL),(6,NULL),(7,3),(8,4),(9,NULL),(10,NULL);
explain select id from t1 where uniq_id is null; explain select id from t1 where uniq_id is null;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref idx1 idx1 5 const 1 where used 1 SIMPLE t1 ref idx1 idx1 5 const 1 where used
explain select id from t1 where uniq_id =1; explain select id from t1 where uniq_id =1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 const idx1 idx1 5 const 1 1 SIMPLE t1 const idx1 idx1 5 const 1
UPDATE t1 SET id=id+100 where uniq_id is null; UPDATE t1 SET id=id+100 where uniq_id is null;
UPDATE t2 SET id=id+100 where uniq_id is null; UPDATE t2 SET id=id+100 where uniq_id is null;
select id from t1 where uniq_id is null; select id from t1 where uniq_id is null;
......
...@@ -11,6 +11,6 @@ a b ...@@ -11,6 +11,6 @@ a b
select * from t1 where a is null; select * from t1 where a is null;
a b a b
explain select * from t1 where b is null; explain select * from t1 where b is null;
Comment id select_type table type possible_keys key key_len ref rows Extra
Impossible WHERE noticed after reading const tables 1 SIMPLE Impossible WHERE noticed after reading const tables
drop table t1; drop table t1;
...@@ -263,14 +263,14 @@ drop table t1; ...@@ -263,14 +263,14 @@ drop table t1;
create table t1 (a int not null, b int, c varchar(10), key (a, b, c)); create table t1 (a int not null, b int, c varchar(10), key (a, b, c));
insert into t1 values (1, NULL, NULL), (1, NULL, 'b'), (1, 1, NULL), (1, 1, 'b'), (1, 1, 'b'), (2, 1, 'a'), (2, 1, 'b'), (2, 2, 'a'), (2, 2, 'b'), (2, 3, 'c'),(1,3,'b'); insert into t1 values (1, NULL, NULL), (1, NULL, 'b'), (1, 1, NULL), (1, 1, 'b'), (1, 1, 'b'), (2, 1, 'a'), (2, 1, 'b'), (2, 2, 'a'), (2, 2, 'b'), (2, 3, 'c'),(1,3,'b');
explain select * from t1 where (a = 1 and b is null and c = 'b') or (a > 2) order by a desc; explain select * from t1 where (a = 1 and b is null and c = 'b') or (a > 2) order by a desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 20 NULL 2 where used; Using index 1 SIMPLE t1 range a a 20 NULL 2 where used; Using index
select * from t1 where (a = 1 and b is null and c = 'b') or (a > 2) order by a desc; select * from t1 where (a = 1 and b is null and c = 'b') or (a > 2) order by a desc;
a b c a b c
1 NULL b 1 NULL b
explain select * from t1 where a >= 1 and a < 3 order by a desc; explain select * from t1 where a >= 1 and a < 3 order by a desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 4 NULL 10 where used; Using index 1 SIMPLE t1 range a a 4 NULL 10 where used; Using index
select * from t1 where a >= 1 and a < 3 order by a desc; select * from t1 where a >= 1 and a < 3 order by a desc;
a b c a b c
2 3 c 2 3 c
...@@ -285,8 +285,8 @@ a b c ...@@ -285,8 +285,8 @@ a b c
1 NULL b 1 NULL b
1 NULL NULL 1 NULL NULL
explain select * from t1 where a = 1 order by a desc, b desc; explain select * from t1 where a = 1 order by a desc, b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a a 4 const 5 where used; Using index 1 SIMPLE t1 ref a a 4 const 5 where used; Using index
select * from t1 where a = 1 order by a desc, b desc; select * from t1 where a = 1 order by a desc, b desc;
a b c a b c
1 3 b 1 3 b
...@@ -296,35 +296,35 @@ a b c ...@@ -296,35 +296,35 @@ a b c
1 NULL b 1 NULL b
1 NULL NULL 1 NULL NULL
explain select * from t1 where a = 1 and b is null order by a desc, b desc; explain select * from t1 where a = 1 and b is null order by a desc, b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a a 9 const,const 2 where used; Using index; Using filesort 1 SIMPLE t1 ref a a 9 const,const 2 where used; Using index; Using filesort
select * from t1 where a = 1 and b is null order by a desc, b desc; select * from t1 where a = 1 and b is null order by a desc, b desc;
a b c a b c
1 NULL NULL 1 NULL NULL
1 NULL b 1 NULL b
explain select * from t1 where a >= 1 and a < 3 and b >0 order by a desc,b desc; explain select * from t1 where a >= 1 and a < 3 and b >0 order by a desc,b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 8 where used; Using index; Using filesort 1 SIMPLE t1 range a a 9 NULL 8 where used; Using index; Using filesort
explain select * from t1 where a = 2 and b >0 order by a desc,b desc; explain select * from t1 where a = 2 and b >0 order by a desc,b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 5 where used; Using index 1 SIMPLE t1 range a a 9 NULL 5 where used; Using index
explain select * from t1 where a = 2 and b is null order by a desc,b desc; explain select * from t1 where a = 2 and b is null order by a desc,b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref a a 9 const,const 1 where used; Using index; Using filesort 1 SIMPLE t1 ref a a 9 const,const 1 where used; Using index; Using filesort
explain select * from t1 where a = 2 and (b is null or b > 0) order by a explain select * from t1 where a = 2 and (b is null or b > 0) order by a
desc,b desc; desc,b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 6 where used; Using index 1 SIMPLE t1 range a a 9 NULL 6 where used; Using index
explain select * from t1 where a = 2 and b > 0 order by a desc,b desc; explain select * from t1 where a = 2 and b > 0 order by a desc,b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 5 where used; Using index 1 SIMPLE t1 range a a 9 NULL 5 where used; Using index
explain select * from t1 where a = 2 and b < 2 order by a desc,b desc; explain select * from t1 where a = 2 and b < 2 order by a desc,b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 9 NULL 2 where used; Using index; Using filesort 1 SIMPLE t1 range a a 9 NULL 2 where used; Using index; Using filesort
alter table t1 modify b int not null, modify c varchar(10) not null; alter table t1 modify b int not null, modify c varchar(10) not null;
explain select * from t1 order by a, b, c; explain select * from t1 order by a, b, c;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL a 18 NULL 11 Using index 1 SIMPLE t1 index NULL a 18 NULL 11 Using index
select * from t1 order by a, b, c; select * from t1 order by a, b, c;
a b c a b c
1 0 1 0
...@@ -339,8 +339,8 @@ a b c ...@@ -339,8 +339,8 @@ a b c
2 2 b 2 2 b
2 3 c 2 3 c
explain select * from t1 order by a desc, b desc, c desc; explain select * from t1 order by a desc, b desc, c desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL a 18 NULL 11 Using index 1 SIMPLE t1 index NULL a 18 NULL 11 Using index
select * from t1 order by a desc, b desc, c desc; select * from t1 order by a desc, b desc, c desc;
a b c a b c
2 3 c 2 3 c
...@@ -355,15 +355,15 @@ a b c ...@@ -355,15 +355,15 @@ a b c
1 0 b 1 0 b
1 0 1 0
explain select * from t1 where (a = 1 and b = 1 and c = 'b') or (a > 2) order by a desc; explain select * from t1 where (a = 1 and b = 1 and c = 'b') or (a > 2) order by a desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 18 NULL 3 where used; Using index 1 SIMPLE t1 range a a 18 NULL 3 where used; Using index
select * from t1 where (a = 1 and b = 1 and c = 'b') or (a > 2) order by a desc; select * from t1 where (a = 1 and b = 1 and c = 'b') or (a > 2) order by a desc;
a b c a b c
1 1 b 1 1 b
1 1 b 1 1 b
explain select * from t1 where a < 2 and b <= 1 order by a desc, b desc; explain select * from t1 where a < 2 and b <= 1 order by a desc, b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 4 NULL 6 where used; Using index 1 SIMPLE t1 range a a 4 NULL 6 where used; Using index
select * from t1 where a < 2 and b <= 1 order by a desc, b desc; select * from t1 where a < 2 and b <= 1 order by a desc, b desc;
a b c a b c
1 1 b 1 1 b
...@@ -386,8 +386,8 @@ a b c ...@@ -386,8 +386,8 @@ a b c
1 1 b 1 1 b
1 1 1 1
explain select * from t1 where a between 1 and 3 and b <= 1 order by a desc, b desc; explain select * from t1 where a between 1 and 3 and b <= 1 order by a desc, b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 8 NULL 10 where used; Using index 1 SIMPLE t1 range a a 8 NULL 10 where used; Using index
select * from t1 where a between 1 and 3 and b <= 1 order by a desc, b desc; select * from t1 where a between 1 and 3 and b <= 1 order by a desc, b desc;
a b c a b c
2 1 b 2 1 b
...@@ -398,8 +398,8 @@ a b c ...@@ -398,8 +398,8 @@ a b c
1 0 b 1 0 b
1 0 1 0
explain select * from t1 where a between 0 and 1 order by a desc, b desc; explain select * from t1 where a between 0 and 1 order by a desc, b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 4 NULL 5 where used; Using index 1 SIMPLE t1 range a a 4 NULL 5 where used; Using index
select * from t1 where a between 0 and 1 order by a desc, b desc; select * from t1 where a between 0 and 1 order by a desc, b desc;
a b c a b c
1 3 b 1 3 b
...@@ -449,27 +449,27 @@ gid sid uid ...@@ -449,27 +449,27 @@ gid sid uid
104505 5 117 104505 5 117
103853 5 250 103853 5 250
EXPLAIN select t1.gid, t2.sid, t3.uid from t3, t2, t1 where t2.gid = t1.gid and t2.uid = t3.uid order by t1.gid, t3.uid; EXPLAIN select t1.gid, t2.sid, t3.uid from t3, t2, t1 where t2.gid = t1.gid and t2.uid = t3.uid order by t1.gid, t3.uid;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 6 Using index 1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index
t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 1 SIMPLE t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1
t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index 1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t1.gid,t3.skr; EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t1.gid,t3.skr;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 6 Using index 1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index
t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used 1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used
EXPLAIN SELECT t1.gid, t2.sid, t3.uid from t2, t1, t3 where t2.gid = t1.gid and t2.uid = t3.uid order by t3.uid, t1.gid; EXPLAIN SELECT t1.gid, t2.sid, t3.uid from t2, t1, t3 where t2.gid = t1.gid and t2.uid = t3.uid order by t3.uid, t1.gid;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort 1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort
t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1 1 SIMPLE t2 eq_ref PRIMARY,uid PRIMARY 4 t1.gid 1
t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index 1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t2.uid 1 where used; Using index
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t3.skr,t1.gid; EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.gid = t3.uid order by t3.skr,t1.gid;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort 1 SIMPLE t1 index PRIMARY PRIMARY 4 NULL 6 Using index; Using temporary; Using filesort
t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used 1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t1.gid 1 where used
EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.skr = t3.uid order by t1.gid,t3.skr; EXPLAIN SELECT t1.gid, t3.uid from t1, t3 where t1.skr = t3.uid order by t1.gid,t3.skr;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort 1 SIMPLE t1 ALL NULL NULL NULL NULL 6 Using temporary; Using filesort
t3 eq_ref PRIMARY PRIMARY 2 t1.skr 1 where used 1 SIMPLE t3 eq_ref PRIMARY PRIMARY 2 t1.skr 1 where used
drop table t1,t2,t3; drop table t1,t2,t3;
CREATE TABLE t1 ( CREATE TABLE t1 (
`titre` char(80) NOT NULL default '', `titre` char(80) NOT NULL default '',
......
...@@ -15,8 +15,8 @@ event_date type event_id ...@@ -15,8 +15,8 @@ event_date type event_id
1999-07-13 100600 26 1999-07-13 100600 26
1999-07-14 100600 10 1999-07-14 100600 10
explain select event_date,type,event_id from t1 WHERE type = 100601 and event_date >= "1999-07-01" AND event_date < "1999-07-15" AND (type=100600 OR type=100100) ORDER BY event_date; explain select event_date,type,event_id from t1 WHERE type = 100601 and event_date >= "1999-07-01" AND event_date < "1999-07-15" AND (type=100600 OR type=100100) ORDER BY event_date;
Comment id select_type table type possible_keys key key_len ref rows Extra
Impossible WHERE 1 SIMPLE Impossible WHERE
select event_date,type,event_id from t1 WHERE event_date >= "1999-07-01" AND event_date <= "1999-07-15" AND (type=100600 OR type=100100) or event_date >= "1999-07-01" AND event_date <= "1999-07-15" AND type=100099; select event_date,type,event_id from t1 WHERE event_date >= "1999-07-01" AND event_date <= "1999-07-15" AND (type=100600 OR type=100100) or event_date >= "1999-07-01" AND event_date <= "1999-07-15" AND type=100099;
event_date type event_id event_date type event_id
1999-07-10 100100 24 1999-07-10 100100 24
......
...@@ -1327,20 +1327,20 @@ fld3 ...@@ -1327,20 +1327,20 @@ fld3
select t2.fld3 from t2 where fld3 LIKE 'don_t_find_me_please%'; select t2.fld3 from t2 where fld3 LIKE 'don_t_find_me_please%';
fld3 fld3
explain select t2.fld3 from t2 where fld3 = 'honeysuckle'; explain select t2.fld3 from t2 where fld3 = 'honeysuckle';
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 ref fld3 fld3 30 const 1 where used; Using index 1 SIMPLE t2 ref fld3 fld3 30 const 1 where used; Using index
explain select fld3 from t2 ignore index (fld3) where fld3 = 'honeysuckle'; explain select fld3 from t2 ignore index (fld3) where fld3 = 'honeysuckle';
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 index NULL fld3 30 NULL 1199 where used; Using index 1 SIMPLE t2 index NULL fld3 30 NULL 1199 where used; Using index
explain select fld3 from t2 use index (fld1) where fld3 = 'honeysuckle'; explain select fld3 from t2 use index (fld1) where fld3 = 'honeysuckle';
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 index NULL fld3 30 NULL 1199 where used; Using index 1 SIMPLE t2 index NULL fld3 30 NULL 1199 where used; Using index
explain select fld3 from t2 use index (fld3) where fld3 = 'honeysuckle'; explain select fld3 from t2 use index (fld3) where fld3 = 'honeysuckle';
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 ref fld3 fld3 30 const 1 where used; Using index 1 SIMPLE t2 ref fld3 fld3 30 const 1 where used; Using index
explain select fld3 from t2 use index (fld1,fld3) where fld3 = 'honeysuckle'; explain select fld3 from t2 use index (fld1,fld3) where fld3 = 'honeysuckle';
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 ref fld3 fld3 30 const 1 where used; Using index 1 SIMPLE t2 ref fld3 fld3 30 const 1 where used; Using index
explain select fld3 from t2 ignore index (fld3,not_used); explain select fld3 from t2 ignore index (fld3,not_used);
Key column 'not_used' doesn't exist in table Key column 'not_used' doesn't exist in table
explain select fld3 from t2 use index (not_used); explain select fld3 from t2 use index (not_used);
...@@ -1350,8 +1350,8 @@ fld3 ...@@ -1350,8 +1350,8 @@ fld3
honeysuckle honeysuckle
honoring honoring
explain select t2.fld3 from t2 where fld3 >= 'honeysuckle' and fld3 <= 'honoring' order by fld3; explain select t2.fld3 from t2 where fld3 >= 'honeysuckle' and fld3 <= 'honoring' order by fld3;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 range fld3 fld3 30 NULL 2 where used; Using index 1 SIMPLE t2 range fld3 fld3 30 NULL 2 where used; Using index
select fld1,fld3 from t2 where fld3="Colombo" or fld3 = "nondecreasing" order by fld3; select fld1,fld3 from t2 where fld3="Colombo" or fld3 = "nondecreasing" order by fld3;
fld1 fld3 fld1 fld3
148504 Colombo 148504 Colombo
...@@ -1370,8 +1370,8 @@ fld1 ...@@ -1370,8 +1370,8 @@ fld1
250501 250501
250502 250502
explain select fld1 from t2 where fld1=250501 or fld1="250502"; explain select fld1 from t2 where fld1=250501 or fld1="250502";
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 range fld1 fld1 4 NULL 2 where used; Using index 1 SIMPLE t2 range fld1 fld1 4 NULL 2 where used; Using index
select fld1 from t2 where fld1=250501 or fld1=250502 or fld1 >= 250505 and fld1 <= 250601 or fld1 between 250501 and 250502; select fld1 from t2 where fld1=250501 or fld1=250502 or fld1 >= 250505 and fld1 <= 250601 or fld1 between 250501 and 250502;
fld1 fld1
250501 250501
...@@ -1379,8 +1379,8 @@ fld1 ...@@ -1379,8 +1379,8 @@ fld1
250505 250505
250601 250601
explain select fld1 from t2 where fld1=250501 or fld1=250502 or fld1 >= 250505 and fld1 <= 250601 or fld1 between 250501 and 250502; explain select fld1 from t2 where fld1=250501 or fld1=250502 or fld1 >= 250505 and fld1 <= 250601 or fld1 between 250501 and 250502;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 range fld1 fld1 4 NULL 4 where used; Using index 1 SIMPLE t2 range fld1 fld1 4 NULL 4 where used; Using index
select fld1,fld3 from t2 where companynr = 37 and fld3 like 'f%'; select fld1,fld3 from t2 where companynr = 37 and fld3 like 'f%';
fld1 fld3 fld1 fld3
218401 faithful 218401 faithful
...@@ -1806,21 +1806,21 @@ companynr rtrim(space(512+companynr)) ...@@ -1806,21 +1806,21 @@ companynr rtrim(space(512+companynr))
select distinct fld3 from t2,t3 where t2.companynr = 34 and t2.fld1=t3.t2nr order by fld3; select distinct fld3 from t2,t3 where t2.companynr = 34 and t2.fld1=t3.t2nr order by fld3;
fld3 fld3
explain select t3.t2nr,fld3 from t2,t3 where t2.companynr = 34 and t2.fld1=t3.t2nr order by t3.t2nr,fld3; explain select t3.t2nr,fld3 from t2,t3 where t2.companynr = 34 and t2.fld1=t3.t2nr order by t3.t2nr,fld3;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 ALL fld1 NULL NULL NULL 1199 where used; Using temporary; Using filesort 1 SIMPLE t2 ALL fld1 NULL NULL NULL 1199 where used; Using temporary; Using filesort
t3 eq_ref PRIMARY PRIMARY 4 t2.fld1 1 where used; Using index 1 SIMPLE t3 eq_ref PRIMARY PRIMARY 4 t2.fld1 1 where used; Using index
explain select * from t3 as t1,t3 where t1.period=t3.period order by t3.period; explain select * from t3 as t1,t3 where t1.period=t3.period order by t3.period;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL period NULL NULL NULL 41810 Using temporary; Using filesort 1 SIMPLE t1 ALL period NULL NULL NULL 41810 Using temporary; Using filesort
t3 ref period period 4 t1.period 4181 1 SIMPLE t3 ref period period 4 t1.period 4181
explain select * from t3 as t1,t3 where t1.period=t3.period order by t3.period limit 10; explain select * from t3 as t1,t3 where t1.period=t3.period order by t3.period limit 10;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t3 index period period 4 NULL 41810 1 SIMPLE t3 index period period 4 NULL 41810
t1 ref period period 4 t3.period 4181 1 SIMPLE t1 ref period period 4 t3.period 4181
explain select * from t3 as t1,t3 where t1.period=t3.period order by t1.period limit 10; explain select * from t3 as t1,t3 where t1.period=t3.period order by t1.period limit 10;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index period period 4 NULL 41810 1 SIMPLE t1 index period period 4 NULL 41810
t3 ref period period 4 t1.period 4181 1 SIMPLE t3 ref period period 4 t1.period 4181
select period from t1; select period from t1;
period period
9410 9410
...@@ -1833,9 +1833,9 @@ select fld3,period from t2,t3 where t2.fld1 = 011401 and t2.fld1=t3.t2nr and t3. ...@@ -1833,9 +1833,9 @@ select fld3,period from t2,t3 where t2.fld1 = 011401 and t2.fld1=t3.t2nr and t3.
fld3 period fld3 period
breaking 1001 breaking 1001
explain select fld3,period from t2,t3 where t2.fld1 = 011401 and t3.t2nr=t2.fld1 and 1001 = t3.period; explain select fld3,period from t2,t3 where t2.fld1 = 011401 and t3.t2nr=t2.fld1 and 1001 = t3.period;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 const fld1 fld1 4 const 1 1 SIMPLE t2 const fld1 fld1 4 const 1
t3 const PRIMARY,period PRIMARY 4 const 1 1 SIMPLE t3 const PRIMARY,period PRIMARY 4 const 1
select fld3,period from t2,t1 where companynr*10 = 37*10; select fld3,period from t2,t1 where companynr*10 = 37*10;
fld3 period fld3 period
breaking 9410 breaking 9410
...@@ -2573,21 +2573,21 @@ fld1 fld1 ...@@ -2573,21 +2573,21 @@ fld1 fld1
select t2.companynr,companyname from t2 left join t4 using (companynr) where t4.companynr is null; select t2.companynr,companyname from t2 left join t4 using (companynr) where t4.companynr is null;
companynr companyname companynr companyname
explain select t2.companynr,companyname from t2 left join t4 using (companynr) where t4.companynr is null; explain select t2.companynr,companyname from t2 left join t4 using (companynr) where t4.companynr is null;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 ALL NULL NULL NULL NULL 1199 1 SIMPLE t2 ALL NULL NULL NULL NULL 1199
t4 eq_ref PRIMARY PRIMARY 1 test.t2.companynr 1 where used; Not exists 1 SIMPLE t4 eq_ref PRIMARY PRIMARY 1 test.t2.companynr 1 where used; Not exists
explain select t2.companynr,companyname from t4 left join t2 using (companynr) where t2.companynr is null; explain select t2.companynr,companyname from t4 left join t2 using (companynr) where t2.companynr is null;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t4 ALL NULL NULL NULL NULL 12 1 SIMPLE t4 ALL NULL NULL NULL NULL 12
t2 ALL NULL NULL NULL NULL 1199 where used; Not exists 1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 where used; Not exists
select distinct t2.companynr,t4.companynr from t2,t4 where t2.companynr=t4.companynr+1; select distinct t2.companynr,t4.companynr from t2,t4 where t2.companynr=t4.companynr+1;
companynr companynr companynr companynr
37 36 37 36
41 40 41 40
explain select distinct t2.companynr,t4.companynr from t2,t4 where t2.companynr=t4.companynr+1; explain select distinct t2.companynr,t4.companynr from t2,t4 where t2.companynr=t4.companynr+1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 ALL NULL NULL NULL NULL 1199 Using temporary 1 SIMPLE t2 ALL NULL NULL NULL NULL 1199 Using temporary
t4 index NULL PRIMARY 1 NULL 12 where used; Using index 1 SIMPLE t4 index NULL PRIMARY 1 NULL 12 where used; Using index
select t2.fld1,t2.companynr,fld3,period from t3,t2 where t2.fld1 = 38208 and t2.fld1=t3.t2nr and period = 1008 or t2.fld1 = 38008 and t2.fld1 =t3.t2nr and period = 1008; select t2.fld1,t2.companynr,fld3,period from t3,t2 where t2.fld1 = 38208 and t2.fld1=t3.t2nr and period = 1008 or t2.fld1 = 38008 and t2.fld1 =t3.t2nr and period = 1008;
fld1 companynr fld3 period fld1 companynr fld3 period
038008 37 reporters 1008 038008 37 reporters 1008
...@@ -3096,11 +3096,11 @@ select t2.fld1,sum(price) from t3,t2 where t2.fld1 = t3.t2nr and t3.companynr = ...@@ -3096,11 +3096,11 @@ select t2.fld1,sum(price) from t3,t2 where t2.fld1 = t3.t2nr and t3.companynr =
fld1 sum(price) fld1 sum(price)
038008 234298 038008 234298
explain select fld3 from t2 where 1>2 or 2>3; explain select fld3 from t2 where 1>2 or 2>3;
Comment id select_type table type possible_keys key key_len ref rows Extra
Impossible WHERE 1 SIMPLE Impossible WHERE
explain select fld3 from t2 where fld1=fld1; explain select fld3 from t2 where fld1=fld1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 ALL NULL NULL NULL NULL 1199 1 SIMPLE t2 ALL NULL NULL NULL NULL 1199
select companynr,fld1 from t2 HAVING fld1=250501 or fld1=250502; select companynr,fld1 from t2 HAVING fld1=250501 or fld1=250502;
companynr fld1 companynr fld1
34 250501 34 250501
...@@ -3151,8 +3151,8 @@ select count(*) from t3 where companynr=512 and price2=76234234; ...@@ -3151,8 +3151,8 @@ select count(*) from t3 where companynr=512 and price2=76234234;
count(*) count(*)
4181 4181
explain select min(fld1),max(fld1),count(*) from t2; explain select min(fld1),max(fld1),count(*) from t2;
Comment id select_type table type possible_keys key key_len ref rows Extra
Select tables optimized away 1 SIMPLE Select tables optimized away
select min(fld1),max(fld1),count(*) from t2; select min(fld1),max(fld1),count(*) from t2;
min(fld1) max(fld1) count(*) min(fld1) max(fld1) count(*)
0 1232609 1199 0 1232609 1199
......
select (select 2); select (select 2);
(select 2) (select 2)
2 2
drop table if exists t1,t2,t3,t4,attend,clinic; drop table if exists t1,t2,t3,t4,t5,attend,clinic;
create table t1 (a int); create table t1 (a int);
create table t2 (a int, b int); create table t2 (a int, b int);
create table t3 (a int); create table t3 (a int);
...@@ -46,6 +46,13 @@ a b ...@@ -46,6 +46,13 @@ a b
2 7 2 7
3 8 3 8
4 8 4 8
explain select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1)
union (select * from t4 where t4.b=(select max(t2.a)*4 from t2) order by a);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t2 ALL NULL NULL NULL NULL 2 where used
3 UNION t4 ALL NULL NULL NULL NULL 3 where used; Using filesort
4 SUBSELECT t2 ALL NULL NULL NULL NULL 2
2 SUBSELECT t3 ALL NULL NULL NULL NULL 3 Using filesort
select (select a from t3 where a<t2.a*4 order by 1 desc limit 1), a from t2; select (select a from t3 where a<t2.a*4 order by 1 desc limit 1), a from t2;
(select a from t3 where a<t2.a*4 order by 1 desc limit 1) a (select a from t3 where a<t2.a*4 order by 1 desc limit 1) a
3 1 3 1
...@@ -54,6 +61,12 @@ select (select t3.a from t3 where a<8 order by 1 desc limit 1), a from ...@@ -54,6 +61,12 @@ select (select t3.a from t3 where a<8 order by 1 desc limit 1), a from
(select * from t2 where a>1) as tt; (select * from t2 where a>1) as tt;
(select t3.a from t3 where a<8 order by 1 desc limit 1) a (select t3.a from t3 where a<8 order by 1 desc limit 1) a
7 2 7 2
explain select (select t3.a from t3 where a<8 order by 1 desc limit 1), a from
(select * from t2 where a>1) as tt;
id select_type table type possible_keys key key_len ref rows Extra
3 DERIVED t2 ALL NULL NULL NULL NULL 2 where used
1 PRIMARY <derived3> system NULL NULL NULL NULL 1
2 SUBSELECT t3 ALL NULL NULL NULL NULL 3 where used; Using filesort
select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3) order by 1 desc limit 1); select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3) order by 1 desc limit 1);
a a
2 2
...@@ -67,6 +80,11 @@ b (select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) ...@@ -67,6 +80,11 @@ b (select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2)
8 7.5000 8 7.5000
8 4.5000 8 4.5000
9 7.5000 9 7.5000
explain select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t4 ALL NULL NULL NULL NULL 3
2 DEPENDENT SUBSELECT t2 ALL NULL NULL NULL NULL 2
3 DEPENDENT SUBSELECT t3 ALL NULL NULL NULL NULL 3 where used
select * from t3 where exists (select * from t2 where t2.b=t3.a); select * from t3 where exists (select * from t2 where t2.b=t3.a);
a a
7 7
...@@ -82,6 +100,28 @@ select b,max(a) as ma from t4 group by b having b >= (select max(t2.a) ...@@ -82,6 +100,28 @@ select b,max(a) as ma from t4 group by b having b >= (select max(t2.a)
from t2 where t2.b=t4.b); from t2 where t2.b=t4.b);
b ma b ma
7 12 7 12
create table t5 (a int);
select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2;
(select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a) a
NULL 1
2 2
insert into t5 values (5);
select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2;
(select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a) a
NULL 1
2 2
insert into t5 values (2);
select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2;
(select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a) a
NULL 1
2 2
explain select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t2 ALL NULL NULL NULL NULL 2
2 DEPENDENT SUBSELECT t1 system NULL NULL NULL NULL 1 where used
3 DEPENDENT UNION t5 ALL NULL NULL NULL NULL 2 where used
select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2;
Subselect return more than 1 record
create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq)); create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq));
create table clinic( uq int primary key, name char(25)); create table clinic( uq int primary key, name char(25));
insert into clinic values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta"); insert into clinic values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta");
...@@ -91,4 +131,20 @@ patient_uq clinic_uq ...@@ -91,4 +131,20 @@ patient_uq clinic_uq
1 1 1 1
1 2 1 2
2 2 2 2
drop table t1,t2,t3,t4,attend,clinic; drop table if exists t1,t2,t3;
CREATE TABLE t3 (a varchar(20),b char(1) NOT NULL default '0');
INSERT INTO t3 VALUES ('W','a'),('A','c'),('J','b');
CREATE TABLE t2 (a varchar(20),b int NOT NULL default '0');
INSERT INTO t2 VALUES ('W','1'),('A','3'),('J','2');
CREATE TABLE t1 (a varchar(20),b date NOT NULL default '0000-00-00');
INSERT INTO t1 VALUES ('W','1732-02-22'),('A','1735-10-30'),('J','1743-04-13');
SELECT * FROM t1 WHERE b = (SELECT MIN(b) FROM t1);
a b
W 1732-02-22
SELECT * FROM t2 WHERE b = (SELECT MIN(b) FROM t2);
a b
W 1
SELECT * FROM t3 WHERE b = (SELECT MIN(b) FROM t3);
a b
W a
drop table t1,t2,t3,t4,t5,attend,clinic;
...@@ -75,6 +75,6 @@ date numfacture expedition ...@@ -75,6 +75,6 @@ date numfacture expedition
0000-00-00 00:00:00 0 0001-00-00 00:00:00 0000-00-00 00:00:00 0 0001-00-00 00:00:00
0000-00-00 00:00:00 1212 0001-00-00 00:00:00 0000-00-00 00:00:00 1212 0001-00-00 00:00:00
EXPLAIN SELECT * FROM t1 WHERE expedition='0001-00-00 00:00:00'; EXPLAIN SELECT * FROM t1 WHERE expedition='0001-00-00 00:00:00';
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref expedition expedition 8 const 1 where used 1 SIMPLE t1 ref expedition expedition 8 const 1 where used
drop table t1; drop table t1;
...@@ -85,35 +85,31 @@ a b ...@@ -85,35 +85,31 @@ a b
2 b 2 b
1 a 1 a
explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 1 PRIMARY t1 ALL NULL NULL NULL NULL 4
t2 ALL NULL NULL NULL NULL 4 Using filesort 2 UNION t2 ALL NULL NULL NULL NULL 4 Using filesort
(select sql_calc_found_rows a,b from t1 limit 2) union all (select a,b from t2 order by a) limit 2;
a b
1 a
2 b
select found_rows(); select found_rows();
FOUND_ROWS() FOUND_ROWS()
6 0
explain select a,b from t1 union all select a,b from t2; explain select a,b from t1 union all select a,b from t2;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 1 PRIMARY t1 ALL NULL NULL NULL NULL 4
t2 ALL NULL NULL NULL NULL 4 2 UNION t2 ALL NULL NULL NULL NULL 4
explain select xx from t1 union select 1; explain select xx from t1 union select 1;
Unknown column 'xx' in 'field list' Unknown column 'xx' in 'field list'
explain select a,b from t1 union select 1; explain select a,b from t1 union select 1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 1 PRIMARY t1 ALL NULL NULL NULL NULL 4
0 0 No tables used 2 UNION No tables used
explain select 1 union select a,b from t1 union select 1; explain select 1 union select a,b from t1 union select 1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
0 0 No tables used 1 PRIMARY No tables used
t1 ALL NULL NULL NULL NULL 4 2 UNION t1 ALL NULL NULL NULL NULL 4
0 0 No tables used 3 UNION No tables used
explain select a,b from t1 union select 1 limit 0; explain select a,b from t1 union select 1 limit 0;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4 1 PRIMARY Impossible WHERE
0 0 Impossible WHERE 2 UNION Impossible WHERE
select a,b from t1 into outfile 'skr' union select a,b from t2; select a,b from t1 into outfile 'skr' union select a,b from t2;
Wrong usage of UNION and INTO Wrong usage of UNION and INTO
select a,b from t1 order by a union select a,b from t2; select a,b from t1 order by a union select a,b from t2;
......
...@@ -18,15 +18,15 @@ i @vv1:=if(sv1.i,1,0) @vv2:=if(sv2.i,1,0) @vv3:=if(sv3.i,1,0) @vv1+@vv2+@vv3 ...@@ -18,15 +18,15 @@ i @vv1:=if(sv1.i,1,0) @vv2:=if(sv2.i,1,0) @vv3:=if(sv3.i,1,0) @vv1+@vv2+@vv3
1 1 0 1 2 1 1 0 1 2
2 1 0 0 1 2 1 0 0 1
explain select * from t1 where i=@vv1; explain select * from t1 where i=@vv1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref i i 4 const 1 where used 1 SIMPLE t1 ref i i 4 const 1 where used
explain select * from t1 where @vv1:=@vv1+1 and i=@vv1; explain select * from t1 where @vv1:=@vv1+1 and i=@vv1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 3 where used 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 where used
explain select @vv1:=i from t1 where i=@vv1; explain select @vv1:=i from t1 where i=@vv1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 index NULL i 4 NULL 3 where used; Using index 1 SIMPLE t1 index NULL i 4 NULL 3 where used; Using index
explain select * from t1 where i=@vv1; explain select * from t1 where i=@vv1;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ref i i 4 const 1 where used 1 SIMPLE t1 ref i i 4 const 1 where used
drop table t1,t2; drop table t1,t2;
...@@ -12,8 +12,8 @@ create table t1 (ID int(8) unsigned zerofill not null auto_increment,UNIQ bigint ...@@ -12,8 +12,8 @@ create table t1 (ID int(8) unsigned zerofill not null auto_increment,UNIQ bigint
insert into t1 set UNIQ=0x38afba1d73e6a18a; insert into t1 set UNIQ=0x38afba1d73e6a18a;
insert into t1 set UNIQ=123; insert into t1 set UNIQ=123;
explain select * from t1 where UNIQ=0x38afba1d73e6a18a; explain select * from t1 where UNIQ=0x38afba1d73e6a18a;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 const UNIQ UNIQ 8 const 1 1 SIMPLE t1 const UNIQ UNIQ 8 const 1
drop table t1; drop table t1;
select x'hello'; select x'hello';
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'x'hello'' at line 1 You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'x'hello'' at line 1
......
select (select 2); select (select 2);
drop table if exists t1,t2,t3,t4,attend,clinic; drop table if exists t1,t2,t3,t4,t5,attend,clinic;
create table t1 (a int); create table t1 (a int);
create table t2 (a int, b int); create table t2 (a int, b int);
create table t3 (a int); create table t3 (a int);
...@@ -19,13 +19,18 @@ select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1) ...@@ -19,13 +19,18 @@ select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1)
union (select * from t4 order by a limit 2) limit 3; union (select * from t4 order by a limit 2) limit 3;
select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1) select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1)
union (select * from t4 where t4.b=(select max(t2.a)*4 from t2) order by a); union (select * from t4 where t4.b=(select max(t2.a)*4 from t2) order by a);
explain select * from t2 where t2.b=(select a from t3 order by 1 desc limit 1)
union (select * from t4 where t4.b=(select max(t2.a)*4 from t2) order by a);
select (select a from t3 where a<t2.a*4 order by 1 desc limit 1), a from t2; select (select a from t3 where a<t2.a*4 order by 1 desc limit 1), a from t2;
select (select t3.a from t3 where a<8 order by 1 desc limit 1), a from select (select t3.a from t3 where a<8 order by 1 desc limit 1), a from
(select * from t2 where a>1) as tt; (select * from t2 where a>1) as tt;
explain select (select t3.a from t3 where a<8 order by 1 desc limit 1), a from
(select * from t2 where a>1) as tt;
select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3) order by 1 desc limit 1); select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3) order by 1 desc limit 1);
select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a > t1.a) order by 1 desc limit 1); select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a > t1.a) order by 1 desc limit 1);
select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a < t1.a) order by 1 desc limit 1); select * from t1 where t1.a=(select t2.a from t2 where t2.b=(select max(a) from t3 where t3.a < t1.a) order by 1 desc limit 1);
select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4; select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4;
explain select b,(select avg(t2.a+(select min(t3.a) from t3 where t3.a >= t4.a)) from t2) from t4;
select * from t3 where exists (select * from t2 where t2.b=t3.a); select * from t3 where exists (select * from t2 where t2.b=t3.a);
select * from t3 where not exists (select * from t2 where t2.b=t3.a); select * from t3 where not exists (select * from t2 where t2.b=t3.a);
insert into t4 values (12,7),(1,7),(10,9),(9,6),(7,6),(3,9); insert into t4 values (12,7),(1,7),(10,9),(9,6),(7,6),(3,9);
...@@ -33,11 +38,32 @@ select b,max(a) as ma from t4 group by b having b < (select max(t2.a) ...@@ -33,11 +38,32 @@ select b,max(a) as ma from t4 group by b having b < (select max(t2.a)
from t2 where t2.b=t4.b); from t2 where t2.b=t4.b);
select b,max(a) as ma from t4 group by b having b >= (select max(t2.a) select b,max(a) as ma from t4 group by b having b >= (select max(t2.a)
from t2 where t2.b=t4.b); from t2 where t2.b=t4.b);
create table t5 (a int);
select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2;
insert into t5 values (5);
select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2;
insert into t5 values (2);
select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2;
explain select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2;
-- error 1230
select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2;
create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq)); create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq));
create table clinic( uq int primary key, name char(25)); create table clinic( uq int primary key, name char(25));
insert into clinic values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta"); insert into clinic values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta");
insert into attend values (1,1),(1,2),(2,2),(1,3); insert into attend values (1,1),(1,2),(2,2),(1,3);
select * from attend where exists (select * from clinic where uq = clinic_uq); select * from attend where exists (select * from clinic where uq = clinic_uq);
drop table t1,t2,t3,t4,attend,clinic; # different tipes & group functions
drop table if exists t1,t2,t3;
CREATE TABLE t3 (a varchar(20),b char(1) NOT NULL default '0');
INSERT INTO t3 VALUES ('W','a'),('A','c'),('J','b');
CREATE TABLE t2 (a varchar(20),b int NOT NULL default '0');
INSERT INTO t2 VALUES ('W','1'),('A','3'),('J','2');
CREATE TABLE t1 (a varchar(20),b date NOT NULL default '0000-00-00');
INSERT INTO t1 VALUES ('W','1732-02-22'),('A','1735-10-30'),('J','1743-04-13');
SELECT * FROM t1 WHERE b = (SELECT MIN(b) FROM t1);
SELECT * FROM t2 WHERE b = (SELECT MIN(b) FROM t2);
SELECT * FROM t3 WHERE b = (SELECT MIN(b) FROM t3);
drop table t1,t2,t3,t4,t5,attend,clinic;
...@@ -21,7 +21,7 @@ select 't1',b,count(*) from t1 group by b UNION select 't2',b,count(*) from t2 g ...@@ -21,7 +21,7 @@ select 't1',b,count(*) from t1 group by b UNION select 't2',b,count(*) from t2 g
(select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1); (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1);
(select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc;
explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; explain (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc;
(select sql_calc_found_rows a,b from t1 limit 2) union all (select a,b from t2 order by a) limit 2; #(select sql_calc_found_rows a,b from t1 limit 2) union all (select a,b from t2 order by a) limit 2;
select found_rows(); select found_rows();
# #
......
...@@ -468,7 +468,8 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -468,7 +468,8 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
s= s->outer_select()) s= s->outer_select())
if( !s->depended ) if( !s->depended )
{ {
s->depended= 1; // Select is depended of outer select
s->depended= s->master_unit()->depended= 1;
//Tables will be reopened many times //Tables will be reopened many times
for (TABLE_LIST *tbl= for (TABLE_LIST *tbl=
(TABLE_LIST*)s->table_list.first; (TABLE_LIST*)s->table_list.first;
...@@ -819,7 +820,8 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) ...@@ -819,7 +820,8 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference)
s= s->outer_select()) s= s->outer_select())
if( !s->depended ) if( !s->depended )
{ {
s->depended= 1; //Select is depended of outer select // Select is depended of outer select
s->depended= s->master_unit()->depended= 1;
//Tables will be reopened many times //Tables will be reopened many times
for (TABLE_LIST *tbl= for (TABLE_LIST *tbl=
(TABLE_LIST*)s->table_list.first; (TABLE_LIST*)s->table_list.first;
......
...@@ -23,9 +23,6 @@ SUBSELECT TODO: ...@@ -23,9 +23,6 @@ SUBSELECT TODO:
- remove double 'having' & 'having_list' from JOIN - remove double 'having' & 'having_list' from JOIN
(sql_select.h/sql_select.cc) (sql_select.h/sql_select.cc)
- subselect in HAVING clause
- add subselect union select (sql_union.cc)
*/ */
#ifdef __GNUC__ #ifdef __GNUC__
...@@ -37,27 +34,17 @@ SUBSELECT TODO: ...@@ -37,27 +34,17 @@ SUBSELECT TODO:
Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex, Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex,
select_subselect *result): select_subselect *result):
assigned(0), executed(0), optimized(0), error(0) Item(), engine_owner(1), value_assigned(0)
{ {
DBUG_ENTER("Item_subselect::Item_subselect"); DBUG_ENTER("Item_subselect::Item_subselect");
DBUG_PRINT("subs", ("select_lex 0x%xl", (long) select_lex)); DBUG_PRINT("subs", ("select_lex 0x%xl", (long) select_lex));
this->result= result;
SELECT_LEX_UNIT *unit= select_lex->master_unit(); if (select_lex->next_select())
unit->offset_limit_cnt= unit->global_parameters->offset_limit; engine= new subselect_union_engine(thd, select_lex->master_unit(), result,
unit->select_limit_cnt= unit->global_parameters->select_limit+ this);
unit->global_parameters ->offset_limit; else
if (unit->select_limit_cnt < unit->global_parameters->select_limit) engine= new subselect_single_select_engine(thd, select_lex, result,
unit->select_limit_cnt= HA_POS_ERROR; // no limit this);
if (unit->select_limit_cnt == HA_POS_ERROR)
select_lex->options&= ~OPTION_FOUND_ROWS;
join= new JOIN(thd, select_lex->item_list, select_lex->options, result);
if (!join || !result)
{
//out of memory
thd->fatal_error= 1;
my_printf_error(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
}
this->select_lex= select_lex;
assign_null(); assign_null();
/* /*
item value is NULL if select_subselect not changed this value item value is NULL if select_subselect not changed this value
...@@ -67,6 +54,12 @@ Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex, ...@@ -67,6 +54,12 @@ Item_subselect::Item_subselect(THD *thd, st_select_lex *select_lex,
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
Item_subselect::~Item_subselect()
{
if (engine_owner)
delete engine;
}
void Item_subselect::make_field (Send_field *tmp_field) void Item_subselect::make_field (Send_field *tmp_field)
{ {
if (null_value) if (null_value)
...@@ -84,62 +77,24 @@ void Item_subselect::make_field (Send_field *tmp_field) ...@@ -84,62 +77,24 @@ void Item_subselect::make_field (Send_field *tmp_field)
bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) bool Item_subselect::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
{ {
// Is it one field subselect? // Is it one field subselect?
if (select_lex->item_list.elements > max_columns) if (engine->cols() > max_columns)
{ {
my_printf_error(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0)); my_message(ER_SUBSELECT_NO_1_COL, ER(ER_SUBSELECT_NO_1_COL), MYF(0));
return 1; return 1;
} }
SELECT_LEX *save_select= thd->lex.select; int res= engine->prepare();
thd->lex.select= select_lex; fix_length_and_dec();
if(join->prepare((TABLE_LIST*) select_lex->table_list.first, return res;
select_lex->where,
(ORDER*) select_lex->order_list.first,
(ORDER*) select_lex->group_list.first,
select_lex->having,
(ORDER*) 0, select_lex,
select_lex->master_unit()))
return 1;
thd->lex.select= save_select;
return 0;
} }
int Item_subselect::exec() void Item_subselect::fix_length_and_dec()
{ {
DBUG_ENTER("Item_subselect::exec"); engine->fix_length_and_dec();
if (!optimized)
{
optimized=1;
if (join->optimize())
{
executed= 1;
DBUG_RETURN(join->error?join->error:1);
}
}
if (join->select_lex->depended && executed)
{
if (join->reinit())
{
error= 1;
DBUG_RETURN(1);
}
assign_null();
executed= assigned= 0;
}
if (!executed)
{
SELECT_LEX *save_select= join->thd->lex.select;
join->thd->lex.select= select_lex;
join->exec();
join->thd->lex.select= save_select;
executed= 1;
DBUG_RETURN(join->error);
}
DBUG_RETURN(0);
} }
inline table_map Item_subselect::used_tables() const inline table_map Item_subselect::used_tables() const
{ {
return (table_map) select_lex->depended ? 1L : 0L; return (table_map) engine->depended() ? 1L : 0L;
} }
Item_singleval_subselect::Item_singleval_subselect(THD *thd, Item_singleval_subselect::Item_singleval_subselect(THD *thd,
...@@ -150,6 +105,12 @@ Item_singleval_subselect::Item_singleval_subselect(THD *thd, ...@@ -150,6 +105,12 @@ Item_singleval_subselect::Item_singleval_subselect(THD *thd,
maybe_null= 1; maybe_null= 1;
} }
void Item_singleval_subselect::fix_length_and_dec()
{
engine->fix_length_and_dec();
res_type= engine->type();
}
Item::Type Item_subselect::type() const Item::Type Item_subselect::type() const
{ {
return SUBSELECT_ITEM; return SUBSELECT_ITEM;
...@@ -157,21 +118,21 @@ Item::Type Item_subselect::type() const ...@@ -157,21 +118,21 @@ Item::Type Item_subselect::type() const
double Item_singleval_subselect::val () double Item_singleval_subselect::val ()
{ {
if (exec()) if (engine->exec())
return 0; return 0;
return real_value; return real_value;
} }
longlong Item_singleval_subselect::val_int () longlong Item_singleval_subselect::val_int ()
{ {
if (exec()) if (engine->exec())
return 0; return 0;
return int_value; return int_value;
} }
String *Item_singleval_subselect::val_str (String *str) String *Item_singleval_subselect::val_str (String *str)
{ {
if (exec() || null_value) if (engine->exec() || null_value)
return 0; return 0;
return &str_value; return &str_value;
} }
...@@ -187,25 +148,177 @@ Item_exists_subselect::Item_exists_subselect(THD *thd, ...@@ -187,25 +148,177 @@ Item_exists_subselect::Item_exists_subselect(THD *thd,
select_lex->select_limit= 1; // we need only 1 row to determinate existence select_lex->select_limit= 1; // we need only 1 row to determinate existence
} }
void Item_exists_subselect::fix_length_and_dec()
{
max_length= 1;
}
double Item_exists_subselect::val () double Item_exists_subselect::val ()
{ {
if (exec()) if (engine->exec())
return 0; return 0;
return (double) value; return (double) value;
} }
longlong Item_exists_subselect::val_int () longlong Item_exists_subselect::val_int ()
{ {
if (exec()) if (engine->exec())
return 0; return 0;
return value; return value;
} }
String *Item_exists_subselect::val_str(String *str) String *Item_exists_subselect::val_str(String *str)
{ {
if (exec()) if (engine->exec())
return 0; return 0;
str->set(value); str->set(value);
return str; return str;
} }
subselect_single_select_engine::subselect_single_select_engine(THD *thd,
st_select_lex *select,
select_subselect *result,
Item_subselect *item):
subselect_engine(thd, item, result),
executed(0), optimized(0)
{
select_lex= select;
SELECT_LEX_UNIT *unit= select_lex->master_unit();
unit->offset_limit_cnt= unit->global_parameters->offset_limit;
unit->select_limit_cnt= unit->global_parameters->select_limit+
unit->global_parameters ->offset_limit;
if (unit->select_limit_cnt < unit->global_parameters->select_limit)
unit->select_limit_cnt= HA_POS_ERROR; // no limit
if (unit->select_limit_cnt == HA_POS_ERROR)
select_lex->options&= ~OPTION_FOUND_ROWS;
join= new JOIN(thd, select_lex->item_list, select_lex->options, result);
if (!join || !result)
{
//out of memory
thd->fatal_error= 1;
my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
}
this->select_lex= select_lex;
}
subselect_union_engine::subselect_union_engine(THD *thd,
st_select_lex_unit *u,
select_subselect *result,
Item_subselect *item):
subselect_engine(thd, item, result)
{
unit= u;
if( !result)
{
//out of memory
thd->fatal_error= 1;
my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
}
unit->item= item;
}
int subselect_single_select_engine::prepare()
{
SELECT_LEX *save_select= thd->lex.select;
thd->lex.select= select_lex;
if(join->prepare((TABLE_LIST*) select_lex->table_list.first,
select_lex->where,
(ORDER*) select_lex->order_list.first,
(ORDER*) select_lex->group_list.first,
select_lex->having,
(ORDER*) 0, select_lex,
select_lex->master_unit(), 0))
return 1;
thd->lex.select= save_select;
return 0;
}
int subselect_union_engine::prepare()
{
return unit->prepare(thd, result);
}
void subselect_single_select_engine::fix_length_and_dec()
{
List_iterator_fast<Item> li(select_lex->item_list);
Item *sel_item= li++;
item->max_length= sel_item->max_length;
res_type= sel_item->result_type();
item->decimals= sel_item->decimals;
}
void subselect_union_engine::fix_length_and_dec()
{
uint32 mlen= 0, len;
Item *sel_item= 0;
for(SELECT_LEX *sl= unit->first_select(); sl; sl= sl->next_select())
{
List_iterator_fast<Item> li(sl->item_list);
Item *s_item= li++;
if ((len= s_item->max_length))
mlen= len;
if (!sel_item)
sel_item= s_item;
}
item->max_length= mlen;
res_type= sel_item->result_type();
item->decimals= sel_item->decimals;
}
int subselect_single_select_engine::exec()
{
DBUG_ENTER("subselect_single_select_engine::exec");
if (!optimized)
{
optimized=1;
if (join->optimize())
{
executed= 1;
DBUG_RETURN(join->error?join->error:1);
}
}
if (select_lex->depended && executed)
{
if (join->reinit())
DBUG_RETURN(1);
item->assign_null();
item->assigned((executed= 0));
}
if (!executed)
{
SELECT_LEX *save_select= join->thd->lex.select;
join->thd->lex.select= select_lex;
join->exec();
join->thd->lex.select= save_select;
executed= 1;
DBUG_RETURN(join->error||thd->fatal_error);
}
DBUG_RETURN(0);
}
int subselect_union_engine::exec()
{
return unit->exec();
}
uint subselect_single_select_engine::cols()
{
return select_lex->item_list.elements;
}
uint subselect_union_engine::cols()
{
return unit->first_select()->item_list.elements;
}
bool subselect_single_select_engine::depended()
{
return select_lex->depended;
}
bool subselect_union_engine::depended()
{
return unit->depended;
}
...@@ -21,30 +21,24 @@ ...@@ -21,30 +21,24 @@
#endif #endif
class st_select_lex; class st_select_lex;
class st_select_lex_unit;
class JOIN; class JOIN;
class select_subselect; class select_subselect;
class subselect_engine;
/* base class for subselects */ /* base class for subselects */
class Item_subselect :public Item class Item_subselect :public Item
{ {
my_bool engine_owner; /* Is this item owner of engine */
my_bool value_assigned; /* value already assigned to subselect */
protected: protected:
/* engine that perform execution of subselect (single select or union) */
subselect_engine *engine;
/* allowed number of columns (1 for single value subqueries) */
uint max_columns; uint max_columns;
my_bool assigned; /* value already assigned to subselect */
my_bool executed; /* simple subselect is executed */
my_bool optimized; /* simple subselect is optimized */
my_bool error; /* error in query */
int exec();
virtual void assign_null()
{
null_value= 1;
}
public: public:
st_select_lex *select_lex;
JOIN *join;
select_subselect *result;
Item_subselect(THD *thd, st_select_lex *select_lex, Item_subselect(THD *thd, st_select_lex *select_lex,
select_subselect* result); select_subselect* result);
Item_subselect(Item_subselect *item) Item_subselect(Item_subselect *item)
...@@ -52,18 +46,22 @@ class Item_subselect :public Item ...@@ -52,18 +46,22 @@ class Item_subselect :public Item
null_value= item->null_value; null_value= item->null_value;
decimals= item->decimals; decimals= item->decimals;
max_columns= item->max_columns; max_columns= item->max_columns;
assigned= item->assigned; engine= item->engine;
executed= item->executed; engine_owner= 0;
select_lex= item->select_lex;
join= item->join;
result= item->result;
name= item->name; name= item->name;
error= item->error;
} }
~Item_subselect();
virtual void assign_null()
{
null_value= 1;
}
bool assigned() { return value_assigned; }
void assigned(bool a) { value_assigned= a; }
enum Type type() const; enum Type type() const;
bool is_null() { return null_value; } bool is_null() { return null_value; }
void make_field (Send_field *); void make_field (Send_field *);
bool fix_fields(THD *thd, TABLE_LIST *tables, Item **ref); bool fix_fields(THD *thd, TABLE_LIST *tables, Item **ref);
virtual void fix_length_and_dec();
table_map used_tables() const; table_map used_tables() const;
friend class select_subselect; friend class select_subselect;
...@@ -75,18 +73,10 @@ class Item_subselect :public Item ...@@ -75,18 +73,10 @@ class Item_subselect :public Item
class Item_singleval_subselect :public Item_subselect class Item_singleval_subselect :public Item_subselect
{ {
protected: protected:
longlong int_value; longlong int_value; /* here stored integer value of this item */
double real_value; double real_value; /* here stored real value of this item */
enum Item_result res_type; enum Item_result res_type; /* type of results */
virtual void assign_null()
{
null_value= 1;
int_value= 0;
real_value= 0;
max_length= 4;
res_type= STRING_RESULT;
}
public: public:
Item_singleval_subselect(THD *thd, st_select_lex *select_lex); Item_singleval_subselect(THD *thd, st_select_lex *select_lex);
Item_singleval_subselect(Item_singleval_subselect *item): Item_singleval_subselect(Item_singleval_subselect *item):
...@@ -98,12 +88,20 @@ class Item_singleval_subselect :public Item_subselect ...@@ -98,12 +88,20 @@ class Item_singleval_subselect :public Item_subselect
decimals= item->decimals; decimals= item->decimals;
res_type= item->res_type; res_type= item->res_type;
} }
virtual void assign_null()
{
null_value= 1;
int_value= 0;
real_value= 0;
max_length= 4;
res_type= STRING_RESULT;
}
double val (); double val ();
longlong val_int (); longlong val_int ();
String *val_str (String *); String *val_str (String *);
Item *new_item() { return new Item_singleval_subselect(this); } Item *new_item() { return new Item_singleval_subselect(this); }
enum Item_result result_type() const { return res_type; } enum Item_result result_type() const { return res_type; }
void fix_length_and_dec();
friend class select_singleval_subselect; friend class select_singleval_subselect;
}; };
...@@ -112,12 +110,8 @@ class Item_singleval_subselect :public Item_subselect ...@@ -112,12 +110,8 @@ class Item_singleval_subselect :public Item_subselect
class Item_exists_subselect :public Item_subselect class Item_exists_subselect :public Item_subselect
{ {
protected: protected:
longlong value; longlong value; /* value of this item (boolean: exists/not-exists) */
virtual void assign_null()
{
value= 0;
}
public: public:
Item_exists_subselect(THD *thd, st_select_lex *select_lex); Item_exists_subselect(THD *thd, st_select_lex *select_lex);
Item_exists_subselect(Item_exists_subselect *item): Item_exists_subselect(Item_exists_subselect *item):
...@@ -125,11 +119,78 @@ class Item_exists_subselect :public Item_subselect ...@@ -125,11 +119,78 @@ class Item_exists_subselect :public Item_subselect
{ {
value= item->value; value= item->value;
} }
virtual void assign_null()
{
value= 0;
}
Item *new_item() { return new Item_exists_subselect(this); } Item *new_item() { return new Item_exists_subselect(this); }
enum Item_result result_type() const { return INT_RESULT;} enum Item_result result_type() const { return INT_RESULT;}
longlong val_int(); longlong val_int();
double val(); double val();
String *val_str(String*); String *val_str(String*);
void fix_length_and_dec();
friend class select_exists_subselect; friend class select_exists_subselect;
}; };
class subselect_engine
{
protected:
select_subselect *result; /* results storage class */
THD *thd; /* pointer to current THD */
Item_subselect *item; /* item, that use this engine */
enum Item_result res_type; /* type of results */
public:
static void *operator new(size_t size)
{
return (void*) sql_alloc((uint) size);
}
static void operator delete(void *ptr, size_t size) {}
subselect_engine(THD *thd, Item_subselect *si, select_subselect *res)
{
result= res;
item= si;
this->thd= thd;
res_type= STRING_RESULT;
}
virtual int prepare()= 0;
virtual void fix_length_and_dec()= 0;
virtual int exec()= 0;
virtual uint cols()= 0; /* return number of columnss in select */
virtual bool depended()= 0; /* depended from outer select */
enum Item_result type() { return res_type; }
};
class subselect_single_select_engine: public subselect_engine
{
my_bool executed; /* simple subselect is executed */
my_bool optimized; /* simple subselect is optimized */
st_select_lex *select_lex; /* corresponding select_lex */
JOIN * join; /* corresponding JOIN structure */
public:
subselect_single_select_engine(THD *thd, st_select_lex *select,
select_subselect *result,
Item_subselect *item);
virtual int prepare();
virtual void fix_length_and_dec();
virtual int exec();
virtual uint cols();
virtual bool depended();
};
class subselect_union_engine: public subselect_engine
{
st_select_lex_unit *unit; /* corresponding unit structure */
public:
subselect_union_engine(THD *thd,
st_select_lex_unit *u,
select_subselect *result,
Item_subselect *item);
virtual int prepare();
virtual void fix_length_and_dec();
virtual int exec();
virtual uint cols();
virtual bool depended();
};
...@@ -389,9 +389,14 @@ int handle_select(THD *thd, LEX *lex, select_result *result); ...@@ -389,9 +389,14 @@ int handle_select(THD *thd, LEX *lex, select_result *result);
int mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &list,COND *conds, int mysql_select(THD *thd,TABLE_LIST *tables,List<Item> &list,COND *conds,
ORDER *order, ORDER *group,Item *having,ORDER *proc_param, ORDER *order, ORDER *group,Item *having,ORDER *proc_param,
ulong select_type,select_result *result, ulong select_type,select_result *result,
SELECT_LEX_UNIT *unit); SELECT_LEX_UNIT *unit, SELECT_LEX *select_lex,
bool fake_select_lex);
void fix_tables_pointers(SELECT_LEX *select_lex);
int mysql_explain_select(THD *thd, SELECT_LEX *sl, char const *type,
select_result *result);
int mysql_union(THD *thd, LEX *lex,select_result *result); int mysql_union(THD *thd, LEX *lex,select_result *result);
int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t); int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *s, TABLE_LIST *t,
bool tables_is_opened);
Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
Item_result_field ***copy_func, Field **from_field, Item_result_field ***copy_func, Field **from_field,
bool group,bool modify_item); bool group,bool modify_item);
......
...@@ -1647,6 +1647,7 @@ static int my_message_sql(uint error, const char *str, ...@@ -1647,6 +1647,7 @@ static int my_message_sql(uint error, const char *str,
if ((thd=current_thd)) if ((thd=current_thd))
{ {
NET *net= &thd->net; NET *net= &thd->net;
net->report_error= 1;
if (!net->last_error[0]) // Return only first message if (!net->last_error[0]) // Return only first message
{ {
strmake(net->last_error,str,sizeof(net->last_error)-1); strmake(net->last_error,str,sizeof(net->last_error)-1);
......
...@@ -66,10 +66,9 @@ void send_error(THD *thd, uint sql_errno, const char *err) ...@@ -66,10 +66,9 @@ void send_error(THD *thd, uint sql_errno, const char *err)
else else
{ {
length=(uint) strlen(err); length=(uint) strlen(err);
set_if_smaller(length,MYSQL_ERRMSG_SIZE-1);
}
VOID(net_write_command(net,(uchar) 255, "", 0, (char*) err,length)); VOID(net_write_command(net,(uchar) 255, "", 0, (char*) err,length));
thd->fatal_error=0; // Error message is given thd->fatal_error=0; // Error message is given
thd->net.report_error= 0;
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
......
...@@ -99,6 +99,7 @@ my_bool my_net_init(NET *net, Vio* vio) ...@@ -99,6 +99,7 @@ my_bool my_net_init(NET *net, Vio* vio)
net->where_b = net->remain_in_buf=0; net->where_b = net->remain_in_buf=0;
net->last_errno=0; net->last_errno=0;
net->query_cache_query=0; net->query_cache_query=0;
net->report_error= 0;
if (vio != 0) /* If real connection */ if (vio != 0) /* If real connection */
{ {
...@@ -134,8 +135,9 @@ my_bool net_realloc(NET *net, ulong length) ...@@ -134,8 +135,9 @@ my_bool net_realloc(NET *net, ulong length)
if (length >= net->max_packet_size) if (length >= net->max_packet_size)
{ {
DBUG_PRINT("error",("Packet too large (%lu)", length)); DBUG_PRINT("error",("Packet too large (%lu)", length));
net->error=1; net->error= 1;
net->last_errno=ER_NET_PACKET_TOO_LARGE; net->report_error= 1;
net->last_errno= ER_NET_PACKET_TOO_LARGE;
return 1; return 1;
} }
pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1); pkt_length = (length+IO_SIZE-1) & ~(IO_SIZE-1);
...@@ -147,9 +149,10 @@ my_bool net_realloc(NET *net, ulong length) ...@@ -147,9 +149,10 @@ my_bool net_realloc(NET *net, ulong length)
NET_HEADER_SIZE + COMP_HEADER_SIZE, NET_HEADER_SIZE + COMP_HEADER_SIZE,
MYF(MY_WME)))) MYF(MY_WME))))
{ {
net->error=1; net->error= 1;
net->report_error= 1;
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
net->last_errno=ER_OUT_OF_RESOURCES; net->last_errno= ER_OUT_OF_RESOURCES;
#endif #endif
return 1; return 1;
} }
...@@ -369,10 +372,12 @@ net_real_write(NET *net,const char *packet,ulong len) ...@@ -369,10 +372,12 @@ net_real_write(NET *net,const char *packet,ulong len)
COMP_HEADER_SIZE, MYF(MY_WME)))) COMP_HEADER_SIZE, MYF(MY_WME))))
{ {
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
net->last_errno=ER_OUT_OF_RESOURCES; net->last_errno= ER_OUT_OF_RESOURCES;
net->error=2; net->error= 2;
//TODO is it needed to set this variable if we have no socket
net->report_error= 1;
#endif #endif
net->reading_or_writing=0; net->reading_or_writing= 0;
DBUG_RETURN(1); DBUG_RETURN(1);
} }
memcpy(b+header_length,packet,len); memcpy(b+header_length,packet,len);
...@@ -422,9 +427,10 @@ net_real_write(NET *net,const char *packet,ulong len) ...@@ -422,9 +427,10 @@ net_real_write(NET *net,const char *packet,ulong len)
my_progname,vio_errno(net->vio)); my_progname,vio_errno(net->vio));
#endif /* EXTRA_DEBUG */ #endif /* EXTRA_DEBUG */
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
net->last_errno=ER_NET_ERROR_ON_WRITE; net->last_errno= ER_NET_ERROR_ON_WRITE;
#endif #endif
net->error=2; /* Close socket */ net->error= 2; /* Close socket */
net->report_error= 1;
goto end; goto end;
} }
retry_count=0; retry_count=0;
...@@ -450,7 +456,8 @@ net_real_write(NET *net,const char *packet,ulong len) ...@@ -450,7 +456,8 @@ net_real_write(NET *net,const char *packet,ulong len)
continue; continue;
} }
#endif /* defined(THREAD_SAFE_CLIENT) && !defined(MYSQL_SERVER) */ #endif /* defined(THREAD_SAFE_CLIENT) && !defined(MYSQL_SERVER) */
net->error=2; /* Close socket */ net->error= 2; /* Close socket */
net->report_error= 1;
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
net->last_errno= (interrupted ? ER_NET_WRITE_INTERRUPTED : net->last_errno= (interrupted ? ER_NET_WRITE_INTERRUPTED :
ER_NET_ERROR_ON_WRITE); ER_NET_ERROR_ON_WRITE);
...@@ -586,9 +593,10 @@ my_real_read(NET *net, ulong *complen) ...@@ -586,9 +593,10 @@ my_real_read(NET *net, ulong *complen)
my_progname,vio_errno(net->vio)); my_progname,vio_errno(net->vio));
#endif /* EXTRA_DEBUG */ #endif /* EXTRA_DEBUG */
len= packet_error; len= packet_error;
net->error=2; /* Close socket */ net->error= 2; /* Close socket */
net->report_error= 1;
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
net->last_errno=ER_NET_FCNTL_ERROR; net->last_errno= ER_NET_FCNTL_ERROR;
#endif #endif
goto end; goto end;
} }
...@@ -618,7 +626,8 @@ my_real_read(NET *net, ulong *complen) ...@@ -618,7 +626,8 @@ my_real_read(NET *net, ulong *complen)
remain,vio_errno(net->vio), length, remain,vio_errno(net->vio), length,
thr_got_alarm(&alarmed))); thr_got_alarm(&alarmed)));
len= packet_error; len= packet_error;
net->error=2; /* Close socket */ net->error= 2; /* Close socket */
net->report_error= 1;
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
net->last_errno= (interrupted ? ER_NET_READ_INTERRUPTED : net->last_errno= (interrupted ? ER_NET_READ_INTERRUPTED :
ER_NET_READ_ERROR); ER_NET_READ_ERROR);
...@@ -648,6 +657,7 @@ my_real_read(NET *net, ulong *complen) ...@@ -648,6 +657,7 @@ my_real_read(NET *net, ulong *complen)
#endif #endif
} }
len= packet_error; len= packet_error;
net->report_error= 1;
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
net->last_errno=ER_NET_PACKETS_OUT_OF_ORDER; net->last_errno=ER_NET_PACKETS_OUT_OF_ORDER;
#endif #endif
...@@ -821,7 +831,8 @@ my_net_read(NET *net) ...@@ -821,7 +831,8 @@ my_net_read(NET *net)
if (my_uncompress((byte*) net->buff + net->where_b, &packet_len, if (my_uncompress((byte*) net->buff + net->where_b, &packet_len,
&complen)) &complen))
{ {
net->error=2; /* caller will close socket */ net->error= 2; /* caller will close socket */
net->report_error= 1;
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
net->last_errno=ER_NET_UNCOMPRESS_ERROR; net->last_errno=ER_NET_UNCOMPRESS_ERROR;
#endif #endif
......
...@@ -1852,8 +1852,9 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables, ...@@ -1852,8 +1852,9 @@ find_field_in_tables(THD *thd,Item_field *item,TABLE_LIST *tables,
{ {
if (!report_error) // Returns first found if (!report_error) // Returns first found
break; break;
my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0), if (report_error)
name,thd->where); my_printf_error(ER_NON_UNIQ_ERROR,ER(ER_NON_UNIQ_ERROR),MYF(0),
name,thd->where);
return (Field*) 0; return (Field*) 0;
} }
found=field; found=field;
...@@ -1917,8 +1918,8 @@ find_item_in_list(Item *find, List<Item> &items, bool report_error) ...@@ -1917,8 +1918,8 @@ find_item_in_list(Item *find, List<Item> &items, bool report_error)
} }
} }
if (!found && report_error) if (!found && report_error)
my_printf_error(ER_BAD_FIELD_ERROR,ER(ER_BAD_FIELD_ERROR),MYF(0), my_printf_error(ER_BAD_FIELD_ERROR, ER(ER_BAD_FIELD_ERROR), MYF(0),
find->full_name(),current_thd->where); find->full_name(), current_thd->where);
return found; return found;
} }
...@@ -2390,8 +2391,8 @@ bool remove_table_from_cache(THD *thd, const char *db, const char *table_name, ...@@ -2390,8 +2391,8 @@ bool remove_table_from_cache(THD *thd, const char *db, const char *table_name,
int setup_ftfuncs(THD *thd) int setup_ftfuncs(THD *thd)
{ {
List_iterator<Item_func_match> li(thd->lex.select->ftfunc_list), List_iterator<Item_func_match> li(*(thd->lex.select->ftfunc_list)),
lj(thd->lex.select->ftfunc_list); lj(*(thd->lex.select->ftfunc_list));
Item_func_match *ftf, *ftf2; Item_func_match *ftf, *ftf2;
while ((ftf=li++)) while ((ftf=li++))
...@@ -2412,9 +2413,9 @@ int setup_ftfuncs(THD *thd) ...@@ -2412,9 +2413,9 @@ int setup_ftfuncs(THD *thd)
int init_ftfuncs(THD *thd, bool no_order) int init_ftfuncs(THD *thd, bool no_order)
{ {
if (thd->lex.select->ftfunc_list.elements) if (thd->lex.select->ftfunc_list->elements)
{ {
List_iterator<Item_func_match> li(thd->lex.select->ftfunc_list); List_iterator<Item_func_match> li(*(thd->lex.select->ftfunc_list));
Item_func_match *ifm; Item_func_match *ifm;
DBUG_PRINT("info",("Performing FULLTEXT search")); DBUG_PRINT("info",("Performing FULLTEXT search"));
thd->proc_info="FULLTEXT initialization"; thd->proc_info="FULLTEXT initialization";
......
...@@ -384,6 +384,28 @@ CHANGED_TABLE_LIST* THD::changed_table_dup(const char *key, long key_length) ...@@ -384,6 +384,28 @@ CHANGED_TABLE_LIST* THD::changed_table_dup(const char *key, long key_length)
return new_table; return new_table;
} }
int THD::send_explain_fields(select_result *result)
{
List<Item> field_list;
Item *item;
field_list.push_back(new Item_int("id",0,3));
field_list.push_back(new Item_empty_string("select_type",19));
field_list.push_back(new Item_empty_string("table",NAME_LEN));
field_list.push_back(new Item_empty_string("type",10));
field_list.push_back(item=new Item_empty_string("possible_keys",
NAME_LEN*MAX_KEY));
item->maybe_null=1;
field_list.push_back(item=new Item_empty_string("key",NAME_LEN));
item->maybe_null=1;
field_list.push_back(item=new Item_int("key_len",0,3));
item->maybe_null=1;
field_list.push_back(item=new Item_empty_string("ref",
NAME_LEN*MAX_REF_PARTS));
item->maybe_null=1;
field_list.push_back(new Item_real("rows",0.0,0,10));
field_list.push_back(new Item_empty_string("Extra",255));
return (result->send_fields(field_list,1));
}
#ifdef SIGNAL_WITH_VIO_CLOSE #ifdef SIGNAL_WITH_VIO_CLOSE
void THD::close_active_vio() void THD::close_active_vio()
...@@ -446,13 +468,19 @@ bool select_send::send_data(List<Item> &items) ...@@ -446,13 +468,19 @@ bool select_send::send_data(List<Item> &items)
if (item->send(thd, packet)) if (item->send(thd, packet))
{ {
packet->free(); // Free used packet->free(); // Free used
my_error(ER_OUT_OF_RESOURCES,MYF(0)); my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
DBUG_RETURN(1); DBUG_RETURN(1);
} }
} }
thd->sent_row_count++; thd->sent_row_count++;
bool error=my_net_write(&thd->net,(char*) packet->ptr(),packet->length()); if (!thd->net.report_error)
DBUG_RETURN(error); {
DBUG_RETURN(my_net_write(&thd->net,
(char*) packet->ptr(),
packet->length()));
}
else
DBUG_RETURN(1);
} }
bool select_send::send_eof() bool select_send::send_eof()
...@@ -462,8 +490,13 @@ bool select_send::send_eof() ...@@ -462,8 +490,13 @@ bool select_send::send_eof()
{ {
mysql_unlock_tables(thd, thd->lock); thd->lock=0; mysql_unlock_tables(thd, thd->lock); thd->lock=0;
} }
::send_eof(thd); if (!thd->net.report_error)
return 0; {
::send_eof(thd);
return 0;
}
else
return 1;
} }
...@@ -499,7 +532,7 @@ select_export::prepare(List<Item> &list, SELECT_LEX_UNIT *u) ...@@ -499,7 +532,7 @@ select_export::prepare(List<Item> &list, SELECT_LEX_UNIT *u)
option); option);
if (!access(path,F_OK)) if (!access(path,F_OK))
{ {
my_error(ER_FILE_EXISTS_ERROR,MYF(0),exchange->file_name); my_error(ER_FILE_EXISTS_ERROR, MYF(0), exchange->file_name);
return 1; return 1;
} }
/* Create the file world readable */ /* Create the file world readable */
...@@ -685,9 +718,9 @@ bool select_export::send_data(List<Item> &items) ...@@ -685,9 +718,9 @@ bool select_export::send_data(List<Item> &items)
} }
void select_export::send_error(uint errcode,const char *err) void select_export::send_error(uint errcode, const char *err)
{ {
::send_error(thd,errcode,err); my_message(errcode, err, MYF(0));;
(void) end_io_cache(&cache); (void) end_io_cache(&cache);
(void) my_close(file,MYF(0)); (void) my_close(file,MYF(0));
file= -1; file= -1;
...@@ -699,9 +732,7 @@ bool select_export::send_eof() ...@@ -699,9 +732,7 @@ bool select_export::send_eof()
int error=test(end_io_cache(&cache)); int error=test(end_io_cache(&cache));
if (my_close(file,MYF(MY_WME))) if (my_close(file,MYF(MY_WME)))
error=1; error=1;
if (error) if (!error)
::send_error(thd);
else
::send_ok(thd,row_count); ::send_ok(thd,row_count);
file= -1; file= -1;
return error; return error;
...@@ -774,7 +805,7 @@ bool select_dump::send_data(List<Item> &items) ...@@ -774,7 +805,7 @@ bool select_dump::send_data(List<Item> &items)
} }
if (row_count++ > 1) if (row_count++ > 1)
{ {
my_error(ER_TOO_MANY_ROWS,MYF(0)); my_error(ER_TOO_MANY_ROWS, MYF(0));
goto err; goto err;
} }
while ((item=li++)) while ((item=li++))
...@@ -799,7 +830,7 @@ bool select_dump::send_data(List<Item> &items) ...@@ -799,7 +830,7 @@ bool select_dump::send_data(List<Item> &items)
void select_dump::send_error(uint errcode,const char *err) void select_dump::send_error(uint errcode,const char *err)
{ {
::send_error(thd,errcode,err); my_message(errcode, err, MYF(0));
(void) end_io_cache(&cache); (void) end_io_cache(&cache);
(void) my_close(file,MYF(0)); (void) my_close(file,MYF(0));
(void) my_delete(path,MYF(0)); // Delete file on error (void) my_delete(path,MYF(0)); // Delete file on error
...@@ -811,9 +842,7 @@ bool select_dump::send_eof() ...@@ -811,9 +842,7 @@ bool select_dump::send_eof()
int error=test(end_io_cache(&cache)); int error=test(end_io_cache(&cache));
if (my_close(file,MYF(MY_WME))) if (my_close(file,MYF(MY_WME)))
error=1; error=1;
if (error) if (!error)
::send_error(thd);
else
::send_ok(thd,row_count); ::send_ok(thd,row_count);
file= -1; file= -1;
return error; return error;
...@@ -828,8 +857,9 @@ bool select_singleval_subselect::send_data(List<Item> &items) ...@@ -828,8 +857,9 @@ bool select_singleval_subselect::send_data(List<Item> &items)
{ {
DBUG_ENTER("select_singleval_subselect::send_data"); DBUG_ENTER("select_singleval_subselect::send_data");
Item_singleval_subselect *it= (Item_singleval_subselect *)item; Item_singleval_subselect *it= (Item_singleval_subselect *)item;
if (it->assigned){ if (it->assigned()){
my_printf_error(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0)); thd->fatal_error= 1;
my_message(ER_SUBSELECT_NO_1_ROW, ER(ER_SUBSELECT_NO_1_ROW), MYF(0));
DBUG_RETURN(1); DBUG_RETURN(1);
} }
if (unit->offset_limit_cnt) if (unit->offset_limit_cnt)
...@@ -847,15 +877,19 @@ bool select_singleval_subselect::send_data(List<Item> &items) ...@@ -847,15 +877,19 @@ bool select_singleval_subselect::send_data(List<Item> &items)
if ((it->null_value= val_item->is_null())) if ((it->null_value= val_item->is_null()))
{ {
it->assign_null(); it->assign_null();
} else { }
else
{
it->max_length= val_item->max_length; it->max_length= val_item->max_length;
it->decimals= val_item->decimals; it->decimals= val_item->decimals;
it->binary= val_item->binary; it->binary= val_item->binary;
val_item->val_str(&it->str_value);
it->int_value= val_item->val_int(); it->int_value= val_item->val_int();
String *s= val_item->val_str(&it->str_value);
if (s != &it->str_value)
it->str_value.set(*s, 0, s->length());
it->res_type= val_item->result_type(); it->res_type= val_item->result_type();
} }
it->assigned= 1; it->assigned(1);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
...@@ -869,7 +903,7 @@ bool select_exists_subselect::send_data(List<Item> &items) ...@@ -869,7 +903,7 @@ bool select_exists_subselect::send_data(List<Item> &items)
DBUG_RETURN(0); DBUG_RETURN(0);
} }
it->value= 1; it->value= 1;
it->assigned= 1; it->assigned(1);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
...@@ -330,6 +330,7 @@ typedef struct st_prep_stmt ...@@ -330,6 +330,7 @@ typedef struct st_prep_stmt
class delayed_insert; class delayed_insert;
class select_result;
#define THD_SENTRY_MAGIC 0xfeedd1ff #define THD_SENTRY_MAGIC 0xfeedd1ff
#define THD_SENTRY_GONE 0xdeadbeef #define THD_SENTRY_GONE 0xdeadbeef
...@@ -491,6 +492,7 @@ class THD :public ilink { ...@@ -491,6 +492,7 @@ class THD :public ilink {
uint server_status,open_options; uint server_status,open_options;
uint32 query_length; uint32 query_length;
uint32 db_length; uint32 db_length;
uint select_number; //number of select (used for EXPLAIN)
/* variables.transaction_isolation is reset to this after each commit */ /* variables.transaction_isolation is reset to this after each commit */
enum_tx_isolation session_tx_isolation; enum_tx_isolation session_tx_isolation;
char scramble[9]; char scramble[9];
...@@ -504,7 +506,7 @@ class THD :public ilink { ...@@ -504,7 +506,7 @@ class THD :public ilink {
bool query_error, bootstrap, cleanup_done; bool query_error, bootstrap, cleanup_done;
bool safe_to_cache_query; bool safe_to_cache_query;
bool volatile killed; bool volatile killed;
bool prepare_command; bool prepare_command;
Item_param *params; // Pointer to array of params Item_param *params; // Pointer to array of params
/* /*
...@@ -621,6 +623,7 @@ class THD :public ilink { ...@@ -621,6 +623,7 @@ class THD :public ilink {
void add_changed_table(TABLE *table); void add_changed_table(TABLE *table);
void add_changed_table(const char *key, long key_length); void add_changed_table(const char *key, long key_length);
CHANGED_TABLE_LIST * changed_table_dup(const char *key, long key_length); CHANGED_TABLE_LIST * changed_table_dup(const char *key, long key_length);
int send_explain_fields(select_result *result);
}; };
/* /*
...@@ -666,7 +669,7 @@ class select_result :public Sql_alloc { ...@@ -666,7 +669,7 @@ class select_result :public Sql_alloc {
virtual void initialize_tables (JOIN *join=0) {} virtual void initialize_tables (JOIN *join=0) {}
virtual void send_error(uint errcode,const char *err) virtual void send_error(uint errcode,const char *err)
{ {
::send_error(thd,errcode,err); my_message(errcode, err, MYF(0));
} }
virtual bool send_eof()=0; virtual bool send_eof()=0;
virtual void abort() {} virtual void abort() {}
......
...@@ -28,7 +28,8 @@ ...@@ -28,7 +28,8 @@
static const char *any_db="*any*"; // Special symbol for check_access static const char *any_db="*any*"; // Special symbol for check_access
int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t,
bool tables_is_opened)
{ {
/* /*
TODO: make derived tables with union inside (now only 1 SELECT may be TODO: make derived tables with union inside (now only 1 SELECT may be
...@@ -37,7 +38,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) ...@@ -37,7 +38,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
SELECT_LEX *sl= unit->first_select(); SELECT_LEX *sl= unit->first_select();
List<Item> item_list; List<Item> item_list;
TABLE *table; TABLE *table;
int res; int res= 0;
select_union *derived_result; select_union *derived_result;
TABLE_LIST *tables= (TABLE_LIST *)sl->table_list.first; TABLE_LIST *tables= (TABLE_LIST *)sl->table_list.first;
TMP_TABLE_PARAM tmp_table_param; TMP_TABLE_PARAM tmp_table_param;
...@@ -56,7 +57,8 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) ...@@ -56,7 +57,8 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
{ {
if (cursor->derived) if (cursor->derived)
{ {
res=mysql_derived(thd, lex, (SELECT_LEX_UNIT *)cursor->derived, cursor); res=mysql_derived(thd, lex, (SELECT_LEX_UNIT *)cursor->derived,
cursor, 0);
if (res) DBUG_RETURN(res); if (res) DBUG_RETURN(res);
} }
} }
...@@ -66,7 +68,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) ...@@ -66,7 +68,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
while ((item= it++)) while ((item= it++))
item_list.push_back(item); item_list.push_back(item);
if (!(res=open_and_lock_tables(thd,tables))) if (tables_is_opened || !(res=open_and_lock_tables(thd,tables)))
{ {
if (tables && setup_fields(thd,tables,item_list,0,0,1)) if (tables && setup_fields(thd,tables,item_list,0,0,1))
{ {
...@@ -94,12 +96,12 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) ...@@ -94,12 +96,12 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
if (unit->select_limit_cnt == HA_POS_ERROR) if (unit->select_limit_cnt == HA_POS_ERROR)
sl->options&= ~OPTION_FOUND_ROWS; sl->options&= ~OPTION_FOUND_ROWS;
res=mysql_select(thd, tables, sl->item_list, res= mysql_select(thd, tables, sl->item_list,
sl->where, (ORDER *) sl->order_list.first, sl->where, (ORDER *) sl->order_list.first,
(ORDER*) sl->group_list.first, (ORDER*) sl->group_list.first,
sl->having, (ORDER*) NULL, sl->having, (ORDER*) NULL,
sl->options | thd->options | SELECT_NO_UNLOCK, sl->options | thd->options | SELECT_NO_UNLOCK,
derived_result, unit); derived_result, unit, sl, 0);
if (!res) if (!res)
{ {
// Here we entirely fix both TABLE_LIST and list of SELECT's as there were no derived tables // Here we entirely fix both TABLE_LIST and list of SELECT's as there were no derived tables
...@@ -109,6 +111,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t) ...@@ -109,6 +111,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
{ {
t->real_name=table->real_name; t->real_name=table->real_name;
t->table=table; t->table=table;
table->derived_select_number= sl->select_number;
sl->exclude(); sl->exclude();
t->derived=(SELECT_LEX *)0; // just in case ... t->derived=(SELECT_LEX *)0; // just in case ...
} }
......
...@@ -1334,6 +1334,7 @@ bool select_insert::send_data(List<Item> &values) ...@@ -1334,6 +1334,7 @@ bool select_insert::send_data(List<Item> &values)
void select_insert::send_error(uint errcode,const char *err) void select_insert::send_error(uint errcode,const char *err)
{ {
//TODO error should be sent at the query processing end
::send_error(thd,errcode,err); ::send_error(thd,errcode,err);
table->file->extra(HA_EXTRA_NO_CACHE); table->file->extra(HA_EXTRA_NO_CACHE);
table->file->activate_all_index(thd); table->file->activate_all_index(thd);
...@@ -1360,6 +1361,7 @@ bool select_insert::send_eof() ...@@ -1360,6 +1361,7 @@ bool select_insert::send_eof()
if (error) if (error)
{ {
table->file->print_error(error,MYF(0)); table->file->print_error(error,MYF(0));
//TODO error should be sent at the query processing end
::send_error(thd); ::send_error(thd);
return 1; return 1;
} }
......
...@@ -146,8 +146,9 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) ...@@ -146,8 +146,9 @@ LEX *lex_start(THD *thd, uchar *buf,uint length)
lex->length=0; lex->length=0;
lex->select_lex.in_sum_expr=0; lex->select_lex.in_sum_expr=0;
lex->select_lex.expr_list.empty(); lex->select_lex.expr_list.empty();
lex->select_lex.ftfunc_list.empty(); lex->select_lex.ftfunc_list_alloc.empty();
lex->convert_set=(lex->thd=thd)->variables.convert_set; lex->select_lex.ftfunc_list= &lex->select->ftfunc_list_alloc;
lex->convert_set= (lex->thd= thd)->variables.convert_set;
lex->yacc_yyss=lex->yacc_yyvs=0; lex->yacc_yyss=lex->yacc_yyvs=0;
lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE); lex->ignore_space=test(thd->sql_mode & MODE_IGNORE_SPACE);
lex->slave_thd_opt=0; lex->slave_thd_opt=0;
...@@ -943,6 +944,8 @@ void st_select_lex_unit::init_query() ...@@ -943,6 +944,8 @@ void st_select_lex_unit::init_query()
global_parameters= this; global_parameters= this;
select_limit_cnt= HA_POS_ERROR; select_limit_cnt= HA_POS_ERROR;
offset_limit_cnt= 0; offset_limit_cnt= 0;
optimized= 0;
item= 0;
} }
void st_select_lex::init_query() void st_select_lex::init_query()
...@@ -966,9 +969,11 @@ void st_select_lex::init_select() ...@@ -966,9 +969,11 @@ void st_select_lex::init_select()
expr_list.empty(); expr_list.empty();
interval_list.empty(); interval_list.empty();
use_index.empty(); use_index.empty();
ftfunc_list.empty(); ftfunc_list_alloc.empty();
ftfunc_list= &ftfunc_list_alloc;
linkage= UNSPECIFIED_TYPE; linkage= UNSPECIFIED_TYPE;
depended= having_fix_field= 0; depended= having_fix_field= 0;
} }
/* /*
......
...@@ -212,7 +212,22 @@ class st_select_lex_node { ...@@ -212,7 +212,22 @@ class st_select_lex_node {
*/ */
class st_lex; class st_lex;
class st_select_lex; class st_select_lex;
class THD;
class select_result;
class JOIN;
class select_union;
class st_select_lex_unit: public st_select_lex_node { class st_select_lex_unit: public st_select_lex_node {
protected:
List<Item> item_list;
List<JOIN*> joins; /* list of *JOINs, to delete it in cleanup() */
TABLE_LIST result_table_list;
select_union *union_result;
TABLE *table; /* temporary table using for appending UNION results */
THD *thd;
select_result *result;
int res;
bool describe, found_rows_for_union,
optimized; // optimize phase already performed for UNION (unit)
public: public:
/* /*
Pointer to 'last' select or pointer to unit where stored Pointer to 'last' select or pointer to unit where stored
...@@ -221,12 +236,21 @@ class st_select_lex_unit: public st_select_lex_node { ...@@ -221,12 +236,21 @@ class st_select_lex_unit: public st_select_lex_node {
st_select_lex_node *global_parameters; st_select_lex_node *global_parameters;
/* LIMIT clause runtime counters */ /* LIMIT clause runtime counters */
ha_rows select_limit_cnt, offset_limit_cnt; ha_rows select_limit_cnt, offset_limit_cnt;
bool depended; /* depended from outer select subselect */
/* not NULL if union used in subselect, point to subselect item */
Item_subselect *item;
void init_query(); void init_query();
bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result); bool create_total_list(THD *thd, st_lex *lex, TABLE_LIST **result);
st_select_lex* outer_select() { return (st_select_lex*) master; } st_select_lex* outer_select() { return (st_select_lex*) master; }
st_select_lex* first_select() { return (st_select_lex*) slave; } st_select_lex* first_select() { return (st_select_lex*) slave; }
st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; } st_select_lex_unit* next_unit() { return (st_select_lex_unit*) next; }
/* UNION methods */
int prepare(THD *thd, select_result *result);
int exec();
int cleanup();
friend void mysql_init_query(THD *thd); friend void mysql_init_query(THD *thd);
private: private:
bool create_total_list_n_last_return(THD *thd, st_lex *lex, bool create_total_list_n_last_return(THD *thd, st_lex *lex,
...@@ -237,7 +261,6 @@ typedef class st_select_lex_unit SELECT_LEX_UNIT; ...@@ -237,7 +261,6 @@ typedef class st_select_lex_unit SELECT_LEX_UNIT;
/* /*
SELECT_LEX - store information of parsed SELECT_LEX statment SELECT_LEX - store information of parsed SELECT_LEX statment
*/ */
class JOIN;
class st_select_lex: public st_select_lex_node class st_select_lex: public st_select_lex_node
{ {
public: public:
...@@ -250,9 +273,16 @@ class st_select_lex: public st_select_lex_node ...@@ -250,9 +273,16 @@ class st_select_lex: public st_select_lex_node
List<Item> item_list; /* list of fields & expressions */ List<Item> item_list; /* list of fields & expressions */
List<String> interval_list, use_index, *use_index_ptr, List<String> interval_list, use_index, *use_index_ptr,
ignore_index, *ignore_index_ptr; ignore_index, *ignore_index_ptr;
List<Item_func_match> ftfunc_list; /*
Usualy it is pointer to ftfunc_list_alloc, but in union used to create fake
select_lex for calling mysql_select under results of union
*/
List<Item_func_match> *ftfunc_list;
List<Item_func_match> ftfunc_list_alloc;
JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */ JOIN *join; /* after JOIN::prepare it is pointer to corresponding JOIN */
const char *type; /* type of select for EXPLAIN */
uint in_sum_expr; uint in_sum_expr;
uint select_number; /* number of select (used for EXPLAIN) */
bool create_refs; bool create_refs;
bool braces; /* SELECT ... UNION (SELECT ... ) <- this braces */ bool braces; /* SELECT ... UNION (SELECT ... ) <- this braces */
bool depended; /* depended from outer select subselect */ bool depended; /* depended from outer select subselect */
......
...@@ -680,7 +680,7 @@ pthread_handler_decl(handle_one_connection,arg) ...@@ -680,7 +680,7 @@ pthread_handler_decl(handle_one_connection,arg)
if (thd->user_connect) if (thd->user_connect)
decrease_user_connections(thd->user_connect); decrease_user_connections(thd->user_connect);
free_root(&thd->mem_root,MYF(0)); free_root(&thd->mem_root,MYF(0));
if (net->error && net->vio != 0) if (net->error && net->vio != 0 && net->report_error)
{ {
if (!thd->killed && thd->variables.log_warnings) if (!thd->killed && thd->variables.log_warnings)
sql_print_error(ER(ER_NEW_ABORTING_CONNECTION), sql_print_error(ER(ER_NEW_ABORTING_CONNECTION),
...@@ -1305,6 +1305,7 @@ mysql_execute_command(THD *thd) ...@@ -1305,6 +1305,7 @@ mysql_execute_command(THD *thd)
*/ */
thd->old_total_warn_count= thd->total_warn_count; thd->old_total_warn_count= thd->total_warn_count;
thd->net.report_error= 0;
if (thd->slave_thread) if (thd->slave_thread)
{ {
/* /*
...@@ -1327,18 +1328,69 @@ mysql_execute_command(THD *thd) ...@@ -1327,18 +1328,69 @@ mysql_execute_command(THD *thd)
#endif #endif
} }
select_result *explain_result= 0;
/* /*
Skip if we are in the slave thread, some table rules have been given TODO: make derived tables processing 'inside' SELECT processing.
and the table list says the query should not be replicated TODO: solve problem with depended derived tables in subselects
*/ */
if (lex->derived_tables) if (lex->sql_command == SQLCOM_SELECT &&
(select_lex->options & SELECT_DESCRIBE) &&
lex->derived_tables)
{
if (!(explain_result= new select_send()))
{
send_error(&thd->net, ER_OUT_OF_RESOURCES);
DBUG_VOID_RETURN;
}
//check rights
for (TABLE_LIST *cursor= tables;
cursor;
cursor= cursor->next)
if (cursor->derived)
{
TABLE_LIST *tables=
(TABLE_LIST *)((SELECT_LEX_UNIT *)
cursor->derived)->first_select()->table_list.first;
int res;
if (tables)
res= check_table_access(thd,SELECT_ACL, tables);
else
res= check_access(thd, SELECT_ACL, any_db);
if (res)
DBUG_VOID_RETURN;
}
thd->send_explain_fields(explain_result);
// EXPLAIN derived tables
for (TABLE_LIST *cursor= tables;
cursor;
cursor= cursor->next)
if (cursor->derived)
{
SELECT_LEX *select_lex= ((SELECT_LEX_UNIT *)
cursor->derived)->first_select();
if (!open_and_lock_tables(thd,
(TABLE_LIST*) select_lex->table_list.first))
{
mysql_explain_select(thd, select_lex,
"DERIVED", explain_result);
// execute derived table SELECT to provide table for other SELECTs
if (mysql_derived(thd, lex, (SELECT_LEX_UNIT *)cursor->derived,
cursor, 1))
DBUG_VOID_RETURN;
}
else
DBUG_VOID_RETURN;
}
}
else if (lex->derived_tables)
{ {
for (TABLE_LIST *cursor= tables; for (TABLE_LIST *cursor= tables;
cursor; cursor;
cursor= cursor->next) cursor= cursor->next)
if (cursor->derived && mysql_derived(thd, lex, if (cursor->derived && mysql_derived(thd, lex,
(SELECT_LEX_UNIT *)cursor->derived, (SELECT_LEX_UNIT *)cursor->derived,
cursor)) cursor, 0))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
if ((lex->select_lex.next_select_in_list() && if ((lex->select_lex.next_select_in_list() &&
...@@ -1420,8 +1472,46 @@ mysql_execute_command(THD *thd) ...@@ -1420,8 +1472,46 @@ mysql_execute_command(THD *thd)
if (!(res=open_and_lock_tables(thd,tables))) if (!(res=open_and_lock_tables(thd,tables)))
{ {
query_cache_store_query(thd, tables); if (select_lex->options & SELECT_DESCRIBE)
res=handle_select(thd, lex, result); {
delete result; // we do not need it for explain
if (!explain_result)
if (!(explain_result= new select_send()))
{
send_error(&thd->net, ER_OUT_OF_RESOURCES);
DBUG_VOID_RETURN;
}
else
thd->send_explain_fields(explain_result);
fix_tables_pointers(select_lex);
for ( SELECT_LEX *sl= select_lex;
sl && res == 0;
sl= sl->next_select_in_list())
{
SELECT_LEX *first= sl->master_unit()->first_select();
res= mysql_explain_select(thd, sl,
((select_lex==sl)?
((sl->next_select_in_list())?"PRIMARY":
"SIMPLE"):
((sl == first)?
((sl->depended)?"DEPENDENT SUBSELECT":
"SUBSELECT"):
((sl->depended)?"DEPENDENT UNION":
"UNION"))),
explain_result);
}
if (res > 0)
res= -res; // mysql_explain_select do not report error
MYSQL_LOCK *save_lock= thd->lock;
thd->lock= (MYSQL_LOCK *)0;
explain_result->send_eof();
thd->lock= save_lock;
}
else
{
query_cache_store_query(thd, tables);
res=handle_select(thd, lex, result);
}
} }
else else
delete result; delete result;
...@@ -1939,7 +2029,7 @@ mysql_execute_command(THD *thd) ...@@ -1939,7 +2029,7 @@ mysql_execute_command(THD *thd)
(ORDER *)NULL, (ORDER *)NULL,
select_lex->options | thd->options | select_lex->options | thd->options |
SELECT_NO_JOIN_CACHE, SELECT_NO_JOIN_CACHE,
result, unit); result, unit, select_lex, 0);
delete result; delete result;
} }
else else
...@@ -2100,13 +2190,13 @@ mysql_execute_command(THD *thd) ...@@ -2100,13 +2190,13 @@ mysql_execute_command(THD *thd)
lex->lock_option, lex->lock_option,
table_count))) table_count)))
{ {
res=mysql_select(thd,tables,select_lex->item_list, res= mysql_select(thd,tables,select_lex->item_list,
select_lex->where, select_lex->where,
(ORDER *)NULL,(ORDER *)NULL,(Item *)NULL, (ORDER *)NULL,(ORDER *)NULL,(Item *)NULL,
(ORDER *)NULL, (ORDER *)NULL,
select_lex->options | thd->options | select_lex->options | thd->options |
SELECT_NO_JOIN_CACHE, SELECT_NO_JOIN_CACHE,
result, unit); result, unit, select_lex, 0);
delete result; delete result;
} }
else else
...@@ -2850,6 +2940,7 @@ mysql_init_query(THD *thd) ...@@ -2850,6 +2940,7 @@ mysql_init_query(THD *thd)
thd->lex.unit.global_parameters= &thd->lex.select_lex; //Global limit & order thd->lex.unit.global_parameters= &thd->lex.select_lex; //Global limit & order
thd->lex.select_lex.master= &thd->lex.unit; thd->lex.select_lex.master= &thd->lex.unit;
thd->lex.select_lex.prev= &thd->lex.unit.slave; thd->lex.select_lex.prev= &thd->lex.unit.slave;
thd->select_number= thd->lex.select_lex.select_number= 1;
thd->lex.value_list.empty(); thd->lex.value_list.empty();
thd->free_list= 0; thd->free_list= 0;
thd->lex.union_option= 0; thd->lex.union_option= 0;
...@@ -2882,6 +2973,7 @@ bool ...@@ -2882,6 +2973,7 @@ bool
mysql_new_select(LEX *lex, bool move_down) mysql_new_select(LEX *lex, bool move_down)
{ {
SELECT_LEX *select_lex = (SELECT_LEX *) lex->thd->calloc(sizeof(SELECT_LEX)); SELECT_LEX *select_lex = (SELECT_LEX *) lex->thd->calloc(sizeof(SELECT_LEX));
select_lex->select_number= ++lex->thd->select_number;
if (!select_lex) if (!select_lex)
return 1; return 1;
select_lex->init_query(); select_lex->init_query();
...@@ -2953,6 +3045,7 @@ mysql_parse(THD *thd, char *inBuf, uint length) ...@@ -2953,6 +3045,7 @@ mysql_parse(THD *thd, char *inBuf, uint length)
mysql_init_query(thd); mysql_init_query(thd);
thd->query_length = length; thd->query_length = length;
thd->lex.derived_tables= false;
if (query_cache_send_result_to_client(thd, inBuf, length) <= 0) if (query_cache_send_result_to_client(thd, inBuf, length) <= 0)
{ {
LEX *lex=lex_start(thd, (uchar*) inBuf, length); LEX *lex=lex_start(thd, (uchar*) inBuf, length);
......
This diff is collapsed.
...@@ -210,6 +210,7 @@ class JOIN :public Sql_alloc ...@@ -210,6 +210,7 @@ class JOIN :public Sql_alloc
send_records(0), found_records(0), examined_rows(0), send_records(0), found_records(0), examined_rows(0),
thd(thd), thd(thd),
sum_funcs(0), sum_funcs(0),
procedure(0),
having(0), having(0),
select_options(select_options), select_options(select_options),
result(result), result(result),
...@@ -237,7 +238,8 @@ class JOIN :public Sql_alloc ...@@ -237,7 +238,8 @@ class JOIN :public Sql_alloc
int prepare(TABLE_LIST *tables, int prepare(TABLE_LIST *tables,
COND *conds, ORDER *order, ORDER *group, Item *having, COND *conds, ORDER *order, ORDER *group, Item *having,
ORDER *proc_param, SELECT_LEX *select, SELECT_LEX_UNIT *unit); ORDER *proc_param, SELECT_LEX *select, SELECT_LEX_UNIT *unit,
bool fake_select_lex);
int optimize(); int optimize();
int global_optimize(); int global_optimize();
int reinit(); int reinit();
......
This diff is collapsed.
...@@ -661,6 +661,8 @@ bool multi_update::send_data(List<Item> &values) ...@@ -661,6 +661,8 @@ bool multi_update::send_data(List<Item> &values)
void multi_update::send_error(uint errcode,const char *err) void multi_update::send_error(uint errcode,const char *err)
{ {
//TODO error should be sent at the query processing end
/* First send error what ever it is ... */ /* First send error what ever it is ... */
::send_error(thd,errcode,err); ::send_error(thd,errcode,err);
...@@ -783,6 +785,7 @@ bool multi_update::send_eof() ...@@ -783,6 +785,7 @@ bool multi_update::send_eof()
if (error == -1) if (error == -1)
error = 0; error = 0;
thd->proc_info="end"; thd->proc_info="end";
//TODO error should be sent at the query processing end
if (error) if (error)
send_error(error,"An error occured in multi-table update"); send_error(error,"An error occured in multi-table update");
......
...@@ -1807,10 +1807,10 @@ simple_expr: ...@@ -1807,10 +1807,10 @@ simple_expr:
| singleval_subselect { $$= $1; } | singleval_subselect { $$= $1; }
| '{' ident expr '}' { $$= $3; } | '{' ident expr '}' { $$= $3; }
| MATCH ident_list_arg AGAINST '(' expr ')' | MATCH ident_list_arg AGAINST '(' expr ')'
{ Select->ftfunc_list.push_back((Item_func_match *) { Select->ftfunc_list->push_back((Item_func_match *)
($$=new Item_func_match_nl(*$2,$5))); } ($$=new Item_func_match_nl(*$2,$5))); }
| MATCH ident_list_arg AGAINST '(' expr IN_SYM BOOLEAN_SYM MODE_SYM ')' | MATCH ident_list_arg AGAINST '(' expr IN_SYM BOOLEAN_SYM MODE_SYM ')'
{ Select->ftfunc_list.push_back((Item_func_match *) { Select->ftfunc_list->push_back((Item_func_match *)
($$=new Item_func_match_bool(*$2,$5))); } ($$=new Item_func_match_bool(*$2,$5))); }
| BINARY expr %prec NEG { $$= new Item_func_binary($2); } | BINARY expr %prec NEG { $$= new Item_func_binary($2); }
| CAST_SYM '(' expr AS cast_type ')' { $$= create_func_cast($3, $5); } | CAST_SYM '(' expr AS cast_type ')' { $$= create_func_cast($3, $5); }
...@@ -4046,7 +4046,8 @@ singleval_subselect: ...@@ -4046,7 +4046,8 @@ singleval_subselect:
singleval_subselect_init: singleval_subselect_init:
select_init select_init
{ {
$$= new Item_singleval_subselect(current_thd, Lex->select); $$= new Item_singleval_subselect(current_thd,
Lex->select->master_unit()->first_select());
}; };
exists_subselect: exists_subselect:
...@@ -4059,7 +4060,8 @@ exists_subselect: ...@@ -4059,7 +4060,8 @@ exists_subselect:
exists_subselect_init: exists_subselect_init:
select_init select_init
{ {
$$= new Item_exists_subselect(current_thd, Lex->select); $$= new Item_exists_subselect(current_thd,
Lex->select->master_unit()->first_select());
}; };
subselect_start: subselect_start:
...@@ -4074,4 +4076,4 @@ subselect_end: ...@@ -4074,4 +4076,4 @@ subselect_end:
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->select = lex->select->outer_select(); lex->select = lex->select->outer_select();
}; }
...@@ -128,6 +128,9 @@ struct st_table { ...@@ -128,6 +128,9 @@ struct st_table {
uint temp_pool_slot; uint temp_pool_slot;
/* number of select if it is derived table */
uint derived_select_number;
THD *in_use; /* Which thread uses this */ THD *in_use; /* Which thread uses this */
struct st_table *next,*prev; struct st_table *next,*prev;
}; };
......
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