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/08/21 13:04:04 UTC
incubator-calcite git commit: [CALCITE-850] Remove push down
expressions from FilterJoinRule and create a new rule for it
Repository: incubator-calcite
Updated Branches:
refs/heads/master 6bc8efc43 -> 9f1f73d39
[CALCITE-850] Remove push down expressions from FilterJoinRule and create a new rule for it
Close apache/incubator-calcite#122
Project: http://git-wip-us.apache.org/repos/asf/incubator-calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-calcite/commit/9f1f73d3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-calcite/tree/9f1f73d3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-calcite/diff/9f1f73d3
Branch: refs/heads/master
Commit: 9f1f73d392fbff4f0ac2b29cc9462cf388be645d
Parents: 6bc8efc
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Thu Aug 20 13:03:49 2015 +0300
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Fri Aug 21 14:02:29 2015 +0300
----------------------------------------------------------------------
.../calcite/prepare/CalcitePrepareImpl.java | 2 +
.../calcite/rel/rules/FilterJoinRule.java | 6 --
.../rel/rules/JoinPushExpressionsRule.java | 67 ++++++++++++
.../apache/calcite/test/JdbcAdapterTest.java | 101 +++++++++----------
.../java/org/apache/calcite/test/JdbcTest.java | 2 +-
.../apache/calcite/test/RelOptRulesTest.java | 7 +-
.../enumerable/EnumerableCorrelateTest.java | 4 +-
core/src/test/resources/sql/misc.oq | 4 +-
8 files changed, 130 insertions(+), 63 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/9f1f73d3/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
index 674f093..144755a 100644
--- a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
+++ b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java
@@ -76,6 +76,7 @@ import org.apache.calcite.rel.rules.FilterProjectTransposeRule;
import org.apache.calcite.rel.rules.FilterTableScanRule;
import org.apache.calcite.rel.rules.JoinAssociateRule;
import org.apache.calcite.rel.rules.JoinCommuteRule;
+import org.apache.calcite.rel.rules.JoinPushExpressionsRule;
import org.apache.calcite.rel.rules.JoinPushThroughJoinRule;
import org.apache.calcite.rel.rules.ProjectFilterTransposeRule;
import org.apache.calcite.rel.rules.ProjectMergeRule;
@@ -209,6 +210,7 @@ public class CalcitePrepareImpl implements CalcitePrepare {
ProjectFilterTransposeRule.INSTANCE,
FilterProjectTransposeRule.INSTANCE,
FilterJoinRule.FILTER_ON_JOIN,
+ JoinPushExpressionsRule.INSTANCE,
AggregateExpandDistinctAggregatesRule.INSTANCE,
AggregateReduceFunctionsRule.INSTANCE,
FilterAggregateTransposeRule.INSTANCE,
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/9f1f73d3/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
index 844980a..f393ffd 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterJoinRule.java
@@ -247,12 +247,6 @@ public abstract class FilterJoinRule extends RelOptRule {
newJoinRel = RelOptUtil.createCastRel(newJoinRel, join.getRowType(),
false, projectFactory);
- // Push expression in join condition into Project below Join.
- if (newJoinRel instanceof Join) {
- newJoinRel = RelOptUtil.pushDownJoinConditions(
- (Join) newJoinRel, projectFactory);
- }
-
// create a FilterRel on top of the join if needed
RelNode newRel =
RelOptUtil.createFilter(newJoinRel,
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/9f1f73d3/core/src/main/java/org/apache/calcite/rel/rules/JoinPushExpressionsRule.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rules/JoinPushExpressionsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinPushExpressionsRule.java
new file mode 100644
index 0000000..3e9ec97
--- /dev/null
+++ b/core/src/main/java/org/apache/calcite/rel/rules/JoinPushExpressionsRule.java
@@ -0,0 +1,67 @@
+/*
+ * 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.calcite.rel.rules;
+
+import org.apache.calcite.plan.RelOptRule;
+import org.apache.calcite.plan.RelOptRuleCall;
+import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.rel.RelNode;
+import org.apache.calcite.rel.core.Join;
+import org.apache.calcite.rel.core.RelFactories;
+import org.apache.calcite.rex.RexNode;
+
+/**
+ * Planner rule that pushes down expressions in "equal" join condition.
+ *
+ * <p>For example, given
+ * "emp JOIN dept ON emp.deptno + 1 = dept.deptno", adds a project above
+ * "emp" that computes the expression
+ * "emp.deptno + 1". The resulting join condition is a simple combination
+ * of AND, equals, and input fields, plus the remaining non-equal conditions.
+ */
+public class JoinPushExpressionsRule extends RelOptRule {
+
+ public static final JoinPushExpressionsRule INSTANCE = new JoinPushExpressionsRule(
+ Join.class, RelFactories.DEFAULT_PROJECT_FACTORY);
+
+ private final RelFactories.ProjectFactory projectFactory;
+
+
+ public JoinPushExpressionsRule(Class<? extends Join> clazz,
+ RelFactories.ProjectFactory projectFactory) {
+ super(operand(clazz, any()));
+ this.projectFactory = projectFactory;
+ }
+
+ @Override public void onMatch(RelOptRuleCall call) {
+ Join join = call.rel(0);
+
+ // Push expression in join condition into Project below Join.
+ RelNode newJoin = RelOptUtil.pushDownJoinConditions(join, projectFactory);
+
+ // If the join is the same, we bail out
+ if (newJoin instanceof Join) {
+ final RexNode newCondition = ((Join) newJoin).getCondition();
+ if (join.getCondition().toString().equals(newCondition.toString())) {
+ return;
+ }
+ }
+
+ call.transformTo(newJoin);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/9f1f73d3/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java b/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
index 1ba17d3..ea69cae 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcAdapterTest.java
@@ -95,20 +95,20 @@ public class JdbcAdapterTest {
+ "from scott.emp e inner join scott.dept d \n"
+ "on e.deptno = d.deptno")
.explainContains("PLAN=JdbcToEnumerableConverter\n"
- + " JdbcProject(EMPNO=[$2], ENAME=[$3], DEPTNO=[$4], DNAME=[$1])\n"
- + " JdbcJoin(condition=[=($4, $0)], joinType=[inner])\n"
- + " JdbcProject(DEPTNO=[$0], DNAME=[$1])\n"
- + " JdbcTableScan(table=[[SCOTT, DEPT]])\n"
+ + " JdbcProject(EMPNO=[$0], ENAME=[$1], DEPTNO=[$2], DNAME=[$4])\n"
+ + " JdbcJoin(condition=[=($2, $3)], joinType=[inner])\n"
+ " JdbcProject(EMPNO=[$0], ENAME=[$1], DEPTNO=[$7])\n"
- + " JdbcTableScan(table=[[SCOTT, EMP]])")
+ + " JdbcTableScan(table=[[SCOTT, EMP]])\n"
+ + " JdbcProject(DEPTNO=[$0], DNAME=[$1])\n"
+ + " JdbcTableScan(table=[[SCOTT, DEPT]])")
.runs()
.enable(CalciteAssert.DB == CalciteAssert.DatabaseInstance.HSQLDB)
- .planHasSql("SELECT \"t0\".\"EMPNO\", \"t0\".\"ENAME\", "
- + "\"t0\".\"DEPTNO\", \"t\".\"DNAME\"\n"
- + "FROM (SELECT \"DEPTNO\", \"DNAME\"\n"
- + "FROM \"SCOTT\".\"DEPT\") AS \"t\"\n"
- + "INNER JOIN (SELECT \"EMPNO\", \"ENAME\", \"DEPTNO\"\n"
- + "FROM \"SCOTT\".\"EMP\") AS \"t0\" "
+ .planHasSql("SELECT \"t\".\"EMPNO\", \"t\".\"ENAME\", "
+ + "\"t\".\"DEPTNO\", \"t0\".\"DNAME\"\n"
+ + "FROM (SELECT \"EMPNO\", \"ENAME\", \"DEPTNO\"\n"
+ + "FROM \"SCOTT\".\"EMP\") AS \"t\"\n"
+ + "INNER JOIN (SELECT \"DEPTNO\", \"DNAME\"\n"
+ + "FROM \"SCOTT\".\"DEPT\") AS \"t0\" "
+ "ON \"t\".\"DEPTNO\" = \"t0\".\"DEPTNO\"");
}
@@ -121,18 +121,17 @@ public class JdbcAdapterTest {
+ "from scott.emp e inner join scott.salgrade s \n"
+ "on e.sal > s.losal and e.sal < s.hisal")
.explainContains("PLAN=JdbcToEnumerableConverter\n"
- + " JdbcProject(EMPNO=[$3], ENAME=[$4], GRADE=[$0])\n"
- + " JdbcJoin(condition=[AND(>($5, $1), <($5, $2))], joinType=[inner])\n"
- + " JdbcTableScan(table=[[SCOTT, SALGRADE]])\n"
+ + " JdbcProject(EMPNO=[$0], ENAME=[$1], GRADE=[$3])\n"
+ + " JdbcJoin(condition=[AND(>($2, $4), <($2, $5))], joinType=[inner])\n"
+ " JdbcProject(EMPNO=[$0], ENAME=[$1], SAL=[$5])\n"
- + " JdbcTableScan(table=[[SCOTT, EMP]])")
+ + " JdbcTableScan(table=[[SCOTT, EMP]])\n"
+ + " JdbcTableScan(table=[[SCOTT, SALGRADE]])")
.runs()
.enable(CalciteAssert.DB == CalciteAssert.DatabaseInstance.HSQLDB)
.planHasSql("SELECT \"t\".\"EMPNO\", \"t\".\"ENAME\", "
+ "\"SALGRADE\".\"GRADE\"\n"
- + "FROM \"SCOTT\".\"SALGRADE\"\n"
- + "INNER JOIN (SELECT \"EMPNO\", \"ENAME\", \"SAL\"\n"
- + "FROM \"SCOTT\".\"EMP\") AS \"t\" ON \"SALGRADE\".\"LOSAL\" < \"t\".\"SAL\" AND \"SALGRADE\".\"HISAL\" > \"t\".\"SAL\"");
+ + "FROM (SELECT \"EMPNO\", \"ENAME\", \"SAL\"\nFROM \"SCOTT\".\"EMP\") AS \"t\"\n"
+ + "INNER JOIN \"SCOTT\".\"SALGRADE\" ON \"t\".\"SAL\" > \"SALGRADE\".\"LOSAL\" AND \"t\".\"SAL\" < \"SALGRADE\".\"HISAL\"");
}
@Test public void testNonEquiJoinReverseConditionPlan() {
@@ -141,18 +140,18 @@ public class JdbcAdapterTest {
+ "from scott.emp e inner join scott.salgrade s \n"
+ "on s.losal <= e.sal and s.hisal >= e.sal")
.explainContains("PLAN=JdbcToEnumerableConverter\n"
- + " JdbcProject(EMPNO=[$3], ENAME=[$4], GRADE=[$0])\n"
- + " JdbcJoin(condition=[AND(<=($1, $5), >=($2, $5))], joinType=[inner])\n"
- + " JdbcTableScan(table=[[SCOTT, SALGRADE]])\n"
+ + " JdbcProject(EMPNO=[$0], ENAME=[$1], GRADE=[$3])\n"
+ + " JdbcJoin(condition=[AND(<=($4, $2), >=($5, $2))], joinType=[inner])\n"
+ " JdbcProject(EMPNO=[$0], ENAME=[$1], SAL=[$5])\n"
- + " JdbcTableScan(table=[[SCOTT, EMP]])")
+ + " JdbcTableScan(table=[[SCOTT, EMP]])\n"
+ + " JdbcTableScan(table=[[SCOTT, SALGRADE]])")
.runs()
.enable(CalciteAssert.DB == CalciteAssert.DatabaseInstance.HSQLDB)
.planHasSql("SELECT \"t\".\"EMPNO\", \"t\".\"ENAME\", "
+ "\"SALGRADE\".\"GRADE\"\n"
- + "FROM \"SCOTT\".\"SALGRADE\"\n"
- + "INNER JOIN (SELECT \"EMPNO\", \"ENAME\", \"SAL\"\n"
- + "FROM \"SCOTT\".\"EMP\") AS \"t\" ON \"SALGRADE\".\"LOSAL\" <= \"t\".\"SAL\" AND \"SALGRADE\".\"HISAL\" >= \"t\".\"SAL\"");
+ + "FROM (SELECT \"EMPNO\", \"ENAME\", \"SAL\"\n"
+ + "FROM \"SCOTT\".\"EMP\") AS \"t\"\n"
+ + "INNER JOIN \"SCOTT\".\"SALGRADE\" ON \"t\".\"SAL\" >= \"SALGRADE\".\"LOSAL\" AND \"t\".\"SAL\" <= \"SALGRADE\".\"HISAL\"");
}
@Test public void testMixedJoinPlan() {
@@ -161,20 +160,20 @@ public class JdbcAdapterTest {
+ "from scott.emp e inner join scott.emp m on \n"
+ "e.mgr = m.empno and e.sal > m.sal")
.explainContains("PLAN=JdbcToEnumerableConverter\n"
- + " JdbcProject(EMPNO=[$2], ENAME=[$3], EMPNO0=[$2], ENAME0=[$3])\n"
- + " JdbcJoin(condition=[AND(=($4, $0), >($5, $1))], joinType=[inner])\n"
- + " JdbcProject(EMPNO=[$0], SAL=[$5])\n"
- + " JdbcTableScan(table=[[SCOTT, EMP]])\n"
+ + " JdbcProject(EMPNO=[$0], ENAME=[$1], EMPNO0=[$0], ENAME0=[$1])\n"
+ + " JdbcJoin(condition=[AND(=($2, $4), >($3, $5))], joinType=[inner])\n"
+ " JdbcProject(EMPNO=[$0], ENAME=[$1], MGR=[$3], SAL=[$5])\n"
+ + " JdbcTableScan(table=[[SCOTT, EMP]])\n"
+ + " JdbcProject(EMPNO=[$0], SAL=[$5])\n"
+ " JdbcTableScan(table=[[SCOTT, EMP]])")
.runs()
.enable(CalciteAssert.DB == CalciteAssert.DatabaseInstance.HSQLDB)
- .planHasSql("SELECT \"t0\".\"EMPNO\", \"t0\".\"ENAME\", "
- + "\"t0\".\"EMPNO\" AS \"EMPNO0\", \"t0\".\"ENAME\" AS \"ENAME0\"\n"
- + "FROM (SELECT \"EMPNO\", \"SAL\"\n"
+ .planHasSql("SELECT \"t\".\"EMPNO\", \"t\".\"ENAME\", "
+ + "\"t\".\"EMPNO\" AS \"EMPNO0\", \"t\".\"ENAME\" AS \"ENAME0\"\n"
+ + "FROM (SELECT \"EMPNO\", \"ENAME\", \"MGR\", \"SAL\"\n"
+ "FROM \"SCOTT\".\"EMP\") AS \"t\"\n"
- + "INNER JOIN (SELECT \"EMPNO\", \"ENAME\", \"MGR\", \"SAL\"\n"
- + "FROM \"SCOTT\".\"EMP\") AS \"t0\" ON \"t\".\"EMPNO\" = \"t0\".\"MGR\" AND \"t\".\"SAL\" < \"t0\".\"SAL\"");
+ + "INNER JOIN (SELECT \"EMPNO\", \"SAL\"\n"
+ + "FROM \"SCOTT\".\"EMP\") AS \"t0\" ON \"t\".\"MGR\" = \"t0\".\"EMPNO\" AND \"t\".\"SAL\" > \"t0\".\"SAL\"");
}
@Test public void testMixedJoinWithOrPlan() {
@@ -183,20 +182,20 @@ public class JdbcAdapterTest {
+ "from scott.emp e inner join scott.emp m on \n"
+ "e.mgr = m.empno and (e.sal > m.sal or m.hiredate > e.hiredate)")
.explainContains("PLAN=JdbcToEnumerableConverter\n"
- + " JdbcProject(EMPNO=[$3], ENAME=[$4], EMPNO0=[$3], ENAME0=[$4])\n"
- + " JdbcJoin(condition=[AND(=($5, $0), OR(>($7, $2), >($1, $6)))], joinType=[inner])\n"
- + " JdbcProject(EMPNO=[$0], HIREDATE=[$4], SAL=[$5])\n"
- + " JdbcTableScan(table=[[SCOTT, EMP]])\n"
+ + " JdbcProject(EMPNO=[$0], ENAME=[$1], EMPNO0=[$0], ENAME0=[$1])\n"
+ + " JdbcJoin(condition=[AND(=($2, $5), OR(>($4, $7), >($6, $3)))], joinType=[inner])\n"
+ " JdbcProject(EMPNO=[$0], ENAME=[$1], MGR=[$3], HIREDATE=[$4], SAL=[$5])\n"
+ + " JdbcTableScan(table=[[SCOTT, EMP]])\n"
+ + " JdbcProject(EMPNO=[$0], HIREDATE=[$4], SAL=[$5])\n"
+ " JdbcTableScan(table=[[SCOTT, EMP]])")
.runs()
.enable(CalciteAssert.DB == CalciteAssert.DatabaseInstance.HSQLDB)
- .planHasSql("SELECT \"t0\".\"EMPNO\", \"t0\".\"ENAME\", "
- + "\"t0\".\"EMPNO\" AS \"EMPNO0\", \"t0\".\"ENAME\" AS \"ENAME0\"\n"
- + "FROM (SELECT \"EMPNO\", \"HIREDATE\", \"SAL\"\n"
+ .planHasSql("SELECT \"t\".\"EMPNO\", \"t\".\"ENAME\", "
+ + "\"t\".\"EMPNO\" AS \"EMPNO0\", \"t\".\"ENAME\" AS \"ENAME0\"\n"
+ + "FROM (SELECT \"EMPNO\", \"ENAME\", \"MGR\", \"HIREDATE\", \"SAL\"\n"
+ "FROM \"SCOTT\".\"EMP\") AS \"t\"\n"
- + "INNER JOIN (SELECT \"EMPNO\", \"ENAME\", \"MGR\", \"HIREDATE\", \"SAL\"\n"
- + "FROM \"SCOTT\".\"EMP\") AS \"t0\" ON \"t\".\"EMPNO\" = \"t0\".\"MGR\" AND (\"t\".\"SAL\" < \"t0\".\"SAL\" OR \"t\".\"HIREDATE\" > \"t0\".\"HIREDATE\")");
+ + "INNER JOIN (SELECT \"EMPNO\", \"HIREDATE\", \"SAL\"\n"
+ + "FROM \"SCOTT\".\"EMP\") AS \"t0\" ON \"t\".\"MGR\" = \"t0\".\"EMPNO\" AND (\"t\".\"SAL\" > \"t0\".\"SAL\" OR \"t\".\"HIREDATE\" < \"t0\".\"HIREDATE\")");
}
@Test public void tesJoin3TablesPlan() {
@@ -207,19 +206,19 @@ public class JdbcAdapterTest {
+ "inner join scott.salgrade s \n"
+ "on e.sal > s.losal and e.sal < s.hisal")
.explainContains("PLAN=JdbcToEnumerableConverter\n"
- + " JdbcProject(EMPNO=[$0], ENAME=[$1], DNAME=[$12], GRADE=[$8])\n"
- + " JdbcJoin(condition=[=($7, $11)], joinType=[inner])\n"
- + " JdbcJoin(condition=[AND(>($5, $9), <($5, $10))], joinType=[inner])\n"
+ + " JdbcProject(EMPNO=[$3], ENAME=[$4], DNAME=[$12], GRADE=[$0])\n"
+ + " JdbcJoin(condition=[AND(>($8, $1), <($8, $2))], joinType=[inner])\n"
+ + " JdbcTableScan(table=[[SCOTT, SALGRADE]])\n"
+ + " JdbcJoin(condition=[=($7, $8)], joinType=[inner])\n"
+ " JdbcTableScan(table=[[SCOTT, EMP]])\n"
- + " JdbcTableScan(table=[[SCOTT, SALGRADE]])\n"
- + " JdbcTableScan(table=[[SCOTT, DEPT]])")
+ + " JdbcTableScan(table=[[SCOTT, DEPT]])")
.runs()
.enable(CalciteAssert.DB == CalciteAssert.DatabaseInstance.HSQLDB)
.planHasSql("SELECT \"EMP\".\"EMPNO\", \"EMP\".\"ENAME\", "
+ "\"DEPT\".\"DNAME\", \"SALGRADE\".\"GRADE\"\n"
- + "FROM \"SCOTT\".\"EMP\"\n"
- + "INNER JOIN \"SCOTT\".\"SALGRADE\" ON \"EMP\".\"SAL\" > \"SALGRADE\".\"LOSAL\" AND \"EMP\".\"SAL\" < \"SALGRADE\".\"HISAL\"\n"
- + "INNER JOIN \"SCOTT\".\"DEPT\" ON \"EMP\".\"DEPTNO\" = \"DEPT\".\"DEPTNO\"");
+ + "FROM \"SCOTT\".\"SALGRADE\"\n"
+ + "INNER JOIN (\"SCOTT\".\"EMP\" INNER JOIN \"SCOTT\".\"DEPT\" ON \"EMP\".\"DEPTNO\" = \"DEPT\".\"DEPTNO\") "
+ + "ON \"SALGRADE\".\"LOSAL\" < \"EMP\".\"SAL\" AND \"SALGRADE\".\"HISAL\" > \"EMP\".\"SAL\"");
}
@Test public void testCrossJoinWithJoinKeyPlan() {
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/9f1f73d3/core/src/test/java/org/apache/calcite/test/JdbcTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index e466f39..475ff51 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -2650,7 +2650,7 @@ public class JdbcTest {
.query("select empno, desc from sales.emps,\n"
+ " (SELECT * FROM (VALUES (10, 'SameName')) AS t (id, desc)) as sn\n"
+ "where emps.deptno = sn.id and sn.desc = 'SameName' group by empno, desc")
- .explainContains("EnumerableCalc(expr#0..1=[{inputs}], EMPNO=[$t1], EXPR$1=[$t0])\n"
+ .explainContains("EnumerableCalc(expr#0..1=[{inputs}], EMPNO=[$t1], DESC=[$t0])\n"
+ " EnumerableAggregate(group=[{1, 2}])\n"
+ " EnumerableCalc(expr#0..3=[{inputs}], expr#4=[CAST($t3):INTEGER NOT NULL], expr#5=[=($t4, $t0)], expr#6=['SameName'], expr#7=[=($t1, $t6)], expr#8=[AND($t5, $t7)], proj#0..3=[{exprs}], $condition=[$t8])\n"
+ " EnumerableJoin(condition=[true], joinType=[inner])\n"
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/9f1f73d3/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 013405c..d32c02d 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -52,6 +52,7 @@ import org.apache.calcite.rel.rules.JoinAddRedundantSemiJoinRule;
import org.apache.calcite.rel.rules.JoinCommuteRule;
import org.apache.calcite.rel.rules.JoinExtractFilterRule;
import org.apache.calcite.rel.rules.JoinProjectTransposeRule;
+import org.apache.calcite.rel.rules.JoinPushExpressionsRule;
import org.apache.calcite.rel.rules.JoinPushTransitivePredicatesRule;
import org.apache.calcite.rel.rules.JoinToMultiJoinRule;
import org.apache.calcite.rel.rules.JoinUnionTransposeRule;
@@ -1726,7 +1727,11 @@ public class RelOptRulesTest extends RelOptTestBase {
@Test public void testPushJoinCondDownToProject() {
- checkPlanning(FilterJoinRule.FILTER_ON_JOIN,
+ final HepProgram program = new HepProgramBuilder()
+ .addRuleInstance(FilterJoinRule.FILTER_ON_JOIN)
+ .addRuleInstance(JoinPushExpressionsRule.INSTANCE)
+ .build();
+ checkPlanning(program,
"select d.deptno, e.deptno from sales.dept d, sales.emp e"
+ " where d.deptno + 10 = e.deptno * 2");
}
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/9f1f73d3/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java
index e4ae781..bfb1e75 100644
--- a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java
+++ b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCorrelateTest.java
@@ -33,9 +33,9 @@ public class EnumerableCorrelateTest {
"select empid, name from emps e where exists (select 1 from depts d where d.deptno=e.deptno)")
.explainContains(
"EnumerableCalc(expr#0..4=[{inputs}], empid=[$t0], name=[$t2])\n"
- + " EnumerableSemiJoin(condition=[=($1, $6)], joinType=[inner])\n"
+ + " EnumerableSemiJoin(condition=[=($1, $5)], joinType=[inner])\n"
+ " EnumerableTableScan(table=[[s, emps]])\n"
- + " EnumerableCalc(expr#0..4=[{inputs}], expr#5=[true], $f0=[$t5], deptno0=[$t0])\n"
+ + " EnumerableCalc(expr#0..4=[{inputs}], expr#5=[true], deptno0=[$t0], $f0=[$t5])\n"
+ " EnumerableJoin(condition=[=($0, $1)], joinType=[inner])\n"
+ " EnumerableAggregate(group=[{1}])\n"
+ " EnumerableTableScan(table=[[s, emps]])\n"
http://git-wip-us.apache.org/repos/asf/incubator-calcite/blob/9f1f73d3/core/src/test/resources/sql/misc.oq
----------------------------------------------------------------------
diff --git a/core/src/test/resources/sql/misc.oq b/core/src/test/resources/sql/misc.oq
index 9bb8e58..1d1bd57 100644
--- a/core/src/test/resources/sql/misc.oq
+++ b/core/src/test/resources/sql/misc.oq
@@ -240,9 +240,9 @@ where exists (
(3 rows)
!ok
-EnumerableSemiJoin(condition=[=($1, $6)], joinType=[inner])
+EnumerableSemiJoin(condition=[=($1, $5)], joinType=[inner])
EnumerableTableScan(table=[[hr, emps]])
- EnumerableCalc(expr#0..4=[{inputs}], expr#5=[true], $f0=[$t5], deptno0=[$t0])
+ EnumerableCalc(expr#0..4=[{inputs}], expr#5=[true], deptno0=[$t0], $f0=[$t5])
EnumerableJoin(condition=[=($0, $1)], joinType=[inner])
EnumerableAggregate(group=[{1}])
EnumerableTableScan(table=[[hr, emps]])