You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by pa...@apache.org on 2016/07/23 04:58:43 UTC

[3/6] drill git commit: DRILL-4673: Implement "DROP TABLE IF EXISTS" for drill to prevent FAILED status on command return - implement DROP TABLE IF EXISTS and DROP VIEW IF EXISTS; - added unit test for DROP TABLE IF EXISTS; - added unit test for DROP VIE

DRILL-4673: Implement "DROP TABLE IF EXISTS" for drill to prevent FAILED status on command return - implement DROP TABLE IF EXISTS and DROP VIEW IF EXISTS; - added unit test for DROP TABLE IF EXISTS; - added unit test for DROP VIEW IF EXISTS; - added unit test for "IF" hive UDF.

This closes #541


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/f36fec97
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/f36fec97
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/f36fec97

Branch: refs/heads/master
Commit: f36fec9750fedd00a063f26b9998f9a994d025ad
Parents: 5ca2340
Author: Vitalii Diravka <vi...@gmail.com>
Authored: Fri May 13 19:24:31 2016 +0000
Committer: Parth Chandra <pa...@apache.org>
Committed: Fri Jul 22 21:28:08 2016 -0700

----------------------------------------------------------------------
 .../drill/exec/fn/hive/TestInbuiltHiveUDFs.java | 12 ++++-
 exec/java-exec/src/main/codegen/data/Parser.tdd |  3 +-
 .../src/main/codegen/includes/parserImpls.ftl   | 16 +++---
 .../planner/sql/handlers/DropTableHandler.java  | 22 +++++++--
 .../exec/planner/sql/handlers/ViewHandler.java  | 33 ++++++++-----
 .../sql/parser/CompoundIdentifierConverter.java |  4 +-
 .../exec/planner/sql/parser/SqlDropTable.java   | 27 +++++++++--
 .../exec/planner/sql/parser/SqlDropView.java    | 30 +++++++++---
 .../java/org/apache/drill/TestDropTable.java    | 51 ++++++++++++++++++++
 .../drill/exec/sql/TestBaseViewSupport.java     | 44 +++++++++++++++++
 .../apache/drill/exec/sql/TestViewSupport.java  | 31 ++++++++++++
 11 files changed, 233 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/f36fec97/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/fn/hive/TestInbuiltHiveUDFs.java
----------------------------------------------------------------------
diff --git a/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/fn/hive/TestInbuiltHiveUDFs.java b/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/fn/hive/TestInbuiltHiveUDFs.java
index 93c9374..9e13844 100644
--- a/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/fn/hive/TestInbuiltHiveUDFs.java
+++ b/contrib/storage-hive/core/src/test/java/org/apache/drill/exec/fn/hive/TestInbuiltHiveUDFs.java
@@ -23,7 +23,6 @@ import org.apache.drill.TestBuilder;
 import org.apache.drill.common.expression.SchemaPath;
 import org.apache.drill.common.types.TypeProtos;
 import org.apache.drill.exec.hive.HiveTestBase;
-import org.apache.drill.exec.rpc.user.QueryDataBatch;
 import org.junit.Test;
 
 import java.util.List;
@@ -84,4 +83,15 @@ public class TestInbuiltHiveUDFs extends HiveTestBase {
             "first_name","Bh","last_name","Venkata","position","Store"))
         .go();
   }
+
+  @Test // DRILL-3272
+  public void testIf() throws Exception {
+    testBuilder()
+        .sqlQuery("select `if`(1999 > 2000, 'latest', 'old') Period from hive.kv limit 1")
+        .ordered()
+        .baselineColumns("Period")
+        .baselineValues("old")
+        .go();
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/f36fec97/exec/java-exec/src/main/codegen/data/Parser.tdd
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/data/Parser.tdd b/exec/java-exec/src/main/codegen/data/Parser.tdd
index 84b3dce..ce3ee4c 100644
--- a/exec/java-exec/src/main/codegen/data/Parser.tdd
+++ b/exec/java-exec/src/main/codegen/data/Parser.tdd
@@ -37,7 +37,8 @@
     "FILES",
     "REFRESH",
     "METADATA",
-    "DATABASE"
+    "DATABASE",
+    "IF"
   ]
 
   # List of methods for parsing custom SQL statements.

