Repository: hive Updated Branches: refs/heads/master da376eba4 -> f284b6d04
HIVE-14805: Subquery inside a view will have the object in the subquery as the direct input (Aihua Xu, reviewed by Yongzhi Chen) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/f284b6d0 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/f284b6d0 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/f284b6d0 Branch: refs/heads/master Commit: f284b6d04aea51bce4e438f31a7b5ed8597df8fd Parents: da376eb Author: Aihua Xu <aihu...@apache.org> Authored: Wed Sep 21 13:59:14 2016 -0400 Committer: Aihua Xu <aihu...@apache.org> Committed: Fri Sep 23 09:07:15 2016 -0400 ---------------------------------------------------------------------- .../hadoop/hive/ql/parse/SemanticAnalyzer.java | 2 +- .../hadoop/hive/ql/plan/TestViewEntity.java | 31 +++++++++++ .../results/clientpositive/cbo_union_view.q.out | 12 +++++ .../results/clientpositive/ppd_union_view.q.out | 12 +++++ .../results/clientpositive/union_view.q.out | 54 ++++++++++++++++++++ 5 files changed, 110 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/f284b6d0/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 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 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { // 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)) { http://git-wip-us.apache.org/repos/asf/hive/blob/f284b6d0/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 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 class TestViewEntity { } + /** + * 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()); + + } } http://git-wip-us.apache.org/repos/asf/hive/blob/f284b6d0/ql/src/test/results/clientpositive/cbo_union_view.q.out ---------------------------------------------------------------------- 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) http://git-wip-us.apache.org/repos/asf/hive/blob/f284b6d0/ql/src/test/results/clientpositive/ppd_union_view.q.out ---------------------------------------------------------------------- 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 http://git-wip-us.apache.org/repos/asf/hive/blob/f284b6d0/ql/src/test/results/clientpositive/union_view.q.out ---------------------------------------------------------------------- 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