Index: metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java (revision 1449149) +++ metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java (working copy) @@ -2029,7 +2029,9 @@ oldp.setValues(newp.getValues()); oldp.setPartitionName(newp.getPartitionName()); oldp.setParameters(newPart.getParameters()); - copyMSD(newp.getSd(), oldp.getSd()); + if (!TableType.VIRTUAL_VIEW.name().equals(oldp.getTable().getTableType())) { + copyMSD(newp.getSd(), oldp.getSd()); + } if (newp.getCreateTime() != oldp.getCreateTime()) { oldp.setCreateTime(newp.getCreateTime()); } Index: metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java =================================================================== --- metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java (revision 1449149) +++ metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java (working copy) @@ -586,7 +586,107 @@ } + public void testAlterViewParititon() throws Throwable { + String dbName = "compdb"; + String tblName = "comptbl"; + String viewName = "compView"; + client.dropTable(dbName, tblName); + silentDropDatabase(dbName); + Database db = new Database(); + db.setName(dbName); + db.setDescription("Alter Partition Test database"); + client.createDatabase(db); + + ArrayList cols = new ArrayList(2); + cols.add(new FieldSchema("name", serdeConstants.STRING_TYPE_NAME, "")); + cols.add(new FieldSchema("income", serdeConstants.INT_TYPE_NAME, "")); + + Table tbl = new Table(); + tbl.setDbName(dbName); + tbl.setTableName(tblName); + StorageDescriptor sd = new StorageDescriptor(); + tbl.setSd(sd); + sd.setCols(cols); + sd.setCompressed(false); + sd.setParameters(new HashMap()); + sd.setSerdeInfo(new SerDeInfo()); + sd.getSerdeInfo().setName(tbl.getTableName()); + sd.getSerdeInfo().setParameters(new HashMap()); + sd.getSerdeInfo().getParameters() + .put(serdeConstants.SERIALIZATION_FORMAT, "1"); + sd.setSortCols(new ArrayList()); + + client.createTable(tbl); + + if (isThriftClient) { + // the createTable() above does not update the location in the 'tbl' + // object when the client is a thrift client and the code below relies + // on the location being present in the 'tbl' object - so get the table + // from the metastore + tbl = client.getTable(dbName, tblName); + } + + ArrayList viewCols = new ArrayList(1); + viewCols.add(new FieldSchema("income", serdeConstants.INT_TYPE_NAME, "")); + + ArrayList viewPartitionCols = new ArrayList(1); + viewPartitionCols.add(new FieldSchema("name", serdeConstants.STRING_TYPE_NAME, "")); + + Table view = new Table(); + view.setDbName(dbName); + view.setTableName(viewName); + view.setTableType(TableType.VIRTUAL_VIEW.name()); + view.setPartitionKeys(viewPartitionCols); + view.setViewOriginalText("SELECT income, name FROM " + tblName); + view.setViewExpandedText("SELECT `" + tblName + "`.`income`, `" + tblName + + "`.`name` FROM `" + dbName + "`.`" + tblName + "`"); + StorageDescriptor viewSd = new StorageDescriptor(); + view.setSd(viewSd); + viewSd.setCols(viewCols); + viewSd.setCompressed(false); + viewSd.setParameters(new HashMap()); + viewSd.setSerdeInfo(new SerDeInfo()); + viewSd.getSerdeInfo().setParameters(new HashMap()); + + client.createTable(view); + + if (isThriftClient) { + // the createTable() above does not update the location in the 'tbl' + // object when the client is a thrift client and the code below relies + // on the location being present in the 'tbl' object - so get the table + // from the metastore + view = client.getTable(dbName, viewName); + } + + List vals = new ArrayList(1); + vals.add("abc"); + + Partition part = new Partition(); + part.setDbName(dbName); + part.setTableName(viewName); + part.setValues(vals); + part.setParameters(new HashMap()); + + client.add_partition(part); + + Partition part2 = client.getPartition(dbName, viewName, part.getValues()); + + part2.getParameters().put("a", "b"); + + client.alter_partition(dbName, viewName, part2); + + Partition part3 = client.getPartition(dbName, viewName, part.getValues()); + assertEquals("couldn't view alter partition", part3.getParameters().get( + "a"), "b"); + + client.dropTable(dbName, viewName); + + client.dropTable(dbName, tblName); + + client.dropDatabase(dbName); + } + public void testAlterPartition() throws Throwable { try {