mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
4a8d377171
This was a bug in the parser. As a result it could accept queries with invalid derived tables if they used With clauses.
778 lines
25 KiB
Text
778 lines
25 KiB
Text
create table t1 (a int, b varchar(32));
|
|
insert into t1 values
|
|
(4,'aaaa' ), (7,'bb'), (1,'ccc'), (4,'dd');
|
|
insert into t1 values
|
|
(3,'eee'), (7,'bb'), (1,'fff'), (4,'ggg');
|
|
create table t2 (c int);
|
|
insert into t2 values
|
|
(2), (4), (5), (3);
|
|
# select certain field in the specification of t
|
|
with t as (select a from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.a;
|
|
c a
|
|
4 4
|
|
3 3
|
|
4 4
|
|
select * from t2, (select a from t1 where b >= 'c') as t
|
|
where t2.c=t.a;
|
|
c a
|
|
4 4
|
|
3 3
|
|
4 4
|
|
explain
|
|
with t as (select a from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
explain
|
|
select * from t2, (select a from t1 where b >= 'c') as t
|
|
where t2.c=t.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
# select '*' in the specification of t
|
|
with t as (select * from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.a;
|
|
c a b
|
|
4 4 dd
|
|
3 3 eee
|
|
4 4 ggg
|
|
select * from t2, (select * from t1 where b >= 'c') as t
|
|
where t2.c=t.a;
|
|
c a b
|
|
4 4 dd
|
|
3 3 eee
|
|
4 4 ggg
|
|
explain
|
|
with t as (select * from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
explain
|
|
select * from t2, (select * from t1 where b >= 'c') as t
|
|
where t2.c=t.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
# rename fields returned by the specication when defining t
|
|
with t(f1,f2) as (select * from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.f1;
|
|
c f1 f2
|
|
4 4 dd
|
|
3 3 eee
|
|
4 4 ggg
|
|
explain
|
|
with t(f1,f2) as (select * from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.f1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
# materialized query specifying t
|
|
with t as (select a, count(*) from t1 where b >= 'c' group by a)
|
|
select * from t2,t where t2.c=t.a;
|
|
c a count(*)
|
|
4 4 2
|
|
3 3 1
|
|
select * from t2, (select a, count(*) from t1 where b >= 'c' group by a) as t
|
|
where t2.c=t.a;
|
|
c a count(*)
|
|
4 4 2
|
|
3 3 1
|
|
explain
|
|
with t as (select a, count(*) from t1 where b >= 'c' group by a)
|
|
select * from t2,t where t2.c=t.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4 Using where
|
|
1 PRIMARY <derived2> ref key0 key0 5 test.t2.c 2
|
|
2 SUBQUERY t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary; Using filesort
|
|
explain
|
|
select * from t2, (select a, count(*) from t1 where b >= 'c' group by a) as t
|
|
where t2.c=t.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4 Using where
|
|
1 PRIMARY <derived2> ref key0 key0 5 test.t2.c 2
|
|
2 DERIVED t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary; Using filesort
|
|
# specivication of t contains having
|
|
with t as (select a, count(*) from t1 where b >= 'c'
|
|
group by a having count(*)=1 )
|
|
select * from t2,t where t2.c=t.a;
|
|
c a count(*)
|
|
3 3 1
|
|
select * from t2, (select a, count(*) from t1 where b >= 'c'
|
|
group by a having count(*)=1) t
|
|
where t2.c=t.a;
|
|
c a count(*)
|
|
3 3 1
|
|
# main query contains having
|
|
with t as (select * from t2 where c <= 4)
|
|
select a, count(*) from t1,t where t1.a=t.c group by a having count(*)=1;
|
|
a count(*)
|
|
3 1
|
|
select a, count(*) from t1, (select * from t2 where c <= 4) t
|
|
where t1.a=t.c group by a having count(*)=1;
|
|
a count(*)
|
|
3 1
|
|
# main query contains group by + order by
|
|
with t as (select * from t2 where c <= 4 )
|
|
select a, count(*) from t1,t where t1.a=t.c group by a order by count(*);
|
|
a count(*)
|
|
3 1
|
|
4 3
|
|
select a, count(*) from t1, (select * from t2 where c <= 4 ) t
|
|
where t1.a=t.c group by a order by count(*);
|
|
a count(*)
|
|
3 1
|
|
4 3
|
|
# main query contains group by + order by + limit
|
|
with t as (select * from t2 where c <= 4 )
|
|
select a, count(*) from t1,t
|
|
where t1.a=t.c group by a order by count(*) desc limit 1;
|
|
a count(*)
|
|
4 3
|
|
select a, count(*) from t1, (select * from t2 where c <= 4 ) t
|
|
where t1.a=t.c group by a order by count(*) desc limit 1;
|
|
a count(*)
|
|
4 3
|
|
# t is used in a subquery
|
|
with t as (select a from t1 where a<5)
|
|
select * from t2 where c in (select a from t);
|
|
c
|
|
4
|
|
3
|
|
select * from t2
|
|
where c in (select a from (select a from t1 where a<5) as t);
|
|
c
|
|
4
|
|
3
|
|
explain
|
|
with t as (select a from t1 where a<5)
|
|
select * from t2 where c in (select a from t);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4
|
|
1 PRIMARY <subquery3> eq_ref distinct_key distinct_key 4 func 1
|
|
3 MATERIALIZED t1 ALL NULL NULL NULL NULL 8 Using where
|
|
explain
|
|
select * from t2
|
|
where c in (select a from (select a from t1 where a<5) as t);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4
|
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
|
|
2 MATERIALIZED t1 ALL NULL NULL NULL NULL 8 Using where
|
|
# materialized t is used in a subquery
|
|
with t as (select count(*) as c from t1 where b >= 'c' group by a)
|
|
select * from t2 where c in (select c from t);
|
|
c
|
|
2
|
|
select * from t2
|
|
where c in (select c from (select count(*) as c from t1
|
|
where b >= 'c' group by a) as t);
|
|
c
|
|
2
|
|
explain
|
|
with t as (select count(*) as c from t1 where b >= 'c' group by a)
|
|
select * from t2 where c in (select c from t);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4 Using where
|
|
1 PRIMARY <derived2> ref key0 key0 8 test.t2.c 2 Using where; FirstMatch(t2)
|
|
2 SUBQUERY t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary; Using filesort
|
|
explain
|
|
select * from t2
|
|
where c in (select c from (select count(*) as c from t1
|
|
where b >= 'c' group by a) as t);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4 Using where
|
|
1 PRIMARY <derived3> ref key0 key0 8 test.t2.c 2 Using where; FirstMatch(t2)
|
|
3 DERIVED t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary; Using filesort
|
|
# two references to t specified by a query
|
|
# selecting a field: both in main query
|
|
with t as (select a from t1 where b >= 'c')
|
|
select * from t as r1, t as r2 where r1.a=r2.a;
|
|
a a
|
|
1 1
|
|
1 1
|
|
4 4
|
|
4 4
|
|
3 3
|
|
1 1
|
|
1 1
|
|
4 4
|
|
4 4
|
|
select * from (select a from t1 where b >= 'c') as r1,
|
|
(select a from t1 where b >= 'c') as r2
|
|
where r1.a=r2.a;
|
|
a a
|
|
1 1
|
|
1 1
|
|
4 4
|
|
4 4
|
|
3 3
|
|
1 1
|
|
1 1
|
|
4 4
|
|
4 4
|
|
explain
|
|
with t as (select a from t1 where b >= 'c')
|
|
select * from t as r1, t as r2 where r1.a=r2.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
explain
|
|
select * from (select a from t1 where b >= 'c') as r1,
|
|
(select a from t1 where b >= 'c') as r2
|
|
where r1.a=r2.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
# two references to materialized t: both in main query
|
|
with t as (select distinct a from t1 where b >= 'c')
|
|
select * from t as r1, t as r2 where r1.a=r2.a;
|
|
a a
|
|
1 1
|
|
4 4
|
|
3 3
|
|
select * from (select distinct a from t1 where b >= 'c') as r1,
|
|
(select distinct a from t1 where b >= 'c') as r2
|
|
where r1.a=r2.a;
|
|
a a
|
|
1 1
|
|
4 4
|
|
3 3
|
|
explain
|
|
with t as (select distinct a from t1 where b >= 'c')
|
|
select * from t as r1, t as r2 where r1.a=r2.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 8 Using where
|
|
1 PRIMARY <derived3> ref key0 key0 5 r1.a 2
|
|
3 SUBQUERY t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary
|
|
2 SUBQUERY t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary
|
|
explain
|
|
select * from (select distinct a from t1 where b >= 'c') as r1,
|
|
(select distinct a from t1 where b >= 'c') as r2
|
|
where r1.a=r2.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 8 Using where
|
|
1 PRIMARY <derived3> ref key0 key0 5 r1.a 2
|
|
3 DERIVED t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary
|
|
2 DERIVED t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary
|
|
# two references to t specified by a query
|
|
# selecting all fields: both in main query
|
|
with t as (select * from t1 where b >= 'c')
|
|
select * from t as r1, t as r2 where r1.a=r2.a;
|
|
a b a b
|
|
1 ccc 1 ccc
|
|
1 fff 1 ccc
|
|
4 dd 4 dd
|
|
4 ggg 4 dd
|
|
3 eee 3 eee
|
|
1 ccc 1 fff
|
|
1 fff 1 fff
|
|
4 dd 4 ggg
|
|
4 ggg 4 ggg
|
|
select * from (select * from t1 where b >= 'c') as r1,
|
|
(select * from t1 where b >= 'c') as r2
|
|
where r1.a=r2.a;
|
|
a b a b
|
|
1 ccc 1 ccc
|
|
1 fff 1 ccc
|
|
4 dd 4 dd
|
|
4 ggg 4 dd
|
|
3 eee 3 eee
|
|
1 ccc 1 fff
|
|
1 fff 1 fff
|
|
4 dd 4 ggg
|
|
4 ggg 4 ggg
|
|
explain
|
|
with t as (select * from t1 where b >= 'c')
|
|
select * from t as r1, t as r2 where r1.a=r2.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
explain
|
|
select * from (select * from t1 where b >= 'c') as r1,
|
|
(select * from t1 where b >= 'c') as r2
|
|
where r1.a=r2.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
# two references to t specifying explicitly column names
|
|
with t(c) as (select a from t1 where b >= 'c')
|
|
select * from t r1, t r2 where r1.c=r2.c;
|
|
c c
|
|
1 1
|
|
1 1
|
|
4 4
|
|
4 4
|
|
3 3
|
|
1 1
|
|
1 1
|
|
4 4
|
|
4 4
|
|
# specification of t contains union
|
|
with t as (select a from t1 where b >= 'f'
|
|
union
|
|
select c as a from t2 where c < 4)
|
|
select * from t2,t where t2.c=t.a;
|
|
c a
|
|
2 2
|
|
4 4
|
|
3 3
|
|
select * from t2,
|
|
(select a from t1 where b >= 'f'
|
|
union
|
|
select c as a from t2 where c < 4) as t
|
|
where t2.c=t.a;
|
|
c a
|
|
2 2
|
|
4 4
|
|
3 3
|
|
explain
|
|
with t as (select a from t1 where b >= 'f'
|
|
union
|
|
select c as a from t2 where c < 4)
|
|
select * from t2,t where t2.c=t.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4 Using where
|
|
1 PRIMARY <derived2> ref key0 key0 5 test.t2.c 2
|
|
2 SUBQUERY t1 ALL NULL NULL NULL NULL 8 Using where
|
|
3 UNION t2 ALL NULL NULL NULL NULL 4 Using where
|
|
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
|
explain
|
|
select * from t2,
|
|
(select a from t1 where b >= 'f'
|
|
union
|
|
select c as a from t2 where c < 4) as t
|
|
where t2.c=t.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4 Using where
|
|
1 PRIMARY <derived2> ref key0 key0 5 test.t2.c 2
|
|
2 DERIVED t1 ALL NULL NULL NULL NULL 8 Using where
|
|
3 UNION t2 ALL NULL NULL NULL NULL 4 Using where
|
|
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
|
# t is defined in the with clause of a subquery
|
|
select t1.a,t1.b from t1,t2
|
|
where t1.a>t2.c and
|
|
t2.c in (with t as (select * from t1 where t1.a<5)
|
|
select t2.c from t2,t where t2.c=t.a);
|
|
a b
|
|
4 aaaa
|
|
7 bb
|
|
7 bb
|
|
4 dd
|
|
7 bb
|
|
7 bb
|
|
4 ggg
|
|
select t1.a,t1.b from t1,t2
|
|
where t1.a>t2.c and
|
|
t2.c in (select t2.c
|
|
from t2,(select * from t1 where t1.a<5) as t
|
|
where t2.c=t.a);
|
|
a b
|
|
4 aaaa
|
|
7 bb
|
|
7 bb
|
|
4 dd
|
|
7 bb
|
|
7 bb
|
|
4 ggg
|
|
explain
|
|
select t1.a,t1.b from t1,t2
|
|
where t1.a>t2.c and
|
|
t2.c in (with t as (select * from t1 where t1.a<5)
|
|
select t2.c from t2,t where t2.c=t.a);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4
|
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 4 Using where
|
|
2 MATERIALIZED t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
explain
|
|
select t1.a,t1.b from t1,t2
|
|
where t1.a>t2.c and
|
|
t2.c in (select t2.c
|
|
from t2,(select * from t1 where t1.a<5) as t
|
|
where t2.c=t.a);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4
|
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
2 MATERIALIZED t2 ALL NULL NULL NULL NULL 4 Using where
|
|
2 MATERIALIZED t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
# two different definitions of t: one in the with clause of the main query,
|
|
# the other in the with clause of a subquery
|
|
with t as (select c from t2 where c >= 4)
|
|
select t1.a,t1.b from t1,t
|
|
where t1.a=t.c and
|
|
t.c in (with t as (select * from t1 where t1.a<5)
|
|
select t2.c from t2,t where t2.c=t.a);
|
|
a b
|
|
4 aaaa
|
|
4 dd
|
|
4 ggg
|
|
select t1.a,t1.b from t1, (select c from t2 where c >= 4) as t
|
|
where t1.a=t.c and
|
|
t.c in (select t2.c from t2, (select * from t1 where t1.a<5) as t
|
|
where t2.c=t.a);
|
|
a b
|
|
4 aaaa
|
|
4 dd
|
|
4 ggg
|
|
explain
|
|
with t as (select c from t2 where c >= 4)
|
|
select t1.a,t1.b from t1,t
|
|
where t1.a=t.c and
|
|
t.c in (with t as (select * from t1 where t1.a<5)
|
|
select t2.c from t2,t where t2.c=t.a);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4 Using where
|
|
1 PRIMARY <subquery3> eq_ref distinct_key distinct_key 4 func 1
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
3 MATERIALIZED t2 ALL NULL NULL NULL NULL 4 Using where
|
|
3 MATERIALIZED t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
explain
|
|
select t1.a,t1.b from t1, (select c from t2 where c >= 4) as t
|
|
where t1.a=t.c and
|
|
t.c in (select t2.c from t2, (select * from t1 where t1.a<5) as t
|
|
where t2.c=t.a);
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 4 Using where
|
|
1 PRIMARY <subquery3> eq_ref distinct_key distinct_key 4 func 1
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
3 MATERIALIZED t2 ALL NULL NULL NULL NULL 4 Using where
|
|
3 MATERIALIZED t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
# another with table tt is defined in the with clause of a subquery
|
|
# from the specification of t
|
|
with t as (select * from t1
|
|
where a>2 and
|
|
b in (with tt as (select * from t2 where t2.c<5)
|
|
select t1.b from t1,tt where t1.a=tt.c))
|
|
select t.a, count(*) from t1,t where t1.a=t.a group by t.a;
|
|
a count(*)
|
|
3 1
|
|
4 9
|
|
select t.a, count(*)
|
|
from t1,
|
|
(select * from t1
|
|
where a>2 and
|
|
b in (select t1.b
|
|
from t1,
|
|
(select * from t2 where t2.c<5) as tt
|
|
where t1.a=tt.c)) as t
|
|
where t1.a=t.a group by t.a;
|
|
a count(*)
|
|
3 1
|
|
4 9
|
|
explain
|
|
with t as (select * from t1
|
|
where a>2 and
|
|
b in (with tt as (select * from t2 where t2.c<5)
|
|
select t1.b from t1,tt where t1.a=tt.c))
|
|
select t.a, count(*) from t1,t where t1.a=t.a group by t.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary; Using filesort
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
3 MATERIALIZED t2 ALL NULL NULL NULL NULL 4 Using where
|
|
3 MATERIALIZED t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
explain
|
|
select t.a, count(*)
|
|
from t1,
|
|
(select * from t1
|
|
where a>2 and
|
|
b in (select t1.b
|
|
from t1,
|
|
(select * from t2 where t2.c<5) as tt
|
|
where t1.a=tt.c)) as t
|
|
where t1.a=t.a group by t.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary; Using filesort
|
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
3 MATERIALIZED t2 ALL NULL NULL NULL NULL 4 Using where
|
|
3 MATERIALIZED t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
# with clause in the specification of a derived table
|
|
select *
|
|
from t1,
|
|
(with t as (select a from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.a) as tt
|
|
where t1.b > 'f' and tt.a=t1.a;
|
|
a b c a
|
|
4 ggg 4 4
|
|
4 ggg 4 4
|
|
select *
|
|
from t1,
|
|
(select * from t2,
|
|
(select a from t1 where b >= 'c') as t
|
|
where t2.c=t.a) as tt
|
|
where t1.b > 'f' and tt.a=t1.a;
|
|
a b c a
|
|
4 ggg 4 4
|
|
4 ggg 4 4
|
|
explain
|
|
select *
|
|
from t1,
|
|
(with t as (select a from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.a) as tt
|
|
where t1.b > 'f' and tt.a=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (incremental, BNL join)
|
|
explain
|
|
select *
|
|
from t1,
|
|
(select * from t2,
|
|
(select a from t1 where b >= 'c') as t
|
|
where t2.c=t.a) as tt
|
|
where t1.b > 'f' and tt.a=t1.a;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 4
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (incremental, BNL join)
|
|
# with claused in the specification of a view
|
|
create view v1 as
|
|
with t as (select a from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.a;
|
|
show create view v1;
|
|
View Create View character_set_client collation_connection
|
|
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS WITH t AS (select `t1`.`a` AS `a` from `t1` where (`t1`.`b` >= 'c'))select `t2`.`c` AS `c`,`t`.`a` AS `a` from (`t2` join `t`) where (`t2`.`c` = `t`.`a`) latin1 latin1_swedish_ci
|
|
select * from v1;
|
|
c a
|
|
4 4
|
|
3 3
|
|
4 4
|
|
explain
|
|
select * from v1;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 32
|
|
2 DERIVED t2 ALL NULL NULL NULL NULL 4
|
|
2 DERIVED t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
# with claused in the specification of a materialized view
|
|
create view v2 as
|
|
with t as (select a, count(*) from t1 where b >= 'c' group by a)
|
|
select * from t2,t where t2.c=t.a;
|
|
show create view v2;
|
|
View Create View character_set_client collation_connection
|
|
v2 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS WITH t AS (select `t1`.`a` AS `a`,count(0) AS `count(*)` from `t1` where (`t1`.`b` >= 'c') group by `t1`.`a`)select `t2`.`c` AS `c`,`t`.`a` AS `a`,`t`.`count(*)` AS `count(*)` from (`t2` join `t`) where (`t2`.`c` = `t`.`a`) latin1 latin1_swedish_ci
|
|
select * from v2;
|
|
c a count(*)
|
|
4 4 2
|
|
3 3 1
|
|
explain
|
|
select * from v2;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 8
|
|
2 DERIVED t2 ALL NULL NULL NULL NULL 4 Using where
|
|
2 DERIVED <derived3> ref key0 key0 5 test.t2.c 2
|
|
3 SUBQUERY t1 ALL NULL NULL NULL NULL 8 Using where; Using temporary; Using filesort
|
|
# with clause in the specification of a view that whose definition
|
|
# table alias for a with table
|
|
create view v3 as
|
|
with t(c) as (select a from t1 where b >= 'c')
|
|
select * from t r1 where r1.c=4;
|
|
show create view v3;
|
|
View Create View character_set_client collation_connection
|
|
v3 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS WITH t AS (select `t1`.`a` AS `c` from `t1` where (`t1`.`b` >= 'c'))select `r1`.`c` AS `c` from `t` `r1` where (`r1`.`c` = 4) latin1 latin1_swedish_ci
|
|
select * from v3;
|
|
c
|
|
4
|
|
4
|
|
# with clause in the specification of a view that whose definition
|
|
# two table aliases for for the same with table
|
|
create view v4(c,d) as
|
|
with t(c) as (select a from t1 where b >= 'c')
|
|
select * from t r1, t r2 where r1.c=r2.c and r2.c=4;
|
|
show create view v4;
|
|
View Create View character_set_client collation_connection
|
|
v4 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v4` AS WITH t AS (select `t1`.`a` AS `c` from `t1` where (`t1`.`b` >= 'c'))select `r1`.`c` AS `c`,`r2`.`c` AS `d` from (`t` `r1` join `t` `r2`) where ((`r1`.`c` = `r2`.`c`) and (`r2`.`c` = 4)) latin1 latin1_swedish_ci
|
|
select * from v4;
|
|
c d
|
|
4 4
|
|
4 4
|
|
4 4
|
|
4 4
|
|
explain
|
|
select * from v4;
|
|
id select_type table type possible_keys key key_len ref rows Extra
|
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 64
|
|
2 DERIVED t1 ALL NULL NULL NULL NULL 8 Using where
|
|
2 DERIVED t1 ALL NULL NULL NULL NULL 8 Using where; Using join buffer (flat, BNL join)
|
|
drop view v1,v2,v3,v4;
|
|
# currently any views containing with clause are not updatable
|
|
create view v1(a) as
|
|
with t as (select a from t1 where b >= 'c')
|
|
select t.a from t2,t where t2.c=t.a;
|
|
update v1 set a=0 where a > 4;
|
|
ERROR HY000: The target table v1 of the UPDATE is not updatable
|
|
drop view v1;
|
|
# prepare of a query containing a definition of a with table t
|
|
prepare stmt1 from "
|
|
with t as (select a from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.a;
|
|
";
|
|
execute stmt1;
|
|
c a
|
|
4 4
|
|
3 3
|
|
4 4
|
|
execute stmt1;
|
|
c a
|
|
4 4
|
|
3 3
|
|
4 4
|
|
deallocate prepare stmt1;
|
|
# prepare of a query containing a definition of a materialized t
|
|
prepare stmt1 from "
|
|
with t as (select a, count(*) from t1 where b >= 'c' group by a)
|
|
select * from t2,t where t2.c=t.a;
|
|
";
|
|
execute stmt1;
|
|
c a count(*)
|
|
4 4 2
|
|
3 3 1
|
|
execute stmt1;
|
|
c a count(*)
|
|
4 4 2
|
|
3 3 1
|
|
deallocate prepare stmt1;
|
|
# prepare of a query containing two references to with table t
|
|
prepare stmt1 from "
|
|
with t as (select * from t1 where b >= 'c')
|
|
select * from t as r1, t as r2 where r1.a=r2.a;
|
|
";
|
|
execute stmt1;
|
|
a b a b
|
|
1 ccc 1 ccc
|
|
1 fff 1 ccc
|
|
4 dd 4 dd
|
|
4 ggg 4 dd
|
|
3 eee 3 eee
|
|
1 ccc 1 fff
|
|
1 fff 1 fff
|
|
4 dd 4 ggg
|
|
4 ggg 4 ggg
|
|
execute stmt1;
|
|
a b a b
|
|
1 ccc 1 ccc
|
|
1 fff 1 ccc
|
|
4 dd 4 dd
|
|
4 ggg 4 dd
|
|
3 eee 3 eee
|
|
1 ccc 1 fff
|
|
1 fff 1 fff
|
|
4 dd 4 ggg
|
|
4 ggg 4 ggg
|
|
deallocate prepare stmt1;
|
|
with t(f) as (select * from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.f1;
|
|
ERROR HY000: WITH column list and SELECT field list have different column counts
|
|
with t(f1,f1) as (select * from t1 where b >= 'c')
|
|
select * from t2,t where t2.c=t.f1;
|
|
ERROR 42S21: Duplicate column name 'f1'
|
|
with t as (select * from t2 where c>3),
|
|
t as (select a from t1 where a>2)
|
|
select * from t,t1 where t1.a=t.c;
|
|
ERROR HY000: Duplicate query name in WITH clause
|
|
with t as (select a from s where a<5),
|
|
s as (select a from t1 where b>='d')
|
|
select * from t,s where t.a=s.a;
|
|
ERROR HY000: The definition of the table 't' refers to the table 's' defined later in a non-recursive WITH clause
|
|
with recursive
|
|
t as (select a from s where a<5),
|
|
s as (select a from t1 where b>='d')
|
|
select * from t,s where t.a=s.a;
|
|
a a
|
|
4 4
|
|
4 4
|
|
3 3
|
|
1 1
|
|
4 4
|
|
4 4
|
|
with recursive t as (select * from s where a>2),
|
|
s as (select a from t1,r where t1.a>r.c),
|
|
r as (select c from t,t2 where t.a=t2.c)
|
|
select * from r where r.c<7;
|
|
ERROR HY000: Recursive queries in WITH clause are not supported yet
|
|
with t as (select * from s where a>2),
|
|
s as (select a from t1,r where t1.a>r.c),
|
|
r as (select c from t,t2 where t.a=t2.c)
|
|
select * from r where r.c<7;
|
|
ERROR HY000: Recursive queries in WITH clause are not supported yet
|
|
with t as (select * from t1
|
|
where a in (select c from s where b<='ccc') and b>'b'),
|
|
s as (select * from t1,t2
|
|
where t1.a=t2.c and t1.c in (select a from t where a<5))
|
|
select * from s where s.b>'aaa';
|
|
ERROR HY000: Recursive queries in WITH clause are not supported yet
|
|
with t as (select * from t1 where b>'aaa' and b <='d')
|
|
select t.b from t,t2
|
|
where t.a=t2.c and
|
|
t2.c in (with s as (select t1.a from s,t1 where t1.a=s.a and t1.b<'c')
|
|
select * from s);
|
|
ERROR HY000: Recursive queries in WITH clause are not supported yet
|
|
#erroneous definition of unreferenced with table t
|
|
with t as (select count(*) from t1 where d>='f' group by a)
|
|
select t1.b from t2,t1 where t1.a = t2.c;
|
|
ERROR 42S22: Unknown column 'd' in 'where clause'
|
|
with t as (select count(*) from t1 where b>='f' group by a)
|
|
select t1.b from t2,t1 where t1.a = t2.c;
|
|
b
|
|
aaaa
|
|
dd
|
|
eee
|
|
ggg
|
|
#erroneous definition of s referring to unreferenced t
|
|
with t(d) as (select count(*) from t1 where b<='ccc' group by b),
|
|
s as (select * from t1 where a in (select t2.d from t2,t where t2.c=t.d))
|
|
select t1.b from t1,t2 where t1.a=t2.c;
|
|
ERROR 42S22: Unknown column 't2.d' in 'field list'
|
|
with t(d) as (select count(*) from t1 where b<='ccc' group by b),
|
|
s as (select * from t1 where a in (select t2.c from t2,t where t2.c=t.c))
|
|
select t1.b from t1,t2 where t1.a=t2.c;
|
|
ERROR 42S22: Unknown column 't.c' in 'where clause'
|
|
with t(d) as (select count(*) from t1 where b<='ccc' group by b),
|
|
s as (select * from t1 where a in (select t2.c from t2,t where t2.c=t.d))
|
|
select t1.b from t1,t2 where t1.a=t2.c;
|
|
b
|
|
aaaa
|
|
dd
|
|
eee
|
|
ggg
|
|
#erroneous definition of unreferenced with table t
|
|
with t(f) as (select * from t1 where b >= 'c')
|
|
select t1.b from t2,t1 where t1.a = t2.c;
|
|
ERROR HY000: WITH column list and SELECT field list have different column counts
|
|
#erroneous definition of unreferenced with table t
|
|
with t(f1,f1) as (select * from t1 where b >= 'c')
|
|
select t1.b from t2,t1 where t1.a = t2.c;
|
|
ERROR 42S21: Duplicate column name 'f1'
|
|
drop table t1,t2;
|
|
#
|
|
# Bug mdev-9937: View used in the specification of with table
|
|
# refers to the base table with the same name
|
|
#
|
|
create table t1 (a int);
|
|
insert into t1 values (20), (30), (10);
|
|
create view v1 as select * from t1 where a > 10;
|
|
with t1 as (select * from v1) select * from t1;
|
|
a
|
|
20
|
|
30
|
|
drop view v1;
|
|
drop table t1;
|
|
#
|
|
# Bug mdev-10058: Invalid derived table with WITH clause
|
|
#
|
|
CREATE TABLE t1 (a INT);
|
|
CREATE TABLE t2 (a INT);
|
|
CREATE TABLE t3 (a INT);
|
|
INSERT INTO t1 VALUES (1),(2),(3);
|
|
INSERT INTO t2 VALUES (1),(2),(3);
|
|
INSERT INTO t3 VALUES (1),(2),(3);
|
|
SELECT * FROM (WITH a AS (SELECT * FROM t1) (t2 NATURAL JOIN t3));
|
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 't2 NATURAL JOIN t3))' at line 1
|
|
SELECT * FROM (WITH a AS (SELECT * FROM t1) SELECT * FROM t2 NATURAL JOIN t3) AS d1;
|
|
a
|
|
1
|
|
2
|
|
3
|
|
DROP TABLE t1,t2,t3;
|