You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2013/10/30 23:27:49 UTC

svn commit: r1537333 - in /hive/trunk/ql/src: java/org/apache/hadoop/hive/ql/parse/ test/queries/clientnegative/ test/results/clientnegative/

Author: hashutosh
Date: Wed Oct 30 22:27:49 2013
New Revision: 1537333

URL: http://svn.apache.org/r1537333
Log:
HIVE-5613 : Subquery support: disallow nesting of SubQueries (Harish Butani via Ashutosh Chauhan)

Added:
    hive/trunk/ql/src/test/queries/clientnegative/subquery_nested_subquery.q
    hive/trunk/ql/src/test/results/clientnegative/subquery_nested_subquery.q.out
Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SubQueryUtils.java
    hive/trunk/ql/src/test/results/clientnegative/subquery_subquery_chain.q.out

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java?rev=1537333&r1=1537332&r2=1537333&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java Wed Oct 30 22:27:49 2013
@@ -65,6 +65,11 @@ public class QB {
    */
   private HashMap<String, WindowingSpec> destToWindowingSpec;
 
+  /*
+   * If this QB represents a SubQuery predicate then this will point to the SubQuery object.
+   */
+  private QBSubQuery subQueryPredicateDef;
+
   // results
 
   public void print(String msg) {
@@ -308,5 +313,12 @@ public class QB {
     return destToWindowingSpec;
   }
 
+  protected void setSubQueryDef(QBSubQuery subQueryPredicateDef) {
+    this.subQueryPredicateDef = subQueryPredicateDef;
+  }
+
+  protected QBSubQuery getSubQueryPredicateDef() {
+    return subQueryPredicateDef;
+  }
 
 }

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1537333&r1=1537332&r2=1537333&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java Wed Oct 30 22:27:49 2013
@@ -1792,7 +1792,15 @@ public class SemanticAnalyzer extends Ba
     ASTNode searchCond = (ASTNode) whereExpr.getChild(0);
     List<ASTNode> subQueriesInOriginalTree = SubQueryUtils.findSubQueries(searchCond);
 
-    if ( subQueriesInOriginalTree != null ) {
+    if ( subQueriesInOriginalTree.size() > 0 ) {
+
+      /*
+       * Restriction.9.m :: disallow nested SubQuery expressions.
+       */
+      if (qb.getSubQueryPredicateDef() != null  ) {
+        throw new SemanticException(ErrorMsg.UNSUPPORTED_SUBQUERY_EXPRESSION.getMsg(
+            subQueriesInOriginalTree.get(0), "Nested SubQuery expressions are not supported."));
+      }
 
       /*
        * Restriction.8.m :: We allow only 1 SubQuery expression per Query.
@@ -1822,6 +1830,7 @@ public class SemanticAnalyzer extends Ba
         subQuery.validateAndRewriteAST(inputRR);
 
         QB qbSQ = new QB(subQuery.getOuterQueryId(), subQuery.getAlias(), true);
+        qbSQ.setSubQueryDef(subQuery);
         Phase1Ctx ctx_1 = initPhase1Ctx();
         doPhase1(subQuery.getSubQueryAST(), qbSQ, ctx_1);
         getMetaData(qbSQ);

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SubQueryUtils.java
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SubQueryUtils.java?rev=1537333&r1=1537332&r2=1537333&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SubQueryUtils.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SubQueryUtils.java Wed Oct 30 22:27:49 2013
@@ -4,8 +4,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-import org.antlr.runtime.tree.TreeWizard;
-import org.antlr.runtime.tree.TreeWizard.ContextVisitor;
 import org.apache.hadoop.hive.ql.Context;
 import org.apache.hadoop.hive.ql.ErrorMsg;
 import org.apache.hadoop.hive.ql.exec.ColumnInfo;
@@ -173,31 +171,22 @@ public class SubQueryUtils {
 
   static List<ASTNode> findSubQueries(ASTNode node)
       throws SemanticException {
-    TreeWizard tw = new TreeWizard(ParseDriver.adaptor, HiveParser.tokenNames);
-    SubQueryVisitor visitor = new SubQueryVisitor();
-    tw.visit(node, HiveParser.TOK_SUBQUERY_EXPR, visitor);
-    return visitor.getSubQueries();
-  }
-
-  static class SubQueryVisitor implements ContextVisitor {
-    String errMsg;
-    boolean throwError = false;
-    ASTNode errorNode;
-    List<ASTNode> subQueries;
-
-    @SuppressWarnings("rawtypes")
-    @Override
-    public void visit(Object t, Object parent, int childIndex, Map labels) {
-      if (subQueries == null ) {
-        subQueries = new ArrayList<ASTNode>();
-      }
-      subQueries.add((ASTNode)t);
-    }
+    List<ASTNode> subQueries = new ArrayList<ASTNode>();
+    findSubQueries(node, subQueries);
+    return subQueries;
+  }
 
-    public List<ASTNode> getSubQueries() {
-      return subQueries;
+  private static void findSubQueries(ASTNode node, List<ASTNode> subQueries) {
+    switch(node.getType()) {
+    case HiveParser.TOK_SUBQUERY_EXPR:
+      subQueries.add(node);
+      break;
+    default:
+      int childCount = node.getChildCount();
+      for(int i=0; i < childCount; i++) {
+        findSubQueries((ASTNode) node.getChild(i), subQueries);
+      }
     }
-
   }
 
   static QBSubQuery buildSubQuery(String outerQueryId,
@@ -208,6 +197,16 @@ public class SubQueryUtils {
     ASTNode sqOp = (ASTNode) sqAST.getChild(0);
     ASTNode sq = (ASTNode) sqAST.getChild(1);
     ASTNode outerQueryExpr = (ASTNode) sqAST.getChild(2);
+
+    /*
+     * Restriction.8.m :: We allow only 1 SubQuery expression per Query.
+     */
+    if (outerQueryExpr != null && outerQueryExpr.getType() == HiveParser.TOK_SUBQUERY_EXPR ) {
+
+      throw new SemanticException(ErrorMsg.UNSUPPORTED_SUBQUERY_EXPRESSION.getMsg(
+          originalSQAST.getChild(1), "Only 1 SubQuery expression is supported."));
+    }
+
    return new QBSubQuery(outerQueryId, sqIdx, sq, outerQueryExpr,
        buildSQOperator(sqOp),
        originalSQAST,

Added: hive/trunk/ql/src/test/queries/clientnegative/subquery_nested_subquery.q
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/subquery_nested_subquery.q?rev=1537333&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/subquery_nested_subquery.q (added)
+++ hive/trunk/ql/src/test/queries/clientnegative/subquery_nested_subquery.q Wed Oct 30 22:27:49 2013
@@ -0,0 +1,18 @@
+
+
+CREATE TABLE part( 
+    p_partkey INT,
+    p_name STRING,
+    p_mfgr STRING,
+    p_brand STRING,
+    p_type STRING,
+    p_size INT,
+    p_container STRING,
+    p_retailprice DOUBLE,
+    p_comment STRING
+);
+
+select *
+from part x 
+where x.p_name in (select y.p_name from part y where exists (select z.p_name from part z where y.p_name = z.p_name))
+;
\ No newline at end of file

Added: hive/trunk/ql/src/test/results/clientnegative/subquery_nested_subquery.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/subquery_nested_subquery.q.out?rev=1537333&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/subquery_nested_subquery.q.out (added)
+++ hive/trunk/ql/src/test/results/clientnegative/subquery_nested_subquery.q.out Wed Oct 30 22:27:49 2013
@@ -0,0 +1,28 @@
+PREHOOK: query: CREATE TABLE part( 
+    p_partkey INT,
+    p_name STRING,
+    p_mfgr STRING,
+    p_brand STRING,
+    p_type STRING,
+    p_size INT,
+    p_container STRING,
+    p_retailprice DOUBLE,
+    p_comment STRING
+)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE part( 
+    p_partkey INT,
+    p_name STRING,
+    p_mfgr STRING,
+    p_brand STRING,
+    p_type STRING,
+    p_size INT,
+    p_container STRING,
+    p_retailprice DOUBLE,
+    p_comment STRING
+)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@part
+FAILED: SemanticException Line 5:53 Unsupported SubQuery Expression 'p_name' in definition of SubQuery sq_1 [
+x.p_name in (select y.p_name from part y where exists (select z.p_name from part z where y.p_name = z.p_name))
+] used as sq_1 at Line 5:15: Nested SubQuery expressions are not supported.

Modified: hive/trunk/ql/src/test/results/clientnegative/subquery_subquery_chain.q.out
URL: http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/subquery_subquery_chain.q.out?rev=1537333&r1=1537332&r2=1537333&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/subquery_subquery_chain.q.out (original)
+++ hive/trunk/ql/src/test/results/clientnegative/subquery_subquery_chain.q.out Wed Oct 30 22:27:49 2013
@@ -1 +1 @@
-FAILED: SemanticException [Error 10249]: Line 5:14 Unsupported SubQuery Expression 'key': Only 1 SubQuery expression is supported.
+FAILED: SemanticException [Error 10249]: Line 5:59 Unsupported SubQuery Expression 'key': Only 1 SubQuery expression is supported.