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 577d006..747f387 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 @@ -997,7 +997,7 @@ private String processSubQuery(QB qb, ASTNode subq) throws SemanticException { // Recursively do the first phase of semantic analysis for the subquery QBExpr qbexpr = new QBExpr(alias); - doPhase1QBExpr(subqref, qbexpr, qb.getId(), alias); + doPhase1QBExpr(subqref, qbexpr, qb.getId(), alias, qb.isInsideView()); // If the alias is already there then we have a conflict if (qb.exists(alias)) { 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 2d70a1b..fa01416 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 @@ -141,4 +141,35 @@ public void testViewInSubQuery() throws Exception { } + /** + * Verify that the the query with the subquery inside a view will have the correct + * direct and indirect inputs. + * @throws Exception + */ + @Test + public void testSubQueryInSubView() throws Exception { + String prefix = "tvsubqueryinsubview" + NAME_PREFIX; + final String tab1 = prefix + "t"; + final String view1 = prefix + "v"; + final String view2 = prefix + "v2"; + + int ret = driver.run("create table " + tab1 + "(id int)").getResponseCode(); + assertEquals("Checking command success", 0, ret); + ret = driver.run("create view " + view1 + " as select * from " + tab1).getResponseCode(); + assertEquals("Checking command success", 0, ret); + + ret = driver.run("create view " + view2 + " as select * from (select * from " + view1 + ") x").getResponseCode(); + assertEquals("Checking command success", 0, ret); + + driver.compile("select * from " + view2); + // view entity + assertEquals("default@" + view2, CheckInputReadEntity.readEntities[0].getName()); + + // table1 and view1 as second read entity + assertEquals("default@" + view1, CheckInputReadEntity.readEntities[1].getName()); + assertFalse("Table is not direct input", CheckInputReadEntity.readEntities[1].isDirect()); + assertEquals("default@" + tab1, CheckInputReadEntity.readEntities[2].getName()); + assertFalse("Table is not direct input", CheckInputReadEntity.readEntities[2].isDirect()); + + } } diff --git a/ql/src/test/results/clientpositive/cbo_union_view.q.out b/ql/src/test/results/clientpositive/cbo_union_view.q.out index ed6bba9..d179c28 100644 --- a/ql/src/test/results/clientpositive/cbo_union_view.q.out +++ b/ql/src/test/results/clientpositive/cbo_union_view.q.out @@ -64,6 +64,8 @@ STAGE PLANS: Map Operator Tree: TableScan alias: src_union_1 + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (key = 86) (type: boolean) @@ -87,6 +89,8 @@ STAGE PLANS: serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe TableScan alias: src_union_2 + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (key = 86) (type: boolean) @@ -110,6 +114,8 @@ STAGE PLANS: serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe TableScan alias: src_union_3 + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (key = 86) (type: boolean) @@ -152,6 +158,8 @@ STAGE PLANS: Map Operator Tree: TableScan alias: src_union_1 + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: ((key = 86) and (ds = '1')) (type: boolean) @@ -175,6 +183,8 @@ STAGE PLANS: serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe TableScan alias: src_union_2 + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: ((key = 86) and (ds = '1')) (type: boolean) @@ -198,6 +208,8 @@ STAGE PLANS: serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe TableScan alias: src_union_3 + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: ((key = 86) and (ds = '1')) (type: boolean) diff --git a/ql/src/test/results/clientpositive/ppd_union_view.q.out b/ql/src/test/results/clientpositive/ppd_union_view.q.out index aa123d3..69234a1 100644 --- a/ql/src/test/results/clientpositive/ppd_union_view.q.out +++ b/ql/src/test/results/clientpositive/ppd_union_view.q.out @@ -149,6 +149,8 @@ STAGE PLANS: Map Operator Tree: TableScan alias: t1_old + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 14 Basic stats: COMPLETE Column stats: NONE GatherStats: false Filter Operator @@ -170,6 +172,8 @@ STAGE PLANS: auto parallelism: false TableScan alias: t1_mapping + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 12 Basic stats: COMPLETE Column stats: NONE GatherStats: false Filter Operator @@ -322,6 +326,8 @@ STAGE PLANS: Map Operator Tree: TableScan alias: t1_new + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE GatherStats: false Filter Operator @@ -477,6 +483,8 @@ STAGE PLANS: Map Operator Tree: TableScan alias: t1_old + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE GatherStats: false Filter Operator @@ -498,6 +506,8 @@ STAGE PLANS: auto parallelism: false TableScan alias: t1_mapping + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE GatherStats: false Filter Operator @@ -554,6 +564,8 @@ STAGE PLANS: Map Operator Tree: TableScan alias: t1_new + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 11 Basic stats: COMPLETE Column stats: NONE GatherStats: false Select Operator diff --git a/ql/src/test/results/clientpositive/union_view.q.out b/ql/src/test/results/clientpositive/union_view.q.out index 985ef9d..29f6758 100644 --- a/ql/src/test/results/clientpositive/union_view.q.out +++ b/ql/src/test/results/clientpositive/union_view.q.out @@ -181,6 +181,8 @@ STAGE PLANS: TableScan alias: src_union_1 filterExpr: ((key = 86) and (ds = '1')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: (key = 86) (type: boolean) @@ -205,6 +207,8 @@ STAGE PLANS: TableScan alias: src_union_2 filterExpr: ((key = 86) and (ds = '1')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: ((key = 86) and (ds = '1')) (type: boolean) @@ -229,6 +233,8 @@ STAGE PLANS: TableScan alias: src_union_3 filterExpr: ((key = 86) and (ds = '1')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: ((key = 86) and (ds = '1')) (type: boolean) @@ -294,6 +300,8 @@ STAGE PLANS: TableScan alias: src_union_1 filterExpr: ((key = 86) and (ds = '2')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: ((key = 86) and (ds = '2')) (type: boolean) @@ -318,6 +326,8 @@ STAGE PLANS: TableScan alias: src_union_2 filterExpr: ((key = 86) and (ds = '2')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: (key = 86) (type: boolean) @@ -342,6 +352,8 @@ STAGE PLANS: TableScan alias: src_union_3 filterExpr: ((key = 86) and (ds = '2')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: ((key = 86) and (ds = '2')) (type: boolean) @@ -407,6 +419,8 @@ STAGE PLANS: TableScan alias: src_union_1 filterExpr: ((key = 86) and (ds = '3')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: ((key = 86) and (ds = '3')) (type: boolean) @@ -431,6 +445,8 @@ STAGE PLANS: TableScan alias: src_union_2 filterExpr: ((key = 86) and (ds = '3')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: ((key = 86) and (ds = '3')) (type: boolean) @@ -455,6 +471,8 @@ STAGE PLANS: TableScan alias: src_union_3 filterExpr: ((key = 86) and (ds = '3')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: (key = 86) (type: boolean) @@ -524,6 +542,8 @@ STAGE PLANS: TableScan alias: src_union_1 filterExpr: ((key = 86) and ds 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 = 86) (type: boolean) @@ -548,6 +568,8 @@ STAGE PLANS: TableScan alias: src_union_2 filterExpr: ((key = 86) and ds is not null) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: (key = 86) (type: boolean) @@ -572,6 +594,8 @@ STAGE PLANS: TableScan alias: src_union_3 filterExpr: ((key = 86) and ds is not null) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: (key = 86) (type: boolean) @@ -693,6 +717,8 @@ STAGE PLANS: TableScan alias: src_union_1 filterExpr: (ds = '1') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: NONE Select Operator Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: NONE @@ -712,6 +738,8 @@ STAGE PLANS: TableScan alias: src_union_2 filterExpr: (ds = '1') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (ds = '1') (type: boolean) @@ -734,6 +762,8 @@ STAGE PLANS: TableScan alias: src_union_3 filterExpr: (ds = '1') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (ds = '1') (type: boolean) @@ -808,6 +838,8 @@ STAGE PLANS: TableScan alias: src_union_1 filterExpr: (ds = '2') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (ds = '2') (type: boolean) @@ -830,6 +862,8 @@ STAGE PLANS: TableScan alias: src_union_2 filterExpr: (ds = '2') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Select Operator Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE @@ -849,6 +883,8 @@ STAGE PLANS: TableScan alias: src_union_3 filterExpr: (ds = '2') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (ds = '2') (type: boolean) @@ -923,6 +959,8 @@ STAGE PLANS: TableScan alias: src_union_1 filterExpr: (ds = '3') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (ds = '3') (type: boolean) @@ -945,6 +983,8 @@ STAGE PLANS: TableScan alias: src_union_2 filterExpr: (ds = '3') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (ds = '3') (type: boolean) @@ -967,6 +1007,8 @@ STAGE PLANS: TableScan alias: src_union_3 filterExpr: (ds = '3') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE Select Operator Statistics: Num rows: 1000 Data size: 10624 Basic stats: COMPLETE Column stats: NONE @@ -1043,6 +1085,8 @@ STAGE PLANS: TableScan alias: src_union_1 filterExpr: ((key = 86) and (ds = '4')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: ((key = 86) and (ds = '4')) (type: boolean) @@ -1067,6 +1111,8 @@ STAGE PLANS: TableScan alias: src_union_2 filterExpr: ((key = 86) and (ds = '4')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: ((key = 86) and (ds = '4')) (type: boolean) @@ -1091,6 +1137,8 @@ STAGE PLANS: TableScan alias: src_union_3 filterExpr: ((key = 86) and (ds = '4')) (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: (key = 86) (type: boolean) @@ -1155,6 +1203,8 @@ STAGE PLANS: TableScan alias: src_union_1 filterExpr: (ds = '4') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (ds = '4') (type: boolean) @@ -1177,6 +1227,8 @@ STAGE PLANS: TableScan alias: src_union_2 filterExpr: (ds = '4') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: NONE Filter Operator predicate: (ds = '4') (type: boolean) @@ -1199,6 +1251,8 @@ STAGE PLANS: TableScan alias: src_union_3 filterExpr: (ds = '4') (type: boolean) + properties: + insideView TRUE Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: NONE Select Operator Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: NONE