You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by pa...@apache.org on 2021/02/23 03:18:03 UTC

[shardingsphere] branch master updated: Fix parser support of MySQL grant and revoke (#9467)

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 bfc3e20  Fix parser support of MySQL grant and revoke (#9467)
bfc3e20 is described below

commit bfc3e20b3e648b28dd19046a2c6d3ec3680cf082
Author: JingShang Lu <lu...@apache.org>
AuthorDate: Mon Feb 22 19:17:38 2021 -0800

    Fix parser support of MySQL grant and revoke (#9467)
    
    * add support grant
    
    * add visitor and format code
    
    * fix
    
    * Update BaseRule.g4
---
 .../src/main/antlr4/imports/mysql/BaseRule.g4      | 825 +++++++++++++++------
 .../src/main/antlr4/imports/mysql/DALStatement.g4  |   4 +-
 .../src/main/antlr4/imports/mysql/DCLStatement.g4  | 141 ++--
 .../src/main/antlr4/imports/mysql/DMLStatement.g4  |   6 +-
 .../src/main/antlr4/imports/mysql/MySQLKeyword.g4  |  46 +-
 .../src/main/antlr4/imports/mysql/RLStatement.g4   |   4 +-
 .../impl/MySQLDCLStatementSQLVisitor.java          | 399 +++++++++-
 .../statement/impl/MySQLStatementSQLVisitor.java   |   7 -
 .../sql/parser/core/visitor/SQLVisitorRule.java    |  10 +
 .../segment/generic/ACLTypeEnum.java}              |  13 +-
 .../segment/generic/GrantLevelSegment.java}        |  23 +-
 .../segment/generic/GrantLevelTypeEnum.java}       |  13 +-
 .../common/segment/generic/PrivilegeTypeEnum.java  |  88 +++
 .../statement/mysql/dcl/MySQLGrantStatement.java   |  21 +
 .../statement/mysql/dcl/MySQLRevokeStatement.java  |  23 +
 .../MySQLPrivilegeSegment.java}                    |  27 +-
 .../MySQLRoleOrPrivilegeSegment.java}              |  25 +-
 .../statement/dcl/impl/GrantStatementAssert.java   |   7 +-
 .../statement/dcl/impl/RevokeStatementAssert.java  |   7 +-
 19 files changed, 1296 insertions(+), 393 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 f3bf9d1..1021e54 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
@@ -22,7 +22,7 @@ import Symbol, Keyword, MySQLKeyword, Literals;
 parameterMarker
     : QUESTION_
     ;
-
+    
 customKeyword
     : MAX
     | MIN
@@ -47,7 +47,7 @@ customKeyword
     | INNODB
     | REDO_LOG
     ;
-
+    
 literals
     : stringLiterals
     | numberLiterals
@@ -57,225 +57,628 @@ literals
     | booleanLiterals
     | nullValueLiterals
     ;
-
+    
 string_
     : DOUBLE_QUOTED_TEXT | SINGLE_QUOTED_TEXT
     ;
-
+    
 stringLiterals
     : UNDERSCORE_CHARSET? string_ | NCHAR_TEXT
     ;
-
+    
 numberLiterals
-   : NUMBER_
-   ;
-
+    : NUMBER_
+    ;
+    
 temporalLiterals
     : (DATE | TIME | TIMESTAMP) SINGLE_QUOTED_TEXT
     ;
-
+    
 hexadecimalLiterals
     : UNDERSCORE_CHARSET? HEX_DIGIT_ collateClause?
     ;
-
+    
 bitValueLiterals
     : UNDERSCORE_CHARSET? BIT_NUM_ collateClause?
     ;
-
+    
 booleanLiterals
     : TRUE | FALSE
     ;
-
+    
 nullValueLiterals
     : NULL
     ;
-
+    
 collationName
-   : textOrIdentifier | BINARY
-   ;
-
+    : textOrIdentifier | BINARY
+    ;
+    
 identifier
-    : IDENTIFIER_ | unreservedWord | customKeyword | DOUBLE_QUOTED_TEXT
+    : IDENTIFIER_
+    | identifierKeywordsUnambiguous
+    | identifierKeywordsAmbiguous1RolesAndLabels
+    | identifierKeywordsAmbiguous2Labels
+    | identifierKeywordsAmbiguous3Roles
+    | identifierKeywordsAmbiguous4SystemVariables
+    | customKeyword
+    | DOUBLE_QUOTED_TEXT
     ;
