You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by am...@apache.org on 2015/04/11 01:19:04 UTC

drill git commit: DRILL-2639: At planning for Union-All, block only the cases where implicit casting cannot resolve an output type

Repository: drill
Updated Branches:
  refs/heads/master 434099659 -> 38eb383a9


DRILL-2639: At planning for Union-All, block only the cases where implicit casting cannot resolve an output type


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/38eb383a
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/38eb383a
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/38eb383a

Branch: refs/heads/master
Commit: 38eb383a9589891dbd37033545145cca25d1a253
Parents: 4340996
Author: Hsuan-Yi Chu <hs...@usc.edu>
Authored: Wed Apr 1 15:16:52 2015 -0700
Committer: Aman Sinha <as...@maprtech.com>
Committed: Fri Apr 10 14:28:34 2015 -0700

----------------------------------------------------------------------
 .../org/apache/drill/common/types/Types.java    | 56 +++++++++++++-------
 .../exec/planner/common/DrillRelOptUtil.java    | 16 +++++-
 .../exec/planner/common/DrillUnionRelBase.java  |  2 +-
 .../drill/exec/planner/logical/DrillOptiq.java  |  1 +
 .../java/org/apache/drill/TestUnionAll.java     | 19 +++++++
 5 files changed, 73 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/38eb383a/common/src/main/java/org/apache/drill/common/types/Types.java
----------------------------------------------------------------------
diff --git a/common/src/main/java/org/apache/drill/common/types/Types.java b/common/src/main/java/org/apache/drill/common/types/Types.java
index 015ee90..c41727d 100644
--- a/common/src/main/java/org/apache/drill/common/types/Types.java
+++ b/common/src/main/java/org/apache/drill/common/types/Types.java
@@ -324,53 +324,71 @@ public class Types {
     return getMajorTypeFromName(typeName, DataMode.REQUIRED);
   }
 
