[CALCITE-931] Wrong collation trait in SortJoinTransposeRule for right joins 
(Maryann Xue)


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/b8599379
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/b8599379
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/b8599379

Branch: refs/heads/branch-release
Commit: b859937906c7e38ab6c91a57652dfc6eb2be2693
Parents: 74803d0
Author: maryannxue <[email protected]>
Authored: Mon Oct 26 16:55:36 2015 -0700
Committer: Julian Hyde <[email protected]>
Committed: Mon Oct 26 17:38:23 2015 -0700

----------------------------------------------------------------------
 .../rel/rules/SortJoinTransposeRule.java        | 11 +++--
 .../apache/calcite/test/RelOptRulesTest.java    | 47 +++++++++++++++++---
 .../org/apache/calcite/test/RelOptRulesTest.xml | 28 ++++++++++++
 3 files changed, 75 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/b8599379/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java 
b/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java
index 4c228c8..66b0afb 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/SortJoinTransposeRule.java
@@ -19,6 +19,7 @@ package org.apache.calcite.rel.rules;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptRuleCall;
 import org.apache.calcite.rel.RelCollation;
+import org.apache.calcite.rel.RelCollationTraitDef;
 import org.apache.calcite.rel.RelCollations;
 import org.apache.calcite.rel.RelFieldCollation;
 import org.apache.calcite.rel.RelNode;
@@ -109,8 +110,10 @@ public class SortJoinTransposeRule extends RelOptRule {
           sort.offset, sort.fetch);
       newRightInput = join.getRight();
     } else {
-      final RelCollation rightCollation = RelCollations.shift(
-          sort.getCollation(), -join.getLeft().getRowType().getFieldCount());
+      final RelCollation rightCollation =
+          RelCollationTraitDef.INSTANCE.canonize(
+              RelCollations.shift(sort.getCollation(),
+                  -join.getLeft().getRowType().getFieldCount()));
       // If the input is already sorted and we are not reducing the number of 
tuples,
       // we bail out
       if (RelMdUtil.checkInputForCollationAndLimit(join.getRight(), 
rightCollation,
@@ -118,8 +121,8 @@ public class SortJoinTransposeRule extends RelOptRule {
         return;
       }
       newLeftInput = join.getLeft();
-      newRightInput = sort.copy(sort.getTraitSet(), join.getRight(), 
rightCollation,
-          sort.offset, sort.fetch);
+      newRightInput = sort.copy(sort.getTraitSet().replace(rightCollation),
+          join.getRight(), rightCollation, sort.offset, sort.fetch);
     }
     // We copy the join and the top sort operator
     final RelNode joinCopy = join.copy(join.getTraitSet(), 
join.getCondition(), newLeftInput,

http://git-wip-us.apache.org/repos/asf/calcite/blob/b8599379/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 c237ece..53c3f63 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -16,18 +16,21 @@
  */
 package org.apache.calcite.test;
 
+import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.plan.RelOptRule;
 import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.plan.RelTraitDef;
+import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.plan.hep.HepMatchOrder;
 import org.apache.calcite.plan.hep.HepPlanner;
 import org.apache.calcite.plan.hep.HepProgram;
 import org.apache.calcite.plan.hep.HepProgramBuilder;
 import org.apache.calcite.prepare.Prepare;
+import org.apache.calcite.rel.RelCollationTraitDef;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.RelRoot;
 import org.apache.calcite.rel.core.Join;
 import org.apache.calcite.rel.core.JoinRelType;
-import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.logical.LogicalTableModify;
 import org.apache.calcite.rel.metadata.CachingRelMetadataProvider;
 import org.apache.calcite.rel.metadata.ChainedRelMetadataProvider;
@@ -85,9 +88,11 @@ import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.sql.validate.SqlValidator;
 import org.apache.calcite.sql2rel.SqlToRelConverter;
+import org.apache.calcite.tools.RelBuilder;
 import org.apache.calcite.util.Util;
 
 import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
 import org.junit.Ignore;
@@ -330,13 +335,10 @@ public class RelOptRulesTest extends RelOptTestBase {
           }
         };
     final FilterJoinRule join =
-        new FilterJoinRule.JoinConditionPushRule(
-            RelFactories.DEFAULT_FILTER_FACTORY,
-            RelFactories.DEFAULT_PROJECT_FACTORY, predicate);
+        new FilterJoinRule.JoinConditionPushRule(RelBuilder.proto(), 
predicate);
     final FilterJoinRule filterOnJoin =
-        new FilterJoinRule.FilterIntoJoinRule(true,
-            RelFactories.DEFAULT_FILTER_FACTORY,
-            RelFactories.DEFAULT_PROJECT_FACTORY, predicate);
+        new FilterJoinRule.FilterIntoJoinRule(true, RelBuilder.proto(),
+            predicate);
     final HepProgram program =
         HepProgram.builder()
             .addGroupBegin()
@@ -1948,6 +1950,37 @@ public class RelOptRulesTest extends RelOptTestBase {
     checkPlanning(tester, preProgram, new HepPlanner(program), sql);
   }
 
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-931";>[CALCITE-931]
+   * Wrong collation trait in SortJoinTransposeRule for right joins</a>. */
+  @Test public void testSortJoinTranspose4() {
+    // Create a customized test with RelCollation trait in the test cluster.
+    Tester tester = new TesterImpl(getDiffRepos(), true, false, null) {
+      @Override public RelOptPlanner createPlanner() {
+        return new MockRelOptPlanner() {
+          @Override public List<RelTraitDef> getRelTraitDefs() {
+            return 
ImmutableList.<RelTraitDef>of(RelCollationTraitDef.INSTANCE);
+          }
+          @Override public RelTraitSet emptyTraitSet() {
+            return RelTraitSet.createEmpty().plus(
+                RelCollationTraitDef.INSTANCE.getDefault());
+          }
+        };
+      }
+    };
+
+    final HepProgram preProgram = new HepProgramBuilder()
+        .addRuleInstance(SortProjectTransposeRule.INSTANCE)
+        .build();
+    final HepProgram program = new HepProgramBuilder()
+        .addRuleInstance(SortJoinTransposeRule.INSTANCE)
+        .build();
+    final String sql = "select * from sales.emp e right join (\n"
+        + "select * from sales.dept d) using (deptno)\n"
+        + "order by name";
+    checkPlanning(tester, preProgram, new HepPlanner(program), sql);
+  }
+
 }
 
 // End RelOptRulesTest.java

http://git-wip-us.apache.org/repos/asf/calcite/blob/b8599379/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 f51e4e9..b1be89c 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -4180,6 +4180,34 @@ LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], 
MGR=[$3], HIREDATE=[$4], SAL=[$
 ]]>
         </Resource>
     </TestCase>
+    <TestCase name="testSortJoinTranspose4">
+        <Resource name="sql">
+            <![CDATA[select * from sales.emp e right join (
+select * from sales.dept d) using (deptno)
+order by name]]>
+        </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(sort0=[$10], dir0=[ASC])
+    LogicalJoin(condition=[=($7, $9)], joinType=[right])
+      LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+      LogicalProject(DEPTNO=[$0], NAME=[$1])
+        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(sort0=[$10], dir0=[ASC])
+    LogicalJoin(condition=[=($7, $9)], joinType=[right])
+      LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+      LogicalSort(sort0=[$1], dir0=[ASC])
+        LogicalProject(DEPTNO=[$0], NAME=[$1])
+          LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
+]]>
+        </Resource>
+    </TestCase>
     <TestCase name="testSortUnionTranspose">
         <Resource name="sql">
             <![CDATA[select a.name from dept a

Reply via email to