This is an automated email from the ASF dual-hosted git repository.
terrymanu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 0fde69148ac Fix NullPointerException in Firebird transaction isolation
resolution (#39136)
0fde69148ac is described below
commit 0fde69148acb9f6831cae43fdaea7df06761c86a
Author: Eunbin Son <[email protected]>
AuthorDate: Tue Jul 28 15:25:46 2026 +0900
Fix NullPointerException in Firebird transaction isolation resolution
(#39136)
* Fix NullPointerException in Firebird transaction isolation resolution
* Resolve omitted Firebird isolation flag to REPEATABLE_READ instead of NONE
An absent isolation flag means Firebird's default concurrency
(isc_tpb_concurrency), which maps to REPEATABLE_READ. Returning NONE
produced TRANSACTION_NONE, which Jaybird rejects. Resolve the no-flag
case to REPEATABLE_READ and update the regression test.
---------
Co-authored-by: Liang Zhang <[email protected]>
---
.../FirebirdStartTransactionPacket.java | 6 +++---
.../FirebirdStartTransactionPacketTest.java | 23 +++-------------------
2 files changed, 6 insertions(+), 23 deletions(-)
diff --git
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/transaction/FirebirdStartTransactionPacket.java
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/transaction/FirebirdStartTransactionPacket.java
index 6bbe0843e02..39075e74281 100644
---
a/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/transaction/FirebirdStartTransactionPacket.java
+++
b/database/protocol/dialect/firebird/src/main/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/transaction/FirebirdStartTransactionPacket.java
@@ -67,13 +67,13 @@ public final class FirebirdStartTransactionPacket extends
FirebirdCommandPacket
if (null !=
tpb.getValue(FirebirdTransactionParameterBufferType.READ_COMMITTED)) {
return TransactionIsolationLevel.READ_COMMITTED;
}
- if (tpb.getValue(FirebirdTransactionParameterBufferType.CONCURRENCY)) {
+ if (null !=
tpb.getValue(FirebirdTransactionParameterBufferType.CONCURRENCY)) {
return TransactionIsolationLevel.REPEATABLE_READ;
}
- if (tpb.getValue(FirebirdTransactionParameterBufferType.CONSISTENCY)) {
+ if (null !=
tpb.getValue(FirebirdTransactionParameterBufferType.CONSISTENCY)) {
return TransactionIsolationLevel.SERIALIZABLE;
}
- return TransactionIsolationLevel.NONE;
+ return TransactionIsolationLevel.REPEATABLE_READ;
}
@Override
diff --git
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/transaction/FirebirdStartTransactionPacketTest.java
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/transaction/FirebirdStartTransactionPacketTest.java
index 7743e6f7f56..c63b0304dc6 100644
---
a/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/transaction/FirebirdStartTransactionPacketTest.java
+++
b/database/protocol/dialect/firebird/src/test/java/org/apache/shardingsphere/database/protocol/firebird/packet/command/query/transaction/FirebirdStartTransactionPacketTest.java
@@ -19,16 +19,12 @@ package
org.apache.shardingsphere.database.protocol.firebird.packet.command.quer
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
-import lombok.SneakyThrows;
-import
org.apache.shardingsphere.database.protocol.firebird.constant.buffer.FirebirdParameterBuffer;
import
org.apache.shardingsphere.database.protocol.firebird.constant.buffer.type.FirebirdTransactionParameterBufferType;
import
org.apache.shardingsphere.database.protocol.firebird.payload.FirebirdPacketPayload;
import
org.apache.shardingsphere.sql.parser.statement.core.enums.TransactionIsolationLevel;
import org.junit.jupiter.api.Test;
-import org.mockito.internal.configuration.plugins.Plugins;
import java.nio.charset.StandardCharsets;
-import java.util.Map;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -64,25 +60,12 @@ class FirebirdStartTransactionPacketTest {
@Test
void assertIsolationLevelSerializable() {
- FirebirdStartTransactionPacket packet = new
FirebirdStartTransactionPacket(createPayload(1,
FirebirdTransactionParameterBufferType.CONSISTENCY));
-
getParameterBuffer(packet).put(FirebirdTransactionParameterBufferType.CONCURRENCY,
false);
- assertThat(packet.getIsolationLevel(),
is(TransactionIsolationLevel.SERIALIZABLE));
+ assertThat(new FirebirdStartTransactionPacket(createPayload(1,
FirebirdTransactionParameterBufferType.CONSISTENCY)).getIsolationLevel(),
is(TransactionIsolationLevel.SERIALIZABLE));
}
@Test
- void assertIsolationLevelNone() {
- FirebirdStartTransactionPacket packet = new
FirebirdStartTransactionPacket(createPayload(1));
- Map<FirebirdTransactionParameterBufferType, Object> parameterBuffer =
getParameterBuffer(packet);
-
parameterBuffer.put(FirebirdTransactionParameterBufferType.CONCURRENCY, false);
-
parameterBuffer.put(FirebirdTransactionParameterBufferType.CONSISTENCY, false);
- assertThat(packet.getIsolationLevel(),
is(TransactionIsolationLevel.NONE));
- }
-
- @SuppressWarnings("unchecked")
- @SneakyThrows(ReflectiveOperationException.class)
- private Map<FirebirdTransactionParameterBufferType, Object>
getParameterBuffer(final FirebirdStartTransactionPacket packet) {
- FirebirdParameterBuffer tpb = (FirebirdParameterBuffer)
Plugins.getMemberAccessor().get(FirebirdStartTransactionPacket.class.getDeclaredField("tpb"),
packet);
- return (Map<FirebirdTransactionParameterBufferType, Object>)
Plugins.getMemberAccessor().get(FirebirdParameterBuffer.class.getDeclaredField("parameterBuffer"),
tpb);
+ void assertIsolationLevelDefaultsToRepeatableRead() {
+ assertThat(new
FirebirdStartTransactionPacket(createPayload(1)).getIsolationLevel(),
is(TransactionIsolationLevel.REPEATABLE_READ));
}
@Test