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.