This is an automated email from the ASF dual-hosted git repository.

sunnianjun 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 8592fee88ac Refactor ProxyBackendHandlerFactory (#29971)
8592fee88ac is described below

commit 8592fee88ac2446c0ae5ab1f090cebf607a727a1
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Feb 3 18:22:21 2024 +0800

    Refactor ProxyBackendHandlerFactory (#29971)
    
    * Refactor ProxyBackendHandlerFactory
    
    * Refactor ProxyBackendHandlerFactory
    
    * Refactor ProxyBackendHandlerFactory
---
 .../handler/ProxyBackendHandlerFactory.java        | 34 +---------
 .../backend/handler/ProxySQLComQueryParser.java    | 59 +++++++++++++++++
 .../handler/ProxyBackendHandlerFactoryTest.java    | 77 +++++++++-------------
 .../text/query/MySQLComQueryPacketExecutor.java    | 17 +----
 .../query/simple/OpenGaussComQueryExecutor.java    |  8 ++-
 .../query/simple/PostgreSQLComQueryExecutor.java   |  8 ++-
 6 files changed, 104 insertions(+), 99 deletions(-)

diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
index 61de7f96b90..47405ee563d 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactory.java
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.proxy.backend.handler;
 
-import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.authority.checker.AuthorityChecker;
@@ -40,7 +39,6 @@ import 
org.apache.shardingsphere.infra.session.query.QueryContext;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.infra.state.cluster.ClusterState;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.distsql.DistSQLStatementContext;
 import 
org.apache.shardingsphere.proxy.backend.handler.admin.DatabaseAdminBackendHandlerFactory;
@@ -61,7 +59,6 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateDatab
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.DropDatabaseStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.RenameTableStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.tcl.TCLStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
 import 
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dal.MySQLShowCreateUserStatement;
 import org.apache.shardingsphere.transaction.util.AutoCommitUtils;
 
@@ -75,26 +72,6 @@ import java.util.Optional;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class ProxyBackendHandlerFactory {
     
-    /**
-     * Create new instance of backend handler.
-     *
-     * @param databaseType database type
-     * @param sql SQL to be executed
-     * @param connectionSession connection session
-     * @param hintValueContext hint value context
-     * @return created instance
-     * @throws SQLException SQL exception
-     */
-    public static ProxyBackendHandler newInstance(final DatabaseType 
databaseType, final String sql,
-                                                  final ConnectionSession 
connectionSession, final HintValueContext hintValueContext) throws SQLException 
{
-        if (Strings.isNullOrEmpty(SQLUtils.trimComment(sql))) {
-            return new SkipBackendHandler(new EmptyStatement());
-        }
-        SQLParserRule sqlParserRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
-        SQLStatement sqlStatement = 
sqlParserRule.getSQLParserEngine(getProtocolType(databaseType, 
connectionSession)).parse(sql, false);
-        return newInstance(databaseType, sql, sqlStatement, connectionSession, 
hintValueContext);
-    }
-    
     /**
      * Create new instance of backend handler.
      *
@@ -129,8 +106,8 @@ public final class ProxyBackendHandlerFactory {
      * @return created instance
      * @throws SQLException SQL exception
      */
-    public static ProxyBackendHandler newInstance(final DatabaseType 
databaseType, final QueryContext queryContext, final ConnectionSession 
connectionSession,
-                                                  final boolean 
preferPreparedStatement) throws SQLException {
+    public static ProxyBackendHandler newInstance(final DatabaseType 
databaseType, final QueryContext queryContext,
+                                                  final ConnectionSession 
connectionSession, final boolean preferPreparedStatement) throws SQLException {
         SQLStatementContext sqlStatementContext = 
queryContext.getSqlStatementContext();
         SQLStatement sqlStatement = sqlStatementContext.getSqlStatement();
         allowExecutingWhenTransactionalError(databaseType, connectionSession, 
sqlStatement);
@@ -195,13 +172,6 @@ public final class ProxyBackendHandlerFactory {
         return sqlStatement instanceof RQLStatement || sqlStatement instanceof 
QueryableRALStatement || sqlStatement instanceof RULStatement;
     }
     
-    private static DatabaseType getProtocolType(final DatabaseType 
defaultDatabaseType, final ConnectionSession connectionSession) {
-        String databaseName = connectionSession.getDatabaseName();
-        return Strings.isNullOrEmpty(databaseName) || 
!ProxyContext.getInstance().databaseExists(databaseName)
-                ? defaultDatabaseType
-                : 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabase(databaseName).getProtocolType();
-    }
-    
     private static void handleAutoCommit(final SQLStatement sqlStatement, 
final ConnectionSession connectionSession) {
         if (AutoCommitUtils.needOpenTransaction(sqlStatement)) {
             
connectionSession.getDatabaseConnectionManager().handleAutoCommit();
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxySQLComQueryParser.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxySQLComQueryParser.java
new file mode 100644
index 00000000000..f62eda42d96
--- /dev/null
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/ProxySQLComQueryParser.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.proxy.backend.handler;
+
+import com.google.common.base.Strings;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import org.apache.shardingsphere.parser.rule.SQLParserRule;
+import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
+import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.EmptyStatement;
+import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
+
+/**
+ * Proxy SQL com query parser.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class ProxySQLComQueryParser {
+    
+    /**
+     * Parse SQL.
+     * 
+     * @param sql SQL to be parsed
+     * @param databaseType database type
+     * @param connectionSession connection session
+     * @return SQL statement
+     */
+    public static SQLStatement parse(final String sql, final DatabaseType 
databaseType, final ConnectionSession connectionSession) {
+        if (SQLUtils.trimComment(sql).isEmpty()) {
+            return new EmptyStatement();
+        }
+        SQLParserRule rule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
+        return rule.getSQLParserEngine(getProtocolType(databaseType, 
connectionSession)).parse(sql, false);
+    }
+    
+    private static DatabaseType getProtocolType(final DatabaseType 
defaultDatabaseType, final ConnectionSession connectionSession) {
+        String databaseName = connectionSession.getDatabaseName();
+        return Strings.isNullOrEmpty(databaseName) || 
!ProxyContext.getInstance().databaseExists(databaseName)
+                ? defaultDatabaseType
+                : 
ProxyContext.getInstance().getDatabase(databaseName).getProtocolType();
+    }
+}
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
index e23bb5f5d15..1907ee74f18 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/ProxyBackendHandlerFactoryTest.java
@@ -44,7 +44,8 @@ import 
org.apache.shardingsphere.proxy.backend.handler.distsql.DistSQLUpdateBack
 import org.apache.shardingsphere.proxy.backend.handler.skip.SkipBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.handler.transaction.TransactionBackendHandler;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.EmptyStatement;
 import org.apache.shardingsphere.test.mock.AutoMockExtension;
 import org.apache.shardingsphere.test.mock.StaticMockSettings;
 import org.apache.shardingsphere.transaction.api.TransactionType;
@@ -127,36 +128,44 @@ class ProxyBackendHandlerFactoryTest {
     @Test
     void assertNewInstanceWithDistSQL() throws SQLException {
         String sql = "set dist variable sql_show='true'";
-        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext());
+        SQLStatement sqlStatement = ProxySQLComQueryParser.parse(sql, 
databaseType, connectionSession);
+        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, sqlStatement, 
connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(DistSQLUpdateBackendHandler.class));
         sql = "show dist variable where name = sql_show";
-        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
connectionSession, new HintValueContext());
+        sqlStatement = ProxySQLComQueryParser.parse(sql, databaseType, 
connectionSession);
+        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
sqlStatement, connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(DistSQLQueryBackendHandler.class));
         sql = "show dist variables";
-        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
connectionSession, new HintValueContext());
+        sqlStatement = ProxySQLComQueryParser.parse(sql, databaseType, 
connectionSession);
+        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
sqlStatement, connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(DistSQLQueryBackendHandler.class));
     }
     
     @ParameterizedTest(name = "{0}")
     @ArgumentsSource(TCLTestCaseArgumentsProvider.class)
     void assertNewInstanceWithTCL(final String sql) throws SQLException {
-        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext());
+        SQLStatement sqlStatement = ProxySQLComQueryParser.parse(sql, 
databaseType, connectionSession);
+        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, sqlStatement, 
connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(TransactionBackendHandler.class));
     }
     
     @Test
     void assertNewInstanceWithShow() throws SQLException {
         String sql = "SHOW VARIABLES LIKE '%x%'";
-        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext());
+        SQLStatement sqlStatement = ProxySQLComQueryParser.parse(sql, 
databaseType, connectionSession);
+        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, sqlStatement, 
connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(UnicastDatabaseBackendHandler.class));
         sql = "SHOW VARIABLES WHERE Variable_name ='language'";
