Skip to content

Commit 651fc44

Browse files
HIVE-28280: SemanticException when querying VIEW with DISTINCT clause
1 parent f75c18b commit 651fc44

File tree

3 files changed

+62
-8
lines changed

3 files changed

+62
-8
lines changed

ql/src/java/org/apache/hadoop/hive/ql/parse/CalcitePlanner.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.google.common.collect.Multimap;
2929

3030
import java.util.Map.Entry;
31+
import java.util.Objects;
3132
import java.util.Optional;
3233
import java.util.function.Function;
3334
import java.util.regex.Pattern;
@@ -79,6 +80,7 @@
7980
import org.apache.calcite.rel.RelFieldCollation;
8081
import org.apache.calcite.rel.RelNode;
8182
import org.apache.calcite.rel.RelVisitor;
83+
import org.apache.calcite.rel.SingleRel;
8284
import org.apache.calcite.rel.convert.ConverterImpl;
8385
import org.apache.calcite.rel.core.Aggregate;
8486
import org.apache.calcite.rel.core.AggregateCall;
@@ -4918,15 +4920,16 @@ private RelNode genLogicalPlan(QB qb, boolean outerMostQB,
49184920

49194921
aliasToRel.put(subqAlias, relNode);
49204922
if (qb.getViewToTabSchema().containsKey(subqAlias)) {
4921-
if (relNode instanceof HiveProject) {
4922-
if (this.viewProjectToTableSchema == null) {
4923-
this.viewProjectToTableSchema = new LinkedHashMap<>();
4924-
}
4925-
viewProjectToTableSchema.put((HiveProject) relNode, qb.getViewToTabSchema().get(subqAlias));
4926-
} else {
4927-
throw new SemanticException("View " + subqAlias + " is corresponding to "
4928-
+ relNode.toString() + ", rather than a HiveProject.");
4923+
HiveProject project = switch (Objects.requireNonNull(relNode)) {
4924+
case HiveProject hiveProject -> hiveProject;
4925+
case SingleRel singleRel when singleRel.getInput() instanceof HiveProject hiveProject -> hiveProject;
4926+
default -> throw new SemanticException("View " + subqAlias + " is corresponding to "
4927+
+ relNode + ", rather than a HiveProject or a SingleRel with HiveProject as its child.");
4928+
};
4929+
if (this.viewProjectToTableSchema == null) {
4930+
this.viewProjectToTableSchema = new LinkedHashMap<>();
49294931
}
4932+
viewProjectToTableSchema.put(project, qb.getViewToTabSchema().get(subqAlias));
49304933
}
49314934
}
49324935

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
set hive.security.authorization.enabled=true;
2+
create table t1 (username string);
3+
4+
create view vw_t1 as select distinct username from t1 limit 5;
5+
explain cbo select * from vw_t1;
6+
select * from vw_t1;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
PREHOOK: query: create table t1 (username string)
2+
PREHOOK: type: CREATETABLE
3+
PREHOOK: Output: database:default
4+
PREHOOK: Output: default@t1
5+
POSTHOOK: query: create table t1 (username string)
6+
POSTHOOK: type: CREATETABLE
7+
POSTHOOK: Output: database:default
8+
POSTHOOK: Output: default@t1
9+
PREHOOK: query: create view vw_t1 as select distinct username from t1 limit 5
10+
PREHOOK: type: CREATEVIEW
11+
PREHOOK: Input: default@t1
12+
PREHOOK: Output: database:default
13+
PREHOOK: Output: default@vw_t1
14+
POSTHOOK: query: create view vw_t1 as select distinct username from t1 limit 5
15+
POSTHOOK: type: CREATEVIEW
16+
POSTHOOK: Input: default@t1
17+
POSTHOOK: Output: database:default
18+
POSTHOOK: Output: default@vw_t1
19+
POSTHOOK: Lineage: vw_t1.username SIMPLE [(t1)t1.FieldSchema(name:username, type:string, comment:null), ]
20+
PREHOOK: query: explain cbo select * from vw_t1
21+
PREHOOK: type: QUERY
22+
PREHOOK: Input: default@t1
23+
PREHOOK: Input: default@vw_t1
24+
PREHOOK: Output: hdfs://### HDFS PATH ###
25+
POSTHOOK: query: explain cbo select * from vw_t1
26+
POSTHOOK: type: QUERY
27+
POSTHOOK: Input: default@t1
28+
POSTHOOK: Input: default@vw_t1
29+
POSTHOOK: Output: hdfs://### HDFS PATH ###
30+
CBO PLAN:
31+
HiveSortLimit(fetch=[5])
32+
HiveProject(username=[$0])
33+
HiveAggregate(group=[{0}])
34+
HiveTableScan(table=[[default, t1]], table:alias=[t1])
35+
36+
PREHOOK: query: select * from vw_t1
37+
PREHOOK: type: QUERY
38+
PREHOOK: Input: default@t1
39+
PREHOOK: Input: default@vw_t1
40+
PREHOOK: Output: hdfs://### HDFS PATH ###
41+
POSTHOOK: query: select * from vw_t1
42+
POSTHOOK: type: QUERY
43+
POSTHOOK: Input: default@t1
44+
POSTHOOK: Input: default@vw_t1
45+
POSTHOOK: Output: hdfs://### HDFS PATH ###

0 commit comments

Comments
 (0)