diff --git a/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java b/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java index 26c4937a28..5759038471 100644 --- a/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java +++ b/itests/hcatalog-unit/src/test/java/org/apache/hive/hcatalog/listener/DummyRawStoreFailEvent.java @@ -269,6 +269,11 @@ public boolean dropTable(String catName, String dbName, String tableName) } } + @Override + public boolean isPartOfMaterializedView(String catName, String dbName, String tblName) { + return false; + } + @Override public Table getTable(String catName, String dbName, String tableName) throws MetaException { return objectStore.getTable(catName, dbName, tableName); diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java index 662a0989ce..81a4729b86 100644 --- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java +++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java @@ -2762,6 +2762,14 @@ private boolean drop_table_core(final RawStore ms, final String catName, final S if (tbl == null) { throw new NoSuchObjectException(name + " doesn't exist"); } + + // Check if table is part of a materialized view. + // If it is, it cannot be dropped. + boolean isPartOfMV = ms.isPartOfMaterializedView(catName, dbname, name); + if (isPartOfMV == true) { + throw new MetaException("Table belongs to one or more materialized views. Please drop the MVs first."); + } + if (tbl.getSd() == null) { throw new MetaException("Table metadata is corrupted"); } diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java index 1a5944d33e..3f5825c5db 100644 --- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java +++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java @@ -1160,6 +1160,44 @@ private boolean dropCreationMetadata(String catName, String dbName, String table return success; } + @Override + public boolean isPartOfMaterializedView(String catName, String dbName, String tblName) { + + boolean committed = false; + Query query = null; + boolean isPartOfMV = false; + try { + openTransaction(); + + query = pm.newQuery("select from org.apache.hadoop.hive.metastore.model.MCreationMetadata"); + + List creationMetadata = (List)query.execute(); + Iterator iter = creationMetadata.iterator(); + + while (iter.hasNext()) + { + MCreationMetadata p = iter.next(); + Set tables = p.getTables(); + for (MTable table : tables) { + if (dbName.equals(table.getDatabase().getName()) && tblName.equals(table.getTableName())) { + LOG.info("Cannot drop table " + table.getTableName() + + " as it is being used by MView " + p.getTblName()); + isPartOfMV=true; + break; + } + } + } + + committed = commitTransaction(); + } finally { + rollbackAndCleanup(committed, query); + } + return isPartOfMV; + } + + + + private List listAllTableConstraintsWithOptionalConstraintName( String catName, String dbName, String tableName, String constraintname) { catName = normalizeIdentifier(catName); diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/RawStore.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/RawStore.java index 09850c50ef..e39911a5f2 100644 --- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/RawStore.java +++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/RawStore.java @@ -1792,6 +1792,15 @@ void alterSchemaVersion(SchemaVersionDescriptor version, SchemaVersion newVersio */ List getAllWriteEventInfo(long txnId, String dbName, String tableName) throws MetaException; + /** + * Checking if table is part of a materialized view. + * @param catName catalog the table is in + * @param dbName database the table is in + * @param tblName table name + * @return true if the table is part of any materialized view + */ + boolean isPartOfMaterializedView(String catName, String dbName, String tblName); + /** * Returns details about a scheduled query by name. * diff --git a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java index 4d8dc4c047..50d1f8ca38 100644 --- a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java +++ b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java @@ -2862,6 +2862,10 @@ static boolean isBlacklistWhitelistEmpty(Configuration conf) { return rawStore.getPartitionColsWithStats(catName, dbName, tableName); } + @Override public boolean isPartOfMaterializedView(String catName, String dbName, String tblName) { + return rawStore.isPartOfMaterializedView(catName, dbName, tblName); + } + @Override public ScheduledQueryPollResponse scheduledQueryPoll(ScheduledQueryPollRequest request) throws MetaException { return rawStore.scheduledQueryPoll(request); diff --git a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/DummyRawStoreControlledCommit.java b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/DummyRawStoreControlledCommit.java index 6a6ba5fb13..893cbb3cc6 100644 --- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/DummyRawStoreControlledCommit.java +++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/DummyRawStoreControlledCommit.java @@ -1290,6 +1290,11 @@ public void cleanWriteNotificationEvents(int olderThan) { return null; } + @Override + public boolean isPartOfMaterializedView(String catName, String dbName, String tblName) { + return false; + } + @Override public Map> getPartitionColsWithStats(String catName, String dbName, String tableName) throws MetaException, diff --git a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/DummyRawStoreForJdoConnection.java b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/DummyRawStoreForJdoConnection.java index 1f0bb47929..e9f1738a4e 100644 --- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/DummyRawStoreForJdoConnection.java +++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/DummyRawStoreForJdoConnection.java @@ -1284,6 +1284,11 @@ public void cleanWriteNotificationEvents(int olderThan) { return null; } + @Override + public boolean isPartOfMaterializedView(String catName, String dbName, String tblName) { + return false; + } + @Override public ScheduledQueryPollResponse scheduledQueryPoll(ScheduledQueryPollRequest request) { throw new RuntimeException("unimplemented");