This is an automated email from the ASF dual-hosted git repository.
hyuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/master by this push:
new db36758 Revert "[CALCITE-3576] Remove enumerable convention check in
FilterIntoJoinRule"
db36758 is described below
commit db36758c0c9bfaae5aada3da169d09a5270a8d53
Author: Haisheng Yuan <[email protected]>
AuthorDate: Tue Dec 10 13:14:23 2019 -0800
Revert "[CALCITE-3576] Remove enumerable convention check in
FilterIntoJoinRule"
Revert because testJoinMaterialization8 and testJoinMaterialization9 in slow
test are failing.
This reverts commit abb4fef8eda2d26cc14f787c5393caac75a35efb.
---
.../org/apache/calcite/rel/rules/FilterJoinRule.java | 16 ++++++++++++----
core/src/test/java/org/apache/calcite/test/JdbcTest.java | 6 +++---
.../calcite/test/enumerable/EnumerableHashJoinTest.java | 6 +++---
core/src/test/resources/sql/join.iq | 6 +++---
core/src/test/resources/sql/misc.iq | 8 ++++----
core/src/test/resources/sql/sub-query.iq | 9 +++++----
6 files changed, 30 insertions(+), 21 deletions(-)
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 635bd1d..c24a282 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
@@ -16,6 +16,7 @@
*/
package org.apache.calcite.rel.rules;
+import org.apache.calcite.adapter.enumerable.EnumerableConvention;
import org.apache.calcite.plan.RelOptRule;
import org.apache.calcite.plan.RelOptRuleCall;
import org.apache.calcite.plan.RelOptRuleOperand;
@@ -52,21 +53,28 @@ public abstract class FilterJoinRule extends RelOptRule {
* will be pushed into the ON clause. */
public static final Predicate TRUE_PREDICATE = (join, joinType, exp) -> true;
+ /** Predicate that returns true if the join is not Enumerable convention,
+ * will be replaced by {@link #TRUE_PREDICATE} once enumerable join supports
+ * non-equi join. */
+ // to be removed before 1.22.0
+ private static final Predicate NOT_ENUMERABLE = (join, joinType, exp) ->
+ join.getConvention() != EnumerableConvention.INSTANCE;
+
/** Rule that pushes predicates from a Filter into the Join below them. */
public static final FilterJoinRule FILTER_ON_JOIN =
new FilterIntoJoinRule(true, RelFactories.LOGICAL_BUILDER,
- TRUE_PREDICATE);
+ NOT_ENUMERABLE);
/** Dumber version of {@link #FILTER_ON_JOIN}. Not intended for production
* use, but keeps some tests working for which {@code FILTER_ON_JOIN} is too
* smart. */
public static final FilterJoinRule DUMB_FILTER_ON_JOIN =
new FilterIntoJoinRule(false, RelFactories.LOGICAL_BUILDER,
- TRUE_PREDICATE);
+ NOT_ENUMERABLE);
/** Rule that pushes predicates in a Join into the inputs to the join. */
public static final FilterJoinRule JOIN =
- new JoinConditionPushRule(RelFactories.LOGICAL_BUILDER, TRUE_PREDICATE);
+ new JoinConditionPushRule(RelFactories.LOGICAL_BUILDER, NOT_ENUMERABLE);
/** Whether to try to strengthen join-type. */
private final boolean smart;
@@ -98,7 +106,7 @@ public abstract class FilterJoinRule extends RelOptRule {
boolean smart, RelFactories.FilterFactory filterFactory,
RelFactories.ProjectFactory projectFactory) {
this(operand, id, smart, RelBuilder.proto(filterFactory, projectFactory),
- TRUE_PREDICATE);
+ NOT_ENUMERABLE);
}
/**
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 aba424b..e63baac 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -2705,10 +2705,10 @@ public class JdbcTest {
+ "where emps.deptno = sn.id and sn.desc = 'SameName' group by
empno, desc")
.explainContains("EnumerableCalc(expr#0..1=[{inputs}], EMPNO=[$t1],
DESC=[$t0])\n"
+ " EnumerableAggregate(group=[{1, 2}])\n"
- + " EnumerableHashJoin(condition=[=(CAST($3):INTEGER NOT NULL,
$0)], joinType=[inner])\n"
- + " EnumerableCalc(expr#0..1=[{inputs}], expr#2=['SameName'],
expr#3=[=($t1, $t2)], proj#0..1=[{exprs}], $condition=[$t3])\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"
+ + " EnumerableHashJoin(condition=[true], joinType=[inner])\n"
+ " EnumerableValues(tuples=[[{ 10, 'SameName' }]])\n"
- + " EnumerableTableScan(table=[[SALES, EMPS]])\n")
+ + " EnumerableTableScan(table=[[SALES, EMPS]])\n")
.returns("EMPNO=1; DESC=SameName\n");
}
diff --git
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableHashJoinTest.java
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableHashJoinTest.java
index 0d562e2..0c6a480 100644
---
a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableHashJoinTest.java
+++
b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableHashJoinTest.java
@@ -54,9 +54,9 @@ public class EnumerableHashJoinTest {
.query(
"select e.empid, e.name, d.name as dept from emps e join depts d"
+ " on e.deptno=d.deptno and e.empid<150 and e.empid>d.deptno")
- .explainContains(
- "EnumerableCalc(expr#0..4=[{inputs}], empid=[$t0], name=[$t2],
dept=[$t4])\n"
- + " EnumerableHashJoin(condition=[AND(=($1, $3), >($0, $3))],
joinType=[inner])\n"
+ .explainContains("EnumerableCalc(expr#0..4=[{inputs}], expr#5=[>($t0,"
+ + " $t3)], empid=[$t0], name=[$t2], dept=[$t4],
$condition=[$t5])\n"
+ + " EnumerableHashJoin(condition=[=($1, $3)], joinType=[inner])\n"
+ " EnumerableCalc(expr#0..4=[{inputs}], expr#5=[150], "
+ "expr#6=[<($t0, $t5)], proj#0..2=[{exprs}], $condition=[$t6])\n"
+ " EnumerableTableScan(table=[[s, emps]])\n"
diff --git a/core/src/test/resources/sql/join.iq
b/core/src/test/resources/sql/join.iq
index d27a5de..7971d6e 100644
--- a/core/src/test/resources/sql/join.iq
+++ b/core/src/test/resources/sql/join.iq
@@ -37,9 +37,8 @@ on emp.deptno = dept.deptno or emp.ename = dept.dname;
!ok
# As an INNER join, it can be executed as an equi-join followed by a filter
-EnumerableCalc(expr#0..4=[{inputs}], ENAME=[$t2], DEPTNO=[$t3], GENDER=[$t4],
DEPTNO0=[$t0], DNAME=[$t1])
- EnumerableHashJoin(condition=[OR(=($3, $0), =(CAST($2):CHAR(11) NOT NULL,
$1))], joinType=[inner])
- EnumerableValues(tuples=[[{ 10, 'Sales ' }, { 20, 'Marketing ' }, {
30, 'Engineering' }, { 40, 'Empty ' }]])
+EnumerableCalc(expr#0..4=[{inputs}], expr#5=[=($t1, $t3)],
expr#6=[CAST($t0):CHAR(11) NOT NULL], expr#7=[=($t6, $t4)], expr#8=[OR($t5,
$t7)], proj#0..4=[{exprs}], $condition=[$t8])
+ EnumerableHashJoin(condition=[true], joinType=[inner])
EnumerableUnion(all=[true])
EnumerableCalc(expr#0=[{inputs}], expr#1=['Jane'], expr#2=[10],
expr#3=['F'], EXPR$0=[$t1], EXPR$1=[$t2], EXPR$2=[$t3])
EnumerableValues(tuples=[[{ 0 }]])
@@ -59,6 +58,7 @@ EnumerableCalc(expr#0..4=[{inputs}], ENAME=[$t2],
DEPTNO=[$t3], GENDER=[$t4], DE
EnumerableValues(tuples=[[{ 0 }]])
EnumerableCalc(expr#0=[{inputs}], expr#1=['Wilma'],
expr#2=[null:INTEGER], expr#3=['F'], EXPR$0=[$t1], EXPR$1=[$t2], EXPR$2=[$t3])
EnumerableValues(tuples=[[{ 0 }]])
+ EnumerableValues(tuples=[[{ 10, 'Sales ' }, { 20, 'Marketing ' }, {
30, 'Engineering' }, { 40, 'Empty ' }]])
!plan
# Now the same, but LEFT join
diff --git a/core/src/test/resources/sql/misc.iq
b/core/src/test/resources/sql/misc.iq
index b481a0c..777eaa4 100644
--- a/core/src/test/resources/sql/misc.iq
+++ b/core/src/test/resources/sql/misc.iq
@@ -290,8 +290,8 @@ and e."name" <> d."name";
(3 rows)
!ok
-EnumerableCalc(expr#0..4=[{inputs}], empid=[$t0], name=[$t4], name0=[$t2])
- EnumerableHashJoin(condition=[AND(=($1, $3), <>(CAST($2):VARCHAR,
CAST($4):VARCHAR))], joinType=[inner])
+EnumerableCalc(expr#0..4=[{inputs}], expr#5=[CAST($t2):VARCHAR],
expr#6=[CAST($t4):VARCHAR], expr#7=[<>($t5, $t6)], empid=[$t0], name=[$t4],
name0=[$t2], $condition=[$t7])
+ EnumerableHashJoin(condition=[=($1, $3)], joinType=[inner])
EnumerableCalc(expr#0..4=[{inputs}], proj#0..2=[{exprs}])
EnumerableTableScan(table=[[hr, emps]])
EnumerableCalc(expr#0..3=[{inputs}], proj#0..1=[{exprs}])
@@ -314,8 +314,8 @@ and e."name" <> d."name";
(3 rows)
!ok
-EnumerableCalc(expr#0..4=[{inputs}], empid=[$t0], name=[$t4], name0=[$t2])
- EnumerableHashJoin(condition=[AND(=($1, $3), <>(CAST($2):VARCHAR,
CAST($4):VARCHAR))], joinType=[inner])
+EnumerableCalc(expr#0..4=[{inputs}], expr#5=[CAST($t2):VARCHAR],
expr#6=[CAST($t4):VARCHAR], expr#7=[<>($t5, $t6)], empid=[$t0], name=[$t4],
name0=[$t2], $condition=[$t7])
+ EnumerableHashJoin(condition=[=($1, $3)], joinType=[inner])
EnumerableCalc(expr#0..4=[{inputs}], proj#0..2=[{exprs}])
EnumerableTableScan(table=[[hr, emps]])
EnumerableCalc(expr#0..3=[{inputs}], proj#0..1=[{exprs}])
diff --git a/core/src/test/resources/sql/sub-query.iq
b/core/src/test/resources/sql/sub-query.iq
index e7c8064..52ae2ed 100644
--- a/core/src/test/resources/sql/sub-query.iq
+++ b/core/src/test/resources/sql/sub-query.iq
@@ -2055,10 +2055,11 @@ EnumerableAggregate(group=[{}], C=[COUNT()])
EnumerableTableScan(table=[[scott, EMP]])
EnumerableCalc(expr#0..2=[{inputs}], expr#3=[1:BIGINT], expr#4=[IS NOT
NULL($t1)], DNAME=[$t1], $f1=[$t3], $f2=[$t3], $condition=[$t4])
EnumerableTableScan(table=[[scott, DEPT]])
- EnumerableCalc(expr#0..3=[{inputs}], DEPTNO=[$t1], i=[$t2], DNAME=[$t3],
SAL=[$t0])
- EnumerableHashJoin(condition=[=(+($0, 100), $1)], joinType=[inner])
- EnumerableAggregate(group=[{5}])
- EnumerableTableScan(table=[[scott, EMP]])
+ EnumerableCalc(expr#0..4=[{inputs}], DEPTNO=[$t2], i=[$t3], DNAME=[$t4],
SAL=[$t0])
+ EnumerableHashJoin(condition=[=($1, $2)], joinType=[inner])
+ EnumerableCalc(expr#0=[{inputs}], expr#1=[100], expr#2=[+($t0,
$t1)], SAL=[$t0], $f1=[$t2])
+ EnumerableAggregate(group=[{5}])
+ EnumerableTableScan(table=[[scott, EMP]])
EnumerableCalc(expr#0..2=[{inputs}], expr#3=[true], expr#4=[IS NOT
NULL($t1)], DEPTNO=[$t0], i=[$t3], DNAME=[$t1], $condition=[$t4])
EnumerableTableScan(table=[[scott, DEPT]])
!plan