You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2014/07/22 22:29:01 UTC

git commit: Eliminate duplicate conditions in RexProgramBuilder.addCondition, not RexBuilder.makeCall as previously.

Repository: incubator-optiq
Updated Branches:
  refs/heads/master b059c093d -> 4ef9f4675


Eliminate duplicate conditions in RexProgramBuilder.addCondition, not RexBuilder.makeCall as previously.


Project: http://git-wip-us.apache.org/repos/asf/incubator-optiq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-optiq/commit/4ef9f467
Tree: http://git-wip-us.apache.org/repos/asf/incubator-optiq/tree/4ef9f467
Diff: http://git-wip-us.apache.org/repos/asf/incubator-optiq/diff/4ef9f467

Branch: refs/heads/master
Commit: 4ef9f46757528d21c510eb8bd171fa04ba86e36d
Parents: b059c09
Author: Julian Hyde <jh...@apache.org>
Authored: Tue Jul 22 12:17:49 2014 -0700
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue Jul 22 12:17:49 2014 -0700

----------------------------------------------------------------------
 .../main/java/org/eigenbase/relopt/RelOptUtil.java  |  1 +
 .../src/main/java/org/eigenbase/rex/RexBuilder.java | 10 ----------
 .../java/org/eigenbase/rex/RexProgramBuilder.java   | 16 +++++++++-------
 .../java/org/eigenbase/test/RexProgramTest.java     |  8 ++++++--
 core/src/test/resources/sql/misc.oq                 |  8 ++++++++
 5 files changed, 24 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/4ef9f467/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java b/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
index b03948f..5d46953 100644
--- a/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
+++ b/core/src/main/java/org/eigenbase/relopt/RelOptUtil.java
@@ -1376,6 +1376,7 @@ public abstract class RelOptUtil {
     planner.addRule(RemoveEmptyRules.JOIN_RIGHT_INSTANCE);
     planner.addRule(RemoveEmptyRules.SORT_FETCH_ZERO_INSTANCE);
     planner.addRule(WindowedAggSplitterRule.PROJECT);
+    planner.addRule(MergeFilterRule.INSTANCE);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/4ef9f467/core/src/main/java/org/eigenbase/rex/RexBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rex/RexBuilder.java b/core/src/main/java/org/eigenbase/rex/RexBuilder.java
index 5a82c7c..a3ac037 100644
--- a/core/src/main/java/org/eigenbase/rex/RexBuilder.java
+++ b/core/src/main/java/org/eigenbase/rex/RexBuilder.java
@@ -206,16 +206,6 @@ public class RexBuilder {
   public RexNode makeCall(
       SqlOperator op,
       List<? extends RexNode> exprs) {
-    // TODO jvs 12-Jun-2010:  Find a better place for this;
-    // it surely does not belong here.
-    if (op == SqlStdOperatorTable.AND
-        && exprs.size() == 2
-        && exprs.get(0).equals(exprs.get(1))) {
-      // Avoid generating 'AND(x, x)'; this can cause plan explosions if a
-      // relnode is its own child and is merged with itself.
-      return exprs.get(0);
-    }
-
     final RelDataType type = deriveReturnType(op, typeFactory, exprs);
     return new RexCall(type, op, exprs);
   }

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/4ef9f467/core/src/main/java/org/eigenbase/rex/RexProgramBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/eigenbase/rex/RexProgramBuilder.java b/core/src/main/java/org/eigenbase/rex/RexProgramBuilder.java
index 73db3be..e7a0a3e 100644
--- a/core/src/main/java/org/eigenbase/rex/RexProgramBuilder.java
+++ b/core/src/main/java/org/eigenbase/rex/RexProgramBuilder.java
@@ -248,14 +248,16 @@ public class RexProgramBuilder {
       conditionRef = registerInput(expr);
     } else {
       // AND the new condition with the existing condition.
+      // If the new condition is identical to the existing condition, skip it.
       RexLocalRef ref = registerInput(expr);
-      final RexLocalRef andRef =
-          registerInput(
-              rexBuilder.makeCall(
-                  SqlStdOperatorTable.AND,
-                  conditionRef,
-                  ref));
-      conditionRef = andRef;
+      if (!ref.equals(conditionRef)) {
+        conditionRef =
+            registerInput(
+                rexBuilder.makeCall(
+                    SqlStdOperatorTable.AND,
+                    conditionRef,
+                    ref));
+      }
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/4ef9f467/core/src/test/java/org/eigenbase/test/RexProgramTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/eigenbase/test/RexProgramTest.java b/core/src/test/java/org/eigenbase/test/RexProgramTest.java
index 7904199..3a65eae 100644
--- a/core/src/test/java/org/eigenbase/test/RexProgramTest.java
+++ b/core/src/test/java/org/eigenbase/test/RexProgramTest.java
@@ -120,16 +120,20 @@ public class RexProgramTest {
   }
 
   /**
-   * Tests that AND(x, x) is translated to x.
+   * Checks translation of AND(x, x).
    */
   @Test public void testDuplicateAnd() {
+    // RexProgramBuilder used to translate AND(x, x) to x.
+    // Now it translates it to AND(x, x).
+    // The optimization of AND(x, x) => x occurs at a higher level.
     final RexProgramBuilder builder = createProg(2);
     final String program = builder.getProgram(true).toString();
     TestUtil.assertEqualsVerbose(
         "(expr#0..1=[{inputs}], expr#2=[+($t0, $t1)], expr#3=[1], "
         + "expr#4=[+($t0, $t3)], expr#5=[+($t2, $t4)], "
         + "expr#6=[+($t0, $t0)], expr#7=[>($t2, $t0)], "
-        + "a=[$t5], b=[$t6], $condition=[$t7])",
+        + "expr#8=[AND($t7, $t7)], expr#9=[AND($t8, $t7)], "
+        + "a=[$t5], b=[$t6], $condition=[$t9])",
         program);
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-optiq/blob/4ef9f467/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 b8f72b0..21711f6 100644
--- a/core/src/test/resources/sql/misc.oq
+++ b/core/src/test/resources/sql/misc.oq
@@ -226,5 +226,13 @@ EnumerableCalcRel(expr#0..56=[{inputs}], $f0=[$t20], $f1=[$t21], $f2=[$t22], $f3
         EnumerableTableAccessRel(table=[[foodmart2, customer]])
 !plan
 
+# Check that when filters are merged, duplicate conditions are eliminated.
+select * from (
+  select * from "days"
+  where "day" = 1)
+where "day" = 1;
+EnumerableCalcRel(expr#0..1=[{inputs}], expr#2=[1], expr#3=[=($t0, $t2)], proj#0..1=[{exprs}], $condition=[$t3])
+  EnumerableTableAccessRel(table=[[foodmart2, days]])
+!plan
 
 # End misc.oq