diff --git common/src/java/org/apache/hadoop/hive/conf/HiveConf.java common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
index 2508f2b..0899c65 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
+ DROPFAILSSILENTLY("hive.exec.dropfailssilently", 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..1aa048a 100644
--- conf/hive-default.xml
+++ conf/hive-default.xml
@@ -761,6 +761,14 @@
+ hive.exec.dropfailssilently
+ 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..5b612d8 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,12 @@ 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.DROPFAILSSILENTLY);
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..6cdddc0 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,8 @@ dropIndexStatement
dropTableStatement
@init { msgs.push("drop statement"); }
@after { msgs.pop(); }
- : KW_DROP KW_TABLE Identifier -> ^(TOK_DROPTABLE Identifier)
+ : KW_DROP KW_TABLE Identifier ifExists?
+ -> ^(TOK_DROPTABLE Identifier ifExists?)
;
alterStatement
@@ -763,8 +764,8 @@ createViewStatement
dropViewStatement
@init { msgs.push("drop view statement"); }
@after { msgs.pop(); }
- : KW_DROP KW_VIEW Identifier
- -> ^(TOK_DROPVIEW Identifier)
+ : KW_DROP KW_VIEW Identifier ifExists?
+ -> ^(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..5b50c78
--- /dev/null
+++ ql/src/test/queries/clientnegative/drop_table_failure1.q
@@ -0,0 +1,3 @@
+set hive.exec.dropfailssilently=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..0f9f882 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.dropfailssilently=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..08fc86e
--- /dev/null
+++ ql/src/test/queries/clientpositive/drop_table.q
@@ -0,0 +1,2 @@
+SET hive.exec.dropfailssilently=false;
+DROP TABLE UnknownTable IF EXISTS;
diff --git ql/src/test/queries/clientpositive/drop_view.q ql/src/test/queries/clientpositive/drop_view.q
new file mode 100644
index 0000000..eea2f6c
--- /dev/null
+++ ql/src/test/queries/clientpositive/drop_view.q
@@ -0,0 +1,2 @@
+SET hive.exec.dropfailssilently=false;
+DROP VIEW UnknownView IF EXISTS;
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..b03e086
--- /dev/null
+++ ql/src/test/results/clientpositive/drop_table.q.out
@@ -0,0 +1,4 @@
+PREHOOK: query: DROP TABLE UnknownTable IF EXISTS
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE UnknownTable IF EXISTS
+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..d14ffc2
--- /dev/null
+++ ql/src/test/results/clientpositive/drop_view.q.out
@@ -0,0 +1,4 @@
+PREHOOK: query: DROP VIEW UnknownView IF EXISTS
+PREHOOK: type: DROPVIEW
+POSTHOOK: query: DROP VIEW UnknownView IF EXISTS
+POSTHOOK: type: DROPVIEW