You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tajo.apache.org by hj...@apache.org on 2014/09/11 03:11:27 UTC

git commit: TAJO-1028: JDBC should support SET command.

Repository: tajo
Updated Branches:
  refs/heads/master bdc75750e -> 0f76a8ba0


TAJO-1028: JDBC should support SET command.

Closes #135


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

Branch: refs/heads/master
Commit: 0f76a8ba0ef280875605b0e73a7c532b2f286ea0
Parents: bdc7575
Author: HyoungJun Kim <ba...@babokim-mbp.server.gruter.com>
Authored: Thu Sep 11 10:10:17 2014 +0900
Committer: HyoungJun Kim <ba...@babokim-mbp.server.gruter.com>
Committed: Thu Sep 11 10:10:17 2014 +0900

----------------------------------------------------------------------
 CHANGES                                         |  2 +
 .../org/apache/tajo/jdbc/TajoResultSet.java     |  2 +-
 .../java/org/apache/tajo/jdbc/TestTajoJdbc.java | 95 +++++++++++++++++++-
 .../org/apache/tajo/jdbc/TajoConnection.java    |  8 +-
 .../apache/tajo/jdbc/TajoPreparedStatement.java | 16 +++-
 .../org/apache/tajo/jdbc/TajoStatement.java     | 76 +++++++++++++++-
 6 files changed, 184 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tajo/blob/0f76a8ba/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index c64c08e..358b5ed 100644
--- a/CHANGES
+++ b/CHANGES
@@ -31,6 +31,8 @@ Release 0.9.0 - unreleased
 
   IMPROVEMENT
 
+    TAJO-1028: JDBC should support SET command.(Hyoungjun Kim)
+
     TAJO-937: Should use tajo.util.VersionInfo instead of 
     TajoConstants.TAJO_VERSION. (Mai Hai Thanh via hyunsik)
 

