~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
#
2
# Nested Loops semi-join subquery evaluation tests
3
#
4
--disable_warnings
5
drop table if exists t0, t1, t2, t10, t11, t12;
6
--enable_warnings
7
8
#
9
# 1. Subqueries that are converted into semi-joins
10
#
11
create table t0 (a int);
12
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
13
14
create table t1(a int, b int);
15
insert into t1 values (0,0),(1,1),(2,2);
16
create table t2 as select * from t1;
17
18
create table t11(a int, b int);
19
20
create table t10 (pk int, a int, primary key(pk));
21
insert into t10 select a,a from t0;
22
create table t12 like t10;
23
insert into t12 select * from t10;
24
25
26
--echo Flattened because of dependency, t10=func(t1)
27
explain select * from t1 where a in (select pk from t10);
28
select * from t1 where a in (select pk from t10);
29
30
--echo A confluent case of dependency
31
explain select * from t1 where a in (select a from t10 where pk=12);
32
select * from t1 where a in (select a from t10 where pk=12);
33
34
--echo An empty table inside
35
explain select * from t1 where a in (select a from t11);
36
select * from t1 where a in (select a from t11);
37
38
explain select * from t1 where a in (select pk from t10) and b in (select pk from t10);
39
select * from t1 where a in (select pk from t10) and b in (select pk from t10);
40
41
--echo flattening a nested subquery
42
explain select * from t1 where a in (select pk from t10 where t10.a in (select pk from t12));
43
select * from t1 where a in (select pk from t10 where t10.a in (select pk from t12));
44
45
--echo flattening subquery w/ several tables
46
explain extended select * from t1 where a in (select t10.pk from t10, t12 where t12.pk=t10.a);
47
48
--echo subqueries within outer joins go into ON expr.
49
# TODO: psergey: check if case conversions like those are ok (it broke on  windows)
50
--replace_result a A b B
51
explain extended
52
select * from t1 left join (t2 A, t2 B) on ( A.a= t1.a and B.a in (select pk from t10));
53
54
# TODO: psergey: check if case conversions like those are ok (it broke on  windows)
55
--echo t2 should be wrapped into OJ-nest, so we have "t1 LJ (t2 J t10)"
56
--replace_result a A b B
57
explain extended
58
select * from t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t10));
59
60
--echo we shouldn't flatten if we're going to get a join of > MAX_TABLES.
61
explain select * from 
62
  t1 s00, t1 s01,  t1 s02, t1 s03, t1 s04,t1 s05,t1 s06,t1 s07,t1 s08,t1 s09,
63
  t1 s10, t1 s11,  t1 s12, t1 s13, t1 s14,t1 s15,t1 s16,t1 s17,t1 s18,t1 s19,
64
  t1 s20, t1 s21,  t1 s22, t1 s23, t1 s24,t1 s25,t1 s26,t1 s27,t1 s28,t1 s29,
65
  t1 s30, t1 s31,  t1 s32, t1 s33, t1 s34,t1 s35,t1 s36,t1 s37,t1 s38,t1 s39,
66
  t1 s40, t1 s41,  t1 s42, t1 s43, t1 s44,t1 s45,t1 s46,t1 s47,t1 s48,t1 s49
67
where
68
  s00.a in (
69
  select m00.a from
70
    t1 m00, t1 m01,  t1 m02, t1 m03, t1 m04,t1 m05,t1 m06,t1 m07,t1 m08,t1 m09,
71
    t1 m10, t1 m11,  t1 m12, t1 m13, t1 m14,t1 m15,t1 m16,t1 m17,t1 m18,t1 m19
72
  );
73
74
select * from
75
  t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t10)) 
76
where t1.a < 5;
77
78
# 
79
# Prepared statements
80
#
81
prepare s1 from
82
  ' select * from
83
    t1 left join t2 on (t2.a= t1.a and t2.a in (select pk from t10))
84
  where t1.a < 5';
85
execute s1;
86
execute s1;
87
88
# Try I2O orders
89
insert into t1 select (A.a + 10 * B.a),1 from t0 A, t0 B;
90
explain extended select * from t1 where a in (select pk from t10 where pk<3);
91
92
drop table t0, t1;
93
drop table t10, t11, t12;