diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java index 18de383e5f..bc6cb4f382 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/QB.java @@ -456,4 +456,22 @@ public boolean containsQueryWithoutSourceTable() { } return aliasToTabs.size()==0 && aliasToSubq.size()==0; } + + // returns false when the query block doesn't have + // a table defined, e.g. "select 5" + public boolean hasTableDefined() { + // A table is not defined when there only exists a dummy + // table in the alias, so if it is blank, we know a table + // is defined. + if (aliasToTabs.size() == 0) { + return true; + } + for (String alias : aliasToTabs.keySet()) { + if (!SemanticAnalyzer.DUMMY_TABLE.equals(alias)) { + return true; + } + } + return false; + } + } 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 674818670c..ebbcae9e2f 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 @@ -14123,6 +14123,10 @@ private void validateCreateView() } } + if (createVwDesc.isMaterialized() && !qb.hasTableDefined()) { + throw new SemanticException("Materialized view must have a table defined."); + } + if (createVwDesc.isMaterialized() && createVwDesc.isRewriteEnabled()) { if (!ctx.isCboSucceeded()) { String msg = "Cannot enable automatic rewriting for materialized view."; diff --git a/ql/src/test/results/clientnegative/materialized_view_no_tbl.q.out b/ql/src/test/results/clientnegative/materialized_view_no_tbl.q.out new file mode 100644 index 0000000000..8de568e47a --- /dev/null +++ b/ql/src/test/results/clientnegative/materialized_view_no_tbl.q.out @@ -0,0 +1 @@ +FAILED: SemanticException Materialized view must have a table defined.