-        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
connectionSession, new HintValueContext());
+        sqlStatement = ProxySQLComQueryParser.parse(sql, databaseType, 
connectionSession);
+        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
sqlStatement, connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(UnicastDatabaseBackendHandler.class));
         sql = "SHOW CHARACTER SET";
-        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
connectionSession, new HintValueContext());
+        sqlStatement = ProxySQLComQueryParser.parse(sql, databaseType, 
connectionSession);
+        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
sqlStatement, connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(UnicastDatabaseBackendHandler.class));
         sql = "SHOW COLLATION";
-        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
connectionSession, new HintValueContext());
+        sqlStatement = ProxySQLComQueryParser.parse(sql, databaseType, 
connectionSession);
+        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
sqlStatement, connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(UnicastDatabaseBackendHandler.class));
     }
     
@@ -168,62 +177,36 @@ class ProxyBackendHandlerFactoryTest {
         ProxyContext proxyContext = ProxyContext.getInstance();
         when(proxyContext.getAllDatabaseNames()).thenReturn(new 
HashSet<>(Collections.singletonList("db")));
         
when(proxyContext.getDatabase("db").containsDataSource()).thenReturn(true);
-        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext());
+        SQLStatement sqlStatement = ProxySQLComQueryParser.parse(sql, 
databaseType, connectionSession);
+        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, sqlStatement, 
connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(DatabaseConnector.class));
         sql = "SELECT * FROM information_schema.schemata LIMIT 1";
