You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ja...@apache.org on 2015/12/31 02:53:29 UTC
[4/7] phoenix git commit: PHOENIX-2549 Modify Phoenix
DatabaseMetaData implementation for transaction support
PHOENIX-2549 Modify Phoenix DatabaseMetaData implementation for transaction support
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/8b3ca756
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/8b3ca756
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/8b3ca756
Branch: refs/heads/4.x-HBase-0.98
Commit: 8b3ca756ca6a0008f9710ff69d1c1bce430d6080
Parents: 3172ed4
Author: James Taylor <jt...@salesforce.com>
Authored: Wed Dec 30 10:43:30 2015 -0800
Committer: James Taylor <jt...@salesforce.com>
Committed: Wed Dec 30 17:47:33 2015 -0800
----------------------------------------------------------------------
.../phoenix/exception/SQLExceptionCode.java | 1 +
.../apache/phoenix/jdbc/PhoenixConnection.java | 12 ++++--
.../phoenix/jdbc/PhoenixDatabaseMetaData.java | 44 +++++---------------
.../apache/phoenix/jdbc/PhoenixDriverTest.java | 27 ++++++++++++
4 files changed, 48 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/8b3ca756/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java b/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java
index 36036ae..228f06f 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java
@@ -282,6 +282,7 @@ public enum SQLExceptionCode {
CANNOT_ALTER_TO_BE_TXN_WITH_ROW_TIMESTAMP(1081, "44A12", "Cannot alter table to be transactional table if transactions are disabled"),
TX_MUST_BE_ENABLED_TO_SET_TX_CONTEXT(1082, "44A13", "Cannot set transaction context if transactions are disabled"),
TX_MUST_BE_ENABLED_TO_SET_AUTO_FLUSH(1083, "44A14", "Cannot set auto flush if transactions are disabled"),
+ TX_MUST_BE_ENABLED_TO_SET_ISOLATION_LEVEL(1084, "44A15", "Cannot set isolation level to TRANSACTION_READ_COMMITTED or TRANSACTION_SERIALIZABLE if transactions are disabled"),
/** Sequence related */
SEQUENCE_ALREADY_EXIST(1200, "42Z00", "Sequence already exists.", new Factory() {
http://git-wip-us.apache.org/repos/asf/phoenix/blob/8b3ca756/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixConnection.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixConnection.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixConnection.java
index 23d3235..04016c0 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixConnection.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixConnection.java
@@ -633,7 +633,10 @@ public class PhoenixConnection implements Connection, MetaDataMutated {
@Override
public int getTransactionIsolation() throws SQLException {
- return Connection.TRANSACTION_READ_COMMITTED;
+ boolean transactionsEnabled = getQueryServices().getProps().getBoolean(QueryServices.TRANSACTIONS_ENABLED,
+ QueryServicesOptions.DEFAULT_TRANSACTIONS_ENABLED);
+ return transactionsEnabled ?
+ Connection.TRANSACTION_SERIALIZABLE : Connection.TRANSACTION_READ_COMMITTED;
}
@Override
@@ -793,8 +796,11 @@ public class PhoenixConnection implements Connection, MetaDataMutated {
@Override
public void setTransactionIsolation(int level) throws SQLException {
- if (level != Connection.TRANSACTION_READ_COMMITTED) {
- throw new SQLFeatureNotSupportedException();
+ boolean transactionsEnabled = getQueryServices().getProps().getBoolean(QueryServices.TRANSACTIONS_ENABLED,
+ QueryServicesOptions.DEFAULT_TRANSACTIONS_ENABLED);
+ if (!transactionsEnabled && (level == Connection.TRANSACTION_REPEATABLE_READ || level == Connection.TRANSACTION_SERIALIZABLE)) {
+ throw new SQLExceptionInfo.Builder(SQLExceptionCode.TX_MUST_BE_ENABLED_TO_SET_ISOLATION_LEVEL)
+ .build().buildException();
}
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/8b3ca756/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java
index 87c02d0..a4748b3 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java
@@ -73,30 +73,8 @@ import com.google.common.collect.Lists;
/**
*
- * JDBC DatabaseMetaData implementation of Phoenix reflecting read-only nature of driver.
- * Supported metadata methods include:
- * {@link #getTables(String, String, String, String[])}
- * {@link #getColumns(String, String, String, String)}
- * {@link #getTableTypes()}
- * {@link #getPrimaryKeys(String, String, String)}
- * {@link #getIndexInfo(String, String, String, boolean, boolean)}
- * {@link #getSchemas()}
- * {@link #getSchemas(String, String)}
- * {@link #getDatabaseMajorVersion()}
- * {@link #getDatabaseMinorVersion()}
- * {@link #getClientInfoProperties()}
- * {@link #getConnection()}
- * {@link #getDatabaseProductName()}
- * {@link #getDatabaseProductVersion()}
- * {@link #getDefaultTransactionIsolation()}
- * {@link #getDriverName()}
- * {@link #getDriverVersion()}
- * {@link #getSuperTables(String, String, String)}
- * {@link #getCatalogs()}
- * Other ResultSet methods return an empty result set.
- *
- *
- * @since 0.1
+ * JDBC DatabaseMetaData implementation of Phoenix.
+ *
*/
public class PhoenixDatabaseMetaData implements DatabaseMetaData {
public static final int INDEX_NAME_INDEX = 4; // Shared with FAMILY_NAME_INDEX
@@ -1156,32 +1134,32 @@ public class PhoenixDatabaseMetaData implements DatabaseMetaData {
@Override
public boolean othersDeletesAreVisible(int type) throws SQLException {
- return true;
+ return false;
}
@Override
public boolean othersInsertsAreVisible(int type) throws SQLException {
- return true;
+ return false;
}
@Override
public boolean othersUpdatesAreVisible(int type) throws SQLException {
- return true;
+ return false;
}
@Override
public boolean ownDeletesAreVisible(int type) throws SQLException {
- return false;
+ return true;
}
@Override
public boolean ownInsertsAreVisible(int type) throws SQLException {
- return false;
+ return true;
}
@Override
public boolean ownUpdatesAreVisible(int type) throws SQLException {
- return false;
+ return true;
}
@Override
@@ -1387,7 +1365,7 @@ public class PhoenixDatabaseMetaData implements DatabaseMetaData {
@Override
public boolean supportsMultipleTransactions() throws SQLException {
- return false;
+ return true;
}
@Override
@@ -1534,12 +1512,12 @@ public class PhoenixDatabaseMetaData implements DatabaseMetaData {
@Override
public boolean supportsTransactionIsolationLevel(int level) throws SQLException {
- return level == connection.getTransactionIsolation();
+ return true;
}
@Override
public boolean supportsTransactions() throws SQLException {
- return false;
+ return true;
}
@Override
http://git-wip-us.apache.org/repos/asf/phoenix/blob/8b3ca756/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixDriverTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixDriverTest.java b/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixDriverTest.java
index 61dc442..b70ea71 100644
--- a/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixDriverTest.java
+++ b/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixDriverTest.java
@@ -87,4 +87,31 @@ public class PhoenixDriverTest extends BaseConnectionlessQueryTest {
assertEquals(SQLExceptionCode.INVALID_SCN.getErrorCode(), e.getErrorCode());
}
}
+
+ @Test
+ public void testDisallowIsolationLevel() throws SQLException {
+ Connection conn = DriverManager.getConnection(getUrl());
+ conn.setTransactionIsolation(Connection.TRANSACTION_NONE);
+ conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
+ conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+ try {
+ conn = DriverManager.getConnection(getUrl());
+ conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
+ fail();
+ } catch(SQLException e) {
+ assertEquals(SQLExceptionCode.TX_MUST_BE_ENABLED_TO_SET_ISOLATION_LEVEL.getErrorCode(), e.getErrorCode());
+ }
+ try {
+ conn = DriverManager.getConnection(getUrl());
+ conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
+ fail();
+ } catch(SQLException e) {
+ assertEquals(SQLExceptionCode.TX_MUST_BE_ENABLED_TO_SET_ISOLATION_LEVEL.getErrorCode(), e.getErrorCode());
+ }
+ Properties props = PropertiesUtil.deepCopy(TestUtil.TEST_PROPERTIES);
+ props.setProperty(QueryServices.TRANSACTIONS_ENABLED, Boolean.toString(true));
+ conn = DriverManager.getConnection(getUrl(), props);
+ conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
+ conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
+ }
}