You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by mg...@apache.org on 2020/05/01 10:54:48 UTC

[hive] branch master updated: HIVE-23316 Add tests to cover database managed location related DDL and fix minor issues (Miklos Gergely, reviewed by Jesus Camacho Rodriguez)

This is an automated email from the ASF dual-hosted git repository.

mgergely pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 0897480  HIVE-23316 Add tests to cover database managed location related DDL and fix minor issues (Miklos Gergely, reviewed by Jesus Camacho Rodriguez)
0897480 is described below

commit 08974803c881f2dc652764776a28683af9f9c8d9
Author: miklosgergely <mg...@cloudera.com>
AuthorDate: Tue Apr 28 23:12:25 2020 +0200

    HIVE-23316 Add tests to cover database managed location related DDL and fix minor issues (Miklos Gergely, reviewed by Jesus Camacho Rodriguez)
---
 .../location/AlterDatabaseSetLocationDesc.java     |  20 +---
 .../AlterDatabaseSetLocationOperation.java         |  37 +++-----
 .../AlterDatabaseSetManagedLocationAnalyzer.java   |   4 +-
 ...va => AlterDatabaseSetManagedLocationDesc.java} |  30 ++----
 ... AlterDatabaseSetManagedLocationOperation.java} |  44 ++++-----
 .../database/create/CreateDatabaseAnalyzer.java    |   9 +-
 .../ql/ddl/database/create/CreateDatabaseDesc.java |  13 +--
 .../database/create/CreateDatabaseOperation.java   |  21 +++--
 .../ql/ddl/database/desc/DescDatabaseDesc.java     |   5 +-
 .../ddl/database/drop/DropDatabaseOperation.java   |   3 +-
 .../table/create/show/ShowCreateTableAnalyzer.java |   4 +-
 .../create/show/ShowCreateTableOperation.java      |   2 +-
 .../hive/ql/ddl/table/drop/DropTableOperation.java |   3 +-
 .../drop/AlterTableDropPartitionOperation.java     |   6 +-
 .../AlterMaterializedViewRebuildAnalyzer.java      |   1 -
 .../ql/exec/repl/bootstrap/load/LoadDatabase.java  |   2 +-
 .../repl/load/message/CreateDatabaseHandler.java   |   2 +-
 .../clientnegative/database_location_conflict.q    |   4 +
 .../clientnegative/database_location_conflict2.q   |   5 +
 .../clientnegative/database_location_conflict3.q   |   4 +
 .../queries/clientpositive/database_location.q     |  27 ++++++
 .../database_location_conflict.q.out               |   6 ++
 .../database_location_conflict2.q.out              |  14 +++
 .../database_location_conflict3.q.out              |  14 +++
 .../results/clientpositive/database_location.q.out | 104 +++++++++++++++++++++
 25 files changed, 254 insertions(+), 130 deletions(-)

diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationDesc.java
index 16d28f2..ddb3206 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationDesc.java
@@ -29,31 +29,15 @@ import org.apache.hadoop.hive.ql.plan.Explain.Level;
 public class AlterDatabaseSetLocationDesc extends AbstractAlterDatabaseDesc {
   private static final long serialVersionUID = 1L;
 
-  private String location = null;
-  private String managedLocation = null;
+  private final String location;
 
   public AlterDatabaseSetLocationDesc(String databaseName, String location) {
-    this(databaseName, location,null);
-  }
-
-  public AlterDatabaseSetLocationDesc(String databaseName, String location, String managedLocation) {
     super(databaseName, null);
-    if (location != null) {
-      this.location = location;
-    }
-
-    if (managedLocation != null) {
-      this.managedLocation = managedLocation;
-    }
+    this.location = location;
   }
 
   @Explain(displayName="location")
   public String getLocation() {
     return location;
   }
-
-  @Explain(displayName="managedLocation")
-  public String getManagedLocation() {
-    return managedLocation;
-  }
 }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationOperation.java
index 0c4ade3..949c9ae 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationOperation.java
@@ -23,10 +23,12 @@ import java.net.URISyntaxException;
 import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hive.metastore.api.Database;
 import org.apache.hadoop.hive.ql.ErrorMsg;
 import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
 import org.apache.hadoop.hive.ql.ddl.database.alter.AbstractAlterDatabaseOperation;