http://git-wip-us.apache.org/repos/asf/tajo/blob/0f76a8ba/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSet.java
----------------------------------------------------------------------
diff --git a/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSet.java b/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSet.java
index 8595970..65954f1 100644
--- a/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSet.java
+++ b/tajo-client/src/main/java/org/apache/tajo/jdbc/TajoResultSet.java
@@ -145,7 +145,7 @@ public class TajoResultSet extends TajoResultSetBase {
     }
 
     try {
-      if(tajoClient != null && !queryId.equals(QueryIdFactory.NULL_QUERY_ID)) {
+      if(tajoClient != null && queryId != null && !queryId.equals(QueryIdFactory.NULL_QUERY_ID)) {
         this.tajoClient.closeQuery(queryId);
       }
     } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/tajo/blob/0f76a8ba/tajo-core/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
----------------------------------------------------------------------
diff --git a/tajo-core/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java b/tajo-core/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
index f922d87..e477939 100644
--- a/tajo-core/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
+++ b/tajo-core/src/test/java/org/apache/tajo/jdbc/TestTajoJdbc.java
@@ -25,6 +25,7 @@ import org.apache.tajo.TajoConstants;
 import org.apache.tajo.catalog.CatalogUtil;
 import org.apache.tajo.catalog.Column;
 import org.apache.tajo.catalog.TableDesc;
+import org.apache.tajo.client.TajoClient;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -54,8 +55,8 @@ public class TestTajoJdbc extends QueryTestCaseBase {
   public static void tearDown() throws Exception {
   }
 
-  public static String buildConnectionUri(String hostName, int port, String databaseNme) {
-    return "jdbc:tajo://" + hostName + ":" + port + "/" + databaseNme;
+  public static String buildConnectionUri(String hostName, int port, String databaseName) {
+    return "jdbc:tajo://" + hostName + ":" + port + "/" + databaseName;
   }
 
   @Test
@@ -396,4 +397,94 @@ public class TestTajoJdbc extends QueryTestCaseBase {
       }
     }
   }
+
+  @Test
+  public void testSetStatement() throws Exception {
+    assertTrue(TajoStatement.isSetVariableQuery("Set JOIN_TASK_INPUT_SIZE 123"));
+    assertTrue(TajoStatement.isSetVariableQuery("SET JOIN_TASK_INPUT_SIZE 123"));
+    assertFalse(TajoStatement.isSetVariableQuery("--SET JOIN_TASK_INPUT_SIZE 123"));
+
+    String connUri = buildConnectionUri(tajoMasterAddress.getHostName(), tajoMasterAddress.getPort(),
+        DEFAULT_DATABASE_NAME);
+
+    Connection conn = DriverManager.getConnection(connUri);
+
+    Statement stmt = null;
+    ResultSet res = null;
+    try {
+      stmt = conn.createStatement();
+      res = stmt.executeQuery("Set JOIN_TASK_INPUT_SIZE 123");
+      assertFalse(res.next());
+      ResultSetMetaData rsmd = res.getMetaData();
+      assertNotNull(rsmd);
+      assertEquals(0, rsmd.getColumnCount());
+
+      TajoClient connTajoClient = ((TajoConnection)stmt.getConnection()).getTajoClient();
+      Map<String, String> variables = connTajoClient.getAllSessionVariables();
+      String value = variables.get("JOIN_TASK_INPUT_SIZE");
+      assertNotNull(value);
+      assertEquals("123", value);
+
+      res.close();
+
+      res = stmt.executeQuery("unset JOIN_TASK_INPUT_SIZE");
+      variables = connTajoClient.getAllSessionVariables();
+      value = variables.get("JOIN_TASK_INPUT_SIZE");
+      assertNull(value);
+    } finally {
+      if (res != null) {
+        res.close();
+      }
+      if (stmt != null) {
+        stmt.close();
+      }
+      if (conn != null) {
+        conn.close();
+      }
+    }
+  }
+
+  @Test
+  public void testSetPreparedStatement() throws Exception {
+    String connUri = buildConnectionUri(tajoMasterAddress.getHostName(), tajoMasterAddress.getPort(),
+        DEFAULT_DATABASE_NAME);
+
+    Connection conn = DriverManager.getConnection(connUri);
+
+    PreparedStatement stmt = null;
+    ResultSet res = null;
+    try {
+      stmt = conn.prepareStatement("Set JOIN_TASK_INPUT_SIZE 123");
+      res = stmt.executeQuery();
+      assertFalse(res.next());
+      ResultSetMetaData rsmd = res.getMetaData();
+      assertNotNull(rsmd);
+      assertEquals(0, rsmd.getColumnCount());
+
+      TajoClient connTajoClient = ((TajoConnection)stmt.getConnection()).getTajoClient();
+      Map<String, String> variables = connTajoClient.getAllSessionVariables();
+      String value = variables.get("JOIN_TASK_INPUT_SIZE");
+      assertNotNull(value);
+      assertEquals("123", value);
+
+      res.close();
+      stmt.close();
+
+      stmt = conn.prepareStatement("unset JOIN_TASK_INPUT_SIZE");
+      res = stmt.executeQuery();
+      variables = connTajoClient.getAllSessionVariables();
+      value = variables.get("JOIN_TASK_INPUT_SIZE");
+      assertNull(value);
+    } finally {
+      if (res != null) {
+        res.close();
+      }
+      if (stmt != null) {
+        stmt.close();
+      }
+      if (conn != null) {
+        conn.close();
+      }
+    }
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tajo/blob/0f76a8ba/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoConnection.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoConnection.java b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoConnection.java
index f5b5b68..1a2c6c5 100644
--- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoConnection.java
+++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoConnection.java
@@ -170,7 +170,7 @@ public class TajoConnection implements Connection {
     if (isClosed()) {
       throw new SQLException("Can't create Statement, connection is closed");
     }
-    return new TajoStatement(tajoClient);
+    return new TajoStatement(this, tajoClient);
   }
 
   @Override
@@ -295,13 +295,13 @@ public class TajoConnection implements Connection {
 
   @Override
   public PreparedStatement prepareStatement(String sql) throws SQLException {
-    return new TajoPreparedStatement(tajoClient, sql);
+    return new TajoPreparedStatement(this, tajoClient, sql);
   }
 
   @Override
   public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
       throws SQLException {
-    return new TajoPreparedStatement(tajoClient, sql);
+    return new TajoPreparedStatement(this, tajoClient, sql);
   }
 
   @Override
@@ -319,7 +319,7 @@ public class TajoConnection implements Connection {
   @Override
   public PreparedStatement prepareStatement(String sql, int resultSetType,
                                             int resultSetConcurrency) throws SQLException {
-    return new TajoPreparedStatement(tajoClient, sql);
+    return new TajoPreparedStatement(this, tajoClient, sql);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/0f76a8ba/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoPreparedStatement.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoPreparedStatement.java b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoPreparedStatement.java
index bc7d0b0..d4c89c0 100644
--- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoPreparedStatement.java
+++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoPreparedStatement.java
@@ -31,6 +31,7 @@ import java.util.HashMap;
  *
  */
 public class TajoPreparedStatement implements PreparedStatement {
+  private TajoConnection conn;
   private final String sql;
   private TajoClient tajoClient;
   /**
@@ -65,8 +66,10 @@ public class TajoPreparedStatement implements PreparedStatement {
   /**
    *
    */
-  public TajoPreparedStatement(TajoClient tajoClient,
+  public TajoPreparedStatement(TajoConnection conn,
+                               TajoClient tajoClient,
                                String sql) {
+    this.conn = conn;
     this.tajoClient = tajoClient;
     this.sql = sql;
   }
@@ -107,11 +110,16 @@ public class TajoPreparedStatement implements PreparedStatement {
       if (sql.contains("?")) {
         sql = updateSql(sql, parameters);
       }
-      resultSet = tajoClient.executeQueryAndGetResult(sql);
+      if (TajoStatement.isSetVariableQuery(sql)) {
+        return TajoStatement.setSessionVariable(tajoClient, sql);
+      } else if (TajoStatement.isUnSetVariableQuery(sql)) {
+        return TajoStatement.unSetSessionVariable(tajoClient, sql);
+      } else {
+        return tajoClient.executeQueryAndGetResult(sql);
+      }
     } catch (Exception e) {
       throw new SQLException(e.getMessage(), e);
     }
-    return resultSet;
   }
 
   /**
@@ -517,7 +525,7 @@ public class TajoPreparedStatement implements PreparedStatement {
 
   @Override
   public Connection getConnection() throws SQLException {
-    throw new SQLFeatureNotSupportedException("getConnection not supported");
+    return conn;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/tajo/blob/0f76a8ba/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoStatement.java
----------------------------------------------------------------------
diff --git a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoStatement.java b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoStatement.java
index 776c892..69aa68e 100644
--- a/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoStatement.java
+++ b/tajo-jdbc/src/main/java/org/apache/tajo/jdbc/TajoStatement.java
@@ -17,11 +17,17 @@
  */
 package org.apache.tajo.jdbc;
 
+import com.google.common.collect.Lists;
+import com.google.protobuf.ServiceException;
 import org.apache.tajo.client.TajoClient;
 
+import java.io.IOException;
 import java.sql.*;
+import java.util.HashMap;
+import java.util.Map;
 
 public class TajoStatement implements Statement {
+  private TajoConnection conn;
   private TajoClient tajoClient;
   private int fetchSize = 200;
 
@@ -44,7 +50,8 @@ public class TajoStatement implements Statement {
    */
   private boolean isClosed = false;
 
-  public TajoStatement(TajoClient tajoClient) {
+  public TajoStatement(TajoConnection conn, TajoClient tajoClient) {
+    this.conn = conn;
     this.tajoClient = tajoClient;
   }
 
@@ -116,13 +123,74 @@ public class TajoStatement implements Statement {
     }
 
     try {
-      resultSet = tajoClient.executeQueryAndGetResult(sql);
-      return resultSet;
+      if (isSetVariableQuery(sql)) {
+        return setSessionVariable(tajoClient, sql);
+      } else if (isUnSetVariableQuery(sql)) {
+        return unSetSessionVariable(tajoClient, sql);
+      } else {
+        return tajoClient.executeQueryAndGetResult(sql);
+      }
     } catch (Exception e) {
       throw new SQLFeatureNotSupportedException(e.getMessage(), e);
     }
   }
 
+  public static boolean isSetVariableQuery(String sql) {
+    if (sql == null || sql.trim().isEmpty()) {
+      return false;
+    }
+
+    return sql.trim().toLowerCase().startsWith("set");
+  }
+
+  public static boolean isUnSetVariableQuery(String sql) {
+    if (sql == null || sql.trim().isEmpty()) {
+      return false;
+    }
+
+    return sql.trim().toLowerCase().startsWith("unset");
+  }
+
+  public static ResultSet setSessionVariable(TajoClient client, String sql) throws SQLException {
+    int index = sql.toLowerCase().indexOf("set");
+    if (index < 0) {
+      throw new SQLException("SET statement should be started 'SET' keyword: " + sql);
+    }
+
+    String[] tokens = sql.substring(index + 3).trim().split(" ");
+    if (tokens.length != 2) {
+      throw new SQLException("SET statement should be <KEY> <VALUE>: " + sql);
+    }
+    Map<String, String> variable = new HashMap<String, String>();
+    variable.put(tokens[0].trim(), tokens[1].trim());
+    try {
+      client.updateSessionVariables(variable);
+    } catch (ServiceException e) {
+      throw new SQLException(e.getMessage(), e);
+    }
+
+    return new TajoResultSet(client, null);
+  }
+
+  public static ResultSet unSetSessionVariable(TajoClient client, String sql) throws SQLException {
+    int index = sql.toLowerCase().indexOf("unset");
+    if (index < 0) {
+      throw new SQLException("UNSET statement should be started 'UNSET' keyword: " + sql);
+    }
+
+    String key = sql.substring(index + 5).trim();
+    if (key.isEmpty()) {
+      throw new SQLException("UNSET statement should be <KEY>: " + sql);
+    }
+    try {
+      client.unsetSessionVariables(Lists.newArrayList(key));
+    } catch (ServiceException e) {
+      throw new SQLException(e.getMessage(), e);
+    }
+
+    return new TajoResultSet(client, null);
+  }
+
   @Override
   public int executeUpdate(String sql) throws SQLException {
     try {
@@ -151,7 +219,7 @@ public class TajoStatement implements Statement {
 
   @Override
   public Connection getConnection() throws SQLException {
-    throw new SQLFeatureNotSupportedException("getConnection not supported");
+    return conn;
   }
 
   @Override