This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 4695e1926c8 Optimize MySQLComStmtPrepareExecutor logic (#29544)
4695e1926c8 is described below
commit 4695e1926c8b82e3c63b58e16e4396a8406b6dae
Author: ZhangCheng <[email protected]>
AuthorDate: Tue Dec 26 10:47:34 2023 +0800
Optimize MySQLComStmtPrepareExecutor logic (#29544)
---
.../connector/jdbc/statement/JDBCBackendStatement.java | 14 +++++++++-----
.../binary/prepare/MySQLComStmtPrepareExecutor.java | 14 ++++++++------
.../MySQLComStmtPrepareParameterMarkerExtractor.java | 18 +++++++-----------
...ySQLComStmtPrepareParameterMarkerExtractorTest.java | 15 +++++----------
4 files changed, 29 insertions(+), 32 deletions(-)
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/statement/JDBCBackendStatement.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/statement/JDBCBackendStatement.java
index 257e52cafc9..030e7b591ca 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/statement/JDBCBackendStatement.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/connector/jdbc/statement/JDBCBackendStatement.java
@@ -18,18 +18,19 @@
package org.apache.shardingsphere.proxy.backend.connector.jdbc.statement;
import
org.apache.shardingsphere.db.protocol.parameter.TypeUnspecifiedSQLParameter;
+import
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
import
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.ExecutorJDBCStatementManager;
import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
-import
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
+import java.util.Iterator;
import java.util.List;
import java.util.Optional;
@@ -55,13 +56,16 @@ public final class JDBCBackendStatement implements
ExecutorJDBCStatementManager
PreparedStatement result = option.isReturnGeneratedKeys()
?
connection.prepareStatement(executionUnit.getSqlUnit().getSql(),
Statement.RETURN_GENERATED_KEYS)
: connection.prepareStatement(sql);
- for (int i = 0; i < params.size(); i++) {
- Object param = params.get(i);
+ Iterator<Object> paramIterator = params.iterator();
+ int index = 0;
+ while (paramIterator.hasNext()) {
+ Object param = paramIterator.next();
if (param instanceof TypeUnspecifiedSQLParameter) {
- result.setObject(i + 1, param, Types.OTHER);
+ result.setObject(index + 1, param, Types.OTHER);
} else {
- result.setObject(i + 1, param);
+ result.setObject(index + 1, param);
}
+ index++;
}
if (ConnectionMode.MEMORY_STRICTLY == connectionMode) {
setFetchSize(result, databaseType);
diff --git
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
index ee174ed6857..8165e73a3bb 100644
---
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
+++
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
@@ -58,7 +58,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
-import java.util.Map;
+import java.util.List;
import java.util.Optional;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -126,21 +126,23 @@ public final class MySQLComStmtPrepareExecutor implements
CommandExecutor {
private Collection<MySQLPacket>
createParameterColumnDefinition41Packets(final SQLStatementContext
sqlStatementContext, final int characterSet,
final MySQLServerPreparedStatement serverPreparedStatement) {
- Map<ParameterMarkerSegment, ShardingSphereColumn>
columnsOfParameterMarkers =
+ List<ShardingSphereColumn> columnsOfParameterMarkers =
MySQLComStmtPrepareParameterMarkerExtractor.findColumnsOfParameterMarkers(sqlStatementContext.getSqlStatement(),
getSchema(sqlStatementContext));
Collection<ParameterMarkerSegment> parameterMarkerSegments =
((AbstractSQLStatement)
sqlStatementContext.getSqlStatement()).getParameterMarkerSegments();
Collection<MySQLPacket> result = new
ArrayList<>(parameterMarkerSegments.size());
- for (ParameterMarkerSegment each : parameterMarkerSegments) {
- ShardingSphereColumn column = columnsOfParameterMarkers.get(each);
+ Collection<Integer> paramColumnDefinitionFlags = new
ArrayList<>(parameterMarkerSegments.size());
+ for (int index = 0; index < parameterMarkerSegments.size(); index++) {
+ ShardingSphereColumn column = columnsOfParameterMarkers.isEmpty()
? null : columnsOfParameterMarkers.get(index);
if (null != column) {
int columnDefinitionFlag =
calculateColumnDefinitionFlag(column);
result.add(createMySQLColumnDefinition41Packet(characterSet,
columnDefinitionFlag,
MySQLBinaryColumnType.valueOfJDBCType(column.getDataType())));
-
serverPreparedStatement.getParameterColumnDefinitionFlags().add(columnDefinitionFlag);
+ paramColumnDefinitionFlags.add(columnDefinitionFlag);
} else {
result.add(createMySQLColumnDefinition41Packet(characterSet,
0, MySQLBinaryColumnType.VAR_STRING));
-
serverPreparedStatement.getParameterColumnDefinitionFlags().add(0);
+ paramColumnDefinitionFlags.add(0);
}
}
+
serverPreparedStatement.getParameterColumnDefinitionFlags().addAll(paramColumnDefinitionFlags);
return result;
}
diff --git
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractor.java
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractor.java
index 848d05dab93..34c2f574497 100644
---
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractor.java
+++
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractor.java
@@ -25,15 +25,13 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.assignment.InsertValuesSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ParameterMarkerSegment;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.InsertStatement;
+import java.util.ArrayList;
import java.util.Collections;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.ListIterator;
-import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -48,16 +46,16 @@ public final class
MySQLComStmtPrepareParameterMarkerExtractor {
*
* @param sqlStatement SQL statement
* @param schema schema
- * @return map parameter marker segment to column
+ * @return corresponding columns of parameter markers
*/
- public static Map<ParameterMarkerSegment, ShardingSphereColumn>
findColumnsOfParameterMarkers(final SQLStatement sqlStatement, final
ShardingSphereSchema schema) {
- return sqlStatement instanceof InsertStatement ?
findColumnsOfParameterMarkersForInsert((InsertStatement) sqlStatement, schema)
: Collections.emptyMap();
+ public static List<ShardingSphereColumn>
findColumnsOfParameterMarkers(final SQLStatement sqlStatement, final
ShardingSphereSchema schema) {
+ return sqlStatement instanceof InsertStatement ?
findColumnsOfParameterMarkersForInsert((InsertStatement) sqlStatement, schema)
: Collections.emptyList();
}
- private static Map<ParameterMarkerSegment, ShardingSphereColumn>
findColumnsOfParameterMarkersForInsert(final InsertStatement insertStatement,
final ShardingSphereSchema schema) {
+ private static List<ShardingSphereColumn>
findColumnsOfParameterMarkersForInsert(final InsertStatement insertStatement,
final ShardingSphereSchema schema) {
ShardingSphereTable table =
schema.getTable(insertStatement.getTable().getTableName().getIdentifier().getValue());
List<String> columnNamesOfInsert =
getColumnNamesOfInsertStatement(insertStatement, table);
- Map<ParameterMarkerSegment, ShardingSphereColumn> result = new
LinkedHashMap<>(insertStatement.getParameterMarkerSegments().size(), 1F);
+ List<ShardingSphereColumn> result = new
ArrayList<>(insertStatement.getParameterMarkerSegments().size());
for (InsertValuesSegment each : insertStatement.getValues()) {
ListIterator<ExpressionSegment> listIterator =
each.getValues().listIterator();
for (int columnIndex = listIterator.nextIndex();
listIterator.hasNext(); columnIndex = listIterator.nextIndex()) {
@@ -67,9 +65,7 @@ public final class
MySQLComStmtPrepareParameterMarkerExtractor {
}
String columnName = columnNamesOfInsert.get(columnIndex);
ShardingSphereColumn column = table.getColumn(columnName);
- if (null != column) {
- result.put((ParameterMarkerSegment) value, column);
- }
+ result.add(column);
}
}
return result;
diff --git
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractorTest.java
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractorTest.java
index 1747ea06f58..a98f51fc725 100644
---
a/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractorTest.java
+++
b/proxy/frontend/type/mysql/src/test/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareParameterMarkerExtractorTest.java
@@ -24,15 +24,11 @@ import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.sql.parser.api.CacheOption;
-import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ParameterMarkerSegment;
-import
org.apache.shardingsphere.sql.parser.sql.common.statement.AbstractSQLStatement;
import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
import org.junit.jupiter.api.Test;
import java.sql.Types;
-import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -44,12 +40,11 @@ class MySQLComStmtPrepareParameterMarkerExtractorTest {
String sql = "insert into user (id, name, age) values (1, ?, ?), (?,
'bar', ?)";
SQLStatement sqlStatement = new
ShardingSphereSQLParserEngine(TypedSPILoader.getService(DatabaseType.class,
"MySQL"), new CacheOption(0, 0), new CacheOption(0, 0), false).parse(sql,
false);
ShardingSphereSchema schema = prepareSchema();
- Map<ParameterMarkerSegment, ShardingSphereColumn> actual =
MySQLComStmtPrepareParameterMarkerExtractor.findColumnsOfParameterMarkers(sqlStatement,
schema);
- List<ParameterMarkerSegment> parameterMarkerSegments = new
ArrayList<>(((AbstractSQLStatement) sqlStatement).getParameterMarkerSegments());
- assertThat(actual.get(parameterMarkerSegments.get(0)),
is(schema.getTable("user").getColumn("name")));
- assertThat(actual.get(parameterMarkerSegments.get(1)),
is(schema.getTable("user").getColumn("age")));
- assertThat(actual.get(parameterMarkerSegments.get(2)),
is(schema.getTable("user").getColumn("id")));
- assertThat(actual.get(parameterMarkerSegments.get(3)),
is(schema.getTable("user").getColumn("age")));
+ List<ShardingSphereColumn> actual =
MySQLComStmtPrepareParameterMarkerExtractor.findColumnsOfParameterMarkers(sqlStatement,
schema);
+ assertThat(actual.get(0),
is(schema.getTable("user").getColumn("name")));
+ assertThat(actual.get(1),
is(schema.getTable("user").getColumn("age")));
+ assertThat(actual.get(2), is(schema.getTable("user").getColumn("id")));
+ assertThat(actual.get(3),
is(schema.getTable("user").getColumn("age")));
}
private ShardingSphereSchema prepareSchema() {