From e11b07283dbc0553b52c250b254817f13025e540 Mon Sep 17 00:00:00 2001 From: Kenan Yao Date: Sat, 22 Feb 2020 02:31:18 +0800 Subject: [PATCH] planner: fold constant in TopN push down --- planner/core/integration_test.go | 8 ++++++++ planner/core/rule_topn_push_down.go | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index a141b3916af07..4f6267d3d7087 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -285,3 +285,11 @@ func (s *testIntegrationSuite) TestMaxMinEliminate(c *C) { tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) } } + +func (s *testIntegrationSuite) TestTopNByConstFunc(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustQuery("select max(t.col) from (select 'a' as col union all select '' as col) as t").Check(testkit.Rows( + "a", + )) +} diff --git a/planner/core/rule_topn_push_down.go b/planner/core/rule_topn_push_down.go index cfa3cc73c6319..1db0820ab77cc 100644 --- a/planner/core/rule_topn_push_down.go +++ b/planner/core/rule_topn_push_down.go @@ -109,7 +109,7 @@ func (p *LogicalUnionAll) pushDownTopN(topN *LogicalTopN) LogicalPlan { func (p *LogicalProjection) pushDownTopN(topN *LogicalTopN) LogicalPlan { if topN != nil { for _, by := range topN.ByItems { - by.Expr = expression.ColumnSubstitute(by.Expr, p.schema, p.Exprs) + by.Expr = expression.FoldConstant(expression.ColumnSubstitute(by.Expr, p.schema, p.Exprs)) } // remove meaningless constant sort items.