You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by gu...@apache.org on 2014/09/13 11:11:49 UTC

svn commit: r1624718 - in /hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql: optimizer/optiq/translator/DerivedTableInjector.java parse/SemanticAnalyzer.java

Author: gunther
Date: Sat Sep 13 09:11:48 2014
New Revision: 1624718

URL: http://svn.apache.org/r1624718
Log:
HIVE-8086: Disable Trivial Project Removal Rule, Fix Result Schema (Laljo John Pullokkaran via Gunther Hagleitner)

Modified:
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java
    hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java?rev=1624718&r1=1624717&r2=1624718&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/optimizer/optiq/translator/DerivedTableInjector.java Sat Sep 13 09:11:48 2014
@@ -34,28 +34,26 @@ import org.eigenbase.rel.ProjectRelBase;
 import org.eigenbase.rel.RelNode;
 import org.eigenbase.rel.SetOpRel;
 import org.eigenbase.rel.SingleRel;
+import org.eigenbase.rel.SortRel;
 import org.eigenbase.rel.TableAccessRelBase;
 import org.eigenbase.rel.TableFunctionRelBase;
-import org.eigenbase.rel.UnionRelBase;
 import org.eigenbase.rel.ValuesRelBase;
 import org.eigenbase.rel.rules.MultiJoinRel;
 import org.eigenbase.relopt.hep.HepRelVertex;
 import org.eigenbase.relopt.volcano.RelSubset;
-import org.eigenbase.rex.RexInputRef;
 import org.eigenbase.rex.RexNode;
 
 public class DerivedTableInjector {
 
   public static RelNode convertOpTree(RelNode rel, List<FieldSchema> resultSchema) {
-    RelNode newTopNode = introduceTopLevelSelectInResultSchema(rel, resultSchema);
+    RelNode newTopNode = rel;
 
-    // NOTE: Hive requires Union to buried in Project (TOK_QUERY,
-    // TOK_SUBQUERY, TOK_UNION)
-    if (newTopNode instanceof UnionRelBase) {
+    if (!(newTopNode instanceof ProjectRelBase) && !(newTopNode instanceof SortRel)) {
       newTopNode = introduceDerivedTable(newTopNode);
     }
 
     convertOpTree(newTopNode, (RelNode) null);
+    newTopNode = renameTopLevelSelectInResultSchema(newTopNode, resultSchema);
 
     return newTopNode;
   }
@@ -120,32 +118,42 @@ public class DerivedTableInjector {
     }
   }
 
-  private static HiveProjectRel introduceTopLevelSelectInResultSchema(final RelNode rootRel,
+  private static RelNode renameTopLevelSelectInResultSchema(final RelNode rootRel,
       List<FieldSchema> resultSchema) {
-    RelNode curNode = rootRel;
-    HiveProjectRel rootProjRel = null;
-    while (curNode != null) {
-      if (curNode instanceof HiveProjectRel) {
-        rootProjRel = (HiveProjectRel) curNode;
+    RelNode tmpRel = rootRel;
+    RelNode parentOforiginalProjRel = rootRel;
+    HiveProjectRel originalProjRel = null;
+
+    while (tmpRel != null) {
+      if (tmpRel instanceof HiveProjectRel) {
+        originalProjRel = (HiveProjectRel) tmpRel;
         break;
       }
-      curNode = curNode.getInput(0);
+      parentOforiginalProjRel = tmpRel;
+      tmpRel = tmpRel.getInput(0);
     }
 
-    // Assumption: tree could only be (limit)?(OB)?(ProjectRelBase)....
-    List<RexNode> rootChildExps = rootProjRel.getChildExps();
+    // Assumption: top portion of tree could only be
+    // (limit)?(OB)?(ProjectRelBase)....
+    List<RexNode> rootChildExps = originalProjRel.getChildExps();
     if (resultSchema.size() != rootChildExps.size()) {
       throw new RuntimeException("Result Schema didn't match Optiq Optimized Op Tree Schema");
     }
 
-    List<RexNode> newSelExps = new ArrayList<RexNode>();
     List<String> newSelAliases = new ArrayList<String>();
     for (int i = 0; i < rootChildExps.size(); i++) {
-      newSelExps.add(new RexInputRef(i, rootChildExps.get(i).getType()));
       newSelAliases.add(resultSchema.get(i).getName());
     }
 
-    return HiveProjectRel.create(rootRel, newSelExps, newSelAliases);
+    HiveProjectRel replacementProjectRel = HiveProjectRel.create(originalProjRel.getChild(),
+        originalProjRel.getChildExps(), newSelAliases);
+
+    if (rootRel == originalProjRel) {
+      return replacementProjectRel;
+    } else {
+      parentOforiginalProjRel.replaceInput(0, replacementProjectRel);
+      return rootRel;
+    }
   }
 
   private static RelNode introduceDerivedTable(final RelNode rel) {

Modified: hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1624718&r1=1624717&r2=1624718&view=diff
==============================================================================
--- hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (original)
+++ hive/branches/cbo/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java Sat Sep 13 09:11:48 2014
@@ -11982,7 +11982,8 @@ public class SemanticAnalyzer extends Ba
 
       basePlan = hepPlan(basePlan, false, mdProvider, new TransitivePredicatesOnJoinRule(
           JoinRelBase.class, HiveFilterRel.DEFAULT_FILTER_FACTORY),
-          RemoveTrivialProjectRule.INSTANCE,
+          // TODO: Enable it after OPTIQ-407 is fixed
+          //RemoveTrivialProjectRule.INSTANCE,
           new HivePartitionPrunerRule(SemanticAnalyzer.this.conf));
 
       RelFieldTrimmer fieldTrimmer = new RelFieldTrimmer(null, HiveProjectRel.DEFAULT_PROJECT_FACTORY,