-  public static MajorType getMajorTypeFromName(String typeName, DataMode mode) {
+  public static MinorType getMinorTypeFromName(String typeName) {
+    typeName = typeName.toLowerCase();
+
     switch (typeName) {
     case "bool":
     case "boolean":
-      return withMode(MinorType.BIT, mode);
+      return MinorType.BIT;
     case "tinyint":
-      return withMode(MinorType.TINYINT, mode);
+      return MinorType.TINYINT;
     case "uint1":
-      return withMode(MinorType.UINT1, mode);
+      return MinorType.UINT1;
     case "smallint":
-      return withMode(MinorType.SMALLINT, mode);
+      return MinorType.SMALLINT;
     case "uint2":
-      return withMode(MinorType.UINT2, mode);
+      return MinorType.UINT2;
+    case "integer":
     case "int":
-      return withMode(MinorType.INT, mode);
+      return MinorType.INT;
     case "uint4":
-      return withMode(MinorType.UINT4, mode);
+      return MinorType.UINT4;
     case "bigint":
-      return withMode(MinorType.BIGINT, mode);
+      return MinorType.BIGINT;
     case "uint8":
-      return withMode(MinorType.UINT8, mode);
+      return MinorType.UINT8;
     case "float":
-      return withMode(MinorType.FLOAT4, mode);
+      return MinorType.FLOAT4;
     case "double":
-      return withMode(MinorType.FLOAT8, mode);
+      return MinorType.FLOAT8;
     case "decimal":
-      return withMode(MinorType.DECIMAL38SPARSE, mode);
+      return MinorType.DECIMAL38SPARSE;
+    case "symbol":
+    case "char":
     case "utf8":
     case "varchar":
-      return withMode(MinorType.VARCHAR, mode);
+      return MinorType.VARCHAR;
     case "utf16":
     case "string":
     case "var16char":
-      return withMode(MinorType.VAR16CHAR, mode);
+      return MinorType.VAR16CHAR;
+    case "timestamp":
+      return MinorType.TIMESTAMP;
+    case "interval_year_month":
+      return MinorType.INTERVALYEAR;
+    case "interval_day_time":
+      return MinorType.INTERVALDAY;
     case "date":
-      return withMode(MinorType.DATE, mode);
+      return MinorType.DATE;
     case "time":
-      return withMode(MinorType.TIME, mode);
+      return MinorType.TIME;
     case "binary":
-      return withMode(MinorType.VARBINARY, mode);
+      return MinorType.VARBINARY;
     case "json":
-      return withMode(MinorType.LATE, mode);
+      return MinorType.LATE;
+    case "null":
+    case "any":
+      return MinorType.NULL;
     default:
       throw new UnsupportedOperationException("Could not determine type: " + typeName);
     }
   }
 
+  public static MajorType getMajorTypeFromName(String typeName, DataMode mode) {
+    return withMode(getMinorTypeFromName(typeName), mode);
+  }
+
   public static String getNameOfMinorType(MinorType type) {
     switch (type) {
       case BIT:

http://git-wip-us.apache.org/repos/asf/drill/blob/38eb383a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillRelOptUtil.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillRelOptUtil.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillRelOptUtil.java
index aba6022..cacf26b 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillRelOptUtil.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillRelOptUtil.java
@@ -19,6 +19,11 @@ package org.apache.drill.exec.planner.common;
 
 import java.util.List;
 
+import com.google.common.collect.Lists;
+import org.apache.drill.common.types.TypeProtos;
+import org.apache.drill.common.types.Types;
+import org.apache.drill.exec.planner.logical.DrillOptiq;
+import org.apache.drill.exec.resolver.TypeCastRules;
 import org.eigenbase.reltype.RelDataType;
 import org.eigenbase.reltype.RelDataTypeField;
 import org.eigenbase.sql.type.SqlTypeName;
@@ -31,7 +36,7 @@ import org.eigenbase.util.Pair;
 public abstract class DrillRelOptUtil {
 
   // Similar to RelOptUtil.areRowTypesEqual() with the additional check for allowSubstring
-  public static boolean areRowTypesEqual(
+  public static boolean areRowTypesCompatible(
       RelDataType rowType1,
       RelDataType rowType2,
       boolean compareNames,
@@ -63,6 +68,15 @@ public abstract class DrillRelOptUtil {
             && (type1.getPrecision() <= type2.getPrecision())) {
           return true;
         }
+
+        // Check if Drill implicit casting can resolve the incompatibility
+        List<TypeProtos.MinorType> types = Lists.newArrayListWithCapacity(2);
+        types.add(Types.getMinorTypeFromName(type1.getSqlTypeName().getName()));
+        types.add(Types.getMinorTypeFromName(type2.getSqlTypeName().getName()));
+        if(TypeCastRules.getLeastRestrictiveType(types) != null) {
+          return true;
+        }
+
         return false;
       }
     }

http://git-wip-us.apache.org/repos/asf/drill/blob/38eb383a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillUnionRelBase.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillUnionRelBase.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillUnionRelBase.java
index 932aa76..11ed8ba 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillUnionRelBase.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/common/DrillUnionRelBase.java
@@ -43,7 +43,7 @@ public abstract class DrillUnionRelBase extends UnionRelBase implements DrillRel
   public boolean isCompatible(boolean compareNames, boolean allowSubstring) {
     RelDataType unionType = getRowType();
     for (RelNode input : getInputs()) {
-      if (! DrillRelOptUtil.areRowTypesEqual(
+      if (! DrillRelOptUtil.areRowTypesCompatible(
           input.getRowType(), unionType, compareNames, allowSubstring)) {
         return false;
       }

http://git-wip-us.apache.org/repos/asf/drill/blob/38eb383a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java
index 796f0f7..5dd6ed5 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/DrillOptiq.java
@@ -52,6 +52,7 @@ import org.eigenbase.rex.RexRangeRef;
 import org.eigenbase.rex.RexVisitorImpl;
 import org.eigenbase.sql.SqlSyntax;
 import org.eigenbase.sql.fun.SqlStdOperatorTable;
+import org.eigenbase.sql.type.SqlTypeName;
 import org.eigenbase.util.NlsString;
 
 import com.google.common.collect.Lists;

http://git-wip-us.apache.org/repos/asf/drill/blob/38eb383a/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java b/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java
index 3843b32..d31cd19 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestUnionAll.java
@@ -459,4 +459,23 @@ public class TestUnionAll extends BaseTestQuery{
         .baselineValues("99")
         .build().run();
   }
+
+  @Test // see DRILL-2639
+  public void testUnionAllDiffTypesAtPlanning() throws Exception {
+    String query = "select count(c1) as ct from (select cast(r_regionkey as int) c1 from cp.`tpch/region.parquet`) " +
+        "union all " +
+        "(select cast(r_regionkey as int) c2 from cp.`tpch/region.parquet`)";
+
+    testBuilder()
+        .sqlQuery(query)
+        .ordered()
+        .baselineColumns("ct")
+        .baselineValues((long) 5)
+        .baselineValues((long) 0)
+        .baselineValues((long) 1)
+        .baselineValues((long) 2)
+        .baselineValues((long) 3)
+        .baselineValues((long) 4)
+        .build().run();
+  }
 }
\ No newline at end of file