Index: metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java =================================================================== --- metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java (revision 1143958) +++ metastore/src/java/org/apache/hadoop/hive/metastore/HiveAlterHandler.java (working copy) @@ -108,6 +108,7 @@ // not an external table, that means user is asking metastore // to move data to new location corresponding to the new name if (rename + && !oldt.getTableType().equals("VIRTUAL_VIEW") && (oldt.getSd().getLocation().compareTo(newt.getSd().getLocation()) == 0 || StringUtils.isEmpty(newt.getSd().getLocation())) && !MetaStoreUtils.isExternalTable(oldt)) { Index: ql/src/test/results/clientnegative/alter_view_failure9.q.out =================================================================== --- ql/src/test/results/clientnegative/alter_view_failure9.q.out (revision 0) +++ ql/src/test/results/clientnegative/alter_view_failure9.q.out (revision 0) @@ -0,0 +1,22 @@ +PREHOOK: query: DROP VIEW xxx4 +PREHOOK: type: DROPVIEW +POSTHOOK: query: DROP VIEW xxx4 +POSTHOOK: type: DROPVIEW +PREHOOK: query: CREATE VIEW xxx4 +AS +SELECT * FROM src +PREHOOK: type: CREATEVIEW +PREHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-07_12-15-48_683_5899334144357618678/-mr-10000 +POSTHOOK: query: CREATE VIEW xxx4 +AS +SELECT * FROM src +POSTHOOK: type: CREATEVIEW +POSTHOOK: Output: default@xxx4 +POSTHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-07_12-15-48_683_5899334144357618678/-mr-10000 +PREHOOK: query: -- should fail: need to use ALTER VIEW, not ALTER TABLE +ALTER TABLE xxx4 RENAME TO xxx4a +PREHOOK: type: ALTERTABLE_RENAME +PREHOOK: Input: default@xxx4 +PREHOOK: Output: default@xxx4 +FAILED: Error in metadata: Cannot alter a view with ALTER TABLE +FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask Index: ql/src/test/results/clientnegative/alter_view_failure8.q.out =================================================================== --- ql/src/test/results/clientnegative/alter_view_failure8.q.out (revision 0) +++ ql/src/test/results/clientnegative/alter_view_failure8.q.out (revision 0) @@ -0,0 +1,13 @@ +PREHOOK: query: -- should fail: can't use ALTER VIEW on a table +CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: -- should fail: can't use ALTER VIEW on a table +CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@invites +PREHOOK: query: ALTER VIEW invites RENAME TO invites2 +PREHOOK: type: null +PREHOOK: Input: default@invites +PREHOOK: Output: default@invites +FAILED: Error in metadata: Cannot alter a base table with ALTER VIEW +FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask Index: ql/src/test/results/clientpositive/alter_view_rename.q.out =================================================================== --- ql/src/test/results/clientpositive/alter_view_rename.q.out (revision 0) +++ ql/src/test/results/clientpositive/alter_view_rename.q.out (revision 0) @@ -0,0 +1,55 @@ +PREHOOK: query: CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING) +PREHOOK: type: CREATETABLE +POSTHOOK: query: CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: default@invites +PREHOOK: query: CREATE VIEW view1 as SELECT * FROM invites +PREHOOK: type: CREATEVIEW +PREHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-07_12-03-37_603_2679672423003275735/-mr-10000 +POSTHOOK: query: CREATE VIEW view1 as SELECT * FROM invites +POSTHOOK: type: CREATEVIEW +POSTHOOK: Output: default@view1 +POSTHOOK: Output: file:/var/folders/fe/fefl-ow3ElaEd1ns0G7jB0uewEQ/-Tmp-/charleschen/hive_2011-07-07_12-03-37_603_2679672423003275735/-mr-10000 +PREHOOK: query: DESCRIBE EXTENDED view1 +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE EXTENDED view1 +POSTHOOK: type: DESCTABLE +foo int +bar string +ds string + +Detailed Table Information Table(tableName:view1, dbName:default, owner:charleschen, createTime:1310065417, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:foo, type:int, comment:null), FieldSchema(name:bar, type:string, comment:null), FieldSchema(name:ds, type:string, comment:null)], location:null, inputFormat:org.apache.hadoop.mapred.SequenceFileInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:null, parameters:{}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{transient_lastDdlTime=1310065417}, viewOriginalText:SELECT * FROM invites, viewExpandedText:SELECT `invites`.`foo`, `invites`.`bar`, `invites`.`ds` FROM `invites`, tableType:VIRTUAL_VIEW) +PREHOOK: query: ALTER VIEW view1 RENAME TO view2 +PREHOOK: type: null +PREHOOK: Input: default@view1 +PREHOOK: Output: default@view1 +POSTHOOK: query: ALTER VIEW view1 RENAME TO view2 +POSTHOOK: type: null +POSTHOOK: Input: default@view1 +POSTHOOK: Output: default@view1 +POSTHOOK: Output: default@view2 +PREHOOK: query: DESCRIBE EXTENDED view2 +PREHOOK: type: DESCTABLE +POSTHOOK: query: DESCRIBE EXTENDED view2 +POSTHOOK: type: DESCTABLE +foo int +bar string +ds string + +Detailed Table Information Table(tableName:view2, dbName:default, owner:charleschen, createTime:1310065417, lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:foo, type:int, comment:null), FieldSchema(name:bar, type:string, comment:null), FieldSchema(name:ds, type:string, comment:null)], location:null, inputFormat:org.apache.hadoop.mapred.SequenceFileInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:null, parameters:{}), bucketCols:[], sortCols:[], parameters:{}), partitionKeys:[], parameters:{last_modified_by=charleschen, last_modified_time=1310065417, transient_lastDdlTime=1310065417}, viewOriginalText:SELECT * FROM invites, viewExpandedText:SELECT `invites`.`foo`, `invites`.`bar`, `invites`.`ds` FROM `invites`, tableType:VIRTUAL_VIEW) +PREHOOK: query: DROP TABLE invites +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@invites +PREHOOK: Output: default@invites +POSTHOOK: query: DROP TABLE invites +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@invites +POSTHOOK: Output: default@invites +PREHOOK: query: DROP VIEW view2 +PREHOOK: type: DROPVIEW +PREHOOK: Input: default@view2 +PREHOOK: Output: default@view2 +POSTHOOK: query: DROP VIEW view2 +POSTHOOK: type: DROPVIEW +POSTHOOK: Input: default@view2 +POSTHOOK: Output: default@view2 Index: ql/src/test/queries/clientnegative/alter_view_failure8.q =================================================================== --- ql/src/test/queries/clientnegative/alter_view_failure8.q (revision 0) +++ ql/src/test/queries/clientnegative/alter_view_failure8.q (revision 0) @@ -0,0 +1,3 @@ +-- should fail: can't use ALTER VIEW on a table +CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING); +ALTER VIEW invites RENAME TO invites2; Index: ql/src/test/queries/clientnegative/alter_view_failure9.q =================================================================== --- ql/src/test/queries/clientnegative/alter_view_failure9.q (revision 0) +++ ql/src/test/queries/clientnegative/alter_view_failure9.q (revision 0) @@ -0,0 +1,7 @@ +DROP VIEW xxx4; +CREATE VIEW xxx4 +AS +SELECT * FROM src; + +-- should fail: need to use ALTER VIEW, not ALTER TABLE +ALTER TABLE xxx4 RENAME TO xxx4a; Index: ql/src/test/queries/clientpositive/alter_view_rename.q =================================================================== --- ql/src/test/queries/clientpositive/alter_view_rename.q (revision 0) +++ ql/src/test/queries/clientpositive/alter_view_rename.q (revision 0) @@ -0,0 +1,9 @@ +CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING); +CREATE VIEW view1 as SELECT * FROM invites; +DESCRIBE EXTENDED view1; + +ALTER VIEW view1 RENAME TO view2; +DESCRIBE EXTENDED view2; + +DROP TABLE invites; +DROP VIEW view2; \ No newline at end of file Index: ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (revision 1143958) +++ ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (working copy) @@ -1458,6 +1458,7 @@ case ADDPARTITION: case DROPPARTITION: case ADDPROPS: + case RENAME: // allow this form break; default: Index: ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java (revision 1143958) +++ ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java (working copy) @@ -108,10 +108,11 @@ * @param newName * new name of the table */ - public AlterTableDesc(String oldName, String newName) { + public AlterTableDesc(String oldName, String newName, boolean expectView) { op = AlterTableTypes.RENAME; this.oldName = oldName; this.newName = newName; + this.expectView = expectView; } /** @@ -152,7 +153,7 @@ * new table input format * @param outputFormat * new table output format - * @param partSpec + * @param partSpec */ public AlterTableDesc(String name, String inputFormat, String outputFormat, String serdeName, String storageHandler, HashMap partSpec) { Index: ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (revision 1143958) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (working copy) @@ -186,6 +186,7 @@ TOK_ALTERVIEW_PROPERTIES; TOK_ALTERVIEW_ADDPARTS; TOK_ALTERVIEW_DROPPARTS; +TOK_ALTERVIEW_RENAME; TOK_VIEWPARTCOLS; TOK_EXPLAIN; TOK_TABLESERIALIZER; @@ -561,6 +562,8 @@ @init { msgs.push("alter view statement"); } @after { msgs.pop(); } : alterViewSuffixProperties + | alterStatementSuffixRename + -> ^(TOK_ALTERVIEW_RENAME alterStatementSuffixRename) | alterStatementSuffixAddPartitions -> ^(TOK_ALTERVIEW_ADDPARTS alterStatementSuffixAddPartitions) | alterStatementSuffixDropPartitions Index: ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java (revision 1143958) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzerFactory.java (working copy) @@ -31,7 +31,7 @@ public final class SemanticAnalyzerFactory { static HashMap commandType = new HashMap(); - static HashMap tablePartitionCommandType = new HashMap(); + static HashMap tablePartitionCommandType = new HashMap(); static { commandType.put(HiveParser.TOK_EXPLAIN, HiveOperation.EXPLAIN); @@ -147,6 +147,7 @@ case HiveParser.TOK_ALTERVIEW_PROPERTIES: case HiveParser.TOK_ALTERVIEW_ADDPARTS: case HiveParser.TOK_ALTERVIEW_DROPPARTS: + case HiveParser.TOK_ALTERVIEW_RENAME: case HiveParser.TOK_SHOWDATABASES: case HiveParser.TOK_SHOWTABLES: case HiveParser.TOK_SHOW_TABLESTATUS: Index: ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java =================================================================== --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java (revision 1143958) +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java (working copy) @@ -260,8 +260,13 @@ // view from table; unwrap it now analyzeAlterTableDropParts((ASTNode) ast.getChild(0), true); break; + case HiveParser.TOK_ALTERVIEW_RENAME: + // for ALTER VIEW RENAME, we wrapped the DROP to discriminate + // view from table; unwrap it now + analyzeAlterTableRename(((ASTNode) ast.getChild(0)), true); + break; case HiveParser.TOK_ALTERTABLE_RENAME: - analyzeAlterTableRename(ast); + analyzeAlterTableRename(ast, false); break; case HiveParser.TOK_ALTERTABLE_TOUCH: analyzeAlterTableTouch(ast); @@ -1619,10 +1624,10 @@ } - private void analyzeAlterTableRename(ASTNode ast) throws SemanticException { + private void analyzeAlterTableRename(ASTNode ast, boolean expectView) throws SemanticException { String tblName = getUnescapedName((ASTNode)ast.getChild(0)); AlterTableDesc alterTblDesc = new AlterTableDesc(tblName, - getUnescapedName((ASTNode)ast.getChild(1))); + getUnescapedName((ASTNode)ast.getChild(1)), expectView); try { Table tab = db.getTable(db.getCurrentDatabase(), tblName, false); if (tab != null) {