http://git-wip-us.apache.org/repos/asf/drill/blob/f36fec97/exec/java-exec/src/main/codegen/includes/parserImpls.ftl
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/codegen/includes/parserImpls.ftl b/exec/java-exec/src/main/codegen/includes/parserImpls.ftl
index 3a9424b..9901098 100644
--- a/exec/java-exec/src/main/codegen/includes/parserImpls.ftl
+++ b/exec/java-exec/src/main/codegen/includes/parserImpls.ftl
@@ -196,18 +196,20 @@ SqlNode SqlCreateOrReplaceView() :
 }
 
 /**
- * Parses a drop view statement.
- * DROP VIEW view_name;
+ * Parses a drop view or drop view if exists statement.
+ * DROP VIEW [IF EXISTS] view_name;
  */
 SqlNode SqlDropView() :
 {
     SqlParserPos pos;
+    boolean viewExistenceCheck = false;
 }
 {
     <DROP> { pos = getPos(); }
     <VIEW>
+    [ <IF> <EXISTS> { viewExistenceCheck = true; } ]
     {
-        return new SqlDropView(pos, CompoundIdentifier());
+        return new SqlDropView(pos, CompoundIdentifier(), viewExistenceCheck);
     }
 }
 
@@ -242,18 +244,20 @@ SqlNode SqlCreateTable() :
 }
 
 /**
- * Parses a drop table statement.
- * DROP TABLE table_name;
+ * Parses a drop table or drop table if exists statement.
+ * DROP TABLE [IF EXISTS] table_name;
  */
 SqlNode SqlDropTable() :
 {
     SqlParserPos pos;
+    boolean tableExistenceCheck = false;
 }
 {
     <DROP> { pos = getPos(); }
     <TABLE>
+    [ <IF> <EXISTS> { tableExistenceCheck = true; } ]
     {
-        return new SqlDropTable(pos, CompoundIdentifier());
+        return new SqlDropTable(pos, CompoundIdentifier(), tableExistenceCheck);
     }
 }
 

http://git-wip-us.apache.org/repos/asf/drill/blob/f36fec97/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DropTableHandler.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DropTableHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DropTableHandler.java
index 7684cb3..517c183 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DropTableHandler.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/DropTableHandler.java
@@ -19,7 +19,9 @@ package org.apache.drill.exec.planner.sql.handlers;
 
 import java.io.IOException;
 
+import org.apache.calcite.schema.Schema;
 import org.apache.calcite.schema.SchemaPlus;
+import org.apache.calcite.schema.Table;
 import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.tools.RelConversionException;
