Author: namit Date: Thu Feb 28 11:07:23 2013 New Revision: 1451173 URL: http://svn.apache.org/r1451173 Log: HIVE-4079 Altering a view partition fails with NPE (Kevin Wilfong via namit)
Modified: hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java hive/trunk/metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java Modified: hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java?rev=1451173&r1=1451172&r2=1451173&view=diff ============================================================================== --- hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java (original) +++ hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java Thu Feb 28 11:07:23 2013 @@ -2029,7 +2029,9 @@ public class ObjectStore implements RawS 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()); } Modified: hive/trunk/metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java?rev=1451173&r1=1451172&r2=1451173&view=diff ============================================================================== --- hive/trunk/metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java (original) +++ hive/trunk/metastore/src/test/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java Thu Feb 28 11:07:23 2013 @@ -586,6 +586,106 @@ public abstract class TestHiveMetaStore } + 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<FieldSchema> cols = new ArrayList<FieldSchema>(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<String, String>()); + sd.setSerdeInfo(new SerDeInfo()); + sd.getSerdeInfo().setName(tbl.getTableName()); + sd.getSerdeInfo().setParameters(new HashMap<String, String>()); + sd.getSerdeInfo().getParameters() + .put(serdeConstants.SERIALIZATION_FORMAT, "1"); + sd.setSortCols(new ArrayList<Order>()); + + 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<FieldSchema> viewCols = new ArrayList<FieldSchema>(1); + viewCols.add(new FieldSchema("income", serdeConstants.INT_TYPE_NAME, "")); + + ArrayList<FieldSchema> viewPartitionCols = new ArrayList<FieldSchema>(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<String, String>()); + viewSd.setSerdeInfo(new SerDeInfo()); + viewSd.getSerdeInfo().setParameters(new HashMap<String, String>()); + + 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<String> vals = new ArrayList<String>(1); + vals.add("abc"); + + Partition part = new Partition(); + part.setDbName(dbName); + part.setTableName(viewName); + part.setValues(vals); + part.setParameters(new HashMap<String, String>()); + + 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 {