diff --git ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationDesc.java ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationDesc.java index 16d28f2aa5..ddb320692a 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationDesc.java @@ -29,31 +29,15 @@ 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 ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationOperation.java ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationOperation.java index 0c4ade3538..949c9aece5 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationOperation.java +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetLocationOperation.java @@ -23,10 +23,12 @@ 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 AlterDatabaseSetLocationOperation(DDLOperationContext context, AlterDatab @Override protected void doAlteration(Database database, Map 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 ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationAnalyzer.java index a0e92eb3ef..db7a3ba1b2 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationAnalyzer.java +++ 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.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 void analyzeInternal(ASTNode root) throws SemanticException { outputs.add(toWriteEntity(newLocation)); - AlterDatabaseSetLocationDesc desc = new AlterDatabaseSetLocationDesc(databaseName, null, newLocation); + AlterDatabaseSetManagedLocationDesc desc = new AlterDatabaseSetManagedLocationDesc(databaseName, newLocation); addAlterDatabaseDesc(desc); } } diff --git ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationDesc.java ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationDesc.java new file mode 100644 index 0000000000..fc43583882 --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationDesc.java @@ -0,0 +1,43 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.ddl.database.alter.location; + +import org.apache.hadoop.hive.ql.ddl.database.alter.AbstractAlterDatabaseDesc; +import org.apache.hadoop.hive.ql.plan.Explain; +import org.apache.hadoop.hive.ql.plan.Explain.Level; + +/** + * DDL task description for ALTER DATABASE ... SET MANAGEDLOCATION ... commands. + */ +@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 final String managedLocation; + + public AlterDatabaseSetManagedLocationDesc(String databaseName, String managedLocation) { + super(databaseName, null); + this.managedLocation = managedLocation; + } + + @Explain(displayName="managed location") + public String getManagedLocation() { + return managedLocation; + } +} diff --git ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationOperation.java ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationOperation.java new file mode 100644 index 0000000000..64a6a8ffbf --- /dev/null +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/database/alter/location/AlterDatabaseSetManagedLocationOperation.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hive.ql.ddl.database.alter.location; + +import java.net.URI; +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 managed location. + */ +public class AlterDatabaseSetManagedLocationOperation + extends AbstractAlterDatabaseOperation { + public AlterDatabaseSetManagedLocationOperation(DDLOperationContext context, + AlterDatabaseSetManagedLocationDesc desc) { + super(context, desc); + } + + @Override + protected void doAlteration(Database database, Map params) throws HiveException { + try { + String newManagedLocation = Utilities.getQualifiedPath(context.getConf(), new Path(desc.getManagedLocation())); + + if (database.getLocationUri().equalsIgnoreCase(newManagedLocation)) { + throw new HiveException("Managed and external locations for database cannot be the same"); + } + + URI locationURI = new URI(newManagedLocation); + if (!locationURI.isAbsolute() || StringUtils.isBlank(locationURI.getScheme())) { + throw new HiveException(ErrorMsg.BAD_LOCATION_VALUE, newManagedLocation); + } + + 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 ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseAnalyzer.java index f87dd2a64e..0cf58ee109 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseAnalyzer.java @@ -46,7 +46,8 @@ public void analyzeInternal(ASTNode root) throws SemanticException { boolean ifNotExists = false; String comment = null; - String locationUri = null, managedLocationUri = null; + String locationUri = null; + String managedLocationUri = null; Map props = null; for (int i = 1; i < root.getChildCount(); i++) { @@ -74,12 +75,14 @@ public void analyzeInternal(ASTNode root) throws SemanticException { } } - 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 ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseDesc.java ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseDesc.java index f3959f0b2a..167672b2b0 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseDesc.java @@ -39,19 +39,14 @@ private final boolean ifNotExists; private final Map dbProperties; - public CreateDatabaseDesc(String databaseName, String comment, String locationUri, boolean ifNotExists, - Map dbProperties) { - this(databaseName, comment, locationUri, ifNotExists, dbProperties, null); - } - - public CreateDatabaseDesc(String databaseName, String comment, String locationUri, boolean ifNotExists, - Map dbProperties, String managedLocationUri) { + public CreateDatabaseDesc(String databaseName, String comment, String locationUri, String managedLocationUri, + boolean ifNotExists, Map 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 String getLocationUri() { return locationUri; } - @Explain(displayName="managedLocationUri") + @Explain(displayName="managed location uri") public String getManagedLocationUri() { return managedLocationUri; } diff --git ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java index 444db0a8b8..db06161296 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/database/create/CreateDatabaseOperation.java @@ -42,20 +42,19 @@ public CreateDatabaseOperation(DDLOperationContext context, CreateDatabaseDesc d @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 @@ private void makeLocationQualified(Database database) throws HiveException { 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 @@ private void makeLocationQualified(Database database) throws HiveException { 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 ql/src/java/org/apache/hadoop/hive/ql/ddl/database/desc/DescDatabaseDesc.java ql/src/java/org/apache/hadoop/hive/ql/ddl/database/desc/DescDatabaseDesc.java index be0e5a963c..b92ed21cad 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/database/desc/DescDatabaseDesc.java +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/database/desc/DescDatabaseDesc.java @@ -33,16 +33,17 @@ 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 ql/src/java/org/apache/hadoop/hive/ql/ddl/database/drop/DropDatabaseOperation.java ql/src/java/org/apache/hadoop/hive/ql/ddl/database/drop/DropDatabaseOperation.java index a116a0e414..74ac07db8f 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/database/drop/DropDatabaseOperation.java +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/database/drop/DropDatabaseOperation.java @@ -52,8 +52,7 @@ public int execute() throws HiveException { 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 ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java index b362837439..7e5dd41fbf 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableAnalyzer.java @@ -54,12 +54,10 @@ public void analyzeInternal(ASTNode root) throws SemanticException { // 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 task = TaskFactory.get(new DDLWork(getInputs(), getOutputs(), desc)); - task.setFetchSource(true); - rootTasks.add(task); + task.setFetchSource(true); setFetchTask(createFetchTask(ShowCreateTableDesc.SCHEMA)); } } diff --git ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java index bf913442f9..e6b1bae114 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/table/create/show/ShowCreateTableOperation.java @@ -103,7 +103,7 @@ public int execute() throws HiveException { } private static final String CREATE_VIEW_TEMPLATE = - "CREATE VIEW `<" + DATABASE_NAME + ">`." + "`<" + TABLE_NAME + ">`" + " AS "; + "CREATE VIEW `<" + DATABASE_NAME + ">`.`<" + TABLE_NAME + ">` AS "; private String getCreateViewCommand(Table table, boolean isRelative) { ST command = new ST(CREATE_VIEW_TEMPLATE); diff --git ql/src/java/org/apache/hadoop/hive/ql/ddl/table/drop/DropTableOperation.java ql/src/java/org/apache/hadoop/hive/ql/ddl/table/drop/DropTableOperation.java index 72b694f668..8518b844d7 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/table/drop/DropTableOperation.java +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/table/drop/DropTableOperation.java @@ -108,8 +108,7 @@ public int execute() throws HiveException { 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 ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/drop/AlterTableDropPartitionOperation.java ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/drop/AlterTableDropPartitionOperation.java index ae2c341c19..06f083c012 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/drop/AlterTableDropPartitionOperation.java +++ ql/src/java/org/apache/hadoop/hive/ql/ddl/table/partition/drop/AlterTableDropPartitionOperation.java @@ -120,9 +120,8 @@ private void dropPartitions() throws HiveException { List 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 @@ private void dropPartitions() throws HiveException { llapEvictRequestBuilder.addPartitionOfATable(tablenName.getDb(), tablenName.getTable(), partition.getSpec()); } } + if (llapEvictRequestBuilder != null) { ProactiveEviction.evict(context.getConf(), llapEvictRequestBuilder.build()); } diff --git ql/src/java/org/apache/hadoop/hive/ql/ddl/view/materialized/alter/rebuild/AlterMaterializedViewRebuildAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/ddl/view/materialized/alter/rebuild/AlterMaterializedViewRebuildAnalyzer.java index 4fb53785c2..d1d0e3cbe6 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ddl/view/materialized/alter/rebuild/AlterMaterializedViewRebuildAnalyzer.java +++ 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 ql/src/java/org/apache/hadoop/hive/ql/exec/repl/bootstrap/load/LoadDatabase.java ql/src/java/org/apache/hadoop/hive/ql/exec/repl/bootstrap/load/LoadDatabase.java index 52777f3b20..85e9addcd3 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/repl/bootstrap/load/LoadDatabase.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/repl/bootstrap/load/LoadDatabase.java @@ -117,7 +117,7 @@ private boolean isDbEmpty(String dbName) throws HiveException { 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 ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateDatabaseHandler.java ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateDatabaseHandler.java index 42fa88c5fb..c2e652a1b1 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateDatabaseHandler.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/repl/load/message/CreateDatabaseHandler.java @@ -58,7 +58,7 @@ 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 createDBTask = TaskFactory.get( new DDLWork(new HashSet<>(), new HashSet<>(), createDatabaseDesc), context.hiveConf); if (!db.getParameters().isEmpty()) { diff --git ql/src/test/queries/clientnegative/database_location_conflict.q ql/src/test/queries/clientnegative/database_location_conflict.q new file mode 100644 index 0000000000..11f0801ea1 --- /dev/null +++ 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 ql/src/test/queries/clientnegative/database_location_conflict2.q ql/src/test/queries/clientnegative/database_location_conflict2.q new file mode 100644 index 0000000000..13df728dbd --- /dev/null +++ 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 ql/src/test/queries/clientnegative/database_location_conflict3.q ql/src/test/queries/clientnegative/database_location_conflict3.q new file mode 100644 index 0000000000..8de1646204 --- /dev/null +++ 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 ql/src/test/queries/clientpositive/database_location.q ql/src/test/queries/clientpositive/database_location.q index 8571958c29..af55a80b9b 100644 --- ql/src/test/queries/clientpositive/database_location.q +++ 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 ql/src/test/results/clientnegative/database_location_conflict.q.out ql/src/test/results/clientnegative/database_location_conflict.q.out new file mode 100644 index 0000000000..8034185af8 --- /dev/null +++ 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 ql/src/test/results/clientnegative/database_location_conflict2.q.out ql/src/test/results/clientnegative/database_location_conflict2.q.out new file mode 100644 index 0000000000..80786bf86d --- /dev/null +++ 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 ql/src/test/results/clientnegative/database_location_conflict3.q.out ql/src/test/results/clientnegative/database_location_conflict3.q.out new file mode 100644 index 0000000000..80786bf86d --- /dev/null +++ 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 ql/src/test/results/clientpositive/database_location.q.out ql/src/test/results/clientpositive/database_location.q.out index f0567076a7..801ed4184f 100644 --- ql/src/test/results/clientpositive/database_location.q.out +++ 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 ####