Skip to content

Commit

Permalink
Merge pull request #3869 from katzyn/information_schema
Browse files Browse the repository at this point in the history
Fix INFORMATION_SCHEMA.SESSIONS.ISOLATION_LEVEL
  • Loading branch information
katzyn committed Aug 15, 2023
2 parents fcc5461 + 5083086 commit 6a51ba4
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 2 deletions.
2 changes: 2 additions & 0 deletions h2/src/docsrc/html/changelog.html
Expand Up @@ -21,6 +21,8 @@ <h1>Change Log</h1>

<h2>Next Version (unreleased)</h2>
<ul>
<li>Issue #3868: INFORMATION_SCHEMA.SESSIONS.ISOLATION_LEVEL returns isolation level of the current session in all rows
</li>
<li>RP #3865: Add possibility to enable virtual worker threads in TCP, Web, and PG servers on Java 21+
</li>
<li>PR #3864: Improve performance of TCP client driver when it is used from virtual threads
Expand Down
2 changes: 1 addition & 1 deletion h2/src/main/org/h2/table/InformationSchemaTable.java
Expand Up @@ -2866,7 +2866,7 @@ private void sessions(SessionLocal session, ArrayList<Row> rows, SessionLocal s)
// SESSION_START
s.getSessionStart(),
// ISOLATION_LEVEL
session.getIsolationLevel().getSQL(),
s.getIsolationLevel().getSQL(),
// EXECUTING_STATEMENT
command == null ? null : command.toString(),
// EXECUTING_STATEMENT_START
Expand Down
2 changes: 1 addition & 1 deletion h2/src/main/org/h2/table/InformationSchemaTableLegacy.java
Expand Up @@ -1891,7 +1891,7 @@ public ArrayList<Row> generateRows(SessionLocal session, SearchRow first, Search
// SESSION_START
s.getSessionStart(),
// ISOLATION_LEVEL
session.getIsolationLevel().getSQL(),
s.getIsolationLevel().getSQL(),
// STATEMENT
command == null ? null : command.toString(),
// STATEMENT_START
Expand Down
53 changes: 53 additions & 0 deletions h2/src/test/org/h2/test/db/TestTransaction.java
Expand Up @@ -61,6 +61,7 @@ public void test() throws Exception {
testIsolationLevels4();
testIsolationLevelsCountAggregate();
testIsolationLevelsCountAggregate2();
testIsolationLevelsMetadata();
deleteDb("transaction");
}

Expand Down Expand Up @@ -1308,4 +1309,56 @@ private void testIsolationLevelCountAggregate2(PreparedStatement prep, long expe
assertEquals(expected, rs.getLong(1));
}

private void testIsolationLevelsMetadata() throws SQLException {
deleteDb("transaction");
try (Connection conn1 = getConnection("transaction"); Connection conn2 = getConnection("transaction")) {
PreparedStatement prep1 = conn1.prepareStatement(
"SELECT ISOLATION_LEVEL, SESSION_ID = SESSION_ID() FROM INFORMATION_SCHEMA.SESSIONS");
PreparedStatement prep2 = conn2.prepareStatement(
"SELECT ISOLATION_LEVEL, SESSION_ID = SESSION_ID() FROM INFORMATION_SCHEMA.SESSIONS");
for (int isolationLevel : new int[] { Connection.TRANSACTION_READ_UNCOMMITTED,
Connection.TRANSACTION_READ_COMMITTED, Connection.TRANSACTION_REPEATABLE_READ,
Constants.TRANSACTION_SNAPSHOT, Connection.TRANSACTION_SERIALIZABLE }) {
conn2.setTransactionIsolation(isolationLevel);
String level;
switch (isolationLevel) {
case Connection.TRANSACTION_READ_UNCOMMITTED:
level = "READ UNCOMMITTED";
break;
case Connection.TRANSACTION_READ_COMMITTED:
level = "READ COMMITTED";
break;
case Connection.TRANSACTION_REPEATABLE_READ:
level = "REPEATABLE READ";
break;
case Constants.TRANSACTION_SNAPSHOT:
level = "SNAPSHOT";
break;
case Connection.TRANSACTION_SERIALIZABLE:
level = "SERIALIZABLE";
break;
default:
throw new IllegalArgumentException();
}
ResultSet rs = prep1.executeQuery();
while (rs.next()) {
if (rs.getBoolean(2)) {
assertEquals("READ COMMITTED", rs.getString(1));
} else {
assertEquals(level, rs.getString(1));
}
}
rs = prep2.executeQuery();
while (rs.next()) {
if (rs.getBoolean(2)) {
assertEquals(level, rs.getString(1));
} else {
assertEquals("READ COMMITTED", rs.getString(1));
}
}
}
}
deleteDb("transaction");
}

}

0 comments on commit 6a51ba4

Please sign in to comment.