You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jc...@apache.org on 2016/07/06 22:18:15 UTC

hive git commit: HIVE-14138: CBO failed for select current_database() (Peter Vary, reviewed by Jesus Camacho Rodriguez)

Repository: hive
Updated Branches:
  refs/heads/master 13e702916 -> e75ede3af


HIVE-14138: CBO failed for select current_database() (Peter Vary, reviewed by Jesus Camacho Rodriguez)


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

Branch: refs/heads/master
Commit: e75ede3afebd42e4dd5b92f509cbfa5ca00aef2c
Parents: 13e7029
Author: Peter Vary <pv...@cloudera.com>
Authored: Wed Jul 6 23:13:10 2016 +0100
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Wed Jul 6 23:13:10 2016 +0100

----------------------------------------------------------------------
 .../apache/hadoop/hive/ql/parse/CalcitePlanner.java    |  8 +++++---
 ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java    | 13 +++++++++++++
 .../java/org/apache/hadoop/hive/ql/parse/QBExpr.java   | 13 +++++++++++++
 .../results/clientpositive/tez/explainuser_1.q.out     |  2 +-
 4 files changed, 32 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/e75ede3a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
index a7ee015..6c57d3e 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java
@@ -387,8 +387,9 @@ public class CalcitePlanner extends SemanticAnalyzer {
     boolean needToLogMessage = STATIC_LOG.isInfoEnabled();
     boolean isSupportedRoot = root == HiveParser.TOK_QUERY || root == HiveParser.TOK_EXPLAIN
         || qb.isCTAS();
-    boolean isSupportedType = qb.getIsQuery() || qb.isCTAS()
-        || cboCtx.type == PreCboCtx.Type.INSERT;
+    // Queries without a source table currently are not supported by CBO
+    boolean isSupportedType = (qb.getIsQuery() && !qb.containsQueryWithoutSourceTable())
+        || qb.isCTAS() || cboCtx.type == PreCboCtx.Type.INSERT;
     boolean noBadTokens = HiveCalciteUtil.validateASTForUnsupportedTokens(ast);
     boolean result = isSupportedRoot && isSupportedType && getCreateViewDesc() == null
         && noBadTokens;
@@ -400,7 +401,8 @@ public class CalcitePlanner extends SemanticAnalyzer {
           msg += "doesn't have QUERY or EXPLAIN as root and not a CTAS; ";
         }
         if (!isSupportedType) {
-          msg += "is not a query, CTAS, or insert; ";
+          msg += "is not a query with at least one source table "
+                  + " or there is a subquery without a source table, or CTAS, or insert; ";
         }
         if (getCreateViewDesc() != null) {
           msg += "has create view; ";

http://git-wip-us.apache.org/repos/asf/hive/blob/e75ede3a/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java
index de7b151..7e732f3 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java
@@ -437,4 +437,17 @@ public class QB {
     return aliasInsideView;
   }
 
+  /**
+   * returns true, if the query block contains any query, or subquery without a source table
+   * Like select current_user(), select current_database()
+   * @return true, if the query block contains any query without a source table
+   */
+  public boolean containsQueryWithoutSourceTable() {
+    for (QBExpr qbexpr : aliasToSubq.values()) {
+      if (qbexpr.containsQueryWithoutSourceTable()) {
+        return true;
+      }
+    }
+    return aliasToTabs.size()==0 && aliasToSubq.size()==0;
+  }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/e75ede3a/ql/src/java/org/apache/hadoop/hive/ql/parse/QBExpr.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/QBExpr.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/QBExpr.java
index 32aee48..cccf0f6 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/QBExpr.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/QBExpr.java
@@ -120,4 +120,17 @@ public class QBExpr {
     }
     return qbexpr1.isSimpleSelectQuery() && qbexpr2.isSimpleSelectQuery();
   }
+
+  /**
+   * returns true, if the query block contains any query, or subquery without a source table
+   * Like select current_user(), select current_database()
+   * @return true, if the query block contains any query without a source table
+   */
+  public boolean containsQueryWithoutSourceTable() {
+    if (qb != null) {
+      return qb.containsQueryWithoutSourceTable();
+    } else {
+      return qbexpr1.containsQueryWithoutSourceTable() || qbexpr2.containsQueryWithoutSourceTable();
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/hive/blob/e75ede3a/ql/src/test/results/clientpositive/tez/explainuser_1.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/tez/explainuser_1.q.out b/ql/src/test/results/clientpositive/tez/explainuser_1.q.out
index d4b29c6..e06451d 100644
--- a/ql/src/test/results/clientpositive/tez/explainuser_1.q.out
+++ b/ql/src/test/results/clientpositive/tez/explainuser_1.q.out
@@ -5358,7 +5358,7 @@ PREHOOK: query: explain select explode(array('a', 'b'))
 PREHOOK: type: QUERY
 POSTHOOK: query: explain select explode(array('a', 'b'))
 POSTHOOK: type: QUERY
-Plan not optimized by CBO due to missing feature [Others].
+Plan not optimized by CBO.
 
 Stage-0
   Fetch Operator