diff --git a/cmd/explaintest/r/explain_easy.result b/cmd/explaintest/r/explain_easy.result index 20c479463d958..b9bf7c9e94c2e 100644 --- a/cmd/explaintest/r/explain_easy.result +++ b/cmd/explaintest/r/explain_easy.result @@ -268,7 +268,7 @@ create table t(a int primary key, b int, c int, index idx(b)); explain select t.c in (select count(*) from t s ignore index(idx), t t1 where s.a = t.a and s.a = t1.a) from t; id count task operator info Projection_11 10000.00 root 9_aux_0 -└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, count(*))] +└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, 7_col_0)] ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo └─StreamAgg_20 1.00 root funcs:count(1) @@ -281,7 +281,7 @@ Projection_11 10000.00 root 9_aux_0 explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.a = t1.a) from t; id count task operator info Projection_11 10000.00 root 9_aux_0 -└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, count(*))] +└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, 7_col_0)] ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo └─StreamAgg_20 1.00 root funcs:count(1) @@ -293,7 +293,7 @@ Projection_11 10000.00 root 9_aux_0 explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.c = t1.a) from t; id count task operator info Projection_11 10000.00 root 9_aux_0 -└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, count(*))] +└─Apply_13 10000.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, 7_col_0)] ├─TableReader_15 10000.00 root data:TableScan_14 │ └─TableScan_14 10000.00 cop table:t, range:[-inf,+inf], keep order:false, stats:pseudo └─StreamAgg_20 1.00 root funcs:count(1) diff --git a/executor/aggregate_test.go b/executor/aggregate_test.go index 9b2d861907bcf..caf1e085a53ea 100644 --- a/executor/aggregate_test.go +++ b/executor/aggregate_test.go @@ -377,6 +377,11 @@ func (s *testSuite) TestAggPrune(c *C) { tk.MustExec("create table t(id int primary key, b float, c float, d float)") tk.MustExec("insert into t values(1, 1, 3, NULL), (2, 1, NULL, 6), (3, NULL, 1, 2), (4, NULL, NULL, 1), (5, NULL, 2, NULL), (6, 3, NULL, NULL), (7, NULL, NULL, NULL), (8, 1, 2 ,3)") tk.MustQuery("select count(distinct b, c, d) from t group by id").Check(testkit.Rows("0", "0", "0", "0", "0", "0", "0", "1")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int primary key, b varchar(10))") + tk.MustExec("insert into t value(1, 11),(3, NULL)") + tk.MustQuery("SELECT a, MIN(b), MAX(b) FROM t GROUP BY a").Check(testkit.Rows("1 11 11", "3 ")) } func (s *testSuite) TestGroupConcatAggr(c *C) { diff --git a/planner/core/cbo_test.go b/planner/core/cbo_test.go index e8621d754e79f..e8d01f3353ef7 100644 --- a/planner/core/cbo_test.go +++ b/planner/core/cbo_test.go @@ -658,7 +658,7 @@ func (s *testAnalyzeSuite) TestCorrelatedEstimation(c *C) { tk.MustQuery("explain select t.c in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t;"). Check(testkit.Rows( "Projection_11 10.00 root 9_aux_0", - "└─Apply_13 10.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, count(*))]", + "└─Apply_13 10.00 root left outer semi join, inner:StreamAgg_20, equal:[eq(test.t.c, 7_col_0)]", " ├─TableReader_15 10.00 root data:TableScan_14", " │ └─TableScan_14 10.00 cop table:t, range:[-inf,+inf], keep order:false", " └─StreamAgg_20 1.00 root funcs:count(1)", diff --git a/planner/core/logical_plan_test.go b/planner/core/logical_plan_test.go index 1d268cb28181a..7efc16274c792 100644 --- a/planner/core/logical_plan_test.go +++ b/planner/core/logical_plan_test.go @@ -1536,11 +1536,11 @@ func (s *testPlanSuite) TestAggPrune(c *C) { }, { sql: "select tt.a, sum(tt.b) from (select a, b from t) tt group by tt.a", - best: "DataScan(t)->Projection->Projection->Projection", + best: "DataScan(t)->Projection->Projection", }, { sql: "select count(1) from (select count(1), a as b from t group by a) tt group by b", - best: "DataScan(t)->Projection->Projection->Projection->Projection", + best: "DataScan(t)->Projection->Projection", }, } for _, tt := range tests { @@ -1551,7 +1551,7 @@ func (s *testPlanSuite) TestAggPrune(c *C) { p, err := BuildLogicalPlan(s.ctx, stmt, s.is) c.Assert(err, IsNil) - p, err = logicalOptimize(flagPredicatePushDown|flagPrunColumns|flagBuildKeyInfo|flagEliminateAgg, p.(LogicalPlan)) + p, err = logicalOptimize(flagPredicatePushDown|flagPrunColumns|flagBuildKeyInfo|flagEliminateAgg|flagEliminateProjection, p.(LogicalPlan)) c.Assert(err, IsNil) c.Assert(ToString(p), Equals, tt.best, comment) } diff --git a/planner/core/optimizer.go b/planner/core/optimizer.go index 40b51540bc59a..33ff0d44e1832 100644 --- a/planner/core/optimizer.go +++ b/planner/core/optimizer.go @@ -33,10 +33,10 @@ var AllowCartesianProduct = true const ( flagPrunColumns uint64 = 1 << iota - flagEliminateProjection flagBuildKeyInfo flagDecorrelate flagEliminateAgg + flagEliminateProjection flagMaxMinEliminate flagPredicatePushDown flagPartitionProcessor @@ -46,10 +46,10 @@ const ( var optRuleList = []logicalOptRule{ &columnPruner{}, - &projectionEliminater{}, &buildKeySolver{}, &decorrelateSolver{}, &aggregationEliminator{}, + &projectionEliminater{}, &maxMinEliminator{}, &ppdSolver{}, &partitionProcessor{},