-        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
connectionSession, new HintValueContext());
+        sqlStatement = ProxySQLComQueryParser.parse(sql, databaseType, 
connectionSession);
+        actual = ProxyBackendHandlerFactory.newInstance(databaseType, sql, 
sqlStatement, connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(DatabaseAdminQueryBackendHandler.class));
     }
     
     @Test
     void assertNewInstanceWithEmptyString() throws SQLException {
         String sql = "";
-        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext());
+        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, new EmptyStatement(), 
connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(SkipBackendHandler.class));
     }
     
-    @Test
-    void assertNewInstanceWithErrorSQL() {
-        String sql = "SELECT";
-        assertThrows(SQLParsingException.class, () -> 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext()));
-    }
-    
-    @Test
-    void assertNewInstanceWithErrorRDL() {
-        String sql = "CREATE SHARDING";
-        assertThrows(SQLParsingException.class, () -> 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext()));
-    }
-    
-    @Test
-    void assertNewInstanceWithUnsupportedDCLSQLStatement() {
-        String sql = "CREATE USER 'foo'@'%' IDENTIFIED BY 'bar';";
-        assertThrows(UnsupportedSQLOperationException.class, () -> 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext()));
-    }
-    
-    @Test
-    void assertNewInstanceWithUnsupportedDALSQLStatement() {
-        assertThrows(UnsupportedSQLOperationException.class, () -> 
ProxyBackendHandlerFactory.newInstance(databaseType, "FLUSH PRIVILEGES;", 
connectionSession, new HintValueContext()));
-        assertThrows(UnsupportedSQLOperationException.class, () -> 
ProxyBackendHandlerFactory.newInstance(databaseType, "SHOW CREATE USER foo;", 
connectionSession, new HintValueContext()));
-    }
-    
-    @Test
-    void assertNewInstanceWithUnsupportedDDLSQLStatement() {
-        String sql = "RENAME TABLE foo TO bar;";
-        assertThrows(UnsupportedSQLOperationException.class, () -> 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext()));
-    }
-    
     @Test
     void assertNewInstanceWithUnsupportedNonQueryDistSQLInTransaction() {
         
when(connectionSession.getTransactionStatus().isInTransaction()).thenReturn(true);
         String sql = "CREATE SHARDING TABLE RULE t_order 
(STORAGE_UNITS(ms_group_0,ms_group_1), SHARDING_COLUMN=order_id, 
TYPE(NAME='hash_mod', PROPERTIES('sharding-count'='4')));";
-        assertThrows(UnsupportedSQLOperationException.class, () -> 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext()));
+        SQLStatement sqlStatement = ProxySQLComQueryParser.parse(sql, 
databaseType, connectionSession);
+        assertThrows(UnsupportedSQLOperationException.class, () -> 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, sqlStatement, 
connectionSession, new HintValueContext()));
     }
     
     @Test
     void assertNewInstanceWithQueryableRALStatementInTransaction() throws 
SQLException {
         
when(connectionSession.getTransactionStatus().isInTransaction()).thenReturn(true);
         String sql = "SHOW TRANSACTION RULE;";
-        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext());
+        SQLStatement sqlStatement = ProxySQLComQueryParser.parse(sql, 
databaseType, connectionSession);
+        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, sqlStatement, 
connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(DistSQLQueryBackendHandler.class));
     }
     
@@ -231,7 +214,8 @@ class ProxyBackendHandlerFactoryTest {
     void assertNewInstanceWithRQLStatementInTransaction() throws SQLException {
         
when(connectionSession.getTransactionStatus().isInTransaction()).thenReturn(true);
         String sql = "SHOW DEFAULT SINGLE TABLE STORAGE UNIT";
-        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext());
+        SQLStatement sqlStatement = ProxySQLComQueryParser.parse(sql, 
databaseType, connectionSession);
+        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, sqlStatement, 
connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(DistSQLQueryBackendHandler.class));
     }
     
@@ -239,7 +223,8 @@ class ProxyBackendHandlerFactoryTest {
     void assertNewInstanceWithRULStatementInTransaction() throws SQLException {
         
when(connectionSession.getTransactionStatus().isInTransaction()).thenReturn(true);
         String sql = "PREVIEW INSERT INTO account VALUES(1, 1, 1)";
-        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, connectionSession, 
new HintValueContext());
+        SQLStatement sqlStatement = ProxySQLComQueryParser.parse(sql, 
databaseType, connectionSession);
+        ProxyBackendHandler actual = 
ProxyBackendHandlerFactory.newInstance(databaseType, sql, sqlStatement, 
connectionSession, new HintValueContext());
         assertThat(actual, instanceOf(DistSQLQueryBackendHandler.class));
     }
     
diff --git 
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutor.java
 
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutor.java
index a06d6928e0b..19c26a3e3b4 100644
--- 
a/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutor.java
+++ 
b/proxy/frontend/type/mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutor.java
@@ -26,11 +26,9 @@ import 
org.apache.shardingsphere.db.protocol.mysql.packet.command.query.text.que
 import org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
-import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory;
+import org.apache.shardingsphere.proxy.backend.handler.ProxySQLComQueryParser;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
@@ -40,10 +38,8 @@ import 
org.apache.shardingsphere.proxy.frontend.command.executor.ResponseType;
 import 
org.apache.shardingsphere.proxy.frontend.mysql.command.ServerStatusFlagCalculator;
 import 
org.apache.shardingsphere.proxy.frontend.mysql.command.query.builder.ResponsePacketBuilder;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dal.EmptyStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.DeleteStatement;
 import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.UpdateStatement;
-import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
 
 import java.sql.SQLException;
 import java.util.Collection;
@@ -65,21 +61,12 @@ public final class MySQLComQueryPacketExecutor implements 
QueryCommandExecutor {
     public MySQLComQueryPacketExecutor(final MySQLComQueryPacket packet, final 
ConnectionSession connectionSession) throws SQLException {
         this.connectionSession = connectionSession;
         DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "MySQL");
-        SQLStatement sqlStatement = parseSQL(packet.getSQL(), databaseType);
+        SQLStatement sqlStatement = 
ProxySQLComQueryParser.parse(packet.getSQL(), databaseType, connectionSession);
         proxyBackendHandler = areMultiStatements(connectionSession, 
sqlStatement, packet.getSQL()) ? new 
MySQLMultiStatementsHandler(connectionSession, sqlStatement, packet.getSQL())
                 : ProxyBackendHandlerFactory.newInstance(databaseType, 
packet.getSQL(), sqlStatement, connectionSession, packet.getHintValueContext());
         characterSet = 
connectionSession.getAttributeMap().attr(MySQLConstants.MYSQL_CHARACTER_SET_ATTRIBUTE_KEY).get().getId();
     }
     
-    private SQLStatement parseSQL(final String sql, final DatabaseType 
databaseType) {
-        if (SQLUtils.trimComment(sql).isEmpty()) {
-            return new EmptyStatement();
-        }
-        MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        SQLParserRule rule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(SQLParserRule.class);
-        return rule.getSQLParserEngine(databaseType).parse(sql, false);
-    }
-    
     private boolean areMultiStatements(final ConnectionSession 
connectionSession, final SQLStatement sqlStatement, final String sql) {
         // TODO Multi statements should be identified by SQL Parser instead of 
checking if sql contains ";".
         return isMultiStatementsEnabled(connectionSession) && 
isSuitableMultiStatementsSQLStatement(sqlStatement) && sql.contains(";");
diff --git 
a/proxy/frontend/type/opengauss/src/main/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/simple/OpenGaussComQueryExecutor.java
 
b/proxy/frontend/type/opengauss/src/main/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/simple/OpenGaussComQueryExecutor.java
index 675ec3be3cf..2fced913b4e 100644
--- 
a/proxy/frontend/type/opengauss/src/main/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/simple/OpenGaussComQueryExecutor.java
+++ 
b/proxy/frontend/type/opengauss/src/main/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/simple/OpenGaussComQueryExecutor.java
@@ -31,6 +31,7 @@ import 
org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory;
+import org.apache.shardingsphere.proxy.backend.handler.ProxySQLComQueryParser;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
@@ -66,10 +67,11 @@ public final class OpenGaussComQueryExecutor implements 
QueryCommandExecutor {
     @Getter
     private volatile ResponseType responseType;
     
-    public OpenGaussComQueryExecutor(final PortalContext portalContext, final 
PostgreSQLComQueryPacket comQueryPacket, final ConnectionSession 
connectionSession) throws SQLException {
+    public OpenGaussComQueryExecutor(final PortalContext portalContext, final 
PostgreSQLComQueryPacket packet, final ConnectionSession connectionSession) 
throws SQLException {
         this.portalContext = portalContext;
-        proxyBackendHandler = 
ProxyBackendHandlerFactory.newInstance(TypedSPILoader.getService(DatabaseType.class,
 "openGauss"), comQueryPacket.getSQL(), connectionSession,
-                comQueryPacket.getHintValueContext());
+        DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "openGauss");
+        SQLStatement sqlStatement = 
ProxySQLComQueryParser.parse(packet.getSQL(), databaseType, connectionSession);
+        proxyBackendHandler = 
ProxyBackendHandlerFactory.newInstance(databaseType, packet.getSQL(), 
sqlStatement, connectionSession, packet.getHintValueContext());
     }
     
     @Override
diff --git 
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/simple/PostgreSQLComQueryExecutor.java
 
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/simple/PostgreSQLComQueryExecutor.java
index 7f748d1ab20..a1b6457d5c2 100644
--- 
a/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/simple/PostgreSQLComQueryExecutor.java
+++ 
b/proxy/frontend/type/postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/simple/PostgreSQLComQueryExecutor.java
@@ -31,6 +31,7 @@ import 
org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler;
 import 
org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandlerFactory;
+import org.apache.shardingsphere.proxy.backend.handler.ProxySQLComQueryParser;
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryHeader;
 import 
org.apache.shardingsphere.proxy.backend.response.header.query.QueryResponseHeader;
@@ -66,10 +67,11 @@ public final class PostgreSQLComQueryExecutor implements 
QueryCommandExecutor {
     @Getter
     private volatile ResponseType responseType;
     
-    public PostgreSQLComQueryExecutor(final PortalContext portalContext, final 
PostgreSQLComQueryPacket comQueryPacket, final ConnectionSession 
connectionSession) throws SQLException {
+    public PostgreSQLComQueryExecutor(final PortalContext portalContext, final 
PostgreSQLComQueryPacket packet, final ConnectionSession connectionSession) 
throws SQLException {
         this.portalContext = portalContext;
-        proxyBackendHandler = 
ProxyBackendHandlerFactory.newInstance(TypedSPILoader.getService(DatabaseType.class,
 "PostgreSQL"), comQueryPacket.getSQL(), connectionSession,
-                comQueryPacket.getHintValueContext());
+        DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "openGauss");
+        SQLStatement sqlStatement = 
ProxySQLComQueryParser.parse(packet.getSQL(), databaseType, connectionSession);
+        proxyBackendHandler = 
ProxyBackendHandlerFactory.newInstance(databaseType, packet.getSQL(), 
sqlStatement, connectionSession, packet.getHintValueContext());
     }
     
     @Override

Reply via email to