github.com/unionj-cloud/go-doudou/v2@v2.3.5/toolkit/dbvendor/mysql/parser/grammar/MySqlParser.g4 (about)

     1  // For more information please see https://github.com/antlr/grammars-v4/tree/master/sql/mysql/Positive-Technologies
     2  
     3  parser grammar MySqlParser;
     4  
     5  options { tokenVocab=MySqlLexer; }
     6  
     7  
     8  // Top Level Description
     9  
    10  root
    11      : sqlStatements? MINUSMINUS? EOF
    12      ;
    13  
    14  sqlStatements
    15      : (sqlStatement MINUSMINUS? SEMI? | emptyStatement)*
    16      (sqlStatement (MINUSMINUS? SEMI)? | emptyStatement)
    17      ;
    18  
    19  sqlStatement
    20      : ddlStatement | dmlStatement | transactionStatement
    21      | replicationStatement | preparedStatement
    22      | administrationStatement | utilityStatement
    23      ;
    24  
    25  emptyStatement
    26      : SEMI
    27      ;
    28  
    29  ddlStatement
    30      : createDatabase | createEvent | createIndex
    31      | createLogfileGroup | createProcedure | createFunction
    32      | createServer | createTable | createTablespaceInnodb
    33      | createTablespaceNdb | createTrigger | createView
    34      | alterDatabase | alterEvent | alterFunction
    35      | alterInstance | alterLogfileGroup | alterProcedure
    36      | alterServer | alterTable | alterTablespace | alterView
    37      | dropDatabase | dropEvent | dropIndex
    38      | dropLogfileGroup | dropProcedure | dropFunction
    39      | dropServer | dropTable | dropTablespace
    40      | dropTrigger | dropView
    41      | renameTable | truncateTable
    42      ;
    43  
    44  dmlStatement
    45      : selectStatement | insertStatement | updateStatement
    46      | deleteStatement | replaceStatement | callStatement
    47      | loadDataStatement | loadXmlStatement | doStatement
    48      | handlerStatement
    49      ;
    50  
    51  transactionStatement
    52      : startTransaction
    53      | beginWork | commitWork | rollbackWork
    54      | savepointStatement | rollbackStatement
    55      | releaseStatement | lockTables | unlockTables
    56      ;
    57  
    58  replicationStatement
    59      : changeMaster | changeReplicationFilter | purgeBinaryLogs
    60      | resetMaster | resetSlave | startSlave | stopSlave
    61      | startGroupReplication | stopGroupReplication
    62      | xaStartTransaction | xaEndTransaction | xaPrepareStatement
    63      | xaCommitWork | xaRollbackWork | xaRecoverWork
    64      ;
    65  
    66  preparedStatement
    67      : prepareStatement | executeStatement | deallocatePrepare
    68      ;
    69  
    70  // remark: NOT INCLUDED IN sqlStatement, but include in body
    71  //  of routine's statements
    72  compoundStatement
    73      : blockStatement
    74      | caseStatement | ifStatement | leaveStatement
    75      | loopStatement | repeatStatement | whileStatement
    76      | iterateStatement | returnStatement | cursorStatement
    77      ;
    78  
    79  administrationStatement
    80      : alterUser | createUser | dropUser | grantStatement
    81      | grantProxy | renameUser | revokeStatement
    82      | revokeProxy | analyzeTable | checkTable
    83      | checksumTable | optimizeTable | repairTable
    84      | createUdfunction | installPlugin | uninstallPlugin
    85      | setStatement | showStatement | binlogStatement
    86      | cacheIndexStatement | flushStatement | killStatement
    87      | loadIndexIntoCache | resetStatement
    88      | shutdownStatement
    89      ;
    90  
    91  utilityStatement
    92      : simpleDescribeStatement | fullDescribeStatement
    93      | helpStatement | useStatement | signalStatement
    94      | resignalStatement | diagnosticsStatement
    95      ;
    96  
    97  
    98  // Data Definition Language
    99  
   100  //    Create statements
   101  
   102  createDatabase
   103      : CREATE dbFormat=(DATABASE | SCHEMA)
   104        ifNotExists? uid createDatabaseOption*
   105      ;
   106  
   107  createEvent
   108      : CREATE ownerStatement? EVENT ifNotExists? fullId
   109        ON SCHEDULE scheduleExpression
   110        (ON COMPLETION NOT? PRESERVE)? enableType?
   111        (COMMENT STRING_LITERAL)?
   112        DO routineBody
   113      ;
   114  
   115  createIndex
   116      : CREATE
   117        intimeAction=(ONLINE | OFFLINE)?
   118        indexCategory=(UNIQUE | FULLTEXT | SPATIAL)?
   119        INDEX uid indexType?
   120        ON tableName indexColumnNames
   121        indexOption*
   122        (
   123          ALGORITHM '='? algType=(DEFAULT | INPLACE | COPY)
   124          | LOCK '='?
   125            lockType=(DEFAULT | NONE | SHARED | EXCLUSIVE)
   126        )*
   127      ;
   128  
   129  createLogfileGroup
   130      : CREATE LOGFILE GROUP uid
   131        ADD UNDOFILE undoFile=STRING_LITERAL
   132        (INITIAL_SIZE '='? initSize=fileSizeLiteral)?
   133        (UNDO_BUFFER_SIZE '='? undoSize=fileSizeLiteral)?
   134        (REDO_BUFFER_SIZE '='? redoSize=fileSizeLiteral)?
   135        (NODEGROUP '='? uid)?
   136        WAIT?
   137        (COMMENT '='? comment=STRING_LITERAL)?
   138        ENGINE '='? engineName
   139      ;
   140  
   141  createProcedure
   142      : CREATE ownerStatement?
   143      PROCEDURE fullId
   144        '(' procedureParameter? (',' procedureParameter)* ')'
   145        routineOption*
   146      routineBody
   147      ;
   148  
   149  createFunction
   150      : CREATE ownerStatement?
   151      FUNCTION fullId
   152        '(' functionParameter? (',' functionParameter)* ')'
   153        RETURNS dataType
   154        routineOption*
   155      (routineBody | returnStatement)
   156      ;
   157  
   158  createServer
   159      : CREATE SERVER uid
   160      FOREIGN DATA WRAPPER wrapperName=(MYSQL | STRING_LITERAL)
   161      OPTIONS '(' serverOption (',' serverOption)* ')'
   162      ;
   163  
   164  createTable
   165      : CREATE TEMPORARY? TABLE ifNotExists?
   166         tableName
   167         (
   168           LIKE tableName
   169           | '(' LIKE parenthesisTable=tableName ')'
   170         )                                                            #copyCreateTable
   171      | CREATE TEMPORARY? TABLE ifNotExists?
   172         tableName createDefinitions?
   173         ( tableOption (','? tableOption)* )?
   174         partitionDefinitions? keyViolate=(IGNORE | REPLACE)?
   175         AS? selectStatement                                          #queryCreateTable
   176      | CREATE TEMPORARY? TABLE ifNotExists?
   177         tableName createDefinitions
   178         ( tableOption (','? tableOption)* )?
   179         partitionDefinitions?                                        #columnCreateTable
   180      ;
   181  
   182  createTablespaceInnodb
   183      : CREATE TABLESPACE uid
   184        ADD DATAFILE datafile=STRING_LITERAL
   185        (FILE_BLOCK_SIZE '=' fileBlockSize=fileSizeLiteral)?
   186        (ENGINE '='? engineName)?
   187      ;
   188  
   189  createTablespaceNdb
   190      : CREATE TABLESPACE uid
   191        ADD DATAFILE datafile=STRING_LITERAL
   192        USE LOGFILE GROUP uid
   193        (EXTENT_SIZE '='? extentSize=fileSizeLiteral)?
   194        (INITIAL_SIZE '='? initialSize=fileSizeLiteral)?
   195        (AUTOEXTEND_SIZE '='? autoextendSize=fileSizeLiteral)?
   196        (MAX_SIZE '='? maxSize=fileSizeLiteral)?
   197        (NODEGROUP '='? uid)?
   198        WAIT?
   199        (COMMENT '='? comment=STRING_LITERAL)?
   200        ENGINE '='? engineName
   201      ;
   202  
   203  createTrigger
   204      : CREATE ownerStatement?
   205        TRIGGER thisTrigger=fullId
   206        triggerTime=(BEFORE | AFTER)
   207        triggerEvent=(INSERT | UPDATE | DELETE)
   208        ON tableName FOR EACH ROW
   209        (triggerPlace=(FOLLOWS | PRECEDES) otherTrigger=fullId)?
   210        routineBody
   211      ;
   212  
   213  createView
   214      : CREATE (OR REPLACE)?
   215        (
   216          ALGORITHM '=' algType=(UNDEFINED | MERGE | TEMPTABLE)
   217        )?
   218        ownerStatement?
   219        (SQL SECURITY secContext=(DEFINER | INVOKER))?
   220        VIEW fullId ('(' uidList ')')? AS selectStatement
   221        (WITH checkOption=(CASCADED | LOCAL)? CHECK OPTION)?
   222      ;
   223  
   224  // details
   225  
   226  createDatabaseOption
   227      : defaultToken=DEFAULT? (CHARACTER SET | CHARSET) '='? (charsetName | charsetDefault=DEFAULT)
   228      | defaultToken=DEFAULT? COLLATE '='? collationName
   229      ;
   230  
   231  ownerStatement
   232      : DEFINER '=' (userName | CURRENT_USER ( '(' ')')?)
   233      ;
   234  
   235  scheduleExpression
   236      : AT timestampValue intervalExpr*                               #preciseSchedule
   237      | EVERY (decimalLiteral | expression) intervalType
   238          (
   239            STARTS startTimestamp=timestampValue
   240            (startIntervals+=intervalExpr)*
   241          )?
   242          (
   243            ENDS endTimestamp=timestampValue
   244            (endIntervals+=intervalExpr)*
   245          )?                                                          #intervalSchedule
   246      ;
   247  
   248  timestampValue
   249      : CURRENT_TIMESTAMP
   250      | stringLiteral
   251      | decimalLiteral
   252      | expression
   253      ;
   254  
   255  intervalExpr
   256      : '+' INTERVAL (decimalLiteral | expression) intervalType
   257      ;
   258  
   259  intervalType
   260      : intervalTypeBase
   261      | YEAR | YEAR_MONTH | DAY_HOUR | DAY_MINUTE
   262      | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND
   263      | SECOND_MICROSECOND | MINUTE_MICROSECOND
   264      | HOUR_MICROSECOND | DAY_MICROSECOND
   265      ;
   266  
   267  enableType
   268      : ENABLE | DISABLE | DISABLE ON SLAVE
   269      ;
   270  
   271  indexType
   272      : USING (BTREE | HASH)
   273      ;
   274  
   275  indexOption
   276      : KEY_BLOCK_SIZE '='? fileSizeLiteral
   277      | indexType
   278      | WITH PARSER uid
   279      | COMMENT STRING_LITERAL
   280      | INVISIBLE
   281      | VISIBLE
   282      ;
   283  
   284  procedureParameter
   285      : direction=(IN | OUT | INOUT)? uid dataType
   286      ;
   287  
   288  functionParameter
   289      : uid dataType
   290      ;
   291  
   292  routineOption
   293      : COMMENT STRING_LITERAL                                        #routineComment
   294      | LANGUAGE SQL                                                  #routineLanguage
   295      | NOT? DETERMINISTIC                                            #routineBehavior
   296      | (
   297          CONTAINS SQL | NO SQL | READS SQL DATA
   298          | MODIFIES SQL DATA
   299        )                                                             #routineData
   300      | SQL SECURITY context=(DEFINER | INVOKER)                      #routineSecurity
   301      ;
   302  
   303  serverOption
   304      : HOST STRING_LITERAL
   305      | DATABASE STRING_LITERAL
   306      | USER STRING_LITERAL
   307      | PASSWORD STRING_LITERAL
   308      | SOCKET STRING_LITERAL
   309      | OWNER STRING_LITERAL
   310      | PORT decimalLiteral
   311      ;
   312  
   313  createDefinitions
   314      : '(' createDefinition (',' createDefinition)* ')'
   315      ;
   316  
   317  createDefinition
   318      : uid columnDefinition                                          #columnDeclaration
   319      | tableConstraint                                               #constraintDeclaration
   320      | indexColumnDefinition                                         #indexDeclaration
   321      ;
   322  
   323  columnDefinition
   324      : dataType columnConstraint*
   325      ;
   326  
   327  columnConstraint
   328      : nullNotnull                                                   #nullColumnConstraint
   329      | DEFAULT defaultValue                                          #defaultColumnConstraint
   330      | (AUTO_INCREMENT | ON UPDATE currentTimestamp)                 #autoIncrementColumnConstraint
   331      | PRIMARY? KEY                                                  #primaryKeyColumnConstraint
   332      | UNIQUE KEY?                                                   #uniqueKeyColumnConstraint
   333      | COMMENT STRING_LITERAL                                        #commentColumnConstraint
   334      | COLUMN_FORMAT colformat=(FIXED | DYNAMIC | DEFAULT)           #formatColumnConstraint
   335      | STORAGE storageval=(DISK | MEMORY | DEFAULT)                  #storageColumnConstraint
   336      | referenceDefinition                                           #referenceColumnConstraint
   337      | COLLATE collationName                                         #collateColumnConstraint
   338      | (GENERATED ALWAYS)? AS '(' expression ')' (VIRTUAL | STORED)? #generatedColumnConstraint
   339      | SERIAL DEFAULT VALUE                                          #serialDefaultColumnConstraint
   340      | (CONSTRAINT name=uid?)?
   341        CHECK '(' expression ')'                                      #checkColumnConstraint
   342      ;
   343  
   344  tableConstraint
   345      : (CONSTRAINT name=uid?)?
   346        PRIMARY KEY index=uid? indexType?
   347        indexColumnNames indexOption*                                 #primaryKeyTableConstraint
   348      | (CONSTRAINT name=uid?)?
   349        UNIQUE indexFormat=(INDEX | KEY)? index=uid?
   350        indexType? indexColumnNames indexOption*                      #uniqueKeyTableConstraint
   351      | (CONSTRAINT name=uid?)?
   352        FOREIGN KEY index=uid? indexColumnNames
   353        referenceDefinition                                           #foreignKeyTableConstraint
   354      | (CONSTRAINT name=uid?)?
   355        CHECK '(' expression ')'                                      #checkTableConstraint
   356      ;
   357  
   358  referenceDefinition
   359      : REFERENCES tableName indexColumnNames?
   360        (MATCH matchType=(FULL | PARTIAL | SIMPLE))?
   361        referenceAction?
   362      ;
   363  
   364  referenceAction
   365      : ON DELETE onDelete=referenceControlType
   366        (
   367          ON UPDATE onUpdate=referenceControlType
   368        )?
   369      | ON UPDATE onUpdate=referenceControlType
   370        (
   371          ON DELETE onDelete=referenceControlType
   372        )?
   373      ;
   374  
   375  referenceControlType
   376      : RESTRICT | CASCADE | SET NULL_LITERAL | NO ACTION
   377      ;
   378  
   379  indexColumnDefinition
   380      : indexFormat=(INDEX | KEY) uid? indexType?
   381        indexColumnNames indexOption*                                 #simpleIndexDeclaration
   382      | (FULLTEXT | SPATIAL)
   383        indexFormat=(INDEX | KEY)? uid?
   384        indexColumnNames indexOption*                                 #specialIndexDeclaration
   385      ;
   386  
   387  tableOption
   388      : ENGINE '='? engineName                                        #tableOptionEngine
   389      | AUTO_INCREMENT '='? decimalLiteral                            #tableOptionAutoIncrement
   390      | AVG_ROW_LENGTH '='? decimalLiteral                            #tableOptionAverage
   391      | DEFAULT? (CHARACTER SET | CHARSET) '='? (charsetName|DEFAULT) #tableOptionCharset
   392      | (CHECKSUM | PAGE_CHECKSUM) '='? boolValue=('0' | '1')         #tableOptionChecksum
   393      | DEFAULT? COLLATE '='? collationName                           #tableOptionCollate
   394      | COMMENT '='? STRING_LITERAL                                   #tableOptionComment
   395      | COMPRESSION '='? (STRING_LITERAL | ID)                        #tableOptionCompression
   396      | CONNECTION '='? STRING_LITERAL                                #tableOptionConnection
   397      | DATA DIRECTORY '='? STRING_LITERAL                            #tableOptionDataDirectory
   398      | DELAY_KEY_WRITE '='? boolValue=('0' | '1')                    #tableOptionDelay
   399      | ENCRYPTION '='? STRING_LITERAL                                #tableOptionEncryption
   400      | INDEX DIRECTORY '='? STRING_LITERAL                           #tableOptionIndexDirectory
   401      | INSERT_METHOD '='? insertMethod=(NO | FIRST | LAST)           #tableOptionInsertMethod
   402      | KEY_BLOCK_SIZE '='? fileSizeLiteral                           #tableOptionKeyBlockSize
   403      | MAX_ROWS '='? decimalLiteral                                  #tableOptionMaxRows
   404      | MIN_ROWS '='? decimalLiteral                                  #tableOptionMinRows
   405      | PACK_KEYS '='? extBoolValue=('0' | '1' | DEFAULT)             #tableOptionPackKeys
   406      | PASSWORD '='? STRING_LITERAL                                  #tableOptionPassword
   407      | ROW_FORMAT '='?
   408          rowFormat=(
   409            DEFAULT | DYNAMIC | FIXED | COMPRESSED
   410            | REDUNDANT | COMPACT | ID
   411          )                                                           #tableOptionRowFormat
   412      | STATS_AUTO_RECALC '='? extBoolValue=(DEFAULT | '0' | '1')     #tableOptionRecalculation
   413      | STATS_PERSISTENT '='? extBoolValue=(DEFAULT | '0' | '1')      #tableOptionPersistent
   414      | STATS_SAMPLE_PAGES '='? decimalLiteral                        #tableOptionSamplePage
   415      | TABLESPACE uid tablespaceStorage?                             #tableOptionTablespace
   416      | tablespaceStorage                                             #tableOptionTablespace
   417      | UNION '='? '(' tables ')'                                     #tableOptionUnion
   418      ;
   419  
   420  tablespaceStorage
   421      : STORAGE (DISK | MEMORY | DEFAULT)
   422      ;
   423  
   424  partitionDefinitions
   425      : PARTITION BY partitionFunctionDefinition
   426        (PARTITIONS count=decimalLiteral)?
   427        (
   428          SUBPARTITION BY subpartitionFunctionDefinition
   429          (SUBPARTITIONS subCount=decimalLiteral)?
   430        )?
   431      ('(' partitionDefinition (',' partitionDefinition)* ')')?
   432      ;
   433  
   434  partitionFunctionDefinition
   435      : LINEAR? HASH '(' expression ')'                               #partitionFunctionHash
   436      | LINEAR? KEY (ALGORITHM '=' algType=('1' | '2'))?
   437        '(' uidList ')'                                               #partitionFunctionKey
   438      | RANGE ( '(' expression ')' | COLUMNS '(' uidList ')' )        #partitionFunctionRange
   439      | LIST ( '(' expression ')' | COLUMNS '(' uidList ')' )         #partitionFunctionList
   440      ;
   441  
   442  subpartitionFunctionDefinition
   443      : LINEAR? HASH '(' expression ')'                               #subPartitionFunctionHash
   444      | LINEAR? KEY (ALGORITHM '=' algType=('1' | '2'))?
   445        '(' uidList ')'                                               #subPartitionFunctionKey
   446      ;
   447  
   448  partitionDefinition
   449      : PARTITION uid VALUES LESS THAN
   450        '('
   451            partitionDefinerAtom (',' partitionDefinerAtom)*
   452        ')'
   453        partitionOption*
   454        ( '(' subpartitionDefinition (',' subpartitionDefinition)* ')' )?       #partitionComparison
   455      | PARTITION uid VALUES LESS THAN
   456        partitionDefinerAtom partitionOption*
   457        ( '(' subpartitionDefinition (',' subpartitionDefinition)* ')' )?       #partitionComparison
   458      | PARTITION uid VALUES IN
   459        '('
   460            partitionDefinerAtom (',' partitionDefinerAtom)*
   461        ')'
   462        partitionOption*
   463        ( '(' subpartitionDefinition (',' subpartitionDefinition)* ')' )?       #partitionListAtom
   464      | PARTITION uid VALUES IN
   465        '('
   466            partitionDefinerVector (',' partitionDefinerVector)*
   467        ')'
   468        partitionOption*
   469        ( '(' subpartitionDefinition (',' subpartitionDefinition)* ')' )?       #partitionListVector
   470      | PARTITION uid partitionOption*
   471        ( '(' subpartitionDefinition (',' subpartitionDefinition)* ')' )?       #partitionSimple
   472      ;
   473  
   474  partitionDefinerAtom
   475      : constant | expression | MAXVALUE
   476      ;
   477  
   478  partitionDefinerVector
   479      : '(' partitionDefinerAtom (',' partitionDefinerAtom)+ ')'
   480      ;
   481  
   482  subpartitionDefinition
   483      : SUBPARTITION uid partitionOption*
   484      ;
   485  
   486  partitionOption
   487      : STORAGE? ENGINE '='? engineName                               #partitionOptionEngine
   488      | COMMENT '='? comment=STRING_LITERAL                           #partitionOptionComment
   489      | DATA DIRECTORY '='? dataDirectory=STRING_LITERAL              #partitionOptionDataDirectory
   490      | INDEX DIRECTORY '='? indexDirectory=STRING_LITERAL            #partitionOptionIndexDirectory
   491      | MAX_ROWS '='? maxRows=decimalLiteral                          #partitionOptionMaxRows
   492      | MIN_ROWS '='? minRows=decimalLiteral                          #partitionOptionMinRows
   493      | TABLESPACE '='? tablespace=uid                                #partitionOptionTablespace
   494      | NODEGROUP '='? nodegroup=uid                                  #partitionOptionNodeGroup
   495      ;
   496  
   497  //    Alter statements
   498  
   499  alterDatabase
   500      : ALTER dbFormat=(DATABASE | SCHEMA) uid?
   501        createDatabaseOption+                                         #alterSimpleDatabase
   502      | ALTER dbFormat=(DATABASE | SCHEMA) uid
   503        UPGRADE DATA DIRECTORY NAME                                   #alterUpgradeName
   504      ;
   505  
   506  alterEvent
   507      : ALTER ownerStatement?
   508        EVENT fullId
   509        (ON SCHEDULE scheduleExpression)?
   510        (ON COMPLETION NOT? PRESERVE)?
   511        (RENAME TO fullId)? enableType?
   512        (COMMENT STRING_LITERAL)?
   513        (DO routineBody)?
   514      ;
   515  
   516  alterFunction
   517      : ALTER FUNCTION fullId routineOption*
   518      ;
   519  
   520  alterInstance
   521      : ALTER INSTANCE ROTATE INNODB MASTER KEY
   522      ;
   523  
   524  alterLogfileGroup
   525      : ALTER LOGFILE GROUP uid
   526        ADD UNDOFILE STRING_LITERAL
   527        (INITIAL_SIZE '='? fileSizeLiteral)?
   528        WAIT? ENGINE '='? engineName
   529      ;
   530  
   531  alterProcedure
   532      : ALTER PROCEDURE fullId routineOption*
   533      ;
   534  
   535  alterServer
   536      : ALTER SERVER uid OPTIONS
   537        '(' serverOption (',' serverOption)* ')'
   538      ;
   539  
   540  alterTable
   541      : ALTER intimeAction=(ONLINE | OFFLINE)?
   542        IGNORE? TABLE tableName
   543        (alterSpecification (',' alterSpecification)*)?
   544        partitionDefinitions?
   545      ;
   546  
   547  alterTablespace
   548      : ALTER TABLESPACE uid
   549        objectAction=(ADD | DROP) DATAFILE STRING_LITERAL
   550        (INITIAL_SIZE '=' fileSizeLiteral)?
   551        WAIT?
   552        ENGINE '='? engineName
   553      ;
   554  
   555  alterView
   556      : ALTER
   557        (
   558          ALGORITHM '=' algType=(UNDEFINED | MERGE | TEMPTABLE)
   559        )?
   560        ownerStatement?
   561        (SQL SECURITY secContext=(DEFINER | INVOKER))?
   562        VIEW fullId ('(' uidList ')')? AS selectStatement
   563        (WITH checkOpt=(CASCADED | LOCAL)? CHECK OPTION)?
   564      ;
   565  
   566  // details
   567  
   568  alterSpecification
   569      : tableOption (','? tableOption)*                               #alterByTableOption
   570      | ADD COLUMN? uid columnDefinition (FIRST | AFTER uid)?         #alterByAddColumn
   571      | ADD COLUMN?
   572          '('
   573            uid columnDefinition ( ',' uid columnDefinition)*
   574          ')'                                                         #alterByAddColumns
   575      | ADD indexFormat=(INDEX | KEY) uid? indexType?
   576        indexColumnNames indexOption*                                 #alterByAddIndex
   577      | ADD (CONSTRAINT name=uid?)? PRIMARY KEY index=uid?
   578        indexType? indexColumnNames indexOption*                      #alterByAddPrimaryKey
   579      | ADD (CONSTRAINT name=uid?)? UNIQUE
   580        indexFormat=(INDEX | KEY)? indexName=uid?
   581        indexType? indexColumnNames indexOption*                      #alterByAddUniqueKey
   582      | ADD keyType=(FULLTEXT | SPATIAL)
   583        indexFormat=(INDEX | KEY)? uid?
   584        indexColumnNames indexOption*                                 #alterByAddSpecialIndex
   585      | ADD (CONSTRAINT name=uid?)? FOREIGN KEY
   586        indexName=uid? indexColumnNames referenceDefinition           #alterByAddForeignKey
   587      | ADD (CONSTRAINT name=uid?)? CHECK '(' expression ')'          #alterByAddCheckTableConstraint
   588      | ALGORITHM '='? algType=(DEFAULT | INPLACE | COPY)             #alterBySetAlgorithm
   589      | ALTER COLUMN? uid
   590        (SET DEFAULT defaultValue | DROP DEFAULT)                     #alterByChangeDefault
   591      | CHANGE COLUMN? oldColumn=uid
   592        newColumn=uid columnDefinition
   593        (FIRST | AFTER afterColumn=uid)?                              #alterByChangeColumn
   594      | RENAME COLUMN oldColumn=uid TO newColumn=uid                  #alterByRenameColumn
   595      | LOCK '='? lockType=(DEFAULT | NONE | SHARED | EXCLUSIVE)      #alterByLock
   596      | MODIFY COLUMN?
   597        uid columnDefinition (FIRST | AFTER uid)?                     #alterByModifyColumn
   598      | DROP COLUMN? uid RESTRICT?                                    #alterByDropColumn
   599      | DROP (CONSTRAINT | CHECK) uid                                 #alterByDropConstraintCheck
   600      | DROP PRIMARY KEY                                              #alterByDropPrimaryKey
   601      | RENAME indexFormat=(INDEX | KEY) uid TO uid                   #alterByRenameIndex
   602      | ALTER INDEX uid (VISIBLE | INVISIBLE)                         #alterByAlterIndexVisibility
   603      | DROP indexFormat=(INDEX | KEY) uid                            #alterByDropIndex
   604      | DROP FOREIGN KEY uid                                          #alterByDropForeignKey
   605      | DISABLE KEYS                                                  #alterByDisableKeys
   606      | ENABLE KEYS                                                   #alterByEnableKeys
   607      | RENAME renameFormat=(TO | AS)? (uid | fullId)                 #alterByRename
   608      | ORDER BY uidList                                              #alterByOrder
   609      | CONVERT TO CHARACTER SET charsetName
   610        (COLLATE collationName)?                                      #alterByConvertCharset
   611      | DEFAULT? CHARACTER SET '=' charsetName
   612        (COLLATE '=' collationName)?                                  #alterByDefaultCharset
   613      | DISCARD TABLESPACE                                            #alterByDiscardTablespace
   614      | IMPORT TABLESPACE                                             #alterByImportTablespace
   615      | FORCE                                                         #alterByForce
   616      | validationFormat=(WITHOUT | WITH) VALIDATION                  #alterByValidate
   617      | ADD PARTITION
   618          '('
   619            partitionDefinition (',' partitionDefinition)*
   620          ')'                                                         #alterByAddPartition
   621      | DROP PARTITION uidList                                        #alterByDropPartition
   622      | DISCARD PARTITION (uidList | ALL) TABLESPACE                  #alterByDiscardPartition
   623      | IMPORT PARTITION (uidList | ALL) TABLESPACE                   #alterByImportPartition
   624      | TRUNCATE PARTITION (uidList | ALL)                            #alterByTruncatePartition
   625      | COALESCE PARTITION decimalLiteral                             #alterByCoalescePartition
   626      | REORGANIZE PARTITION uidList
   627          INTO '('
   628            partitionDefinition (',' partitionDefinition)*
   629          ')'                                                         #alterByReorganizePartition
   630      | EXCHANGE PARTITION uid WITH TABLE tableName
   631        (validationFormat=(WITH | WITHOUT) VALIDATION)?               #alterByExchangePartition
   632      | ANALYZE PARTITION (uidList | ALL)                             #alterByAnalyzePartition
   633      | CHECK PARTITION (uidList | ALL)                               #alterByCheckPartition
   634      | OPTIMIZE PARTITION (uidList | ALL)                            #alterByOptimizePartition
   635      | REBUILD PARTITION (uidList | ALL)                             #alterByRebuildPartition
   636      | REPAIR PARTITION (uidList | ALL)                              #alterByRepairPartition
   637      | REMOVE PARTITIONING                                           #alterByRemovePartitioning
   638      | UPGRADE PARTITIONING                                          #alterByUpgradePartitioning
   639      ;
   640  
   641  
   642  //    Drop statements
   643  
   644  dropDatabase
   645      : DROP dbFormat=(DATABASE | SCHEMA) ifExists? uid
   646      ;
   647  
   648  dropEvent
   649      : DROP EVENT ifExists? fullId
   650      ;
   651  
   652  dropIndex
   653      : DROP INDEX intimeAction=(ONLINE | OFFLINE)?
   654        uid ON tableName
   655        (
   656          ALGORITHM '='? algType=(DEFAULT | INPLACE | COPY)
   657          | LOCK '='?
   658            lockType=(DEFAULT | NONE | SHARED | EXCLUSIVE)
   659        )*
   660      ;
   661  
   662  dropLogfileGroup
   663      : DROP LOGFILE GROUP uid ENGINE '=' engineName
   664      ;
   665  
   666  dropProcedure
   667      : DROP PROCEDURE ifExists? fullId
   668      ;
   669  
   670  dropFunction
   671      : DROP FUNCTION ifExists? fullId
   672      ;
   673  
   674  dropServer
   675      : DROP SERVER ifExists? uid
   676      ;
   677  
   678  dropTable
   679      : DROP TEMPORARY? TABLE ifExists?
   680        tables dropType=(RESTRICT | CASCADE)?
   681      ;
   682  
   683  dropTablespace
   684      : DROP TABLESPACE uid (ENGINE '='? engineName)?
   685      ;
   686  
   687  dropTrigger
   688      : DROP TRIGGER ifExists? fullId
   689      ;
   690  
   691  dropView
   692      : DROP VIEW ifExists?
   693        fullId (',' fullId)* dropType=(RESTRICT | CASCADE)?
   694      ;
   695  
   696  
   697  //    Other DDL statements
   698  
   699  renameTable
   700      : RENAME TABLE
   701      renameTableClause (',' renameTableClause)*
   702      ;
   703  
   704  renameTableClause
   705      : tableName TO tableName
   706      ;
   707  
   708  truncateTable
   709      : TRUNCATE TABLE? tableName
   710      ;
   711  
   712  
   713  // Data Manipulation Language
   714  
   715  //    Primary DML Statements
   716  
   717  
   718  callStatement
   719      : CALL fullId
   720        (
   721          '(' (constants | expressions)? ')'
   722        )?
   723      ;
   724  
   725  deleteStatement
   726      : singleDeleteStatement | multipleDeleteStatement
   727      ;
   728  
   729  doStatement
   730      : DO expressions
   731      ;
   732  
   733  handlerStatement
   734      : handlerOpenStatement
   735      | handlerReadIndexStatement
   736      | handlerReadStatement
   737      | handlerCloseStatement
   738      ;
   739  
   740  insertStatement
   741      : INSERT
   742        priority=(LOW_PRIORITY | DELAYED | HIGH_PRIORITY)?
   743        IGNORE? INTO? tableName
   744        (PARTITION '(' partitions=uidList? ')' )?
   745        (
   746          ('(' columns=uidList ')')? insertStatementValue
   747          | SET
   748              setFirst=updatedElement
   749              (',' setElements+=updatedElement)*
   750        )
   751        (
   752          ON DUPLICATE KEY UPDATE
   753          duplicatedFirst=updatedElement
   754          (',' duplicatedElements+=updatedElement)*
   755        )?
   756      ;
   757  
   758  loadDataStatement
   759      : LOAD DATA
   760        priority=(LOW_PRIORITY | CONCURRENT)?
   761        LOCAL? INFILE filename=STRING_LITERAL
   762        violation=(REPLACE | IGNORE)?
   763        INTO TABLE tableName
   764        (PARTITION '(' uidList ')' )?
   765        (CHARACTER SET charset=charsetName)?
   766        (
   767          fieldsFormat=(FIELDS | COLUMNS)
   768          selectFieldsInto+
   769        )?
   770        (
   771          LINES
   772            selectLinesInto+
   773        )?
   774        (
   775          IGNORE decimalLiteral linesFormat=(LINES | ROWS)
   776        )?
   777        ( '(' assignmentField (',' assignmentField)* ')' )?
   778        (SET updatedElement (',' updatedElement)*)?
   779      ;
   780  
   781  loadXmlStatement
   782      : LOAD XML
   783        priority=(LOW_PRIORITY | CONCURRENT)?
   784        LOCAL? INFILE filename=STRING_LITERAL
   785        violation=(REPLACE | IGNORE)?
   786        INTO TABLE tableName
   787        (CHARACTER SET charset=charsetName)?
   788        (ROWS IDENTIFIED BY '<' tag=STRING_LITERAL '>')?
   789        ( IGNORE decimalLiteral linesFormat=(LINES | ROWS) )?
   790        ( '(' assignmentField (',' assignmentField)* ')' )?
   791        (SET updatedElement (',' updatedElement)*)?
   792      ;
   793  
   794  replaceStatement
   795      : REPLACE priority=(LOW_PRIORITY | DELAYED)?
   796        INTO? tableName
   797        (PARTITION '(' partitions=uidList ')' )?
   798        (
   799          ('(' columns=uidList ')')? insertStatementValue
   800          | SET
   801            setFirst=updatedElement
   802            (',' setElements+=updatedElement)*
   803        )
   804      ;
   805  
   806  selectStatement
   807      : querySpecification lockClause?                                #simpleSelect
   808      | queryExpression lockClause?                                   #parenthesisSelect
   809      | querySpecificationNointo unionStatement+
   810          (
   811            UNION unionType=(ALL | DISTINCT)?
   812            (querySpecification | queryExpression)
   813          )?
   814          orderByClause? limitClause? lockClause?                     #unionSelect
   815      | queryExpressionNointo unionParenthesis+
   816          (
   817            UNION unionType=(ALL | DISTINCT)?
   818            queryExpression
   819          )?
   820          orderByClause? limitClause? lockClause?                     #unionParenthesisSelect
   821      ;
   822  
   823  updateStatement
   824      : singleUpdateStatement | multipleUpdateStatement
   825      ;
   826  
   827  // details
   828  
   829  insertStatementValue
   830      : selectStatement
   831      | insertFormat=(VALUES | VALUE)
   832        '(' expressionsWithDefaults? ')'
   833          (',' '(' expressionsWithDefaults? ')')*
   834      ;
   835  
   836  updatedElement
   837      : fullColumnName '=' (expression | DEFAULT)
   838      ;
   839  
   840  assignmentField
   841      : uid | LOCAL_ID
   842      ;
   843  
   844  lockClause
   845      : FOR UPDATE | LOCK IN SHARE MODE
   846      ;
   847  
   848  //    Detailed DML Statements
   849  
   850  singleDeleteStatement
   851      : DELETE priority=LOW_PRIORITY? QUICK? IGNORE?
   852      FROM tableName
   853        (PARTITION '(' uidList ')' )?
   854        (WHERE expression)?
   855        orderByClause? (LIMIT limitClauseAtom)?
   856      ;
   857  
   858  multipleDeleteStatement
   859      : DELETE priority=LOW_PRIORITY? QUICK? IGNORE?
   860        (
   861          tableName ('.' '*')? ( ',' tableName ('.' '*')? )*
   862              FROM tableSources
   863          | FROM
   864              tableName ('.' '*')? ( ',' tableName ('.' '*')? )*
   865              USING tableSources
   866        )
   867        (WHERE expression)?
   868      ;
   869  
   870  handlerOpenStatement
   871      : HANDLER tableName OPEN (AS? uid)?
   872      ;
   873  
   874  handlerReadIndexStatement
   875      : HANDLER tableName READ index=uid
   876        (
   877          comparisonOperator '(' constants ')'
   878          | moveOrder=(FIRST | NEXT | PREV | LAST)
   879        )
   880        (WHERE expression)? (LIMIT limitClauseAtom)?
   881      ;
   882  
   883  handlerReadStatement
   884      : HANDLER tableName READ moveOrder=(FIRST | NEXT)
   885        (WHERE expression)? (LIMIT limitClauseAtom)?
   886      ;
   887  
   888  handlerCloseStatement
   889      : HANDLER tableName CLOSE
   890      ;
   891  
   892  singleUpdateStatement
   893      : UPDATE priority=LOW_PRIORITY? IGNORE? tableName (AS? uid)?
   894        SET updatedElement (',' updatedElement)*
   895        (WHERE expression)? orderByClause? limitClause?
   896      ;
   897  
   898  multipleUpdateStatement
   899      : UPDATE priority=LOW_PRIORITY? IGNORE? tableSources
   900        SET updatedElement (',' updatedElement)*
   901        (WHERE expression)?
   902      ;
   903  
   904  // details
   905  
   906  orderByClause
   907      : ORDER BY orderByExpression (',' orderByExpression)*
   908      ;
   909  
   910  orderByExpression
   911      : expression order=(ASC | DESC)?
   912      ;
   913  
   914  tableSources
   915      : tableSource (',' tableSource)*
   916      ;
   917  
   918  tableSource
   919      : tableSourceItem joinPart*                                     #tableSourceBase
   920      | '(' tableSourceItem joinPart* ')'                             #tableSourceNested
   921      ;
   922  
   923  tableSourceItem
   924      : tableName
   925        (PARTITION '(' uidList ')' )? (AS? alias=uid)?
   926        (indexHint (',' indexHint)* )?                                #atomTableItem
   927      | (
   928        selectStatement
   929        | '(' parenthesisSubquery=selectStatement ')'
   930        )
   931        AS? alias=uid                                                 #subqueryTableItem
   932      | '(' tableSources ')'                                          #tableSourcesItem
   933      ;
   934  
   935  indexHint
   936      : indexHintAction=(USE | IGNORE | FORCE)
   937        keyFormat=(INDEX|KEY) ( FOR indexHintType)?
   938        '(' uidList ')'
   939      ;
   940  
   941  indexHintType
   942      : JOIN | ORDER BY | GROUP BY
   943      ;
   944  
   945  joinPart
   946      : (INNER | CROSS)? JOIN tableSourceItem
   947        (
   948          ON expression
   949          | USING '(' uidList ')'
   950        )?                                                            #innerJoin
   951      | STRAIGHT_JOIN tableSourceItem (ON expression)?                #straightJoin
   952      | (LEFT | RIGHT) OUTER? JOIN tableSourceItem
   953          (
   954            ON expression
   955            | USING '(' uidList ')'
   956          )                                                           #outerJoin
   957      | NATURAL ((LEFT | RIGHT) OUTER?)? JOIN tableSourceItem         #naturalJoin
   958      ;
   959  
   960  //    Select Statement's Details
   961  
   962  queryExpression
   963      : '(' querySpecification ')'
   964      | '(' queryExpression ')'
   965      ;
   966  
   967  queryExpressionNointo
   968      : '(' querySpecificationNointo ')'
   969      | '(' queryExpressionNointo ')'
   970      ;
   971  
   972  querySpecification
   973      : SELECT selectSpec* selectElements selectIntoExpression?
   974        fromClause? groupByClause? havingClause? orderByClause? limitClause?
   975      | SELECT selectSpec* selectElements
   976      fromClause? groupByClause? havingClause? orderByClause? limitClause? selectIntoExpression?
   977      ;
   978  
   979  querySpecificationNointo
   980      : SELECT selectSpec* selectElements
   981        fromClause? groupByClause? havingClause? orderByClause? limitClause?
   982      ;
   983  
   984  unionParenthesis
   985      : UNION unionType=(ALL | DISTINCT)? queryExpressionNointo
   986      ;
   987  
   988  unionStatement
   989      : UNION unionType=(ALL | DISTINCT)?
   990        (querySpecificationNointo | queryExpressionNointo)
   991      ;
   992  
   993  // details
   994  
   995  selectSpec
   996      : (ALL | DISTINCT | DISTINCTROW)
   997      | HIGH_PRIORITY | STRAIGHT_JOIN | SQL_SMALL_RESULT
   998      | SQL_BIG_RESULT | SQL_BUFFER_RESULT
   999      | (SQL_CACHE | SQL_NO_CACHE)
  1000      | SQL_CALC_FOUND_ROWS
  1001      ;
  1002  
  1003  selectElements
  1004      : (star='*' | selectElement ) (',' selectElement)*
  1005      ;
  1006  
  1007  selectElement
  1008      : fullId '.' '*'                                                #selectStarElement
  1009      | fullColumnName (AS? uid)?                                     #selectColumnElement
  1010      | functionCall (AS? uid)?                                       #selectFunctionElement
  1011      | (LOCAL_ID VAR_ASSIGN)? expression (AS? uid)?                  #selectExpressionElement
  1012      ;
  1013  
  1014  selectIntoExpression
  1015      : INTO assignmentField (',' assignmentField )*                  #selectIntoVariables
  1016      | INTO DUMPFILE STRING_LITERAL                                  #selectIntoDumpFile
  1017      | (
  1018          INTO OUTFILE filename=STRING_LITERAL
  1019          (CHARACTER SET charset=charsetName)?
  1020          (
  1021            fieldsFormat=(FIELDS | COLUMNS)
  1022            selectFieldsInto+
  1023          )?
  1024          (
  1025            LINES selectLinesInto+
  1026          )?
  1027        )                                                             #selectIntoTextFile
  1028      ;
  1029  
  1030  selectFieldsInto
  1031      : TERMINATED BY terminationField=STRING_LITERAL
  1032      | OPTIONALLY? ENCLOSED BY enclosion=STRING_LITERAL
  1033      | ESCAPED BY escaping=STRING_LITERAL
  1034      ;
  1035  
  1036  selectLinesInto
  1037      : STARTING BY starting=STRING_LITERAL
  1038      | TERMINATED BY terminationLine=STRING_LITERAL
  1039      ;
  1040  
  1041  fromClause
  1042      : FROM tableSources
  1043        (WHERE whereExpr=expression)?
  1044      ;
  1045  
  1046  groupByClause
  1047      :  GROUP BY
  1048          groupByItem (',' groupByItem)*
  1049          (WITH ROLLUP)?
  1050      ;
  1051  
  1052  havingClause
  1053      :  HAVING havingExpr=expression
  1054      ;
  1055  
  1056  groupByItem
  1057      : expression order=(ASC | DESC)?
  1058      ;
  1059  
  1060  limitClause
  1061      : LIMIT
  1062      (
  1063        (offset=limitClauseAtom ',')? limit=limitClauseAtom
  1064        | limit=limitClauseAtom OFFSET offset=limitClauseAtom
  1065      )
  1066      ;
  1067  
  1068  limitClauseAtom
  1069  	: decimalLiteral | mysqlVariable | simpleId
  1070  	;
  1071  
  1072  
  1073  // Transaction's Statements
  1074  
  1075  startTransaction
  1076      : START TRANSACTION (transactionMode (',' transactionMode)* )?
  1077      ;
  1078  
  1079  beginWork
  1080      : BEGIN WORK?
  1081      ;
  1082  
  1083  commitWork
  1084      : COMMIT WORK?
  1085        (AND nochain=NO? CHAIN)?
  1086        (norelease=NO? RELEASE)?
  1087      ;
  1088  
  1089  rollbackWork
  1090      : ROLLBACK WORK?
  1091        (AND nochain=NO? CHAIN)?
  1092        (norelease=NO? RELEASE)?
  1093      ;
  1094  
  1095  savepointStatement
  1096      : SAVEPOINT uid
  1097      ;
  1098  
  1099  rollbackStatement
  1100      : ROLLBACK WORK? TO SAVEPOINT? uid
  1101      ;
  1102  
  1103  releaseStatement
  1104      : RELEASE SAVEPOINT uid
  1105      ;
  1106  
  1107  lockTables
  1108      : LOCK TABLES lockTableElement (',' lockTableElement)*
  1109      ;
  1110  
  1111  unlockTables
  1112      : UNLOCK TABLES
  1113      ;
  1114  
  1115  
  1116  // details
  1117  
  1118  setAutocommitStatement
  1119      : SET AUTOCOMMIT '=' autocommitValue=('0' | '1')
  1120      ;
  1121  
  1122  setTransactionStatement
  1123      : SET transactionContext=(GLOBAL | SESSION)? TRANSACTION
  1124        transactionOption (',' transactionOption)*
  1125      ;
  1126  
  1127  transactionMode
  1128      : WITH CONSISTENT SNAPSHOT
  1129      | READ WRITE
  1130      | READ ONLY
  1131      ;
  1132  
  1133  lockTableElement
  1134      : tableName (AS? uid)? lockAction
  1135      ;
  1136  
  1137  lockAction
  1138      : READ LOCAL? | LOW_PRIORITY? WRITE
  1139      ;
  1140  
  1141  transactionOption
  1142      : ISOLATION LEVEL transactionLevel
  1143      | READ WRITE
  1144      | READ ONLY
  1145      ;
  1146  
  1147  transactionLevel
  1148      : REPEATABLE READ
  1149      | READ COMMITTED
  1150      | READ UNCOMMITTED
  1151      | SERIALIZABLE
  1152      ;
  1153  
  1154  
  1155  // Replication's Statements
  1156  
  1157  //    Base Replication
  1158  
  1159  changeMaster
  1160      : CHANGE MASTER TO
  1161        masterOption (',' masterOption)* channelOption?
  1162      ;
  1163  
  1164  changeReplicationFilter
  1165      : CHANGE REPLICATION FILTER
  1166        replicationFilter (',' replicationFilter)*
  1167      ;
  1168  
  1169  purgeBinaryLogs
  1170      : PURGE purgeFormat=(BINARY | MASTER) LOGS
  1171         (
  1172             TO fileName=STRING_LITERAL
  1173             | BEFORE timeValue=STRING_LITERAL
  1174         )
  1175      ;
  1176  
  1177  resetMaster
  1178      : RESET MASTER
  1179      ;
  1180  
  1181  resetSlave
  1182      : RESET SLAVE ALL? channelOption?
  1183      ;
  1184  
  1185  startSlave
  1186      : START SLAVE (threadType (',' threadType)*)?
  1187        (UNTIL untilOption)?
  1188        connectionOption* channelOption?
  1189      ;
  1190  
  1191  stopSlave
  1192      : STOP SLAVE (threadType (',' threadType)*)?
  1193      ;
  1194  
  1195  startGroupReplication
  1196      : START GROUP_REPLICATION
  1197      ;
  1198  
  1199  stopGroupReplication
  1200      : STOP GROUP_REPLICATION
  1201      ;
  1202  
  1203  // details
  1204  
  1205  masterOption
  1206      : stringMasterOption '=' STRING_LITERAL                         #masterStringOption
  1207      | decimalMasterOption '=' decimalLiteral                        #masterDecimalOption
  1208      | boolMasterOption '=' boolVal=('0' | '1')                      #masterBoolOption
  1209      | MASTER_HEARTBEAT_PERIOD '=' REAL_LITERAL                      #masterRealOption
  1210      | IGNORE_SERVER_IDS '=' '(' (uid (',' uid)*)? ')'               #masterUidListOption
  1211      ;
  1212  
  1213  stringMasterOption
  1214      : MASTER_BIND | MASTER_HOST | MASTER_USER | MASTER_PASSWORD
  1215      | MASTER_LOG_FILE | RELAY_LOG_FILE | MASTER_SSL_CA
  1216      | MASTER_SSL_CAPATH | MASTER_SSL_CERT | MASTER_SSL_CRL
  1217      | MASTER_SSL_CRLPATH | MASTER_SSL_KEY | MASTER_SSL_CIPHER
  1218      | MASTER_TLS_VERSION
  1219      ;
  1220  decimalMasterOption
  1221      : MASTER_PORT | MASTER_CONNECT_RETRY | MASTER_RETRY_COUNT
  1222      | MASTER_DELAY | MASTER_LOG_POS | RELAY_LOG_POS
  1223      ;
  1224  
  1225  boolMasterOption
  1226      : MASTER_AUTO_POSITION | MASTER_SSL
  1227      | MASTER_SSL_VERIFY_SERVER_CERT
  1228      ;
  1229  
  1230  channelOption
  1231      : FOR CHANNEL STRING_LITERAL
  1232      ;
  1233  
  1234  replicationFilter
  1235      : REPLICATE_DO_DB '=' '(' uidList ')'                           #doDbReplication
  1236      | REPLICATE_IGNORE_DB '=' '(' uidList ')'                       #ignoreDbReplication
  1237      | REPLICATE_DO_TABLE '=' '(' tables ')'                         #doTableReplication
  1238      | REPLICATE_IGNORE_TABLE '=' '(' tables ')'                     #ignoreTableReplication
  1239      | REPLICATE_WILD_DO_TABLE '=' '(' simpleStrings ')'             #wildDoTableReplication
  1240      | REPLICATE_WILD_IGNORE_TABLE
  1241         '=' '(' simpleStrings ')'                                    #wildIgnoreTableReplication
  1242      | REPLICATE_REWRITE_DB '='
  1243        '(' tablePair (',' tablePair)* ')'                            #rewriteDbReplication
  1244      ;
  1245  
  1246  tablePair
  1247      : '(' firstTable=tableName ',' secondTable=tableName ')'
  1248      ;
  1249  
  1250  threadType
  1251      : IO_THREAD | SQL_THREAD
  1252      ;
  1253  
  1254  untilOption
  1255      : gtids=(SQL_BEFORE_GTIDS | SQL_AFTER_GTIDS)
  1256        '=' gtuidSet                                                  #gtidsUntilOption
  1257      | MASTER_LOG_FILE '=' STRING_LITERAL
  1258        ',' MASTER_LOG_POS '=' decimalLiteral                         #masterLogUntilOption
  1259      | RELAY_LOG_FILE '=' STRING_LITERAL
  1260        ',' RELAY_LOG_POS '=' decimalLiteral                          #relayLogUntilOption
  1261      | SQL_AFTER_MTS_GAPS                                            #sqlGapsUntilOption
  1262      ;
  1263  
  1264  connectionOption
  1265      : USER '=' conOptUser=STRING_LITERAL                            #userConnectionOption
  1266      | PASSWORD '=' conOptPassword=STRING_LITERAL                    #passwordConnectionOption
  1267      | DEFAULT_AUTH '=' conOptDefAuth=STRING_LITERAL                 #defaultAuthConnectionOption
  1268      | PLUGIN_DIR '=' conOptPluginDir=STRING_LITERAL                 #pluginDirConnectionOption
  1269      ;
  1270  
  1271  gtuidSet
  1272      : uuidSet (',' uuidSet)*
  1273      | STRING_LITERAL
  1274      ;
  1275  
  1276  
  1277  //    XA Transactions
  1278  
  1279  xaStartTransaction
  1280      : XA xaStart=(START | BEGIN) xid xaAction=(JOIN | RESUME)?
  1281      ;
  1282  
  1283  xaEndTransaction
  1284      : XA END xid (SUSPEND (FOR MIGRATE)?)?
  1285      ;
  1286  
  1287  xaPrepareStatement
  1288      : XA PREPARE xid
  1289      ;
  1290  
  1291  xaCommitWork
  1292      : XA COMMIT xid (ONE PHASE)?
  1293      ;
  1294  
  1295  xaRollbackWork
  1296      : XA ROLLBACK xid
  1297      ;
  1298  
  1299  xaRecoverWork
  1300      : XA RECOVER (CONVERT xid)?
  1301      ;
  1302  
  1303  
  1304  // Prepared Statements
  1305  
  1306  prepareStatement
  1307      : PREPARE uid FROM
  1308        (query=STRING_LITERAL | variable=LOCAL_ID)
  1309      ;
  1310  
  1311  executeStatement
  1312      : EXECUTE uid (USING userVariables)?
  1313      ;
  1314  
  1315  deallocatePrepare
  1316      : dropFormat=(DEALLOCATE | DROP) PREPARE uid
  1317      ;
  1318  
  1319  
  1320  // Compound Statements
  1321  
  1322  routineBody
  1323      : blockStatement | sqlStatement
  1324      ;
  1325  
  1326  // details
  1327  
  1328  blockStatement
  1329      : (uid ':')? BEGIN
  1330        (
  1331          (declareVariable SEMI)*
  1332          (declareCondition SEMI)*
  1333          (declareCursor SEMI)*
  1334          (declareHandler SEMI)*
  1335          procedureSqlStatement*
  1336        )?
  1337        END uid?
  1338      ;
  1339  
  1340  caseStatement
  1341      : CASE (uid | expression)? caseAlternative+
  1342        (ELSE procedureSqlStatement+)?
  1343        END CASE
  1344      ;
  1345  
  1346  ifStatement
  1347      : IF expression
  1348        THEN thenStatements+=procedureSqlStatement+
  1349        elifAlternative*
  1350        (ELSE elseStatements+=procedureSqlStatement+ )?
  1351        END IF
  1352      ;
  1353  
  1354  iterateStatement
  1355      : ITERATE uid
  1356      ;
  1357  
  1358  leaveStatement
  1359      : LEAVE uid
  1360      ;
  1361  
  1362  loopStatement
  1363      : (uid ':')?
  1364        LOOP procedureSqlStatement+
  1365        END LOOP uid?
  1366      ;
  1367  
  1368  repeatStatement
  1369      : (uid ':')?
  1370        REPEAT procedureSqlStatement+
  1371        UNTIL expression
  1372        END REPEAT uid?
  1373      ;
  1374  
  1375  returnStatement
  1376      : RETURN expression
  1377      ;
  1378  
  1379  whileStatement
  1380      : (uid ':')?
  1381        WHILE expression
  1382        DO procedureSqlStatement+
  1383        END WHILE uid?
  1384      ;
  1385  
  1386  cursorStatement
  1387      : CLOSE uid                                                     #CloseCursor
  1388      | FETCH (NEXT? FROM)? uid INTO uidList                          #FetchCursor
  1389      | OPEN uid                                                      #OpenCursor
  1390      ;
  1391  
  1392  // details
  1393  
  1394  declareVariable
  1395      : DECLARE uidList dataType (DEFAULT expression)?
  1396      ;
  1397  
  1398  declareCondition
  1399      : DECLARE uid CONDITION FOR
  1400        ( decimalLiteral | SQLSTATE VALUE? STRING_LITERAL)
  1401      ;
  1402  
  1403  declareCursor
  1404      : DECLARE uid CURSOR FOR selectStatement
  1405      ;
  1406  
  1407  declareHandler
  1408      : DECLARE handlerAction=(CONTINUE | EXIT | UNDO)
  1409        HANDLER FOR
  1410        handlerConditionValue (',' handlerConditionValue)*
  1411        routineBody
  1412      ;
  1413  
  1414  handlerConditionValue
  1415      : decimalLiteral                                                #handlerConditionCode
  1416      | SQLSTATE VALUE? STRING_LITERAL                                #handlerConditionState
  1417      | uid                                                           #handlerConditionName
  1418      | SQLWARNING                                                    #handlerConditionWarning
  1419      | NOT FOUND                                                     #handlerConditionNotfound
  1420      | SQLEXCEPTION                                                  #handlerConditionException
  1421      ;
  1422  
  1423  procedureSqlStatement
  1424      : (compoundStatement | sqlStatement) SEMI
  1425      ;
  1426  
  1427  caseAlternative
  1428      : WHEN (constant | expression)
  1429        THEN procedureSqlStatement+
  1430      ;
  1431  
  1432  elifAlternative
  1433      : ELSEIF expression
  1434        THEN procedureSqlStatement+
  1435      ;
  1436  
  1437  // Administration Statements
  1438  
  1439  //    Account management statements
  1440  
  1441  alterUser
  1442      : ALTER USER
  1443        userSpecification (',' userSpecification)*                    #alterUserMysqlV56
  1444      | ALTER USER ifExists?
  1445          userAuthOption (',' userAuthOption)*
  1446          (
  1447            REQUIRE
  1448            (tlsNone=NONE | tlsOption (AND? tlsOption)* )
  1449          )?
  1450          (WITH userResourceOption+)?
  1451          (userPasswordOption | userLockOption)*                      #alterUserMysqlV57
  1452      ;
  1453  
  1454  createUser
  1455      : CREATE USER userAuthOption (',' userAuthOption)*              #createUserMysqlV56
  1456      | CREATE USER ifNotExists?
  1457          userAuthOption (',' userAuthOption)*
  1458          (
  1459            REQUIRE
  1460            (tlsNone=NONE | tlsOption (AND? tlsOption)* )
  1461          )?
  1462          (WITH userResourceOption+)?
  1463          (userPasswordOption | userLockOption)*                      #createUserMysqlV57
  1464      ;
  1465  
  1466  dropUser
  1467      : DROP USER ifExists? userName (',' userName)*
  1468      ;
  1469  
  1470  grantStatement
  1471      : GRANT privelegeClause (',' privelegeClause)*
  1472        ON
  1473        privilegeObject=(TABLE | FUNCTION | PROCEDURE)?
  1474        privilegeLevel
  1475        TO userAuthOption (',' userAuthOption)*
  1476        (
  1477            REQUIRE
  1478            (tlsNone=NONE | tlsOption (AND? tlsOption)* )
  1479          )?
  1480        (WITH (GRANT OPTION | userResourceOption)* )?
  1481      ;
  1482  
  1483  grantProxy
  1484      : GRANT PROXY ON fromFirst=userName
  1485        TO toFirst=userName (',' toOther+=userName)*
  1486        (WITH GRANT OPTION)?
  1487      ;
  1488  
  1489  renameUser
  1490      : RENAME USER
  1491        renameUserClause (',' renameUserClause)*
  1492      ;
  1493  
  1494  revokeStatement
  1495      : REVOKE privelegeClause (',' privelegeClause)*
  1496        ON
  1497        privilegeObject=(TABLE | FUNCTION | PROCEDURE)?
  1498        privilegeLevel
  1499        FROM userName (',' userName)*                                 #detailRevoke
  1500      | REVOKE ALL PRIVILEGES? ',' GRANT OPTION
  1501        FROM userName (',' userName)*                                 #shortRevoke
  1502      ;
  1503  
  1504  revokeProxy
  1505      : REVOKE PROXY ON onUser=userName
  1506        FROM fromFirst=userName (',' fromOther+=userName)*
  1507      ;
  1508  
  1509  setPasswordStatement
  1510      : SET PASSWORD (FOR userName)?
  1511        '=' ( passwordFunctionClause | STRING_LITERAL)
  1512      ;
  1513  
  1514  // details
  1515  
  1516  userSpecification
  1517      : userName userPasswordOption
  1518      ;
  1519  
  1520  userAuthOption
  1521      : userName IDENTIFIED BY PASSWORD hashed=STRING_LITERAL         #passwordAuthOption
  1522      | userName
  1523        IDENTIFIED (WITH authPlugin)? BY STRING_LITERAL               #stringAuthOption
  1524      | userName
  1525        IDENTIFIED WITH authPlugin
  1526        (AS STRING_LITERAL)?                                          #hashAuthOption
  1527      | userName                                                      #simpleAuthOption
  1528      ;
  1529  
  1530  tlsOption
  1531      : SSL
  1532      | X509
  1533      | CIPHER STRING_LITERAL
  1534      | ISSUER STRING_LITERAL
  1535      | SUBJECT STRING_LITERAL
  1536      ;
  1537  
  1538  userResourceOption
  1539      : MAX_QUERIES_PER_HOUR decimalLiteral
  1540      | MAX_UPDATES_PER_HOUR decimalLiteral
  1541      | MAX_CONNECTIONS_PER_HOUR decimalLiteral
  1542      | MAX_USER_CONNECTIONS decimalLiteral
  1543      ;
  1544  
  1545  userPasswordOption
  1546      : PASSWORD EXPIRE
  1547        (expireType=DEFAULT
  1548        | expireType=NEVER
  1549        | expireType=INTERVAL decimalLiteral DAY
  1550        )?
  1551      ;
  1552  
  1553  userLockOption
  1554      : ACCOUNT lockType=(LOCK | UNLOCK)
  1555      ;
  1556  
  1557  privelegeClause
  1558      : privilege ( '(' uidList ')' )?
  1559      ;
  1560  
  1561  privilege
  1562      : ALL PRIVILEGES?
  1563      | ALTER ROUTINE?
  1564      | CREATE
  1565        (TEMPORARY TABLES | ROUTINE | VIEW | USER | TABLESPACE | ROLE)?
  1566      | DELETE | DROP (ROLE)? | EVENT | EXECUTE | FILE | GRANT OPTION
  1567      | INDEX | INSERT | LOCK TABLES | PROCESS | PROXY
  1568      | REFERENCES | RELOAD
  1569      | REPLICATION (CLIENT | SLAVE)
  1570      | SELECT
  1571      | SHOW (VIEW | DATABASES)
  1572      | SHUTDOWN | SUPER | TRIGGER | UPDATE | USAGE
  1573      | APPLICATION_PASSWORD_ADMIN | AUDIT_ADMIN | BACKUP_ADMIN | BINLOG_ADMIN | BINLOG_ENCRYPTION_ADMIN | CLONE_ADMIN
  1574      | CONNECTION_ADMIN | ENCRYPTION_KEY_ADMIN | FIREWALL_ADMIN | FIREWALL_USER | FLUSH_OPTIMIZER_COSTS
  1575      | FLUSH_STATUS | FLUSH_TABLES | FLUSH_USER_RESOURCES | GROUP_REPLICATION_ADMIN
  1576      | INNODB_REDO_LOG_ARCHIVE | INNODB_REDO_LOG_ENABLE | NDB_STORED_USER | PERSIST_RO_VARIABLES_ADMIN | REPLICATION_APPLIER
  1577      | REPLICATION_SLAVE_ADMIN | RESOURCE_GROUP_ADMIN | RESOURCE_GROUP_USER | ROLE_ADMIN
  1578      | SERVICE_CONNECTION_ADMIN
  1579      | SESSION_VARIABLES_ADMIN | SET_USER_ID | SHOW_ROUTINE | SYSTEM_USER | SYSTEM_VARIABLES_ADMIN
  1580      | TABLE_ENCRYPTION_ADMIN | VERSION_TOKEN_ADMIN | XA_RECOVER_ADMIN
  1581      ;
  1582  
  1583  privilegeLevel
  1584      : '*'                                                           #currentSchemaPriviLevel
  1585      | '*' '.' '*'                                                   #globalPrivLevel
  1586      | uid '.' '*'                                                   #definiteSchemaPrivLevel
  1587      | uid '.' uid                                                   #definiteFullTablePrivLevel
  1588      | uid dottedId                                                  #definiteFullTablePrivLevel2
  1589      | uid                                                           #definiteTablePrivLevel
  1590      ;
  1591  
  1592  renameUserClause
  1593      : fromFirst=userName TO toFirst=userName
  1594      ;
  1595  
  1596  //    Table maintenance statements
  1597  
  1598  analyzeTable
  1599      : ANALYZE actionOption=(NO_WRITE_TO_BINLOG | LOCAL)?
  1600         TABLE tables
  1601      ;
  1602  
  1603  checkTable
  1604      : CHECK TABLE tables checkTableOption*
  1605      ;
  1606  
  1607  checksumTable
  1608      : CHECKSUM TABLE tables actionOption=(QUICK | EXTENDED)?
  1609      ;
  1610  
  1611  optimizeTable
  1612      : OPTIMIZE actionOption=(NO_WRITE_TO_BINLOG | LOCAL)?
  1613        (TABLE | TABLES) tables
  1614      ;
  1615  
  1616  repairTable
  1617      : REPAIR actionOption=(NO_WRITE_TO_BINLOG | LOCAL)?
  1618        TABLE tables
  1619        QUICK? EXTENDED? USE_FRM?
  1620      ;
  1621  
  1622  // details
  1623  
  1624  checkTableOption
  1625      : FOR UPGRADE | QUICK | FAST | MEDIUM | EXTENDED | CHANGED
  1626      ;
  1627  
  1628  
  1629  //    Plugin and udf statements
  1630  
  1631  createUdfunction
  1632      : CREATE AGGREGATE? FUNCTION uid
  1633        RETURNS returnType=(STRING | INTEGER | REAL | DECIMAL)
  1634        SONAME STRING_LITERAL
  1635      ;
  1636  
  1637  installPlugin
  1638      : INSTALL PLUGIN uid SONAME STRING_LITERAL
  1639      ;
  1640  
  1641  uninstallPlugin
  1642      : UNINSTALL PLUGIN uid
  1643      ;
  1644  
  1645  
  1646  //    Set and show statements
  1647  
  1648  setStatement
  1649      : SET variableClause ('=' | ':=') expression
  1650        (',' variableClause ('=' | ':=') expression)*                 #setVariable
  1651      | SET (CHARACTER SET | CHARSET) (charsetName | DEFAULT)         #setCharset
  1652      | SET NAMES
  1653          (charsetName (COLLATE collationName)? | DEFAULT)            #setNames
  1654      | setPasswordStatement                                          #setPassword
  1655      | setTransactionStatement                                       #setTransaction
  1656      | setAutocommitStatement                                        #setAutocommit
  1657      | SET fullId ('=' | ':=') expression
  1658        (',' fullId ('=' | ':=') expression)*                         #setNewValueInsideTrigger
  1659      ;
  1660  
  1661  showStatement
  1662      : SHOW logFormat=(BINARY | MASTER) LOGS                         #showMasterLogs
  1663      | SHOW logFormat=(BINLOG | RELAYLOG)
  1664        EVENTS (IN filename=STRING_LITERAL)?
  1665          (FROM fromPosition=decimalLiteral)?
  1666          (LIMIT
  1667            (offset=decimalLiteral ',')?
  1668            rowCount=decimalLiteral
  1669          )?                                                          #showLogEvents
  1670      | SHOW showCommonEntity showFilter?                             #showObjectFilter
  1671      | SHOW FULL? columnsFormat=(COLUMNS | FIELDS)
  1672        tableFormat=(FROM | IN) tableName
  1673          (schemaFormat=(FROM | IN) uid)? showFilter?                 #showColumns
  1674      | SHOW CREATE schemaFormat=(DATABASE | SCHEMA)
  1675        ifNotExists? uid                                              #showCreateDb
  1676      | SHOW CREATE
  1677          namedEntity=(
  1678            EVENT | FUNCTION | PROCEDURE
  1679            | TABLE | TRIGGER | VIEW
  1680          )
  1681          fullId                                                      #showCreateFullIdObject
  1682      | SHOW CREATE USER userName                                     #showCreateUser
  1683      | SHOW ENGINE engineName engineOption=(STATUS | MUTEX)          #showEngine
  1684      | SHOW showGlobalInfoClause                                     #showGlobalInfo
  1685      | SHOW errorFormat=(ERRORS | WARNINGS)
  1686          (LIMIT
  1687            (offset=decimalLiteral ',')?
  1688            rowCount=decimalLiteral
  1689          )                                                           #showErrors
  1690      | SHOW COUNT '(' '*' ')' errorFormat=(ERRORS | WARNINGS)        #showCountErrors
  1691      | SHOW showSchemaEntity
  1692          (schemaFormat=(FROM | IN) uid)? showFilter?                 #showSchemaFilter
  1693      | SHOW routine=(FUNCTION | PROCEDURE) CODE fullId               #showRoutine
  1694      | SHOW GRANTS (FOR userName)?                                   #showGrants
  1695      | SHOW indexFormat=(INDEX | INDEXES | KEYS)
  1696        tableFormat=(FROM | IN) tableName
  1697          (schemaFormat=(FROM | IN) uid)? (WHERE expression)?         #showIndexes
  1698      | SHOW OPEN TABLES ( schemaFormat=(FROM | IN) uid)?
  1699        showFilter?                                                   #showOpenTables
  1700      | SHOW PROFILE showProfileType (',' showProfileType)*
  1701          (FOR QUERY queryCount=decimalLiteral)?
  1702          (LIMIT
  1703            (offset=decimalLiteral ',')?
  1704            rowCount=decimalLiteral
  1705          )                                                           #showProfile
  1706      | SHOW SLAVE STATUS (FOR CHANNEL STRING_LITERAL)?               #showSlaveStatus
  1707      ;
  1708  
  1709  // details
  1710  
  1711  variableClause
  1712      : LOCAL_ID | GLOBAL_ID | ( ('@' '@')? (GLOBAL | SESSION | LOCAL)  )? uid
  1713      ;
  1714  
  1715  showCommonEntity
  1716      : CHARACTER SET | COLLATION | DATABASES | SCHEMAS
  1717      | FUNCTION STATUS | PROCEDURE STATUS
  1718      | (GLOBAL | SESSION)? (STATUS | VARIABLES)
  1719      ;
  1720  
  1721  showFilter
  1722      : LIKE STRING_LITERAL
  1723      | WHERE expression
  1724      ;
  1725  
  1726  showGlobalInfoClause
  1727      : STORAGE? ENGINES | MASTER STATUS | PLUGINS
  1728      | PRIVILEGES | FULL? PROCESSLIST | PROFILES
  1729      | SLAVE HOSTS | AUTHORS | CONTRIBUTORS
  1730      ;
  1731  
  1732  showSchemaEntity
  1733      : EVENTS | TABLE STATUS | FULL? TABLES | TRIGGERS
  1734      ;
  1735  
  1736  showProfileType
  1737      : ALL | BLOCK IO | CONTEXT SWITCHES | CPU | IPC | MEMORY
  1738      | PAGE FAULTS | SOURCE | SWAPS
  1739      ;
  1740  
  1741  
  1742  //    Other administrative statements
  1743  
  1744  binlogStatement
  1745      : BINLOG STRING_LITERAL
  1746      ;
  1747  
  1748  cacheIndexStatement
  1749      : CACHE INDEX tableIndexes (',' tableIndexes)*
  1750        ( PARTITION '(' (uidList | ALL) ')' )?
  1751        IN schema=uid
  1752      ;
  1753  
  1754  flushStatement
  1755      : FLUSH flushFormat=(NO_WRITE_TO_BINLOG | LOCAL)?
  1756        flushOption (',' flushOption)*
  1757      ;
  1758  
  1759  killStatement
  1760      : KILL connectionFormat=(CONNECTION | QUERY)?
  1761        decimalLiteral+
  1762      ;
  1763  
  1764  loadIndexIntoCache
  1765      : LOAD INDEX INTO CACHE
  1766        loadedTableIndexes (',' loadedTableIndexes)*
  1767      ;
  1768  
  1769  // remark reset (maser | slave) describe in replication's
  1770  //  statements section
  1771  resetStatement
  1772      : RESET QUERY CACHE
  1773      ;
  1774  
  1775  shutdownStatement
  1776      : SHUTDOWN
  1777      ;
  1778  
  1779  // details
  1780  
  1781  tableIndexes
  1782      : tableName ( indexFormat=(INDEX | KEY)? '(' uidList ')' )?
  1783      ;
  1784  
  1785  flushOption
  1786      : (
  1787          DES_KEY_FILE | HOSTS
  1788          | (
  1789              BINARY | ENGINE | ERROR | GENERAL | RELAY | SLOW
  1790            )? LOGS
  1791          | OPTIMIZER_COSTS | PRIVILEGES | QUERY CACHE | STATUS
  1792          | USER_RESOURCES | TABLES (WITH READ LOCK)?
  1793         )                                                            #simpleFlushOption
  1794      | RELAY LOGS channelOption?                                     #channelFlushOption
  1795      | TABLES tables flushTableOption?                               #tableFlushOption
  1796      ;
  1797  
  1798  flushTableOption
  1799      : WITH READ LOCK
  1800      | FOR EXPORT
  1801      ;
  1802  
  1803  loadedTableIndexes
  1804      : tableName
  1805        ( PARTITION '(' (partitionList=uidList | ALL) ')' )?
  1806        ( indexFormat=(INDEX | KEY)? '(' indexList=uidList ')' )?
  1807        (IGNORE LEAVES)?
  1808      ;
  1809  
  1810  
  1811  // Utility Statements
  1812  
  1813  
  1814  simpleDescribeStatement
  1815      : command=(EXPLAIN | DESCRIBE | DESC) tableName
  1816        (column=uid | pattern=STRING_LITERAL)?
  1817      ;
  1818  
  1819  fullDescribeStatement
  1820      : command=(EXPLAIN | DESCRIBE | DESC)
  1821        (
  1822          formatType=(EXTENDED | PARTITIONS | FORMAT )
  1823          '='
  1824          formatValue=(TRADITIONAL | JSON)
  1825        )?
  1826        describeObjectClause
  1827      ;
  1828  
  1829  helpStatement
  1830      : HELP STRING_LITERAL
  1831      ;
  1832  
  1833  useStatement
  1834      : USE uid
  1835      ;
  1836  
  1837  signalStatement
  1838      : SIGNAL ( ( SQLSTATE VALUE? stringLiteral ) | ID | REVERSE_QUOTE_ID )
  1839          ( SET signalConditionInformation ( ',' signalConditionInformation)* )?
  1840      ;
  1841  
  1842  resignalStatement
  1843      : RESIGNAL ( ( SQLSTATE VALUE? stringLiteral ) | ID | REVERSE_QUOTE_ID )?
  1844          ( SET signalConditionInformation ( ',' signalConditionInformation)* )?
  1845      ;
  1846  
  1847  signalConditionInformation
  1848      : ( CLASS_ORIGIN
  1849            | SUBCLASS_ORIGIN
  1850            | MESSAGE_TEXT
  1851            | MYSQL_ERRNO
  1852            | CONSTRAINT_CATALOG
  1853            | CONSTRAINT_SCHEMA
  1854            | CONSTRAINT_NAME
  1855            | CATALOG_NAME
  1856            | SCHEMA_NAME
  1857            | TABLE_NAME
  1858            | COLUMN_NAME
  1859            | CURSOR_NAME
  1860          ) '=' ( stringLiteral | DECIMAL_LITERAL | mysqlVariable | simpleId )
  1861      ;
  1862  
  1863  diagnosticsStatement
  1864      : GET ( CURRENT | STACKED )? DIAGNOSTICS (
  1865            ( variableClause '=' ( NUMBER | ROW_COUNT ) ( ',' variableClause '=' ( NUMBER | ROW_COUNT ) )* )
  1866          | ( CONDITION  ( decimalLiteral | variableClause ) variableClause '=' diagnosticsConditionInformationName ( ',' variableClause '=' diagnosticsConditionInformationName )* )
  1867        )
  1868      ;
  1869  
  1870  diagnosticsConditionInformationName
  1871      : CLASS_ORIGIN
  1872      | SUBCLASS_ORIGIN
  1873      | RETURNED_SQLSTATE
  1874      | MESSAGE_TEXT
  1875      | MYSQL_ERRNO
  1876      | CONSTRAINT_CATALOG
  1877      | CONSTRAINT_SCHEMA
  1878      | CONSTRAINT_NAME
  1879      | CATALOG_NAME
  1880      | SCHEMA_NAME
  1881      | TABLE_NAME
  1882      | COLUMN_NAME
  1883      | CURSOR_NAME
  1884      ;
  1885  
  1886  // details
  1887  
  1888  describeObjectClause
  1889      : (
  1890          selectStatement | deleteStatement | insertStatement
  1891          | replaceStatement | updateStatement
  1892        )                                                             #describeStatements
  1893      | FOR CONNECTION uid                                            #describeConnection
  1894      ;
  1895  
  1896  
  1897  // Common Clauses
  1898  
  1899  //    DB Objects
  1900  
  1901  fullId
  1902      : uid (DOT_ID | '.' uid)?
  1903      ;
  1904  
  1905  tableName
  1906      : fullId
  1907      ;
  1908  
  1909  fullColumnName
  1910      : uid (dottedId dottedId? )?
  1911      | . dottedId dottedId?
  1912      ;
  1913  
  1914  indexColumnName
  1915      : (uid | STRING_LITERAL) ('(' decimalLiteral ')')? sortType=(ASC | DESC)?
  1916      ;
  1917  
  1918  userName
  1919      : STRING_USER_NAME | ID | STRING_LITERAL;
  1920  
  1921  mysqlVariable
  1922      : LOCAL_ID
  1923      | GLOBAL_ID
  1924      ;
  1925  
  1926  charsetName
  1927      : BINARY
  1928      | charsetNameBase
  1929      | STRING_LITERAL
  1930      | CHARSET_REVERSE_QOUTE_STRING
  1931      ;
  1932  
  1933  collationName
  1934      : uid | STRING_LITERAL;
  1935  
  1936  engineName
  1937      : ARCHIVE | BLACKHOLE | CSV | FEDERATED | INNODB | MEMORY
  1938      | MRG_MYISAM | MYISAM | NDB | NDBCLUSTER | PERFORMANCE_SCHEMA
  1939      | TOKUDB
  1940      | ID
  1941      | STRING_LITERAL | REVERSE_QUOTE_ID
  1942      ;
  1943  
  1944  uuidSet
  1945      : decimalLiteral '-' decimalLiteral '-' decimalLiteral
  1946        '-' decimalLiteral '-' decimalLiteral
  1947        (':' decimalLiteral '-' decimalLiteral)+
  1948      ;
  1949  
  1950  xid
  1951      : globalTableUid=xuidStringId
  1952        (
  1953          ',' qualifier=xuidStringId
  1954          (',' idFormat=decimalLiteral)?
  1955        )?
  1956      ;
  1957  
  1958  xuidStringId
  1959      : STRING_LITERAL
  1960      | BIT_STRING
  1961      | HEXADECIMAL_LITERAL+
  1962      ;
  1963  
  1964  authPlugin
  1965      : uid | STRING_LITERAL
  1966      ;
  1967  
  1968  uid
  1969      : simpleId
  1970      //| DOUBLE_QUOTE_ID
  1971      | REVERSE_QUOTE_ID
  1972      | CHARSET_REVERSE_QOUTE_STRING
  1973      ;
  1974  
  1975  simpleId
  1976      : ID
  1977      | charsetNameBase
  1978      | transactionLevelBase
  1979      | engineName
  1980      | privilegesBase
  1981      | intervalTypeBase
  1982      | dataTypeBase
  1983      | keywordsCanBeId
  1984      | functionNameBase
  1985      ;
  1986  
  1987  dottedId
  1988      : DOT_ID
  1989      | '.' uid
  1990      ;
  1991  
  1992  
  1993  //    Literals
  1994  
  1995  decimalLiteral
  1996      : DECIMAL_LITERAL | ZERO_DECIMAL | ONE_DECIMAL | TWO_DECIMAL
  1997      ;
  1998  
  1999  fileSizeLiteral
  2000      : FILESIZE_LITERAL | decimalLiteral;
  2001  
  2002  stringLiteral
  2003      : (
  2004          STRING_CHARSET_NAME? STRING_LITERAL
  2005          | START_NATIONAL_STRING_LITERAL
  2006        ) STRING_LITERAL+
  2007      | (
  2008          STRING_CHARSET_NAME? STRING_LITERAL
  2009          | START_NATIONAL_STRING_LITERAL
  2010        ) (COLLATE collationName)?
  2011      ;
  2012  
  2013  booleanLiteral
  2014      : TRUE | FALSE;
  2015  
  2016  hexadecimalLiteral
  2017      : STRING_CHARSET_NAME? HEXADECIMAL_LITERAL;
  2018  
  2019  nullNotnull
  2020      : NOT? (NULL_LITERAL | NULL_SPEC_LITERAL)
  2021      ;
  2022  
  2023  constant
  2024      : stringLiteral | decimalLiteral
  2025      | '-' decimalLiteral
  2026      | hexadecimalLiteral | booleanLiteral
  2027      | REAL_LITERAL | BIT_STRING
  2028      | NOT? nullLiteral=(NULL_LITERAL | NULL_SPEC_LITERAL)
  2029      ;
  2030  
  2031  
  2032  //    Data Types
  2033  
  2034  dataType
  2035      : typeName=(
  2036        CHAR | CHARACTER | VARCHAR | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT
  2037         | NCHAR | NVARCHAR | LONG
  2038        )
  2039        VARYING?
  2040        lengthOneDimension? binaryType=BINARY?
  2041        ((CHARACTER SET | CHARSET) charsetName)?
  2042        (COLLATE collationName | collateBinary=BINARY)?                             #stringDataType
  2043      | NATIONAL typeName=(VARCHAR | CHARACTER)
  2044        lengthOneDimension? BINARY?                                   #nationalStringDataType
  2045      | NCHAR typeName=VARCHAR
  2046        lengthOneDimension? BINARY?                                   #nationalStringDataType
  2047      | NATIONAL typeName=(CHAR | CHARACTER) VARYING
  2048        lengthOneDimension? BINARY?                                   #nationalVaryingStringDataType
  2049      | typeName=(
  2050          TINYINT | SMALLINT | MEDIUMINT | INT | INTEGER | BIGINT
  2051          | MIDDLEINT | INT1 | INT2 | INT3 | INT4 | INT8
  2052        )
  2053        lengthOneDimension? (SIGNED | UNSIGNED)? ZEROFILL?            #dimensionDataType
  2054      | typeName=REAL
  2055        lengthTwoDimension? (SIGNED | UNSIGNED)? ZEROFILL?            #dimensionDataType
  2056      | typeName=DOUBLE PRECISION?
  2057            lengthTwoDimension? (SIGNED | UNSIGNED)? ZEROFILL?            #dimensionDataType
  2058      | typeName=(DECIMAL | DEC | FIXED | NUMERIC | FLOAT | FLOAT4 | FLOAT8)
  2059        lengthTwoOptionalDimension? (SIGNED | UNSIGNED)? ZEROFILL?    #dimensionDataType
  2060      | typeName=(
  2061          DATE | TINYBLOB | MEDIUMBLOB | LONGBLOB
  2062          | BOOL | BOOLEAN | SERIAL
  2063        )                                                             #simpleDataType
  2064      | typeName=(
  2065          BIT | TIME | TIMESTAMP | DATETIME | BINARY
  2066          | VARBINARY | BLOB | YEAR
  2067        )
  2068        lengthOneDimension?                                           #dimensionDataType
  2069      | typeName=(ENUM | SET)
  2070        collectionOptions BINARY?
  2071        ((CHARACTER cs=SET | CHARSET) charsetName)?                      #collectionDataType
  2072      | typeName=(
  2073          GEOMETRYCOLLECTION | GEOMCOLLECTION | LINESTRING | MULTILINESTRING
  2074          | MULTIPOINT | MULTIPOLYGON | POINT | POLYGON | JSON | GEOMETRY
  2075        )                                                             #spatialDataType
  2076      | typeName=LONG VARCHAR?
  2077        BINARY?
  2078        ((CHARACTER SET | CHARSET) charsetName)?
  2079        (COLLATE collationName)?                                      #longVarcharDataType    // LONG VARCHAR is the same as LONG
  2080      | LONG VARBINARY                                                 #longVarbinaryDataType
  2081      ;
  2082  
  2083  collectionOptions
  2084      : '(' STRING_LITERAL (',' STRING_LITERAL)* ')'
  2085      ;
  2086  
  2087  convertedDataType
  2088      : typeName=(BINARY| NCHAR) lengthOneDimension?
  2089      | typeName=CHAR lengthOneDimension? ((CHARACTER SET | CHARSET) charsetName)?
  2090      | typeName=(DATE | DATETIME | TIME | JSON)
  2091      | typeName=DECIMAL lengthTwoDimension?
  2092      | (SIGNED | UNSIGNED) INTEGER?
  2093      ;
  2094  
  2095  lengthOneDimension
  2096      : '(' decimalLiteral ')'
  2097      ;
  2098  
  2099  lengthTwoDimension
  2100      : '(' decimalLiteral ',' decimalLiteral ')'
  2101      ;
  2102  
  2103  lengthTwoOptionalDimension
  2104      : '(' decimalLiteral (',' decimalLiteral)? ')'
  2105      ;
  2106  
  2107  
  2108  //    Common Lists
  2109  
  2110  uidList
  2111      : uid (',' uid)*
  2112      ;
  2113  
  2114  tables
  2115      : tableName (',' tableName)*
  2116      ;
  2117  
  2118  indexColumnNames
  2119      : '(' indexColumnName (',' indexColumnName)* ')'
  2120      ;
  2121  
  2122  expressions
  2123      : expression (',' expression)*
  2124      ;
  2125  
  2126  expressionsWithDefaults
  2127      : expressionOrDefault (',' expressionOrDefault)*
  2128      ;
  2129  
  2130  constants
  2131      : constant (',' constant)*
  2132      ;
  2133  
  2134  simpleStrings
  2135      : STRING_LITERAL (',' STRING_LITERAL)*
  2136      ;
  2137  
  2138  userVariables
  2139      : LOCAL_ID (',' LOCAL_ID)*
  2140      ;
  2141  
  2142  
  2143  //    Common Expressons
  2144  
  2145  defaultValue
  2146      : (NULL_LITERAL | unaryOperator? constant | currentTimestamp | '(' expression ')') (ON UPDATE currentTimestamp)?
  2147      ;
  2148  
  2149  currentTimestamp
  2150      :
  2151      (
  2152        (CURRENT_TIMESTAMP | LOCALTIME | LOCALTIMESTAMP) ('(' decimalLiteral? ')')?
  2153        | NOW '(' decimalLiteral? ')'
  2154      )
  2155      ;
  2156  
  2157  expressionOrDefault
  2158      : expression | DEFAULT
  2159      ;
  2160  
  2161  ifExists
  2162      : IF EXISTS;
  2163  
  2164  ifNotExists
  2165      : IF NOT EXISTS;
  2166  
  2167  
  2168  //    Functions
  2169  
  2170  functionCall
  2171      : specificFunction                                              #specificFunctionCall
  2172      | aggregateWindowedFunction                                     #aggregateFunctionCall
  2173      | scalarFunctionName '(' functionArgs? ')'                      #scalarFunctionCall
  2174      | fullId '(' functionArgs? ')'                                  #udfFunctionCall
  2175      | passwordFunctionClause                                        #passwordFunctionCall
  2176      ;
  2177  
  2178  specificFunction
  2179      : (
  2180        CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP
  2181        | CURRENT_USER | LOCALTIME
  2182        ) ('(' ')')?                                                  #simpleFunctionCall
  2183      | CONVERT '(' expression separator=',' convertedDataType ')'    #dataTypeFunctionCall
  2184      | CONVERT '(' expression USING charsetName ')'                  #dataTypeFunctionCall
  2185      | CAST '(' expression AS convertedDataType ')'                  #dataTypeFunctionCall
  2186      | VALUES '(' fullColumnName ')'                                 #valuesFunctionCall
  2187      | CASE expression caseFuncAlternative+
  2188        (ELSE elseArg=functionArg)? END                               #caseExpressionFunctionCall
  2189      | CASE caseFuncAlternative+
  2190        (ELSE elseArg=functionArg)? END                               #caseFunctionCall
  2191      | CHAR '(' functionArgs  (USING charsetName)? ')'               #charFunctionCall
  2192      | POSITION
  2193        '('
  2194            (
  2195              positionString=stringLiteral
  2196              | positionExpression=expression
  2197            )
  2198            IN
  2199            (
  2200              inString=stringLiteral
  2201              | inExpression=expression
  2202            )
  2203        ')'                                                           #positionFunctionCall
  2204      | (SUBSTR | SUBSTRING)
  2205        '('
  2206          (
  2207            sourceString=stringLiteral
  2208            | sourceExpression=expression
  2209          ) FROM
  2210          (
  2211            fromDecimal=decimalLiteral
  2212            | fromExpression=expression
  2213          )
  2214          (
  2215            FOR
  2216            (
  2217              forDecimal=decimalLiteral
  2218              | forExpression=expression
  2219            )
  2220          )?
  2221        ')'                                                           #substrFunctionCall
  2222      | TRIM
  2223        '('
  2224          positioinForm=(BOTH | LEADING | TRAILING)
  2225          (
  2226            sourceString=stringLiteral
  2227            | sourceExpression=expression
  2228          )?
  2229          FROM
  2230          (
  2231            fromString=stringLiteral
  2232            | fromExpression=expression
  2233          )
  2234        ')'                                                           #trimFunctionCall
  2235      | TRIM
  2236        '('
  2237          (
  2238            sourceString=stringLiteral
  2239            | sourceExpression=expression
  2240          )
  2241          FROM
  2242          (
  2243            fromString=stringLiteral
  2244            | fromExpression=expression
  2245          )
  2246        ')'                                                           #trimFunctionCall
  2247      | WEIGHT_STRING
  2248        '('
  2249          (stringLiteral | expression)
  2250          (AS stringFormat=(CHAR | BINARY)
  2251          '(' decimalLiteral ')' )?  levelsInWeightString?
  2252        ')'                                                           #weightFunctionCall
  2253      | EXTRACT
  2254        '('
  2255          intervalType
  2256          FROM
  2257          (
  2258            sourceString=stringLiteral
  2259            | sourceExpression=expression
  2260          )
  2261        ')'                                                           #extractFunctionCall
  2262      | GET_FORMAT
  2263        '('
  2264          datetimeFormat=(DATE | TIME | DATETIME)
  2265          ',' stringLiteral
  2266        ')'                                                           #getFormatFunctionCall
  2267      | JSON_VALUE
  2268        '(' expression
  2269         ',' expression
  2270           (RETURNING convertedDataType)?
  2271           ((NULL | ERROR | (DEFAULT defaultValue)) ON EMPTY)?
  2272           ((NULL | ERROR | (DEFAULT defaultValue)) ON ERROR)?
  2273         ')'                                                          #jsonValueFunctionCall
  2274      ;
  2275  
  2276  caseFuncAlternative
  2277      : WHEN condition=functionArg
  2278        THEN consequent=functionArg
  2279      ;
  2280  
  2281  levelsInWeightString
  2282      : LEVEL levelInWeightListElement
  2283        (',' levelInWeightListElement)*                               #levelWeightList
  2284      | LEVEL
  2285        firstLevel=decimalLiteral '-' lastLevel=decimalLiteral        #levelWeightRange
  2286      ;
  2287  
  2288  levelInWeightListElement
  2289      : decimalLiteral orderType=(ASC | DESC | REVERSE)?
  2290      ;
  2291  
  2292  aggregateWindowedFunction
  2293      : (AVG | MAX | MIN | SUM)
  2294        '(' aggregator=(ALL | DISTINCT)? functionArg ')'
  2295      | COUNT '(' (starArg='*' | aggregator=ALL? functionArg) ')'
  2296      | COUNT '(' aggregator=DISTINCT functionArgs ')'
  2297      | (
  2298          BIT_AND | BIT_OR | BIT_XOR | STD | STDDEV | STDDEV_POP
  2299          | STDDEV_SAMP | VAR_POP | VAR_SAMP | VARIANCE
  2300        ) '(' aggregator=ALL? functionArg ')'
  2301      | GROUP_CONCAT '('
  2302          aggregator=DISTINCT? functionArgs
  2303          (ORDER BY
  2304            orderByExpression (',' orderByExpression)*
  2305          )? (SEPARATOR separator=STRING_LITERAL)?
  2306        ')'
  2307      ;
  2308  
  2309  scalarFunctionName
  2310      : functionNameBase
  2311      | ASCII | CURDATE | CURRENT_DATE | CURRENT_TIME
  2312      | CURRENT_TIMESTAMP | CURTIME | DATE_ADD | DATE_SUB
  2313      | IF | INSERT | LOCALTIME | LOCALTIMESTAMP | MID | NOW
  2314      | REPLACE | SUBSTR | SUBSTRING | SYSDATE | TRIM
  2315      | UTC_DATE | UTC_TIME | UTC_TIMESTAMP
  2316      ;
  2317  
  2318  passwordFunctionClause
  2319      : functionName=(PASSWORD | OLD_PASSWORD) '(' functionArg ')'
  2320      ;
  2321  
  2322  functionArgs
  2323      : (constant | fullColumnName | functionCall | expression)
  2324      (
  2325        ','
  2326        (constant | fullColumnName | functionCall | expression)
  2327      )*
  2328      ;
  2329  
  2330  functionArg
  2331      : constant | fullColumnName | functionCall | expression
  2332      ;
  2333  
  2334  
  2335  //    Expressions, predicates
  2336  
  2337  // Simplified approach for expression
  2338  expression
  2339      : notOperator=(NOT | '!') expression                            #notExpression
  2340      | expression logicalOperator expression                         #logicalExpression
  2341      | predicate IS NOT? testValue=(TRUE | FALSE | UNKNOWN)          #isExpression
  2342      | predicate                                                     #predicateExpression
  2343      ;
  2344  
  2345  predicate
  2346      : predicate NOT? IN '(' (selectStatement | expressions) ')'     #inPredicate
  2347      | predicate IS nullNotnull                                      #isNullPredicate
  2348      | left=predicate comparisonOperator right=predicate             #binaryComparisonPredicate
  2349      | predicate comparisonOperator
  2350        quantifier=(ALL | ANY | SOME) '(' selectStatement ')'         #subqueryComparisonPredicate
  2351      | predicate NOT? BETWEEN predicate AND predicate                #betweenPredicate
  2352      | predicate SOUNDS LIKE predicate                               #soundsLikePredicate
  2353      | predicate NOT? LIKE predicate (ESCAPE STRING_LITERAL)?        #likePredicate
  2354      | predicate NOT? regex=(REGEXP | RLIKE) predicate               #regexpPredicate
  2355      | (LOCAL_ID VAR_ASSIGN)? expressionAtom                         #expressionAtomPredicate
  2356      | predicate MEMBER OF '(' predicate ')'                         #jsonMemberOfPredicate
  2357      ;
  2358  
  2359  
  2360  // Add in ASTVisitor nullNotnull in constant
  2361  expressionAtom
  2362      : constant                                                      #constantExpressionAtom
  2363      | fullColumnName                                                #fullColumnNameExpressionAtom
  2364      | functionCall                                                  #functionCallExpressionAtom
  2365      | expressionAtom COLLATE collationName                          #collateExpressionAtom
  2366      | mysqlVariable                                                 #mysqlVariableExpressionAtom
  2367      | unaryOperator expressionAtom                                  #unaryExpressionAtom
  2368      | BINARY expressionAtom                                         #binaryExpressionAtom
  2369      | '(' expression (',' expression)* ')'                          #nestedExpressionAtom
  2370      | ROW '(' expression (',' expression)+ ')'                      #nestedRowExpressionAtom
  2371      | EXISTS '(' selectStatement ')'                                #existsExpressionAtom
  2372      | '(' selectStatement ')'                                       #subqueryExpressionAtom
  2373      | INTERVAL expression intervalType                              #intervalExpressionAtom
  2374      | left=expressionAtom bitOperator right=expressionAtom          #bitExpressionAtom
  2375      | left=expressionAtom mathOperator right=expressionAtom         #mathExpressionAtom
  2376      | left=expressionAtom jsonOperator right=expressionAtom         #jsonExpressionAtom
  2377      ;
  2378  
  2379  unaryOperator
  2380      : '!' | '~' | '+' | '-' | NOT
  2381      ;
  2382  
  2383  comparisonOperator
  2384      : '=' | '>' | '<' | '<' '=' | '>' '='
  2385      | '<' '>' | '!' '=' | '<' '=' '>'
  2386      ;
  2387  
  2388  logicalOperator
  2389      : AND | '&' '&' | XOR | OR | '|' '|'
  2390      ;
  2391  
  2392  bitOperator
  2393      : '<' '<' | '>' '>' | '&' | '^' | '|'
  2394      ;
  2395  
  2396  mathOperator
  2397      : '*' | '/' | '%' | DIV | MOD | '+' | '-' | '--'
  2398      ;
  2399  
  2400  jsonOperator
  2401      : '-' '>' | '-' '>' '>'
  2402      ;
  2403  
  2404  //    Simple id sets
  2405  //     (that keyword, which can be id)
  2406  
  2407  charsetNameBase
  2408      : ARMSCII8 | ASCII | BIG5 | CP1250 | CP1251 | CP1256 | CP1257
  2409      | CP850 | CP852 | CP866 | CP932 | DEC8 | EUCJPMS | EUCKR
  2410      | GB2312 | GBK | GEOSTD8 | GREEK | HEBREW | HP8 | KEYBCS2
  2411      | KOI8R | KOI8U | LATIN1 | LATIN2 | LATIN5 | LATIN7 | MACCE
  2412      | MACROMAN | SJIS | SWE7 | TIS620 | UCS2 | UJIS | UTF16
  2413      | UTF16LE | UTF32 | UTF8 | UTF8MB3 | UTF8MB4
  2414      ;
  2415  
  2416  transactionLevelBase
  2417      : REPEATABLE | COMMITTED | UNCOMMITTED | SERIALIZABLE
  2418      ;
  2419  
  2420  privilegesBase
  2421      : TABLES | ROUTINE | EXECUTE | FILE | PROCESS
  2422      | RELOAD | SHUTDOWN | SUPER | PRIVILEGES
  2423      ;
  2424  
  2425  intervalTypeBase
  2426      : QUARTER | MONTH | DAY | HOUR
  2427      | MINUTE | WEEK | SECOND | MICROSECOND
  2428      ;
  2429  
  2430  dataTypeBase
  2431      : DATE | TIME | TIMESTAMP | DATETIME | YEAR | ENUM | TEXT
  2432      ;
  2433  
  2434  keywordsCanBeId
  2435      : ACCOUNT | ACTION | AFTER | AGGREGATE | ALGORITHM | ANY
  2436      | AT | AUDIT_ADMIN | AUTHORS | AUTOCOMMIT | AUTOEXTEND_SIZE
  2437      | AUTO_INCREMENT | AVG | AVG_ROW_LENGTH | BACKUP_ADMIN | BEGIN | BINLOG | BINLOG_ADMIN | BINLOG_ENCRYPTION_ADMIN | BIT | BIT_AND | BIT_OR | BIT_XOR
  2438      | BLOCK | BOOL | BOOLEAN | BTREE | CACHE | CASCADED | CHAIN | CHANGED
  2439      | CHANNEL | CHECKSUM | PAGE_CHECKSUM | CATALOG_NAME | CIPHER
  2440      | CLASS_ORIGIN | CLIENT | CLONE_ADMIN | CLOSE | COALESCE | CODE
  2441      | COLUMNS | COLUMN_FORMAT | COLUMN_NAME | COMMENT | COMMIT | COMPACT
  2442      | COMPLETION | COMPRESSED | COMPRESSION | CONCURRENT
  2443      | CONNECTION | CONNECTION_ADMIN | CONSISTENT | CONSTRAINT_CATALOG | CONSTRAINT_NAME
  2444      | CONSTRAINT_SCHEMA | CONTAINS | CONTEXT
  2445      | CONTRIBUTORS | COPY | COUNT | CPU | CURRENT | CURSOR_NAME
  2446      | DATA | DATAFILE | DEALLOCATE
  2447      | DEFAULT_AUTH | DEFINER | DELAY_KEY_WRITE | DES_KEY_FILE | DIAGNOSTICS | DIRECTORY
  2448      | DISABLE | DISCARD | DISK | DO | DUMPFILE | DUPLICATE
  2449      | DYNAMIC | ENABLE | ENCRYPTION | ENCRYPTION_KEY_ADMIN | END | ENDS | ENGINE | ENGINES
  2450      | ERROR | ERRORS | ESCAPE | EVEN | EVENT | EVENTS | EVERY
  2451      | EXCHANGE | EXCLUSIVE | EXPIRE | EXPORT | EXTENDED | EXTENT_SIZE | FAST | FAULTS
  2452      | FIELDS | FILE_BLOCK_SIZE | FILTER | FIREWALL_ADMIN | FIREWALL_USER | FIRST | FIXED | FLUSH
  2453      | FOLLOWS | FOUND | FULL | FUNCTION | GENERAL | GLOBAL | GRANTS | GROUP | GROUP_CONCAT
  2454      | GROUP_REPLICATION | GROUP_REPLICATION_ADMIN | HANDLER | HASH | HELP | HOST | HOSTS | IDENTIFIED
  2455      | IGNORE_SERVER_IDS | IMPORT | INDEXES | INITIAL_SIZE | INNODB_REDO_LOG_ARCHIVE
  2456      | INPLACE | INSERT_METHOD | INSTALL | INSTANCE | INTERNAL | INVOKER | IO
  2457      | IO_THREAD | IPC | ISOLATION | ISSUER | JSON | KEY_BLOCK_SIZE
  2458      | LANGUAGE | LAST | LEAVES | LESS | LEVEL | LIST | LOCAL
  2459      | LOGFILE | LOGS | MASTER | MASTER_AUTO_POSITION
  2460      | MASTER_CONNECT_RETRY | MASTER_DELAY
  2461      | MASTER_HEARTBEAT_PERIOD | MASTER_HOST | MASTER_LOG_FILE
  2462      | MASTER_LOG_POS | MASTER_PASSWORD | MASTER_PORT
  2463      | MASTER_RETRY_COUNT | MASTER_SSL | MASTER_SSL_CA
  2464      | MASTER_SSL_CAPATH | MASTER_SSL_CERT | MASTER_SSL_CIPHER
  2465      | MASTER_SSL_CRL | MASTER_SSL_CRLPATH | MASTER_SSL_KEY
  2466      | MASTER_TLS_VERSION | MASTER_USER
  2467      | MAX_CONNECTIONS_PER_HOUR | MAX_QUERIES_PER_HOUR
  2468      | MAX | MAX_ROWS | MAX_SIZE | MAX_UPDATES_PER_HOUR
  2469      | MAX_USER_CONNECTIONS | MEDIUM | MEMBER | MEMORY | MERGE | MESSAGE_TEXT
  2470      | MID | MIGRATE
  2471      | MIN | MIN_ROWS | MODE | MODIFY | MUTEX | MYSQL | MYSQL_ERRNO | NAME | NAMES
  2472      | NCHAR | NDB_STORED_USER | NEVER | NEXT | NO | NODEGROUP | NONE | NUMBER | OFFLINE | OFFSET
  2473      | OF | OJ | OLD_PASSWORD | ONE | ONLINE | ONLY | OPEN | OPTIMIZER_COSTS
  2474      | OPTIONS | ORDER | OWNER | PACK_KEYS | PAGE | PARSER | PARTIAL
  2475      | PARTITIONING | PARTITIONS | PASSWORD | PERSIST_RO_VARIABLES_ADMIN | PHASE | PLUGINS
  2476      | PLUGIN_DIR | PLUGIN | PORT | PRECEDES | PREPARE | PRESERVE | PREV
  2477      | PROCESSLIST | PROFILE | PROFILES | PROXY | QUERY | QUICK
  2478      | REBUILD | RECOVER | REDO_BUFFER_SIZE | REDUNDANT
  2479      | RELAY | RELAYLOG | RELAY_LOG_FILE | RELAY_LOG_POS | REMOVE
  2480      | REORGANIZE | REPAIR | REPLICATE_DO_DB | REPLICATE_DO_TABLE
  2481      | REPLICATE_IGNORE_DB | REPLICATE_IGNORE_TABLE
  2482      | REPLICATE_REWRITE_DB | REPLICATE_WILD_DO_TABLE
  2483      | REPLICATE_WILD_IGNORE_TABLE | REPLICATION | REPLICATION_APPLIER | REPLICATION_SLAVE_ADMIN | RESET
  2484      | RESOURCE_GROUP_ADMIN | RESOURCE_GROUP_USER | RESUME
  2485      | RETURNED_SQLSTATE | RETURNS | ROLE | ROLE_ADMIN | ROLLBACK | ROLLUP | ROTATE | ROW | ROWS
  2486      | ROW_FORMAT | SAVEPOINT | SCHEDULE | SCHEMA_NAME | SECURITY | SERIAL | SERVER
  2487      | SESSION | SESSION_VARIABLES_ADMIN | SET_USER_ID | SHARE | SHARED | SHOW_ROUTINE | SIGNED | SIMPLE | SLAVE
  2488      | SLOW | SNAPSHOT | SOCKET | SOME | SONAME | SOUNDS | SOURCE
  2489      | SQL_AFTER_GTIDS | SQL_AFTER_MTS_GAPS | SQL_BEFORE_GTIDS
  2490      | SQL_BUFFER_RESULT | SQL_CACHE | SQL_NO_CACHE | SQL_THREAD
  2491      | STACKED | START | STARTS | STATS_AUTO_RECALC | STATS_PERSISTENT
  2492      | STATS_SAMPLE_PAGES | STATUS | STD | STDDEV | STDDEV_POP | STDDEV_SAMP | STOP | STORAGE | STRING
  2493      | SUBCLASS_ORIGIN | SUBJECT | SUBPARTITION | SUBPARTITIONS | SUM | SUSPEND | SWAPS
  2494      | SWITCHES | SYSTEM_VARIABLES_ADMIN | TABLE_NAME | TABLESPACE | TABLE_ENCRYPTION_ADMIN
  2495      | TEMPORARY | TEMPTABLE | THAN | TRADITIONAL
  2496      | TRANSACTION | TRANSACTIONAL | TRIGGERS | TRUNCATE | UNDEFINED | UNDOFILE
  2497      | UNDO_BUFFER_SIZE | UNINSTALL | UNKNOWN | UNTIL | UPGRADE | USER | USE_FRM | USER_RESOURCES
  2498      | VALIDATION | VALUE | VAR_POP | VAR_SAMP | VARIABLES | VARIANCE | VERSION_TOKEN_ADMIN | VIEW | WAIT | WARNINGS | WITHOUT
  2499      | WORK | WRAPPER | X509 | XA | XA_RECOVER_ADMIN | XML
  2500      ;
  2501  
  2502  functionNameBase
  2503      : ABS | ACOS | ADDDATE | ADDTIME | AES_DECRYPT | AES_ENCRYPT
  2504      | AREA | ASBINARY | ASIN | ASTEXT | ASWKB | ASWKT
  2505      | ASYMMETRIC_DECRYPT | ASYMMETRIC_DERIVE
  2506      | ASYMMETRIC_ENCRYPT | ASYMMETRIC_SIGN | ASYMMETRIC_VERIFY
  2507      | ATAN | ATAN2 | BENCHMARK | BIN | BIT_COUNT | BIT_LENGTH
  2508      | BUFFER | CEIL | CEILING | CENTROID | CHARACTER_LENGTH
  2509      | CHARSET | CHAR_LENGTH | COERCIBILITY | COLLATION
  2510      | COMPRESS | CONCAT | CONCAT_WS | CONNECTION_ID | CONV
  2511      | CONVERT_TZ | COS | COT | COUNT | CRC32
  2512      | CREATE_ASYMMETRIC_PRIV_KEY | CREATE_ASYMMETRIC_PUB_KEY
  2513      | CREATE_DH_PARAMETERS | CREATE_DIGEST | CROSSES | DATABASE | DATE
  2514      | DATEDIFF | DATE_FORMAT | DAY | DAYNAME | DAYOFMONTH
  2515      | DAYOFWEEK | DAYOFYEAR | DECODE | DEGREES | DES_DECRYPT
  2516      | DES_ENCRYPT | DIMENSION | DISJOINT | ELT | ENCODE
  2517      | ENCRYPT | ENDPOINT | ENVELOPE | EQUALS | EXP | EXPORT_SET
  2518      | EXTERIORRING | EXTRACTVALUE | FIELD | FIND_IN_SET | FLOOR
  2519      | FORMAT | FOUND_ROWS | FROM_BASE64 | FROM_DAYS
  2520      | FROM_UNIXTIME | GEOMCOLLFROMTEXT | GEOMCOLLFROMWKB
  2521      | GEOMETRYCOLLECTION | GEOMETRYCOLLECTIONFROMTEXT
  2522      | GEOMETRYCOLLECTIONFROMWKB | GEOMETRYFROMTEXT
  2523      | GEOMETRYFROMWKB | GEOMETRYN | GEOMETRYTYPE | GEOMFROMTEXT
  2524      | GEOMFROMWKB | GET_FORMAT | GET_LOCK | GLENGTH | GREATEST
  2525      | GTID_SUBSET | GTID_SUBTRACT | HEX | HOUR | IFNULL
  2526      | INET6_ATON | INET6_NTOA | INET_ATON | INET_NTOA | INSTR
  2527      | INTERIORRINGN | INTERSECTS | INVISIBLE
  2528      | ISCLOSED | ISEMPTY | ISNULL
  2529      | ISSIMPLE | IS_FREE_LOCK | IS_IPV4 | IS_IPV4_COMPAT
  2530      | IS_IPV4_MAPPED | IS_IPV6 | IS_USED_LOCK | LAST_INSERT_ID
  2531      | LCASE | LEAST | LEFT | LENGTH | LINEFROMTEXT | LINEFROMWKB
  2532      | LINESTRING | LINESTRINGFROMTEXT | LINESTRINGFROMWKB | LN
  2533      | LOAD_FILE | LOCATE | LOG | LOG10 | LOG2 | LOWER | LPAD
  2534      | LTRIM | MAKEDATE | MAKETIME | MAKE_SET | MASTER_POS_WAIT
  2535      | MBRCONTAINS | MBRDISJOINT | MBREQUAL | MBRINTERSECTS
  2536      | MBROVERLAPS | MBRTOUCHES | MBRWITHIN | MD5 | MICROSECOND
  2537      | MINUTE | MLINEFROMTEXT | MLINEFROMWKB | MOD| MONTH | MONTHNAME
  2538      | MPOINTFROMTEXT | MPOINTFROMWKB | MPOLYFROMTEXT
  2539      | MPOLYFROMWKB | MULTILINESTRING | MULTILINESTRINGFROMTEXT
  2540      | MULTILINESTRINGFROMWKB | MULTIPOINT | MULTIPOINTFROMTEXT
  2541      | MULTIPOINTFROMWKB | MULTIPOLYGON | MULTIPOLYGONFROMTEXT
  2542      | MULTIPOLYGONFROMWKB | NAME_CONST | NULLIF | NUMGEOMETRIES
  2543      | NUMINTERIORRINGS | NUMPOINTS | OCT | OCTET_LENGTH | ORD
  2544      | OVERLAPS | PERIOD_ADD | PERIOD_DIFF | PI | POINT
  2545      | POINTFROMTEXT | POINTFROMWKB | POINTN | POLYFROMTEXT
  2546      | POLYFROMWKB | POLYGON | POLYGONFROMTEXT | POLYGONFROMWKB
  2547      | POSITION| POW | POWER | QUARTER | QUOTE | RADIANS | RAND
  2548      | RANDOM_BYTES | RELEASE_LOCK | REVERSE | RIGHT | ROUND
  2549      | ROW_COUNT | RPAD | RTRIM | SECOND | SEC_TO_TIME
  2550      | SCHEMA | SESSION_USER | SESSION_VARIABLES_ADMIN
  2551      | SHA | SHA1 | SHA2 | SIGN | SIN | SLEEP
  2552      | SOUNDEX | SQL_THREAD_WAIT_AFTER_GTIDS | SQRT | SRID
  2553      | STARTPOINT | STRCMP | STR_TO_DATE | ST_AREA | ST_ASBINARY
  2554      | ST_ASTEXT | ST_ASWKB | ST_ASWKT | ST_BUFFER | ST_CENTROID
  2555      | ST_CONTAINS | ST_CROSSES | ST_DIFFERENCE | ST_DIMENSION
  2556      | ST_DISJOINT | ST_DISTANCE | ST_ENDPOINT | ST_ENVELOPE
  2557      | ST_EQUALS | ST_EXTERIORRING | ST_GEOMCOLLFROMTEXT
  2558      | ST_GEOMCOLLFROMTXT | ST_GEOMCOLLFROMWKB
  2559      | ST_GEOMETRYCOLLECTIONFROMTEXT
  2560      | ST_GEOMETRYCOLLECTIONFROMWKB | ST_GEOMETRYFROMTEXT
  2561      | ST_GEOMETRYFROMWKB | ST_GEOMETRYN | ST_GEOMETRYTYPE
  2562      | ST_GEOMFROMTEXT | ST_GEOMFROMWKB | ST_INTERIORRINGN
  2563      | ST_INTERSECTION | ST_INTERSECTS | ST_ISCLOSED | ST_ISEMPTY
  2564      | ST_ISSIMPLE | ST_LINEFROMTEXT | ST_LINEFROMWKB
  2565      | ST_LINESTRINGFROMTEXT | ST_LINESTRINGFROMWKB
  2566      | ST_NUMGEOMETRIES | ST_NUMINTERIORRING
  2567      | ST_NUMINTERIORRINGS | ST_NUMPOINTS | ST_OVERLAPS
  2568      | ST_POINTFROMTEXT | ST_POINTFROMWKB | ST_POINTN
  2569      | ST_POLYFROMTEXT | ST_POLYFROMWKB | ST_POLYGONFROMTEXT
  2570      | ST_POLYGONFROMWKB | ST_SRID | ST_STARTPOINT
  2571      | ST_SYMDIFFERENCE | ST_TOUCHES | ST_UNION | ST_WITHIN
  2572      | ST_X | ST_Y | SUBDATE | SUBSTRING_INDEX | SUBTIME
  2573      | SYSTEM_USER | TAN | TIME | TIMEDIFF | TIMESTAMP
  2574      | TIMESTAMPADD | TIMESTAMPDIFF | TIME_FORMAT | TIME_TO_SEC
  2575      | TOUCHES | TO_BASE64 | TO_DAYS | TO_SECONDS | UCASE
  2576      | UNCOMPRESS | UNCOMPRESSED_LENGTH | UNHEX | UNIX_TIMESTAMP
  2577      | UPDATEXML | UPPER | UUID | UUID_SHORT
  2578      | VALIDATE_PASSWORD_STRENGTH | VERSION | VISIBLE
  2579      | WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS | WEEK | WEEKDAY
  2580      | WEEKOFYEAR | WEIGHT_STRING | WITHIN | YEAR | YEARWEEK
  2581      | Y_FUNCTION | X_FUNCTION
  2582      | JSON_ARRAY | JSON_OBJECT | JSON_QUOTE | JSON_CONTAINS | JSON_CONTAINS_PATH
  2583      | JSON_EXTRACT | JSON_KEYS | JSON_OVERLAPS | JSON_SEARCH | JSON_VALUE
  2584      | JSON_ARRAY_APPEND | JSON_ARRAY_INSERT | JSON_INSERT | JSON_MERGE
  2585      | JSON_MERGE_PATCH | JSON_MERGE_PRESERVE | JSON_REMOVE | JSON_REPLACE
  2586      | JSON_SET | JSON_UNQUOTE | JSON_DEPTH | JSON_LENGTH | JSON_TYPE
  2587      | JSON_VALID | JSON_TABLE | JSON_SCHEMA_VALID | JSON_SCHEMA_VALIDATION_REPORT
  2588      | JSON_PRETTY | JSON_STORAGE_FREE | JSON_STORAGE_SIZE | JSON_ARRAYAGG
  2589      | JSON_OBJECTAGG
  2590      ;