You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ch...@apache.org on 2026/07/21 10:08:05 UTC
(shardingsphere) branch master updated: Fix MySQL prepared statement parameter signedness in Proxy (#39204)
This is an automated email from the ASF dual-hosted git repository.
FlyingZC 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 80e6541874d Fix MySQL prepared statement parameter signedness in Proxy (#39204)
80e6541874d is described below
commit 80e6541874d47b5814e3d1400c925d6ff3afa0ed
Author: Raigor <ra...@gmail.com>
AuthorDate: Tue Jul 21 18:07:58 2026 +0800
Fix MySQL prepared statement parameter signedness in Proxy (#39204)
* Fix MySQL prepared statement parameter signedness in Proxy (#39203)
* Update RELEASE-NOTES.md
---
RELEASE-NOTES.md | 1 +
.../binary/execute/MySQLComStmtExecutePacket.java | 15 +++++-----
.../execute/MySQLComStmtExecutePacketTest.java | 20 ++++++-------
.../query/binary/MySQLServerPreparedStatement.java | 2 --
.../execute/MySQLComStmtExecuteExecutor.java | 3 +-
.../prepare/MySQLComStmtPrepareExecutor.java | 7 +----
.../command/MySQLCommandPacketFactoryTest.java | 4 +--
.../admin/MySQLComResetConnectionExecutorTest.java | 3 +-
.../MySQLComStmtSendLongDataExecutorTest.java | 2 +-
.../execute/MySQLComStmtExecuteExecutorTest.java | 33 +++++++++++-----------
.../MySQLPreparedStatementMetadataFactoryTest.java | 2 +-
.../reset/MySQLComStmtResetExecutorTest.java | 3 +-
12 files changed, 40 insertions(+), 55 deletions(-)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index d7afbd69cf4..62001a23bde 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -33,6 +33,7 @@
1. Proxy: Fix incorrect generated key handling for explicit auto-increment values - [#38810](https://github.com/apache/shardingsphere/pull/38810)
1. Proxy: Fix microseconds decoded as nanoseconds in MySQL binary TIME value - [#39138](https://github.com/apache/shardingsphere/pull/39138)
1. Proxy: Fix MySQL BLOB data corruption when string-like prepared statement parameters target BLOB columns - [#39072](https://github.com/apache/shardingsphere/pull/39072)
+1. Proxy: Fix MySQL prepared statement parameter signedness decoding - [#39204](https://github.com/apache/shardingsphere/pull/39204)
1. JDBC & Proxy: Remove default MySQL prepared statement query properties when creating data sources - [#38593](https://github.com/apache/shardingsphere/pull/38593)
1. Mode: Fix rule metadata not removed from memory after dropping rules in Etcd cluster mode - [#38561](https://github.com/apache/shardingsphere/pull/38561)
1. Agent: Fix wrong target class name in StaticMethodAdviceExecutor error logs - [#39077](https://github.com/apache/shardingsphere/pull/39077)
diff --git a/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/MySQLComStmtExecutePacket.java b/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/MySQLComStmtExecutePacket.java
index d8289e7ee04..6f2692071c4 100644
--- a/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/MySQLComStmtExecutePacket.java
+++ b/database/protocol/dialect/mysql/src/main/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/MySQLComStmtExecutePacket.java
@@ -23,7 +23,6 @@ import org.apache.shardingsphere.database.protocol.mysql.constant.MySQLBinaryCol
import org.apache.shardingsphere.database.protocol.mysql.constant.MySQLNewParametersBoundFlag;
import org.apache.shardingsphere.database.protocol.mysql.packet.command.MySQLCommandPacket;
import org.apache.shardingsphere.database.protocol.mysql.packet.command.MySQLCommandPacketType;
-import org.apache.shardingsphere.database.protocol.mysql.packet.command.query.MySQLColumnDefinitionFlag;
import org.apache.shardingsphere.database.protocol.mysql.packet.command.query.binary.MySQLPreparedStatementParameterType;
import org.apache.shardingsphere.database.protocol.mysql.packet.command.query.binary.execute.protocol.MySQLBinaryProtocolValue;
import org.apache.shardingsphere.database.protocol.mysql.packet.command.query.binary.execute.protocol.MySQLBinaryProtocolValueFactory;
@@ -47,6 +46,8 @@ public final class MySQLComStmtExecutePacket extends MySQLCommandPacket {
private static final int NULL_BITMAP_OFFSET = 0;
+ private static final int UNSIGNED_FLAG = 0x80;
+
private final MySQLPacketPayload payload;
private final int statementId;
@@ -94,24 +95,24 @@ public final class MySQLComStmtExecutePacket extends MySQLCommandPacket {
*
* @param paramTypes parameter type of values
* @param longDataIndexes indexes of long data
- * @param parameterFlags column definition flag of parameters
* @param parameterColumnTypes column type of parameters from COM_STMT_PREPARE
* @return parameter values
* @throws SQLException SQL exception
*/
public List<Object> readParameters(final List<MySQLPreparedStatementParameterType> paramTypes, final Set<Integer> longDataIndexes,
- final List<Integer> parameterFlags, final List<MySQLBinaryColumnType> parameterColumnTypes) throws SQLException {
+ final List<MySQLBinaryColumnType> parameterColumnTypes) throws SQLException {
List<Object> result = new ArrayList<>(paramTypes.size());
for (int paramIndex = 0; paramIndex < paramTypes.size(); paramIndex++) {
if (longDataIndexes.contains(paramIndex)) {
result.add(null);
continue;
}
- MySQLBinaryColumnType parameterType = paramTypes.get(paramIndex).getColumnType();
+ MySQLPreparedStatementParameterType parameter = paramTypes.get(paramIndex);
+ MySQLBinaryColumnType parameterType = parameter.getColumnType();
MySQLBinaryProtocolValue binaryProtocolValue = MySQLBinaryProtocolValueFactory.getBinaryProtocolValue(parameterType);
Object value = nullBitmap.isNullParameter(paramIndex)
? null
- : readParameterValue(binaryProtocolValue, parameterColumnTypes, paramIndex, parameterType, parameterFlags);
+ : readParameterValue(binaryProtocolValue, parameterColumnTypes, paramIndex, parameterType, parameter.getUnsignedFlag());
value = decodeStringParameterValue(parameterColumnTypes, paramIndex, parameterType, value);
result.add(value);
}
@@ -119,11 +120,11 @@ public final class MySQLComStmtExecutePacket extends MySQLCommandPacket {
}
private Object readParameterValue(final MySQLBinaryProtocolValue binaryProtocolValue, final List<MySQLBinaryColumnType> parameterColumnTypes, final int paramIndex,
- final MySQLBinaryColumnType parameterType, final List<Integer> parameterFlags) throws SQLException {
+ final MySQLBinaryColumnType parameterType, final int unsignedFlag) throws SQLException {
if (isStringParameterType(parameterType) && isBinaryColumnType(parameterColumnTypes, paramIndex)) {
return payload.readStringLenencByBytes();
}
- return binaryProtocolValue.read(payload, (parameterFlags.get(paramIndex) & MySQLColumnDefinitionFlag.UNSIGNED.getValue()) == MySQLColumnDefinitionFlag.UNSIGNED.getValue());
+ return binaryProtocolValue.read(payload, (unsignedFlag & UNSIGNED_FLAG) == UNSIGNED_FLAG);
}
private MySQLBinaryColumnType getParameterColumnType(final List<MySQLBinaryColumnType> parameterColumnTypes, final int paramIndex) {
diff --git a/database/protocol/dialect/mysql/src/test/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/MySQLComStmtExecutePacketTest.java b/database/protocol/dialect/mysql/src/test/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/MySQLComStmtExecutePacketTest.java
index c7910017c9b..34bcc3bdd89 100644
--- a/database/protocol/dialect/mysql/src/test/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/MySQLComStmtExecutePacketTest.java
+++ b/database/protocol/dialect/mysql/src/test/java/org/apache/shardingsphere/database/protocol/mysql/packet/command/query/binary/execute/MySQLComStmtExecutePacketTest.java
@@ -21,7 +21,6 @@ import io.netty.buffer.Unpooled;
import org.apache.shardingsphere.database.protocol.mysql.constant.MySQLBinaryColumnType;
import org.apache.shardingsphere.database.protocol.mysql.constant.MySQLNewParametersBoundFlag;
import org.apache.shardingsphere.database.protocol.mysql.packet.command.query.binary.MySQLPreparedStatementParameterType;
-import org.apache.shardingsphere.database.protocol.mysql.packet.command.query.MySQLColumnDefinitionFlag;
import org.apache.shardingsphere.database.protocol.mysql.payload.MySQLPacketPayload;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -74,21 +73,20 @@ class MySQLComStmtExecutePacketTest {
@Test
void assertReadParametersWithSignedInteger() throws SQLException {
- byte[] data = {0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00};
+ byte[] data = {0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
MySQLPacketPayload payload = new MySQLPacketPayload(Unpooled.wrappedBuffer(data), StandardCharsets.UTF_8);
MySQLComStmtExecutePacket actual = new MySQLComStmtExecutePacket(payload, 1);
List<MySQLPreparedStatementParameterType> parameterTypes = actual.getNewParameterTypes();
- assertThat(actual.readParameters(parameterTypes, Collections.emptySet(), Collections.singletonList(0), Collections.emptyList()), is(Collections.<Object>singletonList(1)));
+ assertThat(actual.readParameters(parameterTypes, Collections.emptySet(), Collections.emptyList()), is(Collections.<Object>singletonList(-1)));
}
@Test
void assertReadParametersWithUnsignedInteger() throws SQLException {
- byte[] data = {0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
+ byte[] data = {0x01, 0x00, 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, (byte) 0x80, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
MySQLPacketPayload payload = new MySQLPacketPayload(Unpooled.wrappedBuffer(data), StandardCharsets.UTF_8);
MySQLComStmtExecutePacket actual = new MySQLComStmtExecutePacket(payload, 1);
List<MySQLPreparedStatementParameterType> parameterTypes = actual.getNewParameterTypes();
- int unsignedFlag = MySQLColumnDefinitionFlag.UNSIGNED.getValue();
- assertThat(actual.readParameters(parameterTypes, Collections.emptySet(), Collections.singletonList(unsignedFlag), Collections.emptyList()), is(Collections.<Object>singletonList(4294967295L)));
+ assertThat(actual.readParameters(parameterTypes, Collections.emptySet(), Collections.emptyList()), is(Collections.<Object>singletonList(4294967295L)));
}
@Test
@@ -97,8 +95,7 @@ class MySQLComStmtExecutePacketTest {
MySQLPacketPayload payload = new MySQLPacketPayload(Unpooled.wrappedBuffer(data), StandardCharsets.UTF_8);
MySQLComStmtExecutePacket actual = new MySQLComStmtExecutePacket(payload, 1);
List<MySQLPreparedStatementParameterType> parameterTypes = actual.getNewParameterTypes();
- List<Integer> parameterFlags = Collections.singletonList(0);
- assertThat(actual.readParameters(parameterTypes, Collections.emptySet(), parameterFlags, Collections.emptyList()), is(Collections.singletonList(null)));
+ assertThat(actual.readParameters(parameterTypes, Collections.emptySet(), Collections.emptyList()), is(Collections.singletonList(null)));
}
@Test
@@ -107,7 +104,7 @@ class MySQLComStmtExecutePacketTest {
MySQLPacketPayload payload = new MySQLPacketPayload(Unpooled.wrappedBuffer(data), StandardCharsets.UTF_8);
MySQLComStmtExecutePacket actual = new MySQLComStmtExecutePacket(payload, 1);
List<MySQLPreparedStatementParameterType> parameterTypes = actual.getNewParameterTypes();
- assertThat(actual.readParameters(parameterTypes, Collections.singleton(0), Collections.emptyList(), Collections.emptyList()), is(Collections.singletonList(null)));
+ assertThat(actual.readParameters(parameterTypes, Collections.singleton(0), Collections.emptyList()), is(Collections.singletonList(null)));
}
@ParameterizedTest(name = "{0}")
@@ -118,7 +115,7 @@ class MySQLComStmtExecutePacketTest {
MySQLPacketPayload payload = new MySQLPacketPayload(Unpooled.wrappedBuffer(data), StandardCharsets.UTF_8);
MySQLComStmtExecutePacket actual = new MySQLComStmtExecutePacket(payload, 1);
List<MySQLPreparedStatementParameterType> parameterTypes = actual.getNewParameterTypes();
- Object actualValue = actual.readParameters(parameterTypes, Collections.emptySet(), Collections.singletonList(0), Collections.singletonList(parameterColumnType)).get(0);
+ Object actualValue = actual.readParameters(parameterTypes, Collections.emptySet(), Collections.singletonList(parameterColumnType)).get(0);
assertTrue(actualValue instanceof byte[]);
assertArrayEquals(new byte[]{(byte) 0xac, (byte) 0xed, (byte) 0xff}, (byte[]) actualValue);
}
@@ -148,8 +145,7 @@ class MySQLComStmtExecutePacketTest {
MySQLPacketPayload payload = new MySQLPacketPayload(Unpooled.wrappedBuffer(data), StandardCharsets.UTF_8);
MySQLComStmtExecutePacket actual = new MySQLComStmtExecutePacket(payload, 1);
List<MySQLPreparedStatementParameterType> parameterTypes = actual.getNewParameterTypes();
- List<Integer> parameterFlags = Collections.singletonList(0);
- Object actualValue = actual.readParameters(parameterTypes, Collections.emptySet(), parameterFlags, parameterColumnTypes).get(0);
+ Object actualValue = actual.readParameters(parameterTypes, Collections.emptySet(), parameterColumnTypes).get(0);
assertThat(actualValue instanceof String, is(expectedString));
if (expectedString) {
assertThat(actualValue, is("a"));
diff --git a/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLServerPreparedStatement.java b/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLServerPreparedStatement.java
index b90132ecf36..5321944d8cb 100644
--- a/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLServerPreparedStatement.java
+++ b/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLServerPreparedStatement.java
@@ -44,8 +44,6 @@ public final class MySQLServerPreparedStatement implements ServerPreparedStateme
private final HintValueContext hintValueContext;
- private final List<Integer> parameterColumnDefinitionFlags;
-
private final List<MySQLBinaryColumnType> parameterColumnTypes = new CopyOnWriteArrayList<>();
private final List<MySQLPreparedStatementParameterType> parameterTypes = new CopyOnWriteArrayList<>();
diff --git a/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java b/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
index d2bb51cac4a..9805f53a341 100644
--- a/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
+++ b/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
@@ -74,8 +74,7 @@ public final class MySQLComStmtExecuteExecutor implements QueryCommandExecutor {
public Collection<DatabasePacket> execute() throws SQLException {
MySQLServerPreparedStatement preparedStatement = updateAndGetPreparedStatement();
List<MySQLPreparedStatementParameterType> parameterTypes = getParameterTypes(preparedStatement);
- List<Object> params = packet.readParameters(parameterTypes, preparedStatement.getLongData().keySet(),
- preparedStatement.getParameterColumnDefinitionFlags(), preparedStatement.getParameterColumnTypes());
+ List<Object> params = packet.readParameters(parameterTypes, preparedStatement.getLongData().keySet(), preparedStatement.getParameterColumnTypes());
preparedStatement.getLongData().forEach(params::set);
SQLStatementContext sqlStatementContext = preparedStatement.getSqlStatementContext();
if (sqlStatementContext instanceof ParameterAware) {
diff --git a/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java b/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
index 5d70307ea00..360066cf248 100644
--- a/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
+++ b/proxy/frontend/dialect/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
@@ -61,7 +61,6 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.sql.SQLException;
-import java.util.concurrent.CopyOnWriteArrayList;
/**
* COM_STMT_PREPARE command executor for MySQL.
@@ -87,7 +86,7 @@ public final class MySQLComStmtPrepareExecutor implements CommandExecutor {
SQLStatementContext sqlStatementContext = new SQLBindEngine(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(),
connectionSession.getCurrentDatabaseName(), packet.getHintValueContext()).bind(sqlStatement);
int statementId = MySQLStatementIdGenerator.getInstance().nextStatementId(connectionSession.getConnectionId());
- MySQLServerPreparedStatement serverPreparedStatement = new MySQLServerPreparedStatement(packet.getSQL(), sqlStatementContext, packet.getHintValueContext(), new CopyOnWriteArrayList<>());
+ MySQLServerPreparedStatement serverPreparedStatement = new MySQLServerPreparedStatement(packet.getSQL(), sqlStatementContext, packet.getHintValueContext());
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, serverPreparedStatement);
return createPackets(sqlStatementContext, statementId, serverPreparedStatement);
}
@@ -132,7 +131,6 @@ public final class MySQLComStmtPrepareExecutor implements CommandExecutor {
MySQLColumnDefinition41Packet defaultColumnPacket = null;
Collection<ParameterMarkerSegment> parameterMarkerSegments = sqlStatementContext.getSqlStatement().getParameterMarkers();
Collection<MySQLPacket> result = new ArrayList<>(parameterMarkerSegments.size());
- Collection<Integer> paramColumnDefinitionFlags = new ArrayList<>(parameterMarkerSegments.size());
Collection<MySQLBinaryColumnType> parameterColumnTypes = new ArrayList<>(parameterMarkerSegments.size());
for (int index = 0; index < parameterMarkerSegments.size(); index++) {
ShardingSphereColumn column = null;
@@ -143,18 +141,15 @@ public final class MySQLComStmtPrepareExecutor implements CommandExecutor {
int columnDefinitionFlag = calculateColumnDefinitionFlag(column);
result.add(createMySQLColumnDefinition41PacketByCache(characterSet, columnPacketCache, column, columnDefinitionFlag));
MySQLBinaryColumnType columnType = MySQLBinaryColumnType.valueOfJDBCType(column.getDataType());
- paramColumnDefinitionFlags.add(columnDefinitionFlag);
parameterColumnTypes.add(columnType);
} else {
if (null == defaultColumnPacket) {
defaultColumnPacket = createMySQLColumnDefinition41Packet(characterSet, 0, MySQLBinaryColumnType.VAR_STRING);
}
result.add(defaultColumnPacket);
- paramColumnDefinitionFlags.add(0);
parameterColumnTypes.add(MySQLBinaryColumnType.NULL);
}
}
- serverPreparedStatement.getParameterColumnDefinitionFlags().addAll(paramColumnDefinitionFlags);
serverPreparedStatement.getParameterColumnTypes().addAll(parameterColumnTypes);
return result;
}
diff --git a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactoryTest.java b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactoryTest.java
index 8b06e1766e1..9339532b2de 100644
--- a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactoryTest.java
+++ b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/MySQLCommandPacketFactoryTest.java
@@ -48,8 +48,6 @@ import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
-import java.util.Collections;
-
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.isA;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -102,7 +100,7 @@ class MySQLCommandPacketFactoryTest {
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(serverPreparedStatementRegistry);
SelectStatement sqlStatement = SelectStatement.builder().databaseType(databaseType).build();
SQLStatementContext sqlStatementContext = new CommonSQLStatementContext(sqlStatement);
- serverPreparedStatementRegistry.addPreparedStatement(1, new MySQLServerPreparedStatement("SELECT 1", sqlStatementContext, new HintValueContext(), Collections.emptyList()));
+ serverPreparedStatementRegistry.addPreparedStatement(1, new MySQLServerPreparedStatement("SELECT 1", sqlStatementContext, new HintValueContext()));
assertThat(MySQLCommandPacketFactory.newInstance(MySQLCommandPacketType.COM_STMT_EXECUTE, payload, connectionSession), isA(MySQLComStmtExecutePacket.class));
}
diff --git a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/MySQLComResetConnectionExecutorTest.java b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/MySQLComResetConnectionExecutorTest.java
index 5115554bb16..928141cbce3 100644
--- a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/MySQLComResetConnectionExecutorTest.java
+++ b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/admin/MySQLComResetConnectionExecutorTest.java
@@ -33,7 +33,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
import java.sql.SQLException;
import java.util.Collection;
-import java.util.Collections;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -55,7 +54,7 @@ class MySQLComResetConnectionExecutorTest {
when(connectionSession.getTransactionStatus()).thenReturn(new TransactionStatus());
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
int statementId = 1;
- connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new MySQLServerPreparedStatement("", null, new HintValueContext(), Collections.emptyList()));
+ connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(statementId, new MySQLServerPreparedStatement("", null, new HintValueContext()));
Collection<DatabasePacket> actual = new MySQLComResetConnectionExecutor(connectionSession).execute();
assertThat(actual.size(), is(1));
assertThat(actual.iterator().next(), isA(MySQLOKPacket.class));
diff --git a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLComStmtSendLongDataExecutorTest.java b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLComStmtSendLongDataExecutorTest.java
index 559b8251fff..19fd14a21a2 100644
--- a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLComStmtSendLongDataExecutorTest.java
+++ b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/MySQLComStmtSendLongDataExecutorTest.java
@@ -44,7 +44,7 @@ class MySQLComStmtSendLongDataExecutorTest {
when(packet.getData()).thenReturn(data);
ConnectionSession connectionSession = mock(ConnectionSession.class);
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
- MySQLServerPreparedStatement preparedStatement = new MySQLServerPreparedStatement("INSERT INTO t (b) VALUES (?)", mock(), new HintValueContext(), Collections.emptyList());
+ MySQLServerPreparedStatement preparedStatement = new MySQLServerPreparedStatement("INSERT INTO t (b) VALUES (?)", mock(), new HintValueContext());
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(1, preparedStatement);
MySQLComStmtSendLongDataExecutor executor = new MySQLComStmtSendLongDataExecutor(packet, connectionSession);
Collection<DatabasePacket> actual = executor.execute();
diff --git a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutorTest.java b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutorTest.java
index 11d697e119c..36905a0dac4 100644
--- a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutorTest.java
+++ b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutorTest.java
@@ -125,15 +125,15 @@ class MySQLComStmtExecuteExecutorTest {
when(connectionSession.getDatabaseConnectionManager()).thenReturn(databaseConnectionManager);
SQLStatementContext selectStatementContext = prepareSelectStatementContext();
when(connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(1))
- .thenReturn(new MySQLServerPreparedStatement("SELECT * FROM tbl WHERE id = ?", selectStatementContext, new HintValueContext(), Collections.emptyList()));
+ .thenReturn(new MySQLServerPreparedStatement("SELECT * FROM tbl WHERE id = ?", selectStatementContext, new HintValueContext()));
UpdateStatementContext updateStatementContext = mock(UpdateStatementContext.class, RETURNS_DEEP_STUBS);
when(updateStatementContext.getSqlStatement()).thenReturn(prepareUpdateStatement());
when(updateStatementContext.getTablesContext().getDatabaseName()).thenReturn(Optional.empty());
when(connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(2))
- .thenReturn(new MySQLServerPreparedStatement("UPDATE tbl SET col=1 WHERE id = ?", updateStatementContext, new HintValueContext(), Collections.emptyList()));
+ .thenReturn(new MySQLServerPreparedStatement("UPDATE tbl SET col=1 WHERE id = ?", updateStatementContext, new HintValueContext()));
when(connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(3))
.thenReturn(
- new MySQLServerPreparedStatement("COMMIT", new CommonSQLStatementContext(new CommitStatement(databaseType)), new HintValueContext(), Collections.emptyList()));
+ new MySQLServerPreparedStatement("COMMIT", new CommonSQLStatementContext(new CommitStatement(databaseType)), new HintValueContext()));
ConnectionContext connectionContext = mockConnectionContext();
when(connectionSession.getConnectionContext()).thenReturn(connectionContext);
when(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData()).thenReturn(new ShardingSphereMetaData(Collections.emptyList(),
@@ -196,7 +196,7 @@ class MySQLComStmtExecuteExecutorTest {
when(packet.getStatementId()).thenReturn(2);
when(packet.getNewParametersBoundFlag()).thenReturn(MySQLNewParametersBoundFlag.PARAMETER_TYPE_EXIST);
when(packet.getNewParameterTypes()).thenReturn(Collections.singletonList(new MySQLPreparedStatementParameterType(MySQLBinaryColumnType.LONG, 0)));
- when(packet.readParameters(anyList(), any(), anyList(), anyList())).thenReturn(Collections.singletonList(1));
+ when(packet.readParameters(anyList(), any(), anyList())).thenReturn(Collections.singletonList(1));
MySQLComStmtExecuteExecutor executor = new MySQLComStmtExecuteExecutor(packet, connectionSession);
when(proxyBackendHandler.execute()).thenReturn(new UpdateResponseHeader(UpdateStatement.builder().databaseType(databaseType).build()));
when(ProxyBackendHandlerFactory.newInstance(eq(databaseType), any(QueryContext.class), eq(connectionSession), anyBoolean())).thenReturn(proxyBackendHandler);
@@ -232,13 +232,13 @@ class MySQLComStmtExecuteExecutorTest {
when(selectStatementContext.getTablesContext().getDatabaseName()).thenReturn(Optional.empty());
when(selectStatement.getParameterCount()).thenReturn(1);
when(connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(1))
- .thenReturn(new MySQLServerPreparedStatement("SELECT * FROM tbl WHERE id = ?", selectStatementContext, new HintValueContext(), Collections.singletonList(0)));
+ .thenReturn(new MySQLServerPreparedStatement("SELECT * FROM tbl WHERE id = ?", selectStatementContext, new HintValueContext()));
when(packet.getNewParameterTypes()).thenReturn(Collections.emptyList());
when(packet.getNewParametersBoundFlag()).thenReturn(MySQLNewParametersBoundFlag.PARAMETER_TYPE_NOT_EXIST);
MySQLNullBitmap nullBitmap = mock(MySQLNullBitmap.class);
when(nullBitmap.isNullParameter(0)).thenReturn(true);
when(packet.getNullBitmap()).thenReturn(nullBitmap);
- when(packet.readParameters(anyList(), any(), anyList(), anyList())).thenAnswer(invocation -> Collections.singletonList(null));
+ when(packet.readParameters(anyList(), any(), anyList())).thenAnswer(invocation -> Collections.singletonList(null));
MySQLComStmtExecuteExecutor executor = new MySQLComStmtExecuteExecutor(packet, connectionSession);
when(proxyBackendHandler.execute()).thenReturn(new UpdateResponseHeader(selectStatement));
AtomicReference<QueryContext> actualQueryContext = new AtomicReference<>();
@@ -251,7 +251,7 @@ class MySQLComStmtExecuteExecutorTest {
assertFalse(actual.hasNext());
assertThat(actualQueryContext.get().getParameters(), contains((Object) null));
ArgumentCaptor<List<MySQLPreparedStatementParameterType>> parameterTypesCaptor = ArgumentCaptor.forClass(List.class);
- verify(packet).readParameters(parameterTypesCaptor.capture(), any(), anyList(), anyList());
+ verify(packet).readParameters(parameterTypesCaptor.capture(), any(), anyList());
assertThat(parameterTypesCaptor.getValue().size(), is(1));
assertThat(parameterTypesCaptor.getValue().get(0).getColumnType(), is(MySQLBinaryColumnType.NULL));
}
@@ -266,14 +266,14 @@ class MySQLComStmtExecuteExecutorTest {
when(selectStatementContext.getTablesContext().getDatabaseName()).thenReturn(Optional.empty());
when(selectStatement.getParameterCount()).thenReturn(2);
when(connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(1))
- .thenReturn(new MySQLServerPreparedStatement("SELECT * FROM tbl WHERE col1 = ? AND col2 = ?", selectStatementContext, new HintValueContext(), Arrays.asList(0, 1)));
+ .thenReturn(new MySQLServerPreparedStatement("SELECT * FROM tbl WHERE col1 = ? AND col2 = ?", selectStatementContext, new HintValueContext()));
when(packet.getNewParameterTypes()).thenReturn(Collections.emptyList());
when(packet.getNewParametersBoundFlag()).thenReturn(MySQLNewParametersBoundFlag.PARAMETER_TYPE_NOT_EXIST);
MySQLNullBitmap nullBitmap = mock(MySQLNullBitmap.class);
when(nullBitmap.isNullParameter(0)).thenReturn(true);
when(nullBitmap.isNullParameter(1)).thenReturn(true);
when(packet.getNullBitmap()).thenReturn(nullBitmap);
- when(packet.readParameters(anyList(), any(), anyList(), anyList())).thenReturn(Arrays.asList(null, null));
+ when(packet.readParameters(anyList(), any(), anyList())).thenReturn(Arrays.asList(null, null));
MySQLComStmtExecuteExecutor executor = new MySQLComStmtExecuteExecutor(packet, connectionSession);
when(proxyBackendHandler.execute()).thenReturn(new UpdateResponseHeader(selectStatement));
AtomicReference<QueryContext> actualQueryContext = new AtomicReference<>();
@@ -286,7 +286,7 @@ class MySQLComStmtExecuteExecutorTest {
assertFalse(actual.hasNext());
assertThat(actualQueryContext.get().getParameters(), contains((Object) null, null));
ArgumentCaptor<List<MySQLPreparedStatementParameterType>> parameterTypesCaptor = ArgumentCaptor.forClass(List.class);
- verify(packet).readParameters(parameterTypesCaptor.capture(), any(), anyList(), anyList());
+ verify(packet).readParameters(parameterTypesCaptor.capture(), any(), anyList());
assertThat(parameterTypesCaptor.getValue().size(), is(2));
assertThat(parameterTypesCaptor.getValue().get(0).getColumnType(), is(MySQLBinaryColumnType.NULL));
assertThat(parameterTypesCaptor.getValue().get(1).getColumnType(), is(MySQLBinaryColumnType.NULL));
@@ -302,7 +302,7 @@ class MySQLComStmtExecuteExecutorTest {
when(selectStatementContext.getTablesContext().getDatabaseName()).thenReturn(Optional.empty());
when(selectStatement.getParameterCount()).thenReturn(2);
when(connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(1))
- .thenReturn(new MySQLServerPreparedStatement("SELECT * FROM tbl WHERE col1 = ? AND col2 = ?", selectStatementContext, new HintValueContext(), Arrays.asList(0, 1)));
+ .thenReturn(new MySQLServerPreparedStatement("SELECT * FROM tbl WHERE col1 = ? AND col2 = ?", selectStatementContext, new HintValueContext()));
when(packet.getNewParameterTypes()).thenReturn(Collections.emptyList());
when(packet.getNewParametersBoundFlag()).thenReturn(MySQLNewParametersBoundFlag.PARAMETER_TYPE_NOT_EXIST);
MySQLNullBitmap nullBitmap = mock(MySQLNullBitmap.class);
@@ -319,7 +319,7 @@ class MySQLComStmtExecuteExecutorTest {
when(packet.getNewParametersBoundFlag()).thenReturn(MySQLNewParametersBoundFlag.PARAMETER_TYPE_EXIST);
List<MySQLPreparedStatementParameterType> expectedTypes = Collections.singletonList(new MySQLPreparedStatementParameterType(MySQLBinaryColumnType.LONG, 0));
when(packet.getNewParameterTypes()).thenReturn(expectedTypes);
- when(packet.readParameters(anyList(), any(), anyList(), anyList())).thenReturn(Collections.singletonList(1));
+ when(packet.readParameters(anyList(), any(), anyList())).thenReturn(Collections.singletonList(1));
MySQLComStmtExecuteExecutor executor = new MySQLComStmtExecuteExecutor(packet, connectionSession);
when(proxyBackendHandler.execute()).thenReturn(new UpdateResponseHeader(UpdateStatement.builder().databaseType(databaseType).build()));
when(ProxyBackendHandlerFactory.newInstance(eq(databaseType), any(QueryContext.class), eq(connectionSession), anyBoolean())).thenReturn(proxyBackendHandler);
@@ -327,7 +327,7 @@ class MySQLComStmtExecuteExecutorTest {
assertThat(actual.next(), isA(MySQLOKPacket.class));
assertFalse(actual.hasNext());
ArgumentCaptor<List<MySQLPreparedStatementParameterType>> parameterTypesCaptor = ArgumentCaptor.forClass(List.class);
- verify(packet).readParameters(parameterTypesCaptor.capture(), any(), anyList(), anyList());
+ verify(packet).readParameters(parameterTypesCaptor.capture(), any(), anyList());
assertThat(parameterTypesCaptor.getValue(), is(expectedTypes));
}
@@ -337,10 +337,9 @@ class MySQLComStmtExecuteExecutorTest {
when(packet.getStatementId()).thenReturn(1);
when(packet.getNewParametersBoundFlag()).thenReturn(MySQLNewParametersBoundFlag.PARAMETER_TYPE_NOT_EXIST);
when(packet.getNewParameterTypes()).thenReturn(Collections.emptyList());
- when(packet.readParameters(anyList(), any(), anyList(), anyList())).thenReturn(Collections.singletonList(1));
+ when(packet.readParameters(anyList(), any(), anyList())).thenReturn(Collections.singletonList(1));
MySQLPreparedStatementParameterType expectedType = new MySQLPreparedStatementParameterType(MySQLBinaryColumnType.LONG, 0);
- MySQLServerPreparedStatement preparedStatement = new MySQLServerPreparedStatement("SELECT * FROM tbl WHERE id = ?",
- prepareSelectStatementContext(), new HintValueContext(), Collections.singletonList(0));
+ MySQLServerPreparedStatement preparedStatement = new MySQLServerPreparedStatement("SELECT * FROM tbl WHERE id = ?", prepareSelectStatementContext(), new HintValueContext());
preparedStatement.getParameterTypes().add(expectedType);
when(connectionSession.getServerPreparedStatementRegistry().getPreparedStatement(1)).thenReturn(preparedStatement);
MySQLComStmtExecuteExecutor executor = new MySQLComStmtExecuteExecutor(packet, connectionSession);
@@ -350,7 +349,7 @@ class MySQLComStmtExecuteExecutorTest {
assertThat(actual.next(), isA(MySQLOKPacket.class));
assertFalse(actual.hasNext());
ArgumentCaptor<List<MySQLPreparedStatementParameterType>> parameterTypesCaptor = ArgumentCaptor.forClass(List.class);
- verify(packet).readParameters(parameterTypesCaptor.capture(), any(), anyList(), anyList());
+ verify(packet).readParameters(parameterTypesCaptor.capture(), any(), anyList());
assertThat(parameterTypesCaptor.getValue(), contains(expectedType));
}
}
diff --git a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLPreparedStatementMetadataFactoryTest.java b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLPreparedStatementMetadataFactoryTest.java
index f08a07d893b..241a9afee72 100644
--- a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLPreparedStatementMetadataFactoryTest.java
+++ b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLPreparedStatementMetadataFactoryTest.java
@@ -115,7 +115,7 @@ class MySQLPreparedStatementMetadataFactoryTest {
TablesContext tablesContext = mock(TablesContext.class);
when(tablesContext.getDatabaseNames()).thenReturn(Collections.singleton("foo_db"));
when(sqlStatementContext.getTablesContext()).thenReturn(tablesContext);
- return new MySQLServerPreparedStatement("SELECT 1", sqlStatementContext, new HintValueContext(), Collections.emptyList());
+ return new MySQLServerPreparedStatement("SELECT 1", sqlStatementContext, new HintValueContext());
}
private void mockMetaData() {
diff --git a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/reset/MySQLComStmtResetExecutorTest.java b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/reset/MySQLComStmtResetExecutorTest.java
index 73cfc620d10..e0a927a9519 100644
--- a/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/reset/MySQLComStmtResetExecutorTest.java
+++ b/proxy/frontend/dialect/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/reset/MySQLComStmtResetExecutorTest.java
@@ -29,7 +29,6 @@ import org.apache.shardingsphere.proxy.frontend.mysql.command.query.binary.MySQL
import org.junit.jupiter.api.Test;
import java.util.Collection;
-import java.util.Collections;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -45,7 +44,7 @@ class MySQLComStmtResetExecutorTest {
ConnectionSession connectionSession = mock(ConnectionSession.class);
when(connectionSession.getServerPreparedStatementRegistry()).thenReturn(new ServerPreparedStatementRegistry());
when(connectionSession.getTransactionStatus()).thenReturn(new TransactionStatus());
- MySQLServerPreparedStatement preparedStatement = new MySQLServerPreparedStatement("", mock(SQLStatementContext.class), new HintValueContext(), Collections.emptyList());
+ MySQLServerPreparedStatement preparedStatement = new MySQLServerPreparedStatement("", mock(SQLStatementContext.class), new HintValueContext());
preparedStatement.getLongData().put(0, new byte[0]);
connectionSession.getServerPreparedStatementRegistry().addPreparedStatement(1, preparedStatement);
MySQLComStmtResetPacket packet = mock(MySQLComStmtResetPacket.class);