You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by gu...@apache.org on 2013/08/09 23:49:32 UTC
svn commit: r1512506 - in /hive/trunk/jdbc/src:
java/org/apache/hive/jdbc/HivePreparedStatement.java
test/org/apache/hive/jdbc/TestJdbcDriver2.java
Author: gunther
Date: Fri Aug 9 21:49:31 2013
New Revision: 1512506
URL: http://svn.apache.org/r1512506
Log:
HIVE-5006: Re-factor HiveServer2 JDBC PreparedStatement to avoid duplicate code (Prasad Mujumdar via Gunther Hagleitner)
Modified:
hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HivePreparedStatement.java
hive/trunk/jdbc/src/test/org/apache/hive/jdbc/TestJdbcDriver2.java
Modified: hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HivePreparedStatement.java
URL: http://svn.apache.org/viewvc/hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HivePreparedStatement.java?rev=1512506&r1=1512505&r2=1512506&view=diff
==============================================================================
--- hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HivePreparedStatement.java (original)
+++ hive/trunk/jdbc/src/java/org/apache/hive/jdbc/HivePreparedStatement.java Fri Aug 9 21:49:31 2013
@@ -25,7 +25,6 @@ import java.net.URL;
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
-import java.sql.Connection;
import java.sql.Date;
import java.sql.NClob;
import java.sql.ParameterMetaData;
@@ -35,71 +34,30 @@ import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.RowId;
import java.sql.SQLException;
-import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.HashMap;
-import java.util.Map;
import org.apache.hive.service.cli.thrift.TCLIService;
-import org.apache.hive.service.cli.thrift.TExecuteStatementReq;
-import org.apache.hive.service.cli.thrift.TExecuteStatementResp;
-import org.apache.hive.service.cli.thrift.TOperationHandle;
import org.apache.hive.service.cli.thrift.TSessionHandle;
/**
* HivePreparedStatement.
*
*/
-public class HivePreparedStatement implements PreparedStatement {
+public class HivePreparedStatement extends HiveStatement implements PreparedStatement {
private final String sql;
- private TCLIService.Iface client;
- private final TSessionHandle sessHandle;
- private TOperationHandle stmtHandle;
- Map<String,String> sessConf = new HashMap<String,String>();
/**
* save the SQL parameters {paramLoc:paramValue}
*/
private final HashMap<Integer, String> parameters=new HashMap<Integer, String>();
- /**
- * We need to keep a reference to the result set to support the following:
- * <code>
- * statement.execute(String sql);
- * statement.getResultSet();
- * </code>.
- */
- private ResultSet resultSet = null;
- /**
- * The maximum number of rows this statement should return (0 => all rows).
- */
- private int maxRows = 0;
-
- /**
- * Add SQLWarnings to the warningChain if needed.
- */
- private SQLWarning warningChain = null;
-
- /**
- * Keep state so we can fail certain calls made after close().
- */
- private boolean isClosed = false;
-
- /**
- * keep the current ResultRet update count
- */
- private final int updateCount=0;
-
- /**
- *
- */
public HivePreparedStatement(TCLIService.Iface client, TSessionHandle sessHandle,
String sql) {
- this.client = client;
- this.sessHandle = sessHandle;
+ super(client, sessHandle);
this.sql = sql;
}
@@ -134,8 +92,7 @@ public class HivePreparedStatement imple
*/
public boolean execute() throws SQLException {
- ResultSet rs = executeImmediate(sql);
- return rs != null;
+ return super.execute(updateSql(sql, parameters));
}
/**
@@ -146,7 +103,7 @@ public class HivePreparedStatement imple
*/
public ResultSet executeQuery() throws SQLException {
- return executeImmediate(sql);
+ return super.executeQuery(updateSql(sql, parameters));
}
/*
@@ -156,45 +113,8 @@ public class HivePreparedStatement imple
*/
public int executeUpdate() throws SQLException {
- executeImmediate(sql);
- return updateCount;
- }
-
- /**
- * Executes the SQL statement.
- *
- * @param sql The sql, as a string, to execute
- * @return ResultSet
- * @throws SQLException if the prepared statement is closed or there is a database error.
- * caught Exceptions are thrown as SQLExceptions with the description
- * "08S01".
- */
-
- protected ResultSet executeImmediate(String sql) throws SQLException {
- if (isClosed) {
- throw new SQLException("Can't execute after statement has been closed");
- }
-
- try {
- clearWarnings();
- resultSet = null;
- if (sql.contains("?")) {
- sql = updateSql(sql, parameters);
- }
- TExecuteStatementReq execReq = new TExecuteStatementReq(sessHandle, sql);
- execReq.setConfOverlay(sessConf);
- TExecuteStatementResp execResp = client.ExecuteStatement(execReq);
- Utils.verifySuccessWithInfo(execResp.getStatus());
- stmtHandle = execResp.getOperationHandle();
- } catch (SQLException es) {
- throw es;
- } catch (Exception ex) {
- throw new SQLException(ex.toString(), "08S01", ex);
- }
- resultSet = new HiveQueryResultSet.Builder().setClient(client).setSessionHandle(sessHandle)
- .setStmtHandle(stmtHandle).setMaxRows(maxRows)
- .build();
- return resultSet;
+ super.executeUpdate(updateSql(sql, parameters));
+ return 0;
}
/**
@@ -205,6 +125,9 @@ public class HivePreparedStatement imple
* @return updated SQL string
*/
private String updateSql(final String sql, HashMap<Integer, String> parameters) {
+ if (!sql.contains("?")) {
+ return sql;
+ }
StringBuffer newSql = new StringBuffer(sql);
@@ -813,477 +736,4 @@ public class HivePreparedStatement imple
// TODO Auto-generated method stub
throw new SQLException("Method not supported");
}
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#addBatch(java.lang.String)
- */
-
- public void addBatch(String sql) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#cancel()
- */
-
- public void cancel() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#clearBatch()
- */
-
- public void clearBatch() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#clearWarnings()
- */
-
- public void clearWarnings() throws SQLException {
- warningChain=null;
- }
-
- public void closeOnCompletion() throws SQLException {
- // JDK 1.7
- throw new SQLException("Method not supported");
- }
-
- /**
- * Closes the prepared statement.
- *
- * @throws SQLException
- */
-
- public void close() throws SQLException {
- client = null;
- if (resultSet!=null) {
- resultSet.close();
- resultSet = null;
- }
- isClosed = true;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#execute(java.lang.String)
- */
-
- public boolean execute(String sql) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#execute(java.lang.String, int)
- */
-
- public boolean execute(String sql, int autoGeneratedKeys) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#execute(java.lang.String, int[])
- */
-
- public boolean execute(String sql, int[] columnIndexes) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#execute(java.lang.String, java.lang.String[])
- */
-
- public boolean execute(String sql, String[] columnNames) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#executeBatch()
- */
-
- public int[] executeBatch() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#executeQuery(java.lang.String)
- */
-
- public ResultSet executeQuery(String sql) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#executeUpdate(java.lang.String)
- */
-
- public int executeUpdate(String sql) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#executeUpdate(java.lang.String, int)
- */
-
- public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#executeUpdate(java.lang.String, int[])
- */
-
- public int executeUpdate(String sql, int[] columnIndexes) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#executeUpdate(java.lang.String, java.lang.String[])
- */
-
- public int executeUpdate(String sql, String[] columnNames) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getConnection()
- */
-
- public Connection getConnection() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getFetchDirection()
- */
-
- public int getFetchDirection() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getFetchSize()
- */
-
- public int getFetchSize() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getGeneratedKeys()
- */
-
- public ResultSet getGeneratedKeys() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getMaxFieldSize()
- */
-
- public int getMaxFieldSize() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getMaxRows()
- */
-
- public int getMaxRows() throws SQLException {
- return this.maxRows;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getMoreResults()
- */
-
- public boolean getMoreResults() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getMoreResults(int)
- */
-
- public boolean getMoreResults(int current) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getQueryTimeout()
- */
-
- public int getQueryTimeout() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getResultSet()
- */
-
- public ResultSet getResultSet() throws SQLException {
- return this.resultSet;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getResultSetConcurrency()
- */
-
- public int getResultSetConcurrency() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getResultSetHoldability()
- */
-
- public int getResultSetHoldability() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getResultSetType()
- */
-
- public int getResultSetType() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getUpdateCount()
- */
-
- public int getUpdateCount() throws SQLException {
- return updateCount;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#getWarnings()
- */
-
- public SQLWarning getWarnings() throws SQLException {
- return warningChain;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#isClosed()
- */
-
- public boolean isClosed() throws SQLException {
- return isClosed;
- }
-
- public boolean isCloseOnCompletion() throws SQLException {
- //JDK 1.7
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#isPoolable()
- */
-
- public boolean isPoolable() throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#setCursorName(java.lang.String)
- */
-
- public void setCursorName(String name) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#setEscapeProcessing(boolean)
- */
-
- public void setEscapeProcessing(boolean enable) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#setFetchDirection(int)
- */
-
- public void setFetchDirection(int direction) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#setFetchSize(int)
- */
-
- public void setFetchSize(int rows) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#setMaxFieldSize(int)
- */
-
- public void setMaxFieldSize(int max) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#setMaxRows(int)
- */
-
- public void setMaxRows(int max) throws SQLException {
- if (max < 0) {
- throw new SQLException("max must be >= 0");
- }
- this.maxRows = max;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#setPoolable(boolean)
- */
-
- public void setPoolable(boolean poolable) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Statement#setQueryTimeout(int)
- */
-
- public void setQueryTimeout(int seconds) throws SQLException {
- // TODO Auto-generated method stub
- // throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Wrapper#isWrapperFor(java.lang.Class)
- */
-
- public boolean isWrapperFor(Class<?> iface) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.sql.Wrapper#unwrap(java.lang.Class)
- */
-
- public <T> T unwrap(Class<T> iface) throws SQLException {
- // TODO Auto-generated method stub
- throw new SQLException("Method not supported");
- }
-
}
Modified: hive/trunk/jdbc/src/test/org/apache/hive/jdbc/TestJdbcDriver2.java
URL: http://svn.apache.org/viewvc/hive/trunk/jdbc/src/test/org/apache/hive/jdbc/TestJdbcDriver2.java?rev=1512506&r1=1512505&r2=1512506&view=diff
==============================================================================
--- hive/trunk/jdbc/src/test/org/apache/hive/jdbc/TestJdbcDriver2.java (original)
+++ hive/trunk/jdbc/src/test/org/apache/hive/jdbc/TestJdbcDriver2.java Fri Aug 9 21:49:31 2013
@@ -389,6 +389,46 @@ public class TestJdbcDriver2 extends Tes
expectedException);
}
+ /**
+ * Execute non-select statements using execute() and executeUpdated() APIs
+ * of PreparedStatement interface
+ * @throws Exception
+ */
+ public void testExecutePreparedStatement() throws Exception {
+ String key = "testKey";
+ String val1 = "val1";
+ String val2 = "val2";
+ PreparedStatement ps = con.prepareStatement("set " + key + " = ?");
+
+ // execute() of Prepared statement
+ ps.setString(1, val1);
+ ps.execute();
+ verifyConfValue(key, val1);
+
+ // executeUpdate() of Prepared statement
+ ps.clearParameters();
+ ps.setString(1, val2);
+ ps.executeUpdate();
+ verifyConfValue(key, val2);
+ }
+
+ /**
+ * Execute "set x" and extract value from key=val format result
+ * Verify the extracted value
+ * @param stmt
+ * @return
+ * @throws Exception
+ */
+ private void verifyConfValue(String key, String expectedVal) throws Exception {
+ Statement stmt = con.createStatement();
+ ResultSet res = stmt.executeQuery("set " + key);
+ assertTrue(res.next());
+ String resultValues[] = res.getString(1).split("="); // "key = 'val'"
+ assertEquals("Result not in key = val format", 2, resultValues.length);
+ String result = resultValues[1].substring(1, resultValues[1].length() -1); // remove '
+ assertEquals("Conf value should be set by execute()", expectedVal, result);
+ }
+
public final void testSelectAll() throws Exception {
doTestSelectAll(tableName, -1, -1); // tests not setting maxRows (return all)
doTestSelectAll(tableName, 0, -1); // tests setting maxRows to 0 (return all)