[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"> <