diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java index 45610e37ab..2073049d65 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/Hive.java @@ -37,6 +37,7 @@ import java.io.IOException; import java.io.PrintStream; import java.nio.ByteBuffer; +import java.sql.SQLIntegrityConstraintViolationException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -73,6 +74,7 @@ import org.apache.calcite.rel.core.TableScan; import org.apache.calcite.rex.RexBuilder; import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileChecksum; import org.apache.hadoop.fs.FileStatus; @@ -1044,6 +1046,13 @@ public void dropTable(String dbName, String tableName, boolean deleteData, if (!ignoreUnknownTab) { throw new HiveException(e); } + } catch (MetaException e) { + int idx = ExceptionUtils.indexOfType(e, SQLIntegrityConstraintViolationException.class); + if (idx != -1 && ExceptionUtils.getThrowables(e)[idx].getMessage().contains("MV_TABLES_USED")) { + throw new HiveException("Cannot drop table since it is used by at least one materialized view definition. " + + "Please drop any materialized view that uses the table before dropping it", e); + } + throw new HiveException(e); } catch (Exception e) { throw new HiveException(e); } diff --git a/ql/src/test/queries/clientnegative/drop_table_mv.q b/ql/src/test/queries/clientnegative/drop_table_mv.q new file mode 100644 index 0000000000..7ac5d5c58a --- /dev/null +++ b/ql/src/test/queries/clientnegative/drop_table_mv.q @@ -0,0 +1,8 @@ +create table dt_basetable (a int, b varchar(256), c decimal(10,2)); + +insert into dt_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8); + +create materialized view dt_mat_view disable rewrite as select a, b, c from dt_basetable; + +drop table dt_basetable; + diff --git a/ql/src/test/results/clientnegative/drop_table_mv.q.out b/ql/src/test/results/clientnegative/drop_table_mv.q.out new file mode 100644 index 0000000000..e6ac7f4e24 --- /dev/null +++ b/ql/src/test/results/clientnegative/drop_table_mv.q.out @@ -0,0 +1,34 @@ +PREHOOK: query: create table dt_basetable (a int, b varchar(256), c decimal(10,2)) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@dt_basetable +POSTHOOK: query: create table dt_basetable (a int, b varchar(256), c decimal(10,2)) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@dt_basetable +PREHOOK: query: insert into dt_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8) +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@dt_basetable +POSTHOOK: query: insert into dt_basetable values (1, 'alfred', 10.30),(2, 'bob', 3.14),(2, 'bonnie', 172342.2),(3, 'calvin', 978.76),(3, 'charlie', 9.8) +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@dt_basetable +POSTHOOK: Lineage: dt_basetable.a SCRIPT [] +POSTHOOK: Lineage: dt_basetable.b SCRIPT [] +POSTHOOK: Lineage: dt_basetable.c SCRIPT [] +PREHOOK: query: create materialized view dt_mat_view disable rewrite as select a, b, c from dt_basetable +PREHOOK: type: CREATE_MATERIALIZED_VIEW +PREHOOK: Input: default@dt_basetable +PREHOOK: Output: database:default +PREHOOK: Output: default@dt_mat_view +POSTHOOK: query: create materialized view dt_mat_view disable rewrite as select a, b, c from dt_basetable +POSTHOOK: type: CREATE_MATERIALIZED_VIEW +POSTHOOK: Input: default@dt_basetable +POSTHOOK: Output: database:default +POSTHOOK: Output: default@dt_mat_view +PREHOOK: query: drop table dt_basetable +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@dt_basetable +PREHOOK: Output: default@dt_basetable +FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Cannot drop table since it is used by at least one materialized view definition. Please drop any materialized view that uses the table before dropping it