Skip to content

Commit

Permalink
plan: adjust logical plan test (pingcap#5433)
Browse files Browse the repository at this point in the history
  • Loading branch information
hanfei1991 authored Dec 18, 2017
1 parent 7369a47 commit 8b1cd6e
Showing 1 changed file with 39 additions and 15 deletions.
54 changes: 39 additions & 15 deletions plan/logical_plan_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -544,68 +544,92 @@ func (s *testPlanSuite) TestPredicatePushDown(c *C) {
}
}

func (s *testPlanSuite) TestPlanBuilder(c *C) {
func (s *testPlanSuite) TestSubquery(c *C) {
defer testleak.AfterTest(c)()
tests := []struct {
sql string
plan string
best string
}{
{
// This will be resolved as in sub query.
sql: "select * from t where 10 in (select b from t s where s.a = t.a)",
plan: "Join{DataScan(t)->DataScan(s)}(test.t.a,s.a)->Projection",
best: "Join{DataScan(t)->DataScan(s)}(test.t.a,s.a)->Projection",
},
{
sql: "select count(c) ,(select b from t s where s.a = t.a) from t",
plan: "Join{DataScan(t)->Aggr(count(test.t.c),firstrow(test.t.a))->DataScan(s)}(test.t.a,s.a)->Projection->Projection",
best: "Join{DataScan(t)->Aggr(count(test.t.c),firstrow(test.t.a))->DataScan(s)}(test.t.a,s.a)->Projection->Projection",
},
{
sql: "select count(c) ,(select count(s.b) from t s where s.a = t.a) from t",
plan: "Join{DataScan(t)->Aggr(count(test.t.c),firstrow(test.t.a))->DataScan(s)}(test.t.a,s.a)->Aggr(firstrow(2_col_0),firstrow(test.t.a),count(s.b))->Projection->Projection",
best: "Join{DataScan(t)->Aggr(count(test.t.c),firstrow(test.t.a))->DataScan(s)}(test.t.a,s.a)->Aggr(firstrow(2_col_0),firstrow(test.t.a),count(s.b))->Projection->Projection",
},
{
// Semi-join with agg cannot decorrelate.
sql: "select t.c in (select count(s.b) from t s where s.a = t.a) from t",
plan: "Apply{DataScan(t)->DataScan(s)->Sel([eq(s.a, test.t.a)])->Aggr(count(s.b))}->Projection",
best: "Apply{DataScan(t)->DataScan(s)->Sel([eq(s.a, test.t.a)])->Aggr(count(s.b))}->Projection",
},
{
// Theta-join with agg cannot decorrelate.
sql: "select (select count(s.b) k from t s where s.a = t.a having k != 0) from t",
plan: "Apply{DataScan(t)->DataScan(s)->Sel([eq(s.a, test.t.a)])->Aggr(count(s.b))}->Projection->Projection",
best: "Apply{DataScan(t)->DataScan(s)->Sel([eq(s.a, test.t.a)])->Aggr(count(s.b))}->Projection->Projection",
},
{
// Relation without keys cannot decorrelate.
sql: "select (select count(s.b) k from t s where s.a = t1.a) from t t1, t t2",
plan: "Apply{Join{DataScan(t1)->DataScan(t2)}->DataScan(s)->Sel([eq(s.a, t1.a)])->Aggr(count(s.b))}->Projection->Projection",
best: "Apply{Join{DataScan(t1)->DataScan(t2)}->DataScan(s)->Sel([eq(s.a, t1.a)])->Aggr(count(s.b))}->Projection->Projection",
},
{
// Aggregate function like count(1) cannot decorrelate.
sql: "select (select count(1) k from t s where s.a = t.a having k != 0) from t",
plan: "Apply{DataScan(t)->DataScan(s)->Sel([eq(s.a, test.t.a)])->Aggr(count(1))}->Projection->Projection",
best: "Apply{DataScan(t)->DataScan(s)->Sel([eq(s.a, test.t.a)])->Aggr(count(1))}->Projection->Projection",
},
{
sql: "select a from t where a in (select a from t s group by t.b)",
plan: "Join{DataScan(t)->DataScan(s)->Aggr(firstrow(s.a))->Projection}(test.t.a,s.a)->Projection",
best: "Join{DataScan(t)->DataScan(s)->Aggr(firstrow(s.a))->Projection}(test.t.a,s.a)->Projection",
},
{
// This will be resolved as in sub query.
sql: "select * from t where 10 in (((select b from t s where s.a = t.a)))",
plan: "Join{DataScan(t)->DataScan(s)}(test.t.a,s.a)->Projection",
best: "Join{DataScan(t)->DataScan(s)}(test.t.a,s.a)->Projection",
},
{
// This will be resolved as in function.
sql: "select * from t where 10 in (((select b from t s where s.a = t.a)), 10)",
plan: "Join{DataScan(t)->DataScan(s)}(test.t.a,s.a)->Projection->Sel([in(10, s.b, 10)])->Projection",
best: "Join{DataScan(t)->DataScan(s)}(test.t.a,s.a)->Projection->Sel([in(10, s.b, 10)])->Projection",
},
{
sql: "select * from t where exists (select s.a from t s having sum(s.a) = t.a )",
plan: "Join{DataScan(t)->DataScan(s)->Aggr(sum(s.a))->Projection}->Projection",
best: "Join{DataScan(t)->DataScan(s)->Aggr(sum(s.a))->Projection}->Projection",
},
{
// Test Nested sub query.
sql: "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 )",
plan: "Join{DataScan(t)->Join{DataScan(s)->DataScan(k)}(s.d,k.d)(s.c,k.c)->Aggr(sum(s.a))->Projection}->Projection",
best: "Join{DataScan(t)->Join{DataScan(s)->DataScan(k)}(s.d,k.d)(s.c,k.c)->Aggr(sum(s.a))->Projection}->Projection",
},
}

for _, ca := range tests {
comment := Commentf("for %s", ca.sql)
stmt, err := s.ParseOneStmt(ca.sql, "", "")
c.Assert(err, IsNil, comment)

Preprocess(s.ctx, stmt, s.is, false)
p, err := BuildLogicalPlan(s.ctx, stmt, s.is)
c.Assert(err, IsNil)
if lp, ok := p.(LogicalPlan); ok {
p, err = logicalOptimize(flagBuildKeyInfo|flagDecorrelate|flagPrunColumns, lp, s.ctx)
c.Assert(err, IsNil)
}
c.Assert(ToString(p), Equals, ca.best, Commentf("for %s", ca.sql))
}
}

func (s *testPlanSuite) TestPlanBuilder(c *C) {
defer testleak.AfterTest(c)()
tests := []struct {
sql string
plan string
}{
{
sql: "select * from t for update",
plan: "DataScan(t)->Lock->Projection",
Expand Down Expand Up @@ -652,7 +676,7 @@ func (s *testPlanSuite) TestPlanBuilder(c *C) {
p, err := BuildLogicalPlan(s.ctx, stmt, s.is)
c.Assert(err, IsNil)
if lp, ok := p.(LogicalPlan); ok {
p, err = logicalOptimize(flagBuildKeyInfo|flagDecorrelate|flagPrunColumns, lp, s.ctx)
p, err = logicalOptimize(flagPrunColumns, lp, s.ctx)
c.Assert(err, IsNil)
}
c.Assert(ToString(p), Equals, ca.plan, Commentf("for %s", ca.sql))
Expand Down

0 comments on commit 8b1cd6e

Please sign in to comment.