@@ -41,10 +43,12 @@ public class DropTableHandler extends DefaultSqlHandler {
   }
 
   /**
-   * Function resolves the schema and invokes the drop method. Raises an exception if the schema is
-   * immutable.
-   * @param sqlNode - Table name identifier
-   * @return - Single row indicating drop succeeded, raise exception otherwise
+   * Function resolves the schema and invokes the drop method
+   * (while IF EXISTS statement is used function invokes the drop method only if table exists).
+   * Raises an exception if the schema is immutable.
+   * @param sqlNode - SqlDropTable (SQL parse tree of drop table [if exists] query)
+   * @return - Single row indicating drop succeeded or table is not found while IF EXISTS statement is used,
+   * raise exception otherwise
    * @throws ValidationException
    * @throws RelConversionException
    * @throws IOException
@@ -62,13 +66,21 @@ public class DropTableHandler extends DefaultSqlHandler {
       drillSchema = SchemaUtilites.resolveToMutableDrillSchema(defaultSchema, dropTableNode.getSchema());
     }
 
-    String tableName = ((SqlDropTable) sqlNode).getName();
+    String tableName = dropTableNode.getName();
     if (drillSchema == null) {
       throw UserException.validationError()
           .message("Invalid table_name [%s]", tableName)
           .build(logger);
     }
 
+    if (dropTableNode.checkTableExistence()) {
+      final Table tableToDrop = SqlHandlerUtil.getTableFromSchema(drillSchema, tableName);
+      if (tableToDrop == null || tableToDrop.getJdbcTableType() != Schema.TableType.TABLE) {
+        return DirectPlan.createDirectPlan(context, true,
+            String.format("Table [%s] not found", tableName));
+      }
+    }
+
     drillSchema.dropTable(tableName);
 
     return DirectPlan.createDirectPlan(context, true,

http://git-wip-us.apache.org/repos/asf/drill/blob/f36fec97/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ViewHandler.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ViewHandler.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ViewHandler.java
index 6024fa5..b8396e6 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ViewHandler.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/handlers/ViewHandler.java
@@ -106,7 +106,7 @@ public abstract class ViewHandler extends DefaultSqlHandler {
     }
   }
 
-  /** Handler for Drop View DDL command. */
+  /** Handler for Drop View [If Exists] DDL command. */
   public static class DropView extends ViewHandler {
     public DropView(SqlHandlerConfig config) {
       super(config);
@@ -115,27 +115,34 @@ public abstract class ViewHandler extends DefaultSqlHandler {
     @Override
     public PhysicalPlan getPlan(SqlNode sqlNode) throws ValidationException, RelConversionException, IOException, ForemanSetupException {
       SqlDropView dropView = unwrap(sqlNode, SqlDropView.class);
-      final String viewToDrop = dropView.getName();
+      final String viewName = dropView.getName();
       final AbstractSchema drillSchema =
           SchemaUtilites.resolveToMutableDrillSchema(context.getNewDefaultSchema(), dropView.getSchemaPath());
 
       final String schemaPath = drillSchema.getFullSchemaName();
 
-      final Table existingTable = SqlHandlerUtil.getTableFromSchema(drillSchema, viewToDrop);
-      if (existingTable != null && existingTable.getJdbcTableType() != Schema.TableType.VIEW) {
-        throw UserException.validationError()
-            .message("[%s] is not a VIEW in schema [%s]", viewToDrop, schemaPath)
-            .build(logger);
-      } else if (existingTable == null) {
-        throw UserException.validationError()
-            .message("Unknown view [%s] in schema [%s].", viewToDrop, schemaPath)
-            .build(logger);
+      final Table viewToDrop = SqlHandlerUtil.getTableFromSchema(drillSchema, viewName);
+      if (dropView.checkViewExistence()) {
+        if (viewToDrop == null || viewToDrop.getJdbcTableType() != Schema.TableType.VIEW){
+          return DirectPlan.createDirectPlan(context, true,
+              String.format("View [%s] not found in schema [%s].", viewName, schemaPath));
+        }
+      } else {
+        if (viewToDrop != null && viewToDrop.getJdbcTableType() != Schema.TableType.VIEW) {
+          throw UserException.validationError()
+              .message("[%s] is not a VIEW in schema [%s]", viewName, schemaPath)
+              .build(logger);
+        } else if (viewToDrop == null) {
+          throw UserException.validationError()
+              .message("Unknown view [%s] in schema [%s].", viewName, schemaPath)
+              .build(logger);
+        }
       }
 
-      drillSchema.dropView(viewToDrop);
+      drillSchema.dropView(viewName);
 
       return DirectPlan.createDirectPlan(context, true,
-          String.format("View [%s] deleted successfully from schema [%s].", viewToDrop, schemaPath));
+          String.format("View [%s] deleted successfully from schema [%s].", viewName, schemaPath));
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/f36fec97/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/CompoundIdentifierConverter.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/CompoundIdentifierConverter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/CompoundIdentifierConverter.java
index a125628..fa0d319 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/CompoundIdentifierConverter.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/CompoundIdentifierConverter.java
@@ -164,13 +164,13 @@ public class CompoundIdentifierConverter extends SqlShuttle {
     rules.put(SqlCreateTable.class, R(D, D, D, E));
     rules.put(SqlCreateView.class, R(D, E, E, D));
     rules.put(SqlDescribeTable.class, R(D, D, E));
-    rules.put(SqlDropView.class, R(D));
+    rules.put(SqlDropView.class, R(D, D));
     rules.put(SqlShowFiles.class, R(D));
     rules.put(SqlShowSchemas.class, R(D, D));
     rules.put(SqlUseSchema.class, R(D));
     rules.put(SqlJoin.class, R(D, D, D, D, D, E));
     rules.put(SqlOrderBy.class, R(D, E, D, D));
-    rules.put(SqlDropTable.class, R(D));
+    rules.put(SqlDropTable.class, R(D, D));
     rules.put(SqlRefreshMetadata.class, R(D));
     rules.put(SqlSetOption.class, R(D, D, D));
     rules.put(SqlDescribeSchema.class, R(D));

http://git-wip-us.apache.org/repos/asf/drill/blob/f36fec97/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropTable.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropTable.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropTable.java
index de272a1..c5e9ce3 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropTable.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropTable.java
@@ -17,9 +17,9 @@
  */
 package org.apache.drill.exec.planner.sql.parser;
 
-import java.util.Collections;
 import java.util.List;
 
+import com.google.common.collect.Lists;
 import org.apache.drill.exec.planner.sql.handlers.AbstractSqlHandler;
 import org.apache.drill.exec.planner.sql.handlers.DropTableHandler;
 import org.apache.drill.exec.planner.sql.handlers.SqlHandlerConfig;
@@ -39,15 +39,21 @@ public class SqlDropTable extends DrillSqlCall {
   public static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("DROP_TABLE", SqlKind.OTHER) {
     @Override
     public SqlCall createCall(SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) {
-      return new SqlDropTable(pos, (SqlIdentifier) operands[0]);
+      return new SqlDropTable(pos, (SqlIdentifier) operands[0], (SqlLiteral) operands[1]);
     }
   };
 
   private SqlIdentifier tableName;
+  private boolean tableExistenceCheck;
 
-  public SqlDropTable(SqlParserPos pos, SqlIdentifier tableName) {
+  public SqlDropTable(SqlParserPos pos, SqlIdentifier tableName, SqlLiteral tableExistenceCheck) {
+    this(pos, tableName, tableExistenceCheck.booleanValue());
+  }
+
+  public SqlDropTable(SqlParserPos pos, SqlIdentifier tableName, boolean tableExistenceCheck) {
     super(pos);
     this.tableName = tableName;
+    this.tableExistenceCheck = tableExistenceCheck;
   }
 
   @Override
@@ -57,13 +63,22 @@ public class SqlDropTable extends DrillSqlCall {
 
   @Override
   public List<SqlNode> getOperandList() {
-    return Collections.singletonList((SqlNode) tableName);
+    final List<SqlNode> ops =
+        ImmutableList.of(
+            tableName,
+            SqlLiteral.createBoolean(tableExistenceCheck, SqlParserPos.ZERO)
+        );
+    return ops;
   }
 
   @Override
   public void unparse(SqlWriter writer, int leftPrec, int rightPrec) {
     writer.keyword("DROP");
     writer.keyword("TABLE");
+    if (tableExistenceCheck) {
+      writer.keyword("IF");
+      writer.keyword("EXISTS");
+    }
     tableName.unparse(writer, leftPrec, rightPrec);
   }
 
@@ -92,4 +107,8 @@ public class SqlDropTable extends DrillSqlCall {
     return tableName;
   }
 
+  public boolean checkTableExistence() {
+    return tableExistenceCheck;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/f36fec97/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropView.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropView.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropView.java
index 0e775b8..6fa6dbe 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropView.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/parser/SqlDropView.java
@@ -17,16 +17,11 @@
  */
 package org.apache.drill.exec.planner.sql.parser;
 
-import java.util.Collections;
 import java.util.List;
 
-import org.apache.calcite.tools.Planner;
-
-import org.apache.drill.exec.ops.QueryContext;
 import org.apache.drill.exec.planner.sql.handlers.AbstractSqlHandler;
 import org.apache.drill.exec.planner.sql.handlers.SqlHandlerConfig;
 import org.apache.drill.exec.planner.sql.handlers.ViewHandler.DropView;
-import org.apache.calcite.plan.hep.HepPlanner;
 import org.apache.calcite.sql.SqlCall;
 import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlKind;
@@ -43,15 +38,21 @@ public class SqlDropView extends DrillSqlCall {
   public static final SqlSpecialOperator OPERATOR = new SqlSpecialOperator("DROP_VIEW", SqlKind.OTHER) {
     @Override
     public SqlCall createCall(SqlLiteral functionQualifier, SqlParserPos pos, SqlNode... operands) {
-      return new SqlDropView(pos, (SqlIdentifier) operands[0]);
+      return new SqlDropView(pos, (SqlIdentifier) operands[0], (SqlLiteral) operands[1]);
     }
   };
 
   private SqlIdentifier viewName;
+  private boolean viewExistenceCheck;
+
+  public SqlDropView(SqlParserPos pos, SqlIdentifier viewName, SqlLiteral viewExistenceCheck) {
+    this(pos, viewName, viewExistenceCheck.booleanValue());
+  }
 
-  public SqlDropView(SqlParserPos pos, SqlIdentifier viewName) {
+  public SqlDropView(SqlParserPos pos, SqlIdentifier viewName, boolean viewExistenceCheck) {
     super(pos);
     this.viewName = viewName;
+    this.viewExistenceCheck = viewExistenceCheck;
   }
 
   @Override
@@ -61,13 +62,22 @@ public class SqlDropView extends DrillSqlCall {
 
   @Override
   public List<SqlNode> getOperandList() {
-    return Collections.singletonList((SqlNode)viewName);
+    final List<SqlNode> ops =
+        ImmutableList.of(
+            viewName,
+            SqlLiteral.createBoolean(viewExistenceCheck, SqlParserPos.ZERO)
+        );
+    return ops;
   }
 
   @Override
   public void unparse(SqlWriter writer, int leftPrec, int rightPrec) {
     writer.keyword("DROP");
     writer.keyword("VIEW");
+    if (viewExistenceCheck) {
+      writer.keyword("IF");
+      writer.keyword("EXISTS");
+    }
     viewName.unparse(writer, leftPrec, rightPrec);
   }
 
@@ -92,4 +102,8 @@ public class SqlDropView extends DrillSqlCall {
     return viewName.names.get(viewName.names.size() - 1);
   }
 
+  public boolean checkViewExistence() {
+    return viewExistenceCheck;
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/f36fec97/exec/java-exec/src/test/java/org/apache/drill/TestDropTable.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestDropTable.java b/exec/java-exec/src/test/java/org/apache/drill/TestDropTable.java
index 4f8fe1a..e9a38b0 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestDropTable.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestDropTable.java
@@ -26,7 +26,10 @@ import org.junit.Assert;
 public class TestDropTable extends PlanTestBase {
 
   private static final String CREATE_SIMPLE_TABLE = "create table %s as select 1 from cp.`employee.json`";
+  private static final String CREATE_SIMPLE_VIEW = "create view %s as select 1 from cp.`employee.json`";
   private static final String DROP_TABLE = "drop table %s";
+  private static final String DROP_TABLE_IF_EXISTS = "drop table if exists %s";
+  private static final String DROP_VIEW_IF_EXISTS = "drop view if exists %s";
   private static final String BACK_TICK = "`";
 
   @Test
@@ -171,4 +174,52 @@ public class TestDropTable extends PlanTestBase {
 
     Assert.assertTrue("Dropping table on immutable schema failed", dropFailed);
   }
+
+  @Test // DRILL-4673
+  public void testDropTableIfExistsWhileTableExists() throws Exception {
+    final String existentTableName = "test_table";
+    test("use dfs_test.tmp");
+
+    // successful dropping of existent table
+    test(String.format(CREATE_SIMPLE_TABLE, existentTableName));
+    testBuilder()
+        .sqlQuery(String.format(DROP_TABLE_IF_EXISTS, existentTableName))
+        .unOrdered()
+        .baselineColumns("ok", "summary")
+        .baselineValues(true, String.format("Table [%s] dropped", existentTableName))
+        .go();
+  }
+
+  @Test // DRILL-4673
+  public void testDropTableIfExistsWhileTableDoesNotExist() throws Exception {
+    final String nonExistentTableName = "test_table";
+    test("use dfs_test.tmp");
+
+    // dropping of non existent table without error
+    testBuilder()
+        .sqlQuery(String.format(DROP_TABLE_IF_EXISTS, nonExistentTableName))
+        .unOrdered()
+        .baselineColumns("ok", "summary")
+        .baselineValues(true, String.format("Table [%s] not found", nonExistentTableName))
+        .go();
+  }
+
+  @Test // DRILL-4673
+  public void testDropTableIfExistsWhileItIsAView() throws Exception {
+    final String viewName = "test_view";
+    try{
+      test("use dfs_test.tmp");
+
+      // dropping of non existent table without error if the view with such name is existed
+      test(String.format(CREATE_SIMPLE_VIEW, viewName));
+      testBuilder()
+          .sqlQuery(String.format(DROP_TABLE_IF_EXISTS, viewName))
+          .unOrdered()
+          .baselineColumns("ok", "summary")
+          .baselineValues(true, String.format("Table [%s] not found", viewName))
+          .go();
+    } finally {
+      test(String.format(DROP_VIEW_IF_EXISTS, viewName));
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/f36fec97/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestBaseViewSupport.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestBaseViewSupport.java b/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestBaseViewSupport.java
index a8f5bbb..43d8d57 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestBaseViewSupport.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestBaseViewSupport.java
@@ -105,6 +105,50 @@ public class TestBaseViewSupport extends BaseTestQuery {
   }
 
   /**
+   * Drop view if exists with given parameters.
+   *
+   * Current schema "dfs_test"
+   * DROP VIEW IF EXISTS tmp.viewName
+   *
+   * For the above DROP VIEW IF EXISTS query, function parameters values are:
+   *  viewSchema = "tmp"
+   *  "viewName" = "viewName"
+   *  "finalSchema" = "dfs_test.tmp"
+   *  "ifViewExists" = null
+   *
+   * @param viewSchema
+   * @param viewName
+   * @param finalSchema
+   * @param ifViewExists Helps to check query result depending from the existing of the view.
+   * @throws Exception
+   */
+  protected static void dropViewIfExistsHelper(final String viewSchema, final String viewName, final String finalSchema, Boolean ifViewExists) throws
+      Exception{
+    String viewFullName = "`" + viewName + "`";
+    if (!Strings.isNullOrEmpty(viewSchema)) {
+      viewFullName = viewSchema + "." + viewFullName;
+    }
+    if (ifViewExists == null) {
+      // ifViewExists == null: we do not know whether the table exists. Just drop it if exists or skip dropping if doesn't exist
+      test(String.format("DROP VIEW IF EXISTS %s", viewFullName));
+    } else if (ifViewExists) {
+      testBuilder()
+          .sqlQuery(String.format("DROP VIEW IF EXISTS %s", viewFullName))
+          .unOrdered()
+          .baselineColumns("ok", "summary")
+          .baselineValues(true, String.format("View [%s] deleted successfully from schema [%s].", viewName, finalSchema))
+          .go();
+    } else {
+      testBuilder()
+          .sqlQuery(String.format("DROP VIEW IF EXISTS %s", viewFullName))
+          .unOrdered()
+          .baselineColumns("ok", "summary")
+          .baselineValues(true, String.format("View [%s] not found in schema [%s].", viewName, finalSchema))
+          .go();
+    }
+  }
+
+  /**
    * Execute the given query and check against the given baseline.
    *
    * @param query

http://git-wip-us.apache.org/repos/asf/drill/blob/f36fec97/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestViewSupport.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestViewSupport.java b/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestViewSupport.java
index 955da48..92f5c91 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestViewSupport.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/exec/sql/TestViewSupport.java
@@ -591,4 +591,35 @@ public class TestViewSupport extends TestBaseViewSupport {
       FileUtils.deleteQuietly(tblPath);
     }
   }
+
+  @Test // DRILL-4673
+  public void dropViewIfExistsWhenViewExists() throws Exception {
+    final String existentViewName = generateViewName();
+
+    // successful dropping of existent view
+    createViewHelper(TEMP_SCHEMA, existentViewName, TEMP_SCHEMA, null,
+        "SELECT c_custkey, c_nationkey from cp.`tpch/customer.parquet`");
+    dropViewIfExistsHelper(TEMP_SCHEMA, existentViewName, TEMP_SCHEMA, true);
+  }
+
+  @Test // DRILL-4673
+  public void dropViewIfExistsWhenViewDoesNotExist() throws Exception {
+    final String nonExistentViewName = generateViewName();
+
+    // dropping of non existent view without error
+    dropViewIfExistsHelper(TEMP_SCHEMA, nonExistentViewName, TEMP_SCHEMA, false);
+  }
+
+  @Test // DRILL-4673
+  public void dropViewIfExistsWhenItIsATable() throws Exception {
+    final String tableName = "table_name";
+    try{
+      // dropping of non existent view without error if the table with such name is existed
+      test(String.format("CREATE TABLE %s.%s as SELECT region_id, sales_city FROM cp.`region.json`",
+          TEMP_SCHEMA, tableName));
+      dropViewIfExistsHelper(TEMP_SCHEMA, tableName, TEMP_SCHEMA, false);
+    } finally {
+      test(String.format("DROP TABLE IF EXISTS %s.%s ", TEMP_SCHEMA, tableName));
+    }
+  }
 }