From dc508c84e78b845c8903344e1175d73c97797910 Mon Sep 17 00:00:00 2001 From: zhengdong Date: Wed, 6 Sep 2017 18:01:03 +0800 Subject: [PATCH] KYLIN-2841 LIMIT is buggy with subquery --- .../src/test/resources/query/sql_subquery/query35.sql | 15 +++++++++++++++ .../org/apache/kylin/query/relnode/OLAPAggregateRel.java | 1 + .../java/org/apache/kylin/query/relnode/OLAPContext.java | 1 + .../java/org/apache/kylin/query/relnode/OLAPLimitRel.java | 3 ++- 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100755 kylin-it/src/test/resources/query/sql_subquery/query35.sql mode change 100644 => 100755 query/src/main/java/org/apache/kylin/query/relnode/OLAPAggregateRel.java mode change 100644 => 100755 query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java mode change 100644 => 100755 query/src/main/java/org/apache/kylin/query/relnode/OLAPLimitRel.java diff --git a/kylin-it/src/test/resources/query/sql_subquery/query35.sql b/kylin-it/src/test/resources/query/sql_subquery/query35.sql new file mode 100755 index 000000000..f771e9409 --- /dev/null +++ b/kylin-it/src/test/resources/query/sql_subquery/query35.sql @@ -0,0 +1,15 @@ +SELECT count(1) cnt + FROM ( + select LSTG_FORMAT_NAME, sum(test_kylin_fact.price) as sum_price, count(1) as cnt_1 + from test_kylin_fact +inner JOIN edw.test_cal_dt as test_cal_dt + ON test_kylin_fact.cal_dt = test_cal_dt.cal_dt + inner JOIN test_category_groupings + ON test_kylin_fact.leaf_categ_id = test_category_groupings.leaf_categ_id AND test_kylin_fact.lstg_site_id = test_category_groupings.site_id + inner JOIN edw.test_sites as test_sites + ON test_kylin_fact.lstg_site_id = test_sites.site_id + group by LSTG_FORMAT_NAME + ) + limit 1 + + diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPAggregateRel.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPAggregateRel.java old mode 100644 new mode 100755 index 2c2f572dc..c47cdcce8 --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPAggregateRel.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPAggregateRel.java @@ -174,6 +174,7 @@ public class OLAPAggregateRel extends Aggregate implements OLAPRel { this.context.limitPrecedesAggr = true; } } else { + this.context.afterOuterAggregate = true; for (AggregateCall aggCall : aggCalls) { // check if supported by kylin if (aggCall.isDistinct()) { diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java old mode 100644 new mode 100755 index d1608e971..4ba8b8c7b --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPContext.java @@ -121,6 +121,7 @@ public class OLAPContext { public boolean limitPrecedesAggr = false; public boolean afterJoin = false; public boolean hasJoin = false; + public boolean afterOuterAggregate = false; // cube metadata public IRealization realization; diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPLimitRel.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPLimitRel.java old mode 100644 new mode 100755 index 2a248cc47..2e9e59c0e --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPLimitRel.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPLimitRel.java @@ -79,7 +79,8 @@ public class OLAPLimitRel extends SingleRel implements OLAPRel { // ignore limit after having clause // ignore limit after another limit, e.g. select A, count(*) from (select A,B from fact group by A,B limit 100) limit 10 - if (!context.afterHavingClauseFilter && !context.afterLimit) { + // ignore limit after outer aggregate, e.g. select count(1) from (select A,B from fact group by A,B ) limit 10 + if (!context.afterHavingClauseFilter && !context.afterLimit && !context.afterOuterAggregate) { Number limitValue = (Number) (((RexLiteral) localFetch).getValue()); int limit = limitValue.intValue(); this.context.storageContext.setLimit(limit); -- 2.14.1