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 <h.y...@alibaba-inc.com> 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