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