You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by ma...@apache.org on 2016/11/23 20:34:05 UTC
calcite git commit: [CALCITE-1498] Avoid LIMIT with trivial ORDER BY
being pushed through JOIN endlessly
Repository: calcite
Updated Branches:
refs/heads/master ce2122ff2 -> 6a2d9e02e
[CALCITE-1498] Avoid LIMIT with trivial ORDER BY being pushed through JOIN endlessly
Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/6a2d9e02
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/6a2d9e02
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/6a2d9e02
Branch: refs/heads/master
Commit: 6a2d9e02e7696d46428a19d37cb8ad88ef304981
Parents: ce2122f
Author: maryannxue <ma...@gmail.com>
Authored: Wed Nov 23 12:33:54 2016 -0800
Committer: maryannxue <ma...@gmail.com>
Committed: Wed Nov 23 12:33:54 2016 -0800
----------------------------------------------------------------------
.../apache/calcite/rel/metadata/RelMdUtil.java | 2 +-
.../apache/calcite/test/RelOptRulesTest.java | 19 +++++++++++++
.../org/apache/calcite/test/RelOptRulesTest.xml | 29 ++++++++++++++++++++
3 files changed, 49 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/calcite/blob/6a2d9e02/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
index 5435979..089f551 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdUtil.java
@@ -793,7 +793,7 @@ public class RelMdUtil {
public static boolean checkInputForCollationAndLimit(RelMetadataQuery mq,
RelNode input, RelCollation collation, RexNode offset, RexNode fetch) {
// Check if the input is already sorted
- boolean alreadySorted = false;
+ boolean alreadySorted = collation.getFieldCollations().isEmpty();
for (RelCollation inputCollation : mq.collations(input)) {
if (inputCollation.satisfies(collation)) {
alreadySorted = true;
http://git-wip-us.apache.org/repos/asf/calcite/blob/6a2d9e02/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index a87da61..62ffe4f 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -2506,6 +2506,25 @@ public class RelOptRulesTest extends RelOptTestBase {
}
/** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-1498">[CALCITE-1498]
+ * Avoid LIMIT with trivial ORDER BY being pushed through JOIN endlessly</a>. */
+ @Test public void testSortJoinTranspose5() {
+ final HepProgram preProgram = new HepProgramBuilder()
+ .addRuleInstance(SortProjectTransposeRule.INSTANCE)
+ .addRuleInstance(SortJoinTransposeRule.INSTANCE)
+ .addRuleInstance(SortProjectTransposeRule.INSTANCE)
+ .build();
+ final HepProgram program = new HepProgramBuilder()
+ .addRuleInstance(SortJoinTransposeRule.INSTANCE)
+ .build();
+ // SortJoinTransposeRule should not be fired again.
+ final String sql = "select * from sales.emp e right join (\n"
+ + "select * from sales.dept d) using (deptno)\n"
+ + "limit 10";
+ checkPlanning(tester, preProgram, new HepPlanner(program), sql, true);
+ }
+
+ /** Test case for
* <a href="https://issues.apache.org/jira/browse/CALCITE-1023">[CALCITE-1023]
* Planner rule that removes Aggregate keys that are constant</a>. */
@Test public void testAggregateConstantKeyRule() {
http://git-wip-us.apache.org/repos/asf/calcite/blob/6a2d9e02/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
----------------------------------------------------------------------
diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 0e7432f..e1f0b8f 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -5281,6 +5281,35 @@ LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$
]]>
</Resource>
</TestCase>
+ <TestCase name="testSortJoinTranspose5">
+ <Resource name="sql">
+ <![CDATA[select * from sales.emp e right join (
+select * from sales.dept d) using (deptno)
+limit 10]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], DEPTNO0=[$9], NAME=[$10])
+ LogicalSort(fetch=[10])
+ LogicalJoin(condition=[=($7, $9)], joinType=[right])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+ LogicalProject(DEPTNO=[$0], NAME=[$1])
+ LogicalSort(fetch=[10])
+ LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8], DEPTNO0=[$9], NAME=[$10])
+ LogicalSort(fetch=[10])
+ LogicalJoin(condition=[=($7, $9)], joinType=[right])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+ LogicalProject(DEPTNO=[$0], NAME=[$1])
+ LogicalSort(fetch=[10])
+ LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+ </Resource>
+ </TestCase>
<TestCase name="testSortUnionTranspose">
<Resource name="sql">
<![CDATA[select a.name from dept a