+import org.apache.hadoop.hive.ql.exec.Utilities;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 
 /**
@@ -40,34 +42,23 @@ public class AlterDatabaseSetLocationOperation extends AbstractAlterDatabaseOper
   @Override
   protected void doAlteration(Database database, Map<String, String> params) throws HiveException {
     try {
-      String newLocation = desc.getLocation();
-      if (newLocation != null) {
-        URI locationURI = new URI(newLocation);
-        if (!locationURI.isAbsolute() || StringUtils.isBlank(locationURI.getScheme())) {
-          throw new HiveException(ErrorMsg.BAD_LOCATION_VALUE, newLocation);
-        }
+      String newLocation = Utilities.getQualifiedPath(context.getConf(), new Path(desc.getLocation()));
 
-        if (newLocation.equals(database.getLocationUri())) {
-          LOG.info("AlterDatabase skipped. No change in location.");
-        } else {
-          database.setLocationUri(newLocation);
-        }
-        return;
+      if (newLocation.equalsIgnoreCase(database.getManagedLocationUri())) {
+        throw new HiveException("Managed and external locations for database cannot be the same");
       }
 
-      newLocation = desc.getManagedLocation();
-      if (newLocation != null) {
-        URI locationURI = new URI(newLocation);
-        if (!locationURI.isAbsolute() || StringUtils.isBlank(locationURI.getScheme())) {
-          throw new HiveException(ErrorMsg.BAD_LOCATION_VALUE, newLocation);
-        }
+      URI locationURI = new URI(newLocation);
+      if (!locationURI.isAbsolute() || StringUtils.isBlank(locationURI.getScheme())) {
+        throw new HiveException(ErrorMsg.BAD_LOCATION_VALUE, newLocation);
+      }
 
-        if (newLocation.equals(database.getManagedLocationUri())) {
-          LOG.info("AlterDatabase skipped. No change in location.");
-        } else {
-          database.setManagedLocationUri(newLocation);
-        }
+      if (newLocation.equals(database.getLocationUri())) {
+        LOG.info("AlterDatabase skipped. No change in location.");
+      } else {
+        database.setLocationUri(newLocation);
       }
+      return;
     } catch (URISyntaxException e) {
       throw new HiveException(e);
     }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationAnalyzer.java
index a0e92eb..db7a3ba 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationAnalyzer.java
@@ -26,7 +26,7 @@ import org.apache.hadoop.hive.ql.parse.HiveParser;
 import org.apache.hadoop.hive.ql.parse.SemanticException;
 
 /**
- * Analyzer for database set location commands.
+ * Analyzer for database set managed location commands.
  */
 @DDLType(types = HiveParser.TOK_ALTERDATABASE_MANAGEDLOCATION)
 public class AlterDatabaseSetManagedLocationAnalyzer extends AbstractAlterDatabaseAnalyzer {
@@ -41,7 +41,7 @@ public class AlterDatabaseSetManagedLocationAnalyzer extends AbstractAlterDataba
 
     outputs.add(toWriteEntity(newLocation));
 
-    AlterDatabaseSetLocationDesc desc = new AlterDatabaseSetLocationDesc(databaseName, null, newLocation);
+    AlterDatabaseSetManagedLocationDesc desc = new AlterDatabaseSetManagedLocationDesc(databaseName, newLocation);
     addAlterDatabaseDesc(desc);
   }
 }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationDesc.java
similarity index 58%
copy from ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationDesc.java
copy to ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationDesc.java
index 16d28f2..fc43583 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationDesc.java
@@ -23,36 +23,20 @@ import org.apache.hadoop.hive.ql.plan.Explain;
 import org.apache.hadoop.hive.ql.plan.Explain.Level;
 
 /**
- * DDL task description for ALTER DATABASE ... SET LOCATION ... commands.
+ * DDL task description for ALTER DATABASE ... SET MANAGEDLOCATION ... commands.
  */
