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

panjuan 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 568f5ea  add parser support for SQL_MODE=ANSI_QUOTES (#8506)
568f5ea is described below

commit 568f5eaca23453d779e50d57d6496b160e39f7b3
Author: JingShang Lu <[email protected]>
AuthorDate: Mon Dec 7 17:53:09 2020 +0800

    add parser support for SQL_MODE=ANSI_QUOTES (#8506)
    
    * add parser support for SQL_MODE=ANSI_QUOTES
    
    * fix
---
 .../src/main/antlr4/imports/mysql/BaseRule.g4      | 101 +++++++++----------
 .../src/main/antlr4/imports/mysql/DALStatement.g4  |  12 +--
 .../src/main/antlr4/imports/mysql/DCLStatement.g4  |  14 ++-
 .../src/main/antlr4/imports/mysql/DDLStatement.g4  |  78 +++++++--------
 .../src/main/antlr4/imports/mysql/DMLStatement.g4  |  52 +++++-----
 .../src/main/antlr4/imports/mysql/Keyword.g4       |   8 ++
 .../src/main/antlr4/imports/mysql/Literals.g4      |  12 ---
 .../src/main/antlr4/imports/mysql/RLStatement.g4   |  42 ++++----
 .../src/main/antlr4/imports/mysql/TCLStatement.g4  |   2 +-
 .../sql/parser/autogen/MySQLStatement.g4           |   1 +
 .../visitor/format/impl/MySQLFormatSQLVisitor.java |  30 +-----
 .../statement/impl/MySQLStatementSQLVisitor.java   | 109 +++++++++++++++------
 .../src/main/resources/case/dml/select.xml         |  13 +++
 .../main/resources/sql/supported/ddl/create.xml    |   2 +-
 .../main/resources/sql/supported/dml/select.xml    |   1 +
 15 files changed, 255 insertions(+), 222 deletions(-)

diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/BaseRule.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/BaseRule.g4
index a202324..803fdaa 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/BaseRule.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/BaseRule.g4
@@ -44,6 +44,8 @@ customKeyword
     | COPY
     | UL_BINARY
     | AUTOCOMMIT
+    | INNODB
+    | REDO_LOG
     ;
 
 literals
@@ -56,8 +58,12 @@ literals
     | nullValueLiterals
     ;
 
+string_
+    : DOUBLE_QUOTED_TEXT | SINGLE_QUOTED_TEXT
+    ;
+
 stringLiterals
-    : (UNDERSCORE_CHARSET? STRING_ | NCHAR_TEXT) STRING_* collateClause?
+    : UNDERSCORE_CHARSET? string_ | NCHAR_TEXT
     ;
 
 numberLiterals
@@ -89,7 +95,7 @@ collationName
    ;
 
 identifier
-    : IDENTIFIER_ | unreservedWord | customKeyword
+    : IDENTIFIER_ | unreservedWord | customKeyword | DOUBLE_QUOTED_TEXT
     ;
 
 unreservedWord
@@ -145,7 +151,7 @@ unreservedWord
     ;
 
 textOrIdentifier
-    : identifier | STRING_
+    : identifier | string_
     ;
 
 variable
@@ -199,8 +205,7 @@ tableName
     ;
 
 columnName
-    : (owner DOT_)? name
-    | identifier DOT_ identifier DOT_ identifier
+    : identifier
     ;
 
 indexName
@@ -216,19 +221,15 @@ userName
     ;
 
 eventName
-    : (STRING_ | IDENTIFIER_) AT_ (STRING_ IDENTIFIER_)
-    | identifier
-    | STRING_ 
+    : identifier (DOT_ identifier)?
     ;
 
 serverName
-    : identifier
-    | STRING_
+    : textOrIdentifier
     ; 
 
 wrapperName
-    : identifier
-    | STRING_
+    : textOrIdentifier
     ;
 
 functionName
@@ -246,7 +247,7 @@ owner
     ;
 
 alias
-    : identifier | STRING_
+    : textOrIdentifier
     ;
 
 name
@@ -262,11 +263,11 @@ viewNames
     ;
 
 columnNames
-    : LP_? columnName (COMMA_ columnName)* RP_?
+    : columnName (COMMA_ columnName)*
     ;
 
 groupName
-    : IDENTIFIER_
+    : identifier
     ;
 
 routineName
@@ -274,19 +275,19 @@ routineName
     ;
 
 shardLibraryName
-    : STRING_
+    : stringLiterals
     ;
 
 componentName
-    : STRING_
+    : string_
     ;
 
 pluginName
-    : IDENTIFIER_
+    : identifier
     ;
 
 hostName
-    : STRING_
+    : string_
     ;
 
 port
@@ -298,27 +299,27 @@ cloneInstance
     ;
 
 cloneDir
-    : IDENTIFIER_
+    : string_
     ;
 
 channelName
-    : IDENTIFIER_
+    : identifier (DOT_ identifier)?
     ;
 
 logName
-    : identifier
+    : stringLiterals
     ;
 
 roleName
-    : (STRING_ | IDENTIFIER_) AT_ (STRING_ | IDENTIFIER_) | IDENTIFIER_
+    : (string_ | IDENTIFIER_) AT_ (string_ | IDENTIFIER_) | IDENTIFIER_
     ;
 
 engineRef
-    : STRING_ | identifier
+    : textOrIdentifier
     ;
 
 triggerName
-    : IDENTIFIER_
+    : identifier (DOT_ identifier)?
     ;
 
 triggerTime
@@ -334,7 +335,7 @@ userOrRole
     ;
 
 partitionName
-    : IDENTIFIER_
+    : identifier
     ;
 
 identifierList
@@ -412,20 +413,28 @@ simpleExpr
     : functionCall
     | parameterMarker
     | literals
-    | columnName
-    | simpleExpr COLLATE (STRING_ | identifier)
+    | columnRef
+    | simpleExpr COLLATE textOrIdentifier
     | variable
     | simpleExpr OR_ simpleExpr
     | (PLUS_ | MINUS_ | TILDE_ | notOperator | BINARY) simpleExpr
     | ROW? LP_ expr (COMMA_ expr)* RP_
     | EXISTS? subquery
     | LBE_ identifier expr RBE_
-    | identifier (JSON_SEPARATOR | JSON_UNQUOTED_SEPARATOR) STRING_
+    | identifier (JSON_SEPARATOR | JSON_UNQUOTED_SEPARATOR) string_
     | matchExpression
     | caseExpression
     | intervalExpression
     ;
 
+columnRef
+    : identifier (DOT_ identifier)? (DOT_ identifier)?
+    ;
+
+columnRefList
+    : columnRef (COMMA_ columnRef)*
+    ;
+
 functionCall
     : aggregationFunction | specialFunction | regularFunction 
     ;
@@ -550,15 +559,15 @@ extractFunction
     ;
 
 charFunction
-    : CHAR LP_ expr (COMMA_ expr)* (USING ignoredIdentifier)? RP_
+    : CHAR LP_ expr (COMMA_ expr)* (USING charsetName)? RP_
     ;
 
 trimFunction
-    : TRIM LP_ (LEADING | BOTH | TRAILING) STRING_ FROM STRING_ RP_
+    : TRIM LP_ (LEADING | BOTH | TRAILING) string_ FROM string_ RP_
     ;
 
 valuesFunction
-    : VALUES LP_ columnName RP_
+    : VALUES LP_ columnRefList RP_
     ;
 
 weightStringFunction
@@ -594,7 +603,7 @@ regularFunctionName
     ;
 
 matchExpression
-    : MATCH columnNames AGAINST LP_ expr matchSearchModifier? RP_
+    : MATCH (columnRefList | LP_ columnRefList RP_ ) AGAINST LP_ expr 
matchSearchModifier? RP_
     ;
 
 matchSearchModifier
@@ -644,7 +653,7 @@ orderByClause
     ;
 
 orderByItem
-    : (columnName | numberLiterals | expr) direction?
+    : (numberLiterals | expr) direction?
     ;
 
 dataType
@@ -683,13 +692,13 @@ stringList
     ;
 
 textString
-    : STRING_
+    : string_
     | HEX_DIGIT_
     | BIT_NUM_
     ;
 
 textStringHash
-    : STRING_ | HEX_DIGIT_
+    : string_ | HEX_DIGIT_
     ;
 
 fieldOptions
@@ -732,7 +741,7 @@ defaultCollation
     ;
 
 defaultEncryption
-    : DEFAULT? ENCRYPTION EQ_? STRING_
+    : DEFAULT? ENCRYPTION EQ_? string_
     ;
 
 defaultCharset
@@ -772,10 +781,6 @@ fieldLength
     : LP_ length=NUMBER_ RP_
     ;
 
-collectionOptions
-    : LP_ STRING_ (COMMA_ STRING_)* RP_
-    ;
-
 characterSet
     : charset charsetName
     ;
@@ -784,14 +789,6 @@ collateClause
     : COLLATE collationName
     ;
 
-ignoredIdentifier
-    : identifier (DOT_ identifier)?
-    ;
-
-ignoredIdentifiers
-    : ignoredIdentifier (COMMA_ ignoredIdentifier)*
-    ;
-
 fieldOrVarSpec
     : LP_ (identifier (COMMA_ identifier)*)? RP_
     ;
@@ -804,10 +801,6 @@ existClause
     : IF EXISTS
     ;
 
-pattern
-    : STRING_
-    ;
-
 connectionId
     : NUMBER_
     ;
@@ -834,7 +827,7 @@ noWriteToBinLog
     ;
 
 channelOption
-    : FOR CHANNEL STRING_
+    : FOR CHANNEL string_
     ;
 
 preparedStatement
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DALStatement.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DALStatement.g4
index d6cc922..62506bc 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DALStatement.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DALStatement.g4
@@ -24,12 +24,12 @@ use
     ;
 
 help
-    : HELP STRING_
+    : HELP string_
     ;
 
 explain
     : (DESC | DESCRIBE | EXPLAIN)
-    (tableName (columnName | pattern)?
+    (tableName (columnRef | textString)?
     | explainType? (explainableStatement | FOR CONNECTION connectionId)
     | ANALYZE select)
     ;
@@ -163,7 +163,7 @@ showFunctionStatus
     ;
 
 showGrant
-    : SHOW GRANTS (FOR userOrRole (USING roleName (COMMA_ roleName)+)?)?
+    : SHOW GRANTS (FOR userOrRole (USING userName (COMMA_ userName)+)?)?
     ;
 
 showMasterStatus
@@ -244,7 +244,7 @@ clone
 
 cloneAction
     : LOCAL DATA DIRECTORY EQ_? cloneDir
-    | INSTANCE FROM cloneInstance IDENTIFIED BY STRING_ (DATA DIRECTORY EQ_? 
cloneDir)? (REQUIRE NO? SSL)?
+    | INSTANCE FROM cloneInstance IDENTIFIED BY string_ (DATA DIRECTORY EQ_? 
cloneDir)? (REQUIRE NO? SSL)?
     ;
 
 createUdf
@@ -330,7 +330,7 @@ binlog
     ;
 
 cacheIndex
-    : CACHE INDEX (tableIndexList (COMMA_ tableIndexList)* | tableName 
PARTITION LP_ partitionList RP_) IN IDENTIFIER_
+    : CACHE INDEX (tableIndexList (COMMA_ tableIndexList)* | tableName 
PARTITION LP_ partitionList RP_) IN (identifier | DEFAULT)
     ;
 
 tableIndexList
@@ -374,7 +374,7 @@ resetOption
     ;
 
 resetPersist
-    : RESET PERSIST (existClause? IDENTIFIER_)
+    : RESET PERSIST (existClause? identifier)?
     ;
 
 restart
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DCLStatement.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DCLStatement.g4
index 0538aea..a184a6f 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DCLStatement.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DCLStatement.g4
@@ -44,7 +44,11 @@ allClause
     ;
 
 privileges
-    : privilegeType columnNames? (COMMA_ privilegeType columnNames?)*
+    : privilege (COMMA_ privilege)*
+    ;
+
+privilege
+    : privilegeType (LP_ columnNames RP_)?
     ;
 
 privilegeType
@@ -164,7 +168,7 @@ setRole
     ;
 
 setPassword
-    : SET PASSWORD (FOR userName)? authOption (REPLACE STRING_)? (RETAIN 
CURRENT PASSWORD)?
+    : SET PASSWORD (FOR userName)? authOption (REPLACE string_)? (RETAIN 
CURRENT PASSWORD)?
     ;
 
 authOption
@@ -194,12 +198,12 @@ userAuthOption
     ;
 
 identifiedBy
-    : IDENTIFIED BY (STRING_ | RANDOM PASSWORD) (REPLACE STRING_)? (RETAIN 
CURRENT PASSWORD)?
+    : IDENTIFIED BY (string_ | RANDOM PASSWORD) (REPLACE string_)? (RETAIN 
CURRENT PASSWORD)?
     ;
 
 identifiedWith
     : IDENTIFIED WITH pluginName
-    | IDENTIFIED WITH pluginName BY (STRING_ | RANDOM PASSWORD) (REPLACE 
stringLiterals)? (RETAIN CURRENT PASSWORD)?
+    | IDENTIFIED WITH pluginName BY (string_ | RANDOM PASSWORD) (REPLACE 
stringLiterals)? (RETAIN CURRENT PASSWORD)?
     | IDENTIFIED WITH pluginName AS textStringHash (RETAIN CURRENT PASSWORD)?
     ;
 
@@ -211,7 +215,7 @@ connectOption
     ;
 
 tlsOption
-    : SSL | X509 | CIPHER STRING_ | ISSUER STRING_ | SUBJECT STRING_
+    : SSL | X509 | CIPHER string_ | ISSUER string_ | SUBJECT string_
     ;
 
 userFuncAuthOption
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
index c773ea6..9604130 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DDLStatement.g4
@@ -42,13 +42,13 @@ partitionClause
     ;
 
 partitionTypeDef
-    : LINEAR? KEY partitionKeyAlgorithm? columnNames
+    : LINEAR? KEY partitionKeyAlgorithm? LP_ columnNames? RP_
     | LINEAR? HASH LP_ bitExpr RP_
-    | (RANGE | LIST) (LP_ bitExpr RP_ | COLUMNS columnNames )
+    | (RANGE | LIST) (LP_ bitExpr RP_ | COLUMNS LP_ columnNames RP_ )
     ;
 
 subPartitions
-    : SUBPARTITION BY LINEAR? ( HASH LP_ bitExpr RP_ | KEY 
partitionKeyAlgorithm? columnNames ) (SUBPARTITIONS NUMBER_)?
+    : SUBPARTITION BY LINEAR? ( HASH LP_ bitExpr RP_ | KEY 
partitionKeyAlgorithm? LP_ columnNames RP_ ) (SUBPARTITIONS NUMBER_)?
     ;
 
 partitionKeyAlgorithm
@@ -221,7 +221,7 @@ alterDatabase
     ;
 
 createDatabaseSpecification_
-    : defaultCollation
+    : defaultCharset
     | defaultCollation
     | defaultEncryption
     ;
@@ -240,9 +240,9 @@ alterInstance
     ;
 
 instanceAction
-    : (ENABLE | DISABLE) INNODB_ REDO_LOG_ 
-    | ROTATE INNODB_ MASTER KEY 
-    | ROTATE BINLOG MASTER KEY 
+    : (ENABLE | DISABLE) INNODB REDO_LOG
+    | ROTATE INNODB MASTER KEY
+    | ROTATE BINLOG MASTER KEY
     | RELOAD TLS (FOR CHANNEL channel)? (NO ROLLBACK ON ERROR)?
     ;
 
@@ -255,7 +255,7 @@ createEvent
       ON SCHEDULE scheduleExpression
       (ON COMPLETION NOT? PRESERVE)? 
       (ENABLE | DISABLE | DISABLE ON SLAVE)?
-      (COMMENT STRING_)?
+      (COMMENT string_)?
       DO routineBody
     ;
 
@@ -264,7 +264,7 @@ alterEvent
       (ON SCHEDULE scheduleExpression)?
       (ON COMPLETION NOT? PRESERVE)?
       (RENAME TO eventName)? (ENABLE | DISABLE | DISABLE ON SLAVE)?
-      (COMMENT STRING_)?
+      (COMMENT string_)?
       (DO routineBody)?
     ;
 
@@ -343,15 +343,15 @@ dropView
 
 createTablespaceInnodb
     : CREATE (UNDO)? TABLESPACE identifier
-      ADD DATAFILE STRING_
+      ADD DATAFILE string_
       (FILE_BLOCK_SIZE EQ_ fileSizeLiteral)?
-      (ENCRYPTION EQ_ y_or_n=STRING_)?
-      (ENGINE EQ_? STRING_)?
+      (ENCRYPTION EQ_ y_or_n=string_)?
+      (ENGINE EQ_? string_)?
     ;
 
 createTablespaceNdb
     : CREATE ( UNDO )? TABLESPACE identifier
-      ADD DATAFILE STRING_
+      ADD DATAFILE string_
       USE LOGFILE GROUP identifier
       (EXTENT_SIZE EQ_? fileSizeLiteral)?
       (INITIAL_SIZE EQ_? fileSizeLiteral)?
@@ -359,13 +359,13 @@ createTablespaceNdb
       (MAX_SIZE EQ_? fileSizeLiteral)?
       (NODEGROUP EQ_? identifier)?
       WAIT?
-      (COMMENT EQ_? STRING_)?
+      (COMMENT EQ_? string_)?
       (ENGINE EQ_? identifier)?
     ;
 
 alterTablespaceNdb
     : ALTER UNDO? TABLESPACE identifier
-      (ADD | DROP) DATAFILE STRING_
+      (ADD | DROP) DATAFILE string_
       (INITIAL_SIZE EQ_ fileSizeLiteral)?
       WAIT? (RENAME TO identifier)?
       (ENGINE EQ_? identifier)?
@@ -373,7 +373,7 @@ alterTablespaceNdb
 
 alterTablespaceInnodb
     : ALTER UNDO? TABLESPACE identifier
-      (SET (ACTIVE | INACTIVE))? (ENCRYPTION EQ_? y_or_n=STRING_)
+      (SET (ACTIVE | INACTIVE))? (ENCRYPTION EQ_? y_or_n=string_)
       (RENAME TO identifier)?
       (ENGINE EQ_? identifier)?
     ;
@@ -384,19 +384,19 @@ dropTablespace
 
 createLogfileGroup
     : CREATE LOGFILE GROUP identifier
-      ADD UNDOFILE STRING_
+      ADD UNDOFILE string_
       (INITIAL_SIZE EQ_? fileSizeLiteral)?
       (UNDO_BUFFER_SIZE EQ_? fileSizeLiteral)?
       (REDO_BUFFER_SIZE EQ_? fileSizeLiteral)?
       (NODEGROUP EQ_? identifier)?
       WAIT?
-      (COMMENT EQ_? STRING_)?
+      (COMMENT EQ_? string_)?
       (ENGINE EQ_? identifier)?
     ;
 
 alterLogfileGroup
     : ALTER LOGFILE GROUP identifier
-      ADD UNDOFILE STRING_
+      ADD UNDOFILE string_
       (INITIAL_SIZE EQ_? fileSizeLiteral)?
       WAIT? 
       (ENGINE EQ_? identifier)?
@@ -439,7 +439,7 @@ columnAttribute
     | value = SERIAL DEFAULT VALUE
     | PRIMARY? value = KEY
     | value = UNIQUE KEY?
-    | value = COMMENT STRING_
+    | value = COMMENT string_
     | collateClause
     | value = COLUMN_FORMAT columnFormat
     | value = STORAGE storageMedia
@@ -529,12 +529,12 @@ createTableOptions
 
 createTableOption
     : option = ENGINE EQ_? engineRef
-    | option = SECONDARY_ENGINE EQ_? (NULL | STRING_ | identifier)
+    | option = SECONDARY_ENGINE EQ_? (NULL | string_ | identifier)
     | option = MAX_ROWS EQ_? NUMBER_
     | option = MIN_ROWS EQ_? NUMBER_
     | option = AVG_ROW_LENGTH EQ_? NUMBER_
-    | option = PASSWORD EQ_? STRING_
-    | option = COMMENT EQ_? STRING_
+    | option = PASSWORD EQ_? string_
+    | option = COMMENT EQ_? string_
     | option = COMPRESSION EQ_? textString
     | option = ENCRYPTION EQ_? textString
     | option = AUTO_INCREMENT EQ_? NUMBER_
@@ -553,8 +553,8 @@ createTableOption
     | option = STORAGE (DISK | MEMORY)
     | option = CONNECTION EQ_? textString
     | option = KEY_BLOCK_SIZE EQ_? NUMBER_
-    | option = ENGINE_ATTRIBUTE EQ_? jsonAttribute = STRING_
-    | option = SECONDARY_ENGINE_ATTRIBUTE EQ_ jsonAttribute = STRING_
+    | option = ENGINE_ATTRIBUTE EQ_? jsonAttribute = string_
+    | option = SECONDARY_ENGINE_ATTRIBUTE EQ_ jsonAttribute = string_
     ;
 
 createSRSStatement
@@ -567,10 +567,10 @@ dropSRSStatement
     ;
 
 srsAttribute
-    : NAME STRING_
-    | DEFINITION STRING_
-    | ORGANIZATION STRING_ IDENTIFIED BY NUMBER_
-    | DESCRIPTION STRING_
+    : NAME string_
+    | DEFINITION string_
+    | ORGANIZATION string_ IDENTIFIED BY NUMBER_
+    | DESCRIPTION string_
     ;
 
 place
@@ -598,9 +598,9 @@ partitionValueList
 
 partitionDefinitionOption
     : STORAGE? ENGINE EQ_? identifier
-    | COMMENT EQ_? STRING_
-    | DATA DIRECTORY EQ_? STRING_
-    | INDEX DIRECTORY EQ_? STRING_
+    | COMMENT EQ_? string_
+    | DATA DIRECTORY EQ_? string_
+    | INDEX DIRECTORY EQ_? string_
     | MAX_ROWS EQ_? NUMBER_
     | MIN_ROWS EQ_? NUMBER_
     | TABLESPACE EQ_? identifier
@@ -630,17 +630,17 @@ routineBody
     ;
 
 serverOption
-    : HOST STRING_
-    | DATABASE STRING_
-    | USER STRING_
-    | PASSWORD STRING_
-    | SOCKET STRING_
-    | OWNER STRING_
+    : HOST string_
+    | DATABASE string_
+    | USER string_
+    | PASSWORD string_
+    | SOCKET string_
+    | OWNER string_
     | PORT numberLiterals 
     ;
 
 routineOption
-    : COMMENT STRING_                                       
+    : COMMENT string_
     | LANGUAGE SQL                                              
     | NOT? DETERMINISTIC                                          
     | (CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA)
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
index fa63608..41b51cd 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/DMLStatement.g4
@@ -28,11 +28,23 @@ insertSpecification
     ;
 
 insertValuesClause
-    : (LP_ RP_ | columnNames)? (VALUES | VALUE) (assignmentValues (COMMA_ 
assignmentValues)* | rowConstructorList) valueReference?
+    : (LP_ fields? RP_ )? (VALUES | VALUE) (assignmentValues (COMMA_ 
assignmentValues)* | rowConstructorList) valueReference?
+    ;
+
+fields
+    : insertIdentifier (COMMA_ insertIdentifier)*
+    ;
+
+insertIdentifier
+    : columnRef | tableWild
+    ;
+
+tableWild
+    : identifier DOT_ (identifier DOT_)? ASTERISK_
     ;
 
 insertSelectClause
-    : valueReference? columnNames? select
+    : valueReference? (LP_ fields? RP_)? select
     ;
 
 onDuplicateKeyClause
@@ -56,11 +68,11 @@ replaceSpecification
     ;
 
 replaceValuesClause
-    : columnNames? (VALUES | VALUE) (assignmentValues (COMMA_ 
assignmentValues)* | rowConstructorList) valueReference?
+    : (LP_ fields? RP_)? (VALUES | VALUE) (assignmentValues (COMMA_ 
assignmentValues)* | rowConstructorList) valueReference?
     ;
 
 replaceSelectClause
-    : valueReference? columnNames? select
+    : valueReference? (LP_ fields? RP_)? select
     ;
 
 update
@@ -72,7 +84,7 @@ updateSpecification_
     ;
 
 assignment
-    : columnName EQ_ assignmentValue
+    : columnRef EQ_ assignmentValue
     ;
 
 setAssignmentsClause
@@ -89,7 +101,7 @@ assignmentValue
     ;
 
 blobValue
-    : UL_BINARY STRING_
+    : UL_BINARY string_
     ;
 
 delete
@@ -175,7 +187,7 @@ handlerCloseStatement
     ;
 
 importStatement
-    : IMPORT TABLE FROM STRING_ (COMMA_ STRING_)?
+    : IMPORT TABLE FROM string_ (COMMA_ string_)?
     ;
 
 loadStatement
@@ -185,7 +197,7 @@ loadStatement
 loadDataStatement
     : LOAD DATA
       (LOW_PRIORITY | CONCURRENT)? LOCAL? 
-      INFILE STRING_
+      INFILE string_
       (REPLACE | IGNORE)?
       INTO TABLE tableName partitionNames?
       (CHARACTER SET identifier)?
@@ -199,11 +211,11 @@ loadDataStatement
 loadXmlStatement
     : LOAD XML
       (LOW_PRIORITY | CONCURRENT)? LOCAL? 
-      INFILE STRING_
+      INFILE string_
       (REPLACE | IGNORE)?
       INTO TABLE tableName
       (CHARACTER SET identifier)?
-      (ROWS IDENTIFIED BY LT_ STRING_ GT_)?
+      (ROWS IDENTIFIED BY LT_ string_ GT_)?
       ( IGNORE numberLiterals (LINES | ROWS) )?
       fieldOrVarSpec?
       (setAssignmentsClause)?
@@ -217,10 +229,6 @@ tableValueConstructor
     : VALUES rowConstructorList
     ;
 
-columnDesignator
-    : STRING_
-    ;
-
 rowConstructorList
     : ROW assignmentValues (COMMA_ ROW assignmentValues)*
     ;
@@ -230,7 +238,7 @@ withClause
     ;
 
 cteClause
-    : ignoredIdentifier columnNames? AS subquery
+    : identifier (LP_ columnNames RP_)? AS subquery
     ;
 
 selectSpecification
@@ -274,7 +282,7 @@ tableReference
     ;
 
 tableFactor
-    : tableName partitionNames? (AS? alias)? indexHintList? | subquery AS? 
alias columnNames? | LP_ tableReferences RP_
+    : tableName partitionNames? (AS? alias)? indexHintList? | subquery AS? 
alias (LP_ columnNames RP_)? | LP_ tableReferences RP_
     ;
 
 partitionNames
@@ -310,7 +318,7 @@ naturalJoinType
     ;
 
 joinSpecification
-    : ON expr | USING columnNames
+    : ON expr | USING LP_ columnNames RP_
     ;
 
 whereClause
@@ -342,7 +350,7 @@ windowClause
     ;
 
 windowItem
-    : ignoredIdentifier AS LP_ windowSpecification RP_
+    : identifier AS LP_ windowSpecification RP_
     ;
 
 subquery
@@ -350,16 +358,16 @@ subquery
     ;
 
 selectLinesInto
-    : STARTING BY STRING_ | TERMINATED BY STRING_
+    : STARTING BY string_ | TERMINATED BY string_
     ;
 
 selectFieldsInto
-    : TERMINATED BY STRING_ | OPTIONALLY? ENCLOSED BY STRING_ | ESCAPED BY 
STRING_
+    : TERMINATED BY string_ | OPTIONALLY? ENCLOSED BY string_ | ESCAPED BY 
string_
     ;
 
 selectIntoExpression
-    : INTO variable (COMMA_ variable )* | INTO DUMPFILE STRING_
-    | (INTO OUTFILE STRING_ (CHARACTER SET IDENTIFIER_)?((FIELDS | COLUMNS) 
selectFieldsInto+)? (LINES selectLinesInto+)?)
+    : INTO variable (COMMA_ variable )* | INTO DUMPFILE string_
+    | (INTO OUTFILE string_ (CHARACTER SET charsetName)?((FIELDS | COLUMNS) 
selectFieldsInto+)? (LINES selectLinesInto+)?)
     ;
 
 lockClause
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/Keyword.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/Keyword.g4
index 13a273b..638c243 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/Keyword.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/Keyword.g4
@@ -107,3 +107,11 @@ UL_BINARY
 AUTOCOMMIT
     : A U T O C O M M I T
     ;
+
+INNODB
+    : 'INNODB'
+    ;
+
+REDO_LOG
+    : 'REDO_LOG'
+    ;
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/Literals.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/Literals.g4
index d4e3e7e..f9aaf5a 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/Literals.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/Literals.g4
@@ -19,14 +19,6 @@ lexer grammar Literals;
 
 import Alphabet, Symbol;
 
-INNODB_
-    : 'INNODB'
-    ;
-    
-REDO_LOG_
-    : 'REDO_LOG'
-    ;
-    
 FILESIZE_LITERAL
     : INT_NUM_ ('K'|'M'|'G'|'T')
     ;
@@ -36,10 +28,6 @@ IDENTIFIER_
     |  BQ_ ~'`'+ BQ_
     ;
 
-STRING_
-    : DOUBLE_QUOTED_TEXT | SINGLE_QUOTED_TEXT
-    ;
-
 SINGLE_QUOTED_TEXT
     : SQ_ ('\\'. | '\'\'' | ~('\'' | '\\'))* SQ_
     ;
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/RLStatement.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/RLStatement.g4
index a6167b2..454027b 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/RLStatement.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/RLStatement.g4
@@ -65,13 +65,13 @@ threadType
 
 utilOption
     : UNTIL ((SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS) EQ_ identifier
-    | MASTER_LOG_FILE EQ_ STRING_ COMMA_ MASTER_LOG_POS EQ_ NUMBER_
-    | RELAY_LOG_FILE EQ_ STRING_ COMMA_ RELAY_LOG_POS  EQ_ NUMBER_
+    | MASTER_LOG_FILE EQ_ string_ COMMA_ MASTER_LOG_POS EQ_ NUMBER_
+    | RELAY_LOG_FILE EQ_ string_ COMMA_ RELAY_LOG_POS  EQ_ NUMBER_
     | SQL_AFTER_MTS_GAPS)
     ;
 
 connectionOptions
-    : (USER EQ_ STRING_)? (PASSWORD EQ_ STRING_)? (DEFAULT_AUTH EQ_ STRING_)? 
(PLUGIN_DIR EQ_ STRING_)?
+    : (USER EQ_ string_)? (PASSWORD EQ_ string_)? (DEFAULT_AUTH EQ_ string_)? 
(PLUGIN_DIR EQ_ string_)?
     ;
 
 masterDefs
@@ -79,10 +79,10 @@ masterDefs
     ;
 
 masterDef
-    : MASTER_BIND EQ_ STRING_
-    | MASTER_HOST EQ_ STRING_
-    | MASTER_USER EQ_ STRING_
-    | MASTER_PASSWORD EQ_ STRING_
+    : MASTER_BIND EQ_ string_
+    | MASTER_HOST EQ_ string_
+    | MASTER_USER EQ_ string_
+    | MASTER_PASSWORD EQ_ string_
     | MASTER_PORT EQ_ NUMBER_
     | PRIVILEGE_CHECKS_USER EQ_ (ACCOUNT | NULL)
     | REQUIRE_ROW_FORMAT EQ_ NUMBER_
@@ -90,25 +90,25 @@ masterDef
     | MASTER_RETRY_COUNT EQ_ NUMBER_
     | MASTER_DELAY EQ_ NUMBER_
     | MASTER_HEARTBEAT_PERIOD EQ_ NUMBER_
-    | MASTER_LOG_FILE EQ_ STRING_
+    | MASTER_LOG_FILE EQ_ string_
     | MASTER_LOG_POS EQ_ NUMBER_
     | MASTER_AUTO_POSITION EQ_ NUMBER_
-    | RELAY_LOG_FILE EQ_ STRING_
+    | RELAY_LOG_FILE EQ_ string_
     | RELAY_LOG_POS EQ_ NUMBER_
-    | MASTER_COMPRESSION_ALGORITHMS EQ_ STRING_
+    | MASTER_COMPRESSION_ALGORITHMS EQ_ string_
     | MASTER_ZSTD_COMPRESSION_LEVEL EQ_ NUMBER_
     | MASTER_SSL EQ_ NUMBER_
-    | MASTER_SSL_CA EQ_ STRING_
-    | MASTER_SSL_CAPATH EQ_ STRING_
-    | MASTER_SSL_CERT EQ_ STRING_
-    | MASTER_SSL_CRL EQ_ STRING_
-    | MASTER_SSL_CRLPATH EQ_ STRING_
-    | MASTER_SSL_KEY EQ_ STRING_
-    | MASTER_SSL_CIPHER EQ_ STRING_
+    | MASTER_SSL_CA EQ_ string_
+    | MASTER_SSL_CAPATH EQ_ string_
+    | MASTER_SSL_CERT EQ_ string_
+    | MASTER_SSL_CRL EQ_ string_
+    | MASTER_SSL_CRLPATH EQ_ string_
+    | MASTER_SSL_KEY EQ_ string_
+    | MASTER_SSL_CIPHER EQ_ string_
     | MASTER_SSL_VERIFY_SERVER_CERT EQ_ NUMBER_
-    | MASTER_TLS_VERSION EQ_ STRING_
-    | MASTER_TLS_CIPHERSUITES EQ_ STRING_
-    | MASTER_PUBLIC_KEY_PATH EQ_ STRING_
+    | MASTER_TLS_VERSION EQ_ string_
+    | MASTER_TLS_CIPHERSUITES EQ_ string_
+    | MASTER_PUBLIC_KEY_PATH EQ_ string_
     | GET_MASTER_PUBLIC_KEY EQ_ NUMBER_
     | IGNORE_SERVER_IDS EQ_ LP_ ignoreServerIds RP_
     ;
@@ -140,5 +140,5 @@ wildTables
     ;
 
 wildTable
-    : STRING_
+    : string_
     ;
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/TCLStatement.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/TCLStatement.g4
index 07a748e..7f5d767 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/TCLStatement.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/TCLStatement.g4
@@ -102,5 +102,5 @@ lockOption
     ;
 
 xid
-    : STRING_ (COMMA_ STRING_)* numberLiterals?
+    : string_ (COMMA_ string_)* numberLiterals?
     ;
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/MySQLStatement.g4
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/MySQLStatement.g4
index 90a60ee..225361f 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/MySQLStatement.g4
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/org/apache/shardingsphere/sql/parser/autogen/MySQLStatement.g4
@@ -25,6 +25,7 @@ execute
     | update
     | delete
     | replace
+    | binlog
     | createTable
     | alterStatement
     | repairTable
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/impl/MySQLFormatSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/impl/MySQLFormatSQLVisitor.java
index c6db404..c7c3cd8 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/impl/MySQLFormatSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/format/impl/MySQLFormatSQLVisitor.java
@@ -29,7 +29,6 @@ import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterLi
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTableActionsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterTableContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AssignmentValuesContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ColumnNameContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ColumnNamesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateDefinitionClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateTableOptionsSpaceSeparatedContext;
@@ -39,7 +38,6 @@ import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.Explici
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ExprContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FieldLengthContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.IdentifierContext;
-import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.IgnoredIdentifierContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.LiteralsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.NumberLiteralsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.PrecisionContext;
@@ -547,7 +545,7 @@ public abstract class MySQLFormatSQLVisitor extends 
MySQLStatementBaseVisitor<St
 
     @Override
     public String visitCteClause(final CteClauseContext ctx) {
-        visit(ctx.ignoredIdentifier());
+        visit(ctx.identifier());
         result.append(" ");
         if (null != ctx.columnNames()) {
             visit(ctx.columnNames());
@@ -559,20 +557,7 @@ public abstract class MySQLFormatSQLVisitor extends 
MySQLStatementBaseVisitor<St
     }
 
     @Override
-    public String visitIgnoredIdentifier(final IgnoredIdentifierContext ctx) {
-        visit(ctx.identifier(0));
-        if (null != ctx.DOT_()) {
-            visit(ctx.DOT_());
-            visit(ctx.identifier(1));
-        }
-        return result.toString();
-    }
-
-    @Override
     public String visitColumnNames(final ColumnNamesContext ctx) {
-        if (null != ctx.LP_()) {
-            visit(ctx.LP_());
-        }
         int columnCount = ctx.columnName().size();
         for (int i = 0; i < columnCount; i++) {
             if (i != 0 && i < columnCount - 1) {
@@ -581,19 +566,6 @@ public abstract class MySQLFormatSQLVisitor extends 
MySQLStatementBaseVisitor<St
                 visit(ctx.columnName(i));
             }
         }
-        if (null != ctx.RP_()) {
-            visit(ctx.RP_());
-        }
-        return result.toString();
-    }
-
-    @Override
-    public String visitColumnName(final ColumnNameContext ctx) {
-        if (null != ctx.owner()) {
-            visit(ctx.owner());
-            visit(ctx.DOT_(0));
-        }
-        visit(ctx.name());
         return result.toString();
     }
 
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
index 4e51f2d..a44dcc6 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
@@ -28,13 +28,16 @@ import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.Assignm
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AssignmentValueContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AssignmentValuesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.BlobValueContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ColumnRefContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DeleteContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DuplicateSpecificationContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.EscapedTableReferenceContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FieldLengthContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FieldsContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.FromClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GroupByClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.InsertContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.InsertIdentifierContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.InsertSelectClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.InsertValuesClauseContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.JoinSpecificationContext;
@@ -189,7 +192,7 @@ import java.util.List;
 public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor<ASTNode> {
     
     private int currentParameterIndex;
-    
+
     @Override
     public final ASTNode visitParameterMarker(final ParameterMarkerContext 
ctx) {
         return new ParameterMarkerValue(currentParameterIndex++);
@@ -298,11 +301,7 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
     
     @Override
     public final ASTNode visitColumnName(final ColumnNameContext ctx) {
-        ColumnSegment result = new 
ColumnSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
(IdentifierValue) visit(ctx.name()));
-        OwnerContext owner = ctx.owner();
-        if (null != owner) {
-            result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(), 
owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
-        }
+        ColumnSegment result = new 
ColumnSegment(ctx.getStart().getStartIndex(), ctx.getStop().getStopIndex(), 
(IdentifierValue) visit(ctx.identifier()));
         return result;
     }
     
@@ -505,8 +504,8 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
         if (null != ctx.functionCall()) {
             return visit(ctx.functionCall());
         }
-        if (null != ctx.columnName()) {
-            return visit(ctx.columnName());
+        if (null != ctx.columnRef()) {
+            return visit(ctx.columnRef());
         }
         if (null != ctx.matchExpression()) {
             return visit(ctx.matchExpression());
@@ -524,7 +523,23 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
         }
         return visitRemainSimpleExpr(ctx);
     }
-    
+
+    @Override
+    public ASTNode visitColumnRef(final ColumnRefContext ctx) {
+        int idenCount = ctx.identifier().size();
+        ColumnSegment result;
+        if (1 == idenCount) {
+            result = new ColumnSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.identifier(0)));
+        } else if (2 == idenCount) {
+            result = new ColumnSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.identifier(1)));
+            result.setOwner(new 
OwnerSegment(ctx.identifier(0).start.getStartIndex(), 
ctx.identifier(0).stop.getStopIndex(), (IdentifierValue) 
visit(ctx.identifier(0))));
+        } else {
+            result = new ColumnSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), (IdentifierValue) visit(ctx.identifier(2)));
+            result.setOwner(new 
OwnerSegment(ctx.identifier(1).start.getStartIndex(), 
ctx.identifier(1).stop.getStopIndex(), (IdentifierValue) 
visit(ctx.identifier(1))));
+        }
+        return result;
+    }
+
     @Override
     public ASTNode visitSubquery(final SubqueryContext ctx) {
         return visit(ctx.queryExpressionParens());
@@ -845,15 +860,17 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
         } else {
             orderDirection = OrderDirection.ASC;
         }
-        if (null != ctx.columnName()) {
-            ColumnSegment column = (ColumnSegment) visit(ctx.columnName());
-            return new ColumnOrderByItemSegment(column, orderDirection);
-        }
         if (null != ctx.numberLiterals()) {
             return new 
IndexOrderByItemSegment(ctx.numberLiterals().getStart().getStartIndex(), 
ctx.numberLiterals().getStop().getStopIndex(),
                     SQLUtil.getExactlyNumber(ctx.numberLiterals().getText(), 
10).intValue(), orderDirection);
+        } else {
+            ASTNode expr = visitExpr(ctx.expr());
+            if (expr instanceof ColumnSegment) {
+                return new ColumnOrderByItemSegment((ColumnSegment) expr, 
orderDirection);
+            } else {
+                return new 
ExpressionOrderByItemSegment(ctx.expr().getStart().getStartIndex(), 
ctx.expr().getStop().getStopIndex(), ctx.expr().getText(), orderDirection);
+            }
         }
-        return new 
ExpressionOrderByItemSegment(ctx.expr().getStart().getStartIndex(), 
ctx.expr().getStop().getStopIndex(), ctx.expr().getText(), orderDirection);
     }
 
     @Override
@@ -879,7 +896,15 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
     @Override
     public ASTNode visitInsertSelectClause(final InsertSelectClauseContext 
ctx) {
         MySQLInsertStatement result = new MySQLInsertStatement();
-        result.setInsertColumns(createInsertColumns(ctx.columnNames(), 
ctx.start.getStartIndex()));
+        if (null != ctx.LP_()) {
+            if (null != ctx.fields()) {
+                result.setInsertColumns(new 
InsertColumnsSegment(ctx.LP_().getSymbol().getStartIndex(), 
ctx.RP_().getSymbol().getStopIndex(), createInsertColumns(ctx.fields())));
+            } else {
+                result.setInsertColumns(new 
InsertColumnsSegment(ctx.LP_().getSymbol().getStartIndex(), 
ctx.RP_().getSymbol().getStopIndex(), Collections.emptyList()));
+            }
+        } else {
+            result.setInsertColumns(new 
InsertColumnsSegment(ctx.start.getStartIndex() - 1, ctx.start.getStartIndex() - 
1, Collections.emptyList()));
+        }
         result.setInsertSelect(createInsertSelectSegment(ctx));
         return result;
     }
@@ -892,7 +917,15 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
     @Override
     public ASTNode visitInsertValuesClause(final InsertValuesClauseContext 
ctx) {
         MySQLInsertStatement result = new MySQLInsertStatement();
-        result.setInsertColumns(createInsertColumns(ctx.columnNames(), 
ctx.start.getStartIndex()));
+        if (null != ctx.LP_()) {
+            if (null != ctx.fields()) {
+                result.setInsertColumns(new 
InsertColumnsSegment(ctx.LP_().getSymbol().getStartIndex(), 
ctx.RP_().getSymbol().getStopIndex(), createInsertColumns(ctx.fields())));
+            } else {
+                result.setInsertColumns(new 
InsertColumnsSegment(ctx.LP_().getSymbol().getStartIndex(), 
ctx.RP_().getSymbol().getStopIndex(), Collections.emptyList()));
+            }
+        } else {
+            result.setInsertColumns(new 
InsertColumnsSegment(ctx.start.getStartIndex() - 1, ctx.start.getStartIndex() - 
1, Collections.emptyList()));
+        }
         
result.getValues().addAll(createInsertValuesSegments(ctx.assignmentValues()));
         return result;
     }
@@ -930,11 +963,19 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
         result.setParameterCount(getCurrentParameterIndex());
         return result;
     }
-    
+
     @Override
     public ASTNode visitReplaceSelectClause(final ReplaceSelectClauseContext 
ctx) {
         MySQLInsertStatement result = new MySQLInsertStatement();
-        result.setInsertColumns(createInsertColumns(ctx.columnNames(), 
ctx.start.getStartIndex()));
+        if (null != ctx.LP_()) {
+            if (null != ctx.fields()) {
+                result.setInsertColumns(new 
InsertColumnsSegment(ctx.LP_().getSymbol().getStartIndex(), 
ctx.RP_().getSymbol().getStopIndex(), createInsertColumns(ctx.fields())));
+            } else {
+                result.setInsertColumns(new 
InsertColumnsSegment(ctx.LP_().getSymbol().getStartIndex(), 
ctx.RP_().getSymbol().getStopIndex(), Collections.emptyList()));
+            }
+        } else {
+            result.setInsertColumns(new 
InsertColumnsSegment(ctx.start.getStartIndex() - 1, ctx.start.getStartIndex() - 
1, Collections.emptyList()));
+        }
         result.setInsertSelect(createReplaceSelectSegment(ctx));
         return result;
     }
@@ -947,21 +988,28 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
     @Override
     public ASTNode visitReplaceValuesClause(final ReplaceValuesClauseContext 
ctx) {
         MySQLInsertStatement result = new MySQLInsertStatement();
-        result.setInsertColumns(createInsertColumns(ctx.columnNames(), 
ctx.start.getStartIndex()));
+        if (null != ctx.LP_()) {
+            if (null != ctx.fields()) {
+                result.setInsertColumns(new 
InsertColumnsSegment(ctx.LP_().getSymbol().getStartIndex(), 
ctx.RP_().getSymbol().getStopIndex(), createInsertColumns(ctx.fields())));
+            } else {
+                result.setInsertColumns(new 
InsertColumnsSegment(ctx.LP_().getSymbol().getStartIndex(), 
ctx.RP_().getSymbol().getStopIndex(), Collections.emptyList()));
+            }
+        } else {
+            result.setInsertColumns(new 
InsertColumnsSegment(ctx.start.getStartIndex() - 1, ctx.start.getStartIndex() - 
1, Collections.emptyList()));
+        }
         
result.getValues().addAll(createReplaceValuesSegments(ctx.assignmentValues()));
         return result;
     }
     
     @SuppressWarnings("unchecked")
-    private InsertColumnsSegment createInsertColumns(final ColumnNamesContext 
columnNames, final int startIndex) {
-        if (null != columnNames) {
-            CollectionValue<ColumnSegment> columnSegments = 
(CollectionValue<ColumnSegment>) visit(columnNames);
-            return new InsertColumnsSegment(columnNames.start.getStartIndex(), 
columnNames.stop.getStopIndex(), columnSegments.getValue());
-        } else {
-            return new InsertColumnsSegment(startIndex - 1, startIndex - 1, 
Collections.emptyList());
+    private List<ColumnSegment> createInsertColumns(final FieldsContext 
fields) {
+        List<ColumnSegment> result = new LinkedList<>();
+        for (InsertIdentifierContext each : fields.insertIdentifier()) {
+            result.add((ColumnSegment) visit(each));
         }
+        return result;
     }
-    
+
     private Collection<InsertValuesSegment> createReplaceValuesSegments(final 
Collection<MySQLStatementParser.AssignmentValuesContext> 
assignmentValuesContexts) {
         Collection<InsertValuesSegment> result = new LinkedList<>();
         for (MySQLStatementParser.AssignmentValuesContext each : 
assignmentValuesContexts) {
@@ -1009,7 +1057,7 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
     
     @Override
     public ASTNode visitAssignment(final AssignmentContext ctx) {
-        ColumnSegment column = (ColumnSegment) 
visitColumnName(ctx.columnName());
+        ColumnSegment column = (ColumnSegment) visit(ctx.columnRef());
         ExpressionSegment value = (ExpressionSegment) 
visit(ctx.assignmentValue());
         return new AssignmentSegment(ctx.getStart().getStartIndex(), 
ctx.getStop().getStopIndex(), column, value);
     }
@@ -1030,7 +1078,7 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
     
     @Override
     public ASTNode visitBlobValue(final BlobValueContext ctx) {
-        return new StringLiteralValue(ctx.STRING_().getText());
+        return new StringLiteralValue(ctx.string_().getText());
     }
     
     @Override
@@ -1165,10 +1213,7 @@ public abstract class MySQLStatementSQLVisitor extends 
MySQLStatementBaseVisitor
     
     @Override
     public ASTNode visitAlias(final AliasContext ctx) {
-        if (null != ctx.identifier()) {
-            return new AliasSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(), (IdentifierValue) visit(ctx.identifier()));
-        }
-        return new AliasSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(), new IdentifierValue(ctx.STRING_().getText()));
+        return new AliasSegment(ctx.start.getStartIndex(), 
ctx.stop.getStopIndex(), new IdentifierValue(ctx.textOrIdentifier().getText()));
     }
     
     private ASTNode createProjection(final ProjectionContext ctx, final 
AliasSegment alias, final ASTNode projection) {
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select.xml
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select.xml
index 7bef203..4b809c7 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select.xml
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/case/dml/select.xml
@@ -23,6 +23,19 @@
         </projections>
     </select>
 
+    <select sql-case-id="select_sqlmode_ansi_quotes" >
+        <projections start-index="7" stop-index="10">
+            <expression-projection start-index="7" stop-index="10" />
+        </projections>
+        <from>
+            <simple-table name="t_order" start-delimiter='"' end-delimiter='"' 
start-index="17" stop-index="25" />
+        </from>
+<!--        TODO support where-->
+        <where start-index="27" stop-index="49">
+
+        </where>
+    </select>
+
     <select sql-case-id="select_with_union">
     </select>
     
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/ddl/create.xml
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/ddl/create.xml
index 220c9c1..ba66527 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/ddl/create.xml
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/ddl/create.xml
@@ -37,7 +37,7 @@
         column2 VARCHAR(10),
         column3 VARCHAR(10)
     )"     db-types="MySQL,Oracle,SQLServer" />
-    <sql-case id="create_table_with_back_quota" value="CREATE TABLE `t_order` 
(`order_id` INT, `user_id` INT, `status` VARCHAR(10), `column1` VARCHAR(10), 
`column2` VARCHAR(10), `column3` VARCHAR(10))" db-types="MySQL" />
+    <sql-case id="create_table_with_back_quota" value="CREATE TABLE `t_order` 
(`order_id` INT, `user_id` INT, `status` VARCHAR(10), `column1` VARCHAR(10), 
`column2` VARCHAR(10), `column3` VARCHAR(10)) ENGINE=INNODB" db-types="MySQL" />
     <sql-case id="create_temporary_table" value="CREATE TEMPORARY TABLE 
t_order (order_id INT, user_id INT, status VARCHAR(10), column1 VARCHAR(10), 
column2 VARCHAR(10), column3 VARCHAR(10))" db-types="MySQL" />
     <sql-case id="create_table_with_column_not_null" value="CREATE TABLE 
t_order (order_id INT NOT NULL, user_id INT, status VARCHAR(10), column1 
VARCHAR(10), column2 VARCHAR(10), column3 VARCHAR(10))" 
db-types="MySQL,Oracle,PostgreSQL,SQLServer" />
     <sql-case id="create_table_with_column_default" value="CREATE TABLE 
t_order (order_id INT DEFAULT 0, user_id INT, status VARCHAR(10), column1 
VARCHAR(10), column2 VARCHAR(10), column3 VARCHAR(10))" 
db-types="MySQL,PostgreSQL,SQLServer" />
diff --git 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/select.xml
 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/select.xml
index e7001e1..c458684 100644
--- 
a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/select.xml
+++ 
b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/resources/sql/supported/dml/select.xml
@@ -18,6 +18,7 @@
 
 <sql-cases>
     <sql-case id="select_constant_without_table" value="SELECT 1 as a" />
+    <sql-case id="select_sqlmode_ansi_quotes" value='select "id" from 
"t_order" where "t_order"."id"=10' db-types="MySQL" />
     <sql-case id="select_with_union" value="SELECT * from table1 union select 
* from table2" db-types="PostgreSQL"/>
     <sql-case id="select_with_function_name" value="SELECT current_timestamp" 
db-types="MySQL"/>
     <sql-case id="select_with_same_table_name_and_alias" value="SELECT 
t_order.* FROM t_order t_order WHERE user_id = ? AND order_id = ?" />

Reply via email to