From 1cafaef213933fcda32deae3f5878830fe1fabee Mon Sep 17 00:00:00 2001 From: Yiding Cui Date: Mon, 25 Jun 2018 19:07:59 +0800 Subject: [PATCH] plan: fix a bug in `topn_push_down` rule. (#6899) --- plan/logical_plan_test.go | 5 +++++ plan/topn_push_down.go | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/plan/logical_plan_test.go b/plan/logical_plan_test.go index f1445fe5379d..ae30579b8a39 100644 --- a/plan/logical_plan_test.go +++ b/plan/logical_plan_test.go @@ -1578,6 +1578,11 @@ func (s *testPlanSuite) TestTopNPushDown(c *C) { sql: "select * from t union all (select * from t s order by a) limit 5", best: "UnionAll{DataScan(t)->Limit->Projection->DataScan(s)->TopN([s.a],0,5)->Projection}->Limit", }, + // Test `ByItem` containing column from both sides. + { + sql: "select ifnull(t1.b, t2.a) from t t1 left join t t2 on t1.e=t2.e order by ifnull(t1.b, t2.a) limit 5", + best: "Join{DataScan(t1)->DataScan(t2)}(t1.e,t2.e)->TopN([ifnull(t1.b, t2.a)],0,5)->Projection->Projection", + }, } for i, tt := range tests { comment := Commentf("case:%v sql:%s", i, tt.sql) diff --git a/plan/topn_push_down.go b/plan/topn_push_down.go index 84f6994ce8f2..a0f6306f481f 100644 --- a/plan/topn_push_down.go +++ b/plan/topn_push_down.go @@ -109,8 +109,10 @@ func (p *LogicalJoin) pushDownTopNToChild(topN *LogicalTopN, idx int) LogicalPla for _, by := range topN.ByItems { cols := expression.ExtractColumns(by.Expr) - if len(p.children[1-idx].Schema().ColumnsIndices(cols)) != 0 { - return p.children[idx].pushDownTopN(nil) + for _, col := range cols { + if p.children[1-idx].Schema().Contains(col) { + return p.children[idx].pushDownTopN(nil) + } } }