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.

2853 lines
90 KiB

1 year ago
/*
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
;