You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ch...@apache.org on 2026/10/10 10:14:38 UTC

(shardingsphere) branch master updated: Support additional MySQL SQL syntax and correct external parser inputs (#40120)

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

FlyingZC 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 087cf889af4 Support additional MySQL SQL syntax and correct external parser inputs (#40120)
087cf889af4 is described below

commit 087cf889af49ecc9e513a142dc89fe720e331114
Author: Zhengqiang Duan <du...@apache.org>
AuthorDate: Sat Oct 10 18:14:30 2026 +0800

    Support additional MySQL SQL syntax and correct external parser inputs (#40120)
    
    * Support additional MySQL SQL syntax and correct external parser inputs
    
    * Remove useless RouteStageContext
    
    * Update RELEASE-NOTES.md
    
    * Fix MySQL external parser comments and latin1 decoding
---
 RELEASE-NOTES.md                                   |   1 +
 .../type/ignore/ShardingIgnoreRouteEngineTest.java |   1 -
 .../infra/route/context/RouteContext.java          |   4 -
 .../tableless/router/TablelessSQLRouterTest.java   |   1 -
 .../core/database/visitor/SQLVisitorRule.java      |   4 +-
 .../src/main/antlr4/imports/doris/BaseRule.g4      |  19 +-
 .../src/main/antlr4/imports/doris/DALStatement.g4  |   2 +-
 .../src/main/antlr4/imports/doris/DCLStatement.g4  |   4 +-
 .../src/main/antlr4/imports/doris/DDLStatement.g4  |  35 +++-
 .../src/main/antlr4/imports/doris/DMLStatement.g4  |   4 +-
 .../src/main/antlr4/imports/doris/DorisKeyword.g4  |   2 +
 .../src/main/antlr4/imports/doris/Literals.g4      |  10 +-
 .../sql/parser/autogen/DorisStatement.g4           |  17 ++
 .../statement/type/DorisDCLStatementVisitor.java   |   7 +-
 .../src/main/antlr4/imports/mysql/BaseRule.g4      |  21 ++-
 .../src/main/antlr4/imports/mysql/DALStatement.g4  |   2 +-
 .../src/main/antlr4/imports/mysql/DCLStatement.g4  |   4 +-
 .../src/main/antlr4/imports/mysql/DDLStatement.g4  |  49 ++++-
 .../src/main/antlr4/imports/mysql/DMLStatement.g4  |   4 +-
 .../src/main/antlr4/imports/mysql/Literals.g4      |  14 +-
 .../src/main/antlr4/imports/mysql/MySQLKeyword.g4  |   2 +
 .../sql/parser/autogen/MySQLStatement.g4           |  32 ++++
 .../visitor/statement/MySQLStatementVisitor.java   |   7 +-
 .../statement/type/MySQLDALStatementVisitor.java   |   6 +
 .../statement/type/MySQLDCLStatementVisitor.java   |   7 +-
 .../statement/type/MySQLDDLStatementVisitor.java   |   6 +-
 .../sql/parser/external/ExternalCaseSettings.java  |   7 +
 .../sql/parser/external/ExternalSQLParserIT.java   |   2 +-
 .../loader/ExternalTestParameterLoader.java        |   2 +-
 .../ExternalTestParameterLoadTemplate.java         |  10 +
 ...LExternalExternalTestParameterLoadTemplate.java | 203 ++++++++++++++++++++-
 .../segment/definition/ColumnDefinitionAssert.java |   6 +
 .../asserts/statement/SQLStatementAssert.java      |   4 +
 .../standard/type/CreateUserStatementAssert.java   |  14 ++
 .../parser/jaxb/CommonSQLStatementTestCase.java    |   6 +-
 .../cases/parser/jaxb/RootSQLParserTestCases.java  |   3 +
 .../impl/definition/ExpectedColumnDefinition.java  |   6 +
 .../jaxb/segment/impl/user/ExpectedUser.java       |   3 +
 .../dcl/standard/CreateUserStatementTestCase.java  |  10 +
 .../load-xml.xml => case/dal/get-diagnostics.xml}  |  11 +-
 .../parser/src/main/resources/case/dal/install.xml |   7 +
 .../src/main/resources/case/dcl/create-user.xml    |   7 +
 .../parser/src/main/resources/case/dcl/grant.xml   |   3 +
 .../main/resources/case/ddl/create-function.xml    |   1 +
 .../main/resources/case/ddl/create-procedure.xml   |   1 +
 .../src/main/resources/case/ddl/create-table.xml   | 128 +++++++++++++
 .../src/main/resources/case/ddl/create-trigger.xml |   1 +
 .../src/main/resources/case/dml/load-xml.xml       |   3 +
 .../resources/case/dml/select-special-function.xml | 172 +++++++++++++++++
 .../{dml/load-xml.xml => dal/get-diagnostics.xml}  |   7 +-
 .../main/resources/sql/supported/dal/install.xml   |   4 +
 .../resources/sql/supported/dcl/create-user.xml    |   4 +
 .../resources/sql/supported/dcl/grant-user.xml     |   4 +
 .../sql/supported/ddl/create-function.xml          |   3 +
 .../sql/supported/ddl/create-procedure.xml         |   2 +
 .../resources/sql/supported/ddl/create-table.xml   |  16 ++
 .../resources/sql/supported/ddl/create-trigger.xml |   2 +
 .../main/resources/sql/supported/dml/load-xml.xml  |   2 +
 .../sql/supported/dml/select-special-function.xml  |  16 ++
 .../it/sql/parser/mysql/ExternalMySQLParserIT.java |   3 +-
 60 files changed, 836 insertions(+), 102 deletions(-)

diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 110f88910e3..1a38e79c76b 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -118,6 +118,7 @@
 
 ### Enhancements
 
+1. SQL Parser: Support additional MySQL CREATE TABLE, CREATE FUNCTION, CREATE TRIGGER, INSTALL COMPONENT, LOAD XML, GET DIAGNOSTICS and SELECT syntax
 1. Metadata: Support view table type in openGauss meta data loader - [#39097](https://github.com/apache/shardingsphere/pull/39097)
 1. Build: Support compiling and using ShardingSphere under OpenJDK 26 - [#38625](https://github.com/apache/shardingsphere/issues/38625)
 1. SQL Parser: Support Hive OPTIMIZE Statement about iceberg statement parse - [#38877](https://github.com/apache/shardingsphere/pull/38877)
diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ignore/ShardingIgnoreRouteEngineTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ignore/ShardingIgnoreRouteEngineTest.java
index 3fa3bfe60a3..3ea467ec297 100644
--- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ignore/ShardingIgnoreRouteEngineTest.java
+++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/route/engine/type/ignore/ShardingIgnoreRouteEngineTest.java
@@ -32,6 +32,5 @@ class ShardingIgnoreRouteEngineTest {
         RouteContext routeContext = routeEngine.route(mock(ShardingRule.class));
         assertTrue(routeContext.getRouteUnits().isEmpty());
         assertTrue(routeContext.getOriginalDataNodes().isEmpty());
-        assertTrue(routeContext.getRouteStageContexts().isEmpty());
     }
 }
diff --git a/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/context/RouteContext.java b/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/context/RouteContext.java
index 51aaafa287d..87a1535bec4 100644
--- a/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/context/RouteContext.java
+++ b/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/context/RouteContext.java
@@ -19,13 +19,11 @@ package org.apache.shardingsphere.infra.route.context;
 
 import lombok.Getter;
 import org.apache.shardingsphere.infra.datanode.DataNode;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -43,8 +41,6 @@ public final class RouteContext {
     
     private final Collection<RouteUnit> routeUnits = new LinkedHashSet<>();
     
-    private final Map<Class<? extends ShardingSphereRule>, RouteStageContext> routeStageContexts = new LinkedHashMap<>();
-    
     /**
      * Judge is route for single database and table only or not.
      *
diff --git a/infra/route/core/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/router/TablelessSQLRouterTest.java b/infra/route/core/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/router/TablelessSQLRouterTest.java
index 9ea000e3c9d..36af8ccfdf0 100644
--- a/infra/route/core/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/router/TablelessSQLRouterTest.java
+++ b/infra/route/core/src/test/java/org/apache/shardingsphere/infra/route/engine/tableless/router/TablelessSQLRouterTest.java
@@ -59,7 +59,6 @@ class TablelessSQLRouterTest {
         RouteContext actual = new TablelessSQLRouter().route(queryContext, ruleMetaData, database, Collections.emptyList(), new RouteContext());
         assertTrue(actual.getOriginalDataNodes().isEmpty());
         assertThat(actual.getRouteUnits().size(), is(1));
-        assertTrue(actual.getRouteStageContexts().isEmpty());
     }
     
     @Test
diff --git a/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java b/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java
index c8944f85b9d..a62af299e1f 100644
--- a/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java
+++ b/parser/sql/engine/core/src/main/java/org/apache/shardingsphere/sql/parser/engine/core/database/visitor/SQLVisitorRule.java
@@ -903,7 +903,9 @@ public enum SQLVisitorRule {
     
     REFRESH("Refresh", SQLStatementType.DAL),
     
-    OPEN("Open", SQLStatementType.DDL);
+    OPEN("Open", SQLStatementType.DDL),
+    
+    GET_DIAGNOSTICS("GetDiagnosticsStatement", SQLStatementType.DAL);
     
     private final String name;
     
diff --git a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4 b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4
index d8b59cf049d..43b4f83b849 100644
--- a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4
+++ b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/BaseRule.g4
@@ -389,6 +389,7 @@ identifierKeywordsUnambiguous
     | NEXT
     | NGRAM_BF
     | NODEGROUP
+    | NOW
     | NOWAIT
     | NO_WAIT
     | NULLS
@@ -803,7 +804,7 @@ delimiterName
     ; 
 
 userIdentifierOrText
-    : textOrIdentifier (AT_ textOrIdentifier)?
+    : textOrIdentifier (AT_ (textOrIdentifier (DOT_ textOrIdentifier)*)?)?
     ;
 
 username
@@ -919,7 +920,7 @@ logName
     ;
 
 roleName
-    : roleIdentifierOrText (AT_ textOrIdentifier)?
+    : roleIdentifierOrText (AT_ textOrIdentifier (DOT_ textOrIdentifier)*)?
     ;
 
 roleIdentifierOrText
@@ -1132,7 +1133,7 @@ jsonTableColumns
 jsonTableColumn
     : name FOR ORDINALITY
     | name dataType PATH path (NULL | DEFAULT string_ | ERROR) ON (EMPTY | ERROR)
-    | name dataType EXISTS PATH string_ path
+    | name dataType EXISTS PATH path
     | NESTED PATH? path COLUMNS
     ;
 
@@ -1299,7 +1300,7 @@ castType
     | castTypeName = JSON
     | castTypeName = REAL
     | castTypeName = DOUBLE PRECISION
-    | castTypeName = FLOAT precision?
+    | castTypeName = FLOAT (fieldLength | precision)?
     // DORIS ADDED BEGIN
     | castTypeName = STRING
     | castTypeName = INT
@@ -1365,7 +1366,7 @@ shorthandRegularFunction
 
 completeRegularFunction
     // DORIS CHANGED BEGIN
-    : regularFunctionName (LP_ (expr (COMMA_ expr)* | ASTERISK_)? RP_) indexAlias? overClause?
+    : regularFunctionName (LP_ (ALL expr | expr (COMMA_ expr)* | ASTERISK_)? RP_) indexAlias? overClause?
     // DORIS CHANGED END
     ;
 
@@ -1442,7 +1443,7 @@ orderByItem
     ;
 
 dataType
-    : dataTypeName = (INTEGER | INT | TINYINT | SMALLINT | MIDDLEINT | MEDIUMINT | BIGINT) fieldLength? fieldOptions?
+    : dataTypeName = (INTEGER | INT | INT1 | INT2 | INT3 | INT4 | INT8 | TINYINT | SMALLINT | MIDDLEINT | MEDIUMINT | BIGINT) fieldLength? fieldOptions?
     | (dataTypeName = REAL | dataTypeName = DOUBLE PRECISION?) precision? fieldOptions?
     | dataTypeName = (FLOAT | DECIMAL | DEC | NUMERIC | FIXED) (fieldLength | precision)? fieldOptions?
     | dataTypeName = BIT fieldLength?
@@ -1470,11 +1471,11 @@ dataType
     | dataTypeName = BLOB fieldLength?
     | dataTypeName = (MEDIUMBLOB | LONGBLOB)
     | dataTypeName = LONG VARBINARY
-    | dataTypeName = (LONG_CHAR_VARYING | LONG_VARCHAR)? charsetWithOptBinary?
+    | dataTypeName = (LONG_CHAR_VARYING | LONG_VARCHAR) charsetWithOptBinary?
     | dataTypeName = TINYTEXT charsetWithOptBinary?
     | dataTypeName = TEXT fieldLength? charsetWithOptBinary?
     | dataTypeName = MEDIUMTEXT charsetWithOptBinary?
-    | dataTypeName = LONGTEXT charsetWithOptBinary?
+    | dataTypeName = (LONG | LONGTEXT) charsetWithOptBinary?
     | dataTypeName = ENUM stringList charsetWithOptBinary?
     | dataTypeName = SET stringList charsetWithOptBinary?
     | dataTypeName = (SERIAL | JSON | GEOMETRY | GEOMCOLLECTION | GEOMETRYCOLLECTION | POINT | MULTIPOINT | LINESTRING | MULTILINESTRING | POLYGON | MULTIPOLYGON)
@@ -1556,7 +1557,7 @@ defaultCharset
     ;
 
 now
-    : (CURRENT_TIMESTAMP | LOCALTIME | LOCALTIMESTAMP) (LP_ NUMBER_? RP_)?
+    : (CURRENT_TIMESTAMP | LOCALTIME | LOCALTIMESTAMP | NOW) (LP_ NUMBER_? RP_)?
     ;
 
 columnFormat
diff --git a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DALStatement.g4 b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DALStatement.g4
index ea981fa3ad9..ccad280d8b0 100644
--- a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DALStatement.g4
+++ b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DALStatement.g4
@@ -351,7 +351,7 @@ uninstall
     ;
 
 installComponent
-    : INSTALL COMPONENT componentName (COMMA_ componentName)*
+    : INSTALL COMPONENT componentName (COMMA_ componentName)* (SET (GLOBAL | PERSIST)? internalVariableName EQ_ setExprOrDefault (COMMA_ (GLOBAL | PERSIST)? internalVariableName EQ_ setExprOrDefault)*)?
     ;
 
 installPlugin
diff --git a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DCLStatement.g4 b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DCLStatement.g4
index eb133d7c021..654d09aff8f 100644
--- a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DCLStatement.g4
+++ b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DCLStatement.g4
@@ -85,8 +85,8 @@ aclType
 
 grantIdentifier
     : ASTERISK_ # grantLevelGlobal
-    | ASTERISK_ DOT_ASTERISK_ # grantLevelGlobal
-    | databaseName DOT_ASTERISK_ # grantLevelDatabaseGlobal
+    | ASTERISK_ (DOT_ASTERISK_ | DOT_ ASTERISK_) # grantLevelGlobal
+    | databaseName (DOT_ASTERISK_ | DOT_ ASTERISK_) # grantLevelDatabaseGlobal
     | tableName # grantLevelTable
     ;
 
diff --git a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DDLStatement.g4 b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DDLStatement.g4
index 8dc552f7e84..e15bafb323c 100644
--- a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DDLStatement.g4
+++ b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DDLStatement.g4
@@ -409,7 +409,7 @@ createFunction
       (WITH PARAMETER LP_ identifier (COMMA_ identifier)* RP_ AS expr)?
       (PROPERTIES LP_ properties RP_)?
     | CREATE ownerStatement?
-      FUNCTION functionName LP_ (identifier dataType)? (COMMA_ identifier dataType)* RP_
+      FUNCTION ifNotExists? functionName LP_ (identifier dataType)? (COMMA_ identifier dataType)* RP_
       RETURNS dataType
       routineOption*
       routineBody
@@ -617,7 +617,7 @@ dropLogfileGroup
     ;
 
 createTrigger
-    :  CREATE ownerStatement? TRIGGER triggerName triggerTime triggerEvent ON tableName FOR EACH ROW triggerOrder? routineBody
+    :  CREATE ownerStatement? TRIGGER ifNotExists? triggerName triggerTime triggerEvent ON tableName FOR EACH ROW triggerOrder? routineBody
     ;
 
 dropTrigger
@@ -760,7 +760,7 @@ createTableOption
     | option = (CHECKSUM | TABLE_CHECKSUM) EQ_? NUMBER_
     | option = DELAY_KEY_WRITE EQ_? NUMBER_
     | option = ROW_FORMAT EQ_? format = (DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT)
-    | option = UNION EQ_? LP_ tableList RP_
+    | option = UNION EQ_? LP_ tableList? RP_
     | defaultCharset
     | defaultCollation
     | option = INSERT_METHOD EQ_? method = (NO| FIRST| LAST)
@@ -837,6 +837,7 @@ partitionDefinitionOption
     | MAX_ROWS EQ_? NUMBER_
     | MIN_ROWS EQ_? NUMBER_
     | TABLESPACE EQ_? identifier
+    | NODEGROUP EQ_? numberLiterals
     ;
 
 subpartitionDefinition
@@ -897,10 +898,30 @@ compoundStatement
     ;
 
 validStatement
-    : (createTable | alterTable | dropTable | dropDatabase | truncateTable
-    | insert | replace | update | delete | select | call
-    | createView | prepare | executeStmt | commit | deallocate
-    | setVariable | beginStatement | declareStatement | flowControlStatement | cursorStatement | conditionHandlingStatement) SEMI_?
+    : (createTable
+    | alterTable
+    | dropTable
+    | dropDatabase
+    | truncateTable
+    | insert
+    | replace
+    | update
+    | delete
+    | select
+    | call
+    | createView
+    | prepare
+    | executeStmt
+    | commit
+    | deallocate
+    | setVariable
+    | beginStatement
+    | declareStatement
+    | flowControlStatement
+    | cursorStatement
+    | conditionHandlingStatement
+    | flush
+    | kill) SEMI_?
     ;
 
 beginStatement
diff --git a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4 b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4
index daadf34b192..0b58a25ed9f 100644
--- a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4
+++ b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DMLStatement.g4
@@ -323,7 +323,7 @@ loadXmlStatement
       (REPLACE | IGNORE)?
       INTO TABLE tableName
       (CHARACTER SET identifier)?
-      (ROWS IDENTIFIED BY LT_ string_ GT_)?
+      (ROWS IDENTIFIED BY string_)?
       ( IGNORE numberLiterals (LINES | ROWS) )?
       fieldOrVarSpec?
       (setAssignmentsClause)?
@@ -438,7 +438,7 @@ unqualifiedShorthand
     ;
 
 qualifiedShorthand
-    : (identifier DOT_)? identifier DOT_ASTERISK_
+    : (identifier DOT_)? identifier (DOT_ASTERISK_ | DOT_ ASTERISK_)
     ;
 
 fromClause
diff --git a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DorisKeyword.g4 b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DorisKeyword.g4
index d6a00164a9d..d3a7140a6ed 100644
--- a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DorisKeyword.g4
+++ b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/DorisKeyword.g4
@@ -3542,3 +3542,5 @@ AUTHENTICATION_FIDO
 FACTOR
     : F A C T O R
     ;
+
+NOW: N O W;
diff --git a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/Literals.g4 b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/Literals.g4
index ae3814a59a5..31dcfbc5e37 100644
--- a/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/Literals.g4
+++ b/parser/sql/engine/dialect/doris/src/main/antlr4/imports/doris/Literals.g4
@@ -43,11 +43,7 @@ UNDERSCORE_CHARSET
     : UL_ [a-z0-9A-Z]+
     ;
 
-NUMBER_
-    : INT_NUM_
-    | FLOAT_NUM_
-    | DECIMAL_NUM_
-    ;
+NUMBER_: (INT_NUM_ | FLOAT_NUM_ | DECIMAL_NUM_) {adjustNumberToken();};
 
 INT_NUM_
     : DIGIT+
@@ -57,9 +53,7 @@ FLOAT_NUM_
     : INT_NUM_? DOT_? INT_NUM_ E (PLUS_ | MINUS_)? INT_NUM_
     ;
 
-DECIMAL_NUM_
-    : INT_NUM_? DOT_ INT_NUM_
-    ;
+DECIMAL_NUM_: INT_NUM_ DOT_ INT_NUM_? | DOT_ INT_NUM_;
 
 HEX_DIGIT_
     : '0x' HEX_+ | X SQ_ HEX_+ SQ_ | X SQ_ + SQ_
diff --git a/parser/sql/engine/dialect/doris/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/DorisStatement.g4 b/parser/sql/engine/dialect/doris/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/DorisStatement.g4
index 7c81f4d3bf1..730921b3bfb 100644
--- a/parser/sql/engine/dialect/doris/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/DorisStatement.g4
+++ b/parser/sql/engine/dialect/doris/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/DorisStatement.g4
@@ -19,6 +19,23 @@ grammar DorisStatement;
 
 import Comments, DDLStatement, TCLStatement, LCLStatement, DCLStatement;
 
+// DORIS CHANGED BEGIN
+@lexer::members {
+    private void adjustNumberToken() {
+        if ('.' == _input.LA(_tokenStartCharIndex - _input.index())) {
+            int previousCharacter = _input.LA(_tokenStartCharIndex - _input.index() - 1);
+            int nextCharacter = _input.LA(1);
+            if ((Character.isLetterOrDigit(previousCharacter) || '_' == previousCharacter || '$' == previousCharacter || previousCharacter >= 0x80 && previousCharacter <= 0xFFFF)
+                    && (Character.isLetter(nextCharacter) || '_' == nextCharacter || '$' == nextCharacter || nextCharacter >= 0x80 && nextCharacter <= 0xFFFF)) {
+                _input.seek(_tokenStartCharIndex + 1);
+                setCharPositionInLine(_tokenStartCharPositionInLine + 1);
+                setType(DOT_);
+            }
+        }
+    }
+}
+// DORIS CHANGED END
+
 execute
     : (select
     | insert
diff --git a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDCLStatementVisitor.java b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDCLStatementVisitor.java
index 026381a4aa5..a96de50baed 100644
--- a/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDCLStatementVisitor.java
+++ b/parser/sql/engine/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/engine/doris/visitor/statement/type/DorisDCLStatementVisitor.java
@@ -85,6 +85,7 @@ import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.StaticP
 import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.StaticPrivilegeTriggerContext;
 import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.StaticPrivilegeUpdateContext;
 import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.StaticPrivilegeUsageContext;
+import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.TextOrIdentifierContext;
 import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.TlsOptionContext;
 import org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.UsernameContext;
 import org.apache.shardingsphere.sql.parser.engine.doris.visitor.statement.DorisStatementVisitor;
@@ -703,7 +704,11 @@ public final class DorisDCLStatementVisitor extends DorisStatementVisitor implem
         if (null != ctx.userIdentifierOrText()) {
             result.setUser(new IdentifierValue(ctx.userIdentifierOrText().textOrIdentifier(0).getText()).getValue());
             if (null != ctx.userIdentifierOrText().AT_()) {
-                result.setHost(new IdentifierValue(ctx.userIdentifierOrText().textOrIdentifier(1).getText()).getValue());
+                TextOrIdentifierContext hostContext = ctx.userIdentifierOrText().textOrIdentifier(1);
+                String host = null == hostContext ? "" : hostContext.getStart().getText();
+                host = null == ctx.userIdentifierOrText().textOrIdentifier(2) ? host
+                        : ctx.userIdentifierOrText().textOrIdentifier().stream().skip(1).map(each -> each.getText()).collect(Collectors.joining("."));
+                result.setHost(new IdentifierValue(host).getValue());
             }
         }
         return result;
diff --git a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4 b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
index 8ff328e82f6..1cf48417601 100644
--- a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
+++ b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/BaseRule.g4
@@ -127,6 +127,9 @@ identifier
 unreservedWord
     : MAX | MIN | SUM | COUNT | GROUP_CONCAT | CAST | POSITION | SUBSTRING | SUBSTR | MID | EXTRACT | TRIM | LAST_DAY | TRADITIONAL | TREE | MYSQL_MAIN | MYSQL_ADMIN | INSTANT | INPLACE | COPY | UL_BINARY | AUTOCOMMIT | REDO_LOG | DELIMITER | ARCHIVE | BLACKHOLE | CSV | FEDERATED | INNODB | MEMORY | MRG_MYISAM | MYISAM | NDB | NDBCLUSTER | PERFORMANCE_SCHEMA | TOKUDB
     | ACCESSIBLE | ACCOUNT | ACTION | ACTIVE | ADD | ADMIN | AFTER | AGAINST | AGGREGATE | ALGORITHM | ALL | ALTER | ALWAYS | ANALYZE | AND | ANY | ARRAY | AS | ASC | ASCII | ASENSITIVE | AT | ATTRIBUTE | AUTOEXTEND_SIZE | AUTHENTICATION | AUTO | AUTO_INCREMENT | AVG | ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS | BIT_XOR | AVG_ROW_LENGTH | BACKUP | BEFORE | BERNOULLI | BEGIN | BETWEEN | BIGINT | BINARY | BINLOG | BIT | BLOB | BLOCK | BOOL | BOOLEAN | BOTH | BTREE | BUCKETS | BULK | BY | BYTE [...]
+    | MEDIAN
+    | TIMESTAMPADD
+    | NOW
     ;
 
 textOrIdentifier
@@ -239,7 +242,7 @@ delimiterName
     ;
 
 userIdentifierOrText
-    : textOrIdentifier (AT_ textOrIdentifier)?
+    : textOrIdentifier (AT_ (textOrIdentifier (DOT_ textOrIdentifier)*)?)?
     ;
 
 username
@@ -339,7 +342,7 @@ logName
     ;
 
 roleName
-    : roleIdentifierOrText (AT_ textOrIdentifier)?
+    : roleIdentifierOrText (AT_ textOrIdentifier (DOT_ textOrIdentifier)*)?
     ;
 
 roleIdentifierOrText
@@ -528,7 +531,7 @@ jsonTableColumns
 jsonTableColumn
     : name FOR ORDINALITY
     | name dataType PATH path jsonTableColumnOnEmpty? jsonTableColumnOnError?
-    | name dataType EXISTS PATH string_ path
+    | name dataType EXISTS PATH path
     | NESTED PATH? path COLUMNS
     ;
 
@@ -684,7 +687,7 @@ castType
     | castTypeName = JSON
     | castTypeName = REAL
     | castTypeName = DOUBLE PRECISION?
-    | castTypeName = FLOAT precision?
+    | castTypeName = FLOAT (fieldLength | precision)?
     | castTypeName = YEAR
     ;
 
@@ -740,7 +743,7 @@ shorthandRegularFunction
     ;
 
 completeRegularFunction
-    : regularFunctionName (LP_ (expr (COMMA_ expr)* | ASTERISK_)? RP_)
+    : regularFunctionName (LP_ (ALL expr | expr (COMMA_ expr)* | ASTERISK_)? RP_)
     ;
 
 regularFunctionName
@@ -818,7 +821,7 @@ orderByItem
     ;
 
 dataType
-    : dataTypeName = (INTEGER | INT | TINYINT | SMALLINT | MIDDLEINT | MEDIUMINT | BIGINT) fieldLength? fieldOptions?
+    : dataTypeName = (INTEGER | INT | INT1 | INT2 | INT3 | INT4 | INT8 | TINYINT | SMALLINT | MIDDLEINT | MEDIUMINT | BIGINT) fieldLength? fieldOptions?
     | (dataTypeName = REAL | dataTypeName = DOUBLE PRECISION?) precision? fieldOptions?
     | dataTypeName = (FLOAT | DECIMAL | DEC | NUMERIC | FIXED) (fieldLength | precision)? fieldOptions?
     | dataTypeName = BIT fieldLength?
@@ -840,11 +843,11 @@ dataType
     | dataTypeName = BLOB fieldLength?
     | dataTypeName = (MEDIUMBLOB | LONGBLOB)
     | dataTypeName = LONG VARBINARY
-    | dataTypeName = (LONG_CHAR_VARYING | LONG_VARCHAR)? charsetWithOptBinary?
+    | dataTypeName = (LONG_CHAR_VARYING | LONG_VARCHAR) charsetWithOptBinary?
     | dataTypeName = TINYTEXT charsetWithOptBinary?
     | dataTypeName = TEXT fieldLength? charsetWithOptBinary?
     | dataTypeName = MEDIUMTEXT charsetWithOptBinary?
-    | dataTypeName = LONGTEXT charsetWithOptBinary?
+    | dataTypeName = (LONG | LONGTEXT) charsetWithOptBinary?
     | dataTypeName = ENUM stringList charsetWithOptBinary?
     | dataTypeName = SET stringList charsetWithOptBinary?
     | dataTypeName = (SERIAL | JSON | GEOMETRY | GEOMCOLLECTION | GEOMETRYCOLLECTION | POINT | MULTIPOINT | LINESTRING | MULTILINESTRING | POLYGON | MULTIPOLYGON)
@@ -912,7 +915,7 @@ defaultCharset
     ;
 
 now
-    : (CURRENT_TIMESTAMP | LOCALTIME | LOCALTIMESTAMP) (LP_ NUMBER_? RP_)?
+    : (CURRENT_TIMESTAMP | LOCALTIME | LOCALTIMESTAMP | NOW) (LP_ NUMBER_? RP_)?
     ;
 
 columnFormat
diff --git a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DALStatement.g4 b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DALStatement.g4
index bd73b9d068e..d0bb9525515 100644
--- a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DALStatement.g4
+++ b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DALStatement.g4
@@ -280,7 +280,7 @@ uninstall
     ;
 
 installComponent
-    : INSTALL COMPONENT componentName (COMMA_ componentName)*
+    : INSTALL COMPONENT componentName (COMMA_ componentName)* (SET (GLOBAL | PERSIST)? internalVariableName EQ_ setExprOrDefault (COMMA_ (GLOBAL | PERSIST)? internalVariableName EQ_ setExprOrDefault)*)?
     ;
 
 installPlugin
diff --git a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DCLStatement.g4 b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DCLStatement.g4
index 09572eb543a..cc21d73f37e 100644
--- a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DCLStatement.g4
+++ b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DCLStatement.g4
@@ -85,8 +85,8 @@ aclType
 
 grantIdentifier
     : ASTERISK_ # grantLevelGlobal
-    | ASTERISK_ DOT_ASTERISK_ # grantLevelGlobal
-    | databaseName DOT_ASTERISK_ # grantLevelDatabaseGlobal
+    | ASTERISK_ (DOT_ASTERISK_ | DOT_ ASTERISK_) # grantLevelGlobal
+    | databaseName (DOT_ASTERISK_ | DOT_ ASTERISK_) # grantLevelDatabaseGlobal
     | tableName # grantLevelTable
     ;
 
diff --git a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4 b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
index 0d262774ab1..6eabf48072e 100644
--- a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
+++ b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
@@ -277,7 +277,7 @@ dropEvent
 
 createFunction
     : CREATE ownerStatement?
-      FUNCTION functionName LP_ (identifier dataType)? (COMMA_ identifier dataType)* RP_
+      FUNCTION ifNotExists? functionName LP_ (identifier dataType)? (COMMA_ identifier dataType)* RP_
       RETURNS dataType
       routineOption*
       routineBody
@@ -421,7 +421,7 @@ dropLogfileGroup
     ;
 
 createTrigger
-    :  CREATE ownerStatement? TRIGGER triggerName triggerTime triggerEvent ON tableName FOR EACH ROW triggerOrder? routineBody
+    :  CREATE ownerStatement? TRIGGER ifNotExists? triggerName triggerTime triggerEvent ON tableName FOR EACH ROW triggerOrder? routineBody
     ;
 
 dropTrigger
@@ -556,7 +556,7 @@ createTableOption
     | option = (CHECKSUM | TABLE_CHECKSUM) EQ_? NUMBER_
     | option = DELAY_KEY_WRITE EQ_? NUMBER_
     | option = ROW_FORMAT EQ_? format = (DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT)
-    | option = UNION EQ_? LP_ tableList RP_
+    | option = UNION EQ_? LP_ tableList? RP_
     | defaultCharset
     | defaultCollation
     | option = INSERT_METHOD EQ_? method = (NO| FIRST| LAST)
@@ -618,6 +618,7 @@ partitionDefinitionOption
     | MAX_ROWS EQ_? NUMBER_
     | MIN_ROWS EQ_? NUMBER_
     | TABLESPACE EQ_? identifier
+    | NODEGROUP EQ_? numberLiterals
     ;
 
 subpartitionDefinition
@@ -682,12 +683,42 @@ compoundStatement
     ;
 
 validStatement
-    : (createTable | alterTable | dropTable | dropDatabase | truncateTable
-    | insert | replace | update | delete | select | call
-    | createView | prepare | executeStmt | commit | deallocate
-    | setVariable | beginStatement | declareStatement | flowControlStatement | cursorStatement | conditionHandlingStatement
-    | setStatement | showStatement | showCreateTable | startTransaction | rollback | commit | show
-    | alterEvent | dropEvent | doStatement | explain | analyzeTable) SEMI_?
+    : (createTable
+    | alterTable
+    | dropTable
+    | dropDatabase
+    | truncateTable
+    | insert
+    | replace
+    | update
+    | delete
+    | select
+    | call
+    | createView
+    | prepare
+    | executeStmt
+    | commit
+    | deallocate
+    | setVariable
+    | beginStatement
+    | declareStatement
+    | flowControlStatement
+    | cursorStatement
+    | conditionHandlingStatement
+    | setStatement
+    | showStatement
+    | showCreateTable
+    | startTransaction
+    | rollback
+    | commit
+    | show
+    | alterEvent
+    | dropEvent
+    | doStatement
+    | explain
+    | analyzeTable
+    | flush
+    | kill) SEMI_?
     ;
 
 showStatement
diff --git a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4 b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
index 909e63ddbff..526a032f7f9 100644
--- a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
+++ b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
@@ -234,7 +234,7 @@ loadXmlStatement
       (REPLACE | IGNORE)?
       INTO TABLE tableName
       (CHARACTER SET identifier)?
-      (ROWS IDENTIFIED BY LT_ string_ GT_)?
+      (ROWS IDENTIFIED BY string_)?
       ( IGNORE numberLiterals (LINES | ROWS) )?
       fieldOrVarSpec?
       (setAssignmentsClause)?
@@ -289,7 +289,7 @@ unqualifiedShorthand
     ;
 
 qualifiedShorthand
-    : (identifier DOT_)? identifier DOT_ASTERISK_
+    : (identifier DOT_)? identifier (DOT_ASTERISK_ | DOT_ ASTERISK_)
     ;
 
 fromClause
diff --git a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/Literals.g4 b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/Literals.g4
index 972896f3733..acb88327c9a 100644
--- a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/Literals.g4
+++ b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/Literals.g4
@@ -43,11 +43,7 @@ UNDERSCORE_CHARSET
     : UL_ [a-z0-9A-Z]+
     ;
 
-NUMBER_
-    : INT_NUM_
-    | FLOAT_NUM_
-    | DECIMAL_NUM_
-    ;
+NUMBER_: (INT_NUM_ | FLOAT_NUM_ | DECIMAL_NUM_) {adjustNumberToken();};
 
 INT_NUM_
     : DIGIT+
@@ -57,9 +53,7 @@ FLOAT_NUM_
     : INT_NUM_? DOT_? INT_NUM_ E (PLUS_ | MINUS_)? INT_NUM_
     ;
 
-DECIMAL_NUM_
-    : INT_NUM_? DOT_ INT_NUM_
-    ;
+DECIMAL_NUM_: INT_NUM_ DOT_ INT_NUM_? | DOT_ INT_NUM_;
 
 HEX_DIGIT_
     : '0x' HEX_+ | X SQ_ HEX_+ SQ_ | X SQ_ + SQ_
@@ -69,9 +63,7 @@ BIT_NUM_
     : '0b' ('0' | '1')+ | B SQ_ ('0' | '1')+ SQ_
     ;
 
-DOLLAR_QUOTED_TEXT
-    : '$$' .*? '$$'
-    ;
+DOLLAR_QUOTED_TEXT: '$$' {javaScriptRoutine && AS == previousTokenType}? .*? '$$';
 
 IDENTIFIER_
     : [A-Za-z_$0-9\u0080-\uFFFF]*?[A-Za-z_$\u0080-\uFFFF]+?[A-Za-z_$0-9\u0080-\uFFFF]*
diff --git a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/MySQLKeyword.g4 b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/MySQLKeyword.g4
index 96e3ca0f4f9..5defa1ca03a 100644
--- a/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/MySQLKeyword.g4
+++ b/parser/sql/engine/dialect/mysql/src/main/antlr4/imports/mysql/MySQLKeyword.g4
@@ -3237,3 +3237,5 @@ AUTHENTICATION_FIDO
 FACTOR
     : F A C T O R
     ;
+
+NOW: N O W;
diff --git a/parser/sql/engine/dialect/mysql/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/MySQLStatement.g4 b/parser/sql/engine/dialect/mysql/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/MySQLStatement.g4
index ceffad044ff..e02cceef2de 100644
--- a/parser/sql/engine/dialect/mysql/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/MySQLStatement.g4
+++ b/parser/sql/engine/dialect/mysql/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/MySQLStatement.g4
@@ -19,6 +19,38 @@ grammar MySQLStatement;
 
 import Comments, DDLStatement, TCLStatement, LCLStatement, DCLStatement;
 
+@lexer::members {
+    private int previousTokenType;
+    private boolean javaScriptRoutine;
+
+    private void adjustNumberToken() {
+        if ('.' == _input.LA(_tokenStartCharIndex - _input.index())) {
+            int previousCharacter = _input.LA(_tokenStartCharIndex - _input.index() - 1);
+            int nextCharacter = _input.LA(1);
+            if ((Character.isLetterOrDigit(previousCharacter) || '_' == previousCharacter || '$' == previousCharacter || previousCharacter >= 0x80 && previousCharacter <= 0xFFFF)
+                    && (Character.isLetter(nextCharacter) || '_' == nextCharacter || '$' == nextCharacter || nextCharacter >= 0x80 && nextCharacter <= 0xFFFF)) {
+                _input.seek(_tokenStartCharIndex + 1);
+                setCharPositionInLine(_tokenStartCharPositionInLine + 1);
+                setType(DOT_);
+            }
+        }
+    }
+
+    @Override
+    public org.antlr.v4.runtime.Token emit() {
+        org.antlr.v4.runtime.Token result = super.emit();
+        if (org.antlr.v4.runtime.Token.DEFAULT_CHANNEL == result.getChannel()) {
+            if (JAVASCRIPT == result.getType() && LANGUAGE == previousTokenType) {
+                javaScriptRoutine = true;
+            } else if (SEMI_ == result.getType() || DOLLAR_QUOTED_TEXT == result.getType()) {
+                javaScriptRoutine = false;
+            }
+            previousTokenType = result.getType();
+        }
+        return result;
+    }
+}
+
 execute
     : (select
     | insert
diff --git a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/MySQLStatementVisitor.java b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/MySQLStatementVisitor.java
index 3c5bfc19f63..a13c8fbc38d 100644
--- a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/MySQLStatementVisitor.java
+++ b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/MySQLStatementVisitor.java
@@ -28,6 +28,7 @@ import org.antlr.v4.runtime.tree.TerminalNode;
 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
 import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementBaseVisitor;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AggregationFunctionContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AliasContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AssignmentContext;
@@ -1369,7 +1370,7 @@ public abstract class MySQLStatementVisitor extends MySQLStatementBaseVisitor<AS
         if (null != ctx.castType()) {
             result.getParameters().add((DataTypeSegment) visit(ctx.castType()));
         } else if (null != ctx.charsetName()) {
-            result.getParameters().add((ExpressionSegment) visit(ctx.charsetName()));
+            result.getParameters().add(new LiteralExpressionSegment(ctx.charsetName().getStart().getStartIndex(), ctx.charsetName().getStop().getStopIndex(), ctx.charsetName().getText()));
         }
         return result;
     }
@@ -1476,7 +1477,7 @@ public abstract class MySQLStatementVisitor extends MySQLStatementBaseVisitor<AS
     public ASTNode visitTimeStampAddFunction(final TimeStampAddFunctionContext ctx) {
         FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.TIMESTAMPADD().getText(), getOriginalText(ctx));
         result.getParameters().add(new IntervalUnitExpression(ctx.intervalUnit().getStart().getStartIndex(), ctx.intervalUnit().getStop().getStopIndex(),
-                IntervalUnit.valueOf(ctx.intervalUnit().getText().toUpperCase())));
+                IntervalUnit.valueOf(MySQLStatementParser.VOCABULARY.getSymbolicName(ctx.intervalUnit().getStart().getType()))));
         result.getParameters().addAll(getExpressions(ctx.expr()));
         return result;
     }
@@ -1485,7 +1486,7 @@ public abstract class MySQLStatementVisitor extends MySQLStatementBaseVisitor<AS
     public ASTNode visitTimeStampDiffFunction(final TimeStampDiffFunctionContext ctx) {
         FunctionSegment result = new FunctionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), ctx.TIMESTAMPDIFF().getText(), getOriginalText(ctx));
         result.getParameters().add(new IntervalUnitExpression(ctx.intervalUnit().getStart().getStartIndex(), ctx.intervalUnit().getStop().getStopIndex(),
-                IntervalUnit.valueOf(ctx.intervalUnit().getText().toUpperCase())));
+                IntervalUnit.valueOf(MySQLStatementParser.VOCABULARY.getSymbolicName(ctx.intervalUnit().getStart().getType()))));
         result.getParameters().addAll(getExpressions(ctx.expr()));
         return result;
     }
diff --git a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDALStatementVisitor.java b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
index 931db9655cf..ed642bfe63a 100644
--- a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
+++ b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDALStatementVisitor.java
@@ -44,6 +44,7 @@ import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.Explain
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FlushContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FromDatabaseContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FromTableContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GetDiagnosticsStatementContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.HelpContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.IndexNameContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.InstallComponentContext;
@@ -243,6 +244,11 @@ public final class MySQLDALStatementVisitor extends MySQLStatementVisitor implem
         super(databaseType);
     }
     
+    @Override
+    public ASTNode visitGetDiagnosticsStatement(final GetDiagnosticsStatementContext ctx) {
+        return new SQLStatement(getDatabaseType());
+    }
+    
     @Override
     public ASTNode visitUninstallPlugin(final UninstallPluginContext ctx) {
         return new MySQLUninstallPluginStatement(getDatabaseType(), ((IdentifierValue) visit(ctx.pluginName())).getValue());
diff --git a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDCLStatementVisitor.java b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDCLStatementVisitor.java
index 1ef012070a5..b8899167eec 100644
--- a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDCLStatementVisitor.java
+++ b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDCLStatementVisitor.java
@@ -85,6 +85,7 @@ import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticP
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeTriggerContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeUpdateContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeUsageContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TextOrIdentifierContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TlsOptionContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.UsernameContext;
 import org.apache.shardingsphere.sql.parser.engine.mysql.visitor.statement.MySQLStatementVisitor;
@@ -727,7 +728,11 @@ public final class MySQLDCLStatementVisitor extends MySQLStatementVisitor implem
         if (null != ctx.userIdentifierOrText()) {
             result.setUser(new IdentifierValue(ctx.userIdentifierOrText().textOrIdentifier(0).getText()).getValue());
             if (null != ctx.userIdentifierOrText().AT_()) {
-                result.setHost(new IdentifierValue(ctx.userIdentifierOrText().textOrIdentifier(1).getText()).getValue());
+                TextOrIdentifierContext hostContext = ctx.userIdentifierOrText().textOrIdentifier(1);
+                String host = null == hostContext ? "" : hostContext.getStart().getText();
+                host = null == ctx.userIdentifierOrText().textOrIdentifier(2) ? host
+                        : ctx.userIdentifierOrText().textOrIdentifier().stream().skip(1).map(each -> each.getText()).collect(Collectors.joining("."));
+                result.setHost(new IdentifierValue(host).getValue());
             }
         }
         return result;
diff --git a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
index 7aa8b4a9b5c..729409b4187 100644
--- a/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
+++ b/parser/sql/engine/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/engine/mysql/visitor/statement/type/MySQLDDLStatementVisitor.java
@@ -617,11 +617,11 @@ public final class MySQLDDLStatementVisitor extends MySQLStatementVisitor implem
         ColumnDefinitionSegment result = new ColumnDefinitionSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), column, dataTypeSegment, isPrimaryKey, isNotNull, getText(ctx));
         result.getReferencedTables().addAll(getReferencedTables(ctx));
         result.setAutoIncrement(isAutoIncrement);
-        if (null != ctx.fieldDefinition().dataType().charsetWithOptBinary()) {
-            result.setCharsetName(ctx.fieldDefinition().dataType().charsetWithOptBinary().charsetName().textOrIdentifier().identifier().IDENTIFIER_().getText());
+        if (null != ctx.fieldDefinition().dataType().charsetWithOptBinary() && null != ctx.fieldDefinition().dataType().charsetWithOptBinary().charsetName()) {
+            result.setCharsetName(new IdentifierValue(ctx.fieldDefinition().dataType().charsetWithOptBinary().charsetName().getStart().getText()).getValue());
         }
         ctx.fieldDefinition().columnAttribute().stream().filter(each -> null != each.collateClause()).findFirst()
-                .ifPresent(optional -> result.setCollateName(optional.collateClause().collationName().textOrIdentifier().identifier().IDENTIFIER_().getText()));
+                .ifPresent(optional -> result.setCollateName(new IdentifierValue(optional.collateClause().collationName().getStart().getText()).getValue()));
         return result;
     }
     
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalCaseSettings.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalCaseSettings.java
index 18743f81572..5fc76fb6968 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalCaseSettings.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalCaseSettings.java
@@ -44,6 +44,13 @@ public @interface ExternalCaseSettings {
      */
     String caseURL();
     
+    /**
+     * Get test case file name pattern.
+     *
+     * @return test case file name pattern
+     */
+    String caseRegex() default "";
+    
     /**
      * Get test case result URL.
      *
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalSQLParserIT.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalSQLParserIT.java
index 25e5dd7167e..837d8880a19 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalSQLParserIT.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/ExternalSQLParserIT.java
@@ -84,7 +84,7 @@ public abstract class ExternalSQLParserIT {
             URI resultURI = URI.create(settings.resultURL());
             ExternalTestParameterLoadTemplate loadTemplate = settings.template().getConstructor().newInstance();
             ExternalTestParameterLoader loader = new ExternalTestParameterLoader(loadStrategy, loadTemplate);
-            return loader.load(sqlCaseURI, resultURI, settings.value(), settings.reportType());
+            return loader.load(sqlCaseURI, resultURI, settings.value(), settings.reportType(), settings.caseRegex());
         }
     }
 }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/ExternalTestParameterLoader.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/ExternalTestParameterLoader.java
index d5d8b8cefa9..d46abe4fd0d 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/ExternalTestParameterLoader.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/ExternalTestParameterLoader.java
@@ -97,7 +97,7 @@ public final class ExternalTestParameterLoader {
         if (!Strings.isNullOrEmpty(githubToken)) {
             urlConnection.setRequestProperty("Authorization", "Bearer " + githubToken);
         }
-        try (BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()))) {
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), loadTemplate.getContentCharset()))) {
             return reader.lines().collect(Collectors.toList());
         }
     }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/template/ExternalTestParameterLoadTemplate.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/template/ExternalTestParameterLoadTemplate.java
index 0df6ffe81ac..ef96d58458c 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/template/ExternalTestParameterLoadTemplate.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/template/ExternalTestParameterLoadTemplate.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.test.it.sql.parser.external.loader.template;
 
 import org.apache.shardingsphere.test.it.sql.parser.external.ExternalSQLTestParameter;
 
+import java.nio.charset.Charset;
 import java.util.Collection;
 import java.util.List;
 
@@ -27,6 +28,15 @@ import java.util.List;
  */
 public interface ExternalTestParameterLoadTemplate {
     
+    /**
+     * Get charset used to read test and result files.
+     *
+     * @return content charset
+     */
+    default Charset getContentCharset() {
+        return Charset.defaultCharset();
+    }
+    
     /**
      * Load test parameters.
      *
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/template/dialect/MySQLExternalExternalTestParameterLoadTemplate.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/template/dialect/MySQLExternalExternalTestParameterLoadTemplate.java
index e269455830b..c0fb1ed18b1 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/template/dialect/MySQLExternalExternalTestParameterLoadTemplate.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/external/loader/template/dialect/MySQLExternalExternalTestParameterLoadTemplate.java
@@ -17,60 +17,231 @@
 
 package org.apache.shardingsphere.test.it.sql.parser.external.loader.template.dialect;
 
+import com.google.common.collect.ImmutableMap;
 import org.apache.shardingsphere.test.it.sql.parser.external.ExternalSQLTestParameter;
 import org.apache.shardingsphere.test.it.sql.parser.external.loader.SQLLineComment;
 import org.apache.shardingsphere.test.it.sql.parser.external.loader.template.ExternalTestParameterLoadTemplate;
 
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * External test parameter load template for MySQL.
  */
 public final class MySQLExternalExternalTestParameterLoadTemplate implements ExternalTestParameterLoadTemplate {
     
-    private static final int DELIMITER_COMMAND_LENGTH = "DELIMITER".length();
+    private static final int MYSQL_8_0_MAX_VERSION = 80099;
+    
+    private static final Pattern VERSION_COMMENT_PATTERN = Pattern.compile("/\\*!([0-9]{5}).*?\\*/", Pattern.DOTALL);
+    
+    private static final Pattern VERSION_COMMENT_START_PATTERN = Pattern.compile("/\\*!([0-9]{5})");
+    
+    private static final Pattern DELIMITER_COMMAND_PATTERN = Pattern.compile("(?i)(?:--\\s*)?delimiter\\s+(.+)");
+    
+    private static final Pattern CONNECTION_COMMAND_PATTERN = Pattern.compile("(?i)(connection|disconnect)\\s+[^\\s;]+\\s*;?");
+    
+    private static final Pattern FILE_COMMAND_PATTERN = Pattern.compile("(?i)(?:--\\s*)?(?:write_file|append_file)\\s+\\S+(?:\\s+(\\S+))?");
+    
+    private static final Pattern PERL_COMMAND_PATTERN = Pattern.compile("(?i)(?:--\\s*)?perl(?:\\s+(\\S+))?");
+    
+    private static final Pattern LET_COMMAND_PATTERN = Pattern.compile("(?i)let\\s+.*");
+    
+    private static final Pattern CONTROL_COMMAND_PATTERN = Pattern.compile("(?i)(?:if|while)\\s*\\(.*");
+    
+    private static final Pattern CHARACTER_SET_COMMAND_PATTERN = Pattern.compile("(?i)(?:--\\s*)?character_set\\s+([^\\s;]+);?");
+    
+    private static final Map<String, String> CHARSET_NAMES = ImmutableMap.<String, String>builder().put("utf8mb4", "UTF-8").put("utf8mb3", "UTF-8")
+            .put("binary", "ISO-8859-1").put("latin1", "windows-1252").put("latin2", "ISO-8859-2").put("koi8r", "KOI8-R").put("ujis", "EUC-JP").build();
+    
+    @Override
+    public Charset getContentCharset() {
+        return StandardCharsets.ISO_8859_1;
+    }
     
     @Override
     public Collection<ExternalSQLTestParameter> load(final String sqlCaseFileName, final List<String> sqlCaseFileContent,
                                                      final List<String> resultFileContent, final String databaseType, final String reportType) {
         Collection<ExternalSQLTestParameter> result = new LinkedList<>();
         List<String> lines = new ArrayList<>();
+        List<String> originalLines = new ArrayList<>();
         String delimiter = ";";
+        Charset charset = StandardCharsets.UTF_8;
+        int statementState = 0;
+        boolean blockComment = false;
+        String blockTerminator = null;
+        boolean letCommand = false;
+        boolean controlCommand = false;
         for (int i = 0; i < sqlCaseFileContent.size(); i++) {
             String line = sqlCaseFileContent.get(i).trim();
-            if (line.isEmpty() || lines.isEmpty() && SQLLineComment.isComment(line)) {
+            if (null != blockTerminator) {
+                if (line.equals(blockTerminator)) {
+                    blockTerminator = null;
+                }
                 continue;
             }
-            if (lines.isEmpty() && line.toUpperCase().startsWith("DELIMITER")) {
-                delimiter = getNewDelimiter(line, delimiter);
+            if (controlCommand) {
+                controlCommand = !line.endsWith("{");
+                continue;
+            }
+            if (letCommand) {
+                letCommand = !line.endsWith(delimiter);
+                continue;
+            }
+            String originalLine = line;
+            if (lines.isEmpty()) {
+                int sqlStartIndex = getSQLStartIndex(line, blockComment);
+                blockComment = -1 == sqlStartIndex;
+                if (blockComment) {
+                    continue;
+                }
+                line = line.substring(sqlStartIndex).trim();
+                if (sqlStartIndex > 0 && line.equals(delimiter)) {
+                    continue;
+                }
+                String command = line.endsWith(delimiter) ? line.substring(0, line.length() - delimiter.length()).trim() : line;
+                Matcher fileMatcher = FILE_COMMAND_PATTERN.matcher(command);
+                Matcher perlMatcher = PERL_COMMAND_PATTERN.matcher(command);
+                if (fileMatcher.matches()) {
+                    blockTerminator = null == fileMatcher.group(1) ? "EOF" : fileMatcher.group(1);
+                    continue;
+                }
+                if (perlMatcher.matches()) {
+                    blockTerminator = null == perlMatcher.group(1) ? "EOF" : perlMatcher.group(1);
+                    continue;
+                }
+                if (LET_COMMAND_PATTERN.matcher(line).matches()) {
+                    letCommand = !line.endsWith(delimiter);
+                    continue;
+                }
+                if (CONTROL_COMMAND_PATTERN.matcher(line).matches()) {
+                    controlCommand = !line.endsWith("{");
+                    continue;
+                }
+                if ("{".equals(line) || "}".equals(line)) {
+                    continue;
+                }
+                Matcher charsetMatcher = CHARACTER_SET_COMMAND_PATTERN.matcher(line);
+                if (charsetMatcher.matches()) {
+                    String charsetName = charsetMatcher.group(1).toLowerCase(Locale.ROOT);
+                    charset = Charset.forName(CHARSET_NAMES.getOrDefault(charsetName, charsetName));
+                    continue;
+                }
+                Matcher delimiterMatcher = DELIMITER_COMMAND_PATTERN.matcher(line);
+                if (delimiterMatcher.matches()) {
+                    delimiter = getNewDelimiter(delimiterMatcher.group(1), delimiter);
+                    continue;
+                }
+            }
+            if (line.isEmpty() || lines.isEmpty() && !isExecutableComment(line, 0) && (SQLLineComment.isComment(line) || CONNECTION_COMMAND_PATTERN.matcher(line).matches())) {
                 continue;
             }
             lines.add(line);
-            if (line.endsWith(delimiter)) {
-                if (resultFileContent.isEmpty() || existCorrectResultContent(resultFileContent, lines)) {
+            originalLines.add(originalLine);
+            statementState = getStatementState(decodeSQL(line, charset), statementState);
+            if (0 == statementState && line.endsWith(delimiter)) {
+                if (resultFileContent.isEmpty() || existCorrectResultContent(resultFileContent, originalLines)) {
                     String sqlCaseId = sqlCaseFileName + ":" + (i + 1);
                     String sql = String.join("\n", lines);
                     sql = sql.substring(0, sql.length() - delimiter.length());
-                    result.add(new ExternalSQLTestParameter(sqlCaseId, databaseType, sql, reportType));
+                    result.add(new ExternalSQLTestParameter(sqlCaseId, databaseType, normalizeVersionComments(decodeSQL(sql, charset)), reportType));
                 }
                 lines.clear();
+                originalLines.clear();
             }
         }
         return result;
     }
     
+    private int getSQLStartIndex(final String line, final boolean blockComment) {
+        int result = 0;
+        boolean comment = blockComment;
+        while (result < line.length()) {
+            if (comment || line.startsWith("/*", result) && !isExecutableComment(line, result)) {
+                int commentEndIndex = line.indexOf("*/", result);
+                if (-1 == commentEndIndex) {
+                    return -1;
+                }
+                result = commentEndIndex + 2;
+                comment = false;
+            } else if (line.charAt(result) <= ' ') {
+                result++;
+            } else {
+                break;
+            }
+        }
+        return comment ? -1 : result;
+    }
+    
+    private boolean isExecutableComment(final String line, final int startIndex) {
+        if (!line.startsWith("/*!", startIndex)) {
+            return false;
+        }
+        Matcher matcher = VERSION_COMMENT_START_PATTERN.matcher(line).region(startIndex, line.length());
+        return !matcher.lookingAt() || Integer.parseInt(matcher.group(1)) <= MYSQL_8_0_MAX_VERSION;
+    }
+    
     private String getNewDelimiter(final String sql, final String delimiter) {
-        String newDelimiter = sql.substring(DELIMITER_COMMAND_LENGTH, sql.endsWith(delimiter) ? sql.length() - delimiter.length() : sql.length()).trim();
+        String newDelimiter = sql.substring(0, sql.endsWith(delimiter) ? sql.length() - delimiter.length() : sql.length()).trim();
         if (newDelimiter.startsWith("\"") && newDelimiter.endsWith("\"") || newDelimiter.startsWith("'") && newDelimiter.endsWith("'")) {
             newDelimiter = newDelimiter.substring(1, newDelimiter.length() - 1);
         }
         return newDelimiter.isEmpty() ? delimiter : newDelimiter;
     }
     
+    private String decodeSQL(final String sql, final Charset charset) {
+        if ("windows-1252".equals(charset.name())) {
+            StringBuilder result = new StringBuilder(new String(sql.getBytes(StandardCharsets.ISO_8859_1), charset));
+            for (int i = 0; i < sql.length(); i++) {
+                char character = sql.charAt(i);
+                if (0x81 == character || 0x8D == character || 0x8F == character || 0x90 == character || 0x9D == character) {
+                    result.setCharAt(i, character);
+                }
+            }
+            return result.toString();
+        }
+        return new String(sql.getBytes(StandardCharsets.ISO_8859_1), charset);
+    }
+    
+    private int getStatementState(final String line, final int statementState) {
+        int result = statementState;
+        int i = 0;
+        while (i < line.length()) {
+            char each = line.charAt(i);
+            if (-1 == result) {
+                if ('*' == each && i + 1 < line.length() && '/' == line.charAt(i + 1)) {
+                    result = 0;
+                    i++;
+                }
+            } else if (0 == result && ('#' == each || line.startsWith("--", i) && (i + 2 == line.length() || Character.isWhitespace(line.charAt(i + 2))))) {
+                int lineEnd = line.indexOf('\n', i);
+                if (-1 == lineEnd) {
+                    break;
+                }
+                i = lineEnd;
+            } else if (0 == result && line.startsWith("/*", i)) {
+                result = -1;
+                i++;
+            } else if (0 != result && '\\' == each) {
+                i++;
+            } else if (0 == result && ('\'' == each || '"' == each || '`' == each)) {
+                result = each;
+            } else if (each == result) {
+                result = 0;
+            }
+            i++;
+        }
+        return result;
+    }
+    
     private boolean existCorrectResultContent(final List<String> resultLines, final List<String> sqlLines) {
         int nextLineIndex = findSQLNextLineIndex(resultLines, sqlLines);
         return -1 != nextLineIndex && (nextLineIndex == resultLines.size() || !resultLines.get(nextLineIndex).contains("ERROR"));
@@ -89,4 +260,20 @@ public final class MySQLExternalExternalTestParameterLoadTemplate implements Ext
         }
         return -1;
     }
+    
+    private String normalizeVersionComments(final String sql) {
+        StringBuilder result = new StringBuilder(sql);
+        Matcher matcher = VERSION_COMMENT_PATTERN.matcher(sql);
+        int statementState = 0;
+        int previousEnd = 0;
+        while (matcher.find()) {
+            statementState = getStatementState(sql.substring(previousEnd, matcher.start()), statementState);
+            if (0 == statementState && Integer.parseInt(matcher.group(1)) > MYSQL_8_0_MAX_VERSION) {
+                result.setCharAt(matcher.start() + 2, ' ');
+            }
+            statementState = getStatementState(matcher.group(), statementState);
+            previousEnd = matcher.end();
+        }
+        return result.toString();
+    }
 }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java
index 143ce925a22..f59702b6d91 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/segment/definition/ColumnDefinitionAssert.java
@@ -75,6 +75,12 @@ public final class ColumnDefinitionAssert {
         } else {
             assertNull(actual.getAggType(), assertContext.getText("Column definition agg type should not exist."));
         }
+        if (null != expected.getCharsetName()) {
+            assertThat(assertContext.getText("Column definition charset assertion error: "), actual.getCharsetName().orElse(""), is(expected.getCharsetName()));
+        }
+        if (null != expected.getCollateName()) {
+            assertThat(assertContext.getText("Column definition collation assertion error: "), actual.getCollateName().orElse(""), is(expected.getCollateName()));
+        }
     }
     
     private static void assertColumnName(final SQLCaseAssertContext assertContext, final ColumnDefinitionSegment actual, final ExpectedColumnDefinition expected) {
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/SQLStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/SQLStatementAssert.java
index 3515e42ce5b..3544e3243b5 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/SQLStatementAssert.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/SQLStatementAssert.java
@@ -47,6 +47,7 @@ import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.r
 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.rql.RQLStatementAssert;
 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.rul.RULStatementAssert;
 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.tcl.TCLStatementAssert;
+import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.CommonSQLStatementTestCase;
 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -75,6 +76,9 @@ public final class SQLStatementAssert {
             assertThat(assertContext.getText("Parameter markers size assertion error: "), actual.getParameterMarkers().size(), is(expected.getParameterMarkerCount()));
         }
         CommentAssert.assertComment(assertContext, actual, expected);
+        if (expected instanceof CommonSQLStatementTestCase) {
+            assertThat(assertContext.getText("Common SQL statement type assertion error: "), actual.getClass(), is(SQLStatement.class));
+        }
         if (actual instanceof DMLStatement) {
             DMLStatementAssert.assertIs(assertContext, (DMLStatement) actual, expected);
         } else if (actual instanceof DDLStatement) {
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dcl/standard/type/CreateUserStatementAssert.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dcl/standard/type/CreateUserStatementAssert.java
index ef9be414b1b..c2a55cd5287 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dcl/standard/type/CreateUserStatementAssert.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/asserts/statement/dcl/standard/type/CreateUserStatementAssert.java
@@ -19,10 +19,15 @@ package org.apache.shardingsphere.test.it.sql.parser.internal.asserts.statement.
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.sql.parser.statement.core.segment.dcl.UserSegment;
 import org.apache.shardingsphere.sql.parser.statement.core.statement.type.dcl.user.CreateUserStatement;
 import org.apache.shardingsphere.test.it.sql.parser.internal.asserts.SQLCaseAssertContext;
+import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.user.ExpectedUser;
 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dcl.standard.CreateUserStatementTestCase;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
 /**
  * Create user statement assert.
  */
@@ -37,5 +42,14 @@ public final class CreateUserStatementAssert {
      * @param expected expected create user statement test case
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, final CreateUserStatement actual, final CreateUserStatementTestCase expected) {
+        if (!expected.getUsers().isEmpty()) {
+            assertThat(assertContext.getText("User count assertion error: "), actual.getUsers().size(), is(expected.getUsers().size()));
+            int count = 0;
+            for (UserSegment each : actual.getUsers()) {
+                ExpectedUser expectedUser = expected.getUsers().get(count++);
+                assertThat(assertContext.getText("User name assertion error: "), each.getUser(), is(expectedUser.getName()));
+                assertThat(assertContext.getText("User host assertion error: "), each.getHost(), is(expectedUser.getHost()));
+            }
+        }
     }
 }
diff --git a/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/context/RouteStageContext.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/CommonSQLStatementTestCase.java
similarity index 81%
rename from infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/context/RouteStageContext.java
rename to test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/CommonSQLStatementTestCase.java
index 787c01b187b..e67de8e7bb9 100644
--- a/infra/route/core/src/main/java/org/apache/shardingsphere/infra/route/context/RouteStageContext.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/CommonSQLStatementTestCase.java
@@ -15,10 +15,10 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.infra.route.context;
+package org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb;
 
 /**
- * Route stage context.
+ * Common SQL statement test case.
  */
-public interface RouteStageContext {
+public final class CommonSQLStatementTestCase extends SQLParserTestCase {
 }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
index a671dc9ad28..1be2956c4ed 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/RootSQLParserTestCases.java
@@ -1590,6 +1590,9 @@ public final class RootSQLParserTestCases {
     @XmlElement(name = "reset")
     private final List<MySQLResetStatementTestCase> resetTestCases = new LinkedList<>();
     
+    @XmlElement(name = "common-statement")
+    private final List<CommonSQLStatementTestCase> commonStatementTestCases = new LinkedList<>();
+    
     @XmlElement(name = "reset-persist")
     private final List<MySQLResetPersistStatementTestCase> resetPersistTestCases = new LinkedList<>();
     
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java
index c0d51b4c2da..8d8a068baa7 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/definition/ExpectedColumnDefinition.java
@@ -63,4 +63,10 @@ public final class ExpectedColumnDefinition extends AbstractExpectedSQLSegment {
     
     @XmlAttribute(name = "agg-type")
     private String aggType;
+    
+    @XmlAttribute(name = "charset-name")
+    private String charsetName;
+    
+    @XmlAttribute(name = "collate-name")
+    private String collateName;
 }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/user/ExpectedUser.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/user/ExpectedUser.java
index 59883342086..24c40812e8b 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/user/ExpectedUser.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/segment/impl/user/ExpectedUser.java
@@ -32,4 +32,7 @@ public final class ExpectedUser extends AbstractExpectedSQLSegment {
     
     @XmlAttribute
     private String name;
+    
+    @XmlAttribute
+    private String host;
 }
diff --git a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dcl/standard/CreateUserStatementTestCase.java b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dcl/standard/CreateUserStatementTestCase.java
index d2e0782df2e..4b34d73a31b 100644
--- a/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dcl/standard/CreateUserStatementTestCase.java
+++ b/test/it/parser/src/main/java/org/apache/shardingsphere/test/it/sql/parser/internal/cases/parser/jaxb/statement/dcl/standard/CreateUserStatementTestCase.java
@@ -17,10 +17,20 @@
 
 package org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.statement.dcl.standard;
 
+import lombok.Getter;
 import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.SQLParserTestCase;
+import org.apache.shardingsphere.test.it.sql.parser.internal.cases.parser.jaxb.segment.impl.user.ExpectedUser;
+
+import javax.xml.bind.annotation.XmlElement;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
  * Create user statement test case.
  */
+@Getter
 public final class CreateUserStatementTestCase extends SQLParserTestCase {
+    
+    @XmlElement(name = "user")
+    private final List<ExpectedUser> users = new LinkedList<>();
 }
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/load-xml.xml b/test/it/parser/src/main/resources/case/dal/get-diagnostics.xml
similarity index 58%
copy from test/it/parser/src/main/resources/sql/supported/dml/load-xml.xml
copy to test/it/parser/src/main/resources/case/dal/get-diagnostics.xml
index b47d7ffa856..cdb11bca0e2 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/load-xml.xml
+++ b/test/it/parser/src/main/resources/case/dal/get-diagnostics.xml
@@ -16,9 +16,8 @@
   ~ limitations under the License.
   -->
 
-<sql-cases>
-    <sql-case id="load_xml_into_table_from_server_file" value="LOAD XML INFILE '/temp/test.xml' INTO TABLE t_order" db-types="MySQL,Doris" />
-    <sql-case id="load_xml_into_table_from_local_file" value="LOAD XML LOCAL INFILE '/temp/test.xml' INTO TABLE t_order" db-types="MySQL,Doris" />
-    <sql-case id="load_xml_into_table_with_schema_name" value="LOAD XML INFILE '/temp/test.xml' INTO TABLE sharding_db.t_order" db-types="MySQL,Doris" />
-    <sql-case id="load_xml_into_table_with_ignore_lines" value="LOAD XML INFILE '/tmp/test.xml' INTO TABLE t_order IGNORE 1 LINES" db-types="MySQL" />
-</sql-cases>
+<sql-parser-test-cases>
+    <common-statement sql-case-id="get_diagnostics_statement" />
+    <common-statement sql-case-id="get_current_diagnostics_condition" />
+    <common-statement sql-case-id="get_stacked_diagnostics_condition" />
+</sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/dal/install.xml b/test/it/parser/src/main/resources/case/dal/install.xml
index 11dfdb60bcd..96e2b916e50 100644
--- a/test/it/parser/src/main/resources/case/dal/install.xml
+++ b/test/it/parser/src/main/resources/case/dal/install.xml
@@ -78,4 +78,11 @@
             <property key="auto_load" value="false" />
         </plugin>
     </install-plugin>
+    <install-component sql-case-id="install_component_set_global">
+        <component name="file://component1" start-index="18" stop-index="36" />
+    </install-component>
+
+    <install-component sql-case-id="install_component_set_persist">
+        <component name="file://component1" start-index="18" stop-index="36" />
+    </install-component>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/dcl/create-user.xml b/test/it/parser/src/main/resources/case/dcl/create-user.xml
index 0f6b9538dea..263e60b9b15 100644
--- a/test/it/parser/src/main/resources/case/dcl/create-user.xml
+++ b/test/it/parser/src/main/resources/case/dcl/create-user.xml
@@ -105,4 +105,11 @@
     <create-user sql-case-id="create_user_password_require_current_default_doris" />
     <create-user sql-case-id="create_user_failed_login_and_lock_time_doris" />
     <create-user sql-case-id="create_user_password_lock_time_unbounded_doris" />
+    <create-user sql-case-id="create_user_unquoted_dotted_host">
+        <user name="u" host="host.example.com" />
+    </create-user>
+
+    <create-user sql-case-id="create_user_empty_host">
+        <user name="u" host="" />
+    </create-user>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/dcl/grant.xml b/test/it/parser/src/main/resources/case/dcl/grant.xml
index 3f07e16a830..abd8af5584f 100644
--- a/test/it/parser/src/main/resources/case/dcl/grant.xml
+++ b/test/it/parser/src/main/resources/case/dcl/grant.xml
@@ -315,4 +315,7 @@
         <table name="t_order" start-index="27" stop-index="33" />
         <column name="order_id" start-index="14" stop-index="21" />
     </grant>
+    <grant sql-case-id="grant_global_spaced_wildcard" />
+
+    <grant sql-case-id="grant_database_spaced_wildcard" />
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/ddl/create-function.xml b/test/it/parser/src/main/resources/case/ddl/create-function.xml
index 703e741287b..de7d86ad30b 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-function.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-function.xml
@@ -212,4 +212,5 @@
             <sql-statement start-index="184" stop-index="359" statement-class-simple-name="SelectStatement" />
         </sql-statements>
     </create-function>
+    <create-function sql-case-id="create_function_if_not_exists_mysql" />
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/ddl/create-procedure.xml b/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
index 407afce7268..301f6ead50b 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-procedure.xml
@@ -367,4 +367,5 @@
         <valid-statement type="UpdateStatement" />
         <valid-statement type="RollbackStatement" />
     </create-procedure>
+    <create-procedure sql-case-id="create_procedure_flush_kill" />
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/ddl/create-table.xml b/test/it/parser/src/main/resources/case/ddl/create-table.xml
index 28d6093fc5a..b6a12c309c7 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-table.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-table.xml
@@ -5743,4 +5743,132 @@
             <column name="SEQ" />
         </column-definition>
     </create-table>
+    <create-table sql-case-id="create_table_column_charset_variants">
+        <table start-index="13" stop-index="14" name="t1" />
+        <column-definition start-index="17" stop-index="37" type="VARCHAR" charset-name="" collate-name="">
+            <column name="c1" />
+        </column-definition>
+        <column-definition start-index="40" stop-index="55" type="CHAR" charset-name="" collate-name="">
+            <column name="c2" />
+        </column-definition>
+        <column-definition start-index="58" stop-index="75" type="CHAR" charset-name="" collate-name="">
+            <column name="c3" />
+        </column-definition>
+        <column-definition start-index="78" stop-index="92" type="CHAR" charset-name="" collate-name="">
+            <column name="c4" />
+        </column-definition>
+        <column-definition start-index="95" stop-index="128" type="CHAR" charset-name="utf8mb4" collate-name="">
+            <column name="c5" />
+        </column-definition>
+        <column-definition start-index="131" stop-index="161" type="CHAR" charset-name="BINARY" collate-name="">
+            <column name="c6" />
+        </column-definition>
+        <column-definition start-index="164" stop-index="188" type="CHAR" charset-name="" collate-name="BINARY">
+            <column name="c7" />
+        </column-definition>
+        <column-definition start-index="191" stop-index="222" type="CHAR" charset-name="" collate-name="utf8mb4_bin">
+            <column name="c8" />
+        </column-definition>
+    </create-table>
+
+    <create-table sql-case-id="create_table_unnamed_check_constraint">
+        <table start-index="13" stop-index="14" name="t1" />
+        <column-definition start-index="17" stop-index="22" type="INT">
+            <column name="c1" />
+        </column-definition>
+        <constraint-definition start-index="25" stop-index="49" />
+    </create-table>
+
+    <create-table sql-case-id="create_table_long_varchar">
+        <table start-index="13" stop-index="14" name="t1" />
+        <column-definition start-index="17" stop-index="31" type="LONG VARCHAR">
+            <column name="c1" />
+        </column-definition>
+    </create-table>
+
+    <create-table sql-case-id="create_table_convert_using_binary">
+        <table start-index="13" stop-index="14" name="t1" />
+        <select>
+            <projections start-index="26" stop-index="58">
+                <expression-projection start-index="26" stop-index="58" text="CONVERT('abc' USING BINARY)" alias="c1">
+                    <expr>
+                        <function start-index="26" stop-index="52" function-name="CONVERT" text="CONVERT('abc' USING BINARY)">
+                            <parameter>
+                                <literal-expression start-index="34" stop-index="38" value="abc" />
+                            </parameter>
+                            <parameter>
+                                <literal-expression start-index="46" stop-index="51" value="BINARY" />
+                            </parameter>
+                        </function>
+                    </expr>
+                </expression-projection>
+            </projections>
+        </select>
+    </create-table>
+
+    <create-table sql-case-id="create_table_integer_type_aliases">
+        <table name="t" start-index="13" stop-index="13" />
+        <column-definition type="INT1" start-index="16" stop-index="21">
+            <column name="a" />
+        </column-definition>
+        <column-definition type="INT2" start-index="24" stop-index="29">
+            <column name="b" />
+        </column-definition>
+        <column-definition type="INT3" start-index="32" stop-index="37">
+            <column name="c" />
+        </column-definition>
+        <column-definition type="INT4" start-index="40" stop-index="45">
+            <column name="d" />
+        </column-definition>
+        <column-definition type="INT8" start-index="48" stop-index="53">
+            <column name="e" />
+        </column-definition>
+        <column-definition type="LONG" start-index="56" stop-index="61">
+            <column name="f" />
+        </column-definition>
+    </create-table>
+
+    <create-table sql-case-id="create_table_now_default_update">
+        <table name="t" start-index="13" stop-index="13" />
+        <column-definition type="TIMESTAMP" start-index="16" stop-index="58">
+            <column name="a" />
+        </column-definition>
+    </create-table>
+
+    <create-table sql-case-id="create_table_empty_merge_union">
+        <table name="t" start-index="13" stop-index="13" />
+        <column-definition type="INT" start-index="16" stop-index="20">
+            <column name="a" />
+        </column-definition>
+        <create-table-option start-index="23" stop-index="30" />
+    </create-table>
+
+    <create-table sql-case-id="create_table_partition_nodegroup">
+        <table name="t" start-index="13" stop-index="13" />
+        <column-definition type="INT" start-index="16" stop-index="20">
+            <column name="a" />
+        </column-definition>
+    </create-table>
+
+    <create-table sql-case-id="create_table_dollar_identifiers">
+        <table name="t" start-index="13" stop-index="13" />
+        <column-definition type="INT" start-index="16" stop-index="22">
+            <column name="$$a" />
+        </column-definition>
+        <column-definition type="INT" start-index="25" stop-index="32">
+            <column name="b$$c" />
+        </column-definition>
+        <column-definition type="INT" start-index="35" stop-index="43">
+            <column name="$$d$$" />
+        </column-definition>
+    </create-table>
+
+    <create-table sql-case-id="create_table_digit_identifiers">
+        <table name="1a20" start-index="13" stop-index="19">
+            <owner name="db" start-index="13" stop-index="14" />
+        </table>
+        <column-definition type="INT" start-index="22" stop-index="29">
+            <column name="1a20" />
+        </column-definition>
+    </create-table>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/ddl/create-trigger.xml b/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
index 0e43bf26e83..7a90953182c 100644
--- a/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
+++ b/test/it/parser/src/main/resources/case/ddl/create-trigger.xml
@@ -105,4 +105,5 @@
     <create-trigger sql-case-id="create_trigger_pg_constraint">
         <table name="t_merge_target" start-index="31" stop-index="44" />
     </create-trigger>
+    <create-trigger sql-case-id="create_trigger_if_not_exists_mysql" />
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/dml/load-xml.xml b/test/it/parser/src/main/resources/case/dml/load-xml.xml
index df79b4762eb..a119929a3e0 100644
--- a/test/it/parser/src/main/resources/case/dml/load-xml.xml
+++ b/test/it/parser/src/main/resources/case/dml/load-xml.xml
@@ -31,4 +31,7 @@
     <load-xml sql-case-id="load_xml_into_table_with_ignore_lines">
         <table name="t_order" start-index="43" stop-index="49" />
     </load-xml>
+    <load-xml sql-case-id="load_xml_rows_identified_by">
+        <table name="t" start-index="38" stop-index="38" />
+    </load-xml>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/case/dml/select-special-function.xml b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
index f0767e643fd..8b1093d2105 100644
--- a/test/it/parser/src/main/resources/case/dml/select-special-function.xml
+++ b/test/it/parser/src/main/resources/case/dml/select-special-function.xml
@@ -6948,4 +6948,176 @@
         </projections>
     </select>
 
+    <select sql-case-id="timestampadd_sql_tsi_unit">
+        <from>
+            <simple-table start-index="56" stop-index="62" name="t_order" />
+        </from>
+        <projections start-index="7" stop-index="49">
+            <expression-projection start-index="7" stop-index="49" text="TIMESTAMPADD(SQL_TSI_SECOND, 1, order_date)">
+                <expr>
+                    <function start-index="7" stop-index="49" function-name="TIMESTAMPADD" text="TIMESTAMPADD(SQL_TSI_SECOND, 1, order_date)">
+                        <parameter>
+                            <interval-unit-expression start-index="20" stop-index="33">
+                                <interval-unit>SECOND</interval-unit>
+                            </interval-unit-expression>
+                        </parameter>
+                        <parameter>
+                            <literal-expression start-index="36" stop-index="36" value="1" />
+                        </parameter>
+                        <parameter>
+                            <column start-index="39" stop-index="48" name="order_date" />
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+
+    <select sql-case-id="timestampdiff_sql_tsi_unit">
+        <from>
+            <simple-table start-index="64" stop-index="70" name="t_order" />
+        </from>
+        <projections start-index="7" stop-index="57">
+            <expression-projection start-index="7" stop-index="57" text="TIMESTAMPDIFF(SQL_TSI_MINUTE, start_time, end_time)">
+                <expr>
+                    <function start-index="7" stop-index="57" function-name="TIMESTAMPDIFF" text="TIMESTAMPDIFF(SQL_TSI_MINUTE, start_time, end_time)">
+                        <parameter>
+                            <interval-unit-expression start-index="21" stop-index="34">
+                                <interval-unit>MINUTE</interval-unit>
+                            </interval-unit-expression>
+                        </parameter>
+                        <parameter>
+                            <column start-index="37" stop-index="46" name="start_time" />
+                        </parameter>
+                        <parameter>
+                            <column start-index="49" stop-index="56" name="end_time" />
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+
+    <select sql-case-id="select_cast_float_precision">
+        <projections start-index="7" stop-index="26">
+            <expression-projection text="CAST(1 AS FLOAT(24))" start-index="7" stop-index="26">
+                <expr>
+                    <function function-name="CAST" text="CAST(1 AS FLOAT(24))" start-index="7" stop-index="26">
+                        <parameter>
+                            <literal-expression value="1" start-index="12" stop-index="12" />
+                        </parameter>
+                        <parameter>
+                            <data-type value="FLOAT" start-index="17" stop-index="25">
+                                <data-type-length precision="24" start-index="22" stop-index="25" />
+                            </data-type>
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+
+    <select sql-case-id="select_variance_all">
+        <projections start-index="7" stop-index="21">
+            <expression-projection text="VARIANCE(ALL 1)" start-index="7" stop-index="21">
+                <expr>
+                    <function function-name="VARIANCE" text="VARIANCE(ALL 1)" start-index="7" stop-index="21">
+                        <parameter>
+                            <literal-expression value="1" start-index="20" stop-index="20" />
+                        </parameter>
+                    </function>
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+
+    <select sql-case-id="select_trailing_decimal">
+        <projections start-index="7" stop-index="8">
+            <expression-projection text="8" start-index="7" stop-index="8">
+                <expr>
+                    <literal-expression value="8" start-index="7" stop-index="8" />
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+
+    <select sql-case-id="select_spaced_qualified_shorthand">
+        <projections start-index="7" stop-index="11">
+            <shorthand-projection start-index="7" stop-index="11">
+                <owner name="t" start-index="7" stop-index="7" />
+            </shorthand-projection>
+        </projections>
+        <from>
+            <simple-table name="t" start-index="18" stop-index="18" />
+        </from>
+    </select>
+
+    <select sql-case-id="select_json_table_exists_path">
+        <projections start-index="7" stop-index="7">
+            <shorthand-projection start-index="7" stop-index="7" />
+        </projections>
+        <from>
+            <function-table start-index="14" stop-index="95" table-alias="t">
+                <table-function function-name="JSON_TABLE" text="JSON_TABLE('[]', '$[*]' COLUMNS (id FOR ORDINALITY, p INT EXISTS PATH '$.a'))">
+                    <parameter>
+                        <literal-expression value="[]" start-index="25" stop-index="28" />
+                    </parameter>
+                    <parameter>
+                        <literal-expression value="$[*]" start-index="31" stop-index="36" />
+                    </parameter>
+                    <parameter>
+                        <literal-expression value="COLUMNS (id FOR ORDINALITY, p INT EXISTS PATH '$.a')" start-index="38" stop-index="89" />
+                    </parameter>
+                </table-function>
+            </function-table>
+        </from>
+    </select>
+    <select sql-case-id="select_qualified_digit_identifier">
+        <projections start-index="7" stop-index="16">
+            <column-projection name="1a20" start-index="7" stop-index="16">
+                <owner name="event" start-index="7" stop-index="11" />
+            </column-projection>
+        </projections>
+        <from>
+            <simple-table name="event" start-index="23" stop-index="27" />
+        </from>
+    </select>
+    <select sql-case-id="select_leading_decimal_alias">
+        <projections start-index="7" stop-index="22">
+            <expression-projection text="0.0" alias="$p" start-index="7" stop-index="10">
+                <expr>
+                    <literal-expression value="0.0" start-index="7" stop-index="8" />
+                </expr>
+            </expression-projection>
+            <expression-projection text="0.1" alias="a20" start-index="13" stop-index="17">
+                <expr>
+                    <literal-expression value="0.1" start-index="13" stop-index="14" />
+                </expr>
+            </expression-projection>
+            <expression-projection text="0.2" alias="_" start-index="20" stop-index="22">
+                <expr>
+                    <literal-expression value="0.2" start-index="20" stop-index="21" />
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
+    <select sql-case-id="select_qualified_scientific_identifier">
+        <projections start-index="7" stop-index="18">
+            <column-projection name="1e1a20" start-index="7" stop-index="18">
+                <owner name="event" start-index="7" stop-index="11" />
+            </column-projection>
+        </projections>
+        <from>
+            <simple-table name="event" start-index="25" stop-index="29" />
+        </from>
+    </select>
+    <select sql-case-id="select_leading_scientific_alias">
+        <projections start-index="7" stop-index="13">
+            <expression-projection text="1" alias="a20" start-index="7" stop-index="13">
+                <expr>
+                    <literal-expression value="1" start-index="7" stop-index="10" />
+                </expr>
+            </expression-projection>
+        </projections>
+    </select>
 </sql-parser-test-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/load-xml.xml b/test/it/parser/src/main/resources/sql/supported/dal/get-diagnostics.xml
similarity index 59%
copy from test/it/parser/src/main/resources/sql/supported/dml/load-xml.xml
copy to test/it/parser/src/main/resources/sql/supported/dal/get-diagnostics.xml
index b47d7ffa856..00604c9a918 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/load-xml.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dal/get-diagnostics.xml
@@ -17,8 +17,7 @@
   -->
 
 <sql-cases>
-    <sql-case id="load_xml_into_table_from_server_file" value="LOAD XML INFILE '/temp/test.xml' INTO TABLE t_order" db-types="MySQL,Doris" />
-    <sql-case id="load_xml_into_table_from_local_file" value="LOAD XML LOCAL INFILE '/temp/test.xml' INTO TABLE t_order" db-types="MySQL,Doris" />
-    <sql-case id="load_xml_into_table_with_schema_name" value="LOAD XML INFILE '/temp/test.xml' INTO TABLE sharding_db.t_order" db-types="MySQL,Doris" />
-    <sql-case id="load_xml_into_table_with_ignore_lines" value="LOAD XML INFILE '/tmp/test.xml' INTO TABLE t_order IGNORE 1 LINES" db-types="MySQL" />
+    <sql-case id="get_diagnostics_statement" value="GET DIAGNOSTICS @n = NUMBER, @c = ROW_COUNT" db-types="MySQL" />
+    <sql-case id="get_current_diagnostics_condition" value="GET CURRENT DIAGNOSTICS CONDITION 1 @e = MYSQL_ERRNO, @m = MESSAGE_TEXT" db-types="MySQL" />
+    <sql-case id="get_stacked_diagnostics_condition" value="GET STACKED DIAGNOSTICS CONDITION @n @s = RETURNED_SQLSTATE" db-types="MySQL" />
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dal/install.xml b/test/it/parser/src/main/resources/sql/supported/dal/install.xml
index 12b9a35cc48..dac7f0c68d0 100644
--- a/test/it/parser/src/main/resources/sql/supported/dal/install.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dal/install.xml
@@ -28,4 +28,8 @@
     <sql-case id="install_plugin_with_null" value="INSTALL PLUGIN FROM &quot;/path/to/plugin.zip&quot; PROPERTIES (&quot;description&quot; = NULL)" db-types="Doris" />
     <sql-case id="install_plugin_multiple_properties" value="INSTALL PLUGIN FROM &quot;/path/to/plugin.zip&quot; PROPERTIES (&quot;md5sum&quot; = &quot;abc123&quot;, &quot;timeout&quot; = 30)" db-types="Doris" />
     <sql-case id="install_plugin_mixed_types" value="INSTALL PLUGIN FROM &quot;/path/to/plugin.zip&quot; PROPERTIES (&quot;md5sum&quot; = &quot;abc123&quot;, &quot;timeout&quot; = 30, &quot;auto_load&quot; = false)" db-types="Doris" />
+    <sql-case id="install_component_set_global" value="INSTALL COMPONENT 'file://component1' SET GLOBAL component1.var1=1, component1.var2=DEFAULT" db-types="MySQL,Doris" />
+
+    <sql-case id="install_component_set_persist" value="INSTALL COMPONENT 'file://component1' SET PERSIST component1.var1=1, component1.var2=DEFAULT" db-types="MySQL,Doris" />
+
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dcl/create-user.xml b/test/it/parser/src/main/resources/sql/supported/dcl/create-user.xml
index 3dfb310c5f6..e827c8b393b 100644
--- a/test/it/parser/src/main/resources/sql/supported/dcl/create-user.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dcl/create-user.xml
@@ -105,4 +105,8 @@
     <sql-case id="create_user_with_user_auth_option" value="CREATE USER 'mateo'@'localhost' IDENTIFIED BY 'password'
        AND IDENTIFIED WITH authentication_ldap_simple
        AND IDENTIFIED WITH authentication_fido" db-types="MySQL" />
+    <sql-case id="create_user_unquoted_dotted_host" value="CREATE USER u@host.example.com DEFAULT ROLE r@host.example.com" db-types="MySQL,Doris" />
+
+    <sql-case id="create_user_empty_host" value="CREATE USER u@" db-types="MySQL,Doris" />
+
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dcl/grant-user.xml b/test/it/parser/src/main/resources/sql/supported/dcl/grant-user.xml
index ecc83928f43..62199a5a798 100644
--- a/test/it/parser/src/main/resources/sql/supported/dcl/grant-user.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dcl/grant-user.xml
@@ -181,4 +181,8 @@
     <sql-case id="grant_drop_role_privilege_doris" value="GRANT DROP ROLE ON *.* TO user1" db-types="Doris" />
     <sql-case id="grant_select_on_table_doris" value="GRANT SELECT ON db1.t_order TO user1" db-types="Doris" />
     <sql-case id="grant_select_sql92" value="GRANT SELECT (order_id) ON t_order TO user1" db-types="SQL92" />
+    <sql-case id="grant_global_spaced_wildcard" value="GRANT SELECT ON * . * TO u@localhost" db-types="MySQL,Doris" />
+
+    <sql-case id="grant_database_spaced_wildcard" value="GRANT SELECT ON db . * TO u@localhost" db-types="MySQL,Doris" />
+
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml b/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml
index d1231b23c04..0242aa297af 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-function.xml
@@ -143,4 +143,7 @@
     <sql-case id="create_function_gtid_intersection" value="CREATE FUNCTION GTID_INTERSECTION(gs1 LONGTEXT, gs2 LONGTEXT) RETURNS LONGTEXT RETURN GTID_SUBTRACT(gs1, GTID_SUBTRACT(gs1, gs2));" db-types="MySQL" />
     <sql-case id="create_function_gtid_intersection_with_uuid" value="CREATE FUNCTION GTID_INTERSECTION_WITH_UUID(gs LONGTEXT, uuid TEXT) RETURNS LONGTEXT RETURN GTID_SUBTRACT(gs, GTID_SUBTRACT_UUID(gs, uuid));" db-types="MySQL" />
     <sql-case id="create_function_with_nested_exception_block_in_if_statement" value="CREATE OR REPLACE FUNCTION AF_GETWBANDTYPE(in_Telnum varchar2) return varchar2 as Result varchar2(10); v_hastv varchar2(1) := ''; begin Result := ''; if v_hastv is not null then begin select count(1) into Result from subs_product a where a.subsid = (select subsid from subscriber c where c.servnumber = in_Telnum) and a.startdate &lt;> nvl(a.enddate, sysdate + 1); EXCEPTION WHEN OTHERS THEN NULL; end; end [...]
+    <sql-case id="create_function_if_not_exists_mysql" value="CREATE FUNCTION IF NOT EXISTS f() RETURNS INT RETURN 1" db-types="MySQL,Doris" />
+
+
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml b/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml
index 6687c84b1da..be68e0e9de1 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-procedure.xml
@@ -127,4 +127,6 @@
     <sql-case id="create_procedure_with_dml_routine_body_table_visitor_oracle" value="CREATE OR REPLACE PROCEDURE P_E2E_RDL_SHOW_OBJECT(P_ID IN NUMBER, P_PASSWORD IN VARCHAR2) IS BEGIN INSERT INTO T_E2E_RDL_SHOW_OBJECT (ID, PASSWORD) VALUES (P_ID, P_PASSWORD); END;" db-types="Oracle" />
     <sql-case id="create_procedure_with_insert_select_routine_body_table_visitor_oracle" value="CREATE OR REPLACE PROCEDURE std_view_select_insert_user(var_user_id IN NUMBER, var_password IN VARCHAR2) IS BEGIN EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY-MM-DD'''; DELETE FROM t_user; INSERT INTO t_user (user_id, user_name, password, email, telephone, creation_date) VALUES (100, 'zhangsan', var_password, 'zhangsan@gmail.com', '12345678900', DATE '2017-08-08'); INSERT INTO [...]
     <sql-case id="create_procedure_with_cursor_fetch_and_package_call" value="CREATE OR REPLACE PROCEDURE CRM_CONTACTINFOR is v_count number; v_SEQ VARCHAR2(200); v_mobileno VARCHAR2(20); v_CUSTID VARCHAR2(200); cursor c_contactinfor is select con.SEQ_CONTACT_INFO, con.mobileno, sub.userid from subscriber sub, t_cm_contact_info con, customer cus where sub.servnumber = con.mobileno and cus.custid = con.custid; BEGIN OPEN c_contactinfor; LOOP FETCH c_contactinfor INTO v_SEQ, v_mobileno, v_ [...]
+    <sql-case id="create_procedure_flush_kill" value="CREATE PROCEDURE p() BEGIN FLUSH STATUS; KILL @connection_id; END" db-types="MySQL,Doris" />
+
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml b/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
index a3e5e6ba2a6..ddb4b948d7b 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-table.xml
@@ -791,4 +791,20 @@ WHERE time_id &gt;=  TO_DATE('01-JAN-1998','dd-mon-yyyy')
     <sql-case id="create_table_pg_as_select" value="CREATE TABLE t_order_new AS SELECT * FROM t_order" db-types="PostgreSQL" />
     <sql-case id="create_table_pg_temp_as_select_with_no_data" value="CREATE TEMPORARY TABLE t_order_tmp AS SELECT order_id, status FROM t_order WITH NO DATA" db-types="PostgreSQL" />
     <sql-case id="create_table_mv_capabilities_with_line_comments" value="CREATE TABLE MV_CAPABILITIES_TABLE (STATEMENT_ID      VARCHAR(30),   -- Client-supplied unique statement identifier&#x000A; MVOWNER           VARCHAR(30),   -- NULL for SELECT based EXPLAIN_MVIEW&#x000A; MVNAME            VARCHAR(30),   -- NULL for SELECT based EXPLAIN_MVIEW&#x000A; CAPABILITY_NAME   VARCHAR(30),   -- A descriptive name of the capability&#x000A; POSSIBLE          CHARACTER(1),  -- T = capability is [...]
+    <sql-case id="create_table_column_charset_variants" value="CREATE TABLE t1 (c1 VARCHAR(16) BINARY, c2 CHAR(8) ASCII, c3 CHAR(8) UNICODE, c4 CHAR(8) BYTE, c5 CHAR(8) CHARACTER SET 'utf8mb4', c6 CHAR(8) CHARACTER SET BINARY, c7 CHAR(8) COLLATE BINARY, c8 CHAR(8) COLLATE 'utf8mb4_bin')" db-types="MySQL" />
+    <sql-case id="create_table_unnamed_check_constraint" value="CREATE TABLE t1 (c1 INT, CONSTRAINT CHECK (c1 &gt; 0))" db-types="MySQL,Doris" />
+    <sql-case id="create_table_long_varchar" value="CREATE TABLE t1 (c1 LONG VARCHAR)" db-types="MySQL,Doris" />
+    <sql-case id="create_table_convert_using_binary" value="CREATE TABLE t1 AS SELECT CONVERT('abc' USING BINARY) AS c1" db-types="MySQL" />
+    <sql-case id="create_table_integer_type_aliases" value="CREATE TABLE t (a INT1, b INT2, c INT3, d INT4, e INT8, f LONG)" db-types="MySQL,Doris" />
+
+    <sql-case id="create_table_now_default_update" value="CREATE TABLE t (a TIMESTAMP DEFAULT NOW(3) ON UPDATE NOW(3))" db-types="MySQL,Doris" />
+
+    <sql-case id="create_table_empty_merge_union" value="CREATE TABLE t (a INT) UNION=()" db-types="MySQL,Doris" />
+
+    <sql-case id="create_table_partition_nodegroup" value="CREATE TABLE t (a INT) PARTITION BY HASH(a) (PARTITION p0 NODEGROUP=0)" db-types="MySQL,Doris" />
+
+    <sql-case id="create_table_dollar_identifiers" value="CREATE TABLE t ($$a INT, b$$c INT, $$d$$ INT)" db-types="MySQL" />
+
+    <sql-case id="create_table_digit_identifiers" value="CREATE TABLE db.1a20 (1a20 INT)" db-types="MySQL,Doris" />
+
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml b/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
index 7776a79c802..21159f4ce41 100644
--- a/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
+++ b/test/it/parser/src/main/resources/sql/supported/ddl/create-trigger.xml
@@ -137,4 +137,6 @@ END;" db-types="Oracle" />
     <sql-case id="create_trigger_pg_after_insert" value="CREATE TRIGGER t_merge_trigger AFTER INSERT ON t_merge_target FOR EACH ROW EXECUTE FUNCTION merge_notify()" db-types="PostgreSQL" />
     <sql-case id="create_trigger_pg_multi_events_when" value="CREATE TRIGGER check_update BEFORE INSERT OR DELETE ON t_merge_target FOR EACH ROW WHEN (order_id = 1) EXECUTE PROCEDURE process_order_audit()" db-types="PostgreSQL" />
     <sql-case id="create_trigger_pg_constraint" value="CREATE CONSTRAINT TRIGGER FROM t_merge_target DEFERRABLE FOR EACH ROW WHEN (order_id = 1) EXECUTE FUNCTION merge_notify()" db-types="PostgreSQL" />
+    <sql-case id="create_trigger_if_not_exists_mysql" value="CREATE TRIGGER IF NOT EXISTS tr BEFORE INSERT ON t FOR EACH ROW SET @a=1" db-types="MySQL,Doris" />
+
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/load-xml.xml b/test/it/parser/src/main/resources/sql/supported/dml/load-xml.xml
index b47d7ffa856..de490204928 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/load-xml.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/load-xml.xml
@@ -21,4 +21,6 @@
     <sql-case id="load_xml_into_table_from_local_file" value="LOAD XML LOCAL INFILE '/temp/test.xml' INTO TABLE t_order" db-types="MySQL,Doris" />
     <sql-case id="load_xml_into_table_with_schema_name" value="LOAD XML INFILE '/temp/test.xml' INTO TABLE sharding_db.t_order" db-types="MySQL,Doris" />
     <sql-case id="load_xml_into_table_with_ignore_lines" value="LOAD XML INFILE '/tmp/test.xml' INTO TABLE t_order IGNORE 1 LINES" db-types="MySQL" />
+    <sql-case id="load_xml_rows_identified_by" value="LOAD XML INFILE 'test.xml' INTO TABLE t ROWS IDENTIFIED BY '&lt;row&gt;'" db-types="MySQL,Doris" />
+
 </sql-cases>
diff --git a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
index 6149d8265da..141cc259d85 100644
--- a/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
+++ b/test/it/parser/src/main/resources/sql/supported/dml/select-special-function.xml
@@ -374,4 +374,20 @@
     <sql-case id="select_bitcount_doris" value="SELECT BITCOUNT(7)" db-types="Doris" />
     <sql-case id="select_bitnot_doris" value="SELECT BITNOT(1)" db-types="Doris" />
     <sql-case id="select_bitmap_or_count_doris" value="SELECT BITMAP_OR_COUNT(BITMAP_FROM_STRING('1,2,3'), BITMAP_EMPTY())" db-types="Doris" />
+    <sql-case id="timestampadd_sql_tsi_unit" value="SELECT TIMESTAMPADD(SQL_TSI_SECOND, 1, order_date) FROM t_order" db-types="MySQL" />
+    <sql-case id="timestampdiff_sql_tsi_unit" value="SELECT TIMESTAMPDIFF(SQL_TSI_MINUTE, start_time, end_time) FROM t_order" db-types="MySQL" />
+    <sql-case id="select_cast_float_precision" value="SELECT CAST(1 AS FLOAT(24))" db-types="MySQL,Doris" />
+
+    <sql-case id="select_variance_all" value="SELECT VARIANCE(ALL 1)" db-types="MySQL,Doris" />
+
+    <sql-case id="select_trailing_decimal" value="SELECT 8." db-types="MySQL,Doris" />
+
+    <sql-case id="select_spaced_qualified_shorthand" value="SELECT t . * FROM t" db-types="MySQL,Doris" />
+
+    <sql-case id="select_json_table_exists_path" value="SELECT * FROM JSON_TABLE('[]', '$[*]' COLUMNS (id FOR ORDINALITY, p INT EXISTS PATH '$.a')) AS t" db-types="MySQL" />
+
+    <sql-case id="select_qualified_digit_identifier" value="SELECT event.1a20 FROM event" db-types="MySQL,Doris" />
+    <sql-case id="select_leading_decimal_alias" value="SELECT .0$p, .1a20, .2_" db-types="MySQL,Doris" />
+    <sql-case id="select_qualified_scientific_identifier" value="SELECT event.1e1a20 FROM event" db-types="MySQL,Doris" />
+    <sql-case id="select_leading_scientific_alias" value="SELECT .1e1a20" db-types="MySQL,Doris" />
 </sql-cases>
diff --git a/test/it/parser/src/test/java/org/apache/shardingsphere/test/it/sql/parser/mysql/ExternalMySQLParserIT.java b/test/it/parser/src/test/java/org/apache/shardingsphere/test/it/sql/parser/mysql/ExternalMySQLParserIT.java
index e01e5873daf..51e1007d706 100644
--- a/test/it/parser/src/test/java/org/apache/shardingsphere/test/it/sql/parser/mysql/ExternalMySQLParserIT.java
+++ b/test/it/parser/src/test/java/org/apache/shardingsphere/test/it/sql/parser/mysql/ExternalMySQLParserIT.java
@@ -21,7 +21,8 @@ import org.apache.shardingsphere.test.it.sql.parser.external.ExternalCaseSetting
 import org.apache.shardingsphere.test.it.sql.parser.external.ExternalSQLParserIT;
 import org.apache.shardingsphere.test.it.sql.parser.external.loader.template.dialect.MySQLExternalExternalTestParameterLoadTemplate;
 
-@ExternalCaseSettings(value = "MySQL", caseURL = ExternalMySQLParserIT.CASE_URL, resultURL = ExternalMySQLParserIT.RESULT_URL, template = MySQLExternalExternalTestParameterLoadTemplate.class)
+@ExternalCaseSettings(value = "MySQL", caseURL = ExternalMySQLParserIT.CASE_URL, caseRegex = ".*\\.test", resultURL = ExternalMySQLParserIT.RESULT_URL,
+        template = MySQLExternalExternalTestParameterLoadTemplate.class)
 class ExternalMySQLParserIT extends ExternalSQLParserIT {
     
     static final String CASE_URL = "https://github.com/mysql/mysql-server/tree/8.0/mysql-test/t";