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)