DRILL-1136: Check for existance of view before creating one when no OR REPLACE 
clause is provided


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

Branch: refs/heads/master
Commit: fffd0d38af93aee16e0103a3133306c0eb07092e
Parents: 7e561de
Author: vkorukanti <[email protected]>
Authored: Tue Jul 15 09:02:46 2014 -0700
Committer: Jacques Nadeau <[email protected]>
Committed: Sun Jul 20 16:49:19 2014 -0700

----------------------------------------------------------------------
 .../exec/planner/sql/handlers/ViewHandler.java  |  4 ++
 .../exec/store/dfs/WorkspaceSchemaFactory.java  |  5 +++
 .../apache/drill/exec/sql/TestViewSupport.java  |  2 +-
 .../org/apache/drill/jdbc/test/TestViews.java   | 47 ++++++++++++++++++++
 4 files changed, 57 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fffd0d38/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 ba70ae5..b6bb7a1 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
@@ -110,6 +110,10 @@ public abstract class ViewHandler extends 
AbstractSqlHandler{
 
         boolean replaced;
         if (drillSchema instanceof WorkspaceSchema) {
+          WorkspaceSchema workspaceSchema = (WorkspaceSchema) drillSchema;
+          if (!createView.getReplace() && 
workspaceSchema.viewExists(view.getName())) {
+            return DirectPlan.createDirectPlan(context, false, "View with 
given name already exists in current schema");
+          }
           replaced = ((WorkspaceSchema) drillSchema).createView(view);
         }else{
           return DirectPlan.createDirectPlan(context, false, "Schema provided 
was not a workspace schema.");

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fffd0d38/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/WorkspaceSchemaFactory.java
----------------------------------------------------------------------
diff --git 
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/WorkspaceSchemaFactory.java
 
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/WorkspaceSchemaFactory.java
index 1d2bf91..54781b4 100644
--- 
a/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/WorkspaceSchemaFactory.java
+++ 
b/exec/java-exec/src/main/java/org/apache/drill/exec/store/dfs/WorkspaceSchemaFactory.java
@@ -174,6 +174,11 @@ public class WorkspaceSchemaFactory implements 
ExpandingConcurrentMap.MapValueFa
       return replaced;
     }
 
+    public boolean viewExists(String viewName) throws Exception {
+      Path viewPath = getViewPath(viewName);
+      return fs.getUnderlying().exists(viewPath);
+    }
+
     public void dropView(String viewName) throws IOException {
       fs.getUnderlying().delete(getViewPath(viewName), false);
       if(knownViews != null) knownViews.delete(viewName);

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fffd0d38/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 585e931..b745baa 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
@@ -27,7 +27,7 @@ public class TestViewSupport extends BaseTestQuery{
   public void referToSchemaInsideAndOutsideView() throws Exception {
     String use = "use dfs_test.tmp;";
     String selectInto = "create table monkey as select c_custkey, c_regionkey 
from cp.`tpch/customer.parquet`";
-    String createView = "create view myMonkeyView as select c_custkey, 
c_regionkey from monkey";
+    String createView = "create or replace view myMonkeyView as select 
c_custkey, c_regionkey from monkey";
     String selectInside = "select * from myMonkeyView;";
     String use2 = "use cp;";
     String selectOutside = "select * from dfs_test.tmp.myMonkeyView;";

http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fffd0d38/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestViews.java
----------------------------------------------------------------------
diff --git a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestViews.java 
b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestViews.java
index 89d9573..2cbba34 100644
--- a/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestViews.java
+++ b/exec/jdbc/src/test/java/org/apache/drill/jdbc/test/TestViews.java
@@ -463,4 +463,51 @@ public class TestViews extends JdbcTestQueryBase {
       }
     });
   }
+
+  @Test
+  public void testCreateViewWhenViewAlreadyExists() throws Exception{
+    JdbcAssert.withFull("dfs_test.tmp").withConnection(new 
Function<Connection, Void>() {
+      public Void apply(Connection connection) {
+        try {
+          Statement statement = connection.createStatement();
+
+          // create a view
+          ResultSet resultSet =  statement.executeQuery(
+              "CREATE VIEW testCreateViewWhenViewAlreadyExists AS SELECT 
region_id, sales_city FROM cp.`region.json`");
+          String result = JdbcAssert.toString(resultSet).trim();
+          resultSet.close();
+          String expected = "ok=true; summary=View 
'testCreateViewWhenViewAlreadyExists' " +
+              "created successfully in 'dfs_test.tmp' schema";
+          assertTrue(String.format("Generated string:\n%s\ndoes not 
match:\n%s", result, expected),
+              expected.equals(result));
+
+          // try to create the view with same name
+          resultSet =  statement.executeQuery(
+              "CREATE VIEW testCreateViewWhenViewAlreadyExists AS SELECT 
region_id FROM cp.`region.json`");
+          result = JdbcAssert.toString(resultSet).trim();
+          resultSet.close();
+          expected = "ok=false; summary=View with given name already exists in 
current schema";
+          assertTrue(String.format("Generated string:\n%s\ndoes not 
match:\n%s", result, expected),
+              expected.equals(result));
+
+          // try creating the view with same name but with a OR REPLACE clause
+          resultSet =  statement.executeQuery(
+              "CREATE OR REPLACE VIEW testCreateViewWhenViewAlreadyExists AS 
SELECT region_id FROM cp.`region.json`");
+          result = JdbcAssert.toString(resultSet).trim();
+          resultSet.close();
+          expected = "ok=true; summary=View 
'testCreateViewWhenViewAlreadyExists' " +
+              "replaced successfully in 'dfs_test.tmp' schema";
+          assertTrue(String.format("Generated string:\n%s\ndoes not 
match:\n%s", result, expected),
+              expected.equals(result));
+
+          statement.executeQuery("drop view 
dfs_test.tmp.testCreateViewWhenViewAlreadyExists").close();
+
+          statement.close();
+          return null;
+        } catch (Exception e) {
+          throw new RuntimeException(e);
+        }
+      }
+    });
+  }
 }

Reply via email to