diff --git common/src/java/org/apache/hadoop/hive/conf/HiveConf.java common/src/java/org/apache/hadoop/hive/conf/HiveConf.java index 2508f2b..f3daecb 100644 --- common/src/java/org/apache/hadoop/hive/conf/HiveConf.java +++ common/src/java/org/apache/hadoop/hive/conf/HiveConf.java @@ -106,6 +106,9 @@ public class HiveConf extends Configuration { // run in local mode only if number of tasks (for map and reduce each) is // less than this LOCALMODEMAXTASKS("hive.exec.mode.local.auto.tasks.max", 4), + // if true, DROP TABLE/VIEW does not fail if table/view doesn't exist and IF EXISTS is + // not specified + DROPIGNORESNONEXISTENT("hive.exec.drop.ignorenonexistent", true), // hadoop stuff HADOOPBIN("hadoop.bin.path", System.getenv("HADOOP_HOME") + "/bin/hadoop"), diff --git conf/hive-default.xml conf/hive-default.xml index fdc9a82..f76e2db 100644 --- conf/hive-default.xml +++ conf/hive-default.xml @@ -761,6 +761,14 @@ + hive.exec.drop.ignorenonexistent + true + + Do not report an error if DROP TABLE/VIEW specifies a non-existent table/view + + + + hive.exec.show.job.failure.debug.info false diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java index cbd9d62..141d9ff 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java @@ -319,9 +319,13 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer { private void analyzeDropTable(ASTNode ast, boolean expectView) throws SemanticException { String tableName = unescapeIdentifier(ast.getChild(0).getText()); + boolean ifExists = (ast.getFirstChildWithType(TOK_IFEXISTS) != null); + // we want to signal an error if the table/view doesn't exist and we're + // configured not to fail silently + boolean throwException = + !ifExists && !HiveConf.getBoolVar(conf, ConfVars.DROPIGNORESNONEXISTENT); try { - Table tab = db.getTable(db.getCurrentDatabase(), tableName, false); - // Ignore if table does not exist + Table tab = db.getTable(db.getCurrentDatabase(), tableName, throwException); if (tab != null) { inputs.add(new ReadEntity(tab)); outputs.add(new WriteEntity(tab)); diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g index 6b47702..2551261 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g +++ ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g @@ -434,7 +434,7 @@ dropIndexStatement dropTableStatement @init { msgs.push("drop statement"); } @after { msgs.pop(); } - : KW_DROP KW_TABLE Identifier -> ^(TOK_DROPTABLE Identifier) + : KW_DROP KW_TABLE ifExists? Identifier -> ^(TOK_DROPTABLE Identifier ifExists?) ; alterStatement @@ -763,8 +763,7 @@ createViewStatement dropViewStatement @init { msgs.push("drop view statement"); } @after { msgs.pop(); } - : KW_DROP KW_VIEW Identifier - -> ^(TOK_DROPVIEW Identifier) + : KW_DROP KW_VIEW ifExists? Identifier -> ^(TOK_DROPVIEW Identifier ifExists?) ; showStmtIdentifier diff --git ql/src/test/queries/clientnegative/drop_table_failure1.q ql/src/test/queries/clientnegative/drop_table_failure1.q new file mode 100644 index 0000000..d47c08b --- /dev/null +++ ql/src/test/queries/clientnegative/drop_table_failure1.q @@ -0,0 +1,3 @@ +set hive.exec.drop.ignorenonexistent=false; +-- Can't use DROP TABLE if the table doesn't exist and IF EXISTS isn't specified +DROP TABLE UnknownTable; diff --git ql/src/test/queries/clientnegative/drop_table_failure2.q ql/src/test/queries/clientnegative/drop_table_failure2.q new file mode 100644 index 0000000..631e4ff --- /dev/null +++ ql/src/test/queries/clientnegative/drop_table_failure2.q @@ -0,0 +1,3 @@ +CREATE VIEW xxx6 AS SELECT key FROM src; +-- Can't use DROP TABLE on a view +DROP TABLE xxx6; diff --git ql/src/test/queries/clientnegative/drop_view_failure2.q ql/src/test/queries/clientnegative/drop_view_failure2.q index e8e78a3..93bb162 100644 --- ql/src/test/queries/clientnegative/drop_view_failure2.q +++ ql/src/test/queries/clientnegative/drop_view_failure2.q @@ -1,5 +1,3 @@ -DROP VIEW xxx6; - --- Can't use DROP TABLE on a view -CREATE VIEW xxx6 AS SELECT key FROM src; -DROP TABLE xxx6; +SET hive.exec.drop.ignorenonexistent=false; +-- Can't use DROP VIEW if the view doesn't exist and IF EXISTS isn't specified +DROP VIEW UnknownView; diff --git ql/src/test/queries/clientpositive/drop_table.q ql/src/test/queries/clientpositive/drop_table.q new file mode 100644 index 0000000..2eba403 --- /dev/null +++ ql/src/test/queries/clientpositive/drop_table.q @@ -0,0 +1,2 @@ +SET hive.exec.dropfailssilently=false; +DROP TABLE IF EXISTS UnknownTable; diff --git ql/src/test/queries/clientpositive/drop_view.q ql/src/test/queries/clientpositive/drop_view.q new file mode 100644 index 0000000..12337df --- /dev/null +++ ql/src/test/queries/clientpositive/drop_view.q @@ -0,0 +1,2 @@ +SET hive.exec.dropfailssilently=false; +DROP VIEW IF EXISTS UnknownView; diff --git ql/src/test/results/clientnegative/drop_table_failure1.q.out ql/src/test/results/clientnegative/drop_table_failure1.q.out new file mode 100644 index 0000000..c9a141b --- /dev/null +++ ql/src/test/results/clientnegative/drop_table_failure1.q.out @@ -0,0 +1 @@ +FAILED: Error in semantic analysis: Table not found UnknownTable diff --git ql/src/test/results/clientnegative/drop_table_failure2.q.out ql/src/test/results/clientnegative/drop_table_failure2.q.out new file mode 100644 index 0000000..9b63102 --- /dev/null +++ ql/src/test/results/clientnegative/drop_table_failure2.q.out @@ -0,0 +1,14 @@ +PREHOOK: query: CREATE VIEW xxx6 AS SELECT key FROM src +PREHOOK: type: CREATEVIEW +PREHOOK: Output: file:/var/folders/zs/zslcAnKJHzGpoX+3OhC8UU+++TI/-Tmp-/mkornacker/hive_2010-12-16_16-00-37_558_8494052575804500264/-mr-10000 +POSTHOOK: query: CREATE VIEW xxx6 AS SELECT key FROM src +POSTHOOK: type: CREATEVIEW +POSTHOOK: Output: default@xxx6 +POSTHOOK: Output: file:/var/folders/zs/zslcAnKJHzGpoX+3OhC8UU+++TI/-Tmp-/mkornacker/hive_2010-12-16_16-00-37_558_8494052575804500264/-mr-10000 +PREHOOK: query: -- Can't use DROP TABLE on a view +DROP TABLE xxx6 +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@xxx6 +PREHOOK: Output: default@xxx6 +FAILED: Error in metadata: Cannot drop a view with DROP TABLE +FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask diff --git ql/src/test/results/clientnegative/drop_view_failure2.q.out ql/src/test/results/clientnegative/drop_view_failure2.q.out index 80903f9..644e3f0 100644 --- ql/src/test/results/clientnegative/drop_view_failure2.q.out +++ ql/src/test/results/clientnegative/drop_view_failure2.q.out @@ -1,19 +1 @@ -PREHOOK: query: DROP VIEW xxx6 -PREHOOK: type: DROPVIEW -POSTHOOK: query: DROP VIEW xxx6 -POSTHOOK: type: DROPVIEW -PREHOOK: query: -- Can't use DROP TABLE on a view -CREATE VIEW xxx6 AS SELECT key FROM src -PREHOOK: type: CREATEVIEW -PREHOOK: Output: file:/tmp/njain/hive_2010-08-16_23-08-27_750_3628035822001608649/-mr-10000 -POSTHOOK: query: -- Can't use DROP TABLE on a view -CREATE VIEW xxx6 AS SELECT key FROM src -POSTHOOK: type: CREATEVIEW -POSTHOOK: Output: file:/tmp/njain/hive_2010-08-16_23-08-27_750_3628035822001608649/-mr-10000 -POSTHOOK: Output: default@xxx6 -PREHOOK: query: DROP TABLE xxx6 -PREHOOK: type: DROPTABLE -PREHOOK: Input: default@xxx6 -PREHOOK: Output: default@xxx6 -FAILED: Error in metadata: Cannot drop a view with DROP TABLE -FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask +FAILED: Error in semantic analysis: Table not found UnknownView diff --git ql/src/test/results/clientpositive/drop_table.q.out ql/src/test/results/clientpositive/drop_table.q.out new file mode 100644 index 0000000..cc90ece --- /dev/null +++ ql/src/test/results/clientpositive/drop_table.q.out @@ -0,0 +1,4 @@ +PREHOOK: query: DROP TABLE IF EXISTS UnknownTable +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE IF EXISTS UnknownTable +POSTHOOK: type: DROPTABLE diff --git ql/src/test/results/clientpositive/drop_view.q.out ql/src/test/results/clientpositive/drop_view.q.out new file mode 100644 index 0000000..1c457dd --- /dev/null +++ ql/src/test/results/clientpositive/drop_view.q.out @@ -0,0 +1,4 @@ +PREHOOK: query: DROP VIEW IF EXISTS UnknownView +PREHOOK: type: DROPVIEW +POSTHOOK: query: DROP VIEW IF EXISTS UnknownView +POSTHOOK: type: DROPVIEW