-@Explain(displayName = "Set Database Location", explainLevels = { Level.USER, Level.DEFAULT, Level.EXTENDED })
-public class AlterDatabaseSetLocationDesc extends AbstractAlterDatabaseDesc {
+@Explain(displayName = "Set Database Managed Location", explainLevels = { Level.USER, Level.DEFAULT, Level.EXTENDED })
+public class AlterDatabaseSetManagedLocationDesc extends AbstractAlterDatabaseDesc {
   private static final long serialVersionUID = 1L;
 
-  private String location = null;
-  private String managedLocation = null;
+  private final String managedLocation;
 
-  public AlterDatabaseSetLocationDesc(String databaseName, String location) {
-    this(databaseName, location,null);
-  }
-
-  public AlterDatabaseSetLocationDesc(String databaseName, String location, String managedLocation) {
+  public AlterDatabaseSetManagedLocationDesc(String databaseName, String managedLocation) {
     super(databaseName, null);
-    if (location != null) {
-      this.location = location;
-    }
-
-    if (managedLocation != null) {
-      this.managedLocation = managedLocation;
-    }
-  }
-
-  @Explain(displayName="location")
-  public String getLocation() {
-    return location;
+    this.managedLocation = managedLocation;
   }
 
-  @Explain(displayName="managedLocation")
+  @Explain(displayName="managed location")
   public String getManagedLocation() {
     return managedLocation;
   }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationOperation.java
similarity index 53%
copy from ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationOperation.java
copy to ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationOperation.java
index 0c4ade3..64a6a8f 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationOperation.java
@@ -23,50 +23,42 @@ import java.net.URISyntaxException;
 import java.util.Map;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hive.metastore.api.Database;
 import org.apache.hadoop.hive.ql.ErrorMsg;
 import org.apache.hadoop.hive.ql.ddl.DDLOperationContext;
 import org.apache.hadoop.hive.ql.ddl.database.alter.AbstractAlterDatabaseOperation;
+import org.apache.hadoop.hive.ql.exec.Utilities;
 import org.apache.hadoop.hive.ql.metadata.HiveException;
 
 /**
- * Operation process of altering a database's location.
+ * Operation process of altering a database's managed location.
  */
-public class AlterDatabaseSetLocationOperation extends AbstractAlterDatabaseOperation<AlterDatabaseSetLocationDesc> {
-  public AlterDatabaseSetLocationOperation(DDLOperationContext context, AlterDatabaseSetLocationDesc desc) {
+public class AlterDatabaseSetManagedLocationOperation
+    extends AbstractAlterDatabaseOperation<AlterDatabaseSetManagedLocationDesc> {
+  public AlterDatabaseSetManagedLocationOperation(DDLOperationContext context,
+      AlterDatabaseSetManagedLocationDesc desc) {
     super(context, desc);
   }
 
   @Override
   protected void doAlteration(Database database, Map<String, String> params) throws HiveException {
     try {
-      String newLocation = desc.getLocation();
-      if (newLocation != null) {
-        URI locationURI = new URI(newLocation);
-        if (!locationURI.isAbsolute() || StringUtils.isBlank(locationURI.getScheme())) {
-          throw new HiveException(ErrorMsg.BAD_LOCATION_VALUE, newLocation);
-        }
+      String newManagedLocation = Utilities.getQualifiedPath(context.getConf(), new Path(desc.getManagedLocation()));
 
-        if (newLocation.equals(database.getLocationUri())) {
-          LOG.info("AlterDatabase skipped. No change in location.");
-        } else {
-          database.setLocationUri(newLocation);
-        }
-        return;
+      if (database.getLocationUri().equalsIgnoreCase(newManagedLocation)) {
+        throw new HiveException("Managed and external locations for database cannot be the same");
       }
 
-      newLocation = desc.getManagedLocation();
-      if (newLocation != null) {
-        URI locationURI = new URI(newLocation);
-        if (!locationURI.isAbsolute() || StringUtils.isBlank(locationURI.getScheme())) {
-          throw new HiveException(ErrorMsg.BAD_LOCATION_VALUE, newLocation);
-        }
+      URI locationURI = new URI(newManagedLocation);
+      if (!locationURI.isAbsolute() || StringUtils.isBlank(locationURI.getScheme())) {
+        throw new HiveException(ErrorMsg.BAD_LOCATION_VALUE, newManagedLocation);
+      }
 
-        if (newLocation.equals(database.getManagedLocationUri())) {
-          LOG.info("AlterDatabase skipped. No change in location.");
-        } else {
-          database.setManagedLocationUri(newLocation);
-        }
+      if (newManagedLocation.equals(database.getManagedLocationUri())) {
+        LOG.info("AlterDatabase skipped. No change in location.");
+      } else {
+        database.setManagedLocationUri(newManagedLocation);
       }
     } catch (URISyntaxException e) {
       throw new HiveException(e);
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseAnalyzer.java
index f87dd2a..0cf58ee 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseAnalyzer.java
@@ -46,7 +46,8 @@ public class CreateDatabaseAnalyzer extends BaseSemanticAnalyzer {
 
     boolean ifNotExists = false;
     String comment = null;
-    String locationUri = null, managedLocationUri = null;
+    String locationUri = null;
+    String managedLocationUri = null;
     Map<String, String> props = null;
 
     for (int i = 1; i < root.getChildCount(); i++) {
@@ -74,12 +75,14 @@ public class CreateDatabaseAnalyzer extends BaseSemanticAnalyzer {
       }
     }
 
-    CreateDatabaseDesc desc = new CreateDatabaseDesc(databaseName, comment, locationUri, ifNotExists, props, managedLocationUri);
+    CreateDatabaseDesc desc = new CreateDatabaseDesc(databaseName, comment, locationUri, managedLocationUri,
+        ifNotExists, props);
     rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc)));
 
     Database database = new Database(databaseName, comment, locationUri, props);
-    if (managedLocationUri != null)
+    if (managedLocationUri != null) {
       database.setManagedLocationUri(managedLocationUri);
+    }
     outputs.add(new WriteEntity(database, WriteEntity.WriteType.DDL_NO_LOCK));
   }
 }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseDesc.java
index f3959f0..167672b 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseDesc.java
@@ -39,19 +39,14 @@ public class CreateDatabaseDesc implements DDLDesc, Serializable {
   private final boolean ifNotExists;
   private final Map<String, String> dbProperties;
 
-  public CreateDatabaseDesc(String databaseName, String comment, String locationUri, boolean ifNotExists,
-      Map<String, String> dbProperties) {
-    this(databaseName, comment, locationUri, ifNotExists, dbProperties, null);
-  }
-
-  public CreateDatabaseDesc(String databaseName, String comment, String locationUri, boolean ifNotExists,
-      Map<String, String> dbProperties, String managedLocationUri) {
+  public CreateDatabaseDesc(String databaseName, String comment, String locationUri, String managedLocationUri,
+      boolean ifNotExists, Map<String, String> dbProperties) {
     this.databaseName = databaseName;
     this.comment = comment;
     this.locationUri = locationUri;
+    this.managedLocationUri = managedLocationUri;
     this.ifNotExists = ifNotExists;
     this.dbProperties = dbProperties;
-    this.managedLocationUri = managedLocationUri;
   }
 
   @Explain(displayName="if not exists", displayOnlyOnTrue = true)
@@ -78,7 +73,7 @@ public class CreateDatabaseDesc implements DDLDesc, Serializable {
     return locationUri;
   }
 
-  @Explain(displayName="managedLocationUri")
+  @Explain(displayName="managed location uri")
   public String getManagedLocationUri() {
     return managedLocationUri;
   }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java
index 444db0a..db06161 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java
@@ -42,20 +42,19 @@ public class CreateDatabaseOperation extends DDLOperation<CreateDatabaseDesc> {
 
   @Override
   public int execute() throws HiveException {
-    Database database = new Database();
-    database.setName(desc.getName());
-    database.setDescription(desc.getComment());
-    database.setLocationUri(desc.getLocationUri());
-    database.setParameters(desc.getDatabaseProperties());
+    Database database = new Database(desc.getName(), desc.getComment(), desc.getLocationUri(),
+        desc.getDatabaseProperties());
     database.setOwnerName(SessionState.getUserFromAuthenticator());
     database.setOwnerType(PrincipalType.USER);
-    if (desc.getManagedLocationUri() != null)
+    if (desc.getManagedLocationUri() != null) {
       database.setManagedLocationUri(desc.getManagedLocationUri());
+    }
 
     try {
       makeLocationQualified(database);
-      if (database.getLocationUri().equalsIgnoreCase(database.getManagedLocationUri()))
+      if (database.getLocationUri().equalsIgnoreCase(database.getManagedLocationUri())) {
         throw new HiveException("Managed and external locations for database cannot be the same");
+      }
       context.getDb().createDatabase(database, desc.getIfNotExists());
     } catch (AlreadyExistsException ex) {
       //it would be better if AlreadyExistsException had an errorCode field....
@@ -73,8 +72,9 @@ public class CreateDatabaseOperation extends DDLOperation<CreateDatabaseDesc> {
       String rootDir = MetastoreConf.getVar(context.getConf(), MetastoreConf.ConfVars.WAREHOUSE_EXTERNAL);
       if (rootDir == null || rootDir.trim().isEmpty()) {
         // Fallback plan
-        LOG.warn(MetastoreConf.ConfVars.WAREHOUSE_EXTERNAL.getVarname() + " is not set, falling back to " +
-            MetastoreConf.ConfVars.WAREHOUSE.getVarname() + ". This could cause external tables to use to managed tablespace.");
+        LOG.warn(String.format(
+            "%s is not set, falling back to %s. This could cause external tables to use to managed tablespace.",
+            MetastoreConf.ConfVars.WAREHOUSE_EXTERNAL.getVarname(), MetastoreConf.ConfVars.WAREHOUSE.getVarname()));
         rootDir = MetastoreConf.getVar(context.getConf(), MetastoreConf.ConfVars.WAREHOUSE);
       }
       Path path = new Path(rootDir, database.getName().toLowerCase() + DATABASE_PATH_SUFFIX);
@@ -84,7 +84,8 @@ public class CreateDatabaseOperation extends DDLOperation<CreateDatabaseDesc> {
 
     if (database.isSetManagedLocationUri()) {
       // TODO should we enforce a location check here?
-      database.setManagedLocationUri(Utilities.getQualifiedPath(context.getConf(), new Path(database.getManagedLocationUri())));
+      database.setManagedLocationUri(Utilities.getQualifiedPath(context.getConf(),
+          new Path(database.getManagedLocationUri())));
     }
   }
 }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/desc/DescDatabaseDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/desc/DescDatabaseDesc.java
index be0e5a9..b92ed21 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/desc/DescDatabaseDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/desc/DescDatabaseDesc.java
@@ -33,16 +33,17 @@ public class DescDatabaseDesc implements DDLDesc, Serializable {
   private static final long serialVersionUID = 1L;
 
   public static final String DESC_DATABASE_SCHEMA =
-      "db_name,comment,location,managedLocation,owner_name,owner_type,parameters#string:string:string:string:string:string:string";
+      "db_name,comment,location,managedLocation,owner_name,owner_type,parameters#" +
+      "string:string:string:string:string:string:string";
 
   private final String resFile;
   private final String dbName;
   private final boolean isExt;
 
   public DescDatabaseDesc(Path resFile, String dbName, boolean isExt) {
-    this.isExt = isExt;
     this.resFile = resFile.toString();
     this.dbName = dbName;
+    this.isExt = isExt;
   }
 
   public boolean isExt() {
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/drop/DropDatabaseOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/drop/DropDatabaseOperation.java
index a116a0e..74ac07d 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/drop/DropDatabaseOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/database/drop/DropDatabaseOperation.java
@@ -52,8 +52,7 @@ public class DropDatabaseOperation extends DDLOperation<DropDatabaseDesc> {
       context.getDb().dropDatabase(dbName, true, desc.getIfExists(), desc.isCasdade());
 
       if (LlapHiveUtils.isLlapMode(context.getConf())) {
-        ProactiveEviction.Request.Builder llapEvictRequestBuilder =
-            ProactiveEviction.Request.Builder.create();
+        ProactiveEviction.Request.Builder llapEvictRequestBuilder = ProactiveEviction.Request.Builder.create();
         llapEvictRequestBuilder.addDb(dbName);
         ProactiveEviction.evict(context.getConf(), llapEvictRequestBuilder.build());
       }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java
index b362837..7e5dd41 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java
@@ -54,12 +54,10 @@ public class ShowCreateTableAnalyzer extends BaseSemanticAnalyzer {
     // If no DB was specified in statement, do not include it in the final output
     ShowCreateTableDesc desc = new ShowCreateTableDesc(table.getDbName(), table.getTableName(),
         ctx.getResFile().toString(), StringUtils.isBlank(tableIdentifier.getKey()));
-
     Task<DDLWork> task = TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc));
-    task.setFetchSource(true);
-
     rootTasks.add(task);
 
+    task.setFetchSource(true);
     setFetchTask(createFetchTask(ShowCreateTableDesc.SCHEMA));
   }
 }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java
index bf91344..e6b1bae 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java
@@ -103,7 +103,7 @@ public class ShowCreateTableOperation extends DDLOperation<ShowCreateTableDesc>
   }
 
   private static final String CREATE_VIEW_TEMPLATE =
-      "CREATE VIEW <if(" + DATABASE_NAME + ")>`<" + DATABASE_NAME + ">`.<endif>" + "`<" + TABLE_NAME + ">`" + " AS <SQL>";
+      "CREATE VIEW <if(" + DATABASE_NAME + ")>`<" + DATABASE_NAME + ">`.<endif>`<" + TABLE_NAME + ">` AS <SQL>";
 
   private String getCreateViewCommand(Table table, boolean isRelative) {
     ST command = new ST(CREATE_VIEW_TEMPLATE);
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/drop/DropTableOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/drop/DropTableOperation.java
index 72b694f..8518b84 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/drop/DropTableOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/drop/DropTableOperation.java
@@ -108,8 +108,7 @@ public class DropTableOperation extends DDLOperation<DropTableDesc> {
 
     if (LlapHiveUtils.isLlapMode(context.getConf())) {
       TableName tableName = HiveTableName.of(table);
-      ProactiveEviction.Request.Builder llapEvictRequestBuilder =
-              ProactiveEviction.Request.Builder.create();
+      ProactiveEviction.Request.Builder llapEvictRequestBuilder = ProactiveEviction.Request.Builder.create();
       llapEvictRequestBuilder.addTable(tableName.getDb(), tableName.getTable());
       ProactiveEviction.evict(context.getConf(), llapEvictRequestBuilder.build());
     }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/drop/AlterTableDropPartitionOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/drop/AlterTableDropPartitionOperation.java
index ae2c341..06f083c 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/drop/AlterTableDropPartitionOperation.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/drop/AlterTableDropPartitionOperation.java
@@ -120,9 +120,8 @@ public class AlterTableDropPartitionOperation extends DDLOperation<AlterTableDro
     List<Partition> droppedPartitions = context.getDb().dropPartitions(tablenName.getDb(), tablenName.getTable(),
         partitionExpressions, options);
 
-    ProactiveEviction.Request.Builder llapEvictRequestBuilder =
-        LlapHiveUtils.isLlapMode(context.getConf()) ?
-            ProactiveEviction.Request.Builder.create() : null;
+    ProactiveEviction.Request.Builder llapEvictRequestBuilder = LlapHiveUtils.isLlapMode(context.getConf()) ?
+        ProactiveEviction.Request.Builder.create() : null;
 
     for (Partition partition : droppedPartitions) {
       context.getConsole().printInfo("Dropped the partition " + partition.getName());
@@ -133,6 +132,7 @@ public class AlterTableDropPartitionOperation extends DDLOperation<AlterTableDro
         llapEvictRequestBuilder.addPartitionOfATable(tablenName.getDb(), tablenName.getTable(), partition.getSpec());
       }
     }
+
     if (llapEvictRequestBuilder != null) {
       ProactiveEviction.evict(context.getConf(), llapEvictRequestBuilder.build());
     }
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/materialized/alter/rebuild/AlterMaterializedViewRebuildAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/materialized/alter/rebuild/AlterMaterializedViewRebuildAnalyzer.java
index 4fb5378..d1d0e3c 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/materialized/alter/rebuild/AlterMaterializedViewRebuildAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/view/materialized/alter/rebuild/AlterMaterializedViewRebuildAnalyzer.java
@@ -18,7 +18,6 @@
 
 package org.apache.hadoop.hive.ql.ddl.view.materialized.alter.rebuild;
 
-import org.antlr.runtime.tree.Tree;
 import org.apache.hadoop.hive.common.TableName;
 import org.apache.hadoop.hive.metastore.api.LockState;
 import org.apache.hadoop.hive.ql.Context;
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/repl/bootstrap/load/LoadDatabase.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/repl/bootstrap/load/LoadDatabase.java
index 52777f3..85e9add 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/repl/bootstrap/load/LoadDatabase.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/repl/bootstrap/load/LoadDatabase.java
@@ -117,7 +117,7 @@ public class LoadDatabase {
 
   private Task<?> createDbTask(Database dbObj) {
     // note that we do not set location - for repl load, we want that auto-created.
-    CreateDatabaseDesc createDbDesc = new CreateDatabaseDesc(dbObj.getName(), dbObj.getDescription(), null, false,
+    CreateDatabaseDesc createDbDesc = new CreateDatabaseDesc(dbObj.getName(), dbObj.getDescription(), null, null, false,
         updateDbProps(dbObj, context.dumpDirectory));
     // If it exists, we want this to be an error condition. Repl Load is not intended to replace a
     // db.
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateDatabaseHandler.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateDatabaseHandler.java
index 42fa88c..c2e652a 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateDatabaseHandler.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateDatabaseHandler.java
@@ -58,7 +58,7 @@ public class CreateDatabaseHandler extends AbstractMessageHandler {
         context.dbName == null ? db.getName() : context.dbName;
 
     CreateDatabaseDesc createDatabaseDesc =
-        new CreateDatabaseDesc(destinationDBName, db.getDescription(), null, true, db.getParameters());
+        new CreateDatabaseDesc(destinationDBName, db.getDescription(), null, null, true, db.getParameters());
     Task<DDLWork> createDBTask = TaskFactory.get(
         new DDLWork(new HashSet<>(), new HashSet<>(), createDatabaseDesc), context.hiveConf);
     if (!db.getParameters().isEmpty()) {
diff --git a/ql/src/test/queries/clientnegative/database_location_conflict.q b/ql/src/test/queries/clientnegative/database_location_conflict.q
new file mode 100644
index 0000000..11f0801
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/database_location_conflict.q
@@ -0,0 +1,4 @@
+CREATE DATABASE db
+LOCATION '${hiveconf:hive.metastore.warehouse.dir}/db'
+MANAGEDLOCATION '${hiveconf:hive.metastore.warehouse.dir}/db';
+
diff --git a/ql/src/test/queries/clientnegative/database_location_conflict2.q b/ql/src/test/queries/clientnegative/database_location_conflict2.q
new file mode 100644
index 0000000..13df728
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/database_location_conflict2.q
@@ -0,0 +1,5 @@
+CREATE DATABASE db
+LOCATION '${hiveconf:hive.metastore.warehouse.dir}/db';
+
+ALTER DATABASE db SET MANAGEDLOCATION '${hiveconf:hive.metastore.warehouse.dir}/db';
+
diff --git a/ql/src/test/queries/clientnegative/database_location_conflict3.q b/ql/src/test/queries/clientnegative/database_location_conflict3.q
new file mode 100644
index 0000000..8de1646
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/database_location_conflict3.q
@@ -0,0 +1,4 @@
+CREATE DATABASE db
+MANAGEDLOCATION '${hiveconf:hive.metastore.warehouse.dir}/db';
+
+ALTER DATABASE db SET LOCATION '${hiveconf:hive.metastore.warehouse.dir}/db';
diff --git a/ql/src/test/queries/clientpositive/database_location.q b/ql/src/test/queries/clientpositive/database_location.q
index 8571958..af55a80 100644
--- a/ql/src/test/queries/clientpositive/database_location.q
+++ b/ql/src/test/queries/clientpositive/database_location.q
@@ -18,3 +18,30 @@ CREATE TABLE table_db2 (name STRING, value INT);
 
 DESCRIBE FORMATTED table_db2;
 SHOW TABLES;
+
+EXPLAIN
+CREATE DATABASE db3
+LOCATION '${hiveconf:hive.metastore.warehouse.dir}/db3_ext'
+MANAGEDLOCATION '${hiveconf:hive.metastore.warehouse.dir}/db3';
+
+CREATE DATABASE db3
+LOCATION '${hiveconf:hive.metastore.warehouse.dir}/db3_ext'
+MANAGEDLOCATION '${hiveconf:hive.metastore.warehouse.dir}/db3';
+
+DESCRIBE DATABASE db3;
+
+EXPLAIN
+ALTER DATABASE db3 SET LOCATION '${hiveconf:hive.metastore.warehouse.dir}/db3_ext_alt';
+
+ALTER DATABASE db3 SET LOCATION '${hiveconf:hive.metastore.warehouse.dir}/db3_ext_alt';
+
+DESCRIBE DATABASE db3;
+
+EXPLAIN
+ALTER DATABASE db3 SET MANAGEDLOCATION '${hiveconf:hive.metastore.warehouse.dir}/db3_alt';
+
+ALTER DATABASE db3 SET MANAGEDLOCATION '${hiveconf:hive.metastore.warehouse.dir}/db3_alt';
+
+DESCRIBE DATABASE db3;
+
+
diff --git a/ql/src/test/results/clientnegative/database_location_conflict.q.out b/ql/src/test/results/clientnegative/database_location_conflict.q.out
new file mode 100644
index 0000000..8034185
--- /dev/null
+++ b/ql/src/test/results/clientnegative/database_location_conflict.q.out
@@ -0,0 +1,6 @@
+PREHOOK: query: CREATE DATABASE db
+#### A masked pattern was here ####
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:db
+#### A masked pattern was here ####
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.ddl.DDLTask. Managed and external locations for database cannot be the same
diff --git a/ql/src/test/results/clientnegative/database_location_conflict2.q.out b/ql/src/test/results/clientnegative/database_location_conflict2.q.out
new file mode 100644
index 0000000..80786bf
--- /dev/null
+++ b/ql/src/test/results/clientnegative/database_location_conflict2.q.out
@@ -0,0 +1,14 @@
+PREHOOK: query: CREATE DATABASE db
+#### A masked pattern was here ####
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:db
+#### A masked pattern was here ####
+POSTHOOK: query: CREATE DATABASE db
+#### A masked pattern was here ####
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:db
+#### A masked pattern was here ####
+PREHOOK: type: ALTERDATABASE_LOCATION
+PREHOOK: Output: database:db
+#### A masked pattern was here ####
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.ddl.DDLTask. Managed and external locations for database cannot be the same
diff --git a/ql/src/test/results/clientnegative/database_location_conflict3.q.out b/ql/src/test/results/clientnegative/database_location_conflict3.q.out
new file mode 100644
index 0000000..80786bf
--- /dev/null
+++ b/ql/src/test/results/clientnegative/database_location_conflict3.q.out
@@ -0,0 +1,14 @@
+PREHOOK: query: CREATE DATABASE db
+#### A masked pattern was here ####
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:db
+#### A masked pattern was here ####
+POSTHOOK: query: CREATE DATABASE db
+#### A masked pattern was here ####
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:db
+#### A masked pattern was here ####
+PREHOOK: type: ALTERDATABASE_LOCATION
+PREHOOK: Output: database:db
+#### A masked pattern was here ####
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.ddl.DDLTask. Managed and external locations for database cannot be the same
diff --git a/ql/src/test/results/clientpositive/database_location.q.out b/ql/src/test/results/clientpositive/database_location.q.out
index f056707..801ed41 100644
--- a/ql/src/test/results/clientpositive/database_location.q.out
+++ b/ql/src/test/results/clientpositive/database_location.q.out
@@ -142,3 +142,107 @@ POSTHOOK: query: SHOW TABLES
 POSTHOOK: type: SHOWTABLES
 POSTHOOK: Input: database:db2
 table_db2
+PREHOOK: query: EXPLAIN
+CREATE DATABASE db3
+#### A masked pattern was here ####
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:db3
+#### A masked pattern was here ####
+POSTHOOK: query: EXPLAIN
+CREATE DATABASE db3
+#### A masked pattern was here ####
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:db3
+#### A masked pattern was here ####
+STAGE DEPENDENCIES:
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-0
+    Create Database
+#### A masked pattern was here ####
+      name: db3
+
+PREHOOK: query: CREATE DATABASE db3
+#### A masked pattern was here ####
+PREHOOK: type: CREATEDATABASE
+PREHOOK: Output: database:db3
+#### A masked pattern was here ####
+POSTHOOK: query: CREATE DATABASE db3
+#### A masked pattern was here ####
+POSTHOOK: type: CREATEDATABASE
+POSTHOOK: Output: database:db3
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE DATABASE db3
+PREHOOK: type: DESCDATABASE
+PREHOOK: Input: database:db3
+POSTHOOK: query: DESCRIBE DATABASE db3
+POSTHOOK: type: DESCDATABASE
+POSTHOOK: Input: database:db3
+#### A masked pattern was here ####
+PREHOOK: query: EXPLAIN
+#### A masked pattern was here ####
+PREHOOK: type: ALTERDATABASE_LOCATION
+PREHOOK: Output: database:db3
+#### A masked pattern was here ####
+POSTHOOK: query: EXPLAIN
+#### A masked pattern was here ####
+POSTHOOK: type: ALTERDATABASE_LOCATION
+POSTHOOK: Output: database:db3
+#### A masked pattern was here ####
+STAGE DEPENDENCIES:
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-0
+#### A masked pattern was here ####
+      name: db3
+#### A masked pattern was here ####
+
+#### A masked pattern was here ####
+PREHOOK: type: ALTERDATABASE_LOCATION
+PREHOOK: Output: database:db3
+#### A masked pattern was here ####
+POSTHOOK: type: ALTERDATABASE_LOCATION
+POSTHOOK: Output: database:db3
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE DATABASE db3
+PREHOOK: type: DESCDATABASE
+PREHOOK: Input: database:db3
+POSTHOOK: query: DESCRIBE DATABASE db3
+POSTHOOK: type: DESCDATABASE
+POSTHOOK: Input: database:db3
+#### A masked pattern was here ####
+PREHOOK: query: EXPLAIN
+#### A masked pattern was here ####
+PREHOOK: type: ALTERDATABASE_LOCATION
+PREHOOK: Output: database:db3
+#### A masked pattern was here ####
+POSTHOOK: query: EXPLAIN
+#### A masked pattern was here ####
+POSTHOOK: type: ALTERDATABASE_LOCATION
+POSTHOOK: Output: database:db3
+#### A masked pattern was here ####
+STAGE DEPENDENCIES:
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-0
+#### A masked pattern was here ####
+      name: db3
+#### A masked pattern was here ####
+
+#### A masked pattern was here ####
+PREHOOK: type: ALTERDATABASE_LOCATION
+PREHOOK: Output: database:db3
+#### A masked pattern was here ####
+POSTHOOK: type: ALTERDATABASE_LOCATION
+POSTHOOK: Output: database:db3
+#### A masked pattern was here ####
+PREHOOK: query: DESCRIBE DATABASE db3
+PREHOOK: type: DESCDATABASE
+PREHOOK: Input: database:db3
+POSTHOOK: query: DESCRIBE DATABASE db3
+POSTHOOK: type: DESCDATABASE
+POSTHOOK: Input: database:db3
+#### A masked pattern was here ####