From 2dbe1da57804f700fe5d9bb4429e3d570700a760 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 27 Apr 2017 16:06:49 +0800 Subject: [PATCH] improved PageUtils.hasUnorderedLimit. --- .../java/com/alibaba/druid/sql/PagerUtils.java | 17 ++++++++++++++++- .../sql/PagerUtilsTest_hasUnorderedLimit.java | 5 +++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index 8904fb224a..7514c27987 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -527,7 +527,22 @@ public class PagerUtils { SQLLimit limit = x.getLimit(); if (limit != null && (orderBy == null || orderBy.getItems().size() == 0)) { - unorderedLimitCount++; + boolean subQueryHasOrderBy = false; + SQLTableSource from = x.getFrom(); + if (from instanceof SQLSubqueryTableSource) { + SQLSubqueryTableSource subqueryTabSrc = (SQLSubqueryTableSource) from; + SQLSelect select = subqueryTabSrc.getSelect(); + if (select.getQuery() instanceof SQLSelectQueryBlock) { + SQLSelectQueryBlock subquery = (SQLSelectQueryBlock) select.getQuery(); + if (subquery.getOrderBy() != null && subquery.getOrderBy().getItems().size() > 0) { + subQueryHasOrderBy = true; + } + } + } + + if (!subQueryHasOrderBy) { + unorderedLimitCount++; + } } return true; } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_hasUnorderedLimit.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_hasUnorderedLimit.java index 3df5c21a30..0e7d346bd4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_hasUnorderedLimit.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_hasUnorderedLimit.java @@ -26,4 +26,9 @@ public class PagerUtilsTest_hasUnorderedLimit extends TestCase { String sql = "select * from(select * from test t limit 3) x"; assertTrue(PagerUtils.hasUnorderedLimit(sql, JdbcConstants.MYSQL)); } + + public void test_true_subquery_2() throws Exception { + String sql = "select * from (select * from test t order by id desc) z limit 100"; + assertFalse(PagerUtils.hasUnorderedLimit(sql, JdbcConstants.MYSQL)); + } }