Repository: drill Updated Branches: refs/heads/master 3b190762d -> e58696a93
DRILL-2962: Enhance scalar check to recurse below single-input rels. Bump up Calcite version to 1.1.0-drill-r3. Enable TPCH q11 and remove the q11_1 version. Add new test class for correlated subqueries (more tests will be added later). Project: http://git-wip-us.apache.org/repos/asf/drill/repo Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/e58696a9 Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/e58696a9 Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/e58696a9 Branch: refs/heads/master Commit: e58696a93bb65b4985425da89063f7ed9912a29e Parents: 3b19076 Author: Aman Sinha <[email protected]> Authored: Mon May 4 09:03:29 2015 -0700 Committer: Aman Sinha <[email protected]> Committed: Wed May 6 09:48:13 2015 -0700 ---------------------------------------------------------------------- .../exec/physical/impl/join/JoinUtils.java | 20 +++++++--- .../java/org/apache/drill/TestCorrelation.java | 40 ++++++++++++++++++++ .../org/apache/drill/TestTpchDistributed.java | 6 --- .../src/test/resources/queries/tpch/11_1.sql | 28 -------------- pom.xml | 2 +- 5 files changed, 56 insertions(+), 40 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/drill/blob/e58696a9/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/JoinUtils.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/JoinUtils.java b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/JoinUtils.java index 5ed5d27..0af0ddb 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/JoinUtils.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/physical/impl/join/JoinUtils.java @@ -27,7 +27,7 @@ import org.apache.calcite.plan.RelOptUtil; import org.apache.calcite.plan.volcano.RelSubset; import org.apache.drill.exec.planner.logical.DrillAggregateRel; import org.apache.drill.exec.planner.logical.DrillFilterRel; - +import org.apache.drill.exec.planner.logical.DrillProjectRel; import org.apache.drill.common.exceptions.DrillRuntimeException; import org.apache.drill.common.expression.ErrorCollector; import org.apache.drill.common.expression.ErrorCollectorImpl; @@ -41,6 +41,7 @@ import org.apache.drill.exec.resolver.TypeCastRules; import java.util.LinkedList; import java.util.List; + import com.google.common.collect.Lists; public class JoinUtils { @@ -205,16 +206,25 @@ public class JoinUtils { } } - public static boolean isScalarSubquery(RelNode childrel) { + /** + * Utility method to check if a subquery (represented by its root RelNode) is provably scalar. Currently + * only aggregates with no group-by are considered scalar. In the future, this method should be generalized + * to include more cases and reconciled with Calcite's notion of scalar. + * @param root The root RelNode to be examined + * @return True if the root rel or its descendant is scalar, False otherwise + */ + public static boolean isScalarSubquery(RelNode root) { DrillAggregateRel agg = null; - RelNode currentrel = childrel; + RelNode currentrel = root; while (agg == null && currentrel != null) { if (currentrel instanceof DrillAggregateRel) { agg = (DrillAggregateRel)currentrel; - } else if (currentrel instanceof DrillFilterRel) { - currentrel = currentrel.getInput(0); } else if (currentrel instanceof RelSubset) { currentrel = ((RelSubset)currentrel).getBest() ; + } else if (currentrel.getInputs().size() == 1) { + // If the rel is not an aggregate or RelSubset, but is a single-input rel (could be Project, + // Filter, Sort etc.), check its input + currentrel = currentrel.getInput(0); } else { break; } http://git-wip-us.apache.org/repos/asf/drill/blob/e58696a9/exec/java-exec/src/test/java/org/apache/drill/TestCorrelation.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestCorrelation.java b/exec/java-exec/src/test/java/org/apache/drill/TestCorrelation.java new file mode 100644 index 0000000..5ea97b1 --- /dev/null +++ b/exec/java-exec/src/test/java/org/apache/drill/TestCorrelation.java @@ -0,0 +1,40 @@ +/** + * 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. + */ +package org.apache.drill; + +import org.junit.Test; + +public class TestCorrelation extends PlanTestBase { + static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(TestCorrelation.class); + + @Test // DRILL-2962 + public void testScalarAggCorrelatedSubquery() throws Exception { + String query = "select count(*) as cnt from cp.`tpch/nation.parquet` n1 " + + " where n1.n_nationkey > (select avg(n2.n_regionkey) * 4 from cp.`tpch/nation.parquet` n2 " + + " where n1.n_regionkey = n2.n_nationkey)"; + + testBuilder() + .sqlQuery(query) + .ordered() + .baselineColumns("cnt") + .baselineValues((long) 17) + .build() + .run(); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/drill/blob/e58696a9/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java b/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java index 5d2a1c6..f0ddf3d 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java +++ b/exec/java-exec/src/test/java/org/apache/drill/TestTpchDistributed.java @@ -80,16 +80,10 @@ public class TestTpchDistributed extends BaseTestQuery { } @Test - @Ignore // depends on fix for Calcite-695 or an implementation of SqlSingleValueAggFunction in Drill public void tpch11() throws Exception{ testDistributed("queries/tpch/11.sql"); } - @Test // slight variant of tpch-11 that does not require SqlSingleValueAggFunction - public void tpch11_1() throws Exception{ - testDistributed("queries/tpch/11_1.sql"); - } - @Test public void tpch12() throws Exception{ testDistributed("queries/tpch/12.sql"); http://git-wip-us.apache.org/repos/asf/drill/blob/e58696a9/exec/java-exec/src/test/resources/queries/tpch/11_1.sql ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/test/resources/queries/tpch/11_1.sql b/exec/java-exec/src/test/resources/queries/tpch/11_1.sql deleted file mode 100644 index 6eb08fe..0000000 --- a/exec/java-exec/src/test/resources/queries/tpch/11_1.sql +++ /dev/null @@ -1,28 +0,0 @@ --- tpch11 using 1395599672 as a seed to the RNG -select - ps.ps_partkey, - sum(ps.ps_supplycost * ps.ps_availqty) as `value` -from - cp.`tpch/partsupp.parquet` ps, - cp.`tpch/supplier.parquet` s, - cp.`tpch/nation.parquet` n -where - ps.ps_suppkey = s.s_suppkey - and s.s_nationkey = n.n_nationkey - and n.n_name = 'JAPAN' -group by - ps.ps_partkey having - sum(ps.ps_supplycost * ps.ps_availqty) > ( - select - sum(ps.ps_supplycost * ps.ps_availqty * 0.01) - from - cp.`tpch/partsupp.parquet` ps, - cp.`tpch/supplier.parquet` s, - cp.`tpch/nation.parquet` n - where - ps.ps_suppkey = s.s_suppkey - and s.s_nationkey = n.n_nationkey - and n.n_name = 'JAPAN' - ) -order by - `value` desc; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/drill/blob/e58696a9/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index f0f4bc5..defa42f 100644 --- a/pom.xml +++ b/pom.xml @@ -1038,7 +1038,7 @@ <dependency> <groupId>org.apache.calcite</groupId> <artifactId>calcite-core</artifactId> - <version>1.1.0-drill-r2</version> + <version>1.1.0-drill-r3</version> <exclusions> <exclusion> <groupId>org.jgrapht</groupId>