-
-unreservedWord
-    : ACCOUNT | ACTION | ACTIVE | ADMIN | AFTER | AGAINST | AGGREGATE | ALGORITHM | ALWAYS |  ANY
-    | ASCII | AT | ATTRIBUTE | AUTOEXTEND_SIZE | AUTO_INCREMENT | AVG
-    | AVG_ROW_LENGTH | BACKUP | BEGIN | BINLOG | BIT | BLOCK | BOOL | BOOLEAN | BTREE | BUCKETS | BYTE
-    | CACHE | CASCADED | CATALOG_NAME | CHAIN | CHANGED | CHANNEL | CHARSET | CHECKSUM | CIPHER | CLASS_ORIGIN
-    | CLIENT | CLONE | CLOSE | COALESCE | CODE | COLLATION | COLUMNS | COLUMN_FORMAT | COLUMN_NAME | COMMENT | COMMIT | COMMITTED
-    | COMPACT | COMPLETION | COMPONENT | COMPRESSED | COMPRESSION | CONCURRENT | CONNECTION | CONSISTENT
-    | CONSTRAINT_CATALOG | CONSTRAINT_NAME | CONSTRAINT_SCHEMA | CONTAINS | CONTEXT | CPU | CURRENT | CURSOR_NAME
-    | DATA | DATAFILE | DATE | DATETIME | DAY | DEFAULT_AUTH | DEFINER | DEFINITION | DEALLOCATE | DELAY_KEY_WRITE
-    | DESCRIPTION | DIAGNOSTICS | DIRECTORY | DISABLE | DISCARD | DISK | DO | DUMPFILE | DUPLICATE | DYNAMIC | ENABLE
-    | ENCRYPTION | ENFORCED | END | ENDS | ENGINE | ENGINES | ENGINE_ATTRIBUTE | ENUM | ERROR | ERRORS
-    | ESCAPE | EVENT | EVENTS | EVERY | EXCHANGE | EXCLUDE | EXECUTE | EXPANSION | EXPIRE | EXPORT | EXTENDED
-    | EXTENT_SIZE | FAILED_LOGIN_ATTEMPTS | FAST | FAULTS | FIELDS | FILE | FILE_BLOCK_SIZE | FILTER | FIRST
-    | FIXED | FLUSH | FOLLOWING | FOLLOWS | FORMAT | FULL | GENERAL | GEOMCOLLECTION | GEOMETRY | GEOMETRYCOLLECTION
-    | GET_FORMAT | GET_MASTER_PUBLIC_KEY | GLOBAL | GRANTS | GROUP_REPLICATION | HANDLER | HASH | HELP | HISTOGRAM | HISTORY | HOST
-    | HOSTS | HOUR | IDENTIFIED | IGNORE_SERVER_IDS | IMPORT | INACTIVE | INDEXES | INITIAL_SIZE
-    | INSERT_METHOD | INSTALL | INSTANCE | INVISIBLE | INVOKER | IO | IO_THREAD | IPC | ISOLATION | ISSUER
-    | JSON | JSON_VALUE | KEY_BLOCK_SIZE | LANGUAGE | LAST | LEAVES | LESS
-    | LEVEL | LINESTRING | LIST | LOCAL | LOCKED | LOCKS | LOGFILE | LOGS | MANAGED | MASTER | MASTER_AUTO_POSITION
-    | MASTER_COMPRESSION_ALGORITHMS | MASTER_CONNECT_RETRY | MASTER_DELAY | MASTER_HEARTBEAT_PERIOD | MASTER_HOST
-    | MASTER_LOG_FILE | MASTER_LOG_POS | MASTER_PASSWORD | MASTER_PUBLIC_KEY_PATH | MASTER_PORT | MASTER_RETRY_COUNT
-    | MASTER_SERVER_ID | MASTER_SSL | MASTER_SSL_CA | MASTER_SSL_CAPATH | MASTER_SSL_CERT | MASTER_SSL_CIPHER
-    | MASTER_SSL_CRL | MASTER_SSL_CRLPATH | MASTER_SSL_KEY | MASTER_TLS_CIPHERSUITES | MASTER_TLS_VERSION | MASTER_USER
-    | MASTER_ZSTD_COMPRESSION_LEVEL | MAX_CONNECTIONS_PER_HOUR | MAX_QUERIES_PER_HOUR | MAX_ROWS | MAX_SIZE | MAX_UPDATES_PER_HOUR
-    | MAX_USER_CONNECTIONS | MEDIUM | MEMORY | MERGE | MESSAGE_TEXT | MICROSECOND | MIGRATE | MINUTE | MIN_ROWS | MODE
-    | MODIFY | MONTH | MULTILINESTRING | MULTIPOINT | MULTIPOLYGON | MUTEX | MYSQL_ERRNO | NAME | NAMES
-    | NATIONAL | NCHAR | NDB | NDBCLUSTER | NESTED | NETWORK_NAMESPACE | NEVER | NEW | NEXT | NO | NODEGROUP
-    | NONE | NOWAIT | NO_WAIT | NULLS | NUMBER | NVARCHAR | OFFSET | OFF | OJ | OLD | ONE | ONLY | OPEN | OPTIONAL | OPTIONS
-    | ORDINALITY | OTHERS | OWNER | PACK_KEYS | PAGE | PARSER | PARTIAL | PARTITIONING | PASSWORD | PASSWORD_LOCK_TIME
-    | PATH | PERSIST | PERSIST_ONLY | PHASE | PLUGIN | PLUGINS | PLUGIN_DIR | POINT | POLYGON | PORT | PRECEDES
-    | PRECEDING | PREPARE | PRESERVE | PREV | PRIVILEGES | PRIVILEGE_CHECKS_USER | PROCESS | PROCESSLIST | PROFILE
-    | PROFILES | PROXY | QUARTER | QUERY| QUICK | RANDOM | READ_ONLY | REBUILD | RECOVER | REDO_BUFFER_SIZE
-    | REDUNDANT | REFERENCE | RELAY | RELAYLOG | RELAY_LOG_FILE | RELAY_LOG_POS | RELAY_THREAD
-    | RELOAD | REMOVE | REORGANIZE | REPAIR | REPEATABLE | REPLICATE_DO_DB | REPLICATE_DO_TABLE | REPLICATE_IGNORE_DB
-    | REPLICATE_IGNORE_TABLE | REPLICATE_REWRITE_DB | REPLICATE_WILD_DO_TABLE | REPLICATE_WILD_IGNORE_TABLE | REPLICATION
-    | REQUIRE_ROW_FORMAT | RESET | RESOURCE | RESPECT | RESTART | RESTORE | RESUME | RETAIN | RETURNED_SQLSTATE
-    | RETURNING | RETURNS | REUSE | REVERSE | ROLE | ROLLBACK | ROLLUP | ROTATE | ROUTINE | ROW_COUNT
-    | ROW_FORMAT | RTREE | SAVEPOINT | SCHEDULE | SCHEMA_NAME | SECOND | SECONDARY | SECONDARY_ENGINE
-    | SECONDARY_ENGINE_ATTRIBUTE | SECONDARY_LOAD | SECONDARY_UNLOAD | SECURITY | SERIAL | SERIALIZABLE | SERVER
-    | SESSION | SHARE | SHUTDOWN | SIGNED | SIMPLE | SLAVE | SLOW | SNAPSHOT | SOCKET | SOME | SONAME
-    | SOUNDS | SOURCE | SQL_AFTER_GTIDS | SQL_AFTER_MTS_GAPS | SQL_BEFORE_GTIDS | SQL_BUFFER_RESULT | SQL_NO_CACHE
-    | SQL_THREAD | SQL_TSI_DAY | SQL_TSI_HOUR | SQL_TSI_MINUTE | SQL_TSI_MONTH | SQL_TSI_QUARTER | SQL_TSI_SECOND
-    | SQL_TSI_WEEK | SQL_TSI_YEAR | SRID | STACKED | START | STARTS | STATS_AUTO_RECALC | STATS_PERSISTENT
-    | STATS_SAMPLE_PAGES | STATUS | STOP | STORAGE | STREAM | STRING | SUBCLASS_ORIGIN | SUBJECT | SUBPARTITION
-    | SUBPARTITIONS | SUPER | SUSPEND | SWAPS | SWITCHES | SQL_CACHE | TABLES | TABLESPACE | TABLE_CHECKSUM
-    | TABLE_NAME | TEMPORARY | TEMPTABLE | TEXT | THAN | THREAD_PRIORITY | TIES | TIME | TIMESTAMP | TIMESTAMPADD
-    | TIMESTAMPDIFF | TLS | TRANSACTION | TRIGGERS | TRUNCATE | TYPE | TYPES | UNBOUNDED | UNCOMMITTED | UNDEFINED
-    | UNDOFILE | UNDO_BUFFER_SIZE | UNICODE | UNINSTALL | UNKNOWN | UNTIL
-    | UPGRADE | USER | USER_RESOURCES | USE_FRM | VALIDATION | VALUE | VARIABLES | VCPU | VIEW | VISIBLE
-    | WAIT | WARNINGS | WEEK | WEIGHT_STRING | WITHOUT | WORK | WRAPPER | X509 | XA | XID | XML | YEAR | COLUMN_NAME 
+    
+identifierKeywordsUnambiguous
+    : ACTION
+    | ACCOUNT
+    | ACTIVE
+//    | ADDDATE
+    | ADMIN
+    | AFTER
+    | AGAINST
+    | AGGREGATE
+    | ALGORITHM
+    | ALWAYS
+    | ANY
+    | ARRAY
+    | AT
+    | ATTRIBUTE
+    | AUTOEXTEND_SIZE
+    | AUTO_INCREMENT
+    | AVG_ROW_LENGTH
+    | AVG
+    | BACKUP
+    | BINLOG
+    | BIT
+    | BLOCK
+    | BOOLEAN
+    | BOOL
+    | BTREE
+    | BUCKETS
+    | CASCADED
+    | CATALOG_NAME
+    | CHAIN
+    | CHANGED
+    | CHANNEL
+    | CIPHER
+    | CLASS_ORIGIN
+    | CLIENT
+    | CLOSE
+    | COALESCE
+    | CODE
+    | COLLATION
+    | COLUMNS
+    | COLUMN_FORMAT
+    | COLUMN_NAME
+    | COMMITTED
+    | COMPACT
+    | COMPLETION
+    | COMPONENT
+    | COMPRESSED
+    | COMPRESSION
+    | CONCURRENT
+    | CONNECTION
+    | CONSISTENT
+    | CONSTRAINT_CATALOG
+    | CONSTRAINT_NAME
+    | CONSTRAINT_SCHEMA
+    | CONTEXT
+    | CPU
+    | CURRENT
+    | CURSOR_NAME
+    | DATAFILE
+    | DATA
+    | DATETIME
+    | DATE
+    | DAY
+    | DEFAULT_AUTH
+    | DEFINER
+    | DEFINITION
+    | DELAY_KEY_WRITE
+    | DESCRIPTION
+    | DIAGNOSTICS
+    | DIRECTORY
+    | DISABLE
+    | DISCARD
+    | DISK
+    | DUMPFILE
+    | DUPLICATE
+    | DYNAMIC
+    | ENABLE
+    | ENCRYPTION
+    | ENDS
+    | ENFORCED
+    | ENGINES
+    | ENGINE
+    | ENGINE_ATTRIBUTE
+    | ENUM
+    | ERRORS
+    | ERROR
+    | ESCAPE
+    | EVENTS
+    | EVERY
+    | EXCHANGE
+    | EXCLUDE
+    | EXPANSION
+    | EXPIRE
+    | EXPORT
+    | EXTENDED
+    | EXTENT_SIZE
+    | FAILED_LOGIN_ATTEMPTS
+    | FAST
+    | FAULTS
+    | FILE_BLOCK_SIZE
+    | FILTER
+    | FIRST
+    | FIXED
+    | FOLLOWING
+    | FORMAT
+    | FOUND
+    | FULL
+    | GENERAL
+    | GEOMETRYCOLLECTION
+    | GEOMETRY
+    | GET_FORMAT
+    | GET_MASTER_PUBLIC_KEY
+    | GRANTS
+    | GROUP_REPLICATION
+    | HASH
+    | HISTOGRAM
+    | HISTORY
+    | HOSTS
+    | HOST
+    | HOUR
+    | IDENTIFIED
+    | IGNORE_SERVER_IDS
+    | INACTIVE
+    | INDEXES
+    | INITIAL_SIZE
+    | INSERT_METHOD
+    | INSTANCE
+    | INVISIBLE
+    | INVOKER
+    | IO
+    | IPC
+    | ISOLATION
+    | ISSUER
+    | JSON
+    | JSON_VALUE
+    | KEY_BLOCK_SIZE
+    | LAST
+    | LEAVES
+    | LESS
+    | LEVEL
+    | LINESTRING
+    | LIST
+    | LOCKED
+    | LOCKS
+    | LOGFILE
+    | LOGS
+    | MASTER_AUTO_POSITION
+    | MASTER_COMPRESSION_ALGORITHM
+    | MASTER_CONNECT_RETRY
+    | MASTER_DELAY
+    | MASTER_HEARTBEAT_PERIOD
+    | MASTER_HOST
+    | NETWORK_NAMESPACE
+    | MASTER_LOG_FILE
+    | MASTER_LOG_POS
+    | MASTER_PASSWORD
+    | MASTER_PORT
+    | MASTER_PUBLIC_KEY_PATH
+    | MASTER_RETRY_COUNT
+    | MASTER_SERVER_ID
+    | MASTER_SSL_CAPATH
+    | MASTER_SSL_CA
+    | MASTER_SSL_CERT
+    | MASTER_SSL_CIPHER
+    | MASTER_SSL_CRLPATH
+    | MASTER_SSL_CRL
+    | MASTER_SSL_KEY
+    | MASTER_SSL
+    | MASTER
+    | MASTER_TLS_CIPHERSUITES
+    | MASTER_TLS_VERSION
+    | MASTER_USER
+    | MASTER_ZSTD_COMPRESSION_LEVEL
+    | MAX_CONNECTIONS_PER_HOUR
+    | MAX_QUERIES_PER_HOUR
+    | MAX_ROWS
+    | MAX_SIZE
+    | MAX_UPDATES_PER_HOUR
+    | MAX_USER_CONNECTIONS
+    | MEDIUM
     | MEMBER
