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

menghaoran 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 ec42c731e3a Add SQLParserRule.getSQLParserEngine() (#17970)
ec42c731e3a is described below

commit ec42c731e3ac2c3fd73ddb358af5efcb8674f4d9
Author: Liang Zhang <[email protected]>
AuthorDate: Thu May 26 16:25:47 2022 +0800

    Add SQLParserRule.getSQLParserEngine() (#17970)
    
    * Add SQLParserRule.getSQLParserEngine()
    
    * Add SQLParserRule.getSQLParserEngine()
---
 .../optimizer/ShardingSphereOptimizerTest.java     | 23 +++++++++++-----------
 .../statement/ShardingSpherePreparedStatement.java |  4 ++--
 .../core/statement/ShardingSphereStatement.java    |  6 ++----
 .../metadata/generator/PipelineDDLGenerator.java   |  3 +--
 .../shardingsphere/parser/rule/SQLParserRule.java  | 10 ++++++----
 .../text/TextProtocolBackendHandlerFactory.java    |  3 +--
 .../ral/advanced/ParseDistSQLBackendHandler.java   |  4 +---
 .../ral/advanced/PreviewDistSQLBackendHandler.java |  3 +--
 .../information/SelectInformationExecutorTest.java | 10 ++++------
 .../executor/SelectDatabaseExecutorTest.java       | 12 +++++------
 .../advance/ParseDistSQLBackendHandlerTest.java    |  3 +--
 .../execute/MySQLComStmtExecuteExecutor.java       |  8 +++-----
 .../prepare/MySQLComStmtPrepareExecutor.java       |  6 ++----
 .../fieldlist/MySQLComFieldListPacketExecutor.java |  6 ++----
 .../text/query/MySQLComQueryPacketExecutor.java    |  8 ++++----
 .../text/query/MySQLMultiStatementsHandler.java    |  7 ++++---
 .../extended/parse/PostgreSQLComParseExecutor.java |  3 +--
 .../ReactiveMySQLComStmtExecuteExecutor.java       |  8 +++-----
 .../ReactiveMySQLComFieldListPacketExecutor.java   |  6 ++----
 19 files changed, 56 insertions(+), 77 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
index a5c72317dd9..9787abb70f8 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
@@ -26,7 +26,6 @@ import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRule
 import 
org.apache.shardingsphere.infra.metadata.database.schema.ShardingSphereSchema;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
-import org.apache.shardingsphere.infra.parser.ParserConfiguration;
 import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.parser.config.SQLParserRuleConfiguration;
@@ -89,7 +88,7 @@ public final class ShardingSphereOptimizerTest {
     
     private final String schemaName = "federate_jdbc";
     
-    private final ParserConfiguration parserConfig = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()).toParserConfiguration();
+    private final SQLParserRule sqlParserRule = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build());
     
     private ShardingSphereOptimizer optimizer;
     
@@ -131,7 +130,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectCrossJoinCondition() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_CROSS_JOIN_CONDITION, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -146,7 +145,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectWhereAllFields() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_WHERE_ALL_FIELDS, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -157,7 +156,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectWhereSingleField() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_WHERE_SINGLE_FIELD, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -168,7 +167,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectCrossWhere() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_WHERE, 
false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -185,7 +184,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectCrossJoin() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_JOIN, 
false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -202,7 +201,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectJoinWhere() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_CROSS_WHERE_CONDITION, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -215,7 +214,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectSubQueryFrom() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_FROM, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -226,7 +225,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectSubQueryWhereExist() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_EXIST, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -241,7 +240,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectSubQueryWhereIn() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_IN, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -255,7 +254,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectSubQueryWhereBetween() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_BETWEEN, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index faeab00fe8a..51f9dfa1b40 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -174,8 +174,8 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         parameterSets = new ArrayList<>();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
         Preconditions.checkState(sqlParserRule.isPresent());
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(
-                
metaDataContexts.getDatabase(connection.getDatabaseName()).getResource().getDatabaseType()),
 sqlParserRule.get().toParserConfiguration());
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.get().getSQLParserEngine(
+                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(connection.getDatabaseName()).getResource().getDatabaseType()));
         sqlStatement = sqlParserEngine.parse(sql, true);
         sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(),
 sqlStatement, connection.getDatabaseName());
         parameterMetaData = new ShardingSphereParameterMetaData(sqlStatement);
diff --git 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
index 81792bf3cdd..9c7b3413087 100644
--- 
a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
+++ 
b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSphereStatement.java
@@ -64,7 +64,6 @@ import 
org.apache.shardingsphere.infra.federation.executor.FederationContext;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.merge.MergeEngine;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.infra.route.context.RouteUnit;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import org.apache.shardingsphere.infra.rule.identifier.type.RawExecutionRule;
@@ -455,9 +454,8 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     
     private LogicSQL createLogicSQL(final String sql) {
         SQLParserRule sqlParserRule = findSQLParserRule();
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(connection.getDatabaseName()).getResource().getDatabaseType()),
 sqlParserRule.toParserConfiguration());
-        SQLStatement sqlStatement = sqlParserEngine.parse(sql, false);
+        SQLStatement sqlStatement = sqlParserRule.getSQLParserEngine(
+                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(connection.getDatabaseName()).getResource().getDatabaseType())).parse(sql,
 false);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(),
 sqlStatement, connection.getDatabaseName());
         return new LogicSQL(sqlStatementContext, sql, Collections.emptyList());
     }
diff --git 
a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
 
b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
index 9c137cb8749..784602fa923 100644
--- 
a/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
+++ 
b/shardingsphere-kernel/shardingsphere-data-pipeline/shardingsphere-data-pipeline-core/src/main/java/org/apache/shardingsphere/data/pipeline/core/metadata/generator/PipelineDDLGenerator.java
@@ -38,7 +38,6 @@ import org.apache.shardingsphere.infra.datanode.DataNodes;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.util.IndexMetaDataUtil;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import 
org.apache.shardingsphere.infra.rule.identifier.type.DataNodeContainedRule;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
@@ -217,7 +216,7 @@ public final class PipelineDDLGenerator {
     private LogicSQL getLogicSQL(final String sql, final DatabaseType 
databaseType, final String databaseName) {
         Optional<SQLParserRule> sqlParserRule = 
contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
         Preconditions.checkState(sqlParserRule.isPresent());
-        SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine(databaseType.getType(), 
sqlParserRule.get().toParserConfiguration()).parse(sql, false);
+        SQLStatement sqlStatement = 
sqlParserRule.get().getSQLParserEngine(databaseType.getType()).parse(sql, 
false);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(contextManager.getMetaDataContexts().getMetaData().getDatabases(),
 sqlStatement, databaseName);
         return new LogicSQL(sqlStatementContext, sql, Collections.emptyList());
     }
diff --git 
a/shardingsphere-kernel/shardingsphere-parser/shardingsphere-parser-core/src/main/java/org/apache/shardingsphere/parser/rule/SQLParserRule.java
 
b/shardingsphere-kernel/shardingsphere-parser/shardingsphere-parser-core/src/main/java/org/apache/shardingsphere/parser/rule/SQLParserRule.java
index 6eeb9730729..a60d65d1ed8 100644
--- 
a/shardingsphere-kernel/shardingsphere-parser/shardingsphere-parser-core/src/main/java/org/apache/shardingsphere/parser/rule/SQLParserRule.java
+++ 
b/shardingsphere-kernel/shardingsphere-parser/shardingsphere-parser-core/src/main/java/org/apache/shardingsphere/parser/rule/SQLParserRule.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.parser.rule;
 
 import lombok.Getter;
 import org.apache.shardingsphere.infra.parser.ParserConfiguration;
+import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.infra.rule.identifier.scope.GlobalRule;
 import org.apache.shardingsphere.parser.config.SQLParserRuleConfiguration;
 import org.apache.shardingsphere.sql.parser.api.CacheOption;
@@ -42,12 +43,13 @@ public final class SQLParserRule implements GlobalRule {
     }
     
     /**
-     * Convert to parser configuration.
+     * Get SQL parser engine.
      * 
-     * @return parser configuration
+     * @param databaseType database type
+     * @return SQL parser engine
      */
-    public ParserConfiguration toParserConfiguration() {
-        return new ParserConfiguration(sqlStatementCache, parseTreeCache, 
sqlCommentParseEnabled);
+    public ShardingSphereSQLParserEngine getSQLParserEngine(final String 
databaseType) {
+        return new ShardingSphereSQLParserEngine(databaseType, new 
ParserConfiguration(sqlStatementCache, parseTreeCache, sqlCommentParseEnabled));
     }
     
     @Override
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
index 04abcb4ec52..45169725a8b 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/TextProtocolBackendHandlerFactory.java
@@ -29,7 +29,6 @@ import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.type.TableAvailable;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.executor.check.SQLCheckEngine;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
@@ -91,7 +90,7 @@ public final class TextProtocolBackendHandlerFactory {
         SQLStatement sqlStatement = sqlStatementSupplier.get().orElseGet(() -> 
{
             Optional<SQLParserRule> sqlParserRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
             Preconditions.checkState(sqlParserRule.isPresent());
-            return new 
ShardingSphereSQLParserEngine(getProtocolType(databaseType, 
connectionSession).getType(), 
sqlParserRule.get().toParserConfiguration()).parse(sql, false);
+            return 
sqlParserRule.get().getSQLParserEngine(getProtocolType(databaseType, 
connectionSession).getType()).parse(sql, false);
         });
         
databaseType.handleRollbackOnly(connectionSession.getTransactionStatus().isRollbackOnly(),
 sqlStatement);
         checkUnsupportedSQLStatement(sqlStatement);
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/ParseDistSQLBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/ParseDistSQLBackendHandler.java
index 42ea447e9d7..d140d05c933 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/ParseDistSQLBackendHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/ParseDistSQLBackendHandler.java
@@ -22,7 +22,6 @@ import com.google.common.base.Strings;
 import com.google.gson.Gson;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.advanced.ParseStatement;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -68,8 +67,7 @@ public final class ParseDistSQLBackendHandler extends 
QueryableRALBackendHandler
         Preconditions.checkState(sqlParserRule.isPresent());
         SQLStatement parsedSqlStatement;
         try {
-            parsedSqlStatement = new ShardingSphereSQLParserEngine(
-                    getStorageType(databaseType, connectionSession).getType(), 
sqlParserRule.get().toParserConfiguration()).parse(sqlStatement.getSql(), 
false);
+            parsedSqlStatement = 
sqlParserRule.get().getSQLParserEngine(getStorageType(databaseType, 
connectionSession).getType()).parse(sqlStatement.getSql(), false);
         } catch (SQLParsingException ex) {
             throw new SQLParsingException("You have a syntax error in your 
parsed statement");
         }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewDistSQLBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewDistSQLBackendHandler.java
index 0c8c8c78e88..40f68a2e20f 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewDistSQLBackendHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advanced/PreviewDistSQLBackendHandler.java
@@ -45,7 +45,6 @@ import 
org.apache.shardingsphere.infra.federation.executor.FederationContext;
 import org.apache.shardingsphere.infra.federation.executor.FederationExecutor;
 import 
org.apache.shardingsphere.infra.federation.executor.FederationExecutorFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
@@ -102,7 +101,7 @@ public final class PreviewDistSQLBackendHandler extends 
QueryableRALBackendHandl
         String databaseType = 
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(databaseName).getProtocolType());
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
         Preconditions.checkState(sqlParserRule.isPresent());
-        SQLStatement previewedStatement = new 
ShardingSphereSQLParserEngine(databaseType, 
sqlParserRule.get().toParserConfiguration()).parse(sqlStatement.getSql(), 
false);
+        SQLStatement previewedStatement = 
sqlParserRule.get().getSQLParserEngine(databaseType).parse(sqlStatement.getSql(),
 false);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(),
 previewedStatement, databaseName);
         // TODO optimize SQLStatementDatabaseHolder
         if (sqlStatementContext instanceof TableAvailable) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java
index 7ba8b0d2d5d..5a9b651d89e 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/mysql/executor/information/SelectInformationExecutorTest.java
@@ -26,8 +26,6 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.metadata.user.Grantee;
-import org.apache.shardingsphere.infra.parser.ParserConfiguration;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
@@ -66,7 +64,7 @@ import static org.mockito.Mockito.when;
 @RunWith(MockitoJUnitRunner.class)
 public final class SelectInformationExecutorTest extends ProxyContextRestorer {
     
-    private final ParserConfiguration parserConfig = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()).toParserConfiguration();
+    private final SQLParserRule sqlParserRule = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build());
     
     @Mock
     private ConnectionSession connectionSession;
@@ -91,7 +89,7 @@ public final class SelectInformationExecutorTest extends 
ProxyContextRestorer {
         databaseMap.put("sharding_db", createDatabase(expectedResultSetMap));
         databaseMap.put("database_without_authority", 
createEmptyDatabase("database_without_authority"));
         String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, 
DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA";
-        SelectInformationSchemataExecutor executor = new 
SelectInformationSchemataExecutor((SelectStatement) new 
ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false), sql);
+        SelectInformationSchemataExecutor executor = new 
SelectInformationSchemataExecutor((SelectStatement) 
sqlParserRule.getSQLParserEngine("MySQL").parse(sql, false), sql);
         executor.execute(connectionSession);
         assertThat(executor.getQueryResultMetaData().getColumnCount(), 
is(expectedResultSetMap.size()));
         int count = 0;
@@ -112,7 +110,7 @@ public final class SelectInformationExecutorTest extends 
ProxyContextRestorer {
         Map<String, ShardingSphereDatabase> databaseMap = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData().getDatabases();
         databaseMap.put("empty_db", createEmptyDatabase("empty_db"));
         String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, 
DEFAULT_COLLATION_NAME, DEFAULT_ENCRYPTION FROM information_schema.SCHEMATA";
-        SelectInformationSchemataExecutor executor = new 
SelectInformationSchemataExecutor((SelectStatement) new 
ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false), sql);
+        SelectInformationSchemataExecutor executor = new 
SelectInformationSchemataExecutor((SelectStatement) 
sqlParserRule.getSQLParserEngine("MySQL").parse(sql, false), sql);
         executor.execute(connectionSession);
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(4));
         while (executor.getMergedResult().next()) {
@@ -126,7 +124,7 @@ public final class SelectInformationExecutorTest extends 
ProxyContextRestorer {
     @Test
     public void assertSelectSchemataInNoSchemaExecute() throws SQLException {
         String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, 
DEFAULT_COLLATION_NAME, DEFAULT_ENCRYPTION FROM information_schema.SCHEMATA";
-        SelectInformationSchemataExecutor executor = new 
SelectInformationSchemataExecutor((SelectStatement) new 
ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false), sql);
+        SelectInformationSchemataExecutor executor = new 
SelectInformationSchemataExecutor((SelectStatement) 
sqlParserRule.getSQLParserEngine("MySQL").parse(sql, false), sql);
         executor.execute(connectionSession);
         assertThat(executor.getQueryResultMetaData().getColumnCount(), is(0));
     }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutorTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutorTest.java
index 1374ed2e05c..0ade995e900 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutorTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/postgresql/executor/SelectDatabaseExecutorTest.java
@@ -24,8 +24,6 @@ import 
org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
-import org.apache.shardingsphere.infra.parser.ParserConfiguration;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
@@ -59,7 +57,7 @@ import static org.mockito.Mockito.when;
 
 public final class SelectDatabaseExecutorTest extends ProxyContextRestorer {
     
-    private final ParserConfiguration parserConfig = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()).toParserConfiguration();
+    private final SQLParserRule sqlParserRule = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build());
     
     @Before
     public void setUp() {
@@ -77,7 +75,7 @@ public final class SelectDatabaseExecutorTest extends 
ProxyContextRestorer {
         String sql = "SELECT d.oid, d.datname AS databasename, d.datacl, 
d.datistemplate, d.datallowconn, pg_get_userbyid(d.datdba) AS databaseowner,"
                 + " d.datcollate, d.datctype, shobj_description(d.oid, 
'pg_database') AS description, d.datconnlimit, t.spcname, d.encoding, 
pg_encoding_to_char(d.encoding) AS encodingname "
                 + "FROM pg_database d LEFT JOIN pg_tablespace t ON 
d.dattablespace = t.oid;";
-        SelectDatabaseExecutor selectDatabaseExecutor = new 
SelectDatabaseExecutor((SelectStatement) new 
ShardingSphereSQLParserEngine("PostgreSQL", parserConfig).parse(sql, false), 
sql);
+        SelectDatabaseExecutor selectDatabaseExecutor = new 
SelectDatabaseExecutor((SelectStatement) 
sqlParserRule.getSQLParserEngine("PostgreSQL").parse(sql, false), sql);
         selectDatabaseExecutor.execute(mock(ConnectionSession.class));
         
assertThat(selectDatabaseExecutor.getQueryResultMetaData().getColumnCount(), 
is(4));
         int count = 0;
@@ -145,7 +143,7 @@ public final class SelectDatabaseExecutorTest extends 
ProxyContextRestorer {
         String sql = "SELECT d.oid, d.datname AS databasename, d.datacl, 
d.datistemplate, d.datallowconn, pg_get_userbyid(d.datdba) AS databaseowner, "
                 + "d.datcollate, d.datctype, shobj_description(d.oid, 
'pg_database') AS description, d.datconnlimit, t.spcname, d.encoding, 
pg_encoding_to_char(d.encoding) AS encodingname "
                 + "FROM pg_database d LEFT JOIN pg_tablespace t ON 
d.dattablespace = t.oid;";
-        SelectDatabaseExecutor selectDatabaseExecutor = new 
SelectDatabaseExecutor((SelectStatement) new 
ShardingSphereSQLParserEngine("PostgreSQL", parserConfig).parse(sql, false), 
sql);
+        SelectDatabaseExecutor selectDatabaseExecutor = new 
SelectDatabaseExecutor((SelectStatement) 
sqlParserRule.getSQLParserEngine("PostgreSQL").parse(sql, false), sql);
         selectDatabaseExecutor.execute(mock(ConnectionSession.class));
         while (selectDatabaseExecutor.getMergedResult().next()) {
             assertThat(selectDatabaseExecutor.getMergedResult().getValue(1, 
String.class), is("empty_db"));
@@ -156,7 +154,7 @@ public final class SelectDatabaseExecutorTest extends 
ProxyContextRestorer {
     public void 
assertSelectDatabaseWithoutDataSourceExecuteAndWithColumnProjectionSegment() 
throws SQLException {
         addEmptyDatabase();
         String sql = "SELECT d.oid, d.datname AS databasename, d.datacl, 
d.datistemplate FROM pg_database d LEFT JOIN pg_tablespace t ON d.dattablespace 
= t.oid;";
-        SelectDatabaseExecutor selectDatabaseExecutor = new 
SelectDatabaseExecutor((SelectStatement) new 
ShardingSphereSQLParserEngine("PostgreSQL", parserConfig).parse(sql, false), 
sql);
+        SelectDatabaseExecutor selectDatabaseExecutor = new 
SelectDatabaseExecutor((SelectStatement) 
sqlParserRule.getSQLParserEngine("PostgreSQL").parse(sql, false), sql);
         selectDatabaseExecutor.execute(mock(ConnectionSession.class));
         while (selectDatabaseExecutor.getMergedResult().next()) {
             assertThat(selectDatabaseExecutor.getMergedResult().getValue(1, 
String.class), is(""));
@@ -169,7 +167,7 @@ public final class SelectDatabaseExecutorTest extends 
ProxyContextRestorer {
     @Test
     public void assertSelectDatabaseInNoSchemaExecute() throws SQLException {
         String sql = "SELECT d.oid, d.datname AS databasename, d.datacl, 
d.datistemplate FROM pg_database d LEFT JOIN pg_tablespace t ON d.dattablespace 
= t.oid;";
-        SelectDatabaseExecutor selectDatabaseExecutor = new 
SelectDatabaseExecutor((SelectStatement) new 
ShardingSphereSQLParserEngine("PostgreSQL", parserConfig).parse(sql, false), 
sql);
+        SelectDatabaseExecutor selectDatabaseExecutor = new 
SelectDatabaseExecutor((SelectStatement) 
sqlParserRule.getSQLParserEngine("PostgreSQL").parse(sql, false), sql);
         selectDatabaseExecutor.execute(mock(ConnectionSession.class));
         
assertThat(selectDatabaseExecutor.getQueryResultMetaData().getColumnCount(), 
is(0));
     }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advance/ParseDistSQLBackendHandlerTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advance/ParseDistSQLBackendHandlerTest.java
index 87994e196ad..414fb19770f 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advance/ParseDistSQLBackendHandlerTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/advance/ParseDistSQLBackendHandlerTest.java
@@ -20,7 +20,6 @@ package 
org.apache.shardingsphere.proxy.backend.text.distsql.ral.advance;
 import com.google.gson.Gson;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.advanced.ParseStatement;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
@@ -68,7 +67,7 @@ public final class ParseDistSQLBackendHandlerTest extends 
ProxyContextRestorer {
         ParseDistSQLBackendHandler parseDistSQLBackendHandler = new 
ParseDistSQLBackendHandler().init(new HandlerParameter<>(parseStatement, new 
MySQLDatabaseType(), mock(ConnectionSession.class)));
         parseDistSQLBackendHandler.execute();
         parseDistSQLBackendHandler.next();
-        SQLStatement statement = new ShardingSphereSQLParserEngine("MySQL", 
sqlParserRule.toParserConfiguration()).parse(sql, false);
+        SQLStatement statement = 
sqlParserRule.getSQLParserEngine("MySQL").parse(sql, false);
         assertThat(new 
LinkedList<>(parseDistSQLBackendHandler.getRowData()).getFirst(), 
is("MySQLSelectStatement"));
         assertThat(new 
LinkedList<>(parseDistSQLBackendHandler.getRowData()).getLast(), is(new 
Gson().toJson(statement)));
     }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
index 896011a0b09..aa07c92811a 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/execute/MySQLComStmtExecuteExecutor.java
@@ -30,10 +30,9 @@ import 
org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.type.TableAvailable;
-import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
 import org.apache.shardingsphere.infra.executor.check.SQLCheckEngine;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
@@ -85,9 +84,8 @@ public final class MySQLComStmtExecuteExecutor implements 
QueryCommandExecutor {
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
         Preconditions.checkState(sqlParserRule.isPresent());
-        ShardingSphereSQLParserEngine sqlStatementParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(
-                metaDataContexts.getDatabase(databaseName).getProtocolType()), 
sqlParserRule.get().toParserConfiguration());
-        SQLStatement sqlStatement = 
sqlStatementParserEngine.parse(packet.getSql(), true);
+        SQLStatement sqlStatement = sqlParserRule.get().getSQLParserEngine(
+                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(databaseName).getProtocolType())).parse(packet.getSql(),
 true);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(),
 packet.getParameters(),
                 sqlStatement, connectionSession.getDefaultDatabaseName());
         // TODO optimize SQLStatementDatabaseHolder
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
index 085efe171be..94904cef0b8 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/binary/prepare/MySQLComStmtPrepareExecutor.java
@@ -31,7 +31,6 @@ import 
org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -71,9 +70,8 @@ public final class MySQLComStmtPrepareExecutor implements 
CommandExecutor {
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
         Preconditions.checkState(sqlParserRule.isPresent());
-        ShardingSphereSQLParserEngine sqlStatementParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(
-                
metaDataContexts.getDatabase(connectionSession.getDatabaseName()).getProtocolType()),
 sqlParserRule.get().toParserConfiguration());
-        SQLStatement sqlStatement = 
sqlStatementParserEngine.parse(packet.getSql(), true);
+        SQLStatement sqlStatement = sqlParserRule.get().getSQLParserEngine(
+                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(connectionSession.getDatabaseName()).getProtocolType())).parse(packet.getSql(),
 true);
         if (!MySQLComStmtPrepareChecker.isStatementAllowed(sqlStatement)) {
             throw new UnsupportedPreparedStatementException();
         }
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java
index 1560ef49d11..5fbe2c55362 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/fieldlist/MySQLComFieldListPacketExecutor.java
@@ -27,7 +27,6 @@ import 
org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import 
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngineFactory;
@@ -67,9 +66,8 @@ public final class MySQLComFieldListPacketExecutor implements 
CommandExecutor {
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
         Preconditions.checkState(sqlParserRule.isPresent());
-        ShardingSphereSQLParserEngine sqlStatementParserEngine = new 
ShardingSphereSQLParserEngine(
-                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(databaseName).getProtocolType()),
 sqlParserRule.get().toParserConfiguration());
-        SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
+        SQLStatement sqlStatement = sqlParserRule.get().getSQLParserEngine(
+                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(databaseName).getProtocolType())).parse(sql,
 false);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(),
 sqlStatement, databaseName);
         JDBCBackendConnection backendConnection = (JDBCBackendConnection) 
connectionSession.getBackendConnection();
         databaseCommunicationEngine = 
DatabaseCommunicationEngineFactory.getInstance().newTextProtocolInstance(sqlStatementContext,
 sql, backendConnection);
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutor.java
index cfb1cedb92d..95df5c5a09c 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLComQueryPacketExecutor.java
@@ -17,6 +17,7 @@
 
 package 
org.apache.shardingsphere.proxy.frontend.mysql.command.query.text.query;
 
+import com.google.common.base.Preconditions;
 import lombok.Getter;
 import org.apache.shardingsphere.db.protocol.mysql.constant.MySQLConstants;
 import 
org.apache.shardingsphere.db.protocol.mysql.constant.MySQLServerErrorCode;
@@ -29,7 +30,6 @@ import 
org.apache.shardingsphere.db.protocol.mysql.packet.generic.MySQLOKPacket;
 import org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -80,9 +80,9 @@ public final class MySQLComQueryPacketExecutor implements 
QueryCommandExecutor {
             return new EmptyStatement();
         }
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        ShardingSphereSQLParserEngine engine = new 
ShardingSphereSQLParserEngine(databaseType.getType(), metaDataContexts
-                
.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class).orElseThrow(()
 -> new IllegalStateException("SQLParserRule not 
found")).toParserConfiguration());
-        return engine.parse(sql, false);
+        Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
+        Preconditions.checkState(sqlParserRule.isPresent());
+        return 
sqlParserRule.get().getSQLParserEngine(databaseType.getType()).parse(sql, 
false);
     }
     
     private boolean areMultiStatements(final ConnectionSession 
connectionSession, final SQLStatement sqlStatement, final String sql) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
index 16bf05ea8b5..1b81be79a88 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/mysql/command/query/text/query/MySQLMultiStatementsHandler.java
@@ -17,6 +17,7 @@
 
 package 
org.apache.shardingsphere.proxy.frontend.mysql.command.query.text.query;
 
+import com.google.common.base.Preconditions;
 import org.apache.shardingsphere.infra.binder.LogicSQL;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
@@ -108,9 +109,9 @@ public final class MySQLMultiStatementsHandler implements 
TextProtocolBackendHan
     
     private ShardingSphereSQLParserEngine getSQLParserEngine() {
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        return new 
ShardingSphereSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(connectionSession.getDatabaseName()).getProtocolType()),
-                metaDataContexts
-                        
.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class).orElseThrow(()
 -> new IllegalStateException("SQLParserRule not 
found")).toParserConfiguration());
+        Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
+        Preconditions.checkState(sqlParserRule.isPresent());
+        return 
sqlParserRule.get().getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(connectionSession.getDatabaseName()).getProtocolType()));
     }
     
     private List<String> extractMultiStatements(final Pattern pattern, final 
String sql) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java
index 83b401aefa7..de287975056 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/main/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/parse/PostgreSQLComParseExecutor.java
@@ -73,8 +73,7 @@ public final class PostgreSQLComParseExecutor implements 
CommandExecutor {
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
         Preconditions.checkState(sqlParserRule.isPresent());
-        return new ShardingSphereSQLParserEngine(
-                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(schemaName).getProtocolType()),
 sqlParserRule.get().toParserConfiguration());
+        return 
sqlParserRule.get().getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(schemaName).getProtocolType()));
     }
     
     private String convertSQLToJDBCStyle(final SQLStatement sqlStatement, 
final String sql) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java
index 1f1c2aac305..1dc040db0bb 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/binary/execute/ReactiveMySQLComStmtExecuteExecutor.java
@@ -32,10 +32,9 @@ import 
org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.binder.type.TableAvailable;
-import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeFactory;
 import org.apache.shardingsphere.infra.executor.check.SQLCheckEngine;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
@@ -86,9 +85,8 @@ public final class ReactiveMySQLComStmtExecuteExecutor 
implements ReactiveComman
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
         Preconditions.checkState(sqlParserRule.isPresent());
-        ShardingSphereSQLParserEngine sqlStatementParserEngine = new 
ShardingSphereSQLParserEngine(
-                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(databaseName).getProtocolType()),
 sqlParserRule.get().toParserConfiguration());
-        SQLStatement sqlStatement = 
sqlStatementParserEngine.parse(packet.getSql(), true);
+        SQLStatement sqlStatement = sqlParserRule.get().getSQLParserEngine(
+                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(databaseName).getProtocolType())).parse(packet.getSql(),
 true);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(),
 packet.getParameters(),
                 sqlStatement, connectionSession.getDefaultDatabaseName());
         // TODO optimize SQLStatementDatabaseHolder
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/text/fieldlist/ReactiveMySQLComFieldListPacketExecutor.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/text/fieldlist/ReactiveMySQLComFieldListPacketExecutor.java
index 38e3b3e64ec..a30259baa10 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/text/fieldlist/ReactiveMySQLComFieldListPacketExecutor.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-reactive-mysql/src/main/java/org/apache/shardingsphere/proxy/frontend/reactive/mysql/command/query/text/fieldlist/ReactiveMySQLComFieldListPacketExecutor.java
@@ -28,7 +28,6 @@ import 
org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import org.apache.shardingsphere.infra.binder.SQLStatementContextFactory;
 import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
-import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import 
org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngineFactory;
@@ -67,9 +66,8 @@ public final class ReactiveMySQLComFieldListPacketExecutor 
implements ReactiveCo
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
         Preconditions.checkState(sqlParserRule.isPresent());
-        ShardingSphereSQLParserEngine sqlStatementParserEngine = new 
ShardingSphereSQLParserEngine(
-                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(databaseName).getProtocolType()),
 sqlParserRule.get().toParserConfiguration());
-        SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
+        SQLStatement sqlStatement = sqlParserRule.get().getSQLParserEngine(
+                
DatabaseTypeEngine.getTrunkDatabaseTypeName(metaDataContexts.getDatabase(databaseName).getProtocolType())).parse(sql,
 false);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaData().getDatabases(),
 sqlStatement, databaseName);
         databaseCommunicationEngine = 
DatabaseCommunicationEngineFactory.getInstance().newTextProtocolInstance(sqlStatementContext,
 sql, connectionSession.getBackendConnection());
         characterSet = 
connectionSession.getAttributeMap().attr(MySQLConstants.MYSQL_CHARACTER_SET_ATTRIBUTE_KEY).get().getId();

Reply via email to