You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by px...@apache.org on 2015/08/12 22:26:55 UTC

hive git commit: HIVE-10183:: [CBO] self-join failing in a test case (Ashutosh Chauhan via Pengcheng Xiong)

Repository: hive
Updated Branches:
  refs/heads/branch-1.0 4e7260ba3 -> d5dcd3e3e


HIVE-10183:: [CBO] self-join failing in a test case (Ashutosh Chauhan via Pengcheng Xiong)


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

Branch: refs/heads/branch-1.0
Commit: d5dcd3e3eb2a5c8d932862ff43a5085cb8805186
Parents: 4e7260b
Author: Pengcheng Xiong <px...@apache.org>
Authored: Wed Aug 12 13:26:51 2015 -0700
Committer: Pengcheng Xiong <px...@apache.org>
Committed: Wed Aug 12 13:26:51 2015 -0700

----------------------------------------------------------------------
 .../translator/PlanModifierForASTConv.java      | 29 ++++++++++++++++++--
 1 file changed, 26 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/d5dcd3e3/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/PlanModifierForASTConv.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/PlanModifierForASTConv.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/PlanModifierForASTConv.java
index 57f030b..98f3e26 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/PlanModifierForASTConv.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/PlanModifierForASTConv.java
@@ -30,6 +30,7 @@ import org.apache.hadoop.hive.ql.optimizer.optiq.OptiqSemanticException;
 import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveAggregateRel;
 import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveProjectRel;
 import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveSortRel;
+import org.apache.hadoop.hive.ql.optimizer.optiq.reloperators.HiveTableScanRel;
 import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory;
 import org.eigenbase.rel.AggregateCall;
 import org.eigenbase.rel.AggregateRelBase;
@@ -53,6 +54,7 @@ import org.eigenbase.reltype.RelDataTypeFactory;
 import org.eigenbase.rex.RexNode;
 import org.eigenbase.sql.SqlKind;
 import org.eigenbase.util.Pair;
+import org.apache.hadoop.hive.ql.optimizer.optiq.RelOptHiveTable;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -94,6 +96,23 @@ public class PlanModifierForASTConv {
     return newTopNode;
   }
 
+  private static String getTblAlias(RelNode rel) {
+
+    if (null == rel) {
+      return null;
+    }
+    if (rel instanceof HiveTableScanRel) {
+      return ((RelOptHiveTable)((HiveTableScanRel)rel).getTable()).getTableAlias();
+    }
+    if (rel instanceof HiveProjectRel) {
+      return null;
+    }
+    if (rel.getInputs().size() == 1) {
+      return getTblAlias(rel.getInput(0));
+    }
+    return null;
+  }
+
   private static void convertOpTree(RelNode rel, RelNode parent) {
 
     if (rel instanceof EmptyRel) {
@@ -104,10 +123,14 @@ public class PlanModifierForASTConv {
       if (!validJoinParent(rel, parent)) {
         introduceDerivedTable(rel, parent);
       }
+      String leftChild = getTblAlias(((JoinRelBase)rel).getLeft());
+      if (null != leftChild && leftChild.equalsIgnoreCase(getTblAlias(((JoinRelBase)rel).getRight()))) {
+        // introduce derived table above one child, if this is self-join
+        // since user provided aliases are lost at this point.
+        introduceDerivedTable(((JoinRelBase)rel).getLeft(), rel);
+      }
     } else if (rel instanceof MultiJoinRel) {
-      throw new RuntimeException("Found MultiJoinRel");
-    } else if (rel instanceof OneRowRelBase) {
-      throw new RuntimeException("Found OneRowRelBase");
+      throw new RuntimeException("Found MultiJoin");
     } else if (rel instanceof RelSubset) {
       throw new RuntimeException("Found RelSubset");
     } else if (rel instanceof SetOpRel) {