You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2020/10/28 13:36:36 UTC

[shardingsphere] branch master updated: Redesign SQL parser and visitor API (#7946)

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

zhangyonglun 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 ead87d4  Redesign SQL parser and visitor API (#7946)
ead87d4 is described below

commit ead87d484543d56a7ceb70ad744a3980baa4f59e
Author: Liang Zhang <te...@163.com>
AuthorDate: Wed Oct 28 21:31:42 2020 +0800

    Redesign SQL parser and visitor API (#7946)
    
    * Refactor SQLParserFactory
    
    * Refactor SQLParserFactory
    
    * Refactor SQLParserFactory
    
    * Refactor SQLParserExecutor
    
    * Move SQLParserFacadeRegistry to parser package
    
    * Merge SQLStatementVisitorFactory and SQLFormatVisitorFactory
    
    * Add generic on SQLVisitorFactory
    
    * Refactor StandardSQLStatementParserEngineFactory
    
    * Move SQLParserEngine inside core package
    
    * Add SQLVisitorEngineFactory
    
    * Add generic type for SQLVisitorEngineFactory
    
    * Revert invalid changes
---
 .../engine/executor/RDLSQLParserExecutor.java      |  2 +-
 .../parser/sql/parser/ShardingSphereParser.java    |  2 +-
 .../sql/parser/mysql/parser/MySQLParser.java       |  2 +-
 .../sql/parser/oracle/parser/OracleParser.java     |  2 +-
 .../parser/postgresql/parser/PostgreSQLParser.java |  2 +-
 .../sql/parser/sql92/parser/SQL92Parser.java       |  2 +-
 .../parser/sqlserver/parser/SQLServerParser.java   |  2 +-
 .../{engine => api/parser}/SQLParserEngine.java    | 42 +++++++++++---
 .../parser}/SQLParserEngineFactory.java            | 20 +++----
 .../visitor/SQLVisitorEngine.java}                 | 28 +++++----
 .../visitor/SQLVisitorEngineFactory.java}          | 28 ++++-----
 .../sql/parser/core/{ => parser}/ParseASTNode.java |  2 +-
 .../sql/parser/core/parser/SQLParserExecutor.java  | 66 ----------------------
 .../core/{ => parser}/SQLParserFacadeRegistry.java |  2 +-
 .../sql/parser/core/parser/SQLParserFactory.java   | 27 ++++++---
 .../core/visitor/SQLStatementVisitorFactory.java   | 65 ---------------------
 ...tVisitorFactory.java => SQLVisitorFactory.java} | 23 ++++----
 .../sql/parser/core/visitor/SQLVisitorRule.java    | 36 ++++++------
 .../standard/StandardSQLStatementParserEngine.java |  7 +--
 .../StandardSQLStatementParserEngineFactory.java   | 16 +++---
 .../SQLParserEngineFactoryTest.java                |  3 +-
 21 files changed, 148 insertions(+), 231 deletions(-)

diff --git a/shardingsphere-rdl-parser/shardingsphere-rdl-parser-engine/src/main/java/org/apache/shardingsphere/rdl/parser/engine/executor/RDLSQLParserExecutor.java b/shardingsphere-rdl-parser/shardingsphere-rdl-parser-engine/src/main/java/org/apache/shardingsphere/rdl/parser/engine/executor/RDLSQLParserExecutor.java
index 24643b5..1c44992 100644
--- a/shardingsphere-rdl-parser/shardingsphere-rdl-parser-engine/src/main/java/org/apache/shardingsphere/rdl/parser/engine/executor/RDLSQLParserExecutor.java
+++ b/shardingsphere-rdl-parser/shardingsphere-rdl-parser-engine/src/main/java/org/apache/shardingsphere/rdl/parser/engine/executor/RDLSQLParserExecutor.java
@@ -31,7 +31,7 @@ import org.antlr.v4.runtime.tree.ErrorNode;
 import org.apache.shardingsphere.rdl.parser.autogen.ShardingSphereStatementLexer;
 import org.apache.shardingsphere.rdl.parser.sql.parser.ShardingSphereParser;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
-import org.apache.shardingsphere.sql.parser.core.ParseASTNode;
+import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode;
 import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
 
 import java.nio.CharBuffer;
diff --git a/shardingsphere-rdl-parser/shardingsphere-rdl-parser-sql/src/main/java/org/apache/shardingsphere/rdl/parser/sql/parser/ShardingSphereParser.java b/shardingsphere-rdl-parser/shardingsphere-rdl-parser-sql/src/main/java/org/apache/shardingsphere/rdl/parser/sql/parser/ShardingSphereParser.java
index 4b16ca1..2c3d3b7 100644
--- a/shardingsphere-rdl-parser/shardingsphere-rdl-parser-sql/src/main/java/org/apache/shardingsphere/rdl/parser/sql/parser/ShardingSphereParser.java
+++ b/shardingsphere-rdl-parser/shardingsphere-rdl-parser-sql/src/main/java/org/apache/shardingsphere/rdl/parser/sql/parser/ShardingSphereParser.java
@@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream;
 import org.apache.shardingsphere.rdl.parser.autogen.ShardingSphereStatementParser;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
-import org.apache.shardingsphere.sql.parser.core.ParseASTNode;
+import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode;
 
 /**
  * SQL parser for RDL.
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/parser/MySQLParser.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/parser/MySQLParser.java
index b3b8f63..523e66e 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/parser/MySQLParser.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/parser/MySQLParser.java
@@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser;
-import org.apache.shardingsphere.sql.parser.core.ParseASTNode;
+import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode;
 
 /**
  * SQL parser for MySQL.
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/parser/OracleParser.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/parser/OracleParser.java
index 990f88c..35b5ecb 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/parser/OracleParser.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/parser/OracleParser.java
@@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
 import org.apache.shardingsphere.sql.parser.autogen.OracleStatementParser;
-import org.apache.shardingsphere.sql.parser.core.ParseASTNode;
+import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode;
 
 /**
  * SQL parser for Oracle.
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/parser/PostgreSQLParser.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/parser/PostgreSQLParser.java
index 10f9250..f471186 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/parser/PostgreSQLParser.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/parser/PostgreSQLParser.java
@@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
 import org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser;
-import org.apache.shardingsphere.sql.parser.core.ParseASTNode;
+import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode;
 
 /**
  * SQL parser for PostgreSQL.
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/parser/SQL92Parser.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/parser/SQL92Parser.java
index dfa421d..b8d3585 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/parser/SQL92Parser.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/parser/SQL92Parser.java
@@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
 import org.apache.shardingsphere.sql.parser.autogen.SQL92StatementParser;
-import org.apache.shardingsphere.sql.parser.core.ParseASTNode;
+import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode;
 
 /**
  * SQL parser for SQL92.
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/parser/SQLServerParser.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/parser/SQLServerParser.java
index 1b7eef1..ed80c18 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/parser/SQLServerParser.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/parser/SQLServerParser.java
@@ -21,7 +21,7 @@ import org.antlr.v4.runtime.TokenStream;
 import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
 import org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser;
-import org.apache.shardingsphere.sql.parser.core.ParseASTNode;
+import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode;
 
 /**
  * SQL parser for SQLServer.
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngine.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngine.java
similarity index 53%
rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngine.java
rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngine.java
index 567a628..9a159fc 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngine.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngine.java
@@ -15,12 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.engine;
+package org.apache.shardingsphere.sql.parser.api.parser;
 
 import lombok.RequiredArgsConstructor;
+import org.antlr.v4.runtime.BailErrorStrategy;
+import org.antlr.v4.runtime.Parser;
+import org.antlr.v4.runtime.atn.PredictionMode;
+import org.antlr.v4.runtime.misc.ParseCancellationException;
+import org.antlr.v4.runtime.tree.ErrorNode;
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.apache.shardingsphere.sql.parser.cache.SQLParsedResultCache;
-import org.apache.shardingsphere.sql.parser.core.parser.SQLParserExecutor;
+import org.apache.shardingsphere.sql.parser.core.parser.ParseASTNode;
+import org.apache.shardingsphere.sql.parser.core.parser.SQLParserFactory;
+import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
 
 import java.util.Optional;
 
@@ -30,13 +37,13 @@ import java.util.Optional;
 @RequiredArgsConstructor
 public final class SQLParserEngine {
     
-    private final String databaseTypeName;
+    private final String databaseType;
     
     private final SQLParsedResultCache<ParseTree> cache = new SQLParsedResultCache<>();
     
     /**
-     * Parse SQL.
-     * 
+     * Parse.
+     *
      * @param sql SQL to be parsed
      * @param useCache whether use cache
      * @return parse tree
@@ -49,12 +56,33 @@ public final class SQLParserEngine {
         if (parseTree.isPresent()) {
             return parseTree.get();
         }
-        ParseTree result = new SQLParserExecutor(databaseTypeName, sql).execute().getRootNode();
+        ParseTree result = parse(sql);
         cache.put(sql, result);
         return result;
     }
     
     private ParseTree parse(final String sql) {
-        return new SQLParserExecutor(databaseTypeName, sql).execute().getRootNode();
+        ParseASTNode result = twoPhaseParse(sql);
+        if (result.getRootNode() instanceof ErrorNode) {
+            throw new SQLParsingException(String.format("Unsupported SQL of `%s`", sql));
+        }
+        return result.getRootNode();
+    }
+    
+    private ParseASTNode twoPhaseParse(final String sql) {
+        SQLParser sqlParser = SQLParserFactory.newInstance(databaseType, sql);
+        try {
+            setPredictionMode((Parser) sqlParser, PredictionMode.SLL);
+            return (ParseASTNode) sqlParser.parse();
+        } catch (final ParseCancellationException ex) {
+            ((Parser) sqlParser).reset();
+            setPredictionMode((Parser) sqlParser, PredictionMode.LL);
+            return (ParseASTNode) sqlParser.parse();
+        }
+    }
+    
+    private void setPredictionMode(final Parser sqlParser, final PredictionMode mode) {
+        sqlParser.setErrorHandler(new BailErrorStrategy());
+        sqlParser.getInterpreter().setPredictionMode(mode);
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngineFactory.java
similarity index 78%
rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactory.java
rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngineFactory.java
index 1571ba9..70e2203 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactory.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/parser/SQLParserEngineFactory.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.engine;
+package org.apache.shardingsphere.sql.parser.api.parser;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
@@ -33,20 +33,20 @@ public final class SQLParserEngineFactory {
     
     /**
      * Get SQL parser engine.
-     *x
-     * @param databaseTypeName name of database type
+     *
+     * @param databaseType database type
      * @return SQL parser engine
      */
-    public static SQLParserEngine getSQLParserEngine(final String databaseTypeName) {
-        if (ENGINES.containsKey(databaseTypeName)) {
-            return ENGINES.get(databaseTypeName);
+    public static SQLParserEngine getSQLParserEngine(final String databaseType) {
+        if (ENGINES.containsKey(databaseType)) {
+            return ENGINES.get(databaseType);
         }
         synchronized (ENGINES) {
-            if (ENGINES.containsKey(databaseTypeName)) {
-                return ENGINES.get(databaseTypeName);
+            if (ENGINES.containsKey(databaseType)) {
+                return ENGINES.get(databaseType);
             }
-            SQLParserEngine result = new SQLParserEngine(databaseTypeName);
-            ENGINES.put(databaseTypeName, result);
+            SQLParserEngine result = new SQLParserEngine(databaseType);
+            ENGINES.put(databaseType, result);
             return result;
         }
     }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngine.java
similarity index 55%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java
copy to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngine.java
index 6f2772e..b488522 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngine.java
@@ -15,26 +15,34 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.core;
+package org.apache.shardingsphere.sql.parser.api.visitor;
 
 import lombok.RequiredArgsConstructor;
 import org.antlr.v4.runtime.tree.ParseTree;
-import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+import org.antlr.v4.runtime.tree.ParseTreeVisitor;
+import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorFactory;
+import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorRule;
 
 /**
- * Parse AST node.
+ * SQL visitor engnie.
+ * 
+ * @param <T> type of return value
  */
 @RequiredArgsConstructor
-public final class ParseASTNode implements ASTNode {
+public final class SQLVisitorEngine<T> {
     
-    private final ParseTree parseTree;
+    private final String databaseType;
+    
+    private final String visitorType;
     
     /**
-     * Get root node.
-     * 
-     * @return root node
+     * Visit parse tree.
+     *
+     * @param parseTree parse tree
+     * @return visit result
      */
-    public ParseTree getRootNode() {
-        return parseTree.getChild(0);
+    public T visit(final ParseTree parseTree) {
+        ParseTreeVisitor<T> visitor = SQLVisitorFactory.newInstance(databaseType, visitorType, SQLVisitorRule.valueOf(parseTree.getClass()));
+        return parseTree.accept(visitor);
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngineFactory.java
similarity index 57%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java
copy to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngineFactory.java
index 6f2772e..c30f3df 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/api/visitor/SQLVisitorEngineFactory.java
@@ -15,26 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.core;
+package org.apache.shardingsphere.sql.parser.api.visitor;
 
-import lombok.RequiredArgsConstructor;
-import org.antlr.v4.runtime.tree.ParseTree;
-import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 
 /**
- * Parse AST node.
+ * SQL visitor engine factory.
  */
-@RequiredArgsConstructor
-public final class ParseASTNode implements ASTNode {
-    
-    private final ParseTree parseTree;
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class SQLVisitorEngineFactory {
     
     /**
-     * Get root node.
-     * 
-     * @return root node
+     * Get SQL visitor engine.
+     *
+     * @param databaseType database type
+     * @param visitorType visitor type
+     * @param <T> type of visitor result
+     * @return SQL visitor engine
      */
-    public ParseTree getRootNode() {
-        return parseTree.getChild(0);
+    public static <T> SQLVisitorEngine<T> getSQLVisitorEngine(final String databaseType, final String visitorType) {
+        return new SQLVisitorEngine<>(databaseType, visitorType);
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/ParseASTNode.java
similarity index 95%
rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java
rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/ParseASTNode.java
index 6f2772e..9da8f77 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/ParseASTNode.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/ParseASTNode.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.core;
+package org.apache.shardingsphere.sql.parser.core.parser;
 
 import lombok.RequiredArgsConstructor;
 import org.antlr.v4.runtime.tree.ParseTree;
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserExecutor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserExecutor.java
deleted file mode 100644
index b64d92a..0000000
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserExecutor.java
+++ /dev/null
@@ -1,66 +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.sql.parser.core.parser;
-
-import lombok.RequiredArgsConstructor;
-import org.antlr.v4.runtime.BailErrorStrategy;
-import org.antlr.v4.runtime.Parser;
-import org.antlr.v4.runtime.atn.PredictionMode;
-import org.antlr.v4.runtime.misc.ParseCancellationException;
-import org.antlr.v4.runtime.tree.ErrorNode;
-import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
-import org.apache.shardingsphere.sql.parser.core.ParseASTNode;
-import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
-
-/**
- * SQL parser executor.
- */
-@RequiredArgsConstructor
-public final class SQLParserExecutor {
-    
-    private final String databaseTypeName;
-    
-    private final String sql;
-    
-    /**
-     * Execute to parse SQL.
-     *
-     * @return AST node
-     */
-    public ParseASTNode execute() {
-        ParseASTNode result = twoPhaseParse();
-        if (result.getRootNode() instanceof ErrorNode) {
-            throw new SQLParsingException(String.format("Unsupported SQL of `%s`", sql));
-        }
-        return result;
-    }
-    
-    private ParseASTNode twoPhaseParse() {
-        SQLParser sqlParser = SQLParserFactory.newInstance(databaseTypeName, sql);
-        try {
-            ((Parser) sqlParser).setErrorHandler(new BailErrorStrategy());
-            ((Parser) sqlParser).getInterpreter().setPredictionMode(PredictionMode.SLL);
-            return (ParseASTNode) sqlParser.parse();
-        } catch (final ParseCancellationException ex) {
-            ((Parser) sqlParser).reset();
-            ((Parser) sqlParser).setErrorHandler(new BailErrorStrategy());
-            ((Parser) sqlParser).getInterpreter().setPredictionMode(PredictionMode.LL);
-            return (ParseASTNode) sqlParser.parse();
-        }
-    }
-}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/SQLParserFacadeRegistry.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFacadeRegistry.java
similarity index 97%
rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/SQLParserFacadeRegistry.java
rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFacadeRegistry.java
index 126c356..ca957f5 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/SQLParserFacadeRegistry.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFacadeRegistry.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.core;
+package org.apache.shardingsphere.sql.parser.core.parser;
 
 import org.apache.shardingsphere.sql.parser.spi.SQLParserFacade;
 
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java
index 6a4b987..9b838e2 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/parser/SQLParserFactory.java
@@ -26,8 +26,8 @@ import org.antlr.v4.runtime.CodePointCharStream;
 import org.antlr.v4.runtime.CommonTokenStream;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.TokenStream;
+import org.apache.shardingsphere.sql.parser.api.lexer.SQLLexer;
 import org.apache.shardingsphere.sql.parser.api.parser.SQLParser;
-import org.apache.shardingsphere.sql.parser.core.SQLParserFacadeRegistry;
 import org.apache.shardingsphere.sql.parser.spi.SQLParserFacade;
 
 import java.nio.CharBuffer;
@@ -38,22 +38,31 @@ import java.nio.CharBuffer;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class SQLParserFactory {
     
-    /** 
+    /**
      * New instance of SQL parser.
      * 
-     * @param databaseTypeName name of database type
+     * @param databaseType database type
      * @param sql SQL
      * @return SQL parser
      */
-    public static SQLParser newInstance(final String databaseTypeName, final String sql) {
-        return createSQLParser(sql, SQLParserFacadeRegistry.getInstance().getSQLParserFacade(databaseTypeName));
+    public static SQLParser newInstance(final String databaseType, final String sql) {
+        SQLParserFacade sqlParserFacade = SQLParserFacadeRegistry.getInstance().getSQLParserFacade(databaseType);
+        return createSQLParser(createTokenStream(sql, sqlParserFacade.getLexerClass()), sqlParserFacade.getParserClass());
     }
     
     @SneakyThrows(ReflectiveOperationException.class)
-    private static SQLParser createSQLParser(final String sql, final SQLParserFacade config) {
+    private static SQLParser createSQLParser(final TokenStream tokenStream, final Class<? extends SQLParser> parserClass) {
+        return parserClass.getConstructor(TokenStream.class).newInstance(tokenStream);
+    }
+    
+    @SneakyThrows(ReflectiveOperationException.class)
+    private static TokenStream createTokenStream(final String sql, final Class<? extends SQLLexer> lexerClass) {
+        Lexer lexer = (Lexer) lexerClass.getConstructor(CharStream.class).newInstance(getSQLCharStream(sql));
+        return new CommonTokenStream(lexer);
+    }
+    
+    private static CharStream getSQLCharStream(final String sql) {
         CodePointBuffer buffer = CodePointBuffer.withChars(CharBuffer.wrap(sql.toCharArray()));
-        CodePointCharStream codePointCharStream = CodePointCharStream.fromBuffer(buffer);
-        Lexer lexer = (Lexer) config.getLexerClass().getConstructor(CharStream.class).newInstance(codePointCharStream);
-        return config.getParserClass().getConstructor(TokenStream.class).newInstance(new CommonTokenStream(lexer));
+        return CodePointCharStream.fromBuffer(buffer);
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLStatementVisitorFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLStatementVisitorFactory.java
deleted file mode 100644
index 5e53c58..0000000
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLStatementVisitorFactory.java
+++ /dev/null
@@ -1,65 +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.sql.parser.core.visitor;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import lombok.SneakyThrows;
-import org.antlr.v4.runtime.tree.ParseTreeVisitor;
-import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
-import org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatementType;
-
-/**
- * SQL statement visitor factory.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class SQLStatementVisitorFactory {
-    
-    /** 
-     * New instance of SQL statement visitor.
-     * 
-     * @param databaseTypeName name of database type
-     * @param sqlVisitorRule SQL visitor rule
-     * @return parse tree visitor
-     */
-    public static ParseTreeVisitor newInstance(final String databaseTypeName, final SQLVisitorRule sqlVisitorRule) {
-        SQLVisitorFacade facade = SQLVisitorFacadeRegistry.getInstance().getSQLVisitorFacade(databaseTypeName, "STATEMENT");
-        return createParseTreeVisitor(facade, sqlVisitorRule.getType());
-    }
-    
-    @SneakyThrows(ReflectiveOperationException.class)
-    private static ParseTreeVisitor createParseTreeVisitor(final SQLVisitorFacade visitorFacade, final SQLStatementType type) {
-        switch (type) {
-            case DML:
-                return (ParseTreeVisitor) visitorFacade.getDMLVisitorClass().getConstructor().newInstance();
-            case DDL:
-                return (ParseTreeVisitor) visitorFacade.getDDLVisitorClass().getConstructor().newInstance();
-            case TCL:
-                return (ParseTreeVisitor) visitorFacade.getTCLVisitorClass().getConstructor().newInstance();
-            case DCL:
-                return (ParseTreeVisitor) visitorFacade.getDCLVisitorClass().getConstructor().newInstance();
-            case DAL:
-                return (ParseTreeVisitor) visitorFacade.getDALVisitorClass().getConstructor().newInstance();
-            case RL:
-                return (ParseTreeVisitor) visitorFacade.getRLVisitorClass().getConstructor().newInstance();
-            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/visitor/SQLFormatVisitorFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorFactory.java
similarity index 77%
rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLFormatVisitorFactory.java
rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorFactory.java
index 5abcec8..8e7701f 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLFormatVisitorFactory.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorFactory.java
@@ -26,25 +26,28 @@ import org.apache.shardingsphere.sql.parser.spi.SQLVisitorFacade;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatementType;
 
 /**
- * SQL format visitor factory.
+ * SQL visitor factory.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class SQLFormatVisitorFactory {
+public final class SQLVisitorFactory {
     
-    /** 
-     * New instance of SQL format visitor.
+    /**
+     * New instance of SQL visitor.
      * 
-     * @param databaseTypeName name of database type
-     * @param sqlVisitorRule visitor rule
+     * @param databaseType database type
+     * @param visitorType SQL visitor type
+     * @param visitorRule SQL visitor rule
+     * @param <T> type of visitor result
      * @return parse tree visitor
      */
-    public static ParseTreeVisitor newInstance(final String databaseTypeName, final SQLVisitorRule sqlVisitorRule) {
-        SQLVisitorFacade facade = SQLVisitorFacadeRegistry.getInstance().getSQLVisitorFacade(databaseTypeName, "FORMAT");
-        return createParseTreeVisitor(facade, sqlVisitorRule.getType());
+    public static <T> ParseTreeVisitor<T> newInstance(final String databaseType, final String visitorType, final SQLVisitorRule visitorRule) {
+        SQLVisitorFacade facade = SQLVisitorFacadeRegistry.getInstance().getSQLVisitorFacade(databaseType, visitorType);
+        return createParseTreeVisitor(facade, visitorRule.getType());
     }
     
+    @SuppressWarnings("unchecked")
     @SneakyThrows(ReflectiveOperationException.class)
-    private static ParseTreeVisitor createParseTreeVisitor(final SQLVisitorFacade visitorFacade, final SQLStatementType type) {
+    private static <T> ParseTreeVisitor<T> createParseTreeVisitor(final SQLVisitorFacade visitorFacade, final SQLStatementType type) {
         switch (type) {
             case DML:
                 return (ParseTreeVisitor) visitorFacade.getDMLVisitorClass().getConstructor().newInstance();
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java
index 230903b..d0dcfeb 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java
@@ -51,47 +51,47 @@ public enum SQLVisitorRule {
     ALTER_INDEX("AlterIndex", SQLStatementType.DDL),
     
     DROP_INDEX("DropIndex", SQLStatementType.DDL),
-
+    
     CREATE_PROCEDURE("CreateProcedure", SQLStatementType.DDL),
-
+    
     ALTER_PROCEDURE("AlterProcedure", SQLStatementType.DDL),
-
+    
     DROP_PROCEDURE("DropProcedure", SQLStatementType.DDL),
-
+    
     CREATE_FUNCTION("CreateFunction", SQLStatementType.DDL),
-
+    
     ALTER_FUNCTION("AlterFunction", SQLStatementType.DDL),
-
+    
     DROP_FUNCTION("DropFunction", SQLStatementType.DDL),
-
+    
     CREATE_DATABASE("CreateDatabase", SQLStatementType.DDL),
     
     ALTER_DATABASE("AlterDatabase", SQLStatementType.DDL),
-
+    
     DROP_DATABASE("DropDatabase", SQLStatementType.DDL),
-
+    
     CREATE_EVENT("CreateEvent", SQLStatementType.DDL),
-
+    
     ALTER_EVENT("AlterEvent", SQLStatementType.DDL),
     
     DROP_EVENT("DropEvent", SQLStatementType.DDL),
-
+    
     ALTER_INSTANCE("AlterInstance", SQLStatementType.DDL),
-
+    
     CREATE_LOGFILE_GROUP("CreateLogfileGroup", SQLStatementType.DDL),
-
+    
     ALTER_LOGFILE_GROUP("AlterLogfileGroup", SQLStatementType.DDL),
-
+    
     DROP_LOGFILE_GROUP("DropLogfileGroup", SQLStatementType.DDL),
-
+    
     CREATE_SERVER("CreateServer", SQLStatementType.DDL),
     
     ALTER_SERVER("AlterServer", SQLStatementType.DDL),
-
+    
     DROP_SERVER("DropServer", SQLStatementType.DDL),
-
+    
     CREATE_TRIGGER("CreateTrigger", SQLStatementType.DDL),
-
+    
     DROP_TRIGGER("DropTrigger", SQLStatementType.DDL),
     
     CREATE_VIEW("CreateView", SQLStatementType.DDL),
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngine.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngine.java
index b3bda7d..664ad42 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngine.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngine.java
@@ -21,9 +21,9 @@ import lombok.RequiredArgsConstructor;
 import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.ParseTreeVisitor;
 import org.apache.shardingsphere.sql.parser.cache.SQLParsedResultCache;
-import org.apache.shardingsphere.sql.parser.core.visitor.SQLStatementVisitorFactory;
+import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorFactory;
 import org.apache.shardingsphere.sql.parser.core.visitor.SQLVisitorRule;
-import org.apache.shardingsphere.sql.parser.engine.SQLParserEngineFactory;
+import org.apache.shardingsphere.sql.parser.api.parser.SQLParserEngineFactory;
 import org.apache.shardingsphere.sql.parser.hook.ParsingHookRegistry;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 import org.apache.shardingsphere.sql.parser.statement.SQLStatementParserEngine;
@@ -76,10 +76,9 @@ public final class StandardSQLStatementParserEngine implements SQLStatementParse
         return result;
     }
     
-    @SuppressWarnings("unchecked")
     private SQLStatement parseSQLStatement(final String sql) {
         ParseTree parseTree = SQLParserEngineFactory.getSQLParserEngine(databaseTypeName).parse(sql, false);
-        ParseTreeVisitor<SQLStatement> visitor = SQLStatementVisitorFactory.newInstance(databaseTypeName, SQLVisitorRule.valueOf(parseTree.getClass()));
+        ParseTreeVisitor<SQLStatement> visitor = SQLVisitorFactory.newInstance(databaseTypeName, "STATEMENT", SQLVisitorRule.valueOf(parseTree.getClass()));
         return parseTree.accept(visitor);
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngineFactory.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngineFactory.java
index 617800a..8c637a3 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngineFactory.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/statement/standard/StandardSQLStatementParserEngineFactory.java
@@ -34,19 +34,19 @@ public final class StandardSQLStatementParserEngineFactory {
     /**
      * Get standard SQL statement parser engine.
      *x
-     * @param databaseTypeName name of database type
+     * @param databaseType name of database type
      * @return standard SQL statement parser engine
      */
-    public static StandardSQLStatementParserEngine getSQLStatementParserEngine(final String databaseTypeName) {
-        if (ENGINES.containsKey(databaseTypeName)) {
-            return ENGINES.get(databaseTypeName);
+    public static StandardSQLStatementParserEngine getSQLStatementParserEngine(final String databaseType) {
+        if (ENGINES.containsKey(databaseType)) {
+            return ENGINES.get(databaseType);
         }
         synchronized (ENGINES) {
-            if (ENGINES.containsKey(databaseTypeName)) {
-                return ENGINES.get(databaseTypeName);
+            if (ENGINES.containsKey(databaseType)) {
+                return ENGINES.get(databaseType);
             }
-            StandardSQLStatementParserEngine result = new StandardSQLStatementParserEngine(databaseTypeName);
-            ENGINES.put(databaseTypeName, result);
+            StandardSQLStatementParserEngine result = new StandardSQLStatementParserEngine(databaseType);
+            ENGINES.put(databaseType, result);
             return result;
         }
     }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactoryTest.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngineFactoryTest.java
similarity index 92%
rename from shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactoryTest.java
rename to shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngineFactoryTest.java
index 73dd287..1887e21 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/engine/SQLParserEngineFactoryTest.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/test/java/org/apache/shardingsphere/sql/parser/api/SQLParserEngineFactoryTest.java
@@ -15,8 +15,9 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.engine;
+package org.apache.shardingsphere.sql.parser.api;
 
+import org.apache.shardingsphere.sql.parser.api.parser.SQLParserEngineFactory;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;