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.
}
}