+    | MEMORY
+    | MERGE
+    | MESSAGE_TEXT
+    | MICROSECOND
+    | MIGRATE
+    | MINUTE
+    | MIN_ROWS
+    | MODE
+    | MODIFY
+    | MONTH
+    | MULTILINESTRING
+    | MULTIPOINT
+    | MULTIPOLYGON
+    | MUTEX
+    | MYSQL_ERRNO
+    | NAMES
+    | NAME
+    | NATIONAL
+    | NCHAR
+    | NDBCLUSTER
+    | NESTED
+    | NEVER
+    | NEW
+    | NEXT
+    | NODEGROUP
+    | NOWAIT
+    | NO_WAIT
+    | NULLS
+    | NUMBER
+    | NVARCHAR
+    | OFF
+    | OFFSET
+    | OJ
+    | OLD
+    | ONE
+    | ONLY
+    | OPEN
+    | OPTIONAL
+    | OPTIONS
+    | ORDINALITY
+    | ORGANIZATION
+    | OTHERS
+    | OWNER
+    | PACK_KEYS
+    | PAGE
+    | PARSER
+    | PARTIAL
+    | PARTITIONING
+    | PARTITIONS
+    | PASSWORD
+    | PASSWORD_LOCK_TIME
+    | PATH
+    | PHASE
+    | PLUGINS
+    | PLUGIN_DIR
+    | PLUGIN
+    | POINT
+    | POLYGON
+    | PORT
+    | PRECEDING
+    | PRESERVE
+    | PREV
+    | PRIVILEGES
+    | PRIVILEGE_CHECKS_USER
+    | PROCESSLIST
+    | PROFILES
+    | PROFILE
+    | QUARTER
+    | QUERY
+    | QUICK
+    | RANDOM
+    | READ_ONLY
+    | REBUILD
+    | RECOVER
+    | REDO_BUFFER_SIZE
+    | REDUNDANT
+    | REFERENCE
+    | RELAY
+    | RELAYLOG
+    | RELAY_LOG_FILE
+    | RELAY_LOG_POS
+    | RELAY_THREAD
+    | REMOVE
+    | REORGANIZE
+    | REPEATABLE
+    | REPLICATE_DO_DB
+    | REPLICATE_DO_TABLE
+    | REPLICATE_IGNORE_DB
+    | REPLICATE_IGNORE_TABLE
+    | REPLICATE_REWRITE_DB
+    | REPLICATE_WILD_DO_TABLE
+    | REPLICATE_WILD_IGNORE_TABLE
+    | REQUIRE_ROW_FORMAT
+//    | REQUIRE_TABLE_PRIMARY_KEY_CHECK
+    | USER_RESOURCES
+    | RESPECT
+    | RESTORE
+    | RESUME
+    | RETAIN
+    | RETURNED_SQLSTATE
+    | RETURNING
+    | RETURNS
+    | REUSE
+    | REVERSE
+    | ROLE
+    | ROLLUP
+    | ROTATE
+    | ROUTINE
+    | ROW_COUNT
+    | ROW_FORMAT
+    | RTREE
+    | SCHEDULE
+    | SCHEMA_NAME
+    | SECONDARY_ENGINE
+    | SECONDARY_ENGINE_ATTRIBUTE
+    | SECONDARY_LOAD
+    | SECONDARY
+    | SECONDARY_UNLOAD
+    | SECOND
+    | SECURITY
+    | SERIALIZABLE
+    | SERIAL
+    | SERVER
+    | SHARE
+    | SIMPLE
+//    | SKIP
+    | SLOW
+    | SNAPSHOT
+    | SOCKET
+    | SONAME
+    | SOUNDS
+    | SOURCE
+    | SQL_AFTER_GTIDS
+    | SQL_AFTER_MTS_GAPS
+    | SQL_BEFORE_GTIDS
+    | SQL_BUFFER_RESULT
+    | SQL_NO_CACHE
+    | SQL_THREAD
+    | SRID
+    | STACKED
+    | STARTS
+    | STATS_AUTO_RECALC
+    | STATS_PERSISTENT
+    | STATS_SAMPLE_PAGES
+    | STATUS
+    | STORAGE
+    | STREAM
+    | STRING
+    | SUBCLASS_ORIGIN
+//    | SUBDATE
+    | SUBJECT
+    | SUBPARTITIONS
+    | SUBPARTITION
+    | SUSPEND
+    | SWAPS
+    | SWITCHES
+    | TABLES
+    | TABLESPACE
+    | TABLE_CHECKSUM
+    | TABLE_NAME
+    | TEMPORARY
+    | TEMPTABLE
+    | TEXT
+    | THAN
+    | THREAD_PRIORITY
+    | TIES
+    | TIMESTAMP_ADD
+    | TIMESTAMP_DIFF
+    | TIMESTAMP
+    | TIME
+    | TLS
+    | TRANSACTION
+    | TRIGGERS
+    | TYPES
+    | TYPE
+    | UNBOUNDED
+    | UNCOMMITTED
+    | UNDEFINED
+    | UNDOFILE
+    | UNDO_BUFFER_SIZE
+    | UNKNOWN
+    | UNTIL
+    | UPGRADE
+    | USER
+    | USE_FRM
+    | VALIDATION
+    | VALUE
+    | VARIABLES
+    | VCPU
+    | VIEW
+    | VISIBLE
+    | WAIT
+    | WARNINGS
+    | WEEK
+    | WEIGHT_STRING
+    | WITHOUT
+    | WORK
+    | WRAPPER
+    | X509
+    | XID
+    | XML
+    | YEAR
     ;
-
+    
+identifierKeywordsAmbiguous1RolesAndLabels
+    : EXECUTE
+    | RESTART
+    | SHUTDOWN
+    ;
+    
+identifierKeywordsAmbiguous2Labels
+    : ASCII
+    | BEGIN
+    | BYTE
+    | CACHE
+    | CHARSET
+    | CHECKSUM
+    | CLONE
+    | COMMENT
+    | COMMIT
+    | CONTAINS
+    | DEALLOCATE
+    | DO
+    | END
+    | FLUSH
+    | FOLLOWS
+    | HANDLER
+    | HELP
+    | IMPORT
+    | INSTALL
+    | LANGUAGE
+    | NO
+    | PRECEDES
+    | PREPARE
+    | REPAIR
+    | RESET
+    | ROLLBACK
+    | SAVEPOINT
+    | SIGNED
+    | SLAVE
+    | START
+    | STOP
+    | TRUNCATE
+    | UNICODE
+    | UNINSTALL
+    | XA
+    ;
+    
+identifierKeywordsAmbiguous3Roles
+    : EVENT
+    | FILE
+    | NONE
+    | PROCESS
+    | PROXY
+    | RELOAD
+    | REPLICATION
+    | RESOURCE
+    | SUPER
+    ;
+    
+identifierKeywordsAmbiguous4SystemVariables
+    : GLOBAL
+    | LOCAL
+    | PERSIST
+    | PERSIST_ONLY
+    | SESSION
+    ;
+    
 textOrIdentifier
     : identifier | string_
     ;
-
+    
 variable
     : userVariable | systemVariable
     ;
-
+    
 userVariable
     : AT_ textOrIdentifier
     ;
-
+    
 systemVariable
     : AT_ AT_ systemVariableScope=(GLOBAL | SESSION | LOCAL)? textOrIdentifier (DOT_ identifier)?
     ;
-
+    
 setSystemVariable
     : AT_ AT_ (optionType DOT_)? internalVariableName
     ;
-
+    
 optionType
     : GLOBAL | PERSIST | PERSIST_ONLY | SESSION | LOCAL
     ;
-
+    
 internalVariableName
     : identifier
     | DEFAULT DOT_ identifier
     | identifier DOT_ identifier
     ;
-
+    
 setExprOrDefault
     : expr | DEFAULT | ALL | ON | BINARY | ROW | SYSTEM
     ;
-
+    
 transactionCharacteristics
     : transactionAccessMode (COMMA_ isolationLevel)?
     | isolationLevel (COMMA_ transactionAccessMode)?
     ;
-
+    
 isolationLevel
     : ISOLATION LEVEL isolationTypes
     ;
-
+    
 isolationTypes
     : REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE
     ;
-
+    
 transactionAccessMode
     : READ (WRITE | ONLY)
     ;
-
+    
 schemaName
     : identifier
     ;
-
+    
 schemaNames
     : schemaName (COMMA_ schemaName)*
     ;
-
+    
 charsetName
     : textOrIdentifier | BINARY
     ;
-
+    
 schemaPairs
     : schemaPair (COMMA_ schemaPair)*
     ;
-
+    
 schemaPair
     : LP_ schemaName COMMA_ schemaName RP_
     ;
-
+    
 tableName
     : (owner DOT_)? name
     ;
-
+    
 columnName
     : identifier
     ;
-
+    
 indexName
     : identifier
     ;
-
+    
 userIdentifierOrText
     : textOrIdentifier (AT_ textOrIdentifier)?
     ;
-
+    
 userName
     : userIdentifierOrText | CURRENT_USER (LP_ RP_)?
     ;
-
+    
 eventName
     : identifier (DOT_ identifier)?
     ;
-
+    
 serverName
     : textOrIdentifier
     ; 
-
+    
 wrapperName
     : textOrIdentifier
     ;
-
+    
 functionName
     : identifier
     | (owner DOT_)? identifier
     ;
-
+    
 viewName
     : identifier
     | (owner DOT_)? identifier
     ;
-
+    
 owner
     : identifier
     ;
-
+    
 alias
     : textOrIdentifier
     ;
-
+    
 name
     : identifier
     ;
-
+    
 tableList
     : tableName (COMMA_ tableName)*
     ;
@@ -283,114 +686,118 @@ tableList
 viewNames
     : viewName (COMMA_ viewName)*
     ;
-
+    
 columnNames
     : columnName (COMMA_ columnName)*
     ;
-
+    
 groupName
     : identifier
     ;
-
+    
 routineName
     : identifier
     ;
-
+    
 shardLibraryName
     : stringLiterals
     ;
-
+    
 componentName
     : string_
     ;
-
+    
 pluginName
     : identifier
     ;
-
+    
 hostName
     : string_
     ;
-
+    
 port
     : NUMBER_
     ;
-
+    
 cloneInstance
     : userName AT_ hostName COLON_ port
     ;
-
+    
 cloneDir
     : string_
     ;
-
+    
 channelName
     : identifier (DOT_ identifier)?
     ;
-
+    
 logName
     : stringLiterals
     ;
-
+    
 roleName
-    : (string_ | IDENTIFIER_) AT_ (string_ | IDENTIFIER_) | IDENTIFIER_
+    : roleIdentifierOrText (AT_ textOrIdentifier)?
     ;
-
+    
+roleIdentifierOrText
+    : identifier | string_
+    ;
+    
 engineRef
     : textOrIdentifier
     ;
-
+    
 triggerName
     : identifier (DOT_ identifier)?
     ;
-
+    
 triggerTime
     : BEFORE | AFTER
     ;
-
+    
 tableOrTables
     : TABLE | TABLES
     ;
-
+    
 userOrRole
     : userName | roleName
     ;
-
+    
 partitionName
     : identifier
     ;
-
+    
 identifierList
     : identifier (COMMA_ identifier)*
     ;
-
+    
 allOrPartitionNameList
     : ALL | identifierList
     ;
-
+    
 triggerEvent
     : INSERT | UPDATE | DELETE
     ;
-
+    
 triggerOrder
     : (FOLLOWS | PRECEDES) triggerName
     ;
-
+    
 expr
     : booleanPrimary
     | expr logicalOperator expr
     | expr XOR expr
     | notOperator expr
     ;
-
+    
 logicalOperator
     : OR | OR_ | AND | AND_
     ;
-
+    
 notOperator
     : NOT | NOT_
     ;
-
+    
 booleanPrimary
     : booleanPrimary IS NOT? (TRUE | FALSE | UNKNOWN | NULL)
     | booleanPrimary SAFE_EQ_ predicate
