You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by da...@apache.org on 2020/02/14 01:13:12 UTC

[calcite] branch master updated: [CALCITE-3793] AssertionError throws for planner digest cache key when the rel type is not struct

This is an automated email from the ASF dual-hosted git repository.

danny0405 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 8a89028  [CALCITE-3793] AssertionError throws for planner digest cache key when the rel type is not struct
8a89028 is described below

commit 8a890281761d4cf3073566ba1a7fcb483af4c5b0
Author: yuzhao.cyz <yu...@gmail.com>
AuthorDate: Thu Feb 13 15:20:04 2020 +0800

    [CALCITE-3793] AssertionError throws for planner digest cache key when the rel type is not struct
    
    Apache Flink and Apache Druid all the customize type for rel node which
    is not a strict type.
---
 .../org/apache/calcite/plan/AbstractRelOptPlanner.java   | 16 ++++++++++++++++
 .../java/org/apache/calcite/plan/hep/HepPlanner.java     |  4 ----
 .../org/apache/calcite/plan/volcano/VolcanoPlanner.java  |  8 +-------
 3 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
index 3804023..25c7c51 100644
--- a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java
@@ -20,13 +20,16 @@ import org.apache.calcite.plan.volcano.RelSubset;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.metadata.RelMetadataProvider;
 import org.apache.calcite.rel.metadata.RelMetadataQuery;
+import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexExecutor;
 import org.apache.calcite.util.CancelFlag;
+import org.apache.calcite.util.Pair;
 import org.apache.calcite.util.Util;
 
 import com.google.common.collect.ImmutableList;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -433,4 +436,17 @@ public abstract class AbstractRelOptPlanner implements RelOptPlanner {
       return clazz.isAssignableFrom(c);
     });
   }
+
+  /** Computes the key for relational expression digest cache. */
+  protected static Pair<String, List<RelDataType>> key(RelNode rel) {
+    return key(rel.getDigest(), rel.getRowType());
+  }
+
+  /** Computes the key for relational expression digest cache. */
+  protected static Pair<String, List<RelDataType>> key(String digest, RelDataType relType) {
+    final List<RelDataType> v = relType.isStruct()
+        ? Pair.right(relType.getFieldList())
+        : Collections.singletonList(relType);
+    return Pair.of(digest, v);
+  }
 }
diff --git a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
index a018b01..3f9dd35 100644
--- a/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java
@@ -920,10 +920,6 @@ public class HepPlanner extends AbstractRelOptPlanner {
         false);
   }
 
-  private static Pair<String, List<RelDataType>> key(RelNode rel) {
-    return Pair.of(rel.getDigest(), Pair.right(rel.getRowType().getFieldList()));
-  }
-
   private RelNode buildFinalPlan(HepRelVertex vertex) {
     RelNode rel = vertex.getCurrentRel();
 
diff --git a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
index 07bc412..5b5df67 100644
--- a/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
+++ b/core/src/main/java/org/apache/calcite/plan/volcano/VolcanoPlanner.java
@@ -1128,11 +1128,6 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
     }
   }
 
-  /** Computes the key for {@link #mapDigestToRel}. */
-  private static Pair<String, List<RelDataType>> key(RelNode rel) {
-    return Pair.of(rel.getDigest(), Pair.right(rel.getRowType().getFieldList()));
-  }
-
   public String toDot() {
     StringWriter sw = new StringWriter();
     PrintWriter pw = new PrintWriter(sw);
@@ -1375,8 +1370,7 @@ public class VolcanoPlanner extends AbstractRelOptPlanner {
   void rename(RelNode rel) {
     final String oldDigest = rel.getDigest();
     if (fixUpInputs(rel)) {
-      final Pair<String, List<RelDataType>> oldKey =
-          Pair.of(oldDigest, Pair.right(rel.getRowType().getFieldList()));
+      final Pair<String, List<RelDataType>> oldKey = key(oldDigest, rel.getRowType());
       final RelNode removed = mapDigestToRel.remove(oldKey);
       assert removed == rel;
       final String newDigest = rel.recomputeDigest();