diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties index 1502d80..327ea95 100644 --- a/itests/src/test/resources/testconfiguration.properties +++ b/itests/src/test/resources/testconfiguration.properties @@ -304,6 +304,7 @@ minitez.query.files=bucket_map_join_tez1.q,\ tez_schema_evolution.q,\ tez_union.q,\ tez_union2.q,\ + tez_union_view.q,\ tez_union_decimal.q,\ tez_union_group_by.q,\ tez_smb_main.q,\ diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java index 44ab1bd..6374ec1 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/physical/Vectorizer.java @@ -364,6 +364,17 @@ private boolean validateMapWork(MapWork mapWork, boolean isTez) throws SemanticE addMapWorkRules(opRules, vnp); Dispatcher disp = new DefaultRuleDispatcher(vnp, opRules, null); GraphWalker ogw = new DefaultGraphWalker(disp); + if ((mapWork.getAliasToWork() == null) || (mapWork.getAliasToWork().size() == 0)) { + return false; + } else { + for (Operator op : mapWork.getAliasToWork().values()) { + if (op == null) { + LOG.warn("Map work has invalid aliases to work with. Fail validation!"); + return false; + } + } + } + // iterator the mapper operator tree ArrayList topNodes = new ArrayList(); topNodes.addAll(mapWork.getAliasToWork().values()); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/MapWork.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/MapWork.java index 05a5841..07e5991 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/MapWork.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/MapWork.java @@ -335,7 +335,7 @@ public void replaceRoots(Map, Operator> replacementMap) { Set> opSet = new LinkedHashSet>(); Map> pa = getPathToAliases(); - if (pa != null) { + if ((pa != null) && (pa.isEmpty() == false)) { for (List ls : pa.values()) { for (String a : ls) { Operator op = getAliasToWork().get(a); @@ -344,6 +344,10 @@ public void replaceRoots(Map, Operator> replacementMap) { } } } + } else { + for (Operator op : getAliasToWork().values()) { + opSet.add(op); + } } return opSet; } diff --git a/ql/src/test/queries/clientpositive/tez_union.q b/ql/src/test/queries/clientpositive/tez_union.q index f51559f..96f58b2 100644 --- a/ql/src/test/queries/clientpositive/tez_union.q +++ b/ql/src/test/queries/clientpositive/tez_union.q @@ -92,3 +92,21 @@ right outer join src s on u.key = s.key; select * from ut order by ukey, skey limit 20; drop table ut; + +set hive.vectorized.execution.enabled=true; + +create table TABLE1(EMP_NAME STRING, EMP_ID INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; + +create table table2 (EMP_NAME STRING) PARTITIONED BY (EMP_ID INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; + +CREATE OR REPLACE VIEW TABLE3 as select EMP_NAME, EMP_ID from TABLE1; + +explain formatted select count(*) from TABLE3; + +drop table table2; + +create table table2 (EMP_NAME STRING) PARTITIONED BY (EMP_ID INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; + +CREATE OR REPLACE VIEW TABLE3 as select EMP_NAME, EMP_ID from TABLE1 UNION ALL select EMP_NAME,EMP_ID from TABLE2; + +explain formatted select count(*) from TABLE3; diff --git a/ql/src/test/results/clientpositive/tez/tez_union.q.out b/ql/src/test/results/clientpositive/tez/tez_union.q.out index 2472c5e..6f6e8ca 100644 --- a/ql/src/test/results/clientpositive/tez/tez_union.q.out +++ b/ql/src/test/results/clientpositive/tez/tez_union.q.out @@ -1253,3 +1253,68 @@ POSTHOOK: query: drop table ut POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@ut POSTHOOK: Output: default@ut +PREHOOK: query: create table TABLE1(EMP_NAME STRING, EMP_ID INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@TABLE1 +POSTHOOK: query: create table TABLE1(EMP_NAME STRING, EMP_ID INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@TABLE1 +PREHOOK: query: create table table2 (EMP_NAME STRING) PARTITIONED BY (EMP_ID INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@table2 +POSTHOOK: query: create table table2 (EMP_NAME STRING) PARTITIONED BY (EMP_ID INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@table2 +PREHOOK: query: CREATE OR REPLACE VIEW TABLE3 as select EMP_NAME, EMP_ID from TABLE1 +PREHOOK: type: CREATEVIEW +PREHOOK: Input: default@table1 +PREHOOK: Output: database:default +PREHOOK: Output: default@TABLE3 +POSTHOOK: query: CREATE OR REPLACE VIEW TABLE3 as select EMP_NAME, EMP_ID from TABLE1 +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: default@table1 +POSTHOOK: Output: database:default +POSTHOOK: Output: default@TABLE3 +PREHOOK: query: explain formatted select count(*) from TABLE3 +PREHOOK: type: QUERY +POSTHOOK: query: explain formatted select count(*) from TABLE3 +POSTHOOK: type: QUERY +#### A masked pattern was here #### +PREHOOK: query: drop table table2 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@table2 +PREHOOK: Output: default@table2 +POSTHOOK: query: drop table table2 +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@table2 +POSTHOOK: Output: default@table2 +PREHOOK: query: create table table2 (EMP_NAME STRING) PARTITIONED BY (EMP_ID INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@table2 +POSTHOOK: query: create table table2 (EMP_NAME STRING) PARTITIONED BY (EMP_ID INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@table2 +PREHOOK: query: CREATE OR REPLACE VIEW TABLE3 as select EMP_NAME, EMP_ID from TABLE1 UNION ALL select EMP_NAME,EMP_ID from TABLE2 +PREHOOK: type: CREATEVIEW +PREHOOK: Input: default@table1 +PREHOOK: Input: default@table2 +PREHOOK: Output: database:default +PREHOOK: Output: default@TABLE3 +POSTHOOK: query: CREATE OR REPLACE VIEW TABLE3 as select EMP_NAME, EMP_ID from TABLE1 UNION ALL select EMP_NAME,EMP_ID from TABLE2 +POSTHOOK: type: CREATEVIEW +POSTHOOK: Input: default@table1 +POSTHOOK: Input: default@table2 +POSTHOOK: Output: database:default +POSTHOOK: Output: default@TABLE3 +POSTHOOK: Output: default@table3 +PREHOOK: query: explain formatted select count(*) from TABLE3 +PREHOOK: type: QUERY +POSTHOOK: query: explain formatted select count(*) from TABLE3 +POSTHOOK: type: QUERY +#### A masked pattern was here ####