You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by pv...@apache.org on 2018/11/21 09:39:48 UTC
hive git commit: HIVE-20818: Views created with a WHERE subquery will
regard views referenced in the subquery as direct input (Karen Coppage via
Peter Vary)
Repository: hive
Updated Branches:
refs/heads/master 0d0721fa4 -> 59d85d792
HIVE-20818: Views created with a WHERE subquery will regard views referenced in the subquery as direct input (Karen Coppage via Peter Vary)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/59d85d79
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/59d85d79
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/59d85d79
Branch: refs/heads/master
Commit: 59d85d7927fd7831aafe5f1c0b965d3fc1178224
Parents: 0d0721f
Author: Karen Coppage <ka...@cloudera.com>
Authored: Wed Nov 21 10:38:58 2018 +0100
Committer: Peter Vary <pv...@cloudera.com>
Committed: Wed Nov 21 10:38:58 2018 +0100
----------------------------------------------------------------------
.../hadoop/hive/ql/parse/CalcitePlanner.java | 1 +
.../hadoop/hive/ql/parse/SemanticAnalyzer.java | 1 +
.../hadoop/hive/ql/plan/TestViewEntity.java | 85 ++++++++++++++++++++
.../clientpositive/llap/explainuser_1.q.out | 2 +-
.../results/clientpositive/masking_12.q.out | 2 +
.../spark/spark_explainuser_1.q.out | 2 +-
.../clientpositive/spark/subquery_views.q.out | 4 +
7 files changed, 95 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hive/blob/59d85d79/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 b3c6806..aef1d4a 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
@@ -3322,6 +3322,7 @@ public class CalcitePlanner extends SemanticAnalyzer {
}
String sbQueryAlias = "sq_" + qb.incrNumSubQueryPredicates();
QB qbSQ = new QB(qb.getId(), sbQueryAlias, true);
+ qbSQ.setInsideView(qb.isInsideView());
Phase1Ctx ctx1 = initPhase1Ctx();
doPhase1((ASTNode) next.getChild(1), qbSQ, ctx1, null);
getMetaData(qbSQ);
http://git-wip-us.apache.org/repos/asf/hive/blob/59d85d79/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
index 1a2777b..04e9552 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
@@ -3381,6 +3381,7 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer {
subQuery.validateAndRewriteAST(inputRR, forHavingClause, havingInputAlias, aliasToOpInfo.keySet());
QB qbSQ = new QB(subQuery.getOuterQueryId(), subQuery.getAlias(), true);
+ qbSQ.setInsideView(qb.isInsideView());
Operator sqPlanTopOp = genPlanForSubQueryPredicate(qbSQ, subQuery);
aliasToOpInfo.put(subQuery.getAlias(), sqPlanTopOp);
RowResolver sqRR = opParseCtx.get(sqPlanTopOp).getRowResolver();
http://git-wip-us.apache.org/repos/asf/hive/blob/59d85d79/ql/src/test/org/apache/hadoop/hive/ql/plan/TestViewEntity.java
----------------------------------------------------------------------
diff --git a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestViewEntity.java b/ql/src/test/org/apache/hadoop/hive/ql/plan/TestViewEntity.java
index 6ad38b8..6d86ca2 100644
--- a/ql/src/test/org/apache/hadoop/hive/ql/plan/TestViewEntity.java
+++ b/ql/src/test/org/apache/hadoop/hive/ql/plan/TestViewEntity.java
@@ -138,6 +138,91 @@ public class TestViewEntity {
}
+
+ /**
+ * Verify that the parent entities are captured correctly for view in subquery with WHERE
+ * subquery referencing a view. Optimizer: Cost-based
+ * @throws Exception
+ */
+ @Test
+ public void testViewInSubQueryWithWhereClauseCbo() throws Exception {
+ driver.getConf().setBoolVar(HiveConf.ConfVars.HIVE_CBO_ENABLED, true);
+ testViewInSubQueryWithWhereClause();
+ }
+
+ /**
+ * Verify that the parent entities are captured correctly for view in subquery with WHERE
+ * subquery referencing a view. Optimizer: Rule-based
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testViewInSubQueryWithWhereClauseRbo() throws Exception {
+ driver.getConf().setBoolVar(HiveConf.ConfVars.HIVE_CBO_ENABLED, false);
+ testViewInSubQueryWithWhereClause();
+ }
+
+ private void testViewInSubQueryWithWhereClause() {
+ String prefix = "tvsubquerywithwhereclause" + NAME_PREFIX;
+ final String tab1 = prefix + "t";
+ final String view1 = prefix + "v";
+ final String view2 = prefix + "v2";
+ final String tab1row1 = "'x','y','z'";
+ final String tab1row2 = "'a','b','c'";
+
+ //drop all if exists
+ int ret = driver.run("drop table if exists " + tab1).getResponseCode();
+ assertEquals("Checking command success", 0, ret);
+ ret = driver.run("drop view if exists " + view1).getResponseCode();
+ assertEquals("Checking command success", 0, ret);
+ ret = driver.run("drop view if exists " + view2).getResponseCode();
+ assertEquals("Checking command success", 0, ret);
+
+ //create tab1
+ ret = driver.run("create table " + tab1 + "(col1 string, col2 string, col3 string)")
+ .getResponseCode();
+ assertEquals("Checking command success", 0, ret);
+ ret = driver.run("insert into " + tab1 + " values (" + tab1row1 + ")").getResponseCode();
+ assertEquals("Checking command success", 0, ret);
+
+ //create view1
+ ret = driver.run("create view " + view1 + " as select " +
+ tab1 + ".col1, " + tab1 + ".col2, " + tab1 + ".col3 " +
+ " from " + tab1).getResponseCode();
+ assertEquals("Checking command success", 0, ret);
+
+ ret = driver.run("insert into " + tab1 + " values (" + tab1row2 + ")").getResponseCode();
+ assertEquals("Checking command success", 0, ret);
+
+ //create view2
+ ret = driver.run(
+ "create view " + view2 + " as select " +
+ tab1 + ".col1, " + tab1 + ".col2, " + tab1 + ".col3 " +
+ " from " + tab1 +
+ " where " + tab1 + ".col1 NOT IN (" +
+ "SELECT " + view1 + ".col1 FROM " + view1 + ")").getResponseCode();
+ assertEquals("Checking command success", 0, ret);
+
+ //select from view2
+ driver.compile("select * from " + view2);
+
+ //verify that only view2 is direct input in above query
+ ReadEntity[] readEntities = CheckInputReadEntity.readEntities;
+ for (ReadEntity readEntity : readEntities) {
+ String name = readEntity.getName();
+ if (name.equals("default@" + tab1)) {
+ assertFalse("Table should not be direct input", readEntity.isDirect());
+ } else if (name.equals("default@" + view1)) {
+ assertFalse("View1 should not be direct input", readEntity.isDirect());
+ } else if (name.equals("default@" + view2)) {
+ assertTrue("View2 should be direct input", readEntity.isDirect());
+ } else {
+ fail("Unrecognized ReadEntity input");
+ }
+ }
+ }
+
+
/**
* Verify that the the query with the subquery inside a view will have the correct
* direct and indirect inputs.
http://git-wip-us.apache.org/repos/asf/hive/blob/59d85d79/ql/src/test/results/clientpositive/llap/explainuser_1.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/explainuser_1.q.out b/ql/src/test/results/clientpositive/llap/explainuser_1.q.out
index c86450a..6882963 100644
--- a/ql/src/test/results/clientpositive/llap/explainuser_1.q.out
+++ b/ql/src/test/results/clientpositive/llap/explainuser_1.q.out
@@ -2180,7 +2180,7 @@ Stage-0
Filter Operator [FIL_16] (rows=166 width=178)
predicate:((value > 'val_9') and key is not null)
TableScan [TS_3] (rows=500 width=178)
- default@src_cbo,a,Tbl:COMPLETE,Col:COMPLETE,Output:["key","value"]
+ default@src_cbo,a,Tbl:COMPLETE,Col:COMPLETE,Output:["key","value"],properties:{"insideView":"TRUE"}
PREHOOK: query: explain select *
from (select *
http://git-wip-us.apache.org/repos/asf/hive/blob/59d85d79/ql/src/test/results/clientpositive/masking_12.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/masking_12.q.out b/ql/src/test/results/clientpositive/masking_12.q.out
index 9ecd981..4beb206 100644
--- a/ql/src/test/results/clientpositive/masking_12.q.out
+++ b/ql/src/test/results/clientpositive/masking_12.q.out
@@ -179,6 +179,8 @@ STAGE PLANS:
TableScan
alias: src
filterExpr: key is not null (type: boolean)
+ properties:
+ insideView TRUE
Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: NONE
Filter Operator
predicate: key is not null (type: boolean)
http://git-wip-us.apache.org/repos/asf/hive/blob/59d85d79/ql/src/test/results/clientpositive/spark/spark_explainuser_1.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/spark/spark_explainuser_1.q.out b/ql/src/test/results/clientpositive/spark/spark_explainuser_1.q.out
index 1f68194..3e395a8 100644
--- a/ql/src/test/results/clientpositive/spark/spark_explainuser_1.q.out
+++ b/ql/src/test/results/clientpositive/spark/spark_explainuser_1.q.out
@@ -2139,7 +2139,7 @@ Stage-0
Filter Operator [FIL_14] (rows=166 width=178)
predicate:((value > 'val_9') and key is not null)
TableScan [TS_3] (rows=500 width=178)
- default@src_cbo,a,Tbl:COMPLETE,Col:COMPLETE,Output:["key","value"]
+ default@src_cbo,a,Tbl:COMPLETE,Col:COMPLETE,Output:["key","value"],properties:{"insideView":"TRUE"}
PREHOOK: query: explain select *
from (select *
http://git-wip-us.apache.org/repos/asf/hive/blob/59d85d79/ql/src/test/results/clientpositive/spark/subquery_views.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/spark/subquery_views.q.out b/ql/src/test/results/clientpositive/spark/subquery_views.q.out
index c221392..30bcf4b 100644
--- a/ql/src/test/results/clientpositive/spark/subquery_views.q.out
+++ b/ql/src/test/results/clientpositive/spark/subquery_views.q.out
@@ -167,6 +167,8 @@ STAGE PLANS:
TableScan
alias: a
filterExpr: ((value > 'val_11') and (key < '11')) (type: boolean)
+ properties:
+ insideView TRUE
Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: NONE
Filter Operator
predicate: ((key < '11') and (value > 'val_11')) (type: boolean)
@@ -189,6 +191,8 @@ STAGE PLANS:
TableScan
alias: a
filterExpr: ((value > 'val_11') and (key < '11')) (type: boolean)
+ properties:
+ insideView TRUE
Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: NONE
Filter Operator
predicate: ((key < '11') and (value > 'val_11')) (type: boolean)