KYLIN-1419 NPE occurs when query from subqueries with order by (revised by Yang)
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/e3e82a60 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/e3e82a60 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/e3e82a60 Branch: refs/heads/1.4-rc Commit: e3e82a60c5a27b669afd28ae875113a19ea0bb76 Parents: c1e753f Author: nichunen <nichu...@mininglamp.com> Authored: Wed Feb 17 11:20:22 2016 +0800 Committer: Li, Yang <liy...@apache.org> Committed: Wed Feb 17 11:20:22 2016 +0800 ---------------------------------------------------------------------- .../resources/query/sql_subquery/query09.sql | 43 ++++++++++++++++++++ .../apache/kylin/query/relnode/OLAPSortRel.java | 8 +++- 2 files changed, 49 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/e3e82a60/kylin-it/src/test/resources/query/sql_subquery/query09.sql ---------------------------------------------------------------------- diff --git a/kylin-it/src/test/resources/query/sql_subquery/query09.sql b/kylin-it/src/test/resources/query/sql_subquery/query09.sql new file mode 100644 index 0000000..436ced5 --- /dev/null +++ b/kylin-it/src/test/resources/query/sql_subquery/query09.sql @@ -0,0 +1,43 @@ +-- +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- + +SELECT t1.week_beg_dt, t1.sum_price, t2.cnt +FROM ( + select test_cal_dt.week_beg_dt, sum(price) as sum_price + 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 test_cal_dt.week_beg_dt +) t1 +inner join ( + select test_cal_dt.week_beg_dt, count(*) as cnt + 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 test_cal_dt.week_beg_dt +) t2 +on t1.week_beg_dt=t2.week_beg_dt +order by t1.week_beg_dt \ No newline at end of file http://git-wip-us.apache.org/repos/asf/kylin/blob/e3e82a60/query/src/main/java/org/apache/kylin/query/relnode/OLAPSortRel.java ---------------------------------------------------------------------- diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPSortRel.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPSortRel.java index b023dfd..c3e0595 100644 --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPSortRel.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPSortRel.java @@ -36,7 +36,6 @@ import org.apache.calcite.rex.RexNode; import org.apache.kylin.metadata.model.MeasureDesc; import org.apache.kylin.metadata.model.TblColRef; import org.apache.kylin.metadata.realization.SQLDigest; -import org.apache.kylin.storage.StorageContext; import com.google.common.base.Preconditions; @@ -81,6 +80,11 @@ public class OLAPSortRel extends Sort implements OLAPRel { public void implementRewrite(RewriteImplementor implementor) { implementor.visitChild(this, getInput()); + // No need to rewrite "order by" applied on non-olap context. + // Occurs in sub-query like "select ... from (...) inner join (...) order by ..." + if (this.context.realization == null) + return; + for (RelFieldCollation fieldCollation : this.collation.getFieldCollations()) { int index = fieldCollation.getFieldIndex(); SQLDigest.OrderEnum order = getOrderEnum(fieldCollation.getDirection()); @@ -116,7 +120,7 @@ public class OLAPSortRel extends Sort implements OLAPRel { @Override public EnumerableRel implementEnumerable(List<EnumerableRel> inputs) { - return new EnumerableSort(getCluster(), getCluster().traitSetOf(EnumerableConvention.INSTANCE, collation), // + return new EnumerableSort(getCluster(), getCluster().traitSetOf(EnumerableConvention.INSTANCE).replace(collation), // sole(inputs), collation, offset, fetch); }