You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2852 lines
90 KiB
2852 lines
90 KiB
/* |
|
MySQL (Positive Technologies) grammar |
|
The MIT License (MIT). |
|
Copyright (c) 2015-2017, Ivan Kochurkin (kvanttt@gmail.com), Positive Technologies. |
|
Copyright (c) 2017, Ivan Khudyashev (IHudyashov@ptsecurity.com) |
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
|
of this software and associated documentation files (the "Software"), to deal |
|
in the Software without restriction, including without limitation the rights |
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
copies of the Software, and to permit persons to whom the Software is |
|
furnished to do so, subject to the following conditions: |
|
|
|
The above copyright notice and this permission notice shall be included in |
|
all copies or substantial portions of the Software. |
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|
THE SOFTWARE. |
|
*/ |
|
|
|
parser grammar MySqlParser; |
|
|
|
options { tokenVocab=MySqlLexer; } |
|
|
|
|
|
// Top Level Description |
|
|
|
root |
|
: sqlStatements? (MINUS MINUS)? EOF |
|
; |
|
|
|
sqlStatements |
|
: (sqlStatement (MINUS MINUS)? SEMI? | emptyStatement_)* |
|
(sqlStatement ((MINUS MINUS)? SEMI)? | emptyStatement_) |
|
; |
|
|
|
sqlStatement |
|
: ddlStatement | dmlStatement | transactionStatement |
|
| replicationStatement | preparedStatement |
|
| administrationStatement | utilityStatement |
|
; |
|
|
|
emptyStatement_ |
|
: SEMI |
|
; |
|
|
|
ddlStatement |
|
: createDatabase | createEvent | createIndex |
|
| createLogfileGroup | createProcedure | createFunction |
|
| createServer | createTable | createTablespaceInnodb |
|
| createTablespaceNdb | createTrigger | createView | createRole |
|
| alterDatabase | alterEvent | alterFunction |
|
| alterInstance | alterLogfileGroup | alterProcedure |
|
| alterServer | alterTable | alterTablespace | alterView |
|
| dropDatabase | dropEvent | dropIndex |
|
| dropLogfileGroup | dropProcedure | dropFunction |
|
| dropServer | dropTable | dropTablespace |
|
| dropTrigger | dropView | dropRole | setRole |
|
| renameTable | truncateTable |
|
; |
|
|
|
dmlStatement |
|
: selectStatement | insertStatement | updateStatement |
|
| deleteStatement | replaceStatement | callStatement |
|
| loadDataStatement | loadXmlStatement | doStatement |
|
| handlerStatement | valuesStatement | withStatement |
|
| tableStatement |
|
; |
|
|
|
transactionStatement |
|
: startTransaction |
|
| beginWork | commitWork | rollbackWork |
|
| savepointStatement | rollbackStatement |
|
| releaseStatement | lockTables | unlockTables |
|
; |
|
|
|
replicationStatement |
|
: changeMaster | changeReplicationFilter | purgeBinaryLogs |
|
| resetMaster | resetSlave | startSlave | stopSlave |
|
| startGroupReplication | stopGroupReplication |
|
| xaStartTransaction | xaEndTransaction | xaPrepareStatement |
|
| xaCommitWork | xaRollbackWork | xaRecoverWork |
|
; |
|
|
|
preparedStatement |
|
: prepareStatement | executeStatement | deallocatePrepare |
|
; |
|
|
|
// remark: NOT INCLUDED IN sqlStatement, but include in body |
|
// of routine's statements |
|
compoundStatement |
|
: blockStatement |
|
| caseStatement | ifStatement | leaveStatement |
|
| loopStatement | repeatStatement | whileStatement |
|
| iterateStatement | returnStatement | cursorStatement |
|
; |
|
|
|
administrationStatement |
|
: alterUser | createUser | dropUser | grantStatement |
|
| grantProxy | renameUser | revokeStatement |
|
| revokeProxy | analyzeTable | checkTable |
|
| checksumTable | optimizeTable | repairTable |
|
| createUdfunction | installPlugin | uninstallPlugin |
|
| setStatement | showStatement | binlogStatement |
|
| cacheIndexStatement | flushStatement | killStatement |
|
| loadIndexIntoCache | resetStatement |
|
| shutdownStatement |
|
; |
|
|
|
utilityStatement |
|
: simpleDescribeStatement | fullDescribeStatement |
|
| helpStatement | useStatement | signalStatement |
|
| resignalStatement | diagnosticsStatement |
|
; |
|
|
|
|
|
// Data Definition Language |
|
|
|
// Create statements |
|
|
|
createDatabase |
|
: CREATE dbFormat=(DATABASE | SCHEMA) |
|
ifNotExists? uid createDatabaseOption* |
|
; |
|
|
|
createEvent |
|
: CREATE ownerStatement? EVENT ifNotExists? fullId |
|
ON SCHEDULE scheduleExpression |
|
(ON COMPLETION NOT? PRESERVE)? enableType? |
|
(COMMENT STRING_LITERAL)? |
|
DO routineBody |
|
; |
|
|
|
createIndex |
|
: CREATE |
|
intimeAction=(ONLINE | OFFLINE)? |
|
indexCategory=(UNIQUE | FULLTEXT | SPATIAL)? INDEX |
|
uid indexType? |
|
ON tableName indexColumnNames |
|
indexOption* |
|
( |
|
ALGORITHM EQUAL_SYMBOL? algType=(DEFAULT | INPLACE | COPY) |
|
| LOCK EQUAL_SYMBOL? lockType=(DEFAULT | NONE | SHARED | EXCLUSIVE) |
|
)* |
|
; |
|
|
|
createLogfileGroup |
|
: CREATE LOGFILE GROUP uid |
|
ADD UNDOFILE undoFile=STRING_LITERAL |
|
(INITIAL_SIZE '='? initSize=fileSizeLiteral)? |
|
(UNDO_BUFFER_SIZE '='? undoSize=fileSizeLiteral)? |
|
(REDO_BUFFER_SIZE '='? redoSize=fileSizeLiteral)? |
|
(NODEGROUP '='? uid)? |
|
WAIT? |
|
(COMMENT '='? comment=STRING_LITERAL)? |
|
ENGINE '='? engineName |
|
; |
|
|
|
createProcedure |
|
: CREATE ownerStatement? |
|
PROCEDURE fullId |
|
'(' procedureParameter? (',' procedureParameter)* ')' |
|
routineOption* |
|
routineBody |
|
; |
|
|
|
createFunction |
|
: CREATE ownerStatement? AGGREGATE? |
|
FUNCTION ifNotExists? fullId |
|
'(' functionParameter? (',' functionParameter)* ')' |
|
RETURNS dataType |
|
routineOption* |
|
(routineBody | returnStatement) |
|
; |
|
|
|
createRole |
|
: CREATE ROLE ifNotExists? roleName (',' roleName)* |
|
; |
|
|
|
createServer |
|
: CREATE SERVER uid |
|
FOREIGN DATA WRAPPER wrapperName=(MYSQL | STRING_LITERAL) |
|
OPTIONS '(' serverOption (',' serverOption)* ')' |
|
; |
|
|
|
createTable |
|
: CREATE TEMPORARY? TABLE ifNotExists? |
|
tableName |
|
( |
|
LIKE tableName |
|
| '(' LIKE parenthesisTable=tableName ')' |
|
) #copyCreateTable |
|
| CREATE TEMPORARY? TABLE ifNotExists? |
|
tableName createDefinitions? |
|
( tableOption (','? tableOption)* )? |
|
partitionDefinitions? keyViolate=(IGNORE | REPLACE)? |
|
AS? selectStatement #queryCreateTable |
|
| CREATE TEMPORARY? TABLE ifNotExists? |
|
tableName createDefinitions |
|
( tableOption (','? tableOption)* )? |
|
partitionDefinitions? #columnCreateTable |
|
; |
|
|
|
createTablespaceInnodb |
|
: CREATE TABLESPACE uid |
|
ADD DATAFILE datafile=STRING_LITERAL |
|
(FILE_BLOCK_SIZE '=' fileBlockSize=fileSizeLiteral)? |
|
(ENGINE '='? engineName)? |
|
; |
|
|
|
createTablespaceNdb |
|
: CREATE TABLESPACE uid |
|
ADD DATAFILE datafile=STRING_LITERAL |
|
USE LOGFILE GROUP uid |
|
(EXTENT_SIZE '='? extentSize=fileSizeLiteral)? |
|
(INITIAL_SIZE '='? initialSize=fileSizeLiteral)? |
|
(AUTOEXTEND_SIZE '='? autoextendSize=fileSizeLiteral)? |
|
(MAX_SIZE '='? maxSize=fileSizeLiteral)? |
|
(NODEGROUP '='? uid)? |
|
WAIT? |
|
(COMMENT '='? comment=STRING_LITERAL)? |
|
ENGINE '='? engineName |
|
; |
|
|
|
createTrigger |
|
: CREATE ownerStatement? |
|
TRIGGER thisTrigger=fullId |
|
triggerTime=(BEFORE | AFTER) |
|
triggerEvent=(INSERT | UPDATE | DELETE) |
|
ON tableName FOR EACH ROW |
|
(triggerPlace=(FOLLOWS | PRECEDES) otherTrigger=fullId)? |
|
routineBody |
|
; |
|
|
|
withClause |
|
: WITH RECURSIVE? commonTableExpressions |
|
; |
|
|
|
commonTableExpressions |
|
: cteName ('(' cteColumnName (',' cteColumnName)* ')')? AS '(' dmlStatement ')' |
|
(',' commonTableExpressions)? |
|
; |
|
|
|
cteName |
|
: uid |
|
; |
|
|
|
cteColumnName |
|
: uid |
|
; |
|
|
|
createView |
|
: CREATE orReplace? |
|
( |
|
ALGORITHM '=' algType=(UNDEFINED | MERGE | TEMPTABLE) |
|
)? |
|
ownerStatement? |
|
(SQL SECURITY secContext=(DEFINER | INVOKER))? |
|
VIEW fullId ('(' uidList ')')? AS |
|
( |
|
'(' withClause? selectStatement ')' |
|
| |
|
withClause? selectStatement (WITH checkOption=(CASCADED | LOCAL)? CHECK OPTION)? |
|
) |
|
; |
|
|
|
|
|
// details |
|
|
|
createDatabaseOption |
|
: DEFAULT? charSet '='? (charsetName | DEFAULT) |
|
| DEFAULT? COLLATE '='? collationName |
|
| DEFAULT? ENCRYPTION '='? STRING_LITERAL |
|
| READ ONLY '='? (DEFAULT | ZERO_DECIMAL | ONE_DECIMAL) |
|
; |
|
|
|
charSet |
|
: CHARACTER SET |
|
| CHARSET |
|
| CHAR SET |
|
; |
|
|
|
ownerStatement |
|
: DEFINER '=' (userName | CURRENT_USER ( '(' ')')?) |
|
; |
|
|
|
scheduleExpression |
|
: AT timestampValue intervalExpr* #preciseSchedule |
|
| EVERY (decimalLiteral | expression) intervalType |
|
( |
|
STARTS startTimestamp=timestampValue |
|
(startIntervals+=intervalExpr)* |
|
)? |
|
( |
|
ENDS endTimestamp=timestampValue |
|
(endIntervals+=intervalExpr)* |
|
)? #intervalSchedule |
|
; |
|
|
|
timestampValue |
|
: CURRENT_TIMESTAMP |
|
| stringLiteral |
|
| decimalLiteral |
|
| expression |
|
; |
|
|
|
intervalExpr |
|
: '+' INTERVAL (decimalLiteral | expression) intervalType |
|
; |
|
|
|
intervalType |
|
: intervalTypeBase |
|
| YEAR | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
|
| DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND |
|
| SECOND_MICROSECOND | MINUTE_MICROSECOND |
|
| HOUR_MICROSECOND | DAY_MICROSECOND |
|
; |
|
|
|
enableType |
|
: ENABLE | DISABLE | DISABLE ON SLAVE |
|
; |
|
|
|
indexType |
|
: USING (BTREE | HASH) |
|
; |
|
|
|
indexOption |
|
: KEY_BLOCK_SIZE EQUAL_SYMBOL? fileSizeLiteral |
|
| indexType |
|
| WITH PARSER uid |
|
| COMMENT STRING_LITERAL |
|
| (VISIBLE | INVISIBLE) |
|
| ENGINE_ATTRIBUTE EQUAL_SYMBOL? STRING_LITERAL |
|
| SECONDARY_ENGINE_ATTRIBUTE EQUAL_SYMBOL? STRING_LITERAL |
|
; |
|
|
|
procedureParameter |
|
: direction=(IN | OUT | INOUT)? uid dataType |
|
; |
|
|
|
functionParameter |
|
: uid dataType |
|
; |
|
|
|
routineOption |
|
: COMMENT STRING_LITERAL #routineComment |
|
| LANGUAGE SQL #routineLanguage |
|
| NOT? DETERMINISTIC #routineBehavior |
|
| ( |
|
CONTAINS SQL | NO SQL | READS SQL DATA |
|
| MODIFIES SQL DATA |
|
) #routineData |
|
| SQL SECURITY context=(DEFINER | INVOKER) #routineSecurity |
|
; |
|
|
|
serverOption |
|
: HOST STRING_LITERAL |
|
| DATABASE STRING_LITERAL |
|
| USER STRING_LITERAL |
|
| PASSWORD STRING_LITERAL |
|
| SOCKET STRING_LITERAL |
|
| OWNER STRING_LITERAL |
|
| PORT decimalLiteral |
|
; |
|
|
|
createDefinitions |
|
: '(' createDefinition (',' createDefinition)* ')' |
|
; |
|
|
|
createDefinition |
|
: fullColumnName columnDefinition #columnDeclaration |
|
| tableConstraint NOT? ENFORCED? #constraintDeclaration |
|
| indexColumnDefinition #indexDeclaration |
|
; |
|
|
|
columnDefinition |
|
: dataType columnConstraint* NOT? ENFORCED? |
|
; |
|
|
|
columnConstraint |
|
: nullNotnull #nullColumnConstraint |
|
| DEFAULT defaultValue #defaultColumnConstraint |
|
| VISIBLE #visibilityColumnConstraint |
|
| INVISIBLE #invisibilityColumnConstraint |
|
| (AUTO_INCREMENT | ON UPDATE currentTimestamp) #autoIncrementColumnConstraint |
|
| PRIMARY? KEY #primaryKeyColumnConstraint |
|
| UNIQUE KEY? #uniqueKeyColumnConstraint |
|
| COMMENT STRING_LITERAL #commentColumnConstraint |
|
| COLUMN_FORMAT colformat=(FIXED | DYNAMIC | DEFAULT) #formatColumnConstraint |
|
| STORAGE storageval=(DISK | MEMORY | DEFAULT) #storageColumnConstraint |
|
| referenceDefinition #referenceColumnConstraint |
|
| COLLATE collationName #collateColumnConstraint |
|
| (GENERATED ALWAYS)? AS '(' expression ')' (VIRTUAL | STORED)? #generatedColumnConstraint |
|
| SERIAL DEFAULT VALUE #serialDefaultColumnConstraint |
|
| (CONSTRAINT name=uid?)? |
|
CHECK '(' expression ')' #checkColumnConstraint |
|
; |
|
|
|
tableConstraint |
|
: (CONSTRAINT name=uid?)? |
|
PRIMARY KEY index=uid? indexType? |
|
indexColumnNames indexOption* #primaryKeyTableConstraint |
|
| (CONSTRAINT name=uid?)? |
|
UNIQUE indexFormat=(INDEX | KEY)? index=uid? |
|
indexType? indexColumnNames indexOption* #uniqueKeyTableConstraint |
|
| (CONSTRAINT name=uid?)? |
|
FOREIGN KEY index=uid? indexColumnNames |
|
referenceDefinition #foreignKeyTableConstraint |
|
| (CONSTRAINT name=uid?)? |
|
CHECK '(' expression ')' #checkTableConstraint |
|
; |
|
|
|
referenceDefinition |
|
: REFERENCES tableName indexColumnNames? |
|
(MATCH matchType=(FULL | PARTIAL | SIMPLE))? |
|
referenceAction? |
|
; |
|
|
|
referenceAction |
|
: ON DELETE onDelete=referenceControlType |
|
( |
|
ON UPDATE onUpdate=referenceControlType |
|
)? |
|
| ON UPDATE onUpdate=referenceControlType |
|
( |
|
ON DELETE onDelete=referenceControlType |
|
)? |
|
; |
|
|
|
referenceControlType |
|
: RESTRICT | CASCADE | SET NULL_LITERAL | NO ACTION | SET DEFAULT |
|
; |
|
|
|
indexColumnDefinition |
|
: indexFormat=(INDEX | KEY) uid? indexType? |
|
indexColumnNames indexOption* #simpleIndexDeclaration |
|
| (FULLTEXT | SPATIAL) |
|
indexFormat=(INDEX | KEY)? uid? |
|
indexColumnNames indexOption* #specialIndexDeclaration |
|
; |
|
|
|
tableOption |
|
: ENGINE '='? engineName? #tableOptionEngine |
|
| ENGINE_ATTRIBUTE '='? STRING_LITERAL #tableOptionEngineAttribute |
|
| AUTOEXTEND_SIZE '='? decimalLiteral #tableOptionAutoextendSize |
|
| AUTO_INCREMENT '='? decimalLiteral #tableOptionAutoIncrement |
|
| AVG_ROW_LENGTH '='? decimalLiteral #tableOptionAverage |
|
| DEFAULT? charSet '='? (charsetName|DEFAULT) #tableOptionCharset |
|
| (CHECKSUM | PAGE_CHECKSUM) '='? boolValue=('0' | '1') #tableOptionChecksum |
|
| DEFAULT? COLLATE '='? collationName #tableOptionCollate |
|
| COMMENT '='? STRING_LITERAL #tableOptionComment |
|
| COMPRESSION '='? (STRING_LITERAL | ID) #tableOptionCompression |
|
| CONNECTION '='? STRING_LITERAL #tableOptionConnection |
|
| (DATA | INDEX) DIRECTORY '='? STRING_LITERAL #tableOptionDataDirectory |
|
| DELAY_KEY_WRITE '='? boolValue=('0' | '1') #tableOptionDelay |
|
| ENCRYPTION '='? STRING_LITERAL #tableOptionEncryption |
|
| (PAGE_COMPRESSED | STRING_LITERAL) '='? ('0' | '1') #tableOptionPageCompressed |
|
| (PAGE_COMPRESSION_LEVEL | STRING_LITERAL) '='? decimalLiteral #tableOptionPageCompressionLevel |
|
| ENCRYPTION_KEY_ID '='? decimalLiteral #tableOptionEncryptionKeyId |
|
| INDEX DIRECTORY '='? STRING_LITERAL #tableOptionIndexDirectory |
|
| INSERT_METHOD '='? insertMethod=(NO | FIRST | LAST) #tableOptionInsertMethod |
|
| KEY_BLOCK_SIZE '='? fileSizeLiteral #tableOptionKeyBlockSize |
|
| MAX_ROWS '='? decimalLiteral #tableOptionMaxRows |
|
| MIN_ROWS '='? decimalLiteral #tableOptionMinRows |
|
| PACK_KEYS '='? extBoolValue=('0' | '1' | DEFAULT) #tableOptionPackKeys |
|
| PASSWORD '='? STRING_LITERAL #tableOptionPassword |
|
| ROW_FORMAT '='? |
|
rowFormat=( |
|
DEFAULT | DYNAMIC | FIXED | COMPRESSED |
|
| REDUNDANT | COMPACT | ID |
|
) #tableOptionRowFormat |
|
| START TRANSACTION #tableOptionStartTransaction |
|
| SECONDARY_ENGINE_ATTRIBUTE '='? STRING_LITERAL #tableOptionSecondaryEngineAttribute |
|
| STATS_AUTO_RECALC '='? extBoolValue=(DEFAULT | '0' | '1') #tableOptionRecalculation |
|
| STATS_PERSISTENT '='? extBoolValue=(DEFAULT | '0' | '1') #tableOptionPersistent |
|
| STATS_SAMPLE_PAGES '='? (DEFAULT | decimalLiteral) #tableOptionSamplePage |
|
| TABLESPACE uid tablespaceStorage? #tableOptionTablespace |
|
| TABLE_TYPE '=' tableType #tableOptionTableType |
|
| tablespaceStorage #tableOptionTablespace |
|
| TRANSACTIONAL '='? ('0' | '1') #tableOptionTransactional |
|
| UNION '='? '(' tables ')' #tableOptionUnion |
|
; |
|
|
|
tableType |
|
: MYSQL | ODBC |
|
; |
|
|
|
tablespaceStorage |
|
: STORAGE (DISK | MEMORY | DEFAULT) |
|
; |
|
|
|
partitionDefinitions |
|
: PARTITION BY partitionFunctionDefinition |
|
(PARTITIONS count=decimalLiteral)? |
|
( |
|
SUBPARTITION BY subpartitionFunctionDefinition |
|
(SUBPARTITIONS subCount=decimalLiteral)? |
|
)? |
|
('(' partitionDefinition (',' partitionDefinition)* ')')? |
|
; |
|
|
|
partitionFunctionDefinition |
|
: LINEAR? HASH '(' expression ')' #partitionFunctionHash |
|
| LINEAR? KEY (ALGORITHM '=' algType=('1' | '2'))? |
|
'(' uidList? ')' #partitionFunctionKey // Optional uidList for MySQL only |
|
| RANGE ( '(' expression ')' | COLUMNS '(' uidList ')' ) #partitionFunctionRange |
|
| LIST ( '(' expression ')' | COLUMNS '(' uidList ')' ) #partitionFunctionList |
|
; |
|
|
|
subpartitionFunctionDefinition |
|
: LINEAR? HASH '(' expression ')' #subPartitionFunctionHash |
|
| LINEAR? KEY (ALGORITHM '=' algType=('1' | '2'))? |
|
'(' uidList ')' #subPartitionFunctionKey |
|
; |
|
|
|
partitionDefinition |
|
: PARTITION uid VALUES LESS THAN |
|
'(' |
|
partitionDefinerAtom (',' partitionDefinerAtom)* |
|
')' |
|
partitionOption* |
|
( '(' subpartitionDefinition (',' subpartitionDefinition)* ')' )? #partitionComparison |
|
| PARTITION uid VALUES LESS THAN |
|
partitionDefinerAtom partitionOption* |
|
( '(' subpartitionDefinition (',' subpartitionDefinition)* ')' )? #partitionComparison |
|
| PARTITION uid VALUES IN |
|
'(' |
|
partitionDefinerAtom (',' partitionDefinerAtom)* |
|
')' |
|
partitionOption* |
|
( '(' subpartitionDefinition (',' subpartitionDefinition)* ')' )? #partitionListAtom |
|
| PARTITION uid VALUES IN |
|
'(' |
|
partitionDefinerVector (',' partitionDefinerVector)* |
|
')' |
|
partitionOption* |
|
( '(' subpartitionDefinition (',' subpartitionDefinition)* ')' )? #partitionListVector |
|
| PARTITION uid partitionOption* |
|
( '(' subpartitionDefinition (',' subpartitionDefinition)* ')' )? #partitionSimple |
|
; |
|
|
|
partitionDefinerAtom |
|
: constant | expression | MAXVALUE |
|
; |
|
|
|
partitionDefinerVector |
|
: '(' partitionDefinerAtom (',' partitionDefinerAtom)+ ')' |
|
; |
|
|
|
subpartitionDefinition |
|
: SUBPARTITION uid partitionOption* |
|
; |
|
|
|
partitionOption |
|
: DEFAULT? STORAGE? ENGINE '='? engineName #partitionOptionEngine |
|
| COMMENT '='? comment=STRING_LITERAL #partitionOptionComment |
|
| DATA DIRECTORY '='? dataDirectory=STRING_LITERAL #partitionOptionDataDirectory |
|
| INDEX DIRECTORY '='? indexDirectory=STRING_LITERAL #partitionOptionIndexDirectory |
|
| MAX_ROWS '='? maxRows=decimalLiteral #partitionOptionMaxRows |
|
| MIN_ROWS '='? minRows=decimalLiteral #partitionOptionMinRows |
|
| TABLESPACE '='? tablespace=uid #partitionOptionTablespace |
|
| NODEGROUP '='? nodegroup=uid #partitionOptionNodeGroup |
|
; |
|
|
|
// Alter statements |
|
|
|
alterDatabase |
|
: ALTER dbFormat=(DATABASE | SCHEMA) uid? |
|
createDatabaseOption+ #alterSimpleDatabase |
|
| ALTER dbFormat=(DATABASE | SCHEMA) uid |
|
UPGRADE DATA DIRECTORY NAME #alterUpgradeName |
|
; |
|
|
|
alterEvent |
|
: ALTER ownerStatement? |
|
EVENT fullId |
|
(ON SCHEDULE scheduleExpression)? |
|
(ON COMPLETION NOT? PRESERVE)? |
|
(RENAME TO fullId)? enableType? |
|
(COMMENT STRING_LITERAL)? |
|
(DO routineBody)? |
|
; |
|
|
|
alterFunction |
|
: ALTER FUNCTION fullId routineOption* |
|
; |
|
|
|
alterInstance |
|
: ALTER INSTANCE ROTATE INNODB MASTER KEY |
|
; |
|
|
|
alterLogfileGroup |
|
: ALTER LOGFILE GROUP uid |
|
ADD UNDOFILE STRING_LITERAL |
|
(INITIAL_SIZE '='? fileSizeLiteral)? |
|
WAIT? ENGINE '='? engineName |
|
; |
|
|
|
alterProcedure |
|
: ALTER PROCEDURE fullId routineOption* |
|
; |
|
|
|
alterServer |
|
: ALTER SERVER uid OPTIONS |
|
'(' serverOption (',' serverOption)* ')' |
|
; |
|
|
|
alterTable |
|
: ALTER intimeAction=(ONLINE | OFFLINE)? |
|
IGNORE? TABLE tableName waitNowaitClause? |
|
(alterSpecification (',' alterSpecification)*)? |
|
partitionDefinitions? |
|
; |
|
|
|
alterTablespace |
|
: ALTER TABLESPACE uid |
|
objectAction=(ADD | DROP) DATAFILE STRING_LITERAL |
|
(INITIAL_SIZE '=' fileSizeLiteral)? |
|
WAIT? |
|
ENGINE '='? engineName |
|
; |
|
|
|
alterView |
|
: ALTER |
|
( |
|
ALGORITHM '=' algType=(UNDEFINED | MERGE | TEMPTABLE) |
|
)? |
|
ownerStatement? |
|
(SQL SECURITY secContext=(DEFINER | INVOKER))? |
|
VIEW fullId ('(' uidList ')')? AS selectStatement |
|
(WITH checkOpt=(CASCADED | LOCAL)? CHECK OPTION)? |
|
; |
|
|
|
// details |
|
|
|
alterSpecification |
|
: tableOption (','? tableOption)* #alterByTableOption |
|
| ADD COLUMN? uid columnDefinition (FIRST | AFTER uid)? #alterByAddColumn |
|
| ADD COLUMN? |
|
'(' |
|
uid columnDefinition ( ',' uid columnDefinition)* |
|
')' #alterByAddColumns |
|
| ADD indexFormat=(INDEX | KEY) uid? indexType? |
|
indexColumnNames indexOption* #alterByAddIndex |
|
| ADD (CONSTRAINT name=uid?)? PRIMARY KEY index=uid? |
|
indexType? indexColumnNames indexOption* #alterByAddPrimaryKey |
|
| ADD (CONSTRAINT name=uid?)? UNIQUE |
|
indexFormat=(INDEX | KEY)? indexName=uid? |
|
indexType? indexColumnNames indexOption* #alterByAddUniqueKey |
|
| ADD keyType=(FULLTEXT | SPATIAL) |
|
indexFormat=(INDEX | KEY)? uid? |
|
indexColumnNames indexOption* #alterByAddSpecialIndex |
|
| ADD (CONSTRAINT name=uid?)? FOREIGN KEY |
|
indexName=uid? indexColumnNames referenceDefinition #alterByAddForeignKey |
|
| ADD (CONSTRAINT name=uid?)? CHECK ( uid | stringLiteral | '(' expression ')' ) |
|
NOT? ENFORCED? #alterByAddCheckTableConstraint |
|
| ALTER (CONSTRAINT name=uid?)? CHECK ( uid | stringLiteral | '(' expression ')' ) |
|
NOT? ENFORCED? #alterByAlterCheckTableConstraint |
|
| ADD (CONSTRAINT name=uid?)? CHECK '(' expression ')' #alterByAddCheckTableConstraint |
|
| ALGORITHM '='? algType=(DEFAULT | INSTANT | INPLACE | COPY) #alterBySetAlgorithm |
|
| ALTER COLUMN? uid |
|
(SET DEFAULT defaultValue | DROP DEFAULT) #alterByChangeDefault |
|
| CHANGE COLUMN? oldColumn=uid |
|
newColumn=uid columnDefinition |
|
(FIRST | AFTER afterColumn=uid)? #alterByChangeColumn |
|
| RENAME COLUMN oldColumn=uid TO newColumn=uid #alterByRenameColumn |
|
| LOCK '='? lockType=(DEFAULT | NONE | SHARED | EXCLUSIVE) #alterByLock |
|
| MODIFY COLUMN? |
|
uid columnDefinition (FIRST | AFTER uid)? #alterByModifyColumn |
|
| DROP COLUMN? uid RESTRICT? #alterByDropColumn |
|
| DROP (CONSTRAINT | CHECK) uid #alterByDropConstraintCheck |
|
| DROP PRIMARY KEY #alterByDropPrimaryKey |
|
| DROP indexFormat=(INDEX | KEY) uid #alterByDropIndex |
|
| RENAME indexFormat=(INDEX | KEY) uid TO uid #alterByRenameIndex |
|
| ALTER COLUMN? uid ( |
|
SET DEFAULT ( stringLiteral | '(' expression ')' ) |
|
| SET (VISIBLE | INVISIBLE) |
|
| DROP DEFAULT) #alterByAlterColumnDefault |
|
| ALTER INDEX uid (VISIBLE | INVISIBLE) #alterByAlterIndexVisibility |
|
| DROP FOREIGN KEY uid #alterByDropForeignKey |
|
| DISABLE KEYS #alterByDisableKeys |
|
| ENABLE KEYS #alterByEnableKeys |
|
| RENAME renameFormat=(TO | AS)? (uid | fullId) #alterByRename |
|
| ORDER BY uidList #alterByOrder |
|
| CONVERT TO (CHARSET | CHARACTER SET) charsetName |
|
(COLLATE collationName)? #alterByConvertCharset |
|
| DEFAULT? CHARACTER SET '=' charsetName |
|
(COLLATE '=' collationName)? #alterByDefaultCharset |
|
| DISCARD TABLESPACE #alterByDiscardTablespace |
|
| IMPORT TABLESPACE #alterByImportTablespace |
|
| FORCE #alterByForce |
|
| validationFormat=(WITHOUT | WITH) VALIDATION #alterByValidate |
|
| ADD COLUMN? |
|
'(' createDefinition (',' createDefinition)* ')' #alterByAddDefinitions |
|
| alterPartitionSpecification #alterPartition |
|
; |
|
|
|
alterPartitionSpecification |
|
: ADD PARTITION |
|
'(' partitionDefinition (',' partitionDefinition)* ')' #alterByAddPartition |
|
| DROP PARTITION uidList #alterByDropPartition |
|
| DISCARD PARTITION (uidList | ALL) TABLESPACE #alterByDiscardPartition |
|
| IMPORT PARTITION (uidList | ALL) TABLESPACE #alterByImportPartition |
|
| TRUNCATE PARTITION (uidList | ALL) #alterByTruncatePartition |
|
| COALESCE PARTITION decimalLiteral #alterByCoalescePartition |
|
| REORGANIZE PARTITION uidList |
|
INTO '(' partitionDefinition (',' partitionDefinition)* ')' #alterByReorganizePartition |
|
| EXCHANGE PARTITION uid WITH TABLE tableName |
|
(validationFormat=(WITH | WITHOUT) VALIDATION)? #alterByExchangePartition |
|
| ANALYZE PARTITION (uidList | ALL) #alterByAnalyzePartition |
|
| CHECK PARTITION (uidList | ALL) #alterByCheckPartition |
|
| OPTIMIZE PARTITION (uidList | ALL) #alterByOptimizePartition |
|
| REBUILD PARTITION (uidList | ALL) #alterByRebuildPartition |
|
| REPAIR PARTITION (uidList | ALL) #alterByRepairPartition |
|
| REMOVE PARTITIONING #alterByRemovePartitioning |
|
| UPGRADE PARTITIONING #alterByUpgradePartitioning |
|
; |
|
|
|
// Drop statements |
|
|
|
dropDatabase |
|
: DROP dbFormat=(DATABASE | SCHEMA) ifExists? uid |
|
; |
|
|
|
dropEvent |
|
: DROP EVENT ifExists? fullId |
|
; |
|
|
|
dropIndex |
|
: DROP INDEX intimeAction=(ONLINE | OFFLINE)? |
|
uid ON tableName |
|
( |
|
ALGORITHM '='? algType=(DEFAULT | INPLACE | COPY) |
|
| LOCK '='? |
|
lockType=(DEFAULT | NONE | SHARED | EXCLUSIVE) |
|
)* |
|
; |
|
|
|
dropLogfileGroup |
|
: DROP LOGFILE GROUP uid ENGINE '=' engineName |
|
; |
|
|
|
dropProcedure |
|
: DROP PROCEDURE ifExists? fullId |
|
; |
|
|
|
dropFunction |
|
: DROP FUNCTION ifExists? fullId |
|
; |
|
|
|
dropServer |
|
: DROP SERVER ifExists? uid |
|
; |
|
|
|
dropTable |
|
: DROP TEMPORARY? TABLE ifExists? |
|
tables dropType=(RESTRICT | CASCADE)? |
|
; |
|
|
|
dropTablespace |
|
: DROP TABLESPACE uid (ENGINE '='? engineName)? |
|
; |
|
|
|
dropTrigger |
|
: DROP TRIGGER ifExists? fullId |
|
; |
|
|
|
dropView |
|
: DROP VIEW ifExists? |
|
fullId (',' fullId)* dropType=(RESTRICT | CASCADE)? |
|
; |
|
|
|
dropRole |
|
: DROP ROLE ifExists? roleName (',' roleName)* |
|
; |
|
|
|
setRole |
|
: SET DEFAULT ROLE (NONE | ALL | roleName (',' roleName)*) |
|
TO (userName | uid) (',' (userName | uid))* |
|
| SET ROLE roleOption |
|
; |
|
|
|
// Other DDL statements |
|
|
|
renameTable |
|
: RENAME TABLE |
|
renameTableClause (',' renameTableClause)* |
|
; |
|
|
|
renameTableClause |
|
: tableName TO tableName |
|
; |
|
|
|
truncateTable |
|
: TRUNCATE TABLE? tableName |
|
; |
|
|
|
|
|
// Data Manipulation Language |
|
|
|
// Primary DML Statements |
|
|
|
|
|
callStatement |
|
: CALL fullId |
|
( |
|
'(' (constants | expressions)? ')' |
|
)? |
|
; |
|
|
|
deleteStatement |
|
: singleDeleteStatement | multipleDeleteStatement |
|
; |
|
|
|
doStatement |
|
: DO expressions |
|
; |
|
|
|
handlerStatement |
|
: handlerOpenStatement |
|
| handlerReadIndexStatement |
|
| handlerReadStatement |
|
| handlerCloseStatement |
|
; |
|
|
|
insertStatement |
|
: INSERT |
|
priority=(LOW_PRIORITY | DELAYED | HIGH_PRIORITY)? |
|
IGNORE? INTO? tableName |
|
(PARTITION '(' partitions=uidList? ')' )? |
|
( |
|
('(' columns=fullColumnNameList ')')? insertStatementValue (AS? uid)? |
|
| SET |
|
setFirst=updatedElement |
|
(',' setElements+=updatedElement)* |
|
) |
|
( |
|
ON DUPLICATE KEY UPDATE |
|
duplicatedFirst=updatedElement |
|
(',' duplicatedElements+=updatedElement)* |
|
)? |
|
; |
|
|
|
loadDataStatement |
|
: LOAD DATA |
|
priority=(LOW_PRIORITY | CONCURRENT)? |
|
LOCAL? INFILE filename=STRING_LITERAL |
|
violation=(REPLACE | IGNORE)? |
|
INTO TABLE tableName |
|
(PARTITION '(' uidList ')' )? |
|
(CHARACTER SET charset=charsetName)? |
|
( |
|
fieldsFormat=(FIELDS | COLUMNS) |
|
selectFieldsInto+ |
|
)? |
|
( |
|
LINES |
|
selectLinesInto+ |
|
)? |
|
( |
|
IGNORE decimalLiteral linesFormat=(LINES | ROWS) |
|
)? |
|
( '(' assignmentField (',' assignmentField)* ')' )? |
|
(SET updatedElement (',' updatedElement)*)? |
|
; |
|
|
|
loadXmlStatement |
|
: LOAD XML |
|
priority=(LOW_PRIORITY | CONCURRENT)? |
|
LOCAL? INFILE filename=STRING_LITERAL |
|
violation=(REPLACE | IGNORE)? |
|
INTO TABLE tableName |
|
(CHARACTER SET charset=charsetName)? |
|
(ROWS IDENTIFIED BY '<' tag=STRING_LITERAL '>')? |
|
( IGNORE decimalLiteral linesFormat=(LINES | ROWS) )? |
|
( '(' assignmentField (',' assignmentField)* ')' )? |
|
(SET updatedElement (',' updatedElement)*)? |
|
; |
|
|
|
replaceStatement |
|
: REPLACE priority=(LOW_PRIORITY | DELAYED)? |
|
INTO? tableName |
|
(PARTITION '(' partitions=uidList ')' )? |
|
( |
|
('(' columns=uidList ')')? insertStatementValue |
|
| SET |
|
setFirst=updatedElement |
|
(',' setElements+=updatedElement)* |
|
) |
|
; |
|
|
|
selectStatement |
|
: querySpecification lockClause? #simpleSelect |
|
| queryExpression lockClause? #parenthesisSelect |
|
| querySpecificationNointo unionStatement+ |
|
( |
|
UNION unionType=(ALL | DISTINCT)? |
|
(querySpecification | queryExpression) |
|
)? |
|
orderByClause? limitClause? lockClause? #unionSelect |
|
| queryExpressionNointo unionParenthesis+ |
|
( |
|
UNION unionType=(ALL | DISTINCT)? |
|
queryExpression |
|
)? |
|
orderByClause? limitClause? lockClause? #unionParenthesisSelect |
|
| querySpecificationNointo (',' lateralStatement)+ #withLateralStatement |
|
; |
|
|
|
updateStatement |
|
: singleUpdateStatement | multipleUpdateStatement |
|
; |
|
|
|
// https://dev.mysql.com/doc/refman/8.0/en/values.html |
|
valuesStatement |
|
: VALUES |
|
'(' expressionsWithDefaults? ')' |
|
(',' '(' expressionsWithDefaults? ')')* |
|
; |
|
|
|
// details |
|
|
|
insertStatementValue |
|
: selectStatement |
|
| insertFormat=(VALUES | VALUE) |
|
'(' expressionsWithDefaults? ')' |
|
(',' '(' expressionsWithDefaults? ')')* |
|
; |
|
|
|
updatedElement |
|
: fullColumnName '=' (expression | DEFAULT) |
|
; |
|
|
|
assignmentField |
|
: uid | LOCAL_ID |
|
; |
|
|
|
lockClause |
|
: FOR UPDATE | LOCK IN SHARE MODE |
|
; |
|
|
|
// Detailed DML Statements |
|
|
|
singleDeleteStatement |
|
: DELETE priority=LOW_PRIORITY? QUICK? IGNORE? |
|
FROM tableName (AS? uid)? |
|
(PARTITION '(' uidList ')' )? |
|
(WHERE expression)? |
|
orderByClause? (LIMIT limitClauseAtom)? |
|
; |
|
|
|
multipleDeleteStatement |
|
: DELETE priority=LOW_PRIORITY? QUICK? IGNORE? |
|
( |
|
tableName ('.' '*')? ( ',' tableName ('.' '*')? )* |
|
FROM tableSources |
|
| FROM |
|
tableName ('.' '*')? ( ',' tableName ('.' '*')? )* |
|
USING tableSources |
|
) |
|
(WHERE expression)? |
|
; |
|
|
|
handlerOpenStatement |
|
: HANDLER tableName OPEN (AS? uid)? |
|
; |
|
|
|
handlerReadIndexStatement |
|
: HANDLER tableName READ index=uid |
|
( |
|
comparisonOperator '(' constants ')' |
|
| moveOrder=(FIRST | NEXT | PREV | LAST) |
|
) |
|
(WHERE expression)? (LIMIT limitClauseAtom)? |
|
; |
|
|
|
handlerReadStatement |
|
: HANDLER tableName READ moveOrder=(FIRST | NEXT) |
|
(WHERE expression)? (LIMIT limitClauseAtom)? |
|
; |
|
|
|
handlerCloseStatement |
|
: HANDLER tableName CLOSE |
|
; |
|
|
|
singleUpdateStatement |
|
: UPDATE priority=LOW_PRIORITY? IGNORE? tableName (AS? uid)? |
|
SET updatedElement (',' updatedElement)* |
|
(WHERE expression)? orderByClause? limitClause? |
|
; |
|
|
|
multipleUpdateStatement |
|
: UPDATE priority=LOW_PRIORITY? IGNORE? tableSources |
|
SET updatedElement (',' updatedElement)* |
|
(WHERE expression)? |
|
; |
|
|
|
// details |
|
|
|
orderByClause |
|
: ORDER BY orderByExpression (',' orderByExpression)* |
|
; |
|
|
|
orderByExpression |
|
: expression order=(ASC | DESC)? |
|
; |
|
|
|
tableSources |
|
: tableSource (',' tableSource)* |
|
; |
|
|
|
tableSource |
|
: tableSourceItem joinPart* #tableSourceBase |
|
| '(' tableSourceItem joinPart* ')' #tableSourceNested |
|
| jsonTable #tableJson |
|
; |
|
|
|
tableSourceItem |
|
: tableName |
|
(PARTITION '(' uidList ')' )? (AS? alias=uid)? |
|
(indexHint (',' indexHint)* )? #atomTableItem |
|
| ( |
|
selectStatement |
|
| '(' parenthesisSubquery=selectStatement ')' |
|
) |
|
AS? alias=uid #subqueryTableItem |
|
| '(' tableSources ')' #tableSourcesItem |
|
; |
|
|
|
indexHint |
|
: indexHintAction=(USE | IGNORE | FORCE) |
|
keyFormat=(INDEX|KEY) ( FOR indexHintType)? |
|
'(' uidList ')' |
|
; |
|
|
|
indexHintType |
|
: JOIN | ORDER BY | GROUP BY |
|
; |
|
|
|
joinPart |
|
: (INNER | CROSS)? JOIN LATERAL? tableSourceItem joinSpec* #innerJoin |
|
| STRAIGHT_JOIN tableSourceItem (ON expression)* #straightJoin |
|
| (LEFT | RIGHT) OUTER? JOIN LATERAL? tableSourceItem joinSpec* #outerJoin |
|
| NATURAL ((LEFT | RIGHT) OUTER?)? JOIN tableSourceItem #naturalJoin |
|
; |
|
|
|
joinSpec |
|
: (ON expression) |
|
| USING '(' uidList ')' |
|
; |
|
|
|
// Select Statement's Details |
|
|
|
queryExpression |
|
: '(' querySpecification ')' |
|
| '(' queryExpression ')' |
|
; |
|
|
|
queryExpressionNointo |
|
: '(' querySpecificationNointo ')' |
|
| '(' queryExpressionNointo ')' |
|
; |
|
|
|
querySpecification |
|
: SELECT selectSpec* selectElements selectIntoExpression? |
|
fromClause groupByClause? havingClause? windowClause? orderByClause? limitClause? |
|
| SELECT selectSpec* selectElements |
|
fromClause groupByClause? havingClause? windowClause? orderByClause? limitClause? selectIntoExpression? |
|
; |
|
|
|
querySpecificationNointo |
|
: SELECT selectSpec* selectElements |
|
fromClause groupByClause? havingClause? windowClause? orderByClause? limitClause? |
|
; |
|
|
|
unionParenthesis |
|
: UNION unionType=(ALL | DISTINCT)? queryExpressionNointo |
|
; |
|
|
|
unionStatement |
|
: UNION unionType=(ALL | DISTINCT)? |
|
(querySpecificationNointo | queryExpressionNointo) |
|
; |
|
|
|
lateralStatement |
|
: LATERAL (querySpecificationNointo | |
|
queryExpressionNointo | |
|
('(' (querySpecificationNointo | queryExpressionNointo) ')' (AS? uid)?) |
|
) |
|
; |
|
|
|
// JSON |
|
|
|
// https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html |
|
jsonTable |
|
: JSON_TABLE '(' |
|
STRING_LITERAL ',' |
|
STRING_LITERAL |
|
COLUMNS '(' jsonColumnList ')' |
|
')' (AS? uid)? |
|
; |
|
|
|
jsonColumnList |
|
: jsonColumn (',' jsonColumn)* |
|
; |
|
|
|
jsonColumn |
|
: fullColumnName ( FOR ORDINALITY |
|
| dataType ( PATH STRING_LITERAL jsonOnEmpty? jsonOnError? |
|
| EXISTS PATH STRING_LITERAL ) ) |
|
| NESTED PATH? STRING_LITERAL COLUMNS '(' jsonColumnList ')' |
|
; |
|
|
|
jsonOnEmpty |
|
: (NULL_LITERAL | ERROR | DEFAULT defaultValue) ON EMPTY |
|
; |
|
|
|
jsonOnError |
|
: (NULL_LITERAL | ERROR | DEFAULT defaultValue) ON ERROR |
|
; |
|
|
|
// details |
|
|
|
selectSpec |
|
: (ALL | DISTINCT | DISTINCTROW) |
|
| HIGH_PRIORITY | STRAIGHT_JOIN | SQL_SMALL_RESULT |
|
| SQL_BIG_RESULT | SQL_BUFFER_RESULT |
|
| (SQL_CACHE | SQL_NO_CACHE) |
|
| SQL_CALC_FOUND_ROWS |
|
; |
|
|
|
selectElements |
|
: (star='*' | selectElement ) (',' selectElement)* |
|
; |
|
|
|
selectElement |
|
: fullId '.' '*' #selectStarElement |
|
| fullColumnName (AS? uid)? #selectColumnElement |
|
| functionCall (AS? uid)? #selectFunctionElement |
|
| (LOCAL_ID VAR_ASSIGN)? expression (AS? uid)? #selectExpressionElement |
|
; |
|
|
|
selectIntoExpression |
|
: INTO assignmentField (',' assignmentField )* #selectIntoVariables |
|
| INTO DUMPFILE STRING_LITERAL #selectIntoDumpFile |
|
| ( |
|
INTO OUTFILE filename=STRING_LITERAL |
|
(CHARACTER SET charset=charsetName)? |
|
( |
|
fieldsFormat=(FIELDS | COLUMNS) |
|
selectFieldsInto+ |
|
)? |
|
( |
|
LINES selectLinesInto+ |
|
)? |
|
) #selectIntoTextFile |
|
; |
|
|
|
selectFieldsInto |
|
: TERMINATED BY terminationField=STRING_LITERAL |
|
| OPTIONALLY? ENCLOSED BY enclosion=STRING_LITERAL |
|
| ESCAPED BY escaping=STRING_LITERAL |
|
; |
|
|
|
selectLinesInto |
|
: STARTING BY starting=STRING_LITERAL |
|
| TERMINATED BY terminationLine=STRING_LITERAL |
|
; |
|
|
|
fromClause |
|
: (FROM tableSources)? |
|
(WHERE whereExpr=expression)? |
|
; |
|
|
|
groupByClause |
|
: GROUP BY |
|
groupByItem (',' groupByItem)* |
|
(WITH ROLLUP)? |
|
; |
|
|
|
havingClause |
|
: HAVING havingExpr=expression |
|
; |
|
|
|
windowClause |
|
: WINDOW windowName AS '(' windowSpec ')' (',' windowName AS '(' windowSpec ')')* |
|
; |
|
|
|
groupByItem |
|
: expression order=(ASC | DESC)? |
|
; |
|
|
|
limitClause |
|
: LIMIT |
|
( |
|
(offset=limitClauseAtom ',')? limit=limitClauseAtom |
|
| limit=limitClauseAtom OFFSET offset=limitClauseAtom |
|
) |
|
; |
|
|
|
limitClauseAtom |
|
: decimalLiteral | mysqlVariable | simpleId |
|
; |
|
|
|
|
|
// Transaction's Statements |
|
|
|
startTransaction |
|
: START TRANSACTION (transactionMode (',' transactionMode)* )? |
|
; |
|
|
|
beginWork |
|
: BEGIN WORK? |
|
; |
|
|
|
commitWork |
|
: COMMIT WORK? |
|
(AND nochain=NO? CHAIN)? |
|
(norelease=NO? RELEASE)? |
|
; |
|
|
|
rollbackWork |
|
: ROLLBACK WORK? |
|
(AND nochain=NO? CHAIN)? |
|
(norelease=NO? RELEASE)? |
|
; |
|
|
|
savepointStatement |
|
: SAVEPOINT uid |
|
; |
|
|
|
rollbackStatement |
|
: ROLLBACK WORK? TO SAVEPOINT? uid |
|
; |
|
|
|
releaseStatement |
|
: RELEASE SAVEPOINT uid |
|
; |
|
|
|
lockTables |
|
: LOCK (TABLE | TABLES) lockTableElement (',' lockTableElement)* waitNowaitClause? |
|
; |
|
|
|
unlockTables |
|
: UNLOCK TABLES |
|
; |
|
|
|
|
|
// details |
|
|
|
setAutocommitStatement |
|
: SET AUTOCOMMIT '=' autocommitValue=('0' | '1') |
|
; |
|
|
|
setTransactionStatement |
|
: SET transactionContext=(GLOBAL | SESSION)? TRANSACTION |
|
transactionOption (',' transactionOption)* |
|
; |
|
|
|
transactionMode |
|
: WITH CONSISTENT SNAPSHOT |
|
| READ WRITE |
|
| READ ONLY |
|
; |
|
|
|
lockTableElement |
|
: tableName (AS? uid)? lockAction |
|
; |
|
|
|
lockAction |
|
: READ LOCAL? | LOW_PRIORITY? WRITE |
|
; |
|
|
|
transactionOption |
|
: ISOLATION LEVEL transactionLevel |
|
| READ WRITE |
|
| READ ONLY |
|
; |
|
|
|
transactionLevel |
|
: REPEATABLE READ |
|
| READ COMMITTED |
|
| READ UNCOMMITTED |
|
| SERIALIZABLE |
|
; |
|
|
|
|
|
// Replication's Statements |
|
|
|
// Base Replication |
|
|
|
changeMaster |
|
: CHANGE MASTER TO |
|
masterOption (',' masterOption)* channelOption? |
|
; |
|
|
|
changeReplicationFilter |
|
: CHANGE REPLICATION FILTER |
|
replicationFilter (',' replicationFilter)* |
|
; |
|
|
|
purgeBinaryLogs |
|
: PURGE purgeFormat=(BINARY | MASTER) LOGS |
|
( |
|
TO fileName=STRING_LITERAL |
|
| BEFORE timeValue=STRING_LITERAL |
|
) |
|
; |
|
|
|
resetMaster |
|
: RESET MASTER |
|
; |
|
|
|
resetSlave |
|
: RESET SLAVE ALL? channelOption? |
|
; |
|
|
|
startSlave |
|
: START SLAVE (threadType (',' threadType)*)? |
|
(UNTIL untilOption)? |
|
connectionOption* channelOption? |
|
; |
|
|
|
stopSlave |
|
: STOP SLAVE (threadType (',' threadType)*)? |
|
; |
|
|
|
startGroupReplication |
|
: START GROUP_REPLICATION |
|
; |
|
|
|
stopGroupReplication |
|
: STOP GROUP_REPLICATION |
|
; |
|
|
|
// details |
|
|
|
masterOption |
|
: stringMasterOption '=' STRING_LITERAL #masterStringOption |
|
| decimalMasterOption '=' decimalLiteral #masterDecimalOption |
|
| boolMasterOption '=' boolVal=('0' | '1') #masterBoolOption |
|
| MASTER_HEARTBEAT_PERIOD '=' REAL_LITERAL #masterRealOption |
|
| IGNORE_SERVER_IDS '=' '(' (uid (',' uid)*)? ')' #masterUidListOption |
|
; |
|
|
|
stringMasterOption |
|
: MASTER_BIND | MASTER_HOST | MASTER_USER | MASTER_PASSWORD |
|
| MASTER_LOG_FILE | RELAY_LOG_FILE | MASTER_SSL_CA |
|
| MASTER_SSL_CAPATH | MASTER_SSL_CERT | MASTER_SSL_CRL |
|
| MASTER_SSL_CRLPATH | MASTER_SSL_KEY | MASTER_SSL_CIPHER |
|
| MASTER_TLS_VERSION |
|
; |
|
decimalMasterOption |
|
: MASTER_PORT | MASTER_CONNECT_RETRY | MASTER_RETRY_COUNT |
|
| MASTER_DELAY | MASTER_LOG_POS | RELAY_LOG_POS |
|
; |
|
|
|
boolMasterOption |
|
: MASTER_AUTO_POSITION | MASTER_SSL |
|
| MASTER_SSL_VERIFY_SERVER_CERT |
|
; |
|
|
|
channelOption |
|
: FOR CHANNEL STRING_LITERAL |
|
; |
|
|
|
replicationFilter |
|
: REPLICATE_DO_DB '=' '(' uidList ')' #doDbReplication |
|
| REPLICATE_IGNORE_DB '=' '(' uidList ')' #ignoreDbReplication |
|
| REPLICATE_DO_TABLE '=' '(' tables ')' #doTableReplication |
|
| REPLICATE_IGNORE_TABLE '=' '(' tables ')' #ignoreTableReplication |
|
| REPLICATE_WILD_DO_TABLE '=' '(' simpleStrings ')' #wildDoTableReplication |
|
| REPLICATE_WILD_IGNORE_TABLE |
|
'=' '(' simpleStrings ')' #wildIgnoreTableReplication |
|
| REPLICATE_REWRITE_DB '=' |
|
'(' tablePair (',' tablePair)* ')' #rewriteDbReplication |
|
; |
|
|
|
tablePair |
|
: '(' firstTable=tableName ',' secondTable=tableName ')' |
|
; |
|
|
|
threadType |
|
: IO_THREAD | SQL_THREAD |
|
; |
|
|
|
untilOption |
|
: gtids=(SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS) |
|
'=' gtuidSet #gtidsUntilOption |
|
| MASTER_LOG_FILE '=' STRING_LITERAL |
|
',' MASTER_LOG_POS '=' decimalLiteral #masterLogUntilOption |
|
| RELAY_LOG_FILE '=' STRING_LITERAL |
|
',' RELAY_LOG_POS '=' decimalLiteral #relayLogUntilOption |
|
| SQL_AFTER_MTS_GAPS #sqlGapsUntilOption |
|
; |
|
|
|
connectionOption |
|
: USER '=' conOptUser=STRING_LITERAL #userConnectionOption |
|
| PASSWORD '=' conOptPassword=STRING_LITERAL #passwordConnectionOption |
|
| DEFAULT_AUTH '=' conOptDefAuth=STRING_LITERAL #defaultAuthConnectionOption |
|
| PLUGIN_DIR '=' conOptPluginDir=STRING_LITERAL #pluginDirConnectionOption |
|
; |
|
|
|
gtuidSet |
|
: uuidSet (',' uuidSet)* |
|
| STRING_LITERAL |
|
; |
|
|
|
|
|
// XA Transactions |
|
|
|
xaStartTransaction |
|
: XA xaStart=(START | BEGIN) xid xaAction=(JOIN | RESUME)? |
|
; |
|
|
|
xaEndTransaction |
|
: XA END xid (SUSPEND (FOR MIGRATE)?)? |
|
; |
|
|
|
xaPrepareStatement |
|
: XA PREPARE xid |
|
; |
|
|
|
xaCommitWork |
|
: XA COMMIT xid (ONE PHASE)? |
|
; |
|
|
|
xaRollbackWork |
|
: XA ROLLBACK xid |
|
; |
|
|
|
xaRecoverWork |
|
: XA RECOVER (CONVERT xid)? |
|
; |
|
|
|
|
|
// Prepared Statements |
|
|
|
prepareStatement |
|
: PREPARE uid FROM |
|
(query=STRING_LITERAL | variable=LOCAL_ID) |
|
; |
|
|
|
executeStatement |
|
: EXECUTE uid (USING userVariables)? |
|
; |
|
|
|
deallocatePrepare |
|
: dropFormat=(DEALLOCATE | DROP) PREPARE uid |
|
; |
|
|
|
|
|
// Compound Statements |
|
|
|
routineBody |
|
: blockStatement | sqlStatement |
|
; |
|
|
|
// details |
|
|
|
blockStatement |
|
: (uid ':')? BEGIN |
|
(declareVariable SEMI)* |
|
(declareCondition SEMI)* |
|
(declareCursor SEMI)* |
|
(declareHandler SEMI)* |
|
procedureSqlStatement* |
|
END uid? |
|
; |
|
|
|
caseStatement |
|
: CASE (uid | expression)? caseAlternative+ |
|
(ELSE procedureSqlStatement+)? |
|
END CASE |
|
; |
|
|
|
ifStatement |
|
: IF expression |
|
THEN thenStatements+=procedureSqlStatement+ |
|
elifAlternative* |
|
(ELSE elseStatements+=procedureSqlStatement+ )? |
|
END IF |
|
; |
|
|
|
iterateStatement |
|
: ITERATE uid |
|
; |
|
|
|
leaveStatement |
|
: LEAVE uid |
|
; |
|
|
|
loopStatement |
|
: (uid ':')? |
|
LOOP procedureSqlStatement+ |
|
END LOOP uid? |
|
; |
|
|
|
repeatStatement |
|
: (uid ':')? |
|
REPEAT procedureSqlStatement+ |
|
UNTIL expression |
|
END REPEAT uid? |
|
; |
|
|
|
returnStatement |
|
: RETURN expression |
|
; |
|
|
|
whileStatement |
|
: (uid ':')? |
|
WHILE expression |
|
DO procedureSqlStatement+ |
|
END WHILE uid? |
|
; |
|
|
|
cursorStatement |
|
: CLOSE uid #CloseCursor |
|
| FETCH (NEXT? FROM)? uid INTO uidList #FetchCursor |
|
| OPEN uid #OpenCursor |
|
; |
|
|
|
// details |
|
|
|
declareVariable |
|
: DECLARE uidList dataType (DEFAULT expression)? |
|
; |
|
|
|
declareCondition |
|
: DECLARE uid CONDITION FOR |
|
( decimalLiteral | SQLSTATE VALUE? STRING_LITERAL) |
|
; |
|
|
|
declareCursor |
|
: DECLARE uid CURSOR FOR selectStatement |
|
; |
|
|
|
declareHandler |
|
: DECLARE handlerAction=(CONTINUE | EXIT | UNDO) |
|
HANDLER FOR |
|
handlerConditionValue (',' handlerConditionValue)* |
|
routineBody |
|
; |
|
|
|
handlerConditionValue |
|
: decimalLiteral #handlerConditionCode |
|
| SQLSTATE VALUE? STRING_LITERAL #handlerConditionState |
|
| uid #handlerConditionName |
|
| SQLWARNING #handlerConditionWarning |
|
| NOT FOUND #handlerConditionNotfound |
|
| SQLEXCEPTION #handlerConditionException |
|
; |
|
|
|
procedureSqlStatement |
|
: (compoundStatement | sqlStatement) SEMI |
|
; |
|
|
|
caseAlternative |
|
: WHEN (constant | expression) |
|
THEN procedureSqlStatement+ |
|
; |
|
|
|
elifAlternative |
|
: ELSEIF expression |
|
THEN procedureSqlStatement+ |
|
; |
|
|
|
// Administration Statements |
|
|
|
// Account management statements |
|
|
|
alterUser |
|
: ALTER USER |
|
userSpecification (',' userSpecification)* #alterUserMysqlV56 |
|
| ALTER USER ifExists? |
|
userAuthOption (',' userAuthOption)* |
|
( |
|
REQUIRE |
|
(tlsNone=NONE | tlsOption (AND? tlsOption)* ) |
|
)? |
|
(WITH userResourceOption+)? |
|
(userPasswordOption | userLockOption)* |
|
(COMMENT STRING_LITERAL | ATTRIBUTE STRING_LITERAL)? #alterUserMysqlV80 |
|
| ALTER USER ifExists? |
|
(userName | uid) DEFAULT ROLE roleOption #alterUserMysqlV80 |
|
; |
|
|
|
createUser |
|
: CREATE USER userAuthOption (',' userAuthOption)* #createUserMysqlV56 |
|
| CREATE USER ifNotExists? |
|
userAuthOption (',' userAuthOption)* |
|
(DEFAULT ROLE roleOption)? |
|
( |
|
REQUIRE |
|
(tlsNone=NONE | tlsOption (AND? tlsOption)* ) |
|
)? |
|
(WITH userResourceOption+)? |
|
(userPasswordOption | userLockOption)* |
|
(COMMENT STRING_LITERAL | ATTRIBUTE STRING_LITERAL)? #createUserMysqlV80 |
|
; |
|
|
|
dropUser |
|
: DROP USER ifExists? userName (',' userName)* |
|
; |
|
|
|
grantStatement |
|
: GRANT privelegeClause (',' privelegeClause)* |
|
ON |
|
privilegeObject=(TABLE | FUNCTION | PROCEDURE)? |
|
privilegeLevel |
|
TO userAuthOption (',' userAuthOption)* |
|
( |
|
REQUIRE |
|
(tlsNone=NONE | tlsOption (AND? tlsOption)* ) |
|
)? |
|
(WITH (GRANT OPTION | userResourceOption)* )? |
|
(AS userName WITH ROLE roleOption)? |
|
| GRANT (userName | uid) (',' (userName | uid))* |
|
TO (userName | uid) (',' (userName | uid))* |
|
(WITH ADMIN OPTION)? |
|
; |
|
|
|
roleOption |
|
: DEFAULT |
|
| NONE |
|
| ALL (EXCEPT userName (',' userName)*)? |
|
| userName (',' userName)* |
|
; |
|
|
|
grantProxy |
|
: GRANT PROXY ON fromFirst=userName |
|
TO toFirst=userName (',' toOther+=userName)* |
|
(WITH GRANT OPTION)? |
|
; |
|
|
|
renameUser |
|
: RENAME USER |
|
renameUserClause (',' renameUserClause)* |
|
; |
|
|
|
revokeStatement |
|
: REVOKE privelegeClause (',' privelegeClause)* |
|
ON |
|
privilegeObject=(TABLE | FUNCTION | PROCEDURE)? |
|
privilegeLevel |
|
FROM userName (',' userName)* #detailRevoke |
|
| REVOKE ALL PRIVILEGES? ',' GRANT OPTION |
|
FROM userName (',' userName)* #shortRevoke |
|
| REVOKE (userName | uid) (',' (userName | uid))* |
|
FROM (userName | uid) (',' (userName | uid))* #roleRevoke |
|
; |
|
|
|
revokeProxy |
|
: REVOKE PROXY ON onUser=userName |
|
FROM fromFirst=userName (',' fromOther+=userName)* |
|
; |
|
|
|
setPasswordStatement |
|
: SET PASSWORD (FOR userName)? |
|
'=' ( passwordFunctionClause | STRING_LITERAL) |
|
; |
|
|
|
// details |
|
|
|
userSpecification |
|
: userName userPasswordOption |
|
; |
|
|
|
userAuthOption |
|
: userName IDENTIFIED BY PASSWORD hashed=STRING_LITERAL #hashAuthOption |
|
| userName IDENTIFIED BY RANDOM PASSWORD authOptionClause #randomAuthOption |
|
| userName IDENTIFIED BY STRING_LITERAL authOptionClause #stringAuthOption |
|
| userName IDENTIFIED WITH authenticationRule #moduleAuthOption |
|
| userName #simpleAuthOption |
|
; |
|
|
|
authOptionClause |
|
: (REPLACE STRING_LITERAL)? (RETAIN CURRENT PASSWORD)? |
|
; |
|
|
|
authenticationRule |
|
: authPlugin |
|
((BY | USING | AS) (STRING_LITERAL | RANDOM PASSWORD) |
|
authOptionClause)? #module |
|
| authPlugin |
|
USING passwordFunctionClause #passwordModuleOption |
|
; |
|
|
|
tlsOption |
|
: SSL |
|
| X509 |
|
| CIPHER STRING_LITERAL |
|
| ISSUER STRING_LITERAL |
|
| SUBJECT STRING_LITERAL |
|
; |
|
|
|
userResourceOption |
|
: MAX_QUERIES_PER_HOUR decimalLiteral |
|
| MAX_UPDATES_PER_HOUR decimalLiteral |
|
| MAX_CONNECTIONS_PER_HOUR decimalLiteral |
|
| MAX_USER_CONNECTIONS decimalLiteral |
|
; |
|
|
|
userPasswordOption |
|
: PASSWORD EXPIRE |
|
(expireType=DEFAULT |
|
| expireType=NEVER |
|
| expireType=INTERVAL decimalLiteral DAY |
|
)? |
|
| PASSWORD HISTORY (DEFAULT | decimalLiteral) |
|
| PASSWORD REUSE INTERVAL (DEFAULT | decimalLiteral DAY) |
|
| PASSWORD REQUIRE CURRENT (OPTIONAL | DEFAULT)? |
|
| FAILED_LOGIN_ATTEMPTS decimalLiteral |
|
| PASSWORD_LOCK_TIME (decimalLiteral | UNBOUNDED) |
|
; |
|
|
|
userLockOption |
|
: ACCOUNT lockType=(LOCK | UNLOCK) |
|
; |
|
|
|
privelegeClause |
|
: privilege ( '(' uidList ')' )? |
|
; |
|
|
|
privilege |
|
: ALL PRIVILEGES? |
|
| ALTER ROUTINE? |
|
| CREATE |
|
(TEMPORARY TABLES | ROUTINE | VIEW | USER | TABLESPACE | ROLE)? |
|
| DELETE | DROP (ROLE)? | EVENT | EXECUTE | FILE | GRANT OPTION |
|
| INDEX | INSERT | LOCK TABLES | PROCESS | PROXY |
|
| REFERENCES | RELOAD |
|
| REPLICATION (CLIENT | SLAVE) |
|
| SELECT |
|
| SHOW (VIEW | DATABASES) |
|
| SHUTDOWN | SUPER | TRIGGER | UPDATE | USAGE |
|
| APPLICATION_PASSWORD_ADMIN | AUDIT_ABORT_EXEMPT | AUDIT_ADMIN | AUTHENTICATION_POLICY_ADMIN | BACKUP_ADMIN | BINLOG_ADMIN | BINLOG_ENCRYPTION_ADMIN | CLONE_ADMIN |
|
| CONNECTION_ADMIN | ENCRYPTION_KEY_ADMIN | FIREWALL_ADMIN | FIREWALL_EXEMPT | FIREWALL_USER | FLUSH_OPTIMIZER_COSTS |
|
| FLUSH_STATUS | FLUSH_TABLES | FLUSH_USER_RESOURCES | GROUP_REPLICATION_ADMIN |
|
| INNODB_REDO_LOG_ARCHIVE | INNODB_REDO_LOG_ENABLE | NDB_STORED_USER | PASSWORDLESS_USER_ADMIN | PERSIST_RO_VARIABLES_ADMIN | REPLICATION_APPLIER |
|
| REPLICATION_SLAVE_ADMIN | RESOURCE_GROUP_ADMIN | RESOURCE_GROUP_USER | ROLE_ADMIN |
|
| SERVICE_CONNECTION_ADMIN |
|
| SESSION_VARIABLES_ADMIN | SET_USER_ID | SKIP_QUERY_REWRITE | SHOW_ROUTINE | SYSTEM_USER | SYSTEM_VARIABLES_ADMIN |
|
| TABLE_ENCRYPTION_ADMIN | TP_CONNECTION_ADMIN | VERSION_TOKEN_ADMIN | XA_RECOVER_ADMIN |
|
// MySQL on Amazon RDS |
|
| LOAD FROM S3 | SELECT INTO S3 | INVOKE LAMBDA |
|
; |
|
|
|
privilegeLevel |
|
: '*' #currentSchemaPriviLevel |
|
| '*' '.' '*' #globalPrivLevel |
|
| uid '.' '*' #definiteSchemaPrivLevel |
|
| uid '.' uid #definiteFullTablePrivLevel |
|
| uid dottedId #definiteFullTablePrivLevel2 |
|
| uid #definiteTablePrivLevel |
|
; |
|
|
|
renameUserClause |
|
: fromFirst=userName TO toFirst=userName |
|
; |
|
|
|
// Table maintenance statements |
|
|
|
analyzeTable |
|
: ANALYZE actionOption=(NO_WRITE_TO_BINLOG | LOCAL)? |
|
(TABLE | TABLES) tables |
|
( UPDATE HISTOGRAM ON fullColumnName (',' fullColumnName)* (WITH decimalLiteral BUCKETS)? )? |
|
( DROP HISTOGRAM ON fullColumnName (',' fullColumnName)* )? |
|
; |
|
|
|
checkTable |
|
: CHECK TABLE tables checkTableOption* |
|
; |
|
|
|
checksumTable |
|
: CHECKSUM TABLE tables actionOption=(QUICK | EXTENDED)? |
|
; |
|
|
|
optimizeTable |
|
: OPTIMIZE actionOption=(NO_WRITE_TO_BINLOG | LOCAL)? |
|
(TABLE | TABLES) tables |
|
; |
|
|
|
repairTable |
|
: REPAIR actionOption=(NO_WRITE_TO_BINLOG | LOCAL)? |
|
TABLE tables |
|
QUICK? EXTENDED? USE_FRM? |
|
; |
|
|
|
// details |
|
|
|
checkTableOption |
|
: FOR UPGRADE | QUICK | FAST | MEDIUM | EXTENDED | CHANGED |
|
; |
|
|
|
|
|
// Plugin and udf statements |
|
|
|
createUdfunction |
|
: CREATE AGGREGATE? FUNCTION ifNotExists? uid |
|
RETURNS returnType=(STRING | INTEGER | REAL | DECIMAL) |
|
SONAME STRING_LITERAL |
|
; |
|
|
|
installPlugin |
|
: INSTALL PLUGIN uid SONAME STRING_LITERAL |
|
; |
|
|
|
uninstallPlugin |
|
: UNINSTALL PLUGIN uid |
|
; |
|
|
|
|
|
// Set and show statements |
|
|
|
setStatement |
|
: SET variableClause ('=' | ':=') (expression | ON) |
|
(',' variableClause ('=' | ':=') (expression | ON))* #setVariable |
|
| SET charSet (charsetName | DEFAULT) #setCharset |
|
| SET NAMES |
|
(charsetName (COLLATE collationName)? | DEFAULT) #setNames |
|
| setPasswordStatement #setPassword |
|
| setTransactionStatement #setTransaction |
|
| setAutocommitStatement #setAutocommit |
|
| SET fullId ('=' | ':=') expression |
|
(',' fullId ('=' | ':=') expression)* #setNewValueInsideTrigger |
|
; |
|
|
|
showStatement |
|
: SHOW logFormat=(BINARY | MASTER) LOGS #showMasterLogs |
|
| SHOW logFormat=(BINLOG | RELAYLOG) |
|
EVENTS (IN filename=STRING_LITERAL)? |
|
(FROM fromPosition=decimalLiteral)? |
|
(LIMIT |
|
(offset=decimalLiteral ',')? |
|
rowCount=decimalLiteral |
|
)? #showLogEvents |
|
| SHOW showCommonEntity showFilter? #showObjectFilter |
|
| SHOW FULL? columnsFormat=(COLUMNS | FIELDS) |
|
tableFormat=(FROM | IN) tableName |
|
(schemaFormat=(FROM | IN) uid)? showFilter? #showColumns |
|
| SHOW CREATE schemaFormat=(DATABASE | SCHEMA) |
|
ifNotExists? uid #showCreateDb |
|
| SHOW CREATE |
|
namedEntity=( |
|
EVENT | FUNCTION | PROCEDURE |
|
| TABLE | TRIGGER | VIEW |
|
) |
|
fullId #showCreateFullIdObject |
|
| SHOW CREATE USER userName #showCreateUser |
|
| SHOW ENGINE engineName engineOption=(STATUS | MUTEX) #showEngine |
|
| SHOW showGlobalInfoClause #showGlobalInfo |
|
| SHOW errorFormat=(ERRORS | WARNINGS) |
|
(LIMIT |
|
(offset=decimalLiteral ',')? |
|
rowCount=decimalLiteral |
|
)? #showErrors |
|
| SHOW COUNT '(' '*' ')' errorFormat=(ERRORS | WARNINGS) #showCountErrors |
|
| SHOW showSchemaEntity |
|
(schemaFormat=(FROM | IN) uid)? showFilter? #showSchemaFilter |
|
| SHOW routine=(FUNCTION | PROCEDURE) CODE fullId #showRoutine |
|
| SHOW GRANTS (FOR userName)? #showGrants |
|
| SHOW indexFormat=(INDEX | INDEXES | KEYS) |
|
tableFormat=(FROM | IN) tableName |
|
(schemaFormat=(FROM | IN) uid)? (WHERE expression)? #showIndexes |
|
| SHOW OPEN TABLES ( schemaFormat=(FROM | IN) uid)? |
|
showFilter? #showOpenTables |
|
| SHOW PROFILE showProfileType (',' showProfileType)* |
|
(FOR QUERY queryCount=decimalLiteral)? |
|
(LIMIT |
|
(offset=decimalLiteral ',')? |
|
rowCount=decimalLiteral |
|
) #showProfile |
|
| SHOW SLAVE STATUS (FOR CHANNEL STRING_LITERAL)? #showSlaveStatus |
|
; |
|
|
|
// details |
|
|
|
variableClause |
|
: LOCAL_ID | GLOBAL_ID | ( ('@' '@')? (GLOBAL | SESSION | LOCAL) )? uid |
|
; |
|
|
|
showCommonEntity |
|
: CHARACTER SET | COLLATION | DATABASES | SCHEMAS |
|
| FUNCTION STATUS | PROCEDURE STATUS |
|
| (GLOBAL | SESSION)? (STATUS | VARIABLES) |
|
; |
|
|
|
showFilter |
|
: LIKE STRING_LITERAL |
|
| WHERE expression |
|
; |
|
|
|
showGlobalInfoClause |
|
: STORAGE? ENGINES | MASTER STATUS | PLUGINS |
|
| PRIVILEGES | FULL? PROCESSLIST | PROFILES |
|
| SLAVE HOSTS | AUTHORS | CONTRIBUTORS |
|
; |
|
|
|
showSchemaEntity |
|
: EVENTS | TABLE STATUS | FULL? TABLES | TRIGGERS |
|
; |
|
|
|
showProfileType |
|
: ALL | BLOCK IO | CONTEXT SWITCHES | CPU | IPC | MEMORY |
|
| PAGE FAULTS | SOURCE | SWAPS |
|
; |
|
|
|
|
|
// Other administrative statements |
|
|
|
binlogStatement |
|
: BINLOG STRING_LITERAL |
|
; |
|
|
|
cacheIndexStatement |
|
: CACHE INDEX tableIndexes (',' tableIndexes)* |
|
( PARTITION '(' (uidList | ALL) ')' )? |
|
IN schema=uid |
|
; |
|
|
|
flushStatement |
|
: FLUSH flushFormat=(NO_WRITE_TO_BINLOG | LOCAL)? |
|
flushOption (',' flushOption)* |
|
; |
|
|
|
killStatement |
|
: KILL connectionFormat=(CONNECTION | QUERY)? expression |
|
; |
|
|
|
loadIndexIntoCache |
|
: LOAD INDEX INTO CACHE |
|
loadedTableIndexes (',' loadedTableIndexes)* |
|
; |
|
|
|
// remark reset (maser | slave) describe in replication's |
|
// statements section |
|
resetStatement |
|
: RESET QUERY CACHE |
|
; |
|
|
|
shutdownStatement |
|
: SHUTDOWN |
|
; |
|
|
|
// details |
|
|
|
tableIndexes |
|
: tableName ( indexFormat=(INDEX | KEY)? '(' uidList ')' )? |
|
; |
|
|
|
flushOption |
|
: ( |
|
DES_KEY_FILE | HOSTS |
|
| ( |
|
BINARY | ENGINE | ERROR | GENERAL | RELAY | SLOW |
|
)? LOGS |
|
| OPTIMIZER_COSTS | PRIVILEGES | QUERY CACHE | STATUS |
|
| USER_RESOURCES | TABLES (WITH READ LOCK)? |
|
) #simpleFlushOption |
|
| RELAY LOGS channelOption? #channelFlushOption |
|
| (TABLE | TABLES) tables? flushTableOption? #tableFlushOption |
|
; |
|
|
|
flushTableOption |
|
: WITH READ LOCK |
|
| FOR EXPORT |
|
; |
|
|
|
loadedTableIndexes |
|
: tableName |
|
( PARTITION '(' (partitionList=uidList | ALL) ')' )? |
|
( indexFormat=(INDEX | KEY)? '(' indexList=uidList ')' )? |
|
(IGNORE LEAVES)? |
|
; |
|
|
|
|
|
// Utility Statements |
|
|
|
|
|
simpleDescribeStatement |
|
: command=(EXPLAIN | DESCRIBE | DESC) tableName |
|
(column=uid | pattern=STRING_LITERAL)? |
|
; |
|
|
|
fullDescribeStatement |
|
: command=(EXPLAIN | DESCRIBE | DESC) |
|
( |
|
formatType=(EXTENDED | PARTITIONS | FORMAT ) |
|
'=' |
|
formatValue=(TRADITIONAL | JSON) |
|
)? |
|
describeObjectClause |
|
; |
|
|
|
helpStatement |
|
: HELP STRING_LITERAL |
|
; |
|
|
|
useStatement |
|
: USE uid |
|
; |
|
|
|
signalStatement |
|
: SIGNAL ( ( SQLSTATE VALUE? stringLiteral ) | ID | REVERSE_QUOTE_ID ) |
|
( SET signalConditionInformation ( ',' signalConditionInformation)* )? |
|
; |
|
|
|
resignalStatement |
|
: RESIGNAL ( ( SQLSTATE VALUE? stringLiteral ) | ID | REVERSE_QUOTE_ID )? |
|
( SET signalConditionInformation ( ',' signalConditionInformation)* )? |
|
; |
|
|
|
signalConditionInformation |
|
: ( CLASS_ORIGIN |
|
| SUBCLASS_ORIGIN |
|
| MESSAGE_TEXT |
|
| MYSQL_ERRNO |
|
| CONSTRAINT_CATALOG |
|
| CONSTRAINT_SCHEMA |
|
| CONSTRAINT_NAME |
|
| CATALOG_NAME |
|
| SCHEMA_NAME |
|
| TABLE_NAME |
|
| COLUMN_NAME |
|
| CURSOR_NAME |
|
) '=' ( stringLiteral | DECIMAL_LITERAL | mysqlVariable | simpleId ) |
|
; |
|
|
|
withStatement |
|
: WITH RECURSIVE? commonTableExpressions (',' commonTableExpressions)* |
|
; |
|
|
|
tableStatement |
|
: TABLE tableName orderByClause? limitClause? |
|
; |
|
|
|
diagnosticsStatement |
|
: GET ( CURRENT | STACKED )? DIAGNOSTICS ( |
|
( variableClause '=' ( NUMBER | ROW_COUNT ) ( ',' variableClause '=' ( NUMBER | ROW_COUNT ) )* ) |
|
| ( CONDITION ( decimalLiteral | variableClause ) variableClause '=' diagnosticsConditionInformationName ( ',' variableClause '=' diagnosticsConditionInformationName )* ) |
|
) |
|
; |
|
|
|
diagnosticsConditionInformationName |
|
: CLASS_ORIGIN |
|
| SUBCLASS_ORIGIN |
|
| RETURNED_SQLSTATE |
|
| MESSAGE_TEXT |
|
| MYSQL_ERRNO |
|
| CONSTRAINT_CATALOG |
|
| CONSTRAINT_SCHEMA |
|
| CONSTRAINT_NAME |
|
| CATALOG_NAME |
|
| SCHEMA_NAME |
|
| TABLE_NAME |
|
| COLUMN_NAME |
|
| CURSOR_NAME |
|
; |
|
|
|
// details |
|
|
|
describeObjectClause |
|
: ( |
|
selectStatement | deleteStatement | insertStatement |
|
| replaceStatement | updateStatement |
|
) #describeStatements |
|
| FOR CONNECTION uid #describeConnection |
|
; |
|
|
|
|
|
// Common Clauses |
|
|
|
// DB Objects |
|
|
|
fullId |
|
: uid (DOT_ID | '.' uid)? |
|
; |
|
|
|
tableName |
|
: fullId |
|
; |
|
|
|
roleName |
|
: userName | uid |
|
; |
|
|
|
fullColumnName |
|
: uid (dottedId dottedId? )? |
|
| .? dottedId dottedId? |
|
; |
|
|
|
indexColumnName |
|
: ((uid | STRING_LITERAL) ('(' decimalLiteral ')')? | expression) sortType=(ASC | DESC)? |
|
; |
|
|
|
userName |
|
: STRING_USER_NAME | ID | STRING_LITERAL | ADMIN | keywordsCanBeId; |
|
|
|
mysqlVariable |
|
: LOCAL_ID |
|
| GLOBAL_ID |
|
; |
|
|
|
charsetName |
|
: BINARY |
|
| charsetNameBase |
|
| STRING_LITERAL |
|
| CHARSET_REVERSE_QOUTE_STRING |
|
; |
|
|
|
collationName |
|
: uid | STRING_LITERAL; |
|
|
|
engineName |
|
: engineNameBase |
|
| ID |
|
| STRING_LITERAL |
|
; |
|
|
|
engineNameBase |
|
: ARCHIVE | BLACKHOLE | CONNECT | CSV | FEDERATED | INNODB | MEMORY |
|
| MRG_MYISAM | MYISAM | NDB | NDBCLUSTER | PERFORMANCE_SCHEMA | TOKUDB |
|
; |
|
|
|
uuidSet |
|
: decimalLiteral '-' decimalLiteral '-' decimalLiteral |
|
'-' decimalLiteral '-' decimalLiteral |
|
(':' decimalLiteral '-' decimalLiteral)+ |
|
; |
|
|
|
xid |
|
: globalTableUid=xuidStringId |
|
( |
|
',' qualifier=xuidStringId |
|
(',' idFormat=decimalLiteral)? |
|
)? |
|
; |
|
|
|
xuidStringId |
|
: STRING_LITERAL |
|
| BIT_STRING |
|
| HEXADECIMAL_LITERAL+ |
|
; |
|
|
|
authPlugin |
|
: uid | STRING_LITERAL |
|
; |
|
|
|
uid |
|
: simpleId |
|
//| DOUBLE_QUOTE_ID |
|
//| REVERSE_QUOTE_ID |
|
| CHARSET_REVERSE_QOUTE_STRING |
|
| STRING_LITERAL |
|
; |
|
|
|
simpleId |
|
: ID |
|
| charsetNameBase |
|
| transactionLevelBase |
|
| engineNameBase |
|
| privilegesBase |
|
| intervalTypeBase |
|
| dataTypeBase |
|
| keywordsCanBeId |
|
| scalarFunctionName |
|
; |
|
|
|
dottedId |
|
: DOT_ID |
|
| '.' uid |
|
; |
|
|
|
|
|
// Literals |
|
|
|
decimalLiteral |
|
: DECIMAL_LITERAL | ZERO_DECIMAL | ONE_DECIMAL | TWO_DECIMAL | REAL_LITERAL |
|
; |
|
|
|
fileSizeLiteral |
|
: FILESIZE_LITERAL | decimalLiteral; |
|
|
|
stringLiteral |
|
: ( |
|
STRING_CHARSET_NAME? STRING_LITERAL |
|
| START_NATIONAL_STRING_LITERAL |
|
) STRING_LITERAL+ |
|
| ( |
|
STRING_CHARSET_NAME? STRING_LITERAL |
|
| START_NATIONAL_STRING_LITERAL |
|
) (COLLATE collationName)? |
|
; |
|
|
|
booleanLiteral |
|
: TRUE | FALSE; |
|
|
|
hexadecimalLiteral |
|
: STRING_CHARSET_NAME? HEXADECIMAL_LITERAL; |
|
|
|
nullNotnull |
|
: NOT? (NULL_LITERAL | NULL_SPEC_LITERAL) |
|
; |
|
|
|
constant |
|
: stringLiteral | decimalLiteral |
|
| '-' decimalLiteral |
|
| hexadecimalLiteral | booleanLiteral |
|
| REAL_LITERAL | BIT_STRING |
|
| NOT? nullLiteral=(NULL_LITERAL | NULL_SPEC_LITERAL) |
|
; |
|
|
|
|
|
// Data Types |
|
|
|
dataType |
|
: typeName=( |
|
CHAR | CHARACTER | VARCHAR | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT |
|
| NCHAR | NVARCHAR | LONG |
|
) |
|
VARYING? |
|
lengthOneDimension? BINARY? |
|
(charSet charsetName)? |
|
(COLLATE collationName | BINARY)? #stringDataType |
|
| NATIONAL typeName=(CHAR | CHARACTER) VARYING |
|
lengthOneDimension? BINARY? #nationalVaryingStringDataType |
|
| NATIONAL typeName=(VARCHAR | CHARACTER | CHAR) |
|
lengthOneDimension? BINARY? #nationalStringDataType |
|
| NCHAR typeName=VARCHAR |
|
lengthOneDimension? BINARY? #nationalStringDataType |
|
| typeName=( |
|
TINYINT | SMALLINT | MEDIUMINT | INT | INTEGER | BIGINT |
|
| MIDDLEINT | INT1 | INT2 | INT3 | INT4 | INT8 |
|
) |
|
lengthOneDimension? (SIGNED | UNSIGNED | ZEROFILL)* #dimensionDataType |
|
| typeName=REAL |
|
lengthTwoDimension? (SIGNED | UNSIGNED | ZEROFILL)* #dimensionDataType |
|
| typeName=DOUBLE PRECISION? |
|
lengthTwoDimension? (SIGNED | UNSIGNED | ZEROFILL)* #dimensionDataType |
|
| typeName=(DECIMAL | DEC | FIXED | NUMERIC | FLOAT | FLOAT4 | FLOAT8) |
|
lengthTwoOptionalDimension? (SIGNED | UNSIGNED | ZEROFILL)* #dimensionDataType |
|
| typeName=( |
|
DATE | TINYBLOB | MEDIUMBLOB | LONGBLOB |
|
| BOOL | BOOLEAN | SERIAL |
|
) #simpleDataType |
|
| typeName=( |
|
BIT | TIME | TIMESTAMP | DATETIME | BINARY |
|
| VARBINARY | BLOB | YEAR |
|
) |
|
lengthOneDimension? #dimensionDataType |
|
| typeName=(ENUM | SET) |
|
collectionOptions BINARY? |
|
(charSet charsetName)? #collectionDataType |
|
| typeName=( |
|
GEOMETRYCOLLECTION | GEOMCOLLECTION | LINESTRING | MULTILINESTRING |
|
| MULTIPOINT | MULTIPOLYGON | POINT | POLYGON | JSON | GEOMETRY |
|
) (SRID decimalLiteral)? #spatialDataType |
|
| typeName=LONG VARCHAR? |
|
BINARY? |
|
(charSet charsetName)? |
|
(COLLATE collationName)? #longVarcharDataType // LONG VARCHAR is the same as LONG |
|
| LONG VARBINARY #longVarbinaryDataType |
|
; |
|
|
|
collectionOptions |
|
: '(' STRING_LITERAL (',' STRING_LITERAL)* ')' |
|
; |
|
|
|
convertedDataType |
|
: |
|
( |
|
typeName=(BINARY| NCHAR) lengthOneDimension? |
|
| typeName=CHAR lengthOneDimension? (charSet charsetName)? |
|
| typeName=(DATE | DATETIME | TIME | JSON | INT | INTEGER) |
|
| typeName=(DECIMAL | DEC) lengthTwoOptionalDimension? |
|
| (SIGNED | UNSIGNED) (INTEGER | INT)? |
|
) ARRAY? |
|
; |
|
|
|
lengthOneDimension |
|
: '(' decimalLiteral ')' |
|
; |
|
|
|
lengthTwoDimension |
|
: '(' decimalLiteral ',' decimalLiteral ')' |
|
; |
|
|
|
lengthTwoOptionalDimension |
|
: '(' decimalLiteral (',' decimalLiteral)? ')' |
|
; |
|
|
|
|
|
// Common Lists |
|
|
|
uidList |
|
: uid (',' uid)* |
|
; |
|
|
|
fullColumnNameList |
|
: fullColumnName (',' fullColumnName)* |
|
; |
|
|
|
tables |
|
: tableName (',' tableName)* |
|
; |
|
|
|
indexColumnNames |
|
: '(' indexColumnName (',' indexColumnName)* ')' |
|
; |
|
|
|
expressions |
|
: expression (',' expression)* |
|
; |
|
|
|
expressionsWithDefaults |
|
: expressionOrDefault (',' expressionOrDefault)* |
|
; |
|
|
|
constants |
|
: constant (',' constant)* |
|
; |
|
|
|
simpleStrings |
|
: STRING_LITERAL (',' STRING_LITERAL)* |
|
; |
|
|
|
userVariables |
|
: LOCAL_ID (',' LOCAL_ID)* |
|
; |
|
|
|
|
|
// Common Expressons |
|
|
|
defaultValue |
|
: NULL_LITERAL |
|
| CAST '(' expression AS convertedDataType ')' |
|
| unaryOperator? constant |
|
| currentTimestamp (ON UPDATE currentTimestamp)? |
|
| '(' expression ')' |
|
| '(' fullId ')' |
|
; |
|
|
|
currentTimestamp |
|
: |
|
( |
|
(CURRENT_TIMESTAMP | LOCALTIME | LOCALTIMESTAMP) |
|
('(' decimalLiteral? ')')? |
|
| NOW '(' decimalLiteral? ')' |
|
) |
|
; |
|
|
|
expressionOrDefault |
|
: expression | DEFAULT |
|
; |
|
|
|
ifExists |
|
: IF EXISTS |
|
; |
|
|
|
|
|
ifNotExists |
|
: IF NOT EXISTS |
|
; |
|
|
|
orReplace |
|
: OR REPLACE |
|
; |
|
|
|
waitNowaitClause |
|
: WAIT decimalLiteral |
|
| NOWAIT |
|
; |
|
|
|
// Functions |
|
|
|
functionCall |
|
: specificFunction #specificFunctionCall |
|
| aggregateWindowedFunction #aggregateFunctionCall |
|
| nonAggregateWindowedFunction #nonAggregateFunctionCall |
|
| scalarFunctionName '(' functionArgs? ')' #scalarFunctionCall |
|
| fullId '(' functionArgs? ')' #udfFunctionCall |
|
| passwordFunctionClause #passwordFunctionCall |
|
; |
|
|
|
specificFunction |
|
: ( |
|
CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP |
|
| CURRENT_USER | LOCALTIME | UTC_TIMESTAMP | SCHEMA |
|
) ('(' ')')? #simpleFunctionCall |
|
| CONVERT '(' expression separator=',' convertedDataType ')' #dataTypeFunctionCall |
|
| CONVERT '(' expression USING charsetName ')' #dataTypeFunctionCall |
|
| CAST '(' expression AS convertedDataType ')' #dataTypeFunctionCall |
|
| VALUES '(' fullColumnName ')' #valuesFunctionCall |
|
| CASE expression caseFuncAlternative+ |
|
(ELSE elseArg=functionArg)? END #caseExpressionFunctionCall |
|
| CASE caseFuncAlternative+ |
|
(ELSE elseArg=functionArg)? END #caseFunctionCall |
|
| CHAR '(' functionArgs (USING charsetName)? ')' #charFunctionCall |
|
| POSITION |
|
'(' |
|
( |
|
positionString=stringLiteral |
|
| positionExpression=expression |
|
) |
|
IN |
|
( |
|
inString=stringLiteral |
|
| inExpression=expression |
|
) |
|
')' #positionFunctionCall |
|
| (SUBSTR | SUBSTRING) |
|
'(' |
|
( |
|
sourceString=stringLiteral |
|
| sourceExpression=expression |
|
) FROM |
|
( |
|
fromDecimal=decimalLiteral |
|
| fromExpression=expression |
|
) |
|
( |
|
FOR |
|
( |
|
forDecimal=decimalLiteral |
|
| forExpression=expression |
|
) |
|
)? |
|
')' #substrFunctionCall |
|
| TRIM |
|
'(' |
|
positioinForm=(BOTH | LEADING | TRAILING) |
|
( |
|
sourceString=stringLiteral |
|
| sourceExpression=expression |
|
)? |
|
FROM |
|
( |
|
fromString=stringLiteral |
|
| fromExpression=expression |
|
) |
|
')' #trimFunctionCall |
|
| TRIM |
|
'(' |
|
( |
|
sourceString=stringLiteral |
|
| sourceExpression=expression |
|
) |
|
FROM |
|
( |
|
fromString=stringLiteral |
|
| fromExpression=expression |
|
) |
|
')' #trimFunctionCall |
|
| WEIGHT_STRING |
|
'(' |
|
(stringLiteral | expression) |
|
(AS stringFormat=(CHAR | BINARY) |
|
'(' decimalLiteral ')' )? levelsInWeightString? |
|
')' #weightFunctionCall |
|
| EXTRACT |
|
'(' |
|
intervalType |
|
FROM |
|
( |
|
sourceString=stringLiteral |
|
| sourceExpression=expression |
|
) |
|
')' #extractFunctionCall |
|
| GET_FORMAT |
|
'(' |
|
datetimeFormat=(DATE | TIME | DATETIME) |
|
',' stringLiteral |
|
')' #getFormatFunctionCall |
|
| JSON_VALUE |
|
'(' expression |
|
',' expression |
|
(RETURNING convertedDataType)? |
|
jsonOnEmpty? |
|
jsonOnError? |
|
')' #jsonValueFunctionCall |
|
; |
|
|
|
caseFuncAlternative |
|
: WHEN condition=functionArg |
|
THEN consequent=functionArg |
|
; |
|
|
|
levelsInWeightString |
|
: LEVEL levelInWeightListElement |
|
(',' levelInWeightListElement)* #levelWeightList |
|
| LEVEL |
|
firstLevel=decimalLiteral '-' lastLevel=decimalLiteral #levelWeightRange |
|
; |
|
|
|
levelInWeightListElement |
|
: decimalLiteral orderType=(ASC | DESC | REVERSE)? |
|
; |
|
|
|
aggregateWindowedFunction |
|
: (AVG | MAX | MIN | SUM) |
|
'(' aggregator=(ALL | DISTINCT)? functionArg ')' overClause? |
|
| COUNT '(' (starArg='*' | aggregator=ALL? functionArg | aggregator=DISTINCT functionArgs) ')' overClause? |
|
| ( |
|
BIT_AND | BIT_OR | BIT_XOR | STD | STDDEV | STDDEV_POP |
|
| STDDEV_SAMP | VAR_POP | VAR_SAMP | VARIANCE |
|
) '(' aggregator=ALL? functionArg ')' overClause? |
|
| GROUP_CONCAT '(' |
|
aggregator=DISTINCT? functionArgs |
|
(ORDER BY |
|
orderByExpression (',' orderByExpression)* |
|
)? (SEPARATOR separator=STRING_LITERAL)? |
|
')' |
|
; |
|
|
|
nonAggregateWindowedFunction |
|
: (LAG | LEAD) '(' expression (',' decimalLiteral)? (',' decimalLiteral)? ')' overClause |
|
| (FIRST_VALUE | LAST_VALUE) '(' expression ')' overClause |
|
| (CUME_DIST | DENSE_RANK | PERCENT_RANK | RANK | ROW_NUMBER) '('')' overClause |
|
| NTH_VALUE '(' expression ',' decimalLiteral ')' overClause |
|
| NTILE '(' decimalLiteral ')' overClause |
|
; |
|
|
|
overClause |
|
: OVER ('(' windowSpec ')' | windowName) |
|
; |
|
|
|
windowSpec |
|
: windowName? partitionClause? orderByClause? frameClause? |
|
; |
|
|
|
windowName |
|
: uid |
|
; |
|
|
|
frameClause |
|
: frameUnits frameExtent |
|
; |
|
|
|
frameUnits |
|
: ROWS |
|
| RANGE |
|
; |
|
|
|
frameExtent |
|
: frameRange |
|
| frameBetween |
|
; |
|
|
|
frameBetween |
|
: BETWEEN frameRange AND frameRange |
|
; |
|
|
|
frameRange |
|
: CURRENT ROW |
|
| UNBOUNDED (PRECEDING | FOLLOWING) |
|
| expression (PRECEDING | FOLLOWING) |
|
; |
|
|
|
partitionClause |
|
: PARTITION BY expression (',' expression)* |
|
; |
|
|
|
scalarFunctionName |
|
: functionNameBase |
|
| ASCII | CURDATE | CURRENT_DATE | CURRENT_TIME |
|
| CURRENT_TIMESTAMP | CURTIME | DATE_ADD | DATE_SUB |
|
| IF | INSERT | LOCALTIME | LOCALTIMESTAMP | MID | NOW |
|
| REPEAT | REPLACE | SUBSTR | SUBSTRING | SYSDATE | TRIM |
|
| UTC_DATE | UTC_TIME | UTC_TIMESTAMP |
|
; |
|
|
|
passwordFunctionClause |
|
: functionName=(PASSWORD | OLD_PASSWORD) '(' functionArg ')' |
|
; |
|
|
|
functionArgs |
|
: (constant | fullColumnName | functionCall | expression) |
|
( |
|
',' |
|
(constant | fullColumnName | functionCall | expression) |
|
)* |
|
; |
|
|
|
functionArg |
|
: constant | fullColumnName | functionCall | expression |
|
; |
|
|
|
|
|
// Expressions, predicates |
|
|
|
// Simplified approach for expression |
|
expression |
|
: notOperator=(NOT | '!') expression #notExpression |
|
| expression logicalOperator expression #logicalExpression |
|
| predicate IS NOT? testValue=(TRUE | FALSE | UNKNOWN) #isExpression |
|
| predicate #predicateExpression |
|
; |
|
|
|
predicate |
|
: predicate NOT? IN '(' (selectStatement | expressions) ')' #inPredicate |
|
| predicate IS nullNotnull #isNullPredicate |
|
| left=predicate comparisonOperator right=predicate #binaryComparisonPredicate |
|
| predicate comparisonOperator |
|
quantifier=(ALL | ANY | SOME) '(' selectStatement ')' #subqueryComparisonPredicate |
|
| predicate NOT? BETWEEN predicate AND predicate #betweenPredicate |
|
| predicate SOUNDS LIKE predicate #soundsLikePredicate |
|
| predicate NOT? LIKE predicate (ESCAPE STRING_LITERAL)? #likePredicate |
|
| predicate NOT? regex=(REGEXP | RLIKE) predicate #regexpPredicate |
|
| predicate MEMBER OF '(' predicate ')' #jsonMemberOfPredicate |
|
| expressionAtom #expressionAtomPredicate |
|
; |
|
|
|
|
|
// Add in ASTVisitor nullNotnull in constant |
|
expressionAtom |
|
: constant #constantExpressionAtom |
|
| fullColumnName #fullColumnNameExpressionAtom |
|
| functionCall #functionCallExpressionAtom |
|
| expressionAtom COLLATE collationName #collateExpressionAtom |
|
| mysqlVariable #mysqlVariableExpressionAtom |
|
| unaryOperator expressionAtom #unaryExpressionAtom |
|
| BINARY expressionAtom #binaryExpressionAtom |
|
| LOCAL_ID VAR_ASSIGN expressionAtom #variableAssignExpressionAtom |
|
| '(' expression (',' expression)* ')' #nestedExpressionAtom |
|
| ROW '(' expression (',' expression)+ ')' #nestedRowExpressionAtom |
|
| EXISTS '(' selectStatement ')' #existsExpressionAtom |
|
| '(' selectStatement ')' #subqueryExpressionAtom |
|
| INTERVAL expression intervalType #intervalExpressionAtom |
|
| left=expressionAtom bitOperator right=expressionAtom #bitExpressionAtom |
|
| left=expressionAtom mathOperator right=expressionAtom #mathExpressionAtom |
|
| left=expressionAtom jsonOperator right=expressionAtom #jsonExpressionAtom |
|
; |
|
|
|
unaryOperator |
|
: '!' | '~' | '+' | '-' | NOT |
|
; |
|
|
|
comparisonOperator |
|
: '=' | '>' | '<' | '<' '=' | '>' '=' |
|
| '<' '>' | '!' '=' | '<' '=' '>' |
|
; |
|
|
|
logicalOperator |
|
: AND | '&' '&' | XOR | OR | '|' '|' |
|
; |
|
|
|
bitOperator |
|
: '<' '<' | '>' '>' | '&' | '^' | '|' |
|
; |
|
|
|
mathOperator |
|
: '*' | '/' | '%' | DIV | MOD | '+' | '-' |
|
; |
|
|
|
jsonOperator |
|
: '-' '>' | '-' '>' '>' |
|
; |
|
|
|
// Simple id sets |
|
// (that keyword, which can be id) |
|
|
|
charsetNameBase |
|
: ARMSCII8 | ASCII | BIG5 | BINARY | CP1250 | CP1251 | CP1256 | CP1257 |
|
| CP850 | CP852 | CP866 | CP932 | DEC8 | EUCJPMS | EUCKR |
|
| GB18030 | GB2312 | GBK | GEOSTD8 | GREEK | HEBREW | HP8 | KEYBCS2 |
|
| KOI8R | KOI8U | LATIN1 | LATIN2 | LATIN5 | LATIN7 | MACCE |
|
| MACROMAN | SJIS | SWE7 | TIS620 | UCS2 | UJIS | UTF16 |
|
| UTF16LE | UTF32 | UTF8 | UTF8MB3 | UTF8MB4 |
|
; |
|
|
|
transactionLevelBase |
|
: REPEATABLE | COMMITTED | UNCOMMITTED | SERIALIZABLE |
|
; |
|
|
|
privilegesBase |
|
: TABLES | ROUTINE | EXECUTE | FILE | PROCESS |
|
| RELOAD | SHUTDOWN | SUPER | PRIVILEGES |
|
; |
|
|
|
intervalTypeBase |
|
: QUARTER | MONTH | DAY | HOUR |
|
| MINUTE | WEEK | SECOND | MICROSECOND |
|
; |
|
|
|
dataTypeBase |
|
: DATE | TIME | TIMESTAMP | DATETIME | YEAR | ENUM | TEXT |
|
; |
|
|
|
keywordsCanBeId |
|
: ACCOUNT | ACTION | ADMIN | AFTER | AGGREGATE | ALGORITHM | ANY | ARRAY |
|
| AT | AUDIT_ADMIN | AUDIT_ABORT_EXEMPT | AUTHORS | AUTOCOMMIT | AUTOEXTEND_SIZE |
|
| AUTO_INCREMENT | AUTHENTICATION_POLICY_ADMIN | AVG | AVG_ROW_LENGTH | ATTRIBUTE |
|
| BACKUP_ADMIN | BEGIN | BINLOG | BINLOG_ADMIN | BINLOG_ENCRYPTION_ADMIN | BIT | BIT_AND | BIT_OR | BIT_XOR |
|
| BLOCK | BOOL | BOOLEAN | BTREE | BUCKETS | CACHE | CASCADED | CHAIN | CHANGED |
|
| CHANNEL | CHECKSUM | PAGE_CHECKSUM | CATALOG_NAME | CIPHER |
|
| CLASS_ORIGIN | CLIENT | CLONE_ADMIN | CLOSE | CLUSTERING | COALESCE | CODE |
|
| COLUMNS | COLUMN_FORMAT | COLUMN_NAME | COMMENT | COMMIT | COMPACT |
|
| COMPLETION | COMPRESSED | COMPRESSION | CONCURRENT | CONDITION | CONNECT |
|
| CONNECTION | CONNECTION_ADMIN | CONSISTENT | CONSTRAINT_CATALOG | CONSTRAINT_NAME |
|
| CONSTRAINT_SCHEMA | CONTAINS | CONTEXT |
|
| CONTRIBUTORS | COPY | COUNT | CPU | CURRENT | CURRENT_USER | CURSOR_NAME |
|
| DATA | DATAFILE | DEALLOCATE |
|
| DEFAULT | DEFAULT_AUTH | DEFINER | DELAY_KEY_WRITE | DES_KEY_FILE | DIAGNOSTICS | DIRECTORY |
|
| DISABLE | DISCARD | DISK | DO | DUMPFILE | DUPLICATE |
|
| DYNAMIC | EMPTY | ENABLE | ENCRYPTION | ENCRYPTION_KEY_ADMIN | END | ENDS | ENGINE | ENGINE_ATTRIBUTE | ENGINES | ENFORCED |
|
| ERROR | ERRORS | ESCAPE | EUR | EVEN | EVENT | EVENTS | EVERY | EXCEPT |
|
| EXCHANGE | EXCLUSIVE | EXPIRE | EXPORT | EXTENDED | EXTENT_SIZE | FAILED_LOGIN_ATTEMPTS | FAST | FAULTS |
|
| FIELDS | FILE_BLOCK_SIZE | FILTER | FIREWALL_ADMIN | FIREWALL_EXEMPT | FIREWALL_USER | FIRST | FIXED | FLUSH |
|
| FOLLOWS | FOUND | FULL | FUNCTION | GENERAL | GLOBAL | GRANTS | GROUP | GROUP_CONCAT |
|
| GROUP_REPLICATION | GROUP_REPLICATION_ADMIN | HANDLER | HASH | HELP | HISTORY | HOST | HOSTS | IDENTIFIED |
|
| IGNORED | IGNORE_SERVER_IDS | IMPORT | INDEXES | INITIAL_SIZE | INNODB_REDO_LOG_ARCHIVE |
|
| INPLACE | INSERT_METHOD | INSTALL | INSTANCE | INSTANT | INTERNAL | INVOKE | INVOKER | IO |
|
| IO_THREAD | IPC | ISO | ISOLATION | ISSUER | JIS | JSON | KEY_BLOCK_SIZE |
|
| LAMBDA | LANGUAGE | LAST | LATERAL | LEAVES | LESS | LEVEL | LIST | LOCAL |
|
| LOGFILE | LOGS | MASTER | MASTER_AUTO_POSITION |
|
| MASTER_CONNECT_RETRY | MASTER_DELAY |
|
| MASTER_HEARTBEAT_PERIOD | MASTER_HOST | MASTER_LOG_FILE |
|
| MASTER_LOG_POS | MASTER_PASSWORD | MASTER_PORT |
|
| MASTER_RETRY_COUNT | 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_VERSION | MASTER_USER |
|
| MAX_CONNECTIONS_PER_HOUR | MAX_QUERIES_PER_HOUR |
|
| MAX | MAX_ROWS | MAX_SIZE | MAX_UPDATES_PER_HOUR |
|
| MAX_USER_CONNECTIONS | MEDIUM | MEMBER | MEMORY | MERGE | MESSAGE_TEXT |
|
| MID | MIGRATE |
|
| MIN | MIN_ROWS | MODE | MODIFY | MUTEX | MYSQL | MYSQL_ERRNO | NAME | NAMES |
|
| NCHAR | NDB_STORED_USER | NESTED | NEVER | NEXT | NO | NOCOPY | NODEGROUP | NONE | NOWAIT | NUMBER | ODBC | OFFLINE | OFFSET |
|
| OF | OJ | OLD_PASSWORD | ONE | ONLINE | ONLY | OPEN | OPTIMIZER_COSTS |
|
| OPTIONAL | OPTIONS | ORDER | ORDINALITY | OWNER | PACK_KEYS | PAGE | PARSER | PARTIAL |
|
| PARTITIONING | PARTITIONS | PASSWORD | PASSWORDLESS_USER_ADMIN | PASSWORD_LOCK_TIME | PATH | PERSIST_RO_VARIABLES_ADMIN | PHASE | PLUGINS |
|
| PLUGIN_DIR | PLUGIN | PORT | PRECEDES | PREPARE | PRESERVE | PREV | PRIMARY |
|
| PROCESSLIST | PROFILE | PROFILES | PROXY | QUERY | QUICK |
|
| REBUILD | RECOVER | RECURSIVE | REDO_BUFFER_SIZE | REDUNDANT |
|
| RELAY | RELAYLOG | RELAY_LOG_FILE | RELAY_LOG_POS | REMOVE |
|
| REORGANIZE | REPAIR | REPLICATE_DO_DB | REPLICATE_DO_TABLE |
|
| REPLICATE_IGNORE_DB | REPLICATE_IGNORE_TABLE |
|
| REPLICATE_REWRITE_DB | REPLICATE_WILD_DO_TABLE |
|
| REPLICATE_WILD_IGNORE_TABLE | REPLICATION | REPLICATION_APPLIER | REPLICATION_SLAVE_ADMIN | RESET |
|
| RESOURCE_GROUP_ADMIN | RESOURCE_GROUP_USER | RESUME |
|
| RETURNED_SQLSTATE | RETURNS | REUSE | ROLE | ROLE_ADMIN | ROLLBACK | ROLLUP | ROTATE | ROW | ROWS |
|
| ROW_FORMAT | RTREE | S3 | SAVEPOINT | SCHEDULE | SCHEMA_NAME | SECURITY | SECONDARY_ENGINE_ATTRIBUTE | SERIAL | SERVER |
|
| SESSION | SESSION_VARIABLES_ADMIN | SET_USER_ID | SHARE | SHARED | SHOW_ROUTINE | SIGNED | SIMPLE | SLAVE |
|
| SLOW | SKIP_QUERY_REWRITE | SNAPSHOT | SOCKET | SOME | SONAME | SOUNDS | SOURCE |
|
| SQL_AFTER_GTIDS | SQL_AFTER_MTS_GAPS | SQL_BEFORE_GTIDS |
|
| SQL_BUFFER_RESULT | SQL_CACHE | SQL_NO_CACHE | SQL_THREAD |
|
| STACKED | START | STARTS | STATS_AUTO_RECALC | STATS_PERSISTENT |
|
| STATS_SAMPLE_PAGES | STATUS | STD | STDDEV | STDDEV_POP | STDDEV_SAMP | STOP | STORAGE | STRING |
|
| SUBCLASS_ORIGIN | SUBJECT | SUBPARTITION | SUBPARTITIONS | SUM | SUSPEND | SWAPS |
|
| SWITCHES | SYSTEM_VARIABLES_ADMIN | TABLE_NAME | TABLESPACE | TABLE_ENCRYPTION_ADMIN | TABLE_TYPE |
|
| TEMPORARY | TEMPTABLE | THAN | TP_CONNECTION_ADMIN | TRADITIONAL |
|
| TRANSACTION | TRANSACTIONAL | TRIGGERS | TRUNCATE | UNBOUNDED | UNDEFINED | UNDOFILE |
|
| UNDO_BUFFER_SIZE | UNINSTALL | UNKNOWN | UNTIL | UPGRADE | USA | USER | USE_FRM | USER_RESOURCES |
|
| VALIDATION | VALUE | VAR_POP | VAR_SAMP | VARIABLES | VARIANCE | VERSION_TOKEN_ADMIN | VIEW | VIRTUAL |
|
| WAIT | WARNINGS | WITHOUT | WORK | WRAPPER | X509 | XA | XA_RECOVER_ADMIN | XML |
|
; |
|
|
|
functionNameBase |
|
: ABS | ACOS | ADDDATE | ADDTIME | AES_DECRYPT | AES_ENCRYPT |
|
| AREA | ASBINARY | ASIN | ASTEXT | ASWKB | ASWKT |
|
| ASYMMETRIC_DECRYPT | ASYMMETRIC_DERIVE |
|
| ASYMMETRIC_ENCRYPT | ASYMMETRIC_SIGN | ASYMMETRIC_VERIFY |
|
| ATAN | ATAN2 | BENCHMARK | BIN | BIT_COUNT | BIT_LENGTH |
|
| BUFFER | CEIL | CEILING | CENTROID | CHARACTER_LENGTH |
|
| CHARSET | CHAR_LENGTH | COERCIBILITY | COLLATION |
|
| COMPRESS | CONCAT | CONCAT_WS | CONNECTION_ID | CONV |
|
| CONVERT_TZ | COS | COT | COUNT | CRC32 |
|
| CREATE_ASYMMETRIC_PRIV_KEY | CREATE_ASYMMETRIC_PUB_KEY |
|
| CREATE_DH_PARAMETERS | CREATE_DIGEST | CROSSES | CUME_DIST | DATABASE | DATE |
|
| DATEDIFF | DATE_FORMAT | DAY | DAYNAME | DAYOFMONTH |
|
| DAYOFWEEK | DAYOFYEAR | DECODE | DEGREES | DENSE_RANK | DES_DECRYPT |
|
| DES_ENCRYPT | DIMENSION | DISJOINT | ELT | ENCODE |
|
| ENCRYPT | ENDPOINT | ENVELOPE | EQUALS | EXP | EXPORT_SET |
|
| EXTERIORRING | EXTRACTVALUE | FIELD | FIND_IN_SET | FIRST_VALUE | FLOOR |
|
| FORMAT | FOUND_ROWS | FROM_BASE64 | FROM_DAYS |
|
| FROM_UNIXTIME | GEOMCOLLFROMTEXT | GEOMCOLLFROMWKB |
|
| GEOMETRYCOLLECTION | GEOMETRYCOLLECTIONFROMTEXT |
|
| GEOMETRYCOLLECTIONFROMWKB | GEOMETRYFROMTEXT |
|
| GEOMETRYFROMWKB | GEOMETRYN | GEOMETRYTYPE | GEOMFROMTEXT |
|
| GEOMFROMWKB | GET_FORMAT | GET_LOCK | GLENGTH | GREATEST |
|
| GTID_SUBSET | GTID_SUBTRACT | HEX | HOUR | IFNULL |
|
| INET6_ATON | INET6_NTOA | INET_ATON | INET_NTOA | INSTR |
|
| INTERIORRINGN | INTERSECTS | INVISIBLE |
|
| ISCLOSED | ISEMPTY | ISNULL |
|
| ISSIMPLE | IS_FREE_LOCK | IS_IPV4 | IS_IPV4_COMPAT |
|
| IS_IPV4_MAPPED | IS_IPV6 | IS_USED_LOCK | LAG | LAST_INSERT_ID | LAST_VALUE |
|
| LCASE | LEAD | LEAST | LEFT | LENGTH | LINEFROMTEXT | LINEFROMWKB |
|
| LINESTRING | LINESTRINGFROMTEXT | LINESTRINGFROMWKB | LN |
|
| LOAD_FILE | LOCATE | LOG | LOG10 | LOG2 | LOWER | LPAD |
|
| LTRIM | MAKEDATE | MAKETIME | MAKE_SET | MASTER_POS_WAIT |
|
| MBRCONTAINS | MBRDISJOINT | MBREQUAL | MBRINTERSECTS |
|
| MBROVERLAPS | MBRTOUCHES | MBRWITHIN | MD5 | MICROSECOND |
|
| MINUTE | MLINEFROMTEXT | MLINEFROMWKB | MOD| MONTH | MONTHNAME |
|
| MPOINTFROMTEXT | MPOINTFROMWKB | MPOLYFROMTEXT |
|
| MPOLYFROMWKB | MULTILINESTRING | MULTILINESTRINGFROMTEXT |
|
| MULTILINESTRINGFROMWKB | MULTIPOINT | MULTIPOINTFROMTEXT |
|
| MULTIPOINTFROMWKB | MULTIPOLYGON | MULTIPOLYGONFROMTEXT |
|
| MULTIPOLYGONFROMWKB | NAME_CONST | NTH_VALUE | NTILE | NULLIF | NUMGEOMETRIES |
|
| NUMINTERIORRINGS | NUMPOINTS | OCT | OCTET_LENGTH | ORD |
|
| OVERLAPS | PERCENT_RANK | PERIOD_ADD | PERIOD_DIFF | PI | POINT |
|
| POINTFROMTEXT | POINTFROMWKB | POINTN | POLYFROMTEXT |
|
| POLYFROMWKB | POLYGON | POLYGONFROMTEXT | POLYGONFROMWKB |
|
| POSITION | POW | POWER | QUARTER | QUOTE | RADIANS | RAND | RANDOM | RANK |
|
| RANDOM_BYTES | RELEASE_LOCK | REVERSE | RIGHT | ROUND |
|
| ROW_COUNT | ROW_NUMBER | RPAD | RTRIM | SCHEMA | SECOND | SEC_TO_TIME |
|
| SESSION_USER | SESSION_VARIABLES_ADMIN |
|
| SHA | SHA1 | SHA2 | SIGN | SIN | SLEEP |
|
| SOUNDEX | SQL_THREAD_WAIT_AFTER_GTIDS | SQRT | SRID |
|
| STARTPOINT | STRCMP | STR_TO_DATE | ST_AREA | ST_ASBINARY |
|
| ST_ASTEXT | ST_ASWKB | ST_ASWKT | ST_BUFFER | ST_CENTROID |
|
| ST_CONTAINS | ST_CROSSES | ST_DIFFERENCE | ST_DIMENSION |
|
| ST_DISJOINT | ST_DISTANCE | ST_ENDPOINT | ST_ENVELOPE |
|
| ST_EQUALS | ST_EXTERIORRING | ST_GEOMCOLLFROMTEXT |
|
| ST_GEOMCOLLFROMTXT | ST_GEOMCOLLFROMWKB |
|
| ST_GEOMETRYCOLLECTIONFROMTEXT |
|
| ST_GEOMETRYCOLLECTIONFROMWKB | ST_GEOMETRYFROMTEXT |
|
| ST_GEOMETRYFROMWKB | ST_GEOMETRYN | ST_GEOMETRYTYPE |
|
| ST_GEOMFROMTEXT | ST_GEOMFROMWKB | ST_INTERIORRINGN |
|
| ST_INTERSECTION | ST_INTERSECTS | ST_ISCLOSED | ST_ISEMPTY |
|
| ST_ISSIMPLE | ST_LINEFROMTEXT | ST_LINEFROMWKB |
|
| ST_LINESTRINGFROMTEXT | ST_LINESTRINGFROMWKB |
|
| ST_NUMGEOMETRIES | ST_NUMINTERIORRING |
|
| ST_NUMINTERIORRINGS | ST_NUMPOINTS | ST_OVERLAPS |
|
| ST_POINTFROMTEXT | ST_POINTFROMWKB | ST_POINTN |
|
| ST_POLYFROMTEXT | ST_POLYFROMWKB | ST_POLYGONFROMTEXT |
|
| ST_POLYGONFROMWKB | ST_SRID | ST_STARTPOINT |
|
| ST_SYMDIFFERENCE | ST_TOUCHES | ST_UNION | ST_WITHIN |
|
| ST_X | ST_Y | SUBDATE | SUBSTRING_INDEX | SUBTIME |
|
| SYSTEM_USER | TAN | TIME | TIMEDIFF | TIMESTAMP |
|
| TIMESTAMPADD | TIMESTAMPDIFF | TIME_FORMAT | TIME_TO_SEC |
|
| TOUCHES | TO_BASE64 | TO_DAYS | TO_SECONDS | UCASE |
|
| UNCOMPRESS | UNCOMPRESSED_LENGTH | UNHEX | UNIX_TIMESTAMP |
|
| UPDATEXML | UPPER | UUID | UUID_SHORT |
|
| VALIDATE_PASSWORD_STRENGTH | VERSION | VISIBLE |
|
| WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS | WEEK | WEEKDAY |
|
| WEEKOFYEAR | WEIGHT_STRING | WITHIN | YEAR | YEARWEEK |
|
| Y_FUNCTION | X_FUNCTION |
|
| JSON_ARRAY | JSON_OBJECT | JSON_QUOTE | JSON_CONTAINS | JSON_CONTAINS_PATH |
|
| JSON_EXTRACT | JSON_KEYS | JSON_OVERLAPS | JSON_SEARCH | JSON_VALUE |
|
| JSON_ARRAY_APPEND | JSON_ARRAY_INSERT | JSON_INSERT | JSON_MERGE |
|
| JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | JSON_REMOVE | JSON_REPLACE |
|
| JSON_SET | JSON_UNQUOTE | JSON_DEPTH | JSON_LENGTH | JSON_TYPE |
|
| JSON_VALID | JSON_TABLE | JSON_SCHEMA_VALID | JSON_SCHEMA_VALIDATION_REPORT |
|
| JSON_PRETTY | JSON_STORAGE_FREE | JSON_STORAGE_SIZE | JSON_ARRAYAGG |
|
| JSON_OBJECTAGG |
|
;
|
|
|