From aaa895afac87e2c5679df0cfb8534db80c9af900 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 12 Jul 2017 01:33:38 +0800 Subject: [PATCH] bug fixed for PageUtils. for issue #1715 #1803 --- .../java/com/alibaba/druid/sql/PagerUtils.java | 18 +++++++++++------- .../bvt/sql/PagerUtilsTest_Count_MySql_0.java | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index f8a385dd1f..62c6cbd024 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -403,6 +403,7 @@ public class PagerUtils { SQLSelectItem countItem = createCountItem(dbType); SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query; + List selectList = queryBlock.getSelectList(); if (queryBlock.getGroupBy() != null && queryBlock.getGroupBy().getItems().size() > 0) { @@ -410,15 +411,18 @@ public class PagerUtils { } int option = queryBlock.getDistionOption(); - if (option == SQLSetQuantifier.DISTINCT && queryBlock.getSelectList().size() == 1) { - SQLSelectItem firstItem = queryBlock.getSelectList().get(0); - SQLAggregateExpr exp = new SQLAggregateExpr("COUNT", SQLAggregateOption.DISTINCT); - exp.addArgument(firstItem.getExpr()); - firstItem.setExpr(exp); + if (option == SQLSetQuantifier.DISTINCT + && selectList.size() >= 1) { + SQLAggregateExpr countExpr = new SQLAggregateExpr("COUNT", SQLAggregateOption.DISTINCT); + for (int i = 0; i < selectList.size(); ++i) { + countExpr.addArgument(selectList.get(i).getExpr()); + } + selectList.clear(); queryBlock.setDistionOption(0); + queryBlock.addSelectItem(countExpr); } else { - queryBlock.getSelectList().clear(); - queryBlock.getSelectList().add(countItem); + selectList.clear(); + selectList.add(countItem); } return SQLUtils.toSQLString(select, dbType); } else if (query instanceof SQLUnionQuery) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java index 1dc307b2d9..74acf37b69 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java @@ -40,7 +40,7 @@ public class PagerUtilsTest_Count_MySql_0 extends TestCase { public void test_mysql_4() throws Exception { String sql = "select distinct a.col1,a.col2 from test a"; String result = PagerUtils.count(sql, JdbcConstants.MYSQL); - Assert.assertEquals("SELECT DISTINCT COUNT(*)\n" + + assertEquals("SELECT COUNT(DISTINCT a.col1, a.col2)\n" + "FROM test a", result); }