From c7144ad88bd47bfbd8da58a9c2a81b33adb4b31d Mon Sep 17 00:00:00 2001 From: HangyuanLiu <460660596@qq.com> Date: Sat, 8 Aug 2020 11:38:08 +0800 Subject: [PATCH 1/2] fix npe --- .../java/org/apache/doris/planner/SingleNodePlanner.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java index 3f936cb46b88a9..802898d14338d1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java @@ -2034,6 +2034,11 @@ private List getPredicatesBoundedByGroupbysSourceExpr(List predicate Expr sourceExpr = slotDesc.getSourceExprs().get(0); // if grouping set is given and column is not in all grouping set list // we cannot push the predicate since the column value can be null + if (stmt.getGroupByClause() == null) { + //group by clause may be null when distinct grouping. + //eg: select distinct c from ( select distinct c from table) t where c > 1; + continue; + } if (stmt.getGroupByClause().isGroupByExtension() && stmt.getGroupByClause().getGroupingExprs().contains(sourceExpr)) { // if grouping type is CUBE or ROLLUP will definitely produce null From b1adc30821c10b58e77232937a8887f9125e2004 Mon Sep 17 00:00:00 2001 From: HangyuanLiu <460660596@qq.com> Date: Sat, 8 Aug 2020 11:43:30 +0800 Subject: [PATCH 2/2] add --- .../test/java/org/apache/doris/planner/QueryPlanTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java index 433671ee3b45cb..974484b6481804 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java @@ -850,6 +850,14 @@ public void testJoinPredicateTransitivityWithSubqueryInWhereClause() throws Exce Assert.assertTrue(!explainString.contains("PREDICATES")); } + @Test + public void testDistinctPushDown() throws Exception { + connectContext.setDatabase("default_cluster:test"); + String sql = "select distinct k1 from (select distinct k1 from test.pushdown_test) t where k1 > 1"; + String explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "explain " + sql); + Assert.assertTrue(explainString.contains("PLAN FRAGMENT")); + } + @Test public void testConstInParitionPrune() throws Exception { FeConstants.runningUnitTest = true;