You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2015/11/11 13:25:30 UTC
[24/50] [abbrv] calcite git commit: [CALCITE-931] Wrong collation
trait in SortJoinTransposeRule for right joins (Maryann Xue)
[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 <we...@intel.com>
Authored: Mon Oct 26 16:55:36 2015 -0700
Committer: Julian Hyde <jh...@apache.org>
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