You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
643 lines
35 KiB
643 lines
35 KiB
[
|
|
{
|
|
"name": "TestHintScope",
|
|
"cases": [
|
|
// join hints
|
|
"select /*+ MERGE_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ INL_JOIN(t3) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ MERGE_JOIN(test.t1) */ t1.a, t1.b from t t1, (select /*+ INL_JOIN(test.t3) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ MERGE_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ HASH_JOIN(t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ INL_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ HASH_JOIN(t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ INL_JOIN(test.t1) */ t1.a, t1.b from t t1, (select /*+ HASH_JOIN(test.t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ INL_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ MERGE_JOIN(t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ HASH_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ MERGE_JOIN(t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ HASH_JOIN(test.t1) */ t1.a, t1.b from t t1, (select /*+ MERGE_JOIN(test.t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ HASH_JOIN(t1) */ t1.a, t1.b from t t1, (select /*+ INL_JOIN(t2) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ MERGE_JOIN(t1) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ INL_JOIN(t1) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ HASH_JOIN(t1) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ HASH_JOIN(@sel_2 t1@sel_2, t2@sel_2), MERGE_JOIN(@sel_1 t1@sel_1, t2@sel_1) */ * from (select t1.a, t1.b from t t1, t t2 where t1.a = t2.a) t1, t t2 where t1.b = t2.b",
|
|
// aggregation hints
|
|
"select /*+ STREAM_AGG() */ s, count(s) from (select /*+ HASH_AGG() */ sum(t1.a) as s from t t1, t t2 where t1.a = t2.b group by t1.a) p group by s",
|
|
"select /*+ HASH_AGG() */ s, count(s) from (select /*+ STREAM_AGG() */ sum(t1.a) as s from t t1, t t2 where t1.a = t2.b group by t1.a) p group by s",
|
|
"select /*+ HASH_AGG() */ s, count(s) from (select sum(t1.a) as s from t t1, t t2 where t1.a = t2.b group by t1.a) p group by s",
|
|
"select /*+ STREAM_AGG() */ s, count(s) from (select sum(t1.a) as s from t t1, t t2 where t1.a = t2.b group by t1.a) p group by s"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestIndexHint",
|
|
"cases": [
|
|
// simple case
|
|
"select /*+ USE_INDEX(t, c_d_e) */ * from t",
|
|
"select /*+ USE_INDEX(test.t, c_d_e) */ * from t",
|
|
"select /*+ IGNORE_INDEX(t, c_d_e) */ c from t order by c",
|
|
"select /*+ IGNORE_INDEX(test.t, c_d_e) */ c from t order by c",
|
|
"select /*+ USE_INDEX(t, c_d_e) */ * from t t1",
|
|
"select /*+ IGNORE_INDEX(t, c_d_e) */ t1.c from t t1 order by t1.c",
|
|
"select /*+ USE_INDEX(t1, c_d_e) */ * from t t1",
|
|
"select /*+ IGNORE_INDEX(t1, c_d_e) */ t1.c from t t1 order by t1.c",
|
|
"select /*+ USE_INDEX(t1, c_d_e), USE_INDEX(t2, f) */ * from t t1, t t2 where t1.a = t2.b",
|
|
"select /*+ IGNORE_INDEX(t1, c_d_e), IGNORE_INDEX(t2, f), HASH_JOIN(t1) */ * from t t1, t t2 where t1.a = t2.b",
|
|
// test multiple indexes
|
|
"select /*+ USE_INDEX(t, c_d_e, f, g) */ * from t order by f",
|
|
// use TablePath when the hint only contains table.
|
|
"select /*+ USE_INDEX(t) */ f from t where f > 10",
|
|
// there will be a warning instead of error when index not exist
|
|
"select /*+ USE_INDEX(t, no_such_index) */ * from t",
|
|
"select /*+ IGNORE_INDEX(t, no_such_index) */ * from t",
|
|
// use both use_index and ignore_index, same as index hints in sql.
|
|
"select /*+ USE_INDEX(t, c_d_e), IGNORE_INDEX(t, f) */ c from t order by c",
|
|
"select /*+ USE_INDEX(t, f), IGNORE_INDEX(t, f) */ c from t order by c",
|
|
"select /*+ USE_INDEX(t, c_d_e), IGNORE_INDEX(t, c_d_e) */ c from t order by c",
|
|
"select /*+ USE_INDEX(t, c_d_e, f), IGNORE_INDEX(t, c_d_e) */ c from t order by c"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestIndexMergeHint",
|
|
"cases": [
|
|
"select /*+ USE_INDEX_MERGE(t, c_d_e, f_g) */ * from t where c < 1 or f > 2",
|
|
"select /*+ USE_INDEX_MERGE(t, primary, f_g) */ * from t where a < 1 or f > 2",
|
|
"select /*+ USE_INDEX_MERGE(t, primary, f_g, c_d_e) */ * from t where a < 1 or f > 2",
|
|
"select /*+ NO_INDEX_MERGE(), USE_INDEX_MERGE(t, primary, f_g, c_d_e) */ * from t where a < 1 or f > 2",
|
|
"select /*+ USE_INDEX_MERGE(t1, c_d_e, f_g) */ * from t where c < 1 or f > 2",
|
|
"select /*+ NO_INDEX_MERGE(), USE_INDEX_MERGE(t, primary, f_g, c_d_e) */ * from t where a < 1 or f > 2",
|
|
"select /*+ USE_INDEX_MERGE(t) USE_INDEX_MERGE(t) */ * from t where c < 1 or f > 2",
|
|
"select /*+ USE_INDEX_MERGE(db2.t) */ * from t where c < 1 or f > 2",
|
|
"select /*+ USE_INDEX_MERGE(db2.t, c_d_e, f_g) */ * from t where c < 1 or f > 2"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestDAGPlanBuilderSimpleCase",
|
|
"cases":[
|
|
// Test index hint.
|
|
"select * from t t1 use index(c_d_e)",
|
|
"select f from t use index() where f = 1",
|
|
// Test ts + Sort vs. DoubleRead + filter.
|
|
"select a from t where a between 1 and 2 order by c",
|
|
// Test DNF condition + Double Read.
|
|
"select * from t where (t.c > 0 and t.c < 2) or (t.c > 4 and t.c < 6) or (t.c > 8 and t.c < 10) or (t.c > 12 and t.c < 14) or (t.c > 16 and t.c < 18)",
|
|
"select * from t where (t.c > 0 and t.c < 1) or (t.c > 2 and t.c < 3) or (t.c > 4 and t.c < 5) or (t.c > 6 and t.c < 7) or (t.c > 9 and t.c < 10)",
|
|
// Test TopN to table branch in double read.
|
|
"select * from t where t.c = 1 and t.e = 1 order by t.b limit 1",
|
|
// Test Null Range
|
|
"select * from t where t.e_str is null",
|
|
// Test Null Range but the column has not null flag.
|
|
"select * from t where t.c is null",
|
|
// Test TopN to index branch in double read.
|
|
"select * from t where t.c = 1 and t.e = 1 order by t.e limit 1",
|
|
// Test TopN to Limit in double read.
|
|
"select * from t where t.c = 1 and t.e = 1 order by t.d limit 1",
|
|
// Test TopN to Limit in index single read.
|
|
"select c from t where t.c = 1 and t.e = 1 order by t.d limit 1",
|
|
// Test TopN to Limit in table single read.
|
|
"select c from t order by t.a limit 1",
|
|
// Test TopN push down in table single read.
|
|
"select c from t order by t.a + t.b limit 1",
|
|
// Test Limit push down in table single read.
|
|
"select c from t limit 1",
|
|
// Test Limit push down in index single read.
|
|
"select c from t where c = 1 limit 1",
|
|
// Test index single read and Selection.
|
|
"select c from t where c = 1",
|
|
// Test index single read and Sort.
|
|
"select c from t order by c",
|
|
// Test index single read and Sort.
|
|
"select c from t where c = 1 order by e",
|
|
// Test Limit push down in double single read.
|
|
"select c, b from t where c = 1 limit 1",
|
|
// Test Selection + Limit push down in double single read.
|
|
"select c, b from t where c = 1 and e = 1 and b = 1 limit 1",
|
|
// Test Order by multi columns.
|
|
"select c from t where c = 1 order by d, c",
|
|
// Test for index with length.
|
|
"select c_str from t where e_str = '1' order by d_str, c_str",
|
|
// Test PK in index single read.
|
|
"select c from t where t.c = 1 and t.a > 1 order by t.d limit 1",
|
|
// Test composed index.
|
|
// FIXME: The TopN didn't be pushed.
|
|
"select c from t where t.c = 1 and t.d = 1 order by t.a limit 1",
|
|
// Test PK in index double read.
|
|
"select * from t where t.c = 1 and t.a > 1 order by t.d limit 1",
|
|
// Test index filter condition push down.
|
|
"select * from t use index(e_d_c_str_prefix) where t.c_str = 'abcdefghijk' and t.d_str = 'd' and t.e_str = 'e'",
|
|
"select * from t use index(e_d_c_str_prefix) where t.e_str = b'1110000'",
|
|
"select * from (select * from t use index() order by b) t left join t t1 on t.a=t1.a limit 10",
|
|
// Test embedded ORDER BY which imposes on different number of columns than outer query.
|
|
"select * from ((SELECT 1 a,3 b) UNION (SELECT 2,1) ORDER BY (SELECT 2)) t order by a,b",
|
|
"select * from ((SELECT 1 a,6 b) UNION (SELECT 2,5) UNION (SELECT 2, 4) ORDER BY 1) t order by 1, 2",
|
|
"select * from (select *, NULL as xxx from t) t order by xxx",
|
|
"select * from t use index(f) where f = 1 and a = 1",
|
|
"select * from t2 use index(b) where b = 1 and a = 1"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestDAGPlanBuilderJoin",
|
|
"cases": [
|
|
"select * from t t1 join t t2 on t1.a = t2.c_str",
|
|
"select * from t t1 join t t2 on t1.b = t2.a",
|
|
"select * from t t1 join t t2 on t1.a = t2.a join t t3 on t1.a = t3.a",
|
|
"select * from t t1 join t t2 on t1.a = t2.a join t t3 on t1.b = t3.a",
|
|
"select * from t t1 join t t2 on t1.b = t2.a order by t1.a",
|
|
"select * from t t1 join t t2 on t1.b = t2.a order by t1.a limit 1",
|
|
// Test hash join's hint.
|
|
"select /*+ TIDB_HJ(t1, t2) */ * from t t1 join t t2 on t1.b = t2.a order by t1.a limit 1",
|
|
"select * from t t1 left join t t2 on t1.b = t2.a where 1 = 1 limit 1",
|
|
"select * from t t1 join t t2 on t1.b = t2.a and t1.c = 1 and t1.d = 1 and t1.e = 1 order by t1.a limit 1",
|
|
"select * from t t1 join t t2 on t1.b = t2.b join t t3 on t1.b = t3.b",
|
|
"select * from t t1 join t t2 on t1.a = t2.a order by t1.a",
|
|
"select * from t t1 left outer join t t2 on t1.a = t2.a right outer join t t3 on t1.a = t3.a",
|
|
"select * from t t1 join t t2 on t1.a = t2.a join t t3 on t1.a = t3.a and t1.b = 1 and t3.c = 1",
|
|
"select * from t where t.c in (select b from t s where s.a = t.a)",
|
|
"select t.c in (select b from t s where s.a = t.a) from t",
|
|
// Test Single Merge Join.
|
|
// Merge Join now enforce a sort.
|
|
"select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.a = t2.b",
|
|
"select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.a = t2.a",
|
|
// Test Single Merge Join + Sort.
|
|
"select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.a = t2.a order by t2.a",
|
|
"select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.b = t2.b order by t2.a",
|
|
// Test Single Merge Join + Sort + desc.
|
|
"select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.a = t2.a order by t2.a desc",
|
|
"select /*+ TIDB_SMJ(t1,t2)*/ * from t t1, t t2 where t1.b = t2.b order by t2.b desc",
|
|
// Test Multi Merge Join.
|
|
"select /*+ TIDB_SMJ(t1,t2,t3)*/ * from t t1, t t2, t t3 where t1.a = t2.a and t2.a = t3.a",
|
|
"select /*+ TIDB_SMJ(t1,t2,t3)*/ * from t t1, t t2, t t3 where t1.a = t2.b and t2.a = t3.b",
|
|
// Test Multi Merge Join with multi keys.
|
|
// TODO: More tests should be added.
|
|
"select /*+ TIDB_SMJ(t1,t2,t3)*/ * from t t1, t t2, t t3 where t1.c = t2.c and t1.d = t2.d and t3.c = t1.c and t3.d = t1.d",
|
|
"select /*+ TIDB_SMJ(t1,t2,t3)*/ * from t t1, t t2, t t3 where t1.c = t2.c and t1.d = t2.d and t3.c = t1.c and t3.d = t1.d order by t1.c",
|
|
// Test Multi Merge Join + Outer Join.
|
|
"select /*+ TIDB_SMJ(t1,t2,t3)*/ * from t t1 left outer join t t2 on t1.a = t2.a left outer join t t3 on t2.a = t3.a",
|
|
"select /*+ TIDB_SMJ(t1,t2,t3)*/ * from t t1 left outer join t t2 on t1.a = t2.a left outer join t t3 on t1.a = t3.a",
|
|
// Test Index Join + TableScan.
|
|
"select /*+ TIDB_INLJ(t1, t2) */ * from t t1, t t2 where t1.a = t2.a",
|
|
// Test Index Join + DoubleRead.
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.c",
|
|
// Test Index Join + SingleRead.
|
|
"select /*+ TIDB_INLJ(t2) */ t1.a , t2.a from t t1, t t2 where t1.a = t2.c",
|
|
// Test Index Join + Order by.
|
|
"select /*+ TIDB_INLJ(t1, t2) */ t1.a, t2.a from t t1, t t2 where t1.a = t2.a order by t1.c",
|
|
// Test Index Join + Order by.
|
|
"select /*+ TIDB_INLJ(t1, t2) */ t1.a, t2.a from t t1, t t2 where t1.a = t2.a order by t2.c",
|
|
// Test Index Join + TableScan + Rotate.
|
|
"select /*+ TIDB_INLJ(t1) */ t1.a , t2.a from t t1, t t2 where t1.a = t2.c",
|
|
// Test Index Join + OuterJoin + TableScan.
|
|
"select /*+ TIDB_INLJ(t1, t2) */ * from t t1 left outer join t t2 on t1.a = t2.a and t2.b < 1",
|
|
"select /*+ TIDB_INLJ(t1, t2) */ * from t t1 join t t2 on t1.d=t2.d and t2.c = 1",
|
|
// Test Index Join failed.
|
|
"select /*+ TIDB_INLJ(t1, t2) */ * from t t1 left outer join t t2 on t1.a = t2.b",
|
|
// Test Index Join failed.
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1 right outer join t t2 on t1.a = t2.b",
|
|
// Test Semi Join hint success.
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1 where t1.a in (select a from t t2)",
|
|
// Test Semi Join hint fail.
|
|
"select /*+ TIDB_INLJ(t1) */ * from t t1 where t1.a in (select a from t t2)",
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.c=t2.c and t1.f=t2.f",
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.a = t2.a and t1.f=t2.f",
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.f=t2.f and t1.a=t2.a",
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.a=t2.a and t2.a in (1, 2)",
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.b=t2.c and t1.b=1 and t2.d > t1.d-10 and t2.d < t1.d+10",
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.b=t2.b and t1.c=1 and t2.c=1 and t2.d > t1.d-10 and t2.d < t1.d+10",
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t2.c > t1.d-10 and t2.c < t1.d+10",
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t1.b = t2.c and t2.c=1 and t2.d=2 and t2.e=4",
|
|
"select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 where t2.c=1 and t2.d=1 and t2.e > 10 and t2.e < 20"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestDAGPlanBuilderSubquery",
|
|
"cases": [
|
|
// Test join key with cast.
|
|
"select * from t where exists (select s.a from t s having sum(s.a) = t.a )",
|
|
"select * from t where exists (select s.a from t s having sum(s.a) = t.a ) order by t.a",
|
|
// FIXME: Report error by resolver.
|
|
// "select * from t where exists (select s.a from t s having s.a = t.a ) order by t.a",
|
|
"select * from t where a in (select s.a from t s) order by t.a",
|
|
// Test Nested sub query.
|
|
"select * from t where exists (select s.a from t s where s.c in (select c from t as k where k.d = s.d) having sum(s.a) = t.a )",
|
|
// Test Semi Join + Order by.
|
|
"select * from t where a in (select a from t) order by b",
|
|
// Test Apply.
|
|
"select t.c in (select count(*) from t s, t t1 where s.a = t.a and s.a = t1.a) from t",
|
|
"select (select count(*) from t s, t t1 where s.a = t.a and s.a = t1.a) from t",
|
|
"select (select count(*) from t s, t t1 where s.a = t.a and s.a = t1.a) from t order by t.a"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestDAGPlanTopN",
|
|
"cases": [
|
|
"select * from t t1 left join t t2 on t1.b = t2.b left join t t3 on t2.b = t3.b order by t1.a limit 1",
|
|
"select * from t t1 left join t t2 on t1.b = t2.b left join t t3 on t2.b = t3.b order by t1.b limit 1",
|
|
"select * from t t1 left join t t2 on t1.b = t2.b left join t t3 on t2.b = t3.b limit 1",
|
|
"select * from t where b = 1 and c = 1 order by c limit 1",
|
|
"select * from t where c = 1 order by c limit 1",
|
|
"select * from t order by a limit 1",
|
|
"select c from t order by c limit 1"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestDAGPlanBuilderBasePhysicalPlan",
|
|
"cases": [
|
|
// Test for update.
|
|
// TODO: This is not reasonable. Mysql do like this because the limit of InnoDB, should TiDB keep consistency with MySQL?
|
|
"select * from t order by b limit 1 for update",
|
|
// Test complex update.
|
|
"update t set a = 5 where b < 1 order by d limit 1",
|
|
// Test simple update.
|
|
"update t set a = 5",
|
|
// TODO: Test delete/update with join.
|
|
// Test join hint for delete and update
|
|
"delete /*+ TIDB_INLJ(t1, t2) */ t1 from t t1, t t2 where t1.c=t2.c",
|
|
"delete /*+ TIDB_SMJ(t1, t2) */ from t1 using t t1, t t2 where t1.c=t2.c",
|
|
"update /*+ TIDB_SMJ(t1, t2) */ t t1, t t2 set t1.c=1, t2.a=1 where t1.a=t2.a",
|
|
"update /*+ TIDB_HJ(t1, t2) */ t t1, t t2 set t1.c=1, t2.a=1 where t1.a=t2.a",
|
|
// Test complex delete.
|
|
"delete from t where b < 1 order by d limit 1",
|
|
// Test simple delete.
|
|
"delete from t",
|
|
// Test "USE INDEX" hint in delete statement from single table
|
|
"delete from t use index(c_d_e) where b = 1",
|
|
// Test complex insert.
|
|
"insert into t select * from t where b < 1 order by d limit 1",
|
|
// Test simple insert.
|
|
"insert into t (a, b, c, e, f, g) values(0,0,0,0,0,0)",
|
|
// Test dual.
|
|
"select 1",
|
|
"select * from t where false",
|
|
// Test show.
|
|
"show tables"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestDAGPlanBuilderUnion",
|
|
"cases": [
|
|
// Test simple union.
|
|
"select * from t union all select * from t",
|
|
// Test Order by + Union.
|
|
"select * from t union all (select * from t) order by a ",
|
|
// Test Limit + Union.
|
|
"select * from t union all (select * from t) limit 1",
|
|
// Test TopN + Union.
|
|
"select a from t union all (select c from t) order by a limit 1"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestDAGPlanBuilderUnionScan",
|
|
"cases": [
|
|
// Read table.
|
|
"select * from t",
|
|
"select * from t where b = 1",
|
|
"select * from t where a = 1",
|
|
"select * from t where a = 1 order by a",
|
|
"select * from t where a = 1 order by b",
|
|
"select * from t where a = 1 limit 1",
|
|
"select * from t where c = 1",
|
|
"select c from t where c = 1"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestDAGPlanBuilderAgg",
|
|
"cases": [
|
|
// Test distinct.
|
|
"select distinct b from t",
|
|
"select count(*) from (select * from t order by b) t group by b",
|
|
"select count(*), x from (select b as bbb, a + 1 as x from (select * from t order by b) t) t group by bbb",
|
|
// Test agg + table.
|
|
"select sum(a), avg(b + c) from t group by d",
|
|
"select sum(distinct a), avg(b + c) from t group by d",
|
|
// Test group by (c + d)
|
|
"select sum(e), avg(e + c) from t where c = 1 group by (c + d)",
|
|
// Test stream agg + index single.
|
|
"select sum(e), avg(e + c) from t where c = 1 group by c",
|
|
// Test hash agg + index single.
|
|
"select sum(e), avg(e + c) from t where c = 1 group by e",
|
|
// Test hash agg + index double.
|
|
"select sum(e), avg(b + c) from t where c = 1 and e = 1 group by d",
|
|
// Test stream agg + index double.
|
|
"select sum(e), avg(b + c) from t where c = 1 and b = 1",
|
|
// Test hash agg + order.
|
|
"select sum(e) as k, avg(b + c) from t where c = 1 and b = 1 and e = 1 group by d order by k",
|
|
// Test stream agg + order.
|
|
"select sum(e) as k, avg(b + c) from t where c = 1 and b = 1 and e = 1 group by c order by k",
|
|
// Test agg can't push down.
|
|
"select sum(to_base64(e)) from t where c = 1",
|
|
"select (select count(1) k from t s where s.a = t.a having k != 0) from t",
|
|
// Test stream agg with multi group by columns.
|
|
"select sum(to_base64(e)) from t group by e,d,c order by c",
|
|
"select sum(e+1) from t group by e,d,c order by c",
|
|
"select sum(to_base64(e)) from t group by e,d,c order by c,e",
|
|
"select sum(e+1) from t group by e,d,c order by c,e",
|
|
// Test stream agg + limit or sort
|
|
"select count(*) from t group by g order by g limit 10",
|
|
"select count(*) from t group by g limit 10",
|
|
"select count(*) from t group by g order by g",
|
|
"select count(*) from t group by g order by g desc limit 1",
|
|
// Test hash agg + limit or sort
|
|
"select count(*) from t group by b order by b limit 10",
|
|
"select count(*) from t group by b order by b",
|
|
"select count(*) from t group by b limit 10",
|
|
// Test merge join + stream agg
|
|
"select sum(a.g), sum(b.g) from t a join t b on a.g = b.g group by a.g",
|
|
// Test index join + stream agg
|
|
"select /*+ tidb_inlj(a,b) */ sum(a.g), sum(b.g) from t a join t b on a.g = b.g and a.g > 60 group by a.g order by a.g limit 1",
|
|
"select sum(a.g), sum(b.g) from t a join t b on a.g = b.g and a.a>5 group by a.g order by a.g limit 1",
|
|
"select sum(d) from t"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestRefine",
|
|
"cases": [
|
|
"select a from t where c is not null",
|
|
"select a from t where c >= 4",
|
|
"select a from t where c <= 4",
|
|
"select a from t where c = 4 and d = 5 and e = 6",
|
|
"select a from t where d = 4 and c = 5",
|
|
"select a from t where c = 4 and e < 5",
|
|
"select a from t where c = 4 and d <= 5 and d > 3",
|
|
"select a from t where d <= 5 and d > 3",
|
|
"select a from t where c between 1 and 2",
|
|
"select a from t where c not between 1 and 2",
|
|
"select a from t where c <= 5 and c >= 3 and d = 1",
|
|
"select a from t where c = 1 or c = 2 or c = 3",
|
|
"select b from t where c = 1 or c = 2 or c = 3 or c = 4 or c = 5",
|
|
"select a from t where c = 5",
|
|
"select a from t where c = 5 and b = 1",
|
|
"select a from t where not a",
|
|
"select a from t where c in (1)",
|
|
"select a from t where c in ('1')",
|
|
"select a from t where c = 1.0",
|
|
"select a from t where c in (1) and d > 3",
|
|
"select a from t where c in (1, 2, 3) and (d > 3 and d < 4 or d > 5 and d < 6)",
|
|
"select a from t where c in (1, 2, 3) and (d > 2 and d < 4 or d > 5 and d < 7)",
|
|
"select a from t where c in (1, 2, 3)",
|
|
"select a from t where c in (1, 2, 3) and d in (1,2) and e = 1",
|
|
"select a from t where d in (1, 2, 3)",
|
|
"select a from t where c not in (1)",
|
|
"select a from t use index(c_d_e) where c != 1",
|
|
// test like
|
|
"select a from t where c_str like ''",
|
|
"select a from t where c_str like 'abc'",
|
|
"select a from t where c_str not like 'abc'",
|
|
"select a from t where not (c_str like 'abc' or c_str like 'abd')",
|
|
"select a from t where c_str like '_abc'",
|
|
"select a from t where c_str like 'abc%'",
|
|
"select a from t where c_str like 'abc_'",
|
|
"select a from t where c_str like 'abc%af'",
|
|
"select a from t where c_str like 'abc\\_' escape ''",
|
|
"select a from t where c_str like 'abc\\_'",
|
|
"select a from t where c_str like 'abc\\\\_'",
|
|
"select a from t where c_str like 'abc\\_%'",
|
|
"select a from t where c_str like 'abc=_%' escape '='",
|
|
"select a from t where c_str like 'abc\\__'",
|
|
// Check that 123 is converted to string '123'. index can be used.
|
|
"select a from t where c_str like 123",
|
|
"select a from t where c = 1.9 and d > 3",
|
|
"select a from t where c < 1.1",
|
|
"select a from t where c <= 1.9",
|
|
"select a from t where c >= 1.1",
|
|
"select a from t where c > 1.9",
|
|
"select a from t where c = 123456789098765432101234",
|
|
"select a from t where c = 'hanfei'"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestAggEliminator",
|
|
"cases": [
|
|
// Max to Limit + Sort-Desc.
|
|
"select max(a) from t;",
|
|
// Min to Limit + Sort.
|
|
"select min(a) from t;",
|
|
// Min to Limit + Sort, and isnull() should be added.
|
|
"select min(c_str) from t;",
|
|
// Do nothing to max + firstrow.
|
|
"select max(a), b from t;",
|
|
// If max/min contains scalar function, we can still do transformation.
|
|
"select max(a+1) from t;",
|
|
// Min + Max to Limit + Sort + Join.
|
|
"select max(a), min(a) from t;",
|
|
// Min + Max with range condition.
|
|
"select max(a), min(a) from t where a > 10",
|
|
// Min + Max with unified index range condition.
|
|
"select max(d), min(d) from t where c = 1 and d > 10",
|
|
// Min + Max with multiple columns
|
|
"select max(a), max(c), min(f) from t",
|
|
// Do nothing if any column has no index.
|
|
"select max(a), max(b) from t",
|
|
// Do nothing if any column has a non-range condition.
|
|
"select max(a), max(c) from t where c > 10",
|
|
// Do nothing if the condition cannot be pushed down to range.
|
|
"select max(a), min(a) from t where a * 3 + 10 < 100",
|
|
// Do nothing to max with groupby.
|
|
"select max(a) from t group by b;",
|
|
// If inner is not a data source, we can still do transformation.
|
|
"select max(a) from (select t1.a from t t1 join t t2 on t1.a=t2.a) t"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestUnmatchedTableInHint",
|
|
"cases": [
|
|
"SELECT /*+ TIDB_SMJ(t3, t4) */ * from t t1, t t2 where t1.a = t2.a",
|
|
"SELECT /*+ TIDB_HJ(t3, t4) */ * from t t1, t t2 where t1.a = t2.a",
|
|
"SELECT /*+ TIDB_INLJ(t3, t4) */ * from t t1, t t2 where t1.a = t2.a",
|
|
"SELECT /*+ TIDB_SMJ(t1, t2) */ * from t t1, t t2 where t1.a = t2.a",
|
|
"SELECT /*+ TIDB_SMJ(t3, t4) */ * from t t1, t t2, t t3 where t1.a = t2.a and t2.a = t3.a"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestJoinHints",
|
|
"cases": [
|
|
"select /*+ TIDB_INLJ(t1) */ t1.a, t2.a, t3.a from t t1, t t2, t t3 where t1.a = t2.a and t2.a = t3.a;",
|
|
"select /*+ TIDB_INLJ(test.t1) */ t1.a, t2.a, t3.a from t t1, t t2, t t3 where t1.a = t2.a and t2.a = t3.a;",
|
|
"select /*+ TIDB_INLJ(t1) */ t1.b, t2.a from t t1, t t2 where t1.b = t2.a;",
|
|
"select /*+ TIDB_INLJ(t2) */ t1.b, t2.a from t2 t1, t2 t2 where t1.b=t2.b and t2.c=-1;"
|
|
]
|
|
},
|
|
{
|
|
"name":"TestAggregationHints",
|
|
"cases": [
|
|
// without Aggregation hints
|
|
{"SQL": "select count(*) from t t1, t t2 where t1.a = t2.b"},
|
|
{"SQL": "select count(t1.a) from t t1, t t2 where t1.a = t2.a*2 group by t1.a"},
|
|
// with Aggregation hints
|
|
{"SQL": "select /*+ HASH_AGG() */ count(*) from t t1, t t2 where t1.a = t2.b"},
|
|
{"SQL": "select /*+ STREAM_AGG() */ count(t1.a) from t t1, t t2 where t1.a = t2.a*2 group by t1.a"},
|
|
// test conflict warning
|
|
{"SQL": "select /*+ HASH_AGG() STREAM_AGG() */ count(*) from t t1, t t2 where t1.a = t2.b"},
|
|
{"SQL": "select /*+ STREAM_AGG() */ distinct a from t"},
|
|
// additional test
|
|
{"SQL": "select /*+ HASH_AGG() */ t1.a from t t1 where t1.a < any(select t2.b from t t2)"},
|
|
{"SQL": "select /*+ hash_agg() */ t1.a from t t1 where t1.a != any(select t2.b from t t2)"},
|
|
{"SQL": "select /*+ hash_agg() */ t1.a from t t1 where t1.a = all(select t2.b from t t2)"},
|
|
{"SQL": "select /*+ STREAM_AGG() */ sum(t1.a) from t t1 join t t2 on t1.b = t2.b group by t1.b", "AggPushDown": true},
|
|
{"SQL": "select /*+ STREAM_AGG() */ e, sum(b) from t group by e"}
|
|
]
|
|
},
|
|
{
|
|
"name": "TestQueryBlockHint",
|
|
"cases": [
|
|
"select /*+ MERGE_JOIN(@sel_1 t1), INL_JOIN(@sel_2 t3) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ MERGE_JOIN(@sel_1 t1), INL_JOIN(@qb t3) */ t1.a, t1.b from t t1, (select /*+ QB_NAME(qb) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ HASH_JOIN(@sel_1 t1), MERGE_JOIN(@sel_2 t2) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ HASH_JOIN(@sel_1 t1), MERGE_JOIN(@qb t2) */ t1.a, t1.b from t t1, (select /*+ QB_NAME(qb) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ INL_JOIN(@sel_1 t1), HASH_JOIN(@sel_2 t2) */ t1.a, t1.b from t t1, (select t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ INL_JOIN(@sel_1 t1), HASH_JOIN(@qb t2) */ t1.a, t1.b from t t1, (select /*+ QB_NAME(qb) */ t2.a from t t2, t t3 where t2.a = t3.c) s where t1.a=s.a",
|
|
"select /*+ HASH_AGG(@sel_1), STREAM_AGG(@sel_2) */ count(*) from t t1 where t1.a < (select count(*) from t t2 where t1.a > t2.a)",
|
|
"select /*+ STREAM_AGG(@sel_1), HASH_AGG(@qb) */ count(*) from t t1 where t1.a < (select /*+ QB_NAME(qb) */ count(*) from t t2 where t1.a > t2.a)",
|
|
"select /*+ HASH_AGG(@sel_2) */ a, (select count(*) from t t1 where t1.b > t.a) from t where b > (select b from t t2 where t2.b = t.a limit 1)",
|
|
"select /*+ HASH_JOIN(@sel_1 t1), HASH_JOIN(@sel_2 t1) */ t1.b, t2.a, t2.aa from t t1, (select t1.a as a, t2.a as aa from t t1, t t2) t2 where t1.a = t2.aa;",
|
|
"select /*+ HASH_JOIN(@sel_2 t1@sel_2, t2@sel_2), MERGE_JOIN(@sel_1 t1@sel_1, t2@sel_1) */ * from (select t1.a, t1.b from t t1, t t2 where t1.a = t2.a) t1, t t2 where t1.b = t2.b"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestIndexJoinUnionScan",
|
|
"cases": [
|
|
[
|
|
"insert into t values(1, 1)",
|
|
// Test Index Join + UnionScan + TableScan.
|
|
"explain select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.a"
|
|
],
|
|
[
|
|
"insert into t values(1, 1)",
|
|
// Test Index Join + UnionScan + DoubleRead.
|
|
"explain select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.b"
|
|
],
|
|
[
|
|
"insert into t values(1, 1)",
|
|
// Test Index Join + UnionScan + IndexScan.
|
|
"explain select /*+ TIDB_INLJ(t2) */ t1.a , t2.b from t t1, t t2 where t1.a = t2.b"
|
|
],
|
|
[
|
|
"insert into tt values(1)",
|
|
"explain select /*+ TIDB_INLJ(t2) */ * from tt t1, tt t2 where t1.a = t2.a"
|
|
]
|
|
]
|
|
},
|
|
{
|
|
"name": "TestSemiJoinToInner",
|
|
"cases": [
|
|
"select t1.a, (select count(t2.a) from t t2 where t2.g in (select t3.d from t t3 where t3.c = t1.a)) as agg_col from t t1;"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestIndexJoinHint",
|
|
"cases": [
|
|
"select /*+ INL_JOIN(t1) */ * from t1 join t2 on t1.a = t2.a;",
|
|
"select /*+ INL_HASH_JOIN(t1) */ * from t1 join t2 on t1.a = t2.a;",
|
|
"select /*+ INL_MERGE_JOIN(t1) */ * from t1 join t2 on t1.a = t2.a;",
|
|
// Issue 15484
|
|
"select /*+ inl_merge_join(t2) */ t1.a, t2.a from t t1 left join t t2 use index(g_2) on t1.g=t2.g",
|
|
"select /*+inl_merge_join(t2)*/ t1.a, t2.a from t t1 left join t t2 use index(g_2) on t1.g=t2.g order by t1.a"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestAggToCopHint",
|
|
"cases": [
|
|
"select /*+ AGG_TO_COP(), HASH_AGG(), USE_INDEX(t) */ sum(a) from ta group by a",
|
|
"select /*+ AGG_TO_COP(), USE_INDEX(t) */ sum(b) from ta group by b",
|
|
"select /*+ AGG_TO_COP(), HASH_AGG(), USE_INDEX(t) */ distinct a from ta group by a",
|
|
"select /*+ AGG_TO_COP(), HASH_AGG(), HASH_JOIN(t1), USE_INDEX(t1), USE_INDEX(t2) */ sum(t1.a) from ta t1, ta t2 where t1.a = t2.b group by t1.a"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestLimitToCopHint",
|
|
"cases": [
|
|
"select /*+ LIMIT_TO_COP() */ * from tn where a = 1 and b > 10 and b < 20 and c > 50 order by d limit 1",
|
|
"select * from tn where a = 1 and b > 10 and b < 20 and c > 50 order by d limit 1",
|
|
"select /*+ LIMIT_TO_COP() */ a from tn where mod(a, 2) order by a limit 1"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestPushdownDistinctEnable",
|
|
"cases": [
|
|
"select /*+ HASH_AGG() */ avg(distinct a) from t;", // InjectProjBelowAgg
|
|
"select /*+ HASH_AGG() */ a, count(distinct a) from t;", // firstrow(a) cannot be removed.
|
|
"select /*+ HASH_AGG() */ avg(b), c, avg(b), count(distinct A, B), count(distinct A), count(distinct c), sum(b) from t group by c;",
|
|
"select /*+ STREAM_AGG() */ count(distinct c) from t group by c;", // can push down
|
|
"select /*+ STREAM_AGG() */ count(distinct c) from t;", // can not push down because c is not in group by
|
|
"select /*+ HASH_AGG() */ count(distinct c) from t;", // can push down
|
|
"select count(distinct c) from t group by c;",
|
|
"select count(distinct c) from t;", // should not use streamAgg because c is not in group by
|
|
|
|
"select /*+ HASH_AGG(), AGG_TO_COP() */ sum(distinct b) from pt;",
|
|
"select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct a) from (select * from ta union all select * from tb) t;"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestPushdownDistinctDisable",
|
|
"cases": [
|
|
// do not pushdown even AGG_TO_COP is specified.
|
|
"select /*+ HASH_AGG(), AGG_TO_COP() */ avg(distinct a) from t;",
|
|
"select /*+ HASH_AGG(), AGG_TO_COP() */ a, count(distinct a) from t;",
|
|
"select /*+ HASH_AGG(), AGG_TO_COP() */ avg(b), c, avg(b), count(distinct A, B), count(distinct A), count(distinct c), sum(b) from t group by c;",
|
|
"select /*+ STREAM_AGG(), AGG_TO_COP() */ count(distinct c) from t group by c;",
|
|
"select /*+ STREAM_AGG(), AGG_TO_COP() */ count(distinct c) from t;",
|
|
"select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct c) from t;",
|
|
"select /*+ AGG_TO_COP() */ count(distinct c) from t group by c;",
|
|
|
|
"select /*+ HASH_AGG(), AGG_TO_COP() */ sum(distinct b) from pt;",
|
|
"select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct a) from (select * from ta union all select * from tb) t;"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestPushdownDistinctEnableAggPushDownDisable",
|
|
"cases": [
|
|
"select /*+ HASH_AGG(), AGG_TO_COP() */ sum(distinct b) from pt;",
|
|
"select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct a) from (select * from ta union all select * from tb) t;"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestGroupConcatOrderby",
|
|
"cases": [
|
|
"select /*+ agg_to_cop */ group_concat(name ORDER BY name desc SEPARATOR '++'), group_concat(id ORDER BY name desc, id asc SEPARATOR '--') from test;",
|
|
"select /*+ agg_to_cop */ group_concat(name ORDER BY name desc SEPARATOR '++'), group_concat(id ORDER BY name desc, id asc SEPARATOR '--') from ptest;",
|
|
"select /*+ agg_to_cop */ group_concat(distinct name order by name desc) from test;",
|
|
"select /*+ agg_to_cop */ group_concat(distinct name order by name desc) from ptest;"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestDAGPlanBuilderWindow",
|
|
"cases":[
|
|
"select lead(a, 1) over (partition by null) as c from t"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestDAGPlanBuilderWindowParallel",
|
|
"cases":[
|
|
"select lead(a, 1) over (partition by null) as c from t",
|
|
"select lead(a, 1) over (partition by b) as c from t"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestNominalSort",
|
|
"cases": [
|
|
"select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by t1.a",
|
|
"select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by t1.a+1",
|
|
"select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by t1.a-1",
|
|
"select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by -t1.a",
|
|
"select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by -t1.a+3",
|
|
"select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by 1+t1.a",
|
|
"select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by 1-t1.a",
|
|
"select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by 1-t1.a+3",
|
|
"select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by 1+t1.a+3",
|
|
"select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by 3*t1.a"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestInlineProjection",
|
|
"cases":[
|
|
"select /*+ HASH_JOIN(t1) */ t1.b, t2.b from t1, t2 where t1.a = t2.a;",
|
|
"select /*+ HASH_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;",
|
|
"select /*+ HASH_JOIN(t1) */ t1.b, t2.b from t1 left outer join t2 on t1.a = t2.a;",
|
|
"select /*+ HASH_JOIN(t1) */ t1.b, t2.b from t1 right outer join t2 on t1.a = t2.a;",
|
|
"select 1 from (select /*+ HASH_JOIN(t1) */ t1.a in (select t2.a from t2) from t1) x;",
|
|
"select 1 from (select /*+ HASH_JOIN(t1) */ t1.a not in (select t2.a from t2) from t1) x;",
|
|
"select /*+ INL_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;",
|
|
"select /*+ INL_HASH_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;",
|
|
"select /*+ INL_MERGE_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;"
|
|
]
|
|
},
|
|
{
|
|
"name": "TestHintFromDiffDatabase",
|
|
"cases": [
|
|
"select /*+ inl_hash_join(test.t1) */ * from test.t2 join test.t1 on test.t2.a = test.t1.a"
|
|
]
|
|
}
|
|
]
|
|
|