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

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new a4268dc  Decouple SQLParserRule and shardingsphere-infra-parser module 
(#16393)
a4268dc is described below

commit a4268dcd97603c91509141b573c30ba232adc6f7
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Mar 26 15:59:14 2022 +0800

    Decouple SQLParserRule and shardingsphere-infra-parser module (#16393)
    
    * Refactor ParseASTNode
    
    * Merge ParseContext and ParseASTNode
    
    * Merge ParseContext and ParseASTNode
    
    * Merge ParseContext and ParseASTNode
    
    * Refactor AbstractSQLStatement
    
    * For code format
    
    * Decouple SQLParserRule and shardingsphere-infra-parser module
    
    * Decouple SQLParserRule and shardingsphere-infra-parser module
    
    * Add ParserConfiguration
---
 .../autogen/AdvancedDistSQLStatementParser.java    | 353 +++++++++++++++++++++
 ...ableAvailableAndSqlStatementContextFixture.java |  51 ---
 .../ShadowDeleteStatementRoutingEngineTest.java    |  29 +-
 .../ShadowInsertStatementRoutingEngineTest.java    |  10 +-
 .../ShadowSelectStatementRoutingEngineTest.java    |   6 +-
 .../ShadowUpdateStatementRoutingEngineTest.java    |   6 +-
 .../ShadowNonDMLStatementRoutingEngineTest.java    |   8 +-
 .../engine/type/standard/AbstractSQLRouteTest.java |   6 +-
 .../table/FilterableTableScanExecutor.java         |   4 +-
 .../pom.xml                                        |   5 +
 .../optimizer/ShardingSphereOptimizerTest.java     |  33 +-
 .../shardingsphere-infra-parser/pom.xml            |   5 -
 .../infra/parser/ParserConfiguration.java          |  22 +-
 .../parser/ShardingSphereSQLParserEngine.java      |   6 +-
 .../parser/cache/SQLStatementCacheBuilder.java     |  13 +-
 .../parser/cache/SQLStatementCacheLoader.java      |   6 +-
 .../infra/parser/sql/SQLStatementParserEngine.java |   8 +-
 .../sql/SQLStatementParserEngineFactory.java       |  11 +-
 .../parser/sql/SQLStatementParserExecutor.java     |   8 +-
 .../parser/cache/SQLStatementCacheBuilderTest.java |   6 +-
 .../parser/cache/SQLStatementCacheLoaderTest.java  |   6 +-
 .../statement/ShardingSpherePreparedStatement.java |   4 +-
 .../core/statement/ShardingSphereStatement.java    |   9 +-
 .../shardingsphere-parser-core/pom.xml             |  10 +-
 .../shardingsphere/parser/rule/SQLParserRule.java  |  10 +
 .../text/TextProtocolBackendHandlerFactory.java    |   4 +-
 .../ral/advanced/ParseDistSQLBackendHandler.java   |   5 +-
 .../ral/advanced/PreviewDistSQLBackendHandler.java |   4 +-
 .../information/SelectInformationExecutorTest.java |   9 +-
 .../executor/SelectDatabaseExecutorTest.java       |  11 +-
 .../SchemaAssignedDatabaseBackendHandlerTest.java  |   2 +-
 .../advance/ParseDistSQLBackendHandlerTest.java    |   2 +-
 .../execute/MySQLComStmtExecuteExecutor.java       |   4 +-
 .../prepare/MySQLComStmtPrepareExecutor.java       |   7 +-
 .../fieldlist/MySQLComFieldListPacketExecutor.java |   4 +-
 .../bind/OpenGaussComBatchBindExecutorTest.java    |   7 +-
 .../extended/parse/PostgreSQLComParseExecutor.java |   8 +-
 ...egatedBatchedStatementsCommandExecutorTest.java |   7 +-
 .../PostgreSQLComDescribeExecutorTest.java         |   7 +-
 .../ReactiveMySQLComStmtExecuteExecutor.java       |   6 +-
 .../ReactiveMySQLComFieldListPacketExecutor.java   |   4 +-
 .../core/database/visitor/SQLVisitorFactory.java   |  12 +-
 .../core/database/visitor/SQLVisitorRule.java      |  68 ++--
 .../sql/common/statement/AbstractSQLStatement.java |   6 +-
 .../AbstractSQLRewriterParameterizedTest.java      |   3 +-
 45 files changed, 571 insertions(+), 244 deletions(-)

diff --git 
a/shardingsphere-distsql/shardingsphere-distsql-parser/target/generated-sources/antlr4/org/apache/shardingsphere/distsql/parser/autogen/AdvancedDistSQLStatementParser.java
 
b/shardingsphere-distsql/shardingsphere-distsql-parser/target/generated-sources/antlr4/org/apache/shardingsphere/distsql/parser/autogen/AdvancedDistSQLStatementParser.java
new file mode 100644
index 0000000..10bf9dc
--- /dev/null
+++ 
b/shardingsphere-distsql/shardingsphere-distsql-parser/target/generated-sources/antlr4/org/apache/shardingsphere/distsql/parser/autogen/AdvancedDistSQLStatementParser.java
@@ -0,0 +1,353 @@
+// Generated from 
org/apache/shardingsphere/distsql/parser/autogen/AdvancedDistSQLStatement.g4 by 
ANTLR 4.9.2
+package org.apache.shardingsphere.distsql.parser.autogen;
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
+import org.antlr.v4.runtime.tree.*;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class AdvancedDistSQLStatementParser extends Parser {
+       static { RuntimeMetaData.checkVersion("4.9.2", 
RuntimeMetaData.VERSION); }
+
+       protected static final DFA[] _decisionToDFA;
+       protected static final PredictionContextCache _sharedContextCache =
+               new PredictionContextCache();
+       public static final int
+               AND=1, OR=2, NOT=3, TILDE=4, VERTICALBAR=5, AMPERSAND=6, 
SIGNEDLEFTSHIFT=7, 
+               SIGNEDRIGHTSHIFT=8, CARET=9, MOD=10, COLON=11, PLUS=12, 
MINUS=13, ASTERISK=14, 
+               SLASH=15, BACKSLASH=16, DOT=17, DOTASTERISK=18, SAFEEQ=19, 
DEQ=20, EQ=21, 
+               NEQ=22, GT=23, GTE=24, LT=25, LTE=26, POUND=27, LP=28, RP=29, 
LBE=30, 
+               RBE=31, LBT=32, RBT=33, COMMA=34, DQ=35, SQ=36, BQ=37, 
QUESTION=38, AT=39, 
+               SEMI=40, JSONSEPARATOR=41, UL=42, DL=43, WS=44, PREVIEW=45, 
PARSE=46, 
+               FORMAT=47, SQLString=48, FOR_GENERATOR=49;
+       public static final int
+               RULE_execute = 0, RULE_previewSQL = 1, RULE_parseSQL = 2, 
RULE_formatSQL = 3, 
+               RULE_sql = 4;
+       private static String[] makeRuleNames() {
+               return new String[] {
+                       "execute", "previewSQL", "parseSQL", "formatSQL", "sql"
+               };
+       }
+       public static final String[] ruleNames = makeRuleNames();
+
+       private static String[] makeLiteralNames() {
+               return new String[] {
+                       null, "'&&'", "'||'", "'!'", "'~'", "'|'", "'&'", 
"'<<'", "'>>'", "'^'", 
+                       "'%'", "':'", "'+'", "'-'", "'*'", "'/'", "'\\'", 
"'.'", "'.*'", "'<=>'", 
+                       "'=='", "'='", null, "'>'", "'>='", "'<'", "'<='", 
"'#'", "'('", "')'", 
+                       "'{'", "'}'", "'['", "']'", "','", "'\"'", "'''", 
"'`'", "'?'", "'@'", 
+                       "';'", "'->>'", "'_'", "'$'", null, null, null, null, 
null, "'DO NOT MATCH ANY THING, JUST FOR GENERATOR'"
+               };
+       }
+       private static final String[] _LITERAL_NAMES = makeLiteralNames();
+       private static String[] makeSymbolicNames() {
+               return new String[] {
+                       null, "AND", "OR", "NOT", "TILDE", "VERTICALBAR", 
"AMPERSAND", "SIGNEDLEFTSHIFT", 
+                       "SIGNEDRIGHTSHIFT", "CARET", "MOD", "COLON", "PLUS", 
"MINUS", "ASTERISK", 
+                       "SLASH", "BACKSLASH", "DOT", "DOTASTERISK", "SAFEEQ", 
"DEQ", "EQ", "NEQ", 
+                       "GT", "GTE", "LT", "LTE", "POUND", "LP", "RP", "LBE", 
"RBE", "LBT", "RBT", 
+                       "COMMA", "DQ", "SQ", "BQ", "QUESTION", "AT", "SEMI", 
"JSONSEPARATOR", 
+                       "UL", "DL", "WS", "PREVIEW", "PARSE", "FORMAT", 
"SQLString", "FOR_GENERATOR"
+               };
+       }
+       private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames();
+       public static final Vocabulary VOCABULARY = new 
VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+       /**
+        * @deprecated Use {@link #VOCABULARY} instead.
+        */
+       @Deprecated
+       public static final String[] tokenNames;
+       static {
+               tokenNames = new String[_SYMBOLIC_NAMES.length];
+               for (int i = 0; i < tokenNames.length; i++) {
+                       tokenNames[i] = VOCABULARY.getLiteralName(i);
+                       if (tokenNames[i] == null) {
+                               tokenNames[i] = VOCABULARY.getSymbolicName(i);
+                       }
+
+                       if (tokenNames[i] == null) {
+                               tokenNames[i] = "<INVALID>";
+                       }
+               }
+       }
+
+       @Override
+       @Deprecated
+       public String[] getTokenNames() {
+               return tokenNames;
+       }
+
+       @Override
+
+       public Vocabulary getVocabulary() {
+               return VOCABULARY;
+       }
+
+       @Override
+       public String getGrammarFileName() { return 
"AdvancedDistSQLStatement.g4"; }
+
+       @Override
+       public String[] getRuleNames() { return ruleNames; }
+
+       @Override
+       public String getSerializedATN() { return _serializedATN; }
+
+       @Override
+       public ATN getATN() { return _ATN; }
+
+       public AdvancedDistSQLStatementParser(TokenStream input) {
+               super(input);
+               _interp = new 
ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+       }
+
+       public static class ExecuteContext extends ParserRuleContext {
+               public PreviewSQLContext previewSQL() {
+                       return getRuleContext(PreviewSQLContext.class,0);
+               }
+               public ParseSQLContext parseSQL() {
+                       return getRuleContext(ParseSQLContext.class,0);
+               }
+               public FormatSQLContext formatSQL() {
+                       return getRuleContext(FormatSQLContext.class,0);
+               }
+               public TerminalNode SEMI() { return 
getToken(AdvancedDistSQLStatementParser.SEMI, 0); }
+               public ExecuteContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return RULE_execute; }
+               @Override
+               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+                       if ( visitor instanceof AdvancedDistSQLStatementVisitor 
) return ((AdvancedDistSQLStatementVisitor<? extends 
T>)visitor).visitExecute(this);
+                       else return visitor.visitChildren(this);
+               }
+       }
+
+       public final ExecuteContext execute() throws RecognitionException {
+               ExecuteContext _localctx = new ExecuteContext(_ctx, getState());
+               enterRule(_localctx, 0, RULE_execute);
+               int _la;
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(13);
+                       _errHandler.sync(this);
+                       switch (_input.LA(1)) {
+                       case PREVIEW:
+                               {
+                               setState(10);
+                               previewSQL();
+                               }
+                               break;
+                       case PARSE:
+                               {
+                               setState(11);
+                               parseSQL();
+                               }
+                               break;
+                       case FORMAT:
+                               {
+                               setState(12);
+                               formatSQL();
+                               }
+                               break;
+                       default:
+                               throw new NoViableAltException(this);
+                       }
+                       setState(16);
+                       _errHandler.sync(this);
+                       _la = _input.LA(1);
+                       if (_la==SEMI) {
+                               {
+                               setState(15);
+                               match(SEMI);
+                               }
+                       }
+
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
+       public static class PreviewSQLContext extends ParserRuleContext {
+               public TerminalNode PREVIEW() { return 
getToken(AdvancedDistSQLStatementParser.PREVIEW, 0); }
+               public SqlContext sql() {
+                       return getRuleContext(SqlContext.class,0);
+               }
+               public PreviewSQLContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return RULE_previewSQL; }
+               @Override
+               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+                       if ( visitor instanceof AdvancedDistSQLStatementVisitor 
) return ((AdvancedDistSQLStatementVisitor<? extends 
T>)visitor).visitPreviewSQL(this);
+                       else return visitor.visitChildren(this);
+               }
+       }
+
+       public final PreviewSQLContext previewSQL() throws RecognitionException 
{
+               PreviewSQLContext _localctx = new PreviewSQLContext(_ctx, 
getState());
+               enterRule(_localctx, 2, RULE_previewSQL);
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(18);
+                       match(PREVIEW);
+                       setState(19);
+                       sql();
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
+       public static class ParseSQLContext extends ParserRuleContext {
+               public TerminalNode PARSE() { return 
getToken(AdvancedDistSQLStatementParser.PARSE, 0); }
+               public SqlContext sql() {
+                       return getRuleContext(SqlContext.class,0);
+               }
+               public ParseSQLContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return RULE_parseSQL; }
+               @Override
+               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+                       if ( visitor instanceof AdvancedDistSQLStatementVisitor 
) return ((AdvancedDistSQLStatementVisitor<? extends 
T>)visitor).visitParseSQL(this);
+                       else return visitor.visitChildren(this);
+               }
+       }
+
+       public final ParseSQLContext parseSQL() throws RecognitionException {
+               ParseSQLContext _localctx = new ParseSQLContext(_ctx, 
getState());
+               enterRule(_localctx, 4, RULE_parseSQL);
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(21);
+                       match(PARSE);
+                       setState(22);
+                       sql();
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
+       public static class FormatSQLContext extends ParserRuleContext {
+               public TerminalNode FORMAT() { return 
getToken(AdvancedDistSQLStatementParser.FORMAT, 0); }
+               public SqlContext sql() {
+                       return getRuleContext(SqlContext.class,0);
+               }
+               public FormatSQLContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return RULE_formatSQL; }
+               @Override
+               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+                       if ( visitor instanceof AdvancedDistSQLStatementVisitor 
) return ((AdvancedDistSQLStatementVisitor<? extends 
T>)visitor).visitFormatSQL(this);
+                       else return visitor.visitChildren(this);
+               }
+       }
+
+       public final FormatSQLContext formatSQL() throws RecognitionException {
+               FormatSQLContext _localctx = new FormatSQLContext(_ctx, 
getState());
+               enterRule(_localctx, 6, RULE_formatSQL);
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(24);
+                       match(FORMAT);
+                       setState(25);
+                       sql();
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
+       public static class SqlContext extends ParserRuleContext {
+               public TerminalNode SQLString() { return 
getToken(AdvancedDistSQLStatementParser.SQLString, 0); }
+               public SqlContext(ParserRuleContext parent, int invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return RULE_sql; }
+               @Override
+               public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+                       if ( visitor instanceof AdvancedDistSQLStatementVisitor 
) return ((AdvancedDistSQLStatementVisitor<? extends T>)visitor).visitSql(this);
+                       else return visitor.visitChildren(this);
+               }
+       }
+
+       public final SqlContext sql() throws RecognitionException {
+               SqlContext _localctx = new SqlContext(_ctx, getState());
+               enterRule(_localctx, 8, RULE_sql);
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(27);
+                       match(SQLString);
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
+       public static final String _serializedATN =
+               "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\63 
\4\2\t\2\4\3\t"+
+               
"\3\4\4\t\4\4\5\t\5\4\6\t\6\3\2\3\2\3\2\5\2\20\n\2\3\2\5\2\23\n\2\3\3\3"+
+               
"\3\3\3\3\4\3\4\3\4\3\5\3\5\3\5\3\6\3\6\3\6\2\2\7\2\4\6\b\n\2\2\2\35\2"+
+               
"\17\3\2\2\2\4\24\3\2\2\2\6\27\3\2\2\2\b\32\3\2\2\2\n\35\3\2\2\2\f\20\5"+
+               
"\4\3\2\r\20\5\6\4\2\16\20\5\b\5\2\17\f\3\2\2\2\17\r\3\2\2\2\17\16\3\2"+
+               
"\2\2\20\22\3\2\2\2\21\23\7*\2\2\22\21\3\2\2\2\22\23\3\2\2\2\23\3\3\2\2"+
+               
"\2\24\25\7/\2\2\25\26\5\n\6\2\26\5\3\2\2\2\27\30\7\60\2\2\30\31\5\n\6"+
+               
"\2\31\7\3\2\2\2\32\33\7\61\2\2\33\34\5\n\6\2\34\t\3\2\2\2\35\36\7\62\2"+
+               "\2\36\13\3\2\2\2\4\17\22";
+       public static final ATN _ATN =
+               new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+       static {
+               _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+               for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+                       _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), 
i);
+               }
+       }
+}
\ No newline at end of file
diff --git 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/TableAvailableAndSqlStatementContextFixture.java
 
b/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/TableAvailableAndSqlStatementContextFixture.java
deleted file mode 100644
index b6b318c..0000000
--- 
a/shardingsphere-features/shardingsphere-encrypt/shardingsphere-encrypt-core/src/test/java/org/apache/shardingsphere/encrypt/merge/dql/fixture/TableAvailableAndSqlStatementContextFixture.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * 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.encrypt.merge.dql.fixture;
-
-import org.apache.shardingsphere.infra.binder.segment.table.TablesContext;
-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.database.type.DatabaseTypeRegistry;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-
-import java.util.Collection;
-
-public final class TableAvailableAndSqlStatementContextFixture implements 
TableAvailable, SQLStatementContext {
-    
-    @Override
-    public SQLStatement getSqlStatement() {
-        return null;
-    }
-    
-    @Override
-    public Collection<SimpleTableSegment> getAllTables() {
-        return null;
-    }
-    
-    @Override
-    public TablesContext getTablesContext() {
-        return null;
-    }
-    
-    @Override
-    public DatabaseType getDatabaseType() {
-        return DatabaseTypeRegistry.getDefaultDatabaseType();
-    }
-}
diff --git 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowDeleteStatementRoutingEngineTest.java
 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowDeleteStatementRoutingEngineTest.java
index 6e97c28..3641d1b 100644
--- 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowDeleteStatementRoutingEngineTest.java
+++ 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowDeleteStatementRoutingEngineTest.java
@@ -54,14 +54,14 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 public final class ShadowDeleteStatementRoutingEngineTest {
-
+    
     private ShadowDeleteStatementRoutingEngine 
shadowDeleteStatementRoutingEngine;
-
+    
     @Before
     public void init() {
         shadowDeleteStatementRoutingEngine = new 
ShadowDeleteStatementRoutingEngine(createDeleteStatementContext(), 
Collections.emptyList());
     }
-
+    
     private DeleteStatementContext createDeleteStatementContext() {
         DeleteStatementContext result = mock(DeleteStatementContext.class);
         Collection<SimpleTableSegment> allTables = new LinkedList<>();
@@ -72,15 +72,13 @@ public final class ShadowDeleteStatementRoutingEngineTest {
         when(binaryOperationExpression.getRight()).thenReturn(new 
LiteralExpressionSegment(0, 0, "1"));
         WhereSegment whereSegment = new WhereSegment(0, 0, 
binaryOperationExpression);
         
when(result.getWhereSegments()).thenReturn(Collections.singletonList(whereSegment));
-        MySQLDeleteStatement mySQLDeleteStatement = new MySQLDeleteStatement();
-        Collection<CommentSegment> commentSegments = new LinkedList<>();
-        commentSegments.add(new CommentSegment("/*shadow:true,foo:bar*/", 0, 
20));
-        commentSegments.add(new CommentSegment("/*aaa:bbb*/", 21, 30));
-        mySQLDeleteStatement.setCommentSegments(commentSegments);
-        when(result.getSqlStatement()).thenReturn(mySQLDeleteStatement);
+        MySQLDeleteStatement deleteStatement = new MySQLDeleteStatement();
+        deleteStatement.getCommentSegments().add(new 
CommentSegment("/*shadow:true,foo:bar*/", 0, 20));
+        deleteStatement.getCommentSegments().add(new 
CommentSegment("/*aaa:bbb*/", 21, 30));
+        when(result.getSqlStatement()).thenReturn(deleteStatement);
         return result;
     }
-
+    
     @Test
     public void assertRouteAndParseShadowColumnConditions() {
         RouteContext routeContext = mock(RouteContext.class);
@@ -95,7 +93,7 @@ public final class ShadowDeleteStatementRoutingEngineTest {
         assertThat(sqlNotesIt.next(), is("/*shadow:true,foo:bar*/"));
         assertThat(sqlNotesIt.next(), is("/*aaa:bbb*/"));
     }
-
+    
     private AlgorithmProvidedShadowRuleConfiguration 
createAlgorithmProvidedShadowRuleConfiguration() {
         AlgorithmProvidedShadowRuleConfiguration result = new 
AlgorithmProvidedShadowRuleConfiguration();
         result.setDataSources(createDataSources());
@@ -103,13 +101,13 @@ public final class ShadowDeleteStatementRoutingEngineTest 
{
         result.setShadowAlgorithms(createShadowAlgorithms());
         return result;
     }
-
+    
     private Map<String, ShadowAlgorithm> createShadowAlgorithms() {
         Map<String, ShadowAlgorithm> result = new LinkedHashMap<>();
         result.put("user-id-delete-regex-algorithm", 
createColumnShadowAlgorithm());
         return result;
     }
-
+    
     private ShadowAlgorithm createColumnShadowAlgorithm() {
         Properties properties = new Properties();
         properties.setProperty("column", "user_id");
@@ -120,7 +118,7 @@ public final class ShadowDeleteStatementRoutingEngineTest {
         columnRegexMatchShadowAlgorithm.init();
         return columnRegexMatchShadowAlgorithm;
     }
-
+    
     private Map<String, ShadowTableConfiguration> createTables() {
         Map<String, ShadowTableConfiguration> result = new LinkedHashMap<>();
         Collection<String> shadowAlgorithmNames = new LinkedList<>();
@@ -128,7 +126,7 @@ public final class ShadowDeleteStatementRoutingEngineTest {
         result.put("t_order", new 
ShadowTableConfiguration(Collections.singletonList("shadow-data-source-0"), 
shadowAlgorithmNames));
         return result;
     }
-
+    
     private Map<String, ShadowDataSourceConfiguration> createDataSources() {
         Map<String, ShadowDataSourceConfiguration> result = new 
LinkedHashMap<>();
         result.put("shadow-data-source-0", new 
ShadowDataSourceConfiguration("ds", "ds_shadow"));
@@ -142,4 +140,3 @@ public final class ShadowDeleteStatementRoutingEngineTest {
         
assertThat(allTables.iterator().next().getTableName().getIdentifier().getValue(),
 is("t_order"));
     }
 }
-
diff --git 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngineTest.java
 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngineTest.java
index 02924de..b0d546b 100644
--- 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngineTest.java
+++ 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowInsertStatementRoutingEngineTest.java
@@ -77,12 +77,10 @@ public final class ShadowInsertStatementRoutingEngineTest {
         valueExpressions.add(new LiteralExpressionSegment(21, 30, 
"orderName"));
         insertValueContexts.add(new InsertValueContext(valueExpressions, new 
ArrayList<>(), 0));
         when(result.getInsertValueContexts()).thenReturn(insertValueContexts);
-        MySQLInsertStatement mySQLInsertStatement = new MySQLInsertStatement();
-        Collection<CommentSegment> commentSegments = new LinkedList<>();
-        commentSegments.add(new CommentSegment("/*shadow:true,foo:bar*/", 0, 
20));
-        commentSegments.add(new CommentSegment("/*aaa:bbb*/", 21, 30));
-        mySQLInsertStatement.setCommentSegments(commentSegments);
-        when(result.getSqlStatement()).thenReturn(mySQLInsertStatement);
+        MySQLInsertStatement insertStatement = new MySQLInsertStatement();
+        insertStatement.getCommentSegments().add(new 
CommentSegment("/*shadow:true,foo:bar*/", 0, 20));
+        insertStatement.getCommentSegments().add(new 
CommentSegment("/*aaa:bbb*/", 21, 30));
+        when(result.getSqlStatement()).thenReturn(insertStatement);
         return result;
     }
     
diff --git 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngineTest.java
 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngineTest.java
index e554705..414a20f 100644
--- 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngineTest.java
+++ 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowSelectStatementRoutingEngineTest.java
@@ -73,10 +73,8 @@ public final class ShadowSelectStatementRoutingEngineTest {
         WhereSegment whereSegment = new WhereSegment(0, 0, 
binaryOperationExpression);
         
when(result.getWhereSegments()).thenReturn(Collections.singletonList(whereSegment));
         MySQLSelectStatement selectStatement = new MySQLSelectStatement();
-        Collection<CommentSegment> commentSegments = new LinkedList<>();
-        commentSegments.add(new CommentSegment("/*shadow:true,foo:bar*/", 0, 
20));
-        commentSegments.add(new CommentSegment("/*aaa:bbb*/", 21, 30));
-        selectStatement.setCommentSegments(commentSegments);
+        selectStatement.getCommentSegments().add(new 
CommentSegment("/*shadow:true,foo:bar*/", 0, 20));
+        selectStatement.getCommentSegments().add(new 
CommentSegment("/*aaa:bbb*/", 21, 30));
         when(result.getSqlStatement()).thenReturn(selectStatement);
         return result;
     }
diff --git 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowUpdateStatementRoutingEngineTest.java
 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowUpdateStatementRoutingEngineTest.java
index 914a32b..f507a25 100644
--- 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowUpdateStatementRoutingEngineTest.java
+++ 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/dml/ShadowUpdateStatementRoutingEngineTest.java
@@ -73,10 +73,8 @@ public final class ShadowUpdateStatementRoutingEngineTest {
         WhereSegment whereSegment = new WhereSegment(0, 0, 
binaryOperationExpression);
         
when(result.getWhereSegments()).thenReturn(Collections.singletonList(whereSegment));
         MySQLUpdateStatement updateStatement = new MySQLUpdateStatement();
-        Collection<CommentSegment> commentSegments = new LinkedList<>();
-        commentSegments.add(new CommentSegment("/*shadow:true,foo:bar*/", 0, 
20));
-        commentSegments.add(new CommentSegment("/*aaa:bbb*/", 21, 30));
-        updateStatement.setCommentSegments(commentSegments);
+        updateStatement.getCommentSegments().add(new 
CommentSegment("/*shadow:true,foo:bar*/", 0, 20));
+        updateStatement.getCommentSegments().add(new 
CommentSegment("/*aaa:bbb*/", 21, 30));
         when(result.getSqlStatement()).thenReturn(updateStatement);
         return result;
     }
diff --git 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRoutingEngineTest.java
 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRoutingEngineTest.java
index d511a80..95d6670 100644
--- 
a/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRoutingEngineTest.java
+++ 
b/shardingsphere-features/shardingsphere-shadow/shardingsphere-shadow-core/src/test/java/org/apache/shardingsphere/shadow/route/engine/impl/ShadowNonDMLStatementRoutingEngineTest.java
@@ -54,11 +54,9 @@ public final class ShadowNonDMLStatementRoutingEngineTest {
     
     private SQLStatementContext<?> createSQLStatementContext() {
         CreateTableStatementContext result = 
mock(CreateTableStatementContext.class);
-        MySQLCreateTableStatement mySQLCreateTableStatement = new 
MySQLCreateTableStatement();
-        Collection<CommentSegment> commentSegments = new LinkedList<>();
-        commentSegments.add(new CommentSegment("/*shadow:true*/", 0, 20));
-        mySQLCreateTableStatement.setCommentSegments(commentSegments);
-        when(result.getSqlStatement()).thenReturn(mySQLCreateTableStatement);
+        MySQLCreateTableStatement createTableStatement = new 
MySQLCreateTableStatement();
+        createTableStatement.getCommentSegments().add(new 
CommentSegment("/*shadow:true*/", 0, 20));
+        when(result.getSqlStatement()).thenReturn(createTableStatement);
         return result;
     }
     
diff --git 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
index bbb406c..62f2aa4 100644
--- 
a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
+++ 
b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/standard/AbstractSQLRouteTest.java
@@ -32,10 +32,10 @@ import 
org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
 import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngine;
 import org.apache.shardingsphere.infra.route.context.RouteContext;
 import org.apache.shardingsphere.infra.route.engine.SQLRouteEngine;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import 
org.apache.shardingsphere.sharding.route.engine.fixture.AbstractRoutingEngineTest;
 import org.apache.shardingsphere.sharding.rule.ShardingRule;
 import org.apache.shardingsphere.singletable.rule.SingleTableRule;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 
 import java.sql.Types;
 import java.util.Arrays;
@@ -59,9 +59,9 @@ public abstract class AbstractSQLRouteTest extends 
AbstractRoutingEngineTest {
         ShardingRule shardingRule = createAllShardingRule();
         SingleTableRule singleTableRule = 
createAllSingleTableRule(Collections.singletonList(shardingRule));
         Map<String, ShardingSphereSchema> schemas = buildSchemas();
-        SQLParserRule sqlParserRule = createDefaultSQLParserRule();
         ConfigurationProperties props = new ConfigurationProperties(new 
Properties());
-        SQLStatementParserEngine sqlStatementParserEngine = new 
SQLStatementParserEngine("MySQL", sqlParserRule);
+        SQLStatementParserEngine sqlStatementParserEngine = new 
SQLStatementParserEngine("MySQL", 
+                new CacheOption(2000, 65535L, 4), new CacheOption(128, 1024L, 
4), false);
         ShardingSphereRuleMetaData ruleMetaData = new 
ShardingSphereRuleMetaData(Collections.emptyList(), Arrays.asList(shardingRule, 
singleTableRule));
         ShardingSphereResource resource = mock(ShardingSphereResource.class, 
RETURNS_DEEP_STUBS);
         when(resource.getDatabaseType()).thenReturn(new MySQLDatabaseType());
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
index 5a4aedf..e1e5b59 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
@@ -254,7 +254,9 @@ public final class FilterableTableScanExecutor {
     
     private LogicSQL createLogicSQL(final Map<String, ShardingSphereMetaData> 
metaDataMap, final SqlString sqlString, final DatabaseType databaseType) {
         String sql = sqlString.getSql().replace("\n", " ");
-        SQLStatement sqlStatement = new 
SQLStatementParserEngine(databaseType.getName(), 
optimizerContext.getSqlParserRule()).parse(sql, false);
+        SQLStatement sqlStatement = new 
SQLStatementParserEngine(databaseType.getName(), 
+                optimizerContext.getSqlParserRule().getSqlStatementCache(), 
optimizerContext.getSqlParserRule().getParseTreeCache(), 
+                
optimizerContext.getSqlParserRule().isSqlCommentParseEnabled()).parse(sql, 
false);
         List<Object> parameters = 
getParameters(sqlString.getDynamicParameters());
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataMap, parameters, sqlStatement, 
executorContext.getSchemaName());
         return new LogicSQL(sqlStatementContext, sql, parameters);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/pom.xml
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/pom.xml
index f0a891f..349f5bd 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/pom.xml
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/pom.xml
@@ -41,6 +41,11 @@
         
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-parser-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
             <artifactId>shardingsphere-sql-parser-sql92</artifactId>
             <version>${project.version}</version>
             <scope>test</scope>
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 2ec395e..7fbdcc3 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,6 +26,7 @@ import 
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.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;
@@ -98,7 +99,7 @@ public final class ShardingSphereOptimizerTest {
     
     private final String schemaName = "federate_jdbc";
     
-    private final SQLParserRule sqlParserRule = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build());
+    private final ParserConfiguration parserConfig = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()).toParserConfiguration();
     
     private ShardingSphereOptimizer optimizer;
     
@@ -139,8 +140,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectCrossJoinCondition() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), sqlParserRule);
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_CROSS_JOIN_CONDITION, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected = 
@@ -155,8 +155,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectWhereAllFields() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-                DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), sqlParserRule);
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_WHERE_ALL_FIELDS, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -167,8 +166,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectWhereSingleField() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), sqlParserRule);
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_WHERE_SINGLE_FIELD, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -179,8 +177,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectCrossWhere() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), sqlParserRule);
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_WHERE, 
false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -197,8 +194,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectCrossJoin() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), sqlParserRule);
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_JOIN, 
false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected = 
@@ -215,8 +211,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectJoinWhere() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), sqlParserRule);
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_CROSS_WHERE_CONDITION, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -229,8 +224,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectSubQueryFrom() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), sqlParserRule);
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_FROM, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected =
@@ -241,8 +235,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectSubQueryWhereExist() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), sqlParserRule);
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_EXIST, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected = 
@@ -257,8 +250,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectSubQueryWhereIn() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), sqlParserRule);
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_IN, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected = 
@@ -272,8 +264,7 @@ public final class ShardingSphereOptimizerTest {
     
     @Test
     public void assertSelectSubQueryWhereBetween() {
-        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), sqlParserRule);
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), parserConfig);
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_BETWEEN, false);
         String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
         String expected = 
diff --git a/shardingsphere-infra/shardingsphere-infra-parser/pom.xml 
b/shardingsphere-infra/shardingsphere-infra-parser/pom.xml
index 6a1517c..2beffc1 100644
--- a/shardingsphere-infra/shardingsphere-infra-parser/pom.xml
+++ b/shardingsphere-infra/shardingsphere-infra-parser/pom.xml
@@ -39,10 +39,5 @@
             <artifactId>shardingsphere-infra-common</artifactId>
             <version>${project.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.apache.shardingsphere</groupId>
-            <artifactId>shardingsphere-parser-core</artifactId>
-            <version>${project.version}</version>
-        </dependency>
     </dependencies>
 </project>
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/AbstractSQLStatement.java
 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/ParserConfiguration.java
similarity index 57%
copy from 
shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/AbstractSQLStatement.java
copy to 
shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/ParserConfiguration.java
index 05c4a9d..92ffd75 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/AbstractSQLStatement.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/ParserConfiguration.java
@@ -15,26 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.common.statement;
+package org.apache.shardingsphere.infra.parser;
 
 import lombok.Getter;
-import lombok.Setter;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.CommentSegment;
-import 
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ParameterMarkerSegment;
-
-import java.util.Collection;
-import java.util.LinkedList;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 
 /**
- * SQL statement abstract class.
+ * Parser configuration.
  */
+@RequiredArgsConstructor
 @Getter
-@Setter
-public abstract class AbstractSQLStatement implements SQLStatement {
+public final class ParserConfiguration {
     
-    private int parameterCount;
+    private final CacheOption sqlStatementCacheOption;
     
-    private Collection<ParameterMarkerSegment> parameterMarkerSegments = new 
LinkedList<>();
+    private final CacheOption parseTreeCacheOption;
     
-    private Collection<CommentSegment> commentSegments = new LinkedList<>();
+    private final boolean isParseComment;
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/ShardingSphereSQLParserEngine.java
 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/ShardingSphereSQLParserEngine.java
index 4625eb5..3e66f78 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/ShardingSphereSQLParserEngine.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/ShardingSphereSQLParserEngine.java
@@ -22,7 +22,6 @@ import org.antlr.v4.runtime.misc.ParseCancellationException;
 import 
org.apache.shardingsphere.distsql.parser.engine.api.DistSQLStatementParserEngine;
 import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngine;
 import 
org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngineFactory;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
 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.util.SQLUtil;
@@ -36,8 +35,9 @@ public final class ShardingSphereSQLParserEngine {
     
     private final DistSQLStatementParserEngine distSQLStatementParserEngine;
     
-    public ShardingSphereSQLParserEngine(final String databaseTypeName, final 
SQLParserRule sqlParserRule) {
-        sqlStatementParserEngine = 
SQLStatementParserEngineFactory.getSQLStatementParserEngine(databaseTypeName, 
sqlParserRule);
+    public ShardingSphereSQLParserEngine(final String databaseTypeName, final 
ParserConfiguration config) {
+        sqlStatementParserEngine = 
SQLStatementParserEngineFactory.getSQLStatementParserEngine(
+                databaseTypeName, config.getSqlStatementCacheOption(), 
config.getParseTreeCacheOption(), config.isParseComment());
         distSQLStatementParserEngine = new DistSQLStatementParserEngine();
     }
     
diff --git 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java
 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java
index c0ad1ad..d37801b 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilder.java
@@ -21,7 +21,6 @@ import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.LoadingCache;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
 import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
@@ -34,13 +33,15 @@ public final class SQLStatementCacheBuilder {
     /**
      * Build SQL statement cache.
      *
-     * @param sqlParserRule sql parser rule
+     * @param sqlStatementCacheOption SQL statement cache option
+     * @param parseTreeCacheOption parse tree cache option
+     * @param isParseComment is parse comment
      * @param databaseType database type
      * @return built SQL statement cache
      */
-    public static LoadingCache<String, SQLStatement> build(final SQLParserRule 
sqlParserRule, final String databaseType) {
-        CacheOption sqlStatementCache = sqlParserRule.getSqlStatementCache();
-        return 
CacheBuilder.newBuilder().softValues().initialCapacity(sqlStatementCache.getInitialCapacity()).maximumSize(sqlStatementCache.getMaximumSize())
-                
.concurrencyLevel(sqlStatementCache.getConcurrencyLevel()).build(new 
SQLStatementCacheLoader(databaseType, sqlParserRule));
+    public static LoadingCache<String, SQLStatement> build(final String 
databaseType, 
+                                                           final CacheOption 
sqlStatementCacheOption, final CacheOption parseTreeCacheOption, final boolean 
isParseComment) {
+        return 
CacheBuilder.newBuilder().softValues().initialCapacity(sqlStatementCacheOption.getInitialCapacity()).maximumSize(sqlStatementCacheOption.getMaximumSize())
+                
.concurrencyLevel(sqlStatementCacheOption.getConcurrencyLevel()).build(new 
SQLStatementCacheLoader(databaseType, parseTreeCacheOption, isParseComment));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java
 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java
index 5987165..a161f50 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoader.java
@@ -19,7 +19,7 @@ package org.apache.shardingsphere.infra.parser.cache;
 
 import com.google.common.cache.CacheLoader;
 import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserExecutor;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import javax.annotation.ParametersAreNonnullByDefault;
@@ -31,8 +31,8 @@ public final class SQLStatementCacheLoader extends 
CacheLoader<String, SQLStatem
     
     private final SQLStatementParserExecutor sqlStatementParserExecutor;
     
-    public SQLStatementCacheLoader(final String databaseType, final 
SQLParserRule sqlParserRule) {
-        sqlStatementParserExecutor = new 
SQLStatementParserExecutor(databaseType, sqlParserRule);
+    public SQLStatementCacheLoader(final String databaseType, final 
CacheOption parseTreeCacheOption, final boolean isParseComment) {
+        sqlStatementParserExecutor = new 
SQLStatementParserExecutor(databaseType, parseTreeCacheOption, isParseComment);
     }
     
     @ParametersAreNonnullByDefault
diff --git 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
index 33a7418..20221eb 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngine.java
@@ -19,7 +19,7 @@ package org.apache.shardingsphere.infra.parser.sql;
 
 import com.google.common.cache.LoadingCache;
 import org.apache.shardingsphere.infra.parser.cache.SQLStatementCacheBuilder;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 /**
@@ -31,9 +31,9 @@ public final class SQLStatementParserEngine {
     
     private final LoadingCache<String, SQLStatement> sqlStatementCache;
 
-    public SQLStatementParserEngine(final String databaseType, final 
SQLParserRule sqlParserRule) {
-        sqlStatementParserExecutor = new 
SQLStatementParserExecutor(databaseType, sqlParserRule);
-        sqlStatementCache = SQLStatementCacheBuilder.build(sqlParserRule, 
databaseType);
+    public SQLStatementParserEngine(final String databaseType, final 
CacheOption sqlStatementCacheOption, final CacheOption parseTreeCacheOption, 
final boolean isParseComment) {
+        sqlStatementParserExecutor = new 
SQLStatementParserExecutor(databaseType, parseTreeCacheOption, isParseComment);
+        sqlStatementCache = SQLStatementCacheBuilder.build(databaseType, 
sqlStatementCacheOption, parseTreeCacheOption, isParseComment);
     }
     
     /**
diff --git 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java
 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java
index ce5278b..4b80b04 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserEngineFactory.java
@@ -19,7 +19,7 @@ package org.apache.shardingsphere.infra.parser.sql;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -36,13 +36,16 @@ public final class SQLStatementParserEngineFactory {
      * Get SQL statement parser engine.
      *
      * @param databaseType name of database type
-     * @param sqlParserRule  sql parser rule
+     * @param sqlStatementCacheOption SQL statement cache option
+     * @param parseTreeCacheOption parse tree cache option
+     * @param isParseComment is parse comment
      * @return SQL statement parser engine
      */
-    public static SQLStatementParserEngine getSQLStatementParserEngine(final 
String databaseType, final SQLParserRule sqlParserRule) {
+    public static SQLStatementParserEngine getSQLStatementParserEngine(final 
String databaseType, 
+                                                                       final 
CacheOption sqlStatementCacheOption, final CacheOption parseTreeCacheOption, 
final boolean isParseComment) {
         SQLStatementParserEngine result = ENGINES.get(databaseType);
         if (null == result) {
-            result = ENGINES.computeIfAbsent(databaseType, key -> new 
SQLStatementParserEngine(key, sqlParserRule));
+            result = ENGINES.computeIfAbsent(databaseType, key -> new 
SQLStatementParserEngine(key, sqlStatementCacheOption, parseTreeCacheOption, 
isParseComment));
         }
         return result;
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java
index 3fae837..89a5ac2 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-parser/src/main/java/org/apache/shardingsphere/infra/parser/sql/SQLStatementParserExecutor.java
@@ -17,7 +17,7 @@
 
 package org.apache.shardingsphere.infra.parser.sql;
 
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import org.apache.shardingsphere.sql.parser.api.SQLParserEngine;
 import org.apache.shardingsphere.sql.parser.api.SQLVisitorEngine;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -33,9 +33,9 @@ public final class SQLStatementParserExecutor {
     
     private final SQLVisitorEngine visitorEngine;
     
-    public SQLStatementParserExecutor(final String databaseType, final 
SQLParserRule sqlParserRule) {
-        parserEngine = new SQLParserEngine(databaseType, 
sqlParserRule.getParseTreeCache());
-        visitorEngine = new SQLVisitorEngine(databaseType, "STATEMENT", 
sqlParserRule.isSqlCommentParseEnabled(), new Properties());
+    public SQLStatementParserExecutor(final String databaseType, final 
CacheOption parseTreeCacheOption, final boolean isParseComment) {
+        parserEngine = new SQLParserEngine(databaseType, parseTreeCacheOption);
+        visitorEngine = new SQLVisitorEngine(databaseType, "STATEMENT", 
isParseComment, new Properties());
     }
     
     /**
diff --git 
a/shardingsphere-infra/shardingsphere-infra-parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java
index 897d663..3ec9fc1 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheBuilderTest.java
@@ -18,8 +18,7 @@
 package org.apache.shardingsphere.infra.parser.cache;
 
 import com.google.common.cache.LoadingCache;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
-import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.isA;
@@ -29,7 +28,6 @@ public final class SQLStatementCacheBuilderTest {
     
     @Test
     public void assertBuild() {
-        SQLParserRule sqlParserRule = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build());
-        assertThat(SQLStatementCacheBuilder.build(sqlParserRule, "MySQL"), 
isA(LoadingCache.class));
+        assertThat(SQLStatementCacheBuilder.build("MySQL", new 
CacheOption(2000, 65535L, 4), new CacheOption(128, 1024L, 4), false), 
isA(LoadingCache.class));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoaderTest.java
 
b/shardingsphere-infra/shardingsphere-infra-parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoaderTest.java
index 898da99..05a9e48 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoaderTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-parser/src/test/java/org/apache/shardingsphere/infra/parser/cache/SQLStatementCacheLoaderTest.java
@@ -19,8 +19,7 @@ package org.apache.shardingsphere.infra.parser.cache;
 
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserExecutor;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
-import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.junit.Test;
 
@@ -38,8 +37,7 @@ public final class SQLStatementCacheLoaderTest {
     @SneakyThrows
     @Test
     public void assertSQLStatementCacheLoad() {
-        SQLParserRule parserRule = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build());
-        SQLStatementCacheLoader sqlStatementCacheLoader = new 
SQLStatementCacheLoader("MySQL", parserRule);
+        SQLStatementCacheLoader sqlStatementCacheLoader = new 
SQLStatementCacheLoader("MySQL", new CacheOption(128, 1024L, 4), false);
         Field sqlStatementParserExecutorField = 
sqlStatementCacheLoader.getClass().getDeclaredField("sqlStatementParserExecutor");
         SQLStatementParserExecutor executor = 
mock(SQLStatementParserExecutor.class, RETURNS_DEEP_STUBS);
         sqlStatementParserExecutorField.setAccessible(true);
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 39414d0..16a1e75 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
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.driver.jdbc.core.statement;
 
+import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -173,8 +174,9 @@ public final class ShardingSpherePreparedStatement extends 
AbstractPreparedState
         statements = new ArrayList<>();
         parameterSets = new ArrayList<>();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
+        Preconditions.checkState(sqlParserRule.isPresent());
         ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-                
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(connection.getSchema()).getResource().getDatabaseType()),
 sqlParserRule.get());
+                
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(connection.getSchema()).getResource().getDatabaseType()),
 sqlParserRule.get().toParserConfiguration());
         sqlStatement = sqlParserEngine.parse(sql, true);
         sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaDataMap(), 
sqlStatement, connection.getSchema());
         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 e3092b6..f92e324 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
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.driver.jdbc.core.statement;
 
+import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -454,16 +455,18 @@ public final class ShardingSphereStatement extends 
AbstractStatementAdapter {
     }
     
     private LogicSQL createLogicSQL(final String sql) {
+        SQLParserRule sqlParserRule = findSQLParserRule();
         ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
-                
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(connection.getSchema()).getResource().getDatabaseType()),
 findSQLParserRule());
+                
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(connection.getSchema()).getResource().getDatabaseType()),
 sqlParserRule.toParserConfiguration());
         SQLStatement sqlStatement = sqlParserEngine.parse(sql, false);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaDataMap(), 
sqlStatement, connection.getSchema());
         return new LogicSQL(sqlStatementContext, sql, Collections.emptyList());
     }
     
     private SQLParserRule findSQLParserRule() {
-        Optional<SQLParserRule> optionalSQLParserRule = 
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
-        return optionalSQLParserRule.orElse(null);
+        Optional<SQLParserRule> result = 
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
+        Preconditions.checkState(result.isPresent());
+        return result.get();
     }
     
     private ExecutionContext createExecutionContext(final LogicSQL logicSQL) 
throws SQLException {
diff --git 
a/shardingsphere-kernel/shardingsphere-parser/shardingsphere-parser-core/pom.xml
 
b/shardingsphere-kernel/shardingsphere-parser/shardingsphere-parser-core/pom.xml
index b419af1..fc6b704 100644
--- 
a/shardingsphere-kernel/shardingsphere-parser/shardingsphere-parser-core/pom.xml
+++ 
b/shardingsphere-kernel/shardingsphere-parser/shardingsphere-parser-core/pom.xml
@@ -27,13 +27,17 @@
     </parent>
     <artifactId>shardingsphere-parser-core</artifactId>
     <name>${project.artifactId}</name>
-
+    
     <dependencies>
         <dependency>
             <groupId>org.apache.shardingsphere</groupId>
             <artifactId>shardingsphere-parser-api</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>shardingsphere-infra-parser</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
-
-</project>
\ No newline at end of file
+</project>
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 5300332..6eeb973 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
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.parser.rule;
 
 import lombok.Getter;
+import org.apache.shardingsphere.infra.parser.ParserConfiguration;
 import org.apache.shardingsphere.infra.rule.identifier.scope.GlobalRule;
 import org.apache.shardingsphere.parser.config.SQLParserRuleConfiguration;
 import org.apache.shardingsphere.sql.parser.api.CacheOption;
@@ -40,6 +41,15 @@ public final class SQLParserRule implements GlobalRule {
         parseTreeCache = ruleConfig.getParseTreeCache();
     }
     
+    /**
+     * Convert to parser configuration.
+     * 
+     * @return parser configuration
+     */
+    public ParserConfiguration toParserConfiguration() {
+        return new ParserConfiguration(sqlStatementCache, parseTreeCache, 
sqlCommentParseEnabled);
+    }
+    
     @Override
     public String getType() {
         return SQLParserRule.class.getSimpleName();
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 4b425ff..aea7107 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
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text;
 
+import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
@@ -87,7 +88,8 @@ public final class TextProtocolBackendHandlerFactory {
         }
         SQLStatement sqlStatement = sqlStatementSupplier.get().orElseGet(() -> 
{
             Optional<SQLParserRule> sqlParserRule = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
-            return new 
ShardingSphereSQLParserEngine(getBackendDatabaseType(databaseType, 
connectionSession).getName(), sqlParserRule.orElse(null)).parse(sql, false);
+            Preconditions.checkState(sqlParserRule.isPresent());
+            return new 
ShardingSphereSQLParserEngine(getBackendDatabaseType(databaseType, 
connectionSession).getName(), 
sqlParserRule.get().toParserConfiguration()).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 bdca492..ba816a0 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
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.ral.advanced;
 
+import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.gson.Gson;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.advanced.ParseStatement;
@@ -64,9 +65,11 @@ public final class ParseDistSQLBackendHandler extends 
QueryableRALBackendHandler
     @Override
     protected Collection<List<Object>> getRows(final ContextManager 
contextManager) {
         Optional<SQLParserRule> sqlParserRule = 
contextManager.getMetaDataContexts().getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
+        Preconditions.checkState(sqlParserRule.isPresent());
         SQLStatement parsedSqlStatement;
         try {
-            parsedSqlStatement = new 
ShardingSphereSQLParserEngine(getBackendDatabaseType(databaseType, 
connectionSession).getName(), 
sqlParserRule.orElse(null)).parse(sqlStatement.getSql(), false);
+            parsedSqlStatement = new ShardingSphereSQLParserEngine(
+                    getBackendDatabaseType(databaseType, 
connectionSession).getName(), 
sqlParserRule.get().toParserConfiguration()).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 0b9a1da..87d8c2a 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
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.ral.advanced;
 
+import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import 
org.apache.shardingsphere.distsql.parser.statement.ral.advanced.PreviewStatement;
 import org.apache.shardingsphere.infra.binder.LogicSQL;
@@ -101,7 +102,8 @@ public final class PreviewDistSQLBackendHandler extends 
QueryableRALBackendHandl
         String schemaName = getSchemaName();
         String databaseType = 
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType());
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
-        SQLStatement previewedStatement = new 
ShardingSphereSQLParserEngine(databaseType, 
sqlParserRule.get()).parse(sqlStatement.getSql(), false);
+        Preconditions.checkState(sqlParserRule.isPresent());
+        SQLStatement previewedStatement = new 
ShardingSphereSQLParserEngine(databaseType, 
sqlParserRule.get().toParserConfiguration()).parse(sqlStatement.getSql(), 
false);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaDataMap(), 
previewedStatement, schemaName);
         // TODO optimize SQLStatementSchemaHolder
         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 1f042cc..37e9953 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
@@ -30,6 +30,7 @@ import 
org.apache.shardingsphere.infra.metadata.resource.DataSourcesMetaData;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.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;
@@ -77,7 +78,7 @@ public final class SelectInformationExecutorTest {
     
     private static final ResultSet RESULT_SET = 
mock(HikariProxyResultSet.class);
 
-    private final SQLParserRule sqlParserRule = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build());
+    private final ParserConfiguration parserConfig = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()).toParserConfiguration();
     
     @Mock
     private ConnectionSession connectionSession;
@@ -142,7 +143,7 @@ public final class SelectInformationExecutorTest {
     @Test
     public void assertSelectSchemataExecute() throws SQLException {
         final String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, 
DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA";
-        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("MySQL", sqlParserRule).parse(sql, false);
+        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false);
         Map<String, String> mockResultSetMap = new HashMap<>();
         mockResultSetMap.put("SCHEMA_NAME", "demo_ds_0");
         mockResultSetMap.put("DEFAULT_CHARACTER_SET_NAME", 
"utf8mb4_0900_ai_ci");
@@ -173,7 +174,7 @@ public final class SelectInformationExecutorTest {
     @Test
     public void assertSelectSchemataInSchemaWithoutDataSourceExecute() throws 
SQLException {
         final String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, 
DEFAULT_COLLATION_NAME, DEFAULT_ENCRYPTION FROM information_schema.SCHEMATA";
-        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("MySQL", sqlParserRule).parse(sql, false);
+        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false);
         Map<String, String> mockResultSetMap = new HashMap<>();
         mockResultSetMap.put("SCHEMA_NAME", "demo_ds_0");
         mockResultSetMap.put("DEFAULT_CHARACTER_SET_NAME", 
"utf8mb4_0900_ai_ci");
@@ -196,7 +197,7 @@ public final class SelectInformationExecutorTest {
     @Test
     public void assertSelectSchemataInNoSchemaExecute() throws SQLException {
         final String sql = "SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, 
DEFAULT_COLLATION_NAME, DEFAULT_ENCRYPTION FROM information_schema.SCHEMATA";
-        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("MySQL", sqlParserRule).parse(sql, false);
+        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("MySQL", parserConfig).parse(sql, false);
         SelectInformationSchemataExecutor selectSchemataExecutor = new 
SelectInformationSchemataExecutor((SelectStatement) sqlStatement, sql);
         selectSchemataExecutor.execute(connectionSession);
         
assertThat(selectSchemataExecutor.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 c0be3bb..2648cdd 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
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.infra.metadata.resource.CachedDatabaseMetaData;
 import org.apache.shardingsphere.infra.metadata.resource.DataSourcesMetaData;
 import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.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;
@@ -67,7 +68,7 @@ public final class SelectDatabaseExecutorTest {
     
     private static final ResultSet RESULT_SET = 
mock(HikariProxyResultSet.class);
 
-    private final SQLParserRule sqlParserRule = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build());
+    private final ParserConfiguration parserConfig = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()).toParserConfiguration();
     
     @Before
     public void setUp() throws IllegalAccessException, NoSuchFieldException, 
SQLException {
@@ -128,7 +129,7 @@ public final class SelectDatabaseExecutorTest {
         final 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;";
-        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("PostgreSQL", sqlParserRule).parse(sql, false);
+        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("PostgreSQL", parserConfig).parse(sql, false);
         Map<String, String> mockResultSetMap = new HashMap<>();
         mockResultSetMap.put("databasename", "demo_ds_0");
         mockResultSetMap.put("databaseowner", "postgres");
@@ -162,7 +163,7 @@ public final class SelectDatabaseExecutorTest {
         final 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;";
-        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("PostgreSQL", sqlParserRule).parse(sql, false);
+        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("PostgreSQL", parserConfig).parse(sql, false);
         Map<String, String> mockResultSetMap = new HashMap<>();
         mockResultSetMap.put("databasename", "demo_ds_0");
         mockResultSetMap.put("databaseowner", "postgres");
@@ -181,7 +182,7 @@ public final class SelectDatabaseExecutorTest {
     @Test
     public void 
assertSelectSchemataWithoutDataSourceExecuteAndWithColumnProjectionSegment() 
throws SQLException {
         final 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;";
-        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("PostgreSQL", sqlParserRule).parse(sql, false);
+        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("PostgreSQL", parserConfig).parse(sql, false);
         Map<String, String> mockResultSetMap = new HashMap<>();
         mockResultSetMap.put("databasename", "demo_ds_0");
         mockResultSetMap.put("databaseowner", "postgres");
@@ -203,7 +204,7 @@ public final class SelectDatabaseExecutorTest {
     @Test
     public void assertSelectSchemataInNoSchemaExecute() throws SQLException {
         final 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;";
-        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("PostgreSQL", sqlParserRule).parse(sql, false);
+        final SQLStatement sqlStatement = new 
ShardingSphereSQLParserEngine("PostgreSQL", parserConfig).parse(sql, false);
         SelectDatabaseExecutor selectSchemataExecutor = new 
SelectDatabaseExecutor((SelectStatement) sqlStatement, sql);
         selectSchemataExecutor.execute(mock(ConnectionSession.class));
         
assertThat(selectSchemataExecutor.getQueryResultMetaData().getColumnCount(), 
is(0));
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
index 8d27c93..5a50e53 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/data/impl/SchemaAssignedDatabaseBackendHandlerTest.java
@@ -87,7 +87,7 @@ public final class SchemaAssignedDatabaseBackendHandlerTest {
         contextManagerField.set(ProxyContext.getInstance(), contextManager);
         
when(connectionSession.getSchemaName()).thenReturn(String.format(SCHEMA_PATTERN,
 0));
         mockDatabaseCommunicationEngine(new 
UpdateResponseHeader(mock(SQLStatement.class)));
-        SQLStatementContext sqlStatementContext = 
mock(SQLStatementContext.class);
+        SQLStatementContext<?> sqlStatementContext = 
mock(SQLStatementContext.class);
         when(sqlStatementContext.getDatabaseType()).thenReturn(new 
MySQLDatabaseType());
         schemaAssignedDatabaseBackendHandler = new 
SchemaAssignedDatabaseBackendHandler(sqlStatementContext, EXECUTE_SQL, 
connectionSession);
         setBackendHandlerFactory(schemaAssignedDatabaseBackendHandler);
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 ddfcabd..2f5e854 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
@@ -68,7 +68,7 @@ public final class ParseDistSQLBackendHandlerTest {
                 .init(new 
HandlerParameter<ParseStatement>().setStatement(parseStatement).setConnectionSession(mock(ConnectionSession.class)).setDatabaseType(new
 MySQLDatabaseType()));
         parseDistSQLBackendHandler.execute();
         parseDistSQLBackendHandler.next();
-        SQLStatement statement = new ShardingSphereSQLParserEngine("MySQL", 
sqlParserRule).parse(sql, false);
+        SQLStatement statement = new ShardingSphereSQLParserEngine("MySQL", 
sqlParserRule.toParserConfiguration()).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 1e2fb32..e8ab3ec 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
@@ -17,6 +17,7 @@
 
 package 
org.apache.shardingsphere.proxy.frontend.mysql.command.query.binary.execute;
 
+import com.google.common.base.Preconditions;
 import lombok.Getter;
 import org.apache.shardingsphere.db.protocol.binary.BinaryCell;
 import org.apache.shardingsphere.db.protocol.binary.BinaryRow;
@@ -82,8 +83,9 @@ public final class MySQLComStmtExecuteExecutor implements 
QueryCommandExecutor {
         String schemaName = connectionSession.getSchemaName();
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
+        Preconditions.checkState(sqlParserRule.isPresent());
         ShardingSphereSQLParserEngine sqlStatementParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(
-                
metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType()), 
sqlParserRule.orElse(null));
+                
metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType()), 
sqlParserRule.get().toParserConfiguration());
         SQLStatement sqlStatement = 
sqlStatementParserEngine.parse(packet.getSql(), true);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaDataMap(), 
packet.getParameters(),
                 sqlStatement, connectionSession.getDefaultSchemaName());
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 eb4c9a3..5d4dc55 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
@@ -17,6 +17,7 @@
 
 package 
org.apache.shardingsphere.proxy.frontend.mysql.command.query.binary.prepare;
 
+import com.google.common.base.Preconditions;
 import 
org.apache.shardingsphere.db.protocol.mysql.constant.MySQLBinaryColumnType;
 import org.apache.shardingsphere.db.protocol.mysql.constant.MySQLConstants;
 import 
org.apache.shardingsphere.db.protocol.mysql.packet.command.query.MySQLColumnDefinition41Packet;
@@ -42,6 +43,7 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.dml.SelectState
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.Map;
+import java.util.Optional;
 
 /**
  * COM_STMT_PREPARE command executor for MySQL.
@@ -65,9 +67,10 @@ public final class MySQLComStmtPrepareExecutor implements 
CommandExecutor {
     @Override
     public Collection<DatabasePacket<?>> execute() {
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
+        Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
+        Preconditions.checkState(sqlParserRule.isPresent());
         ShardingSphereSQLParserEngine sqlStatementParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(
-                
metaDataContexts.getMetaData(connectionSession.getSchemaName()).getResource().getDatabaseType()),
-                
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class).orElse(null));
+                
metaDataContexts.getMetaData(connectionSession.getSchemaName()).getResource().getDatabaseType()),
 sqlParserRule.get().toParserConfiguration());
         SQLStatement sqlStatement = 
sqlStatementParserEngine.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 1e52875..90540db 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
@@ -17,6 +17,7 @@
 
 package 
org.apache.shardingsphere.proxy.frontend.mysql.command.query.text.fieldlist;
 
+import com.google.common.base.Preconditions;
 import 
org.apache.shardingsphere.db.protocol.mysql.constant.MySQLBinaryColumnType;
 import org.apache.shardingsphere.db.protocol.mysql.constant.MySQLConstants;
 import 
org.apache.shardingsphere.db.protocol.mysql.packet.command.query.MySQLColumnDefinition41Packet;
@@ -65,8 +66,9 @@ public final class MySQLComFieldListPacketExecutor implements 
CommandExecutor {
         String sql = String.format(SQL, packet.getTable(), schemaName);
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
+        Preconditions.checkState(sqlParserRule.isPresent());
         ShardingSphereSQLParserEngine sqlStatementParserEngine = new 
ShardingSphereSQLParserEngine(
-                
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType()),
 sqlParserRule.orElse(null));
+                
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType()),
 sqlParserRule.get().toParserConfiguration());
         SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaDataMap(), 
sqlStatement, schemaName);
         JDBCBackendConnection backendConnection = (JDBCBackendConnection) 
connectionSession.getBackendConnection();
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
index 961585e..9f1caa5 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-opengauss/src/test/java/org/apache/shardingsphere/proxy/frontend/opengauss/command/query/extended/bind/OpenGaussComBatchBindExecutorTest.java
@@ -26,14 +26,14 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
+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.parser.rule.SQLParserRule;
-import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.JDBCBackendConnection;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.JDBCBackendStatement;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.junit.After;
 import org.junit.Before;
@@ -59,7 +59,8 @@ import static org.mockito.Mockito.when;
 
 public final class OpenGaussComBatchBindExecutorTest {
     
-    private static final ShardingSphereSQLParserEngine SQL_PARSER_ENGINE = new 
ShardingSphereSQLParserEngine("openGauss", new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()));
+    private static final ShardingSphereSQLParserEngine SQL_PARSER_ENGINE = new 
ShardingSphereSQLParserEngine("openGauss", 
+            new ParserConfiguration(new CacheOption(2000, 65535L, 4), new 
CacheOption(128, 1024L, 4), false));
     
     private ContextManager contextManagerBefore;
     
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 2386db8..e37bba6 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
@@ -17,6 +17,7 @@
 
 package 
org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.parse;
 
+import com.google.common.base.Preconditions;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.db.protocol.packet.DatabasePacket;
 import 
org.apache.shardingsphere.db.protocol.postgresql.packet.command.query.extended.PostgreSQLColumnType;
@@ -42,6 +43,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * PostgreSQL command parse executor.
@@ -69,8 +71,10 @@ public final class PostgreSQLComParseExecutor implements 
CommandExecutor {
     
     private ShardingSphereSQLParserEngine 
createShardingSphereSQLParserEngine(final String schemaName) {
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
-        return new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType()),
-                
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class).orElse(null));
+        Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
+        Preconditions.checkState(sqlParserRule.isPresent());
+        return new ShardingSphereSQLParserEngine(
+                
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType()),
 sqlParserRule.get().toParserConfiguration());
     }
     
     private String convertSQLToJDBCStyle(final SQLStatement sqlStatement, 
final String sql) {
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
index 4ddfdee..11b84f8 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/PostgreSQLAggregatedBatchedStatementsCommandExecutorTest.java
@@ -31,14 +31,14 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.executor.sql.context.ExecutionUnit;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
 import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.jdbc.StatementOption;
+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.parser.rule.SQLParserRule;
-import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.JDBCBackendConnection;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.statement.JDBCBackendStatement;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -62,7 +62,8 @@ import static org.mockito.Mockito.when;
 
 public final class PostgreSQLAggregatedBatchedStatementsCommandExecutorTest {
     
-    private static final ShardingSphereSQLParserEngine SQL_PARSER_ENGINE = new 
ShardingSphereSQLParserEngine("PostgreSQL", new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()));
+    private static final ShardingSphereSQLParserEngine SQL_PARSER_ENGINE = new 
ShardingSphereSQLParserEngine("PostgreSQL", 
+            new ParserConfiguration(new CacheOption(2000, 65535L, 4), new 
CacheOption(128, 1024L, 4), false));
     
     private static final int CONNECTION_ID = 1;
     
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
index 308d96d..43e49d6 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-frontend/shardingsphere-proxy-frontend-postgresql/src/test/java/org/apache/shardingsphere/proxy/frontend/postgresql/command/query/extended/describe/PostgreSQLComDescribeExecutorTest.java
@@ -31,15 +31,15 @@ import 
org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.ConnectionMode;
 import org.apache.shardingsphere.infra.metadata.schema.model.ColumnMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
+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.parser.rule.SQLParserRule;
-import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.JDBCBackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import 
org.apache.shardingsphere.proxy.frontend.postgresql.command.PostgreSQLConnectionContext;
 import 
org.apache.shardingsphere.proxy.frontend.postgresql.command.query.extended.Portal;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.junit.After;
 import org.junit.Before;
@@ -82,7 +82,8 @@ public final class PostgreSQLComDescribeExecutorTest {
     
     private static final String TABLE_NAME = "t_order";
     
-    private static final ShardingSphereSQLParserEngine SQL_PARSER_ENGINE = new 
ShardingSphereSQLParserEngine("PostgreSQL", new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build()));
+    private static final ShardingSphereSQLParserEngine SQL_PARSER_ENGINE = new 
ShardingSphereSQLParserEngine("PostgreSQL", 
+            new ParserConfiguration(new CacheOption(2000, 65535L, 4), new 
CacheOption(128, 1024L, 4), false));
     
     private ContextManager contextManagerBefore;
     
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 3236aff..d8d392a 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
@@ -17,6 +17,7 @@
 
 package 
org.apache.shardingsphere.proxy.frontend.reactive.mysql.command.query.binary.execute;
 
+import com.google.common.base.Preconditions;
 import io.vertx.core.Future;
 import lombok.Getter;
 import org.apache.shardingsphere.db.protocol.binary.BinaryCell;
@@ -83,8 +84,9 @@ public final class ReactiveMySQLComStmtExecuteExecutor 
implements ReactiveComman
         String schemaName = connectionSession.getSchemaName();
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
-        ShardingSphereSQLParserEngine sqlStatementParserEngine = new 
ShardingSphereSQLParserEngine(DatabaseTypeRegistry.getTrunkDatabaseTypeName(
-                
metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType()), 
sqlParserRule.orElse(null));
+        Preconditions.checkState(sqlParserRule.isPresent());
+        ShardingSphereSQLParserEngine sqlStatementParserEngine = new 
ShardingSphereSQLParserEngine(
+                
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType()),
 sqlParserRule.get().toParserConfiguration());
         SQLStatement sqlStatement = 
sqlStatementParserEngine.parse(packet.getSql(), true);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaDataMap(), 
packet.getParameters(),
                 sqlStatement, connectionSession.getDefaultSchemaName());
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 db17d16..605f60f 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
@@ -17,6 +17,7 @@
 
 package 
org.apache.shardingsphere.proxy.frontend.reactive.mysql.command.query.text.fieldlist;
 
+import com.google.common.base.Preconditions;
 import io.vertx.core.Future;
 import 
org.apache.shardingsphere.db.protocol.mysql.constant.MySQLBinaryColumnType;
 import org.apache.shardingsphere.db.protocol.mysql.constant.MySQLConstants;
@@ -65,8 +66,9 @@ public final class ReactiveMySQLComFieldListPacketExecutor 
implements ReactiveCo
         String sql = String.format(SQL, packet.getTable(), schemaName);
         MetaDataContexts metaDataContexts = 
ProxyContext.getInstance().getContextManager().getMetaDataContexts();
         Optional<SQLParserRule> sqlParserRule = 
metaDataContexts.getGlobalRuleMetaData().findSingleRule(SQLParserRule.class);
+        Preconditions.checkState(sqlParserRule.isPresent());
         ShardingSphereSQLParserEngine sqlStatementParserEngine = new 
ShardingSphereSQLParserEngine(
-                
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType()),
 sqlParserRule.orElse(null));
+                
DatabaseTypeRegistry.getTrunkDatabaseTypeName(metaDataContexts.getMetaData(schemaName).getResource().getDatabaseType()),
 sqlParserRule.get().toParserConfiguration());
         SQLStatement sqlStatement = sqlStatementParserEngine.parse(sql, false);
         SQLStatementContext<?> sqlStatementContext = 
SQLStatementContextFactory.newInstance(metaDataContexts.getMetaDataMap(), 
sqlStatement, schemaName);
         databaseCommunicationEngine = 
DatabaseCommunicationEngineFactory.getInstance().newTextProtocolInstance(sqlStatementContext,
 sql, connectionSession.getBackendConnection());
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFactory.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFactory.java
index 4939e72..bd37652 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFactory.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorFactory.java
@@ -53,17 +53,17 @@ public final class SQLVisitorFactory {
     private static <T> ParseTreeVisitor<T> createParseTreeVisitor(final 
SQLVisitorFacade visitorFacade, final SQLStatementType type, final Properties 
props) {
         switch (type) {
             case DML:
-                return (ParseTreeVisitor) 
visitorFacade.getDMLVisitorClass().getConstructor(Properties.class).newInstance(props);
+                return (ParseTreeVisitor<T>) 
visitorFacade.getDMLVisitorClass().getConstructor(Properties.class).newInstance(props);
             case DDL:
-                return (ParseTreeVisitor) 
visitorFacade.getDDLVisitorClass().getConstructor(Properties.class).newInstance(props);
+                return (ParseTreeVisitor<T>) 
visitorFacade.getDDLVisitorClass().getConstructor(Properties.class).newInstance(props);
             case TCL:
-                return (ParseTreeVisitor) 
visitorFacade.getTCLVisitorClass().getConstructor(Properties.class).newInstance(props);
+                return (ParseTreeVisitor<T>) 
visitorFacade.getTCLVisitorClass().getConstructor(Properties.class).newInstance(props);
             case DCL:
-                return (ParseTreeVisitor) 
visitorFacade.getDCLVisitorClass().getConstructor(Properties.class).newInstance(props);
+                return (ParseTreeVisitor<T>) 
visitorFacade.getDCLVisitorClass().getConstructor(Properties.class).newInstance(props);
             case DAL:
-                return (ParseTreeVisitor) 
visitorFacade.getDALVisitorClass().getConstructor(Properties.class).newInstance(props);
+                return (ParseTreeVisitor<T>) 
visitorFacade.getDALVisitorClass().getConstructor(Properties.class).newInstance(props);
             case RL:
-                return (ParseTreeVisitor) 
visitorFacade.getRLVisitorClass().getConstructor(Properties.class).newInstance(props);
+                return (ParseTreeVisitor<T>) 
visitorFacade.getRLVisitorClass().getConstructor(Properties.class).newInstance(props);
             default:
                 throw new SQLParsingException("Can not support SQL statement 
type: `%s`", type);
         }
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorRule.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorRule.java
index 5f11a6d..f3c107f 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorRule.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/database/visitor/SQLVisitorRule.java
@@ -77,9 +77,9 @@ public enum SQLVisitorRule {
     CREATE_PROCEDURE("CreateProcedure", SQLStatementType.DDL),
     
     ALTER_PROCEDURE("AlterProcedure", SQLStatementType.DDL),
-
+    
     ALTER_STATEMENT("AlterStatement", SQLStatementType.DDL),
-
+    
     DROP_PROCEDURE("DropProcedure", SQLStatementType.DDL),
     
     CREATE_FUNCTION("CreateFunction", SQLStatementType.DDL),
@@ -89,7 +89,7 @@ public enum SQLVisitorRule {
     DROP_FUNCTION("DropFunction", SQLStatementType.DDL),
     
     CREATE_DATABASE("CreateDatabase", SQLStatementType.DDL),
-
+    
     CREATE_DATABASE_LINK("CreateDatabaseLink", SQLStatementType.DDL),
     
     ALTER_DATABASE("AlterDatabase", SQLStatementType.DDL),
@@ -99,9 +99,9 @@ public enum SQLVisitorRule {
     DROP_DATABASE_LINK("DropDatabaseLink", SQLStatementType.DDL),
     
     CREATE_DIMENSION("CreateDimension", SQLStatementType.DDL),
-
+    
     ALTER_DIMENSION("AlterDimension", SQLStatementType.DDL),
-
+    
     DROP_DIMENSION("DropDimension", SQLStatementType.DDL),
     
     CREATE_EVENT("CreateEvent", SQLStatementType.DDL),
@@ -129,7 +129,7 @@ public enum SQLVisitorRule {
     DROP_SERVER("DropServer", SQLStatementType.DDL),
     
     CREATE_TRIGGER("CreateTrigger", SQLStatementType.DDL),
-
+    
     ALTER_TRIGGER("AlterTrigger", SQLStatementType.DDL),
     
     DROP_TRIGGER("DropTrigger", SQLStatementType.DDL),
@@ -139,13 +139,13 @@ public enum SQLVisitorRule {
     ALTER_VIEW("AlterView", SQLStatementType.DDL),
     
     DROP_VIEW("DropView", SQLStatementType.DDL),
-
+    
     ANALYZE("Analyze", SQLStatementType.DDL),
-
+    
     CREATE_SEQUENCE("CreateSequence", SQLStatementType.DDL),
-
+    
     ALTER_SEQUENCE("AlterSequence", SQLStatementType.DDL),
-
+    
     DROP_SEQUENCE("DropSequence", SQLStatementType.DDL),
     
     ALTER_SYNONYM("AlterSynonym", SQLStatementType.DDL),
@@ -169,15 +169,15 @@ public enum SQLVisitorRule {
     AUDIT("Audit", SQLStatementType.DDL),
     
     NOAUDIT("NoAudit", SQLStatementType.DDL),
-
+    
     COMMENT("Comment", SQLStatementType.DDL),
-
+    
     FLASHBACK_DATABASE("FlashbackDatabase", SQLStatementType.DDL),
-
+    
     FLASHBACK_TABLE("FlashbackTable", SQLStatementType.DDL),
     
     PURGE("Purge", SQLStatementType.DDL),
-
+    
     RENAME("Rename", SQLStatementType.DDL),
     
     CREATE_EXTENSION("CreateExtension", SQLStatementType.DDL),
@@ -271,7 +271,7 @@ public enum SQLVisitorRule {
     USE("Use", SQLStatementType.DAL),
     
     DESC("Desc", SQLStatementType.DAL),
-
+    
     HELP("Help", SQLStatementType.DAL),
     
     EXPLAIN("Explain", SQLStatementType.DAL),
@@ -309,15 +309,15 @@ public enum SQLVisitorRule {
     SHOW_STATUS("ShowStatus", SQLStatementType.DAL),
     
     SHOW("Show", SQLStatementType.DAL),
-
+    
     SHOW_RELAYLOG_EVENTS("ShowRelaylogEventsStatement", SQLStatementType.DAL),
-
+    
     SHOW_PROCEDURE_CODE("ShowProcedureCodeStatement", SQLStatementType.DAL),
     
     SHOW_OPEN_TABLES("ShowOpenTables", SQLStatementType.DAL),
-
+    
     SHOW_TRIGGERS("ShowTriggers", SQLStatementType.DAL),
-
+    
     SET_VARIABLE("SetVariable", SQLStatementType.DAL),
     
     SET("Set", SQLStatementType.DAL),
@@ -341,11 +341,11 @@ public enum SQLVisitorRule {
     UNINSTALL("Uninstall", SQLStatementType.DAL),
     
     FLUSH("Flush", SQLStatementType.DAL),
-
+    
     RESTART("Restart", SQLStatementType.DAL),
     
     SHUTDOWN("Shutdown", SQLStatementType.DAL),
-
+    
     CREATE_RESOURCE_GROUP("CreateResourceGroup", SQLStatementType.DAL),
     
     SET_RESOURCE_GROUP("SetResourceGroup", SQLStatementType.DAL),
@@ -353,7 +353,7 @@ public enum SQLVisitorRule {
     BINLOG("Binlog", SQLStatementType.DAL),
     
     OPTIMIZE_TABLE("OptimizeTable", SQLStatementType.DAL),
-
+    
     CLONE("Clone", SQLStatementType.DAL),
     
     REPAIR_TABLE("RepairTable", SQLStatementType.DAL),
@@ -361,9 +361,9 @@ public enum SQLVisitorRule {
     KILL("Kill", SQLStatementType.DAL),
     
     RESET("ResetStatement", SQLStatementType.DAL),
-
+    
     RESET_PERSIST("ResetPersistStatement", SQLStatementType.DAL),
-
+    
     CACHE_INDEX("CacheIndex", SQLStatementType.DAL),
     
     LOAD_INDEX_INFO("LoadIndexInfo", SQLStatementType.DAL),
@@ -385,21 +385,21 @@ public enum SQLVisitorRule {
     START_SLAVE("StartSlave", SQLStatementType.RL),
     
     STOP_SLAVE("StopSlave", SQLStatementType.RL),
-
+    
     XA("Xa", SQLStatementType.TCL),
     
     ABORT("Abort", SQLStatementType.TCL),
-
+    
     CREATE_SCHEMA("CreateSchema", SQLStatementType.DDL),
-
+    
     ALTER_SCHEMA("AlterSchema", SQLStatementType.DDL),
-
+    
     DROP_SCHEMA("DropSchema", SQLStatementType.DDL),
-
+    
     CREATE_SERVICE("CreateService", SQLStatementType.DDL),
-
+    
     ALTER_SERVICE("AlterService", SQLStatementType.DDL),
-
+    
     DROP_SERVICE("DropService", SQLStatementType.DDL),
     
     DROP_DOMAIN("DropDomain", SQLStatementType.DDL),
@@ -431,13 +431,13 @@ public enum SQLVisitorRule {
     ALTER_TEXT_SEARCH_TEMPLATE("AlterTextSearchTemplate", 
SQLStatementType.DDL),
     
     ALTER_TEXT_SEARCH_PARSER("AlterTextSearchParser", SQLStatementType.DDL),
-
+    
     DROP_POLICY("DropPolicy", SQLStatementType.DDL),
-
+    
     DROP_OWNED("DropOwned", SQLStatementType.DDL),
     
     DROP_OPERATOR("DropOperator", SQLStatementType.DDL);
-
+    
     private final String name;
     
     @Getter
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/AbstractSQLStatement.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/AbstractSQLStatement.java
index 05c4a9d..2f34c0e 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/AbstractSQLStatement.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/statement/AbstractSQLStatement.java
@@ -29,12 +29,12 @@ import java.util.LinkedList;
  * SQL statement abstract class.
  */
 @Getter
-@Setter
 public abstract class AbstractSQLStatement implements SQLStatement {
     
+    @Setter
     private int parameterCount;
     
-    private Collection<ParameterMarkerSegment> parameterMarkerSegments = new 
LinkedList<>();
+    private final Collection<ParameterMarkerSegment> parameterMarkerSegments = 
new LinkedList<>();
     
-    private Collection<CommentSegment> commentSegments = new LinkedList<>();
+    private final Collection<CommentSegment> commentSegments = new 
LinkedList<>();
 }
diff --git 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/AbstractSQLRewriterParameterizedTest.java
 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/AbstractSQLRewriterParameterizedTest.java
index 491c3e4..8262524 100644
--- 
a/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/AbstractSQLRewriterParameterizedTest.java
+++ 
b/shardingsphere-test/shardingsphere-rewrite-test/src/test/java/org/apache/shardingsphere/sharding/rewrite/parameterized/engine/AbstractSQLRewriterParameterizedTest.java
@@ -99,7 +99,8 @@ public abstract class AbstractSQLRewriterParameterizedTest {
         Collection<ShardingSphereRule> rules = 
SchemaRulesBuilder.buildRules("schema_name", schemaConfig, new 
ConfigurationProperties(new Properties()));
         mockRules(rules);
         rules.add(sqlParserRule);
-        SQLStatementParserEngine sqlStatementParserEngine = new 
SQLStatementParserEngine(databaseType, sqlParserRule);
+        SQLStatementParserEngine sqlStatementParserEngine = new 
SQLStatementParserEngine(databaseType,
+                sqlParserRule.getSqlStatementCache(), 
sqlParserRule.getParseTreeCache(), sqlParserRule.isSqlCommentParseEnabled());
         Map<String, ShardingSphereSchema> schemas = mockSchemas();
         ShardingSphereResource resource = mock(ShardingSphereResource.class);
         when(resource.getDatabaseType()).thenReturn(new MySQLDatabaseType());

Reply via email to