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() {

Reply via email to