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