diff --git a/.gitignore b/.gitignore index 03d70c1..1f886bd 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,7 @@ common/src/gen *.iml *.ipr *.iws +ql/derby.log +derby.log +.arc diff --git a/metastore/if/hive_metastore.thrift b/metastore/if/hive_metastore.thrift index 0fe0225..c2051f4 100755 --- a/metastore/if/hive_metastore.thrift +++ b/metastore/if/hive_metastore.thrift @@ -455,6 +455,10 @@ service ThriftHiveMetastore extends fb303.FacebookService throws(1:NoSuchObjectException o1, 2:MetaException o2) Partition get_partition(1:string db_name, 2:string tbl_name, 3:list part_vals) throws(1:MetaException o1, 2:NoSuchObjectException o2) + Partition exchange_partition(1:map partitionSpecs, 2:string source_db, + 3:string source_table_name, 4:string dest_db, 5:string dest_table_name) + throws(1:MetaException o1, 2:NoSuchObjectException o2, 3:InvalidObjectException o3, + 4:InvalidInputException o4) Partition get_partition_with_auth(1:string db_name, 2:string tbl_name, 3:list part_vals, 4: string user_name, 5: list group_names) throws(1:MetaException o1, 2:NoSuchObjectException o2) diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java index 6b73126..0eb6eb7 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStore.java @@ -1863,6 +1863,73 @@ public Partition add_partition_with_environment_context( return ret; } + @Override + public Partition exchange_partition(Map partitionSpecs, + String sourceDbName, String sourceTableName, String destDbName, + String destTableName) throws MetaException, NoSuchObjectException, + InvalidObjectException, InvalidInputException, TException { + boolean success = false; + boolean pathCreated = false; + RawStore ms = getMS(); + ms.openTransaction(); + Table destinationTable = ms.getTable(destDbName, destTableName); + Table sourceTable = ms.getTable(sourceDbName, sourceTableName); + List partVals = MetaStoreUtils.getPvals(sourceTable.getPartitionKeys(), + partitionSpecs); + List partValsPresent = new ArrayList (); + List partitionKeysPresent = new ArrayList (); + int i = 0; + for (FieldSchema fs: sourceTable.getPartitionKeys()) { + String partVal = partVals.get(i); + if (partVal != null && !partVal.equals("")) { + partValsPresent.add(partVal); + partitionKeysPresent.add(fs); + } + i++; + } + List partitionsToExchange = get_partitions_ps(sourceDbName, sourceTableName, + partVals, (short)-1); + boolean sameColumns = MetaStoreUtils.compareFieldColumns( + sourceTable.getSd().getCols(), destinationTable.getSd().getCols()); + boolean samePartitions = MetaStoreUtils.compareFieldColumns( + sourceTable.getPartitionKeys(), destinationTable.getPartitionKeys()); + if (!sameColumns || !samePartitions) { + throw new MetaException("The tables have different schemas." + + " Their partitions cannot be exchanged."); + } + Path sourcePath = new Path(sourceTable.getSd().getLocation(), + Warehouse.makePartName(partitionKeysPresent, partValsPresent)); + Path destPath = new Path(destinationTable.getSd().getLocation(), + Warehouse.makePartName(partitionKeysPresent, partValsPresent)); + try { + for (Partition partition: partitionsToExchange) { + Partition destPartition = new Partition(partition); + destPartition.setDbName(destDbName); + destPartition.setTableName(destinationTable.getTableName()); + Path destPartitionPath = new Path(destinationTable.getSd().getLocation(), + Warehouse.makePartName(destinationTable.getPartitionKeys(), partition.getValues())); + destPartition.getSd().setLocation(destPartitionPath.toString()); + ms.addPartition(destPartition); + ms.dropPartition(partition.getDbName(), sourceTable.getTableName(), + partition.getValues()); + } + /** + * TODO: Use the hard link feature of hdfs + * once https://issues.apache.org/jira/browse/HDFS-3370 is done + */ + pathCreated = wh.renameDir(sourcePath, destPath); + success = ms.commitTransaction(); + } finally { + if (!success) { + ms.rollbackTransaction(); + if (pathCreated) { + wh.renameDir(destPath, sourcePath); + } + } + } + return new Partition(); + } + private boolean drop_partition_common(RawStore ms, String db_name, String tbl_name, List part_vals, final boolean deleteData, final EnvironmentContext envContext) throws MetaException, NoSuchObjectException, IOException, InvalidObjectException, diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java index 4f6378d..cef50f4 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java @@ -424,6 +424,22 @@ public Partition appendPartition(String dbName, String tableName, String partNam partName, envContext)); } + /** + * Exchange the partition between two tables + * @param partitionSpecs partitions specs of the parent partition to be exchanged + * @param destDb the db of the destination table + * @param destinationTableName the destination table name + @ @return new partition after exchanging + */ + @Override + public Partition exchange_partition(Map partitionSpecs, + String sourceDb, String sourceTable, String destDb, + String destinationTableName) throws MetaException, + NoSuchObjectException, InvalidObjectException, TException { + return client.exchange_partition(partitionSpecs, sourceDb, sourceTable, + destDb, destinationTableName); + } + public void validatePartitionNameCharacters(List partVals) throws TException, MetaException { client.partition_name_has_valid_characters(partVals, true); diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java b/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java index da2f359..a2d6b1b 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/IMetaStoreClient.java @@ -347,6 +347,17 @@ public Partition getPartition(String tblName, String dbName, List partVals) throws NoSuchObjectException, MetaException, TException; /** + * @param partition + * @param destdb + * @param destTableName + * @return partition object + */ + public Partition exchange_partition(Map partitionSpecs, + String sourceDb, String sourceTable, String destdb, + String destTableName) throws MetaException, NoSuchObjectException, + InvalidObjectException, TException; + + /** * @param dbName * @param tblName * @param name - partition name i.e. 'ds=2010-02-03/ts=2010-02-03 18%3A16%3A01' diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java index 1342794..ca51064 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreUtils.java @@ -308,6 +308,28 @@ static public void deleteWHDirectory(Path path, Configuration conf, } /** + * Given a list of partition columns and a partial mapping from + * some partition columns to values the function returns the values + * for the column. + * @param partCols the list of table partition columns + * @param partSpec the partial mapping from partition column to values + * @return list of values of for given partition columns, any missing + * values in partSpec is replaced by an empty string + */ + public static List getPvals(List partCols, + Map partSpec) { + List pvals = new ArrayList(); + for (FieldSchema field : partCols) { + String val = partSpec.get(field.getName()); + if (val == null) { + val = ""; + } + pvals.add(val); + } + return pvals; + } + + /** * validateName * * Checks the name conforms to our standars which are: "[a-zA-z_0-9]+". checks @@ -1158,6 +1180,39 @@ public static boolean partitionNameHasValidCharacters(List partVals, return getPartitionValWithInvalidCharacter(partVals, partitionValidationPattern) == null; } + /** + * @param schema1: The first schema to be compared + * @param schema2: The second schema to be compared + * @return true if the two schemas are the same else false + * for comparing a field we ignore the comment it has + */ + public static boolean compareFieldColumns(List schema1, List schema2) { + if (schema1.size() != schema2.size()) { + return false; + } + for (int i = 0; i < schema1.size(); i++) { + FieldSchema f1 = schema1.get(i); + FieldSchema f2 = schema2.get(i); + // The default equals provided by thrift compares the comments too for + // equality, thus we need to compare the relevant fields here. + if (f1.getName() == null) { + if (f2.getName() != null) { + return false; + } + } else if (!f1.getName().equals(f2.getName())) { + return false; + } + if (f1.getType() == null) { + if (f2.getType() != null) { + return false; + } + } else if (!f1.getType().equals(f2.getType())) { + return false; + } + } + return true; + } + private static String getPartitionValWithInvalidCharacter(List partVals, Pattern partitionValidationPattern) { if (partitionValidationPattern == null) { diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/Warehouse.java b/metastore/src/java/org/apache/hadoop/hive/metastore/Warehouse.java index b2cd839..8ada367 100755 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/Warehouse.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/Warehouse.java @@ -204,6 +204,18 @@ public boolean mkdirs(Path f) throws MetaException { return false; } + public boolean renameDir(Path sourcePath, Path destPath) throws MetaException { + FileSystem fs = null; + try { + fs = getFs(sourcePath); + fs.rename(sourcePath, destPath); + return true; + } catch (Exception ex) { + MetaStoreUtils.logAndThrowMetaException(ex); + } + return false; + } + public boolean deleteDir(Path f, boolean recursive) throws MetaException { FileSystem fs = getFs(f); return fsHandler.deleteDir(fs, f, recursive, conf); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java b/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java index d4118fd..7c34aae 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java @@ -301,7 +301,7 @@ "Cannot ALTER VIEW AS SELECT if view currently does not exist\n"), REPLACE_VIEW_WITH_PARTITION(10217, "Cannot replace a view with CREATE VIEW or REPLACE VIEW or " + - "ALTER VIEW AS SELECT if the view has paritions\n"), + "ALTER VIEW AS SELECT if the view has partitions\n"), EXISTING_TABLE_IS_NOT_VIEW(10218, "Existing table is not a view\n"), NO_SUPPORTED_ORDERBY_ALLCOLREF_POS(10219, @@ -338,6 +338,10 @@ + "fails to construct aggregation for the partition "), ANALYZE_TABLE_PARTIALSCAN_AUTOGATHER(10233, "Analyze partialscan is not allowed " + "if hive.stats.autogather is set to false"), + PARTITION_VALUE_NOT_CONTINUOUS(10234, "Parition values specifed are not continuous." + + " A subpartition value is specified without specififying the parent partition's value"), + TABLES_INCOMPATIBLE_SCHEMAS(10235, "Tables have incompatible schemas and their partitions " + + " cannot be exchanged."), SCRIPT_INIT_ERROR(20000, "Unable to initialize custom script."), SCRIPT_IO_ERROR(20001, "An error occurred while reading or writing to your custom script. " diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java index c2a539a..0792a98 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java @@ -109,10 +109,11 @@ import org.apache.hadoop.hive.ql.plan.AddPartitionDesc; import org.apache.hadoop.hive.ql.plan.AlterDatabaseDesc; import org.apache.hadoop.hive.ql.plan.AlterIndexDesc; +import org.apache.hadoop.hive.ql.plan.AlterTableAlterPartDesc; import org.apache.hadoop.hive.ql.plan.AlterTableDesc; import org.apache.hadoop.hive.ql.plan.AlterTableDesc.AlterTableTypes; +import org.apache.hadoop.hive.ql.plan.AlterTableExchangePartition; import org.apache.hadoop.hive.ql.plan.AlterTableSimpleDesc; -import org.apache.hadoop.hive.ql.plan.AlterTableAlterPartDesc; import org.apache.hadoop.hive.ql.plan.CreateDatabaseDesc; import org.apache.hadoop.hive.ql.plan.CreateIndexDesc; import org.apache.hadoop.hive.ql.plan.CreateTableDesc; @@ -429,6 +430,12 @@ public int execute(DriverContext driverContext) { return truncateTable(db, truncateTableDesc); } + AlterTableExchangePartition alterTableExchangePartition = + work.getAlterTableExchangePartition(); + if (alterTableExchangePartition != null) { + return exchangeTablePartition(db, alterTableExchangePartition); + } + } catch (InvalidTableException e) { formatter.consoleError(console, "Table " + e.getTableName() + " does not exist", formatter.MISSING); @@ -3968,6 +3975,17 @@ private int truncateTable(Hive db, TruncateTableDesc truncateTableDesc) throws H return 0; } + private int exchangeTablePartition(Hive db, + AlterTableExchangePartition exchangePartition) throws HiveException { + Map partitionSpecs = exchangePartition.getPartitionSpecs(); + Table destTable = exchangePartition.getDestinationTable(); + Table sourceTable = exchangePartition.getSourceTable(); + db.exchangeTablePartitions(partitionSpecs, sourceTable.getDbName(), + sourceTable.getTableName(),destTable.getDbName(), + destTable.getTableName()); + return 0; + } + private List getLocations(Hive db, Table table, Map partSpec) throws HiveException { List locations = new ArrayList(); diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/MoveTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/MoveTask.java index b285da1..4f4d1fb 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/MoveTask.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/MoveTask.java @@ -35,6 +35,7 @@ import org.apache.hadoop.fs.LocalFileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hive.conf.HiveConf; +import org.apache.hadoop.hive.metastore.MetaStoreUtils; import org.apache.hadoop.hive.metastore.api.InvalidOperationException; import org.apache.hadoop.hive.metastore.api.Order; import org.apache.hadoop.hive.ql.Context; @@ -46,7 +47,6 @@ import org.apache.hadoop.hive.ql.lockmgr.HiveLock; import org.apache.hadoop.hive.ql.lockmgr.HiveLockManager; import org.apache.hadoop.hive.ql.lockmgr.HiveLockObj; -import org.apache.hadoop.hive.ql.metadata.Hive; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.Partition; import org.apache.hadoop.hive.ql.metadata.Table; @@ -394,7 +394,8 @@ public int execute(DriverContext driverContext) { } dc = null; // reset data container to prevent it being added again. } else { // static partitions - List partVals = Hive.getPvals(table.getPartCols(), tbd.getPartitionSpec()); + List partVals = MetaStoreUtils.getPvals(table.getPartCols(), + tbd.getPartitionSpec()); db.validatePartitionNameCharacters(partVals); db.loadPartition(new Path(tbd.getSourceDir()), tbd.getTable().getTableName(), tbd.getPartitionSpec(), tbd.getReplace(), tbd.getHoldDDLTime(), 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 9723725..17daaa1 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 @@ -1671,7 +1671,7 @@ public boolean dropPartition(String db_name, String tbl_name, List names = null; Table t = getTable(dbName, tblName); - List pvals = getPvals(t.getPartCols(), partSpec); + List pvals = MetaStoreUtils.getPvals(t.getPartCols(), partSpec); try { names = getMSC().listPartitionNames(dbName, tblName, pvals, max); @@ -1713,19 +1713,6 @@ public boolean dropPartition(String db_name, String tbl_name, } } - public static List getPvals(List partCols, - Map partSpec) { - List pvals = new ArrayList(); - for (FieldSchema field : partCols) { - String val = partSpec.get(field.getName()); - if (val == null) { - val = ""; - } - pvals.add(val); - } - return pvals; - } - /** * get all the partitions of the table that matches the given partial * specification. partition columns whose value is can be anything should be @@ -1745,7 +1732,7 @@ public boolean dropPartition(String db_name, String tbl_name, "partitioned table"); } - List partialPvals = getPvals(tbl.getPartCols(), partialPartSpec); + List partialPvals = MetaStoreUtils.getPvals(tbl.getPartCols(), partialPartSpec); List partitions = null; try { @@ -2251,6 +2238,18 @@ static protected void replaceFiles(Path srcf, Path destf, Path oldPath, HiveConf } } + public void exchangeTablePartitions(Map partitionSpecs, + String sourceDb, String sourceTable, String destDb, + String destinationTableName) throws HiveException { + try { + getMSC().exchange_partition(partitionSpecs, sourceDb, sourceTable, destDb, + destinationTableName); + } catch (Exception ex) { + LOG.error(StringUtils.stringifyException(ex)); + throw new HiveException(ex); + } + } + /** * Creates a metastore client. Currently it creates only JDBC based client as * File based store support is removed diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java index f72f01a..4746040 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java @@ -43,6 +43,7 @@ import org.apache.hadoop.fs.Path; import org.apache.hadoop.hive.conf.HiveConf; import org.apache.hadoop.hive.conf.HiveConf.ConfVars; +import org.apache.hadoop.hive.metastore.MetaStoreUtils; import org.apache.hadoop.hive.metastore.TableType; import org.apache.hadoop.hive.metastore.Warehouse; import org.apache.hadoop.hive.metastore.api.FieldSchema; @@ -75,8 +76,10 @@ import org.apache.hadoop.hive.ql.plan.AlterDatabaseDesc; import org.apache.hadoop.hive.ql.plan.AlterIndexDesc; import org.apache.hadoop.hive.ql.plan.AlterIndexDesc.AlterIndexTypes; +import org.apache.hadoop.hive.ql.plan.AlterTableAlterPartDesc; import org.apache.hadoop.hive.ql.plan.AlterTableDesc; import org.apache.hadoop.hive.ql.plan.AlterTableDesc.AlterTableTypes; +import org.apache.hadoop.hive.ql.plan.AlterTableExchangePartition; import org.apache.hadoop.hive.ql.plan.AlterTableSimpleDesc; import org.apache.hadoop.hive.ql.plan.CreateDatabaseDesc; import org.apache.hadoop.hive.ql.plan.CreateIndexDesc; @@ -126,7 +129,6 @@ import org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe; import org.apache.hadoop.mapred.InputFormat; import org.apache.hadoop.mapred.TextInputFormat; -import org.apache.hadoop.hive.ql.plan.AlterTableAlterPartDesc; /** * DDLSemanticAnalyzer. @@ -405,6 +407,9 @@ public void analyzeInternal(ASTNode ast) throws SemanticException { case HiveParser.TOK_ALTERTABLE_SKEWED: analyzeAltertableSkewedby(ast); break; + case HiveParser.TOK_EXCHANGEPARTITION: + analyzeExchangePartition(ast); + break; default: throw new SemanticException("Unsupported command."); } @@ -663,6 +668,69 @@ private void analyzeAlterDatabase(ASTNode ast) throws SemanticException { } + private void analyzeExchangePartition(ASTNode ast) throws SemanticException { + Table sourceTable = getTable(getUnescapedName((ASTNode)ast.getChild(0))); + Table destTable = getTable(getUnescapedName((ASTNode)ast.getChild(2))); + + // Get the partition specs + Map partSpecs = getPartSpec((ASTNode) ast.getChild(1)); + validatePartitionValues(partSpecs); + boolean sameColumns = MetaStoreUtils.compareFieldColumns( + sourceTable.getAllCols(), destTable.getAllCols()); + boolean samePartitions = MetaStoreUtils.compareFieldColumns( + sourceTable.getPartitionKeys(), destTable.getPartitionKeys()); + if (!sameColumns || !samePartitions) { + throw new SemanticException(ErrorMsg.TABLES_INCOMPATIBLE_SCHEMAS.getMsg()); + } + List partitions = getPartitions(sourceTable, partSpecs, true); + + // Verify that the partitions specified are continuous + // If a subpartition value is specified without specifying a partition's value + // then we throw an exception + if (!isPartitionValueContinuous(sourceTable.getPartitionKeys(), partSpecs)) { + throw new SemanticException( + ErrorMsg.PARTITION_VALUE_NOT_CONTINUOUS.getMsg(partSpecs.toString())); + } + List destPartitions = null; + try { + destPartitions = getPartitions(destTable, partSpecs, true); + } catch (SemanticException ex) { + // We should expect a semantic exception being throw as this partition + // should not be present. + } + if (destPartitions != null) { + // If any destination partition is present then throw a Semantic Exception. + throw new SemanticException(ErrorMsg.PARTITION_EXISTS.getMsg(destPartitions.toString())); + } + AlterTableExchangePartition alterTableExchangePartition = + new AlterTableExchangePartition(sourceTable, destTable, partSpecs); + rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(), + alterTableExchangePartition), conf)); + } + + /** + * @param partitionKeys the list of partition keys of the table + * @param partSpecs the partition specs given by the user + * @return true if no subpartition value is specified without a partition's + * value being specified else it returns false + */ + private boolean isPartitionValueContinuous(List partitionKeys, + Map partSpecs) { + boolean partitionMissing = false; + for (FieldSchema partitionKey: partitionKeys) { + if (!partSpecs.containsKey(partitionKey.getName())) { + partitionMissing = true; + } else { + if (partitionMissing) { + // A subpartition value exists after a missing partition + // The partition value specified are not continuous, return false + return false; + } + } + } + return true; + } + private void analyzeCreateDatabase(ASTNode ast) throws SemanticException { String dbName = unescapeIdentifier(ast.getChild(0).getText()); boolean ifNotExists = false; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g index f72f476..a99b46c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g @@ -258,6 +258,7 @@ KW_PARTIALSCAN: 'PARTIALSCAN'; KW_USER: 'USER'; KW_ROLE: 'ROLE'; KW_INNER: 'INNER'; +KW_EXCHANGE: 'EXCHANGE'; // Operators // NOTE: if you add a new function/operator, add it to sysFuncNames so that describe function _FUNC_ will work. diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g index 512a779..830201b 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g @@ -295,6 +295,7 @@ TOK_WINDOWSPEC; TOK_WINDOWVALUES; TOK_WINDOWRANGE; TOK_IGNOREPROTECTION; +TOK_EXCHANGEPARTITION; } @@ -867,6 +868,7 @@ alterTableStatementSuffix | alterStatementSuffixProperties | alterTblPartitionStatement | alterStatementSuffixSkewedby + | alterStatementSuffixExchangePartition ; alterViewStatementSuffix @@ -1103,6 +1105,13 @@ alterStatementSuffixSkewedby ->^(TOK_ALTERTABLE_SKEWED $name storedAsDirs) ; +alterStatementSuffixExchangePartition +@init {msgs.push("alter exchange partition");} +@after{msgs.pop();} + : name=tableName KW_EXCHANGE partitionSpec KW_WITH KW_TABLE exchangename=tableName + -> ^(TOK_EXCHANGEPARTITION $name partitionSpec $exchangename) + ; + alterStatementSuffixProtectMode @init { msgs.push("alter partition protect mode statement"); } @after { msgs.pop(); } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java index e89f580..48a05e8 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java @@ -202,6 +202,7 @@ public static BaseSemanticAnalyzer get(HiveConf conf, ASTNode tree) case HiveParser.TOK_ALTERDATABASE_PROPERTIES: case HiveParser.TOK_ALTERTABLE_SKEWED: case HiveParser.TOK_TRUNCATETABLE: + case HiveParser.TOK_EXCHANGEPARTITION: return new DDLSemanticAnalyzer(conf); case HiveParser.TOK_ALTERTABLE_PARTITION: HiveOperation commandType = null; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableExchangePartition.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableExchangePartition.java new file mode 100644 index 0000000..36fae00 --- /dev/null +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableExchangePartition.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.plan; + +import java.util.Map; + +import org.apache.hadoop.hive.ql.metadata.Table; + +public class AlterTableExchangePartition extends DDLDesc { + + // The source table + private Table sourceTable; + + // The destination table + private Table destinationTable; + + // The partition that has to be exchanged + private Map partitionSpecs; + + public AlterTableExchangePartition(Table sourceTable, Table destinationTable, + Map partitionSpecs) { + super(); + this.sourceTable = sourceTable; + this.destinationTable = destinationTable; + this.partitionSpecs = partitionSpecs; + } + + public void setSourceTable(Table sourceTable) { + this.sourceTable = sourceTable; + } + + public Table getSourceTable() { + return this.sourceTable; + } + + public void setDestinationTable(Table destinationTable) { + this.destinationTable = destinationTable; + } + + public Table getDestinationTable() { + return this.destinationTable; + } + + public void setPartitionSpecs(Map partitionSpecs) { + this.partitionSpecs = partitionSpecs; + } + + public Map getPartitionSpecs() { + return this.partitionSpecs; + } +} diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/DDLWork.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/DDLWork.java index 7f1848a..db6fca7 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/DDLWork.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/DDLWork.java @@ -64,6 +64,7 @@ private AlterDatabaseDesc alterDbDesc; private AlterTableAlterPartDesc alterTableAlterPartDesc; private TruncateTableDesc truncateTblDesc; + private AlterTableExchangePartition alterTableExchangePartition; private RoleDDLDesc roleDDLDesc; private GrantDesc grantDesc; @@ -449,6 +450,12 @@ public DDLWork(HashSet inputs, HashSet outputs, this.alterTableAlterPartDesc = alterPartDesc; } + public DDLWork(HashSet inputs, HashSet outputs, + AlterTableExchangePartition alterTableExchangePartition) { + this(inputs, outputs); + this.alterTableExchangePartition = alterTableExchangePartition; + } + /** * @return Create Database descriptor */ @@ -1025,4 +1032,20 @@ public TruncateTableDesc getTruncateTblDesc() { public void setTruncateTblDesc(TruncateTableDesc truncateTblDesc) { this.truncateTblDesc = truncateTblDesc; } + + /** + * @return information about the table partition to be exchanged + */ + public AlterTableExchangePartition getAlterTableExchangePartition() { + return this.alterTableExchangePartition; + } + + /** + * @param alterTableExchangePartition + * set the value of the table partition to be exchanged + */ + public void setAlterTableExchangePartition( + AlterTableExchangePartition alterTableExchangePartition) { + this.alterTableExchangePartition = alterTableExchangePartition; + } } diff --git a/ql/src/test/queries/clientnegative/exchange_partition_neg_incomplete_partition.q b/ql/src/test/queries/clientnegative/exchange_partition_neg_incomplete_partition.q new file mode 100644 index 0000000..e4f0dac --- /dev/null +++ b/ql/src/test/queries/clientnegative/exchange_partition_neg_incomplete_partition.q @@ -0,0 +1,12 @@ +CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING); +CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='h1'); +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='h2'); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +-- for exchange_part_test1 the value of ds is not given and the value of hr is given, thus this query will fail +alter table exchange_part_test1 exchange partition (hr='h1') with table exchange_part_test2; diff --git a/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_exists.q b/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_exists.q new file mode 100644 index 0000000..4d1e0a6 --- /dev/null +++ b/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_exists.q @@ -0,0 +1,12 @@ +CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING); +CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05'); +ALTER TABLE exchange_part_test2 ADD PARTITION (ds='2013-04-05'); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +-- exchange_part_test2 table partition (ds='2013-04-05') already exists thus this query will fail +alter table exchange_part_test1 exchange partition (ds='2013-04-05') with table exchange_part_test2; diff --git a/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_exists2.q b/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_exists2.q new file mode 100644 index 0000000..23777db --- /dev/null +++ b/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_exists2.q @@ -0,0 +1,13 @@ +CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING); +CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1'); +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='2'); +ALTER TABLE exchange_part_test2 ADD PARTITION (ds='2013-04-05', hr='3'); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +-- exchange_part_test2 table partition (ds='2013-04-05', hr='3') already exists thus this query will fail +alter table exchange_part_test1 exchange partition (ds='2013-04-05') with table exchange_part_test2; diff --git a/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_exists3.q b/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_exists3.q new file mode 100644 index 0000000..350bf24 --- /dev/null +++ b/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_exists3.q @@ -0,0 +1,13 @@ +CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING); +CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1'); +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='2'); +ALTER TABLE exchange_part_test2 ADD PARTITION (ds='2013-04-05', hr='1'); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +-- exchange_part_test2 table partition (ds='2013-04-05', hr='1') already exists thus this query will fail +alter table exchange_part_test1 exchange partition (ds='2013-04-05') with table exchange_part_test2; diff --git a/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_missing.q b/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_missing.q new file mode 100644 index 0000000..81944b3 --- /dev/null +++ b/ql/src/test/queries/clientnegative/exchange_partition_neg_partition_missing.q @@ -0,0 +1,6 @@ +CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING); +CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING); +SHOW PARTITIONS exchange_part_test1; + +-- exchange_part_test1 partition (ds='2013-04-05') does not exist thus this query will fail +alter table exchange_part_test1 exchange partition (ds='2013-04-05') with table exchange_part_test2; diff --git a/ql/src/test/queries/clientnegative/exchange_partition_neg_table_missing.q b/ql/src/test/queries/clientnegative/exchange_partition_neg_table_missing.q new file mode 100644 index 0000000..7b926a3 --- /dev/null +++ b/ql/src/test/queries/clientnegative/exchange_partition_neg_table_missing.q @@ -0,0 +1,2 @@ +-- t1 does not exist and the query fails +alter table t1 exchange partition (ds='2013-04-05') with table t2; diff --git a/ql/src/test/queries/clientnegative/exchange_partition_neg_table_missing2.q b/ql/src/test/queries/clientnegative/exchange_partition_neg_table_missing2.q new file mode 100644 index 0000000..48fcd74 --- /dev/null +++ b/ql/src/test/queries/clientnegative/exchange_partition_neg_table_missing2.q @@ -0,0 +1,8 @@ +CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING); +SHOW PARTITIONS exchange_part_test1; + +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05'); +SHOW PARTITIONS exchange_part_test1; + +-- exchange_part_test2 table does not exist thus this query will fail +alter table exchange_part_test1 exchange partition (ds='2013-04-05') with table exchange_part_test2; diff --git a/ql/src/test/queries/clientnegative/exchange_partition_neg_test.q b/ql/src/test/queries/clientnegative/exchange_partition_neg_test.q new file mode 100644 index 0000000..23e86e9 --- /dev/null +++ b/ql/src/test/queries/clientnegative/exchange_partition_neg_test.q @@ -0,0 +1,11 @@ +CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING); +CREATE TABLE exchange_part_test2 (f1 string, f2 string) PARTITIONED BY (ds STRING); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05'); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +-- exchange_part_test1 and exchange_part_test2 do not have the same scheme and thus they fail +ALTER TABLE exchange_part_test1 EXCHANGE PARTITION (ds='2013-04-05') WITH TABLE exchange_part_test2; diff --git a/ql/src/test/queries/clientpositive/exchange_partition.q b/ql/src/test/queries/clientpositive/exchange_partition.q new file mode 100644 index 0000000..6e8bf8e --- /dev/null +++ b/ql/src/test/queries/clientpositive/exchange_partition.q @@ -0,0 +1,12 @@ +CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING); +CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05'); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +ALTER TABLE exchange_part_test1 EXCHANGE PARTITION (ds='2013-04-05') WITH TABLE exchange_part_test2; +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; diff --git a/ql/src/test/queries/clientpositive/exchange_partition2.q b/ql/src/test/queries/clientpositive/exchange_partition2.q new file mode 100644 index 0000000..27b335a --- /dev/null +++ b/ql/src/test/queries/clientpositive/exchange_partition2.q @@ -0,0 +1,12 @@ +CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING); +CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1'); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +ALTER TABLE exchange_part_test1 EXCHANGE PARTITION (ds='2013-04-05', hr='1') WITH TABLE exchange_part_test2; +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; diff --git a/ql/src/test/queries/clientpositive/exchange_partition3.q b/ql/src/test/queries/clientpositive/exchange_partition3.q new file mode 100644 index 0000000..7b9060d --- /dev/null +++ b/ql/src/test/queries/clientpositive/exchange_partition3.q @@ -0,0 +1,14 @@ +CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING); +CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1'); +ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='2'); +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; + +-- This will exchange both partitions hr=1 and hr=2 +ALTER TABLE exchange_part_test1 EXCHANGE PARTITION (ds='2013-04-05') WITH TABLE exchange_part_test2; +SHOW PARTITIONS exchange_part_test1; +SHOW PARTITIONS exchange_part_test2; diff --git a/ql/src/test/results/clientnegative/exchange_partition_neg_incomplete_partition.q.out b/ql/src/test/results/clientnegative/exchange_partition_neg_incomplete_partition.q.out new file mode 100644 index 0000000..8499427 --- /dev/null +++ b/ql/src/test/results/clientnegative/exchange_partition_neg_incomplete_partition.q.out @@ -0,0 +1,43 @@ +PREHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test1 +PREHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='h1') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='h1') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05/hr=h1 +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='h2') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='h2') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05/hr=h2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05/hr=h1 +ds=2013-04-05/hr=h2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +FAILED: SemanticException [Error 10234]: Parition values specifed are not continuous. A subpartition value is specified without specififying the parent partition's value {hr=h1} diff --git a/ql/src/test/results/clientnegative/exchange_partition_neg_partition_exists.q.out b/ql/src/test/results/clientnegative/exchange_partition_neg_partition_exists.q.out new file mode 100644 index 0000000..b8c3c139 --- /dev/null +++ b/ql/src/test/results/clientnegative/exchange_partition_neg_partition_exists.q.out @@ -0,0 +1,43 @@ +PREHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test1 +PREHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05 +PREHOOK: query: ALTER TABLE exchange_part_test2 ADD PARTITION (ds='2013-04-05') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test2 +POSTHOOK: query: ALTER TABLE exchange_part_test2 ADD PARTITION (ds='2013-04-05') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test2 +POSTHOOK: Output: default@exchange_part_test2@ds=2013-04-05 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05 +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05 +FAILED: SemanticException [Error 10118]: Partition already exists [exchange_part_test2(ds=2013-04-05)] diff --git a/ql/src/test/results/clientnegative/exchange_partition_neg_partition_exists2.q.out b/ql/src/test/results/clientnegative/exchange_partition_neg_partition_exists2.q.out new file mode 100644 index 0000000..93c3406 --- /dev/null +++ b/ql/src/test/results/clientnegative/exchange_partition_neg_partition_exists2.q.out @@ -0,0 +1,51 @@ +PREHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test1 +PREHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05/hr=1 +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='2') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='2') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05/hr=2 +PREHOOK: query: ALTER TABLE exchange_part_test2 ADD PARTITION (ds='2013-04-05', hr='3') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test2 +POSTHOOK: query: ALTER TABLE exchange_part_test2 ADD PARTITION (ds='2013-04-05', hr='3') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test2 +POSTHOOK: Output: default@exchange_part_test2@ds=2013-04-05/hr=3 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05/hr=1 +ds=2013-04-05/hr=2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05/hr=3 +FAILED: SemanticException [Error 10118]: Partition already exists [exchange_part_test2(ds=2013-04-05/hr=3)] diff --git a/ql/src/test/results/clientnegative/exchange_partition_neg_partition_exists3.q.out b/ql/src/test/results/clientnegative/exchange_partition_neg_partition_exists3.q.out new file mode 100644 index 0000000..d0959ef --- /dev/null +++ b/ql/src/test/results/clientnegative/exchange_partition_neg_partition_exists3.q.out @@ -0,0 +1,51 @@ +PREHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test1 +PREHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05/hr=1 +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='2') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='2') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05/hr=2 +PREHOOK: query: ALTER TABLE exchange_part_test2 ADD PARTITION (ds='2013-04-05', hr='1') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test2 +POSTHOOK: query: ALTER TABLE exchange_part_test2 ADD PARTITION (ds='2013-04-05', hr='1') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test2 +POSTHOOK: Output: default@exchange_part_test2@ds=2013-04-05/hr=1 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05/hr=1 +ds=2013-04-05/hr=2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05/hr=1 +FAILED: SemanticException [Error 10118]: Partition already exists [exchange_part_test2(ds=2013-04-05/hr=1)] diff --git a/ql/src/test/results/clientnegative/exchange_partition_neg_partition_missing.q.out b/ql/src/test/results/clientnegative/exchange_partition_neg_partition_missing.q.out new file mode 100644 index 0000000..3ecb78d --- /dev/null +++ b/ql/src/test/results/clientnegative/exchange_partition_neg_partition_missing.q.out @@ -0,0 +1,15 @@ +PREHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test1 +PREHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +FAILED: SemanticException [Error 10006]: Partition not found {ds=2013-04-05} diff --git a/ql/src/test/results/clientnegative/exchange_partition_neg_table_missing.q.out b/ql/src/test/results/clientnegative/exchange_partition_neg_table_missing.q.out new file mode 100644 index 0000000..9f1c87a --- /dev/null +++ b/ql/src/test/results/clientnegative/exchange_partition_neg_table_missing.q.out @@ -0,0 +1 @@ +FAILED: SemanticException [Error 10001]: Table not found t1 diff --git a/ql/src/test/results/clientnegative/exchange_partition_neg_table_missing2.q.out b/ql/src/test/results/clientnegative/exchange_partition_neg_table_missing2.q.out new file mode 100644 index 0000000..c4312ef --- /dev/null +++ b/ql/src/test/results/clientnegative/exchange_partition_neg_table_missing2.q.out @@ -0,0 +1,22 @@ +PREHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test1 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05 +FAILED: SemanticException [Error 10001]: Table not found exchange_part_test2 diff --git a/ql/src/test/results/clientnegative/exchange_partition_neg_test.q.out b/ql/src/test/results/clientnegative/exchange_partition_neg_test.q.out new file mode 100644 index 0000000..3889a68 --- /dev/null +++ b/ql/src/test/results/clientnegative/exchange_partition_neg_test.q.out @@ -0,0 +1,35 @@ +PREHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test1 +PREHOOK: query: CREATE TABLE exchange_part_test2 (f1 string, f2 string) PARTITIONED BY (ds STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test2 (f1 string, f2 string) PARTITIONED BY (ds STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05 +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +FAILED: SemanticException [Error 10235]: Tables have incompatible schemas and their partitions cannot be exchanged. diff --git a/ql/src/test/results/clientpositive/exchange_partition.q.out b/ql/src/test/results/clientpositive/exchange_partition.q.out new file mode 100644 index 0000000..bbc6d5b --- /dev/null +++ b/ql/src/test/results/clientpositive/exchange_partition.q.out @@ -0,0 +1,47 @@ +PREHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test1 +PREHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05 +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: ALTER TABLE exchange_part_test1 EXCHANGE PARTITION (ds='2013-04-05') WITH TABLE exchange_part_test2 +PREHOOK: type: null +POSTHOOK: query: ALTER TABLE exchange_part_test1 EXCHANGE PARTITION (ds='2013-04-05') WITH TABLE exchange_part_test2 +POSTHOOK: type: null +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05 diff --git a/ql/src/test/results/clientpositive/exchange_partition2.q.out b/ql/src/test/results/clientpositive/exchange_partition2.q.out new file mode 100644 index 0000000..5136106 --- /dev/null +++ b/ql/src/test/results/clientpositive/exchange_partition2.q.out @@ -0,0 +1,47 @@ +PREHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test1 +PREHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05/hr=1 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05/hr=1 +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: ALTER TABLE exchange_part_test1 EXCHANGE PARTITION (ds='2013-04-05', hr='1') WITH TABLE exchange_part_test2 +PREHOOK: type: null +POSTHOOK: query: ALTER TABLE exchange_part_test1 EXCHANGE PARTITION (ds='2013-04-05', hr='1') WITH TABLE exchange_part_test2 +POSTHOOK: type: null +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05/hr=1 diff --git a/ql/src/test/results/clientpositive/exchange_partition3.q.out b/ql/src/test/results/clientpositive/exchange_partition3.q.out new file mode 100644 index 0000000..72ac6bd --- /dev/null +++ b/ql/src/test/results/clientpositive/exchange_partition3.q.out @@ -0,0 +1,58 @@ +PREHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test1 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test1 +PREHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE exchange_part_test2 (f1 string) PARTITIONED BY (ds STRING, hr STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@exchange_part_test2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='1') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05/hr=1 +PREHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='2') +PREHOOK: type: ALTERTABLE_ADDPARTS +PREHOOK: Input: default@exchange_part_test1 +POSTHOOK: query: ALTER TABLE exchange_part_test1 ADD PARTITION (ds='2013-04-05', hr='2') +POSTHOOK: type: ALTERTABLE_ADDPARTS +POSTHOOK: Input: default@exchange_part_test1 +POSTHOOK: Output: default@exchange_part_test1@ds=2013-04-05/hr=2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05/hr=1 +ds=2013-04-05/hr=2 +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: -- This will exchange both partitions hr=1 and hr=2 +ALTER TABLE exchange_part_test1 EXCHANGE PARTITION (ds='2013-04-05') WITH TABLE exchange_part_test2 +PREHOOK: type: null +POSTHOOK: query: -- This will exchange both partitions hr=1 and hr=2 +ALTER TABLE exchange_part_test1 EXCHANGE PARTITION (ds='2013-04-05') WITH TABLE exchange_part_test2 +POSTHOOK: type: null +PREHOOK: query: SHOW PARTITIONS exchange_part_test1 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test1 +POSTHOOK: type: SHOWPARTITIONS +PREHOOK: query: SHOW PARTITIONS exchange_part_test2 +PREHOOK: type: SHOWPARTITIONS +POSTHOOK: query: SHOW PARTITIONS exchange_part_test2 +POSTHOOK: type: SHOWPARTITIONS +ds=2013-04-05/hr=1 +ds=2013-04-05/hr=2