@@ -398,11 +805,11 @@ booleanPrimary
     | booleanPrimary comparisonOperator (ALL | ANY) subquery
     | predicate
     ;
-
+    
 comparisonOperator
     : EQ_ | GTE_ | GT_ | LTE_ | LT_ | NEQ_
     ;
-
+    
 predicate
     : bitExpr NOT? IN subquery
     | bitExpr NOT? IN LP_ expr (COMMA_ expr)* RP_
@@ -412,7 +819,7 @@ predicate
     | bitExpr NOT? REGEXP bitExpr
     | bitExpr
     ;
-
+    
 bitExpr
     : bitExpr VERTICAL_BAR_ bitExpr
     | bitExpr AMPERSAND_ bitExpr
@@ -430,7 +837,7 @@ bitExpr
     | bitExpr MINUS_ intervalExpression
     | simpleExpr
     ;
-
+    
 simpleExpr
     : functionCall
     | parameterMarker
@@ -448,68 +855,68 @@ simpleExpr
     | caseExpression
     | intervalExpression
     ;
-
+    
 columnRef
     : identifier (DOT_ identifier)? (DOT_ identifier)?
     ;
-
+    
 columnRefList
     : columnRef (COMMA_ columnRef)*
     ;
-
+    
 functionCall
     : aggregationFunction | specialFunction | regularFunction 
     ;
-
+    
 aggregationFunction
     : aggregationFunctionName LP_ distinct? (expr (COMMA_ expr)* | ASTERISK_)? RP_ overClause?
     ;
-
+    
 aggregationFunctionName
     : MAX | MIN | SUM | COUNT | AVG
     ;
-
+    
 distinct
     : DISTINCT
     ;
-
+    
 overClause
     : OVER (LP_ windowSpecification RP_ | identifier)
     ;
-
+    
 windowSpecification
     : LP_ identifier? (PARTITION BY expr (COMMA_ expr)*)? orderByClause? frameClause? RP_
     ;
-
+    
 frameClause
     : (ROWS | RANGE) (frameStart | frameBetween)
     ;
-
+    
 frameStart
     : CURRENT ROW | UNBOUNDED PRECEDING | UNBOUNDED FOLLOWING | expr PRECEDING | expr FOLLOWING
     ;
-
+    
 frameEnd
     : frameStart
     ;
-
+    
 frameBetween
     : BETWEEN frameStart AND frameEnd
     ;
-
+    
 specialFunction
     : groupConcatFunction | windowFunction | castFunction | convertFunction | positionFunction | substringFunction | extractFunction 
     | charFunction | trimFunction | weightStringFunction | valuesFunction | currentUserFunction
     ;
-
+    
 currentUserFunction
     : CURRENT_USER (LP_ RP_)?
     ;
-
+    
 groupConcatFunction
     : GROUP_CONCAT LP_ distinct? (expr (COMMA_ expr)* | ASTERISK_)? (orderByClause)? (SEPARATOR expr)? RP_
     ;
-
+    
 windowFunction
     : funcName = (ROW_NUMBER | RANK | DENSE_RANK | CUME_DIST | PERCENT_RANK) LP_ RP_ windowingClause
     | funcName = NTILE (simpleExpr) windowingClause
@@ -517,31 +924,31 @@ windowFunction
     | funcName = (FIRST_VALUE | LAST_VALUE) LP_ expr RP_ nullTreatment? windowingClause
     | funcName = NTH_VALUE LP_ expr COMMA_ simpleExpr RP_ (FROM (FIRST | LAST))? nullTreatment? windowingClause
     ;
-
+    
 windowingClause
     : OVER (windowName=identifier | windowSpecification)
     ;
-
+    
 leadLagInfo
     : COMMA_ (NUMBER_ | QUESTION_) (COMMA_ expr)?
     ;
-
+    
 nullTreatment
     : (RESPECT | IGNORE) NULLS
     ;
-
+    
 checkType
     : FOR UPGRADE | QUICK | FAST | MEDIUM | EXTENDED | CHANGED
     ;
-
+    
 repairType
     : QUICK | EXTENDED | USE_FRM
     ;
-
+    
 castFunction
     : CAST LP_ expr AS dataType RP_
     ;
-
+    
 convertFunction
     : CONVERT LP_ expr COMMA_ castType RP_
     | CONVERT LP_ expr USING charsetName RP_
@@ -562,48 +969,48 @@ castType
     | DOUBLE PRECISION
     | FLOAT precision?
     ;
-
+    
 nchar
     : NCHAR | NATIONAL CHAR
     ;
-
+    
 positionFunction
     : POSITION LP_ expr IN expr RP_
     ;
-
+    
 substringFunction
     : (SUBSTRING | SUBSTR) LP_ expr FROM NUMBER_ (FOR NUMBER_)? RP_
     | (SUBSTRING | SUBSTR) LP_ expr COMMA_ NUMBER_ (COMMA_ NUMBER_)? RP_
     ;
-
+    
 extractFunction
     : EXTRACT LP_ identifier FROM expr RP_
     ;
-
+    
 charFunction
     : CHAR LP_ expr (COMMA_ expr)* (USING charsetName)? RP_
     ;
-
+    
 trimFunction
     : TRIM LP_ (LEADING | BOTH | TRAILING) string_ FROM string_ RP_
     ;
-
+    
 valuesFunction
     : VALUES LP_ columnRefList RP_
     ;
-
+    
 weightStringFunction
     : WEIGHT_STRING LP_ expr (AS dataType)? levelClause? RP_
     ;
-
+    
 levelClause
     : LEVEL (levelInWeightListElement (COMMA_ levelInWeightListElement)* | NUMBER_ MINUS_ NUMBER_)
     ;
-
+    
 levelInWeightListElement
     : NUMBER_ direction? REVERSE?
     ;
-
+    
 regularFunction
     : completeRegularFunction
     | shorthandRegularFunction
@@ -612,46 +1019,46 @@ regularFunction
 shorthandRegularFunction
     : CURRENT_DATE | CURRENT_TIME (LP_ NUMBER_? RP_)? | CURRENT_TIMESTAMP | LAST_DAY | LOCALTIME | LOCALTIMESTAMP
     ;
-  
+    
 completeRegularFunction
     : regularFunctionName (LP_ (expr (COMMA_ expr)* | ASTERISK_)? RP_)
     ;
     
 regularFunctionName
     : IF | LOCALTIME | LOCALTIMESTAMP | REPLACE | INTERVAL | MOD
-    | DATABASE | SCHEMA | LEFT | RIGHT | DATE | DAY | GEOMCOLLECTION | GEOMETRYCOLLECTION
+    | DATABASE | SCHEMA | LEFT | RIGHT | DATE | DAY | GEOMETRYCOLLECTION
     | LINESTRING | MULTILINESTRING | MULTIPOINT | MULTIPOLYGON | POINT | POLYGON
-    | TIME | TIMESTAMP | TIMESTAMPADD | TIMESTAMPDIFF | DATE | CURRENT_TIMESTAMP | identifier
+    | TIME | TIMESTAMP | TIMESTAMP_ADD | TIMESTAMP_DIFF | DATE | CURRENT_TIMESTAMP | identifier
     ;
-
+    
 matchExpression
     : MATCH (columnRefList | LP_ columnRefList RP_ ) AGAINST LP_ expr matchSearchModifier? RP_
     ;
-
+    
 matchSearchModifier
     : IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION
     ;
-
+    
 caseExpression
     : CASE simpleExpr? caseWhen+ caseElse? END
     ;
-
+    
 datetimeExpr
     : expr
     ;
-
+    
 binaryLogFileIndexNumber
     : NUMBER_
     ;
-
+    
 caseWhen
     : WHEN expr THEN expr
     ;
-
+    
 caseElse
     : ELSE expr
     ;
-
+    
 intervalExpression
     : INTERVAL intervalValue
     ;
@@ -659,25 +1066,25 @@ intervalExpression
 intervalValue
     : expr intervalUnit
     ;
-
+    
 intervalUnit
     : MICROSECOND | SECOND | MINUTE | HOUR | DAY | WEEK | MONTH
     | QUARTER | YEAR | SECOND_MICROSECOND | MINUTE_MICROSECOND | MINUTE_SECOND | HOUR_MICROSECOND | HOUR_SECOND
     | HOUR_MINUTE | DAY_MICROSECOND | DAY_SECOND | DAY_MINUTE | DAY_HOUR | YEAR_MONTH
     ;
-
+    
 subquery
     : 'refer subquery in DMStement.g4'
     ;
-
+    
 orderByClause
     : ORDER BY orderByItem (COMMA_ orderByItem)*
     ;
-
+    
 orderByItem
     : (numberLiterals | expr) direction?
     ;
-
+    
 dataType
     : dataTypeName = (INTEGER | INT | TINYINT | SMALLINT | MIDDLEINT | MEDIUMINT | BIGINT) fieldLength? fieldOptions?
     | (dataTypeName = REAL | dataTypeName = DOUBLE PRECISION?) precision? fieldOptions?
@@ -708,21 +1115,21 @@ dataType
     | dataTypeName = SET stringList charsetWithOptBinary?
     | dataTypeName = (SERIAL | JSON | GEOMETRY | GEOMETRYCOLLECTION | POINT | MULTIPOINT | LINESTRING | MULTILINESTRING | POLYGON | MULTIPOLYGON)
     ;
-
+    
 stringList
     : LP_ textString (COMMA_ textString)* RP_
     ;
-
+    
 textString
     : string_
     | HEX_DIGIT_
     | BIT_NUM_
     ;
-
+    
 textStringHash
     : string_ | HEX_DIGIT_
     ;
-
+    
 fieldOptions
     : (UNSIGNED | SIGNED | ZEROFILL)+
     ;
@@ -730,7 +1137,7 @@ fieldOptions
 precision
     : LP_ NUMBER_ COMMA_ NUMBER_ RP_
     ;
-
+    
 typeDatetimePrecision
     : LP_ NUMBER_ RP_
     ;
@@ -747,7 +1154,7 @@ ascii
     : ASCII BINARY?
     | BINARY ASCII
     ;
-
+    
 unicode
     : UNICODE BINARY?
     | BINARY UNICODE
@@ -757,72 +1164,72 @@ charset
     : (CHAR | CHARACTER) SET
     | CHARSET
     ;
-
+    
 defaultCollation
     : DEFAULT? COLLATE EQ_? collationName
     ;
-
+    
 defaultEncryption
     : DEFAULT? ENCRYPTION EQ_? string_
     ;
-
+    
 defaultCharset
     : DEFAULT? charset EQ_? charsetName
     ;
-
+    
 signedLiteral
     : literals
     | (PLUS_ | MINUS_) numberLiterals
     ;
-
+    
 now
     : (CURRENT_TIMESTAMP | LOCALTIME | LOCALTIMESTAMP) (LP_ NUMBER_? RP_)?
     ;
-
+    
 columnFormat
     : FIXED
     | DYNAMIC
     | DEFAULT
     ;
-
+    
 storageMedia
     : DISK
     | MEMORY
     | DEFAULT
     ;
-
+    
 direction
     : ASC | DESC
     ;
-
+    
 keyOrIndex
     : KEY | INDEX
     ;
-
+    
 fieldLength
     : LP_ length=NUMBER_ RP_
     ;
-
+    
 characterSet
     : charset charsetName
     ;
-
+    
 collateClause
     : COLLATE collationName
     ;
-
+    
 fieldOrVarSpec
     : LP_ (identifier (COMMA_ identifier)*)? RP_
     ;
-
+    
 notExistClause
     : IF NOT EXISTS
     ;
-
+    
 existClause
     : IF EXISTS
     ;
-
+    
 connectionId
     : NUMBER_
     ;
@@ -838,30 +1245,30 @@ cursorName
 conditionName
     : identifier
     ;
-
+    
 unionOption
     : ALL | DISTINCT
     ;
-
+    
 noWriteToBinLog
     : LOCAL
     | NO_WRITE_TO_BINLOG
     ;
-
+    
 channelOption
     : FOR CHANNEL string_
     ;
-
+    
 preparedStatement
     : PREPARE identifier FROM (stringLiterals | userVariable)
     | executeStatement
     | (DEALLOCATE | DROP) PREPARE identifier
     ;
-
+    
 executeStatement
     : EXECUTE identifier (USING executeVarList)?
     ;
-
+    
 executeVarList
     : userVariable (COMMA_ userVariable)*
     ;
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 0f90d6c..35a17e8 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
@@ -47,7 +47,7 @@ showTableStatus
     ;
 
 showColumns
-    : SHOW EXTENDED? FULL? (COLUMNS | FIELDS) fromTable fromSchema? (showColumnLike | showWhereClause)?
+    : SHOW EXTENDED? FULL? COLUMNS fromTable fromSchema? (showColumnLike | showWhereClause)?
     ;
 
 showIndex
@@ -175,7 +175,7 @@ showFunctionStatus
     ;
 
 showGrant
-    : SHOW GRANTS (FOR userOrRole (USING userName (COMMA_ userName)+)?)?
+    : SHOW GRANTS (FOR userName (USING userName (COMMA_ userName)+)?)?
     ;
 
 showMasterStatus
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 37e3707..eca5a20 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
@@ -20,83 +20,74 @@ grammar DCLStatement;
 import Symbol, Keyword, MySQLKeyword, Literals, BaseRule;
 
 grant
-    : GRANT (proxyClause | privilegeClause | roleClause)
+    : GRANT roleOrPrivileges TO userList withGrantOption? # grantRoleOrPrivilegeTo
+    | GRANT roleOrPrivileges ON aclType? grantIdentifier TO userList withGrantOption? grantAs? # grantRoleOrPrivilegeOnTo
+    | GRANT ALL PRIVILEGES? ON aclType? grantIdentifier TO userList withGrantOption? grantAs? # grantRoleOrPrivilegeOnTo
+    | GRANT PROXY ON userName TO userList withGrantOption? # grantProxy
     ;
 
 revoke
-    : REVOKE (proxyClause | privilegeClause | allClause | roleClause)
-    ;
-
-proxyClause
-    : PROXY ON userOrRole TO userOrRoles withGrantOption?
-    ;
-
-privilegeClause
-    : privileges ON onObjectClause (TO | FROM) userOrRoles withGrantOption? grantOption?
-    ;
-
-roleClause
-    : roles ( TO| FROM) userOrRoles withGrantOption?
-    ;
-
-allClause
-    : ALL PRIVILEGES? COMMA_ GRANT OPTION FROM userOrRoles
-    ;
-
-privileges
-    : privilege (COMMA_ privilege)*
-    ;
-
-privilege
-    : privilegeType (LP_ columnNames RP_)?
-    ;
-
-privilegeType
-    : ALL PRIVILEGES?
-    | ALTER ROUTINE?
-    | CREATE
-    | CREATE ROUTINE
-    | CREATE TABLESPACE
-    | CREATE TEMPORARY TABLES
-    | CREATE USER
-    | CREATE VIEW
-    | DELETE
-    | DROP
-    | DROP ROLE
-    | EVENT
-    | EXECUTE
-    | FILE
-    | GRANT OPTION
-    | INDEX
-    | INSERT
-    | LOCK TABLES
-    | PROCESS
-    | PROXY
-    | REFERENCES
-    | RELOAD
-    | REPLICATION CLIENT
-    | REPLICATION SLAVE
-    | SELECT
-    | SHOW DATABASES
-    | SHOW VIEW
-    | SHUTDOWN
-    | SUPER
-    | TRIGGER
-    | UPDATE
-    | USAGE
-    | identifier
-    ;
-
-onObjectClause
-    : objectType? privilegeLevel
-    ;
-
-objectType
+    : REVOKE roleOrPrivileges FROM userList # revokeFrom
+    | REVOKE roleOrPrivileges ON aclType? grantIdentifier FROM userList # revokeOnFrom
+    | REVOKE ALL PRIVILEGES? ON aclType? grantIdentifier FROM userList # revokeOnFrom
+    | REVOKE ALL PRIVILEGES? COMMA_ GRANT OPTION FROM userList # revokeFrom
+    | REVOKE PROXY ON userName FROM userList # revokeOnFrom
+    ;
+
+userList
+    : userName (COMMA_ userName)*
+    ;
+
+roleOrPrivileges
+    : roleOrPrivilege (COMMA_ roleOrPrivilege)*
+    ;
+
+roleOrPrivilege
+    : roleIdentifierOrText (LP_ columnNames RP_)? # roleOrDynamicPrivilege
+    | roleIdentifierOrText AT_ textOrIdentifier  # roleAtHost
+    | SELECT (LP_ columnNames RP_)?  # staticPrivilegeSelect
+    | INSERT (LP_ columnNames RP_)?  # staticPrivilegeInsert
+    | UPDATE (LP_ columnNames RP_)?  # staticPrivilegeUpdate
+    | REFERENCES (LP_ columnNames RP_)?  # staticPrivilegeReferences
+    | DELETE  # staticPrivilegeDelete
+    | USAGE  # staticPrivilegeUsage
+    | INDEX  # staticPrivilegeIndex
+    | ALTER  # staticPrivilegeAlter
+    | CREATE  # staticPrivilegeCreate
+    | DROP  # staticPrivilegeDrop
+    | EXECUTE  # staticPrivilegeExecute
+    | RELOAD  # staticPrivilegeReload
+    | SHUTDOWN  # staticPrivilegeShutdown
+    | PROCESS  # staticPrivilegeProcess
+    | FILE  # staticPrivilegeFile
+    | GRANT OPTION  # staticPrivilegeGrant
+    | SHOW DATABASES  # staticPrivilegeShowDatabases
+    | SUPER  # staticPrivilegeSuper
+    | CREATE TEMPORARY TABLES  # staticPrivilegeCreateTemporaryTables
+    | LOCK TABLES  # staticPrivilegeLockTables
+    | REPLICATION SLAVE  # staticPrivilegeReplicationSlave
+    | REPLICATION CLIENT  # staticPrivilegeReplicationClient
+    | CREATE VIEW  # staticPrivilegeCreateView
+    | SHOW VIEW  # staticPrivilegeShowView
+    | CREATE ROUTINE  # staticPrivilegeCreateRoutine
+    | ALTER ROUTINE  # staticPrivilegeAlterRoutine
+    | CREATE USER  # staticPrivilegeCreateUser
+    | EVENT  # staticPrivilegeEvent
+    | TRIGGER  # staticPrivilegeTrigger
+    | CREATE TABLESPACE  # staticPrivilegeCreateTablespace
+    | CREATE ROLE  # staticPrivilegeCreateRole
+    | DROP ROLE  # staticPrivilegeDropRole
+    ;
+
+aclType
     : TABLE | FUNCTION | PROCEDURE
     ;
 
-privilegeLevel
-    : ASTERISK_ | ASTERISK_ DOT_ASTERISK_ | identifier DOT_ASTERISK_ | tableName  | schemaName DOT_ routineName
+grantIdentifier
+    : ASTERISK_ # grantLevelGlobal
+    | ASTERISK_ DOT_ASTERISK_ # grantLevelGlobal
+    | schemaName DOT_ASTERISK_ # grantLevelSchemaGlobal
+    | tableName # grantLevelTable
     ;
 
 createUser
@@ -201,8 +192,12 @@ roles
     : roleName (COMMA_ roleName)*
     ;
 
-grantOption
-    : AS userName (WITH ROLE DEFAULT | NONE | ALL | ALL EXCEPT roles | roles )?
+grantAs
+    : AS userName withRoles?
+    ;
+
+withRoles
+    : WITH ROLE (DEFAULT | NONE | ALL | ALL EXCEPT roles | roles)
     ;
 
 userAuthOption
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 41b51cd..2111206 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
@@ -201,7 +201,7 @@ loadDataStatement
       (REPLACE | IGNORE)?
       INTO TABLE tableName partitionNames?
       (CHARACTER SET identifier)?
-      ((FIELDS | COLUMNS) selectFieldsInto+ )?
+      (COLUMNS selectFieldsInto+ )?
       ( LINES selectLinesInto+ )?
       ( IGNORE numberLiterals (LINES | ROWS) )?
       fieldOrVarSpec?
@@ -242,7 +242,7 @@ cteClause
     ;
 
 selectSpecification
-    : duplicateSpecification | HIGH_PRIORITY | STRAIGHT_JOIN | SQL_SMALL_RESULT | SQL_BIG_RESULT | SQL_BUFFER_RESULT | (SQL_CACHE | SQL_NO_CACHE) | SQL_CALC_FOUND_ROWS
+    : duplicateSpecification | HIGH_PRIORITY | STRAIGHT_JOIN | SQL_SMALL_RESULT | SQL_BIG_RESULT | SQL_BUFFER_RESULT | SQL_NO_CACHE | SQL_CALC_FOUND_ROWS
     ;
 
 duplicateSpecification
@@ -367,7 +367,7 @@ selectFieldsInto
 
 selectIntoExpression
     : INTO variable (COMMA_ variable )* | INTO DUMPFILE string_
-    | (INTO OUTFILE string_ (CHARACTER SET charsetName)?((FIELDS | COLUMNS) selectFieldsInto+)? (LINES selectLinesInto+)?)
+    | (INTO OUTFILE string_ (CHARACTER SET charsetName)?(COLUMNS selectFieldsInto+)? (LINES selectLinesInto+)?)
     ;
 
 lockClause
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/MySQLKeyword.g4 b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/MySQLKeyword.g4
index c04197d..9d4cd6c 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/MySQLKeyword.g4
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/antlr4/imports/mysql/MySQLKeyword.g4
@@ -756,7 +756,7 @@ FETCH
     ;
 
 FIELDS
-    : F I E L D S
+    : F I E L D S  -> type(COLUMNS)
     ;
 
 FILE
@@ -851,10 +851,6 @@ GENERATED
     : G E N E R A T E D
     ;
 
-GEOMCOLLECTION
-    : G E O M C O L L E C T I O N
-    ;
-
 GEOMETRY
     : G E O M E T R Y
     ;
@@ -1084,7 +1080,7 @@ IO_BEFORE_GTIDS
     ;
 
 IO_THREAD
-    : I O UL_ T H R E A D
+    : I O UL_ T H R E A D -> type(RELAY_THREAD)
     ;
 
 IPC
@@ -1267,10 +1263,6 @@ LOW_PRIORITY
     : L O W UL_ P R I O R I T Y
     ;
 
-MANAGED
-    : M A N A G E D
-    ;
-
 MASTER
     : M A S T E R
     ;
@@ -1283,7 +1275,7 @@ MASTER_BIND
     : M A S T E R UL_ B I N D
     ;
 
-MASTER_COMPRESSION_ALGORITHMS
+MASTER_COMPRESSION_ALGORITHM
     : M A S T E R UL_ C O M P R E S S I O N UL_ A L G O R I T H M S
     ;
 
@@ -1536,7 +1528,7 @@ NCHAR
     ;
 
 NDB
-    : N D B
+    : N D B -> type(NDBCLUSTER)
     ;
 
 NDBCLUSTER
@@ -2284,7 +2276,7 @@ SOCKET
     ;
 
 SOME
-    : S O M E
+    : S O M E -> type(ANY)
     ;
 
 SONAME
@@ -2311,10 +2303,6 @@ SQL
     : S Q L
     ;
 
-SQL_CACHE
-    : S Q L UL_ C A C H E
-    ;
-
 SQLEXCEPTION
     : S Q L E X C E P T I O N
     ;
@@ -2364,35 +2352,35 @@ SQL_THREAD
     ;
 
 SQL_TSI_DAY
-    : S Q L UL_ T S I UL_ D A Y
+    : S Q L UL_ T S I UL_ D A Y -> type(DAY)
     ;
 
 SQL_TSI_HOUR
-    : S Q L UL_ T S I UL_ H O U R
+    : S Q L UL_ T S I UL_ H O U R -> type(HOUR)
     ;
 
 SQL_TSI_MINUTE
-    : S Q L UL_ T S I UL_ M I N U T E
+    : S Q L UL_ T S I UL_ M I N U T E -> type(MINUTE)
     ;
 
 SQL_TSI_MONTH
-    : S Q L UL_ T S I UL_ M O N T H
+    : S Q L UL_ T S I UL_ M O N T H -> type(MONTH)
     ;
 
 SQL_TSI_QUARTER
-    : S Q L UL_ T S I UL_ Q U A R T E R
+    : S Q L UL_ T S I UL_ Q U A R T E R -> type(QUARTER)
     ;
 
 SQL_TSI_SECOND
-    : S Q L UL_ T S I UL_ S E C O N D
+    : S Q L UL_ T S I UL_ S E C O N D -> type(SECOND)
     ;
 
 SQL_TSI_WEEK
-    : S Q L UL_ T S I UL_ W E E K
+    : S Q L UL_ T S I UL_ W E E K -> type(WEEK)
     ;
 
 SQL_TSI_YEAR
-    : S Q L UL_ T S I UL_ Y E A R
+    : S Q L UL_ T S I UL_ Y E A R -> type(YEAR)
     ;
 
 SRID
@@ -2555,12 +2543,12 @@ TIMESTAMP
     : T I M E S T A M P
     ;
 
-TIMESTAMPADD
-    : T I M E S T A M P A D D
+TIMESTAMP_ADD
+    : T I M E S T A M P UL_ A D D
     ;
 
-TIMESTAMPDIFF
-    : T I M E S T A M P D I F F
+TIMESTAMP_DIFF
+    : T I M E S T A M P UL_ D I F F
     ;
 
 TINYBLOB
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 454027b..1016c1f 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
@@ -60,7 +60,7 @@ threadTypes
     ;
 
 threadType
-    : IO_THREAD | SQL_THREAD
+    : RELAY_THREAD | SQL_THREAD
     ;
 
 utilOption
@@ -95,7 +95,7 @@ masterDef
     | MASTER_AUTO_POSITION EQ_ NUMBER_
     | RELAY_LOG_FILE EQ_ string_
     | RELAY_LOG_POS EQ_ NUMBER_
-    | MASTER_COMPRESSION_ALGORITHMS EQ_ string_
+    | MASTER_COMPRESSION_ALGORITHM EQ_ string_
     | MASTER_ZSTD_COMPRESSION_LEVEL EQ_ NUMBER_
     | MASTER_SSL EQ_ NUMBER_
     | MASTER_SSL_CA EQ_ string_
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/MySQLDCLStatementSQLVisitor.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/MySQLDCLStatementSQLVisitor.java
index 60d32c6..f7c9827 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/MySQLDCLStatementSQLVisitor.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/MySQLDCLStatementSQLVisitor.java
@@ -24,6 +24,7 @@ import org.apache.shardingsphere.sql.parser.api.visitor.type.DCLSQLVisitor;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AccountLockPasswordExpireOptionContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AccountLockPasswordExpireOptionsContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.AlterUserContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ColumnNameContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ConnectOptionContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ConnectOptionsContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateRoleContext;
@@ -34,19 +35,62 @@ import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateU
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CreateUserEntryNoOptionContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropRoleContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.DropUserContext;
-import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GrantContext;
-import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.PrivilegeClauseContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GrantIdentifierContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GrantLevelGlobalContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GrantLevelSchemaGlobalContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GrantLevelTableContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GrantProxyContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GrantRoleOrPrivilegeOnToContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.GrantRoleOrPrivilegeToContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RenameUserContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RequireClauseContext;
-import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RevokeContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RevokeFromContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RevokeOnFromContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RoleAtHostContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RoleNameContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RoleOrDynamicPrivilegeContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RoleOrPrivilegeContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RoleOrPrivilegesContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SetDefaultRoleContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SetPasswordContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SetRoleContext;
-import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableNameContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeAlterContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeAlterRoutineContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeCreateContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeCreateRoleContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeCreateRoutineContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeCreateTablespaceContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeCreateTemporaryTablesContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeCreateUserContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeCreateViewContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeDeleteContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeDropContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeDropRoleContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeEventContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeExecuteContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeFileContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeGrantContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeIndexContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeInsertContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeLockTablesContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeProcessContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeReferencesContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeReloadContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeReplicationClientContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeReplicationSlaveContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeSelectContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeShowDatabasesContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeShowViewContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeShutdownContext;
+import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.StaticPrivilegeSuperContext;
+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.TlsOptionContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.UserNameContext;
-import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ACLTypeEnum;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.GrantLevelSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.PrivilegeTypeEnum;
 import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
 import org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.NumberLiteralValue;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLAlterUserStatement;
@@ -61,6 +105,8 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQ
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLSetPasswordStatement;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLSetRoleStatement;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.ACLAttributeEnum;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.MySQLPrivilegeSegment;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.MySQLRoleOrPrivilegeSegment;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.PasswordOrLockOptionSegment;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.SSLTypeEnum;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.TLSOptionSegment;
@@ -68,7 +114,6 @@ import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.UserResourceSpecifiedLimitEnum;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.UserSegment;
 
-import java.util.Optional;
 import java.util.Properties;
 
 /**
@@ -82,29 +127,345 @@ public final class MySQLDCLStatementSQLVisitor extends MySQLStatementSQLVisitor
     }
     
     @Override
-    public ASTNode visitGrant(final GrantContext ctx) {
+    public ASTNode visitGrantRoleOrPrivilegeTo(final GrantRoleOrPrivilegeToContext ctx) {
         MySQLGrantStatement result = new MySQLGrantStatement();
-        Optional<SimpleTableSegment> tableSegmentOptional = null == ctx.privilegeClause() ? Optional.empty() : getTableFromPrivilegeClause(ctx.privilegeClause());
-        tableSegmentOptional.ifPresent(tableSegment -> result.getTables().add(tableSegment));
+        fillRoleOrPrivileges(result, ctx.roleOrPrivileges());
+        for (UserNameContext each : ctx.userList().userName()) {
+            result.getUsers().add((UserSegment) visit(each));
+        }
         return result;
     }
     
     @Override
-    public ASTNode visitRevoke(final RevokeContext ctx) {
-        MySQLRevokeStatement result = new MySQLRevokeStatement();
-        Optional<SimpleTableSegment> tableSegmentOptional = null == ctx.privilegeClause() ? Optional.empty() : getTableFromPrivilegeClause(ctx.privilegeClause());
-        tableSegmentOptional.ifPresent(tableSegment -> result.getTables().add(tableSegment));
+    public ASTNode visitGrantRoleOrPrivilegeOnTo(final GrantRoleOrPrivilegeOnToContext ctx) {
+        MySQLGrantStatement result = new MySQLGrantStatement();
+        if (null != ctx.roleOrPrivileges()) {
+            fillRoleOrPrivileges(result, ctx.roleOrPrivileges());
+        } else {
+            result.setAllPrivileges(true);
+        }
+        result.setLevel(generateGrantLevel(ctx.grantIdentifier()));
+        for (UserNameContext each : ctx.userList().userName()) {
+            result.getUsers().add((UserSegment) visit(each));
+        }
+        if (null != ctx.aclType()) {
+            switch (ctx.aclType().getText().toLowerCase()) {
+                case "table":
+                    result.setAclType(ACLTypeEnum.TABLE);
+                    break;
+                case "function":
+                    result.setAclType(ACLTypeEnum.FUNCTION);
+                    break;
+                case "procedure":
+                    result.setAclType(ACLTypeEnum.PROCEDURE);
+                    break;
+                default:
+                    result.setAclType(ACLTypeEnum.TABLE);
+                    break;
+            }
+        }
         return result;
     }
     
-    private Optional<SimpleTableSegment> getTableFromPrivilegeClause(final PrivilegeClauseContext ctx) {
-        if (null != ctx.onObjectClause()) {
-            TableNameContext tableName = ctx.onObjectClause().privilegeLevel().tableName();
-            if (null != tableName) {
-                return Optional.of((SimpleTableSegment) visitTableName(tableName));
+    @Override
+    public ASTNode visitGrantProxy(final GrantProxyContext ctx) {
+        MySQLGrantStatement result = new MySQLGrantStatement();
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.PROXY().getSymbol().getStartIndex(), ctx.PROXY().getSymbol().getStopIndex(), PrivilegeTypeEnum.GRANT_ACL);
+        result.getRoleOrPrivileges().add(new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege));
+        for (UserNameContext each : ctx.userList().userName()) {
+            result.getUsers().add((UserSegment) visit(each));
+        }
+        return result;
+    }
+    
+    private void fillRoleOrPrivileges(final MySQLGrantStatement statement, final RoleOrPrivilegesContext ctx) {
+        for (RoleOrPrivilegeContext each : ctx.roleOrPrivilege()) {
+            statement.getRoleOrPrivileges().add((MySQLRoleOrPrivilegeSegment) visit(each));
+        }
+    }
+    
+    private void fillRoleOrPrivileges(final MySQLRevokeStatement statement, final RoleOrPrivilegesContext ctx) {
+        for (RoleOrPrivilegeContext each : ctx.roleOrPrivilege()) {
+            statement.getRoleOrPrivileges().add((MySQLRoleOrPrivilegeSegment) visit(each));
+        }
+    }
+    
+    private GrantLevelSegment generateGrantLevel(final GrantIdentifierContext ctx) {
+        if (ctx instanceof GrantLevelGlobalContext) {
+            return new GrantLevelSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), "*", "*");
+    
+        } else if (ctx instanceof GrantLevelSchemaGlobalContext) {
+            String schemaName = new IdentifierValue(((GrantLevelSchemaGlobalContext) ctx).schemaName().getText()).getValue();
+            return new GrantLevelSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), schemaName, "*");
+        } else {
+            String schemaName = null;
+            String tableName;
+            if (null != ((GrantLevelTableContext) ctx).tableName().owner()) {
+                schemaName = new IdentifierValue(((GrantLevelTableContext) ctx).tableName().owner().getText()).getValue();
             }
+            tableName = new IdentifierValue(((GrantLevelTableContext) ctx).tableName().name().getText()).getValue();
+            return new GrantLevelSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), schemaName, tableName);
+        }
+    }
+    
+    @Override
+    public ASTNode visitRoleOrDynamicPrivilege(final RoleOrDynamicPrivilegeContext ctx) {
+        String role = new IdentifierValue(ctx.roleIdentifierOrText().getText()).getValue();
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), role, null, null);
+    }
+    
+    @Override
+    public ASTNode visitRoleAtHost(final RoleAtHostContext ctx) {
+        String role = new IdentifierValue(ctx.roleIdentifierOrText().getText()).getValue();
+        String host = new IdentifierValue(ctx.textOrIdentifier().getText()).getValue();
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), role, host, null);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeSelect(final StaticPrivilegeSelectContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.SELECT_ACL);
+        if (null != ctx.columnNames()) {
+            for (ColumnNameContext each : ctx.columnNames().columnName()) {
+                privilege.getColumns().add(new IdentifierValue(each.getText()).getValue());
+            }
+        }
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeInsert(final StaticPrivilegeInsertContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.INSERT_ACL);
+        if (null != ctx.columnNames()) {
+            for (ColumnNameContext each : ctx.columnNames().columnName()) {
+                privilege.getColumns().add(new IdentifierValue(each.getText()).getValue());
+            }
+        }
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeUpdate(final StaticPrivilegeUpdateContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.UPDATE_ACL);
+        if (null != ctx.columnNames()) {
+            for (ColumnNameContext each : ctx.columnNames().columnName()) {
+                privilege.getColumns().add(new IdentifierValue(each.getText()).getValue());
+            }
+        }
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeReferences(final StaticPrivilegeReferencesContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.REFERENCES_ACL);
+        if (null != ctx.columnNames()) {
+            for (ColumnNameContext each : ctx.columnNames().columnName()) {
+                privilege.getColumns().add(new IdentifierValue(each.getText()).getValue());
+            }
+        }
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeDelete(final StaticPrivilegeDeleteContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.DELETE_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeUsage(final StaticPrivilegeUsageContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.USAGE_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeIndex(final StaticPrivilegeIndexContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.INDEX_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeAlter(final StaticPrivilegeAlterContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.ALTER_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeCreate(final StaticPrivilegeCreateContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.CREATE_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeDrop(final StaticPrivilegeDropContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.DROP_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeExecute(final StaticPrivilegeExecuteContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.EXECUTE_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeReload(final StaticPrivilegeReloadContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.RELOAD_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeShutdown(final StaticPrivilegeShutdownContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.SHUTDOWN_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeProcess(final StaticPrivilegeProcessContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.PROCESS_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeFile(final StaticPrivilegeFileContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.FILE_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeGrant(final StaticPrivilegeGrantContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.GRANT_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeShowDatabases(final StaticPrivilegeShowDatabasesContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.SHOW_DB_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeSuper(final StaticPrivilegeSuperContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.SUPER_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeCreateTemporaryTables(final StaticPrivilegeCreateTemporaryTablesContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.CREATE_TMP_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeLockTables(final StaticPrivilegeLockTablesContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.LOCK_TABLES_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeReplicationSlave(final StaticPrivilegeReplicationSlaveContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.REPL_SLAVE_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeReplicationClient(final StaticPrivilegeReplicationClientContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.REPL_CLIENT_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeCreateView(final StaticPrivilegeCreateViewContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.CREATE_VIEW_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeShowView(final StaticPrivilegeShowViewContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.SHOW_VIEW_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeCreateRoutine(final StaticPrivilegeCreateRoutineContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.CREATE_PROC_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeAlterRoutine(final StaticPrivilegeAlterRoutineContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.ALTER_PROC_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeCreateUser(final StaticPrivilegeCreateUserContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.CREATE_USER_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeEvent(final StaticPrivilegeEventContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.EVENT_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeTrigger(final StaticPrivilegeTriggerContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.TRIGGER_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeCreateTablespace(final StaticPrivilegeCreateTablespaceContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.CREATE_TABLESPACE_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeCreateRole(final StaticPrivilegeCreateRoleContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.CREATE_ROLE_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitStaticPrivilegeDropRole(final StaticPrivilegeDropRoleContext ctx) {
+        MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.DROP_ROLE_ACL);
+        return new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege);
+    }
+    
+    @Override
+    public ASTNode visitRevokeFrom(final RevokeFromContext ctx) {
+        MySQLRevokeStatement result = new MySQLRevokeStatement();
+        if (null != ctx.roleOrPrivileges()) {
+            fillRoleOrPrivileges(result, ctx.roleOrPrivileges());
+        } else if (null != ctx.ALL()) {
+            result.setAllPrivileges(true);
+        }
+        for (UserNameContext each : ctx.userList().userName()) {
+            result.getFromUsers().add((UserSegment) visit(each));
         }
-        return Optional.empty();
+        return result;
+    }
+    
+    @Override
+    public ASTNode visitRevokeOnFrom(final RevokeOnFromContext ctx) {
+        MySQLRevokeStatement result = new MySQLRevokeStatement();
+        if (null != ctx.roleOrPrivileges()) {
+            fillRoleOrPrivileges(result, ctx.roleOrPrivileges());
+        } else if (null != ctx.ALL()) {
+            result.setAllPrivileges(true);
+        } else if (null != ctx.PROXY()) {
+            MySQLPrivilegeSegment privilege = new MySQLPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), PrivilegeTypeEnum.DROP_ROLE_ACL);
+            result.getRoleOrPrivileges().add(new MySQLRoleOrPrivilegeSegment(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), null, null, privilege));
+            result.setOnUser((UserSegment) visit(ctx.userName()));
+        }
+        if (null != ctx.grantIdentifier()) {
+            result.setLevel(generateGrantLevel(ctx.grantIdentifier()));
+        }
+        for (UserNameContext each : ctx.userList().userName()) {
+            result.getFromUsers().add((UserSegment) visit(each));
+        }
+        return result;
     }
     
     @Override
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 d7c7847..186fd5e 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
@@ -80,7 +80,6 @@ import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.NullVal
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ParameterMarkerContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.LiteralsContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.IdentifierContext;
-import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.UnreservedWordContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SchemaNameContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.OwnerContext;
 import org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.UpdateContext;
@@ -271,12 +270,6 @@ public abstract class MySQLStatementSQLVisitor extends MySQLStatementBaseVisitor
     
     @Override
     public final ASTNode visitIdentifier(final IdentifierContext ctx) {
-        UnreservedWordContext unreservedWord = ctx.unreservedWord();
-        return null != unreservedWord ? visit(unreservedWord) : new IdentifierValue(ctx.getText());
-    }
-    
-    @Override
-    public final ASTNode visitUnreservedWord(final UnreservedWordContext ctx) {
         return new IdentifierValue(ctx.getText());
     }
     
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java
index 42b9e5a..b609e03 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-engine/src/main/java/org/apache/shardingsphere/sql/parser/core/visitor/SQLVisitorRule.java
@@ -120,8 +120,18 @@ public enum SQLVisitorRule {
     
     GRANT("Grant", SQLStatementType.DCL),
     
+    GRANT_ROLE_OR_PRIVILEGE_TO("GrantRoleOrPrivilegeTo", SQLStatementType.DCL),
+    
+    GRANT_ROLE_OR_PRIVILEGE_ON_TO("GrantRoleOrPrivilegeOnTo", SQLStatementType.DCL),
+    
+    GRANT_PROXY("GrantPROXY", SQLStatementType.DCL),
+    
     REVOKE("Revoke", SQLStatementType.DCL),
     
+    REVOKE_FROM("RevokeFrom", SQLStatementType.DCL),
+    
+    REVOKE_ON_FROM("RevokeOnFrom", SQLStatementType.DCL),
+    
     CREATE_USER("CreateUser", SQLStatementType.DCL),
     
     ALTER_USER("AlterUser", SQLStatementType.DCL),
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/ACLTypeEnum.java
similarity index 66%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
copy to shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/ACLTypeEnum.java
index 43b58ea..ebd930f 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/ACLTypeEnum.java
@@ -15,15 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
-
-import lombok.ToString;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+package org.apache.shardingsphere.sql.parser.sql.common.segment.generic;
 
 /**
- * MySQL grant statement.
+ * ACL type enum.
  */
-@ToString
-public final class MySQLGrantStatement extends GrantStatement implements MySQLStatement {
+public enum ACLTypeEnum {
+    
+    TABLE, FUNCTION, PROCEDURE
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/GrantLevelSegment.java
similarity index 62%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
copy to shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/GrantLevelSegment.java
index 43b58ea..1f5f701 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/GrantLevelSegment.java
@@ -15,15 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
+package org.apache.shardingsphere.sql.parser.sql.common.segment.generic;
 
-import lombok.ToString;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
 
 /**
- * MySQL grant statement.
+ * Grant level segment.
  */
-@ToString
-public final class MySQLGrantStatement extends GrantStatement implements MySQLStatement {
+@RequiredArgsConstructor
+@Getter
+public final class GrantLevelSegment implements SQLSegment {
+    
+    private final int startIndex;
+    
+    private final int stopIndex;
+    
+    private final String dbName;
+    
+    private final String tableName;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/GrantLevelTypeEnum.java
similarity index 66%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
copy to shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/GrantLevelTypeEnum.java
index 43b58ea..b968bd4 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/GrantLevelTypeEnum.java
@@ -15,15 +15,12 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
-
-import lombok.ToString;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+package org.apache.shardingsphere.sql.parser.sql.common.segment.generic;
 
 /**
- * MySQL grant statement.
+ * Grant level type enum.
  */
-@ToString
-public final class MySQLGrantStatement extends GrantStatement implements MySQLStatement {
+public enum GrantLevelTypeEnum {
+    
+    GLOBAL, DB, TABLE
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/PrivilegeTypeEnum.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/PrivilegeTypeEnum.java
new file mode 100644
index 0000000..196465c
--- /dev/null
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/common/segment/generic/PrivilegeTypeEnum.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.sql.parser.sql.common.segment.generic;
+
+/**
+ * Privilege type enum.
+ */
+public enum PrivilegeTypeEnum {
+    
+    SELECT_ACL,
+    
+    INSERT_ACL,
+    
+    UPDATE_ACL,
+    
+    DELETE_ACL,
+    
+    USAGE_ACL,
+    
+    CREATE_ACL,
+    
+    DROP_ACL,
+    
+    RELOAD_ACL,
+    
+    SHUTDOWN_ACL,
+    
+    PROCESS_ACL,
+    
+    FILE_ACL,
+    
+    GRANT_ACL,
+    
+    REFERENCES_ACL,
+    
+    INDEX_ACL,
+    
+    ALTER_ACL,
+    
+    SHOW_DB_ACL,
+    
+    SUPER_ACL,
+    
+    CREATE_TMP_ACL,
+    
+    LOCK_TABLES_ACL,
+    
+    EXECUTE_ACL,
+    
+    REPL_SLAVE_ACL,
+    
+    REPL_CLIENT_ACL,
+    
+    CREATE_VIEW_ACL,
+    
+    SHOW_VIEW_ACL,
+    
+    CREATE_PROC_ACL,
+    
+    ALTER_PROC_ACL,
+    
+    CREATE_USER_ACL,
+    
+    EVENT_ACL,
+    
+    TRIGGER_ACL,
+    
+    CREATE_TABLESPACE_ACL,
+    
+    CREATE_ROLE_ACL,
+    
+    DROP_ROLE_ACL
+}
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
index 43b58ea..a77210c 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
@@ -17,13 +17,34 @@
 
 package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
 
+import lombok.Getter;
+import lombok.Setter;
 import lombok.ToString;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ACLTypeEnum;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.GrantLevelSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.MySQLRoleOrPrivilegeSegment;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.UserSegment;
+
+import java.util.Collection;
+import java.util.LinkedList;
 
 /**
  * MySQL grant statement.
  */
 @ToString
+@Getter
+@Setter
 public final class MySQLGrantStatement extends GrantStatement implements MySQLStatement {
+    
+    private final Collection<MySQLRoleOrPrivilegeSegment> roleOrPrivileges = new LinkedList<>();
+    
+    private boolean allPrivileges;
+    
+    private final Collection<UserSegment> users = new LinkedList<>();
+    
+    private ACLTypeEnum aclType;
+    
+    private GrantLevelSegment level;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLRevokeStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLRevokeStatement.java
index 94bf48a..91f9b9d 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLRevokeStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLRevokeStatement.java
@@ -17,13 +17,36 @@
 
 package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
 
+import lombok.Getter;
+import lombok.Setter;
 import lombok.ToString;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.ACLTypeEnum;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.GrantLevelSegment;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.RevokeStatement;
 import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.MySQLRoleOrPrivilegeSegment;
+import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.UserSegment;
+
+import java.util.Collection;
+import java.util.LinkedList;
 
 /**
  * MySQL revoke statement.
  */
 @ToString
+@Getter
+@Setter
 public final class MySQLRevokeStatement extends RevokeStatement implements MySQLStatement {
+    
+    private final Collection<MySQLRoleOrPrivilegeSegment> roleOrPrivileges = new LinkedList<>();
+    
+    private boolean allPrivileges;
+    
+    private UserSegment onUser;
+    
+    private final Collection<UserSegment> fromUsers = new LinkedList<>();
+    
+    private ACLTypeEnum aclType;
+    
+    private GrantLevelSegment level;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/MySQLPrivilegeSegment.java
similarity index 58%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
copy to shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/MySQLPrivilegeSegment.java
index 43b58ea..9da6f32 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/MySQLPrivilegeSegment.java
@@ -15,15 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
+package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment;
 
-import lombok.ToString;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.PrivilegeTypeEnum;
+
+import java.util.Collection;
+import java.util.LinkedList;
 
 /**
- * MySQL grant statement.
+ * MySQL privilege segment.
  */
-@ToString
-public final class MySQLGrantStatement extends GrantStatement implements MySQLStatement {
+@RequiredArgsConstructor
+@Getter
+public final class MySQLPrivilegeSegment implements SQLSegment {
+    
+    private final int startIndex;
+    
+    private final int stopIndex;
+    
+    private final PrivilegeTypeEnum type;
+    
+    private final Collection<String> columns = new LinkedList<>();
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/MySQLRoleOrPrivilegeSegment.java
similarity index 64%
copy from shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
copy to shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/MySQLRoleOrPrivilegeSegment.java
index 43b58ea..3cee37f 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/dcl/MySQLGrantStatement.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/mysql/segment/MySQLRoleOrPrivilegeSegment.java
@@ -15,15 +15,26 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl;
+package org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment;
 
-import lombok.ToString;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
-import org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.MySQLStatement;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.sql.parser.sql.common.segment.SQLSegment;
 
 /**
- * MySQL grant statement.
+ * Role or privilege segment.
  */
-@ToString
-public final class MySQLGrantStatement extends GrantStatement implements MySQLStatement {
+@RequiredArgsConstructor
+@Getter
+public final class MySQLRoleOrPrivilegeSegment implements SQLSegment {
+    
+    private final int startIndex;
+    
+    private final int stopIndex;
+    
+    private final String role;
+    
+    private final String host;
+    
+    private final MySQLPrivilegeSegment privilege;
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
index 1af0031..283b5f7 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
@@ -21,7 +21,6 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
 import org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
-import org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.table.TableAssert;
 import org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dcl.GrantStatementTestCase;
 
 /**
@@ -38,10 +37,6 @@ public final class GrantStatementAssert {
      * @param expected expected grant statement test case
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, final GrantStatement actual, final GrantStatementTestCase expected) {
-        assertTable(assertContext, actual, expected);
-    }
-    
-    private static void assertTable(final SQLCaseAssertContext assertContext, final GrantStatement actual, final GrantStatementTestCase expected) {
-        TableAssert.assertIs(assertContext, actual.getTables(), expected.getTables());
+//        TODO add assert for grant.
     }
 }
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/RevokeStatementAssert.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/RevokeStatementAssert.java
index afa4b43..242f073 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/RevokeStatementAssert.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/RevokeStatementAssert.java
@@ -21,7 +21,6 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.RevokeStatement;
 import org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
-import org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.table.TableAssert;
 import org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dcl.RevokeStatementTestCase;
 
 /**
@@ -38,10 +37,6 @@ public final class RevokeStatementAssert {
      * @param expected expected revoke statement test case
      */
     public static void assertIs(final SQLCaseAssertContext assertContext, final RevokeStatement actual, final RevokeStatementTestCase expected) {
-        assertTable(assertContext, actual, expected);
-    }
-    
-    private static void assertTable(final SQLCaseAssertContext assertContext, final RevokeStatement actual, final RevokeStatementTestCase expected) {
-        TableAssert.assertIs(assertContext, actual.getTables(), expected.getTables());
+//        TODO add assert for revoke.
     }
 }