Skip to content

Grammar railroad diagram #283

Description

@mingodad

Using this tool https://www.bottlecaps.de/ebnf-convert/ and https://github.com/GuntherRademacher/rr we can have a nice navigable railroad diagram for the grammar in this project (see bellow with instructions at the top).

I hope that this can help document/develop the grammar.

I've also added this project grammar to https://mingodad.github.io/parsertl-playground/playground/ an Yacc/Lex like online interpreter/editor (select GAEA-QL parser (be patient)(partially working) from Examples then click Parse to see a parse tree for the content in Input source).

//
// EBNF to be viewd at
//    (IPV6) https://www.bottlecaps.de/rr/ui
//    (IPV4) https://rr.red-dove.com/ui
//
// Copy and paste this at one of the urls shown above in the 'Edit Grammar' tab
// then click the 'View Diagram' tab.
//

Start::=
	  StatementList

AlterTableStmt::=
	  alter IgnoreOptional tableKwd TableName AlterTableSpecList
	| alter IgnoreOptional tableKwd TableName analyze partition PartitionNameList MaxNumBuckets
	| alter IgnoreOptional tableKwd TableName analyze partition PartitionNameList index IndexNameList MaxNumBuckets

AlterTableSpec::=
	  AlterTableOptionListOpt
	| convert to CharsetKw CharsetName OptCollate
	| add ColumnKeywordOpt ColumnDef ColumnPosition
	| add ColumnKeywordOpt '(' ColumnDefList ')'
	| add Constraint
	| add partition PartitionDefinitionListOpt
	| add partition partitions NUM
	| coalesce partition NUM
	| drop ColumnKeywordOpt ColumnName RestrictOrCascadeOpt
	| drop primary key
	| drop partition Identifier
	| truncate partition Identifier
	| drop KeyOrIndex Identifier
	| drop foreign key Symbol
	| disable keys
	| enable keys
	| modify ColumnKeywordOpt ColumnDef ColumnPosition
	| change ColumnKeywordOpt ColumnName ColumnDef ColumnPosition
	| alter ColumnKeywordOpt ColumnName set defaultKwd SignedLiteral
	| alter ColumnKeywordOpt ColumnName drop defaultKwd
	| rename to TableName
	| rename TableName
	| rename as TableName
	| rename KeyOrIndex Identifier to Identifier
	| LockClause
	| algorithm EqOpt AlterAlgorithm
	| force

AlterAlgorithm::=
	  defaultKwd
	| copyKwd
	| inplace
	| instant

LockClauseOpt::=
	  /*%empty*/
	| LockClause

LockClause::=
	  lock eq none
	| lock eq defaultKwd
	| lock eq shared
	| lock eq exclusive

KeyOrIndex::=
	  key
	| index

KeyOrIndexOpt::=
	  /*%empty*/
	| KeyOrIndex

ColumnKeywordOpt::=
	  /*%empty*/
	| column

ColumnPosition::=
	  /*%empty*/
	| first
	| after ColumnName

AlterTableSpecList::=
	  AlterTableSpec
	| AlterTableSpecList ',' AlterTableSpec

PartitionNameList::=
	  Identifier
	| PartitionNameList ',' Identifier

ConstraintKeywordOpt::=
	  /*%empty*/
	| constraint
	| constraint Symbol

Symbol::=
	  Identifier

RenameTableStmt::=
	  rename tableKwd TableToTableList

TableToTableList::=
	  TableToTable
	| TableToTableList ',' TableToTable

TableToTable::=
	  TableName to TableName

AnalyzeTableStmt::=
	  analyze tableKwd TableNameList MaxNumBuckets
	| analyze tableKwd TableName index IndexNameList MaxNumBuckets
	| analyze tableKwd TableName partition PartitionNameList MaxNumBuckets
	| analyze tableKwd TableName partition PartitionNameList index IndexNameList MaxNumBuckets

MaxNumBuckets::=
	  /*%empty*/
	| with NUM buckets

Assignment::=
	  ColumnName eq Expression

AssignmentList::=
	  Assignment
	| AssignmentList ',' Assignment

BeginTransactionStmt::=
	  begin
	| start transaction
	| start transaction with consistent snapshot

BinlogStmt::=
	  binlog stringLit

ColumnDefList::=
	  ColumnDef
	| ColumnDefList ',' ColumnDef

ColumnDef::=
	  ColumnName Type ColumnOptionListOpt

ColumnName::=
	  Identifier
	| Identifier '.' Identifier
	| Identifier '.' Identifier '.' Identifier

ColumnNameList::=
	  ColumnName
	| ColumnNameList ',' ColumnName

ColumnNameListOpt::=
	  /*%empty*/
	| ColumnNameList

ColumnNameListOptWithBrackets::=
	  /*%empty*/
	| '(' ColumnNameListOpt ')'

CommitOpt::=
	  work
	| work and no chain no release
	| work and chain no release
	| work and no chain release
	| work no release
	| work release
	| and no chain no release
	| and chain no release
	| and no chain release
	| no release
	| release

CommitStmt::=
	  commit
	| commit CommitOpt

PrimaryOpt::=
	  /*%empty*/
	| primary

ColumnOption::=
	  not null
	| null
	| autoIncrement
	| PrimaryOpt key
	| unique
	| unique key
	| defaultKwd DefaultValueExpr
	| on update NowSymOptionFraction
	| comment stringLit
	| check '(' Expression ')'
	| GeneratedAlways as '(' Expression ')' VirtualOrStored
	| ReferDef

GeneratedAlways::=
	  /*%empty*/
	| generated always

VirtualOrStored::=
	  /*%empty*/
	| virtual
	| stored

ColumnOptionList::=
	  ColumnOption
	| ColumnOptionList ColumnOption

ColumnOptionListOpt::=
	  /*%empty*/
	| ColumnOptionList

ConstraintElem::=
	  primary key IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList
	| fulltext KeyOrIndexOpt IndexName '(' IndexColNameList ')' IndexOptionList
	| KeyOrIndex IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList
	| unique KeyOrIndexOpt IndexName IndexTypeOpt '(' IndexColNameList ')' IndexOptionList
	| foreign key IndexName '(' IndexColNameList ')' ReferDef

ReferDef::=
	  references TableName '(' IndexColNameList ')' OnDeleteOpt OnUpdateOpt

OnDeleteOpt::=
	  /*%empty*/
	| on deleteKwd ReferOpt

OnUpdateOpt::=
	  /*%empty*/
	| on update ReferOpt

ReferOpt::=
	  restrict
	| cascade
	| set null
	| no action

DefaultValueExpr::=
	  NowSymOptionFraction
	| SignedLiteral

NowSymOptionFraction::=
	  NowSym
	| NowSymFunc '(' ')'
	| NowSymFunc '(' NUM ')'

NowSymFunc::=
	  currentTs
	| localTime
	| localTs
	| builtinNow

NowSym::=
	  currentTs
	| localTime
	| localTs

SignedLiteral::=
	  Literal
	| '+' NumLiteral
	| '-' NumLiteral

NumLiteral::=
	  intLit
	| floatLit
	| decLit

CreateIndexStmt::=
	  create CreateIndexStmtUnique index Identifier IndexTypeOpt on TableName '(' IndexColNameList ')' IndexOptionList LockClauseOpt

CreateIndexStmtUnique::=
	  /*%empty*/
	| unique

IndexColName::=
	  ColumnName OptFieldLen Order

IndexColNameList::=
	  IndexColName
	| IndexColNameList ',' IndexColName

CreateDatabaseStmt::=
	  create DatabaseSym IfNotExists DBName DatabaseOptionListOpt

DBName::=
	  Identifier

DatabaseOption::=
	  DefaultKwdOpt CharsetKw EqOpt CharsetName
	| DefaultKwdOpt collate EqOpt StringName

DatabaseOptionListOpt::=
	  /*%empty*/
	| DatabaseOptionList

DatabaseOptionList::=
	  DatabaseOption
	| DatabaseOptionList DatabaseOption

CreateTableStmt::=
	  create tableKwd IfNotExists TableName TableElementListOpt CreateTableOptionListOpt PartitionOpt DuplicateOpt AsOpt CreateTableSelectOpt
	| create tableKwd IfNotExists TableName LikeTableWithOrWithoutParen

DefaultKwdOpt::=
	  /*%empty*/
	| defaultKwd

PartitionOpt::=
	  /*%empty*/
	| partition by key '(' ColumnNameList ')' PartitionNumOpt PartitionDefinitionListOpt
	| partition by hash '(' Expression ')' PartitionNumOpt
	| partition by rangeKwd '(' Expression ')' PartitionNumOpt SubPartitionOpt PartitionDefinitionListOpt
	| partition by rangeKwd columns '(' ColumnNameList ')' PartitionNumOpt PartitionDefinitionListOpt

SubPartitionOpt::=
	  /*%empty*/
	| subpartition by hash '(' Expression ')' SubPartitionNumOpt
	| subpartition by key '(' ColumnNameList ')' SubPartitionNumOpt

SubPartitionNumOpt::=
	  /*%empty*/
	| subpartitions NUM

PartitionNumOpt::=
	  /*%empty*/
	| partitions NUM

PartitionDefinitionListOpt::=
	  /*%empty*/
	| '(' PartitionDefinitionList ')'

PartitionDefinitionList::=
	  PartitionDefinition
	| PartitionDefinitionList ',' PartitionDefinition

PartitionDefinition::=
	  partition Identifier PartDefValuesOpt PartDefOptionsOpt

PartDefOptionsOpt::=
	  /*%empty*/
	| PartDefOptionList

PartDefOptionList::=
	  PartDefOption
	| PartDefOptionList PartDefOption

PartDefOption::=
	  comment EqOpt stringLit
	| engine EqOpt Identifier
	| tablespace EqOpt Identifier

PartDefValuesOpt::=
	  /*%empty*/
	| values less than maxValue
	| values less than '(' MaxValueOrExpressionList ')'

DuplicateOpt::=
	  /*%empty*/
	| ignore
	| replace

AsOpt::=
	  /*%empty*/
	| as

CreateTableSelectOpt::=
	  /*%empty*/
	| SelectStmt
	| UnionStmt
	| SubSelect

LikeTableWithOrWithoutParen::=
	  like TableName
	| '(' like TableName ')'

CreateViewStmt::=
	  create OrReplace ViewAlgorithm ViewDefiner ViewSQLSecurity view ViewName ViewFieldList as SelectStmt ViewCheckOption

OrReplace::=
	  /*%empty*/
	| or replace

ViewAlgorithm::=
	  /*%empty*/
	| algorithm eq undefined
	| algorithm eq merge
	| algorithm eq temptable

ViewDefiner::=
	  /*%empty*/
	| definer eq Username

ViewSQLSecurity::=
	  /*%empty*/
	| sql security definer
	| sql security invoker

ViewName::=
	  TableName

ViewFieldList::=
	  /*%empty*/
	| '(' ColumnList ')'

ColumnList::=
	  Identifier
	| ColumnList ',' Identifier

ViewCheckOption::=
	  /*%empty*/
	| with cascaded check option
	| with local check option

DoStmt::=
	  do ExpressionList

DeleteFromStmt::=
	  deleteKwd TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional from TableName IndexHintListOpt WhereClauseOptional OrderByOptional LimitClause
	| deleteKwd TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional TableNameList from TableRefs WhereClauseOptional
	| deleteKwd TableOptimizerHints PriorityOpt QuickOptional IgnoreOptional from TableNameList using TableRefs WhereClauseOptional

DatabaseSym::=
	  database

DropDatabaseStmt::=
	  drop DatabaseSym IfExists DBName

DropIndexStmt::=
	  drop index IfExists Identifier on TableName

DropTableStmt::=
	  drop TableOrTables TableNameList RestrictOrCascadeOpt
	| drop TableOrTables ifKwd exists TableNameList RestrictOrCascadeOpt

DropViewStmt::=
	  drop view TableNameList RestrictOrCascadeOpt
	| drop view ifKwd exists TableNameList RestrictOrCascadeOpt

DropUserStmt::=
	  drop user UsernameList
	| drop user ifKwd exists UsernameList

DropRoleStmt::=
	  drop role RolenameList
	| drop role ifKwd exists RolenameList

DropStatsStmt::=
	  drop stats TableName

RestrictOrCascadeOpt::=
	  /*%empty*/
	| restrict
	| cascade

TableOrTables::=
	  tableKwd
	| tables

EqOpt::=
	  /*%empty*/
	| eq

EmptyStmt::=
	  /*%empty*/

TraceStmt::=
	  trace TraceableStmt
	| trace format eq stringLit TraceableStmt

ExplainSym::=
	  explain
	| describe
	| desc

ExplainStmt::=
	  ExplainSym TableName
	| ExplainSym TableName ColumnName
	| ExplainSym ExplainableStmt
	| ExplainSym format eq stringLit ExplainableStmt
	| ExplainSym analyze ExplainableStmt

LengthNum::=
	  NUM

NUM::=
	  intLit

Expression::=
	  singleAtIdentifier assignmentEq Expression
	| Expression logOr Expression
	| Expression xor Expression
	| Expression logAnd Expression
	| not Expression
	| BoolPri IsOrNotOp trueKwd
	| BoolPri IsOrNotOp falseKwd
	| BoolPri IsOrNotOp unknown
	| BoolPri

MaxValueOrExpression::=
	  maxValue
	| Expression

logOr::=
	  pipesAsOr
	| or

logAnd::=
	  andand
	| and

ExpressionList::=
	  Expression
	| ExpressionList ',' Expression

MaxValueOrExpressionList::=
	  MaxValueOrExpression
	| MaxValueOrExpressionList ',' MaxValueOrExpression

ExpressionListOpt::=
	  /*%empty*/
	| ExpressionList

FuncDatetimePrecListOpt::=
	  /*%empty*/
	| FuncDatetimePrecList

FuncDatetimePrecList::=
	  intLit

BoolPri::=
	  BoolPri IsOrNotOp null
	| BoolPri CompareOp PredicateExpr
	| BoolPri CompareOp AnyOrAll SubSelect
	| BoolPri CompareOp singleAtIdentifier assignmentEq PredicateExpr
	| PredicateExpr

CompareOp::=
	  ge
	| '>'
	| le
	| '<'
	| neq
	| neqSynonym
	| eq
	| nulleq

BetweenOrNotOp::=
	  between
	| not between

IsOrNotOp::=
	  is
	| is not

InOrNotOp::=
	  in
	| not in

LikeOrNotOp::=
	  like
	| not like

RegexpOrNotOp::=
	  RegexpSym
	| not RegexpSym

AnyOrAll::=
	  any
	| some
	| all

PredicateExpr::=
	  BitExpr InOrNotOp '(' ExpressionList ')'
	| BitExpr InOrNotOp SubSelect
	| BitExpr BetweenOrNotOp BitExpr and PredicateExpr
	| BitExpr LikeOrNotOp SimpleExpr LikeEscapeOpt
	| BitExpr RegexpOrNotOp SimpleExpr
	| BitExpr

RegexpSym::=
	  regexpKwd
	| rlike

LikeEscapeOpt::=
	  /*%empty*/
	| escape stringLit

Field::=
	  '*'
	| Identifier '.' '*'
	| Identifier '.' Identifier '.' '*'
	| Expression FieldAsNameOpt
	| '{' Identifier Expression '}' FieldAsNameOpt

FieldAsNameOpt::=
	  /*%empty*/
	| FieldAsName

FieldAsName::=
	  Identifier
	| as Identifier
	| stringLit
	| as stringLit

FieldList::=
	  Field
	| FieldList ',' Field

GroupByClause::=
	  group by ByList WithRollUpOpt

HavingClause::=
	  /*%empty*/
	| having Expression

WithRollUpOpt::=
	  /*%empty*/
	| with rollup

IfExists::=
	  /*%empty*/
	| ifKwd exists

IfNotExists::=
	  /*%empty*/
	| ifKwd not exists

IgnoreOptional::=
	  /*%empty*/
	| ignore

IndexName::=
	  /*%empty*/
	| Identifier

IndexOptionList::=
	  /*%empty*/
	| IndexOptionList IndexOption

IndexOption::=
	  keyBlockSize EqOpt LengthNum
	| IndexType
	| comment stringLit

IndexType::=
	  using btree
	| using hash

IndexTypeOpt::=
	  /*%empty*/
	| IndexType

Identifier::=
	  identifier
	| UnReservedKeyword
	| NotKeywordToken
	| TiDBKeyword

UnReservedKeyword::=
	  action
	| ascii
	| autoIncrement
	| after
	| always
	| avg
	| begin
	| bitType
	| boolType
	| booleanType
	| btree
	| byteType
	| cleanup
	| charsetKwd
	| columns
	| commit
	| compact
	| compressed
	| consistent
	| current
	| data
	| dateType
	| datetimeType
	| day
	| deallocate
	| do
	| duplicate
	| dynamic
	| end
	| engine
	| engines
	| enum
	| identSQLErrors
	| escape
	| execute
	| fields
	| first
	| fixed
	| flush
	| following
	| format
	| full
	| global
	| hash
	| hour
	| less
	| local
	| last
	| names
	| offset
	| password
	| prepare
	| quick
	| redundant
	| role
	| rollback
	| savepoint
	| session
	| signed
	| snapshot
	| start
	| status
	| subpartitions
	| subpartition
	| tables
	| tablespace
	| textType
	| than
	| timeType
	| timestampType
	| trace
	| transaction
	| truncate
	| unbounded
	| unknown
	| value
	| warnings
	| yearType
	| mode
	| week
	| any
	| some
	| user
	| identified
	| collation
	| comment
	| avgRowLength
	| connection
	| checksum
	| compression
	| keyBlockSize
	| master
	| maxRows
	| minRows
	| national
	| rowFormat
	| quarter
	| grants
	| triggers
	| delayKeyWrite
	| isolation
	| jsonType
	| repeatable
	| respect
	| committed
	| uncommitted
	| only
	| serializable
	| level
	| variables
	| sqlCache
	| indexes
	| processlist
	| sqlNoCache
	| disable
	| enable
	| reverse
	| privileges
	| no
	| binlog
	| function
	| view
	| binding
	| bindings
	| modify
	| events
	| partitions
	| none
	| nulls
	| super
	| exclusive
	| statsPersistent
	| rowCount
	| coalesce
	| month
	| process
	| profiles
	| microsecond
	| minute
	| plugins
	| preceding
	| query
	| queries
	| second
	| separator
	| share
	| shared
	| slow
	| maxConnectionsPerHour
	| maxQueriesPerHour
	| maxUpdatesPerHour
	| maxUserConnections
	| replication
	| client
	| slave
	| reload
	| temporary
	| routine
	| event
	| algorithm
	| definer
	| invoker
	| merge
	| temptable
	| undefined
	| security
	| cascaded
	| recover
	| rollup
	| nowait
	| skip
	| locked

TiDBKeyword::=
	  admin
	| buckets
	| cancel
	| ddl
	| drainer
	| jobs
	| job
	| pump
	| stats
	| statsMeta
	| statsHistograms
	| statsBuckets
	| statsHealthy
	| tidb
	| tidbHJ
	| tidbSMJ
	| tidbINLJ
	| restore

NotKeywordToken::=
	  builtinAddDate
	| builtinBitAnd
	| builtinBitOr
	| builtinBitXor
	| builtinCast
	| copyKwd
	| builtinCount
	| builtinCurTime
	| builtinDateAdd
	| builtinDateSub
	| builtinExtract
	| getFormat
	| builtinGroupConcat
	| inplace
	| instant
	| internal
	| builtinMin
	| builtinMax
	| maxExecutionTime
	| builtinNow
	| recent
	| builtinPosition
	| builtinSubDate
	| builtinSubstring
	| builtinSum
	| builtinStddevPop
	| builtinStddevSamp
	| builtinVarPop
	| builtinVarSamp
	| timestampAdd
	| timestampDiff
	| top
	| builtinTrim
	| next_row_id

InsertIntoStmt::=
	  insert PriorityOpt IgnoreOptional IntoOpt TableName InsertValues OnDuplicateKeyUpdate

IntoOpt::=
	  /*%empty*/
	| into

InsertValues::=
	  '(' ColumnNameListOpt ')' ValueSym ValuesList
	| '(' ColumnNameListOpt ')' SelectStmt
	| '(' ColumnNameListOpt ')' '(' SelectStmt ')'
	| '(' ColumnNameListOpt ')' UnionStmt
	| ValueSym ValuesList
	| '(' SelectStmt ')'
	| SelectStmt
	| UnionStmt
	| set ColumnSetValueList

ValueSym::=
	  value
	| values

ValuesList::=
	  RowValue
	| ValuesList ',' RowValue

RowValue::=
	  '(' ValuesOpt ')'

ValuesOpt::=
	  /*%empty*/
	| Values

Values::=
	  Values ',' ExprOrDefault
	| ExprOrDefault

ExprOrDefault::=
	  Expression
	| defaultKwd

ColumnSetValue::=
	  ColumnName eq Expression

ColumnSetValueList::=
	  /*%empty*/
	| ColumnSetValue
	| ColumnSetValueList ',' ColumnSetValue

OnDuplicateKeyUpdate::=
	  /*%empty*/
	| on duplicate key update AssignmentList

ReplaceIntoStmt::=
	  replace PriorityOpt IntoOpt TableName InsertValues

ODBCDateTimeType::=
	  /*%empty*/

Literal::=
	  falseKwd
	| null
	| trueKwd
	| floatLit
	| decLit
	| intLit
	| StringLiteral
	| "UNDERSCORE_CHARSET" stringLit
	| hexLit
	| bitLit

StringLiteral::=
	  stringLit
	| StringLiteral stringLit

OrderBy::=
	  order by ByList

ByList::=
	  ByItem
	| ByList ',' ByItem

ByItem::=
	  Expression Order

Order::=
	  /*%empty*/
	| asc
	| desc

OrderByOptional::=
	  /*%empty*/
	| OrderBy

BitExpr::=
	  BitExpr '|' BitExpr
	| BitExpr '&' BitExpr
	| BitExpr lsh BitExpr
	| BitExpr rsh BitExpr
	| BitExpr '+' BitExpr
	| BitExpr '-' BitExpr
	| BitExpr '+' interval Expression TimeUnit
	| BitExpr '-' interval Expression TimeUnit
	| BitExpr '*' BitExpr
	| BitExpr '/' BitExpr
	| BitExpr '%' BitExpr
	| BitExpr div BitExpr
	| BitExpr mod BitExpr
	| BitExpr '^' BitExpr
	| SimpleExpr

SimpleIdent::=
	  Identifier
	| Identifier '.' Identifier
	| '.' Identifier '.' Identifier
	| Identifier '.' Identifier '.' Identifier

SimpleExpr::=
	  SimpleIdent
	| FunctionCallKeyword
	| FunctionCallNonKeyword
	| FunctionCallGeneric
	| SimpleExpr collate StringName
	| WindowFuncCall
	| Literal
	| paramMarker
	| Variable
	| SumExpr
	| '!' SimpleExpr
	| '~' SimpleExpr
	| '-' SimpleExpr
	| '+' SimpleExpr
	| SimpleExpr pipes SimpleExpr
	| not2 SimpleExpr
	| SubSelect
	| '(' Expression ')'
	| '(' ExpressionList ',' Expression ')'
	| row '(' ExpressionList ',' Expression ')'
	| exists SubSelect
	| binaryType SimpleExpr
	| builtinCast '(' Expression as CastType ')'
	| caseKwd ExpressionOpt WhenClauseList ElseOpt end
	| convert '(' Expression ',' CastType ')'
	| convert '(' Expression using StringName ')'
	| defaultKwd '(' SimpleIdent ')'
	| values '(' SimpleIdent ')'
	| SimpleIdent jss stringLit
	| SimpleIdent juss stringLit

DistinctKwd::=
	  distinct

DistinctOpt::=
	  all
	| DistinctKwd

DefaultFalseDistinctOpt::=
	  /*%empty*/
	| DistinctOpt

DefaultTrueDistinctOpt::=
	  /*%empty*/
	| DistinctOpt

BuggyDefaultFalseDistinctOpt::=
	  DefaultFalseDistinctOpt
	| DistinctKwd all

FunctionNameConflict::=
	  ascii
	| charsetKwd
	| coalesce
	| collation
	| dateType
	| database
	| day
	| hour
	| ifKwd
	| interval
	| format
	| left
	| microsecond
	| minute
	| month
	| builtinNow
	| quarter
	| repeat
	| replace
	| reverse
	| right
	| rowCount
	| second
	| timeType
	| timestampType
	| truncate
	| user
	| week
	| yearType

OptionalBraces::=
	  /*%empty*/
	| '(' ')'

FunctionNameOptionalBraces::=
	  currentUser
	| currentDate
	| utcDate

FunctionNameDatetimePrecision::=
	  currentTime
	| currentTs
	| localTime
	| localTs
	| utcTime
	| utcTimestamp

FunctionCallKeyword::=
	  FunctionNameConflict '(' ExpressionListOpt ')'
	| builtinUser '(' ExpressionListOpt ')'
	| FunctionNameOptionalBraces OptionalBraces
	| builtinCurDate '(' ')'
	| FunctionNameDatetimePrecision FuncDatetimePrec
	| charType '(' ExpressionList ')'
	| charType '(' ExpressionList using StringName ')'
	| dateType stringLit
	| timeType stringLit
	| timestampType stringLit
	| insert '(' ExpressionListOpt ')'
	| mod '(' BitExpr ',' BitExpr ')'
	| password '(' ExpressionListOpt ')'
	| '{' ODBCDateTimeType stringLit '}'

FunctionCallNonKeyword::=
	  builtinCurTime '(' FuncDatetimePrecListOpt ')'
	| builtinSysDate '(' FuncDatetimePrecListOpt ')'
	| FunctionNameDateArithMultiForms '(' Expression ',' Expression ')'
	| FunctionNameDateArithMultiForms '(' Expression ',' interval Expression TimeUnit ')'
	| FunctionNameDateArith '(' Expression ',' interval Expression TimeUnit ')'
	| builtinExtract '(' TimeUnit from Expression ')'
	| getFormat '(' GetFormatSelector ',' Expression ')'
	| builtinPosition '(' BitExpr in Expression ')'
	| builtinSubstring '(' Expression ',' Expression ')'
	| builtinSubstring '(' Expression from Expression ')'
	| builtinSubstring '(' Expression ',' Expression ',' Expression ')'
	| builtinSubstring '(' Expression from Expression forKwd Expression ')'
	| timestampAdd '(' TimestampUnit ',' Expression ',' Expression ')'
	| timestampDiff '(' TimestampUnit ',' Expression ',' Expression ')'
	| builtinTrim '(' Expression ')'
	| builtinTrim '(' Expression from Expression ')'
	| builtinTrim '(' TrimDirection from Expression ')'
	| builtinTrim '(' TrimDirection Expression from Expression ')'

GetFormatSelector::=
	  dateType
	| datetimeType
	| timeType
	| timestampType

FunctionNameDateArith::=
	  builtinDateAdd
	| builtinDateSub

FunctionNameDateArithMultiForms::=
	  builtinAddDate
	| builtinSubDate

TrimDirection::=
	  both
	| leading
	| trailing

SumExpr::=
	  avg '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause
	| builtinBitAnd '(' Expression ')' OptWindowingClause
	| builtinBitAnd '(' all Expression ')' OptWindowingClause
	| builtinBitOr '(' Expression ')' OptWindowingClause
	| builtinBitOr '(' all Expression ')' OptWindowingClause
	| builtinBitXor '(' Expression ')' OptWindowingClause
	| builtinBitXor '(' all Expression ')' OptWindowingClause
	| builtinCount '(' DistinctKwd ExpressionList ')'
	| builtinCount '(' all Expression ')' OptWindowingClause
	| builtinCount '(' Expression ')' OptWindowingClause
	| builtinCount '(' '*' ')' OptWindowingClause
	| builtinGroupConcat '(' BuggyDefaultFalseDistinctOpt ExpressionList OrderByOptional OptGConcatSeparator ')'
	| builtinMax '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause
	| builtinMin '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause
	| builtinSum '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause
	| builtinStddevPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause
	| builtinStddevSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause
	| builtinVarPop '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause
	| builtinVarSamp '(' BuggyDefaultFalseDistinctOpt Expression ')' OptWindowingClause

OptGConcatSeparator::=
	  /*%empty*/
	| separator stringLit

FunctionCallGeneric::=
	  identifier '(' ExpressionListOpt ')'

FuncDatetimePrec::=
	  /*%empty*/
	| '(' ')'
	| '(' intLit ')'

TimeUnit::=
	  microsecond
	| second
	| minute
	| hour
	| day
	| week
	| month
	| quarter
	| yearType
	| secondMicrosecond
	| minuteMicrosecond
	| minuteSecond
	| hourMicrosecond
	| hourSecond
	| hourMinute
	| dayMicrosecond
	| daySecond
	| dayMinute
	| dayHour
	| yearMonth

TimestampUnit::=
	  microsecond
	| second
	| minute
	| hour
	| day
	| week
	| month
	| quarter
	| yearType

ExpressionOpt::=
	  /*%empty*/
	| Expression

WhenClauseList::=
	  WhenClause
	| WhenClauseList WhenClause

WhenClause::=
	  when Expression then Expression

ElseOpt::=
	  /*%empty*/
	| elseKwd Expression

CastType::=
	  binaryType OptFieldLen
	| charType OptFieldLen OptBinary
	| dateType
	| datetimeType OptFieldLen
	| decimalType FloatOpt
	| timeType OptFieldLen
	| signed OptInteger
	| unsigned OptInteger
	| jsonType

PriorityOpt::=
	  /*%empty*/
	| lowPriority
	| highPriority
	| delayed

TableName::=
	  Identifier
	| Identifier '.' Identifier
	| Identifier '.' '*'

TableNameList::=
	  TableName
	| TableNameList ',' TableName

QuickOptional::=
	  /*%empty*/
	| quick

PreparedStmt::=
	  prepare Identifier from PrepareSQL

PrepareSQL::=
	  stringLit
	| UserVariable

ExecuteStmt::=
	  execute Identifier
	| execute Identifier using UserVariableList

UserVariableList::=
	  UserVariable
	| UserVariableList ',' UserVariable

DeallocateStmt::=
	  DeallocateSym prepare Identifier

DeallocateSym::=
	  deallocate
	| drop

RollbackStmt::=
	  rollback
	| rollback CommitOpt
	| rollback work to savepoint StringName
	| rollback work to StringName
	| rollback to savepoint StringName
	| rollback to StringName

SavepointStmt::=
	  savepoint StringName
	| release savepoint StringName

SelectStmtBasic::=
	  selectKwd SelectStmtOpts SelectStmtFieldList

SelectStmtFromDualTable::=
	  SelectStmtBasic FromDual WhereClauseOptional

SelectStmtFromTable::=
	  SelectStmtBasic from TableRefsClause WhereClauseOptional SelectStmtGroup HavingClause WindowClauseOptional

SelectStmt::=
	  SelectStmtBasic OrderByOptional SelectStmtLimit SelectLockOpt
	| SelectStmtFromDualTable OrderByOptional SelectStmtLimit SelectLockOpt
	| SelectStmtFromTable OrderByOptional SelectStmtLimit SelectLockOpt

FromDual::=
	  from dual

WindowClauseOptional::=
	  /*%empty*/
	| window WindowDefinitionList

WindowDefinitionList::=
	  WindowDefinition
	| WindowDefinitionList ',' WindowDefinition

WindowDefinition::=
	  WindowName as WindowSpec

WindowName::=
	  Identifier

WindowSpec::=
	  '(' WindowSpecDetails ')'

WindowSpecDetails::=
	  OptExistingWindowName OptPartitionClause OptWindowOrderByClause OptWindowFrameClause

OptExistingWindowName::=
	  /*%empty*/
	| WindowName

OptPartitionClause::=
	  /*%empty*/
	| partition by ByList

OptWindowOrderByClause::=
	  /*%empty*/
	| order by ByList

OptWindowFrameClause::=
	  /*%empty*/
	| WindowFrameUnits WindowFrameExtent

WindowFrameUnits::=
	  rows
	| rangeKwd
	| groups

WindowFrameExtent::=
	  WindowFrameStart
	| WindowFrameBetween

WindowFrameStart::=
	  unbounded preceding
	| NumLiteral preceding
	| paramMarker preceding
	| interval Expression TimeUnit preceding
	| current row

WindowFrameBetween::=
	  between WindowFrameBound and WindowFrameBound

WindowFrameBound::=
	  WindowFrameStart
	| unbounded following
	| NumLiteral following
	| paramMarker following
	| interval Expression TimeUnit following

OptWindowingClause::=
	  /*%empty*/
	| WindowingClause

WindowingClause::=
	  over WindowNameOrSpec

WindowNameOrSpec::=
	  WindowName
	| WindowSpec

WindowFuncCall::=
	  rowNumber '(' ')' WindowingClause
	| rank '(' ')' WindowingClause
	| denseRank '(' ')' WindowingClause
	| cumeDist '(' ')' WindowingClause
	| percentRank '(' ')' WindowingClause
	| ntile '(' SimpleExpr ')' WindowingClause
	| lead '(' Expression OptLeadLagInfo ')' OptNullTreatment WindowingClause
	| lag '(' Expression OptLeadLagInfo ')' OptNullTreatment WindowingClause
	| firstValue '(' Expression ')' OptNullTreatment WindowingClause
	| lastValue '(' Expression ')' OptNullTreatment WindowingClause
	| nthValue '(' Expression ',' SimpleExpr ')' OptFromFirstLast OptNullTreatment WindowingClause

OptLeadLagInfo::=
	  /*%empty*/
	| ',' NumLiteral OptLLDefault
	| ',' paramMarker OptLLDefault

OptLLDefault::=
	  /*%empty*/
	| ',' Expression

OptNullTreatment::=
	  /*%empty*/
	| respect nulls
	| ignore nulls

OptFromFirstLast::=
	  /*%empty*/
	| from first
	| from last

TableRefsClause::=
	  TableRefs

TableRefs::=
	  EscapedTableRef
	| TableRefs ',' EscapedTableRef

EscapedTableRef::=
	  TableRef
	| '{' Identifier TableRef '}'

TableRef::=
	  TableFactor
	| JoinTable

TableFactor::=
	  TableName PartitionNameListOpt TableAsNameOpt IndexHintListOpt
	| SubSelect TableAsName
	| '(' TableRefs ')'

PartitionNameListOpt::=
	  /*%empty*/
	| partition '(' PartitionNameList ')'

TableAsNameOpt::=
	  /*%empty*/
	| TableAsName

TableAsName::=
	  Identifier
	| as Identifier

IndexHintType::=
	  use KeyOrIndex
	| ignore KeyOrIndex
	| force KeyOrIndex

IndexHintScope::=
	  /*%empty*/
	| forKwd join
	| forKwd order by
	| forKwd group by

IndexHint::=
	  IndexHintType IndexHintScope '(' IndexNameList ')'

IndexNameList::=
	  /*%empty*/
	| Identifier
	| IndexNameList ',' Identifier
	| primary

IndexHintList::=
	  IndexHint
	| IndexHintList IndexHint

IndexHintListOpt::=
	  /*%empty*/
	| IndexHintList

JoinTable::=
	  TableRef CrossOpt TableRef
	| TableRef CrossOpt TableRef on Expression
	| TableRef CrossOpt TableRef using '(' ColumnNameList ')'
	| TableRef JoinType OuterOpt join TableRef on Expression
	| TableRef JoinType OuterOpt join TableRef using '(' ColumnNameList ')'
	| TableRef natural join TableRef
	| TableRef natural JoinType OuterOpt join TableRef
	| TableRef straightJoin TableRef
	| TableRef straightJoin TableRef on Expression

JoinType::=
	  left
	| right

OuterOpt::=
	  /*%empty*/
	| outer

CrossOpt::=
	  join
	| cross join
	| inner join

LimitClause::=
	  /*%empty*/
	| limit LimitOption

LimitOption::=
	  LengthNum
	| paramMarker

SelectStmtLimit::=
	  /*%empty*/
	| limit LimitOption
	| limit LimitOption ',' LimitOption
	| limit LimitOption offset LimitOption

SelectStmtOpts::=
	  TableOptimizerHints DefaultFalseDistinctOpt PriorityOpt SelectStmtSQLCache SelectStmtCalcFoundRows SelectStmtStraightJoin

TableOptimizerHints::=
	  /*%empty*/
	| hintBegin TableOptimizerHintList hintEnd

HintTableList::=
	  Identifier
	| HintTableList ',' Identifier

TableOptimizerHintList::=
	  TableOptimizerHintOpt
	| TableOptimizerHintList TableOptimizerHintOpt

TableOptimizerHintOpt::=
	  tidbSMJ '(' HintTableList ')'
	| tidbINLJ '(' HintTableList ')'
	| tidbHJ '(' HintTableList ')'
	| maxExecutionTime '(' NUM ')'
	| master

SelectStmtCalcFoundRows::=
	  /*%empty*/
	| sqlCalcFoundRows

SelectStmtSQLCache::=
	  /*%empty*/
	| sqlCache
	| sqlNoCache

SelectStmtStraightJoin::=
	  /*%empty*/
	| straightJoin

SelectStmtFieldList::=
	  FieldList

SelectStmtGroup::=
	  /*%empty*/
	| GroupByClause

SubSelect::=
	  '(' SelectStmt ')'
	| '(' UnionStmt ')'
	| '(' SubSelect ')'

SelectLockOpt::=
	  /*%empty*/
	| forKwd update
	| forKwd share
	| forKwd update nowait
	| forKwd share nowait
	| forKwd update skip locked
	| forKwd share skip locked
	| lock in share mode

UnionStmt::=
	  UnionClauseList union UnionOpt SelectStmtBasic OrderByOptional SelectStmtLimit SelectLockOpt
	| UnionClauseList union UnionOpt SelectStmtFromDualTable OrderByOptional SelectStmtLimit SelectLockOpt
	| UnionClauseList union UnionOpt SelectStmtFromTable OrderByOptional SelectStmtLimit SelectLockOpt
	| UnionClauseList union UnionOpt '(' SelectStmt ')' OrderByOptional SelectStmtLimit

UnionClauseList::=
	  UnionSelect
	| UnionClauseList union UnionOpt UnionSelect

UnionSelect::=
	  SelectStmt
	| '(' SelectStmt ')'

UnionOpt::=
	  DefaultTrueDistinctOpt

SetStmt::=
	  set VariableAssignmentList
	| set password eq PasswordOpt
	| set password forKwd Username eq PasswordOpt
	| set global transaction TransactionChars
	| set session transaction TransactionChars
	| set transaction TransactionChars

SetRoleStmt::=
	  set role SetRoleOpt

SetDefaultRoleStmt::=
	  set defaultKwd role SetDefaultRoleOpt to UsernameList

SetDefaultRoleOpt::=
	  none
	| all
	| RolenameList

SetRoleOpt::=
	  all except RolenameList
	| SetDefaultRoleOpt
	| defaultKwd

TransactionChars::=
	  TransactionChar
	| TransactionChars ',' TransactionChar

TransactionChar::=
	  isolation level IsolationLevel
	| read write
	| read only

IsolationLevel::=
	  repeatable read
	| read committed
	| read uncommitted
	| serializable

SetExpr::=
	  on
	| binaryType
	| ExprOrDefault

VariableAssignment::=
	  Identifier eq SetExpr
	| global Identifier eq SetExpr
	| session Identifier eq SetExpr
	| local Identifier eq Expression
	| doubleAtIdentifier eq SetExpr
	| singleAtIdentifier eq Expression
	| singleAtIdentifier assignmentEq Expression
	| names CharsetName
	| names CharsetName collate defaultKwd
	| names CharsetName collate StringName
	| CharsetKw CharsetName

CharsetName::=
	  StringName
	| binaryType

VariableAssignmentList::=
	  /*%empty*/
	| VariableAssignment
	| VariableAssignmentList ',' VariableAssignment

Variable::=
	  SystemVariable
	| UserVariable

SystemVariable::=
	  doubleAtIdentifier

UserVariable::=
	  singleAtIdentifier

Username::=
	  StringName
	| StringName '@' StringName
	| StringName singleAtIdentifier
	| currentUser OptionalBraces

UsernameList::=
	  Username
	| UsernameList ',' Username

PasswordOpt::=
	  stringLit
	| password '(' AuthString ')'

AuthString::=
	  stringLit

RoleNameString::=
	  stringLit
	| identifier

Rolename::=
	  RoleNameString
	| StringName '@' StringName
	| StringName singleAtIdentifier

RolenameList::=
	  Rolename
	| RolenameList ',' Rolename

AdminStmt::=
	  admin show ddl
	| admin show ddl jobs
	| admin show ddl jobs NUM
	| admin show TableName next_row_id
	| admin check tableKwd TableNameList
	| admin check index TableName Identifier
	| admin recover index TableName Identifier
	| admin restore tableKwd by job NUM
	| admin restore tableKwd TableName
	| admin restore tableKwd TableName NUM
	| admin cleanup index TableName Identifier
	| admin check index TableName Identifier HandleRangeList
	| admin checksum tableKwd TableNameList
	| admin cancel ddl jobs NumList
	| admin show ddl job queries NumList
	| admin show slow AdminShowSlow

AdminShowSlow::=
	  recent NUM
	| top NUM
	| top internal NUM
	| top all NUM

HandleRangeList::=
	  HandleRange
	| HandleRangeList ',' HandleRange

HandleRange::=
	  '(' NUM ',' NUM ')'

NumList::=
	  NUM
	| NumList ',' NUM

ShowStmt::=
	  show ShowTargetFilterable ShowLikeOrWhereOpt
	| show create tableKwd TableName
	| show create view TableName
	| show create database IfNotExists DBName
	| show create user Username
	| show grants
	| show grants forKwd Username
	| show master status
	| show OptFull processlist
	| show statsMeta ShowLikeOrWhereOpt
	| show statsHistograms ShowLikeOrWhereOpt
	| show statsBuckets ShowLikeOrWhereOpt
	| show statsHealthy ShowLikeOrWhereOpt
	| show profiles
	| show privileges

ShowIndexKwd::=
	  index
	| indexes
	| keys

FromOrIn::=
	  from
	| in

ShowTargetFilterable::=
	  engines
	| databases
	| CharsetKw
	| OptFull tables ShowDatabaseNameOpt
	| tableKwd status ShowDatabaseNameOpt
	| ShowIndexKwd FromOrIn TableName
	| ShowIndexKwd FromOrIn Identifier FromOrIn Identifier
	| OptFull columns ShowTableAliasOpt ShowDatabaseNameOpt
	| OptFull fields ShowTableAliasOpt ShowDatabaseNameOpt
	| warnings
	| identSQLErrors
	| GlobalScope variables
	| GlobalScope status
	| GlobalScope bindings
	| collation
	| triggers ShowDatabaseNameOpt
	| procedure status
	| pump status
	| drainer status
	| function status
	| events ShowDatabaseNameOpt
	| plugins

ShowLikeOrWhereOpt::=
	  /*%empty*/
	| like SimpleExpr
	| where Expression

GlobalScope::=
	  /*%empty*/
	| global
	| session

OptFull::=
	  /*%empty*/
	| full

ShowDatabaseNameOpt::=
	  /*%empty*/
	| FromOrIn DBName

ShowTableAliasOpt::=
	  FromOrIn TableName

FlushStmt::=
	  flush NoWriteToBinLogAliasOpt FlushOption

PluginNameList::=
	  Identifier
	| PluginNameList ',' Identifier

FlushOption::=
	  privileges
	| status
	| tidb plugins PluginNameList
	| TableOrTables TableNameListOpt WithReadLockOpt

NoWriteToBinLogAliasOpt::=
	  /*%empty*/
	| noWriteToBinLog
	| local

TableNameListOpt::=
	  /*%empty*/
	| TableNameList

WithReadLockOpt::=
	  /*%empty*/
	| with read lock

Statement::=
	  EmptyStmt
	| AdminStmt
	| AlterTableStmt
	| AlterUserStmt
	| AnalyzeTableStmt
	| BeginTransactionStmt
	| BinlogStmt
	| CommitStmt
	| DeallocateStmt
	| DeleteFromStmt
	| ExecuteStmt
	| ExplainStmt
	| CreateDatabaseStmt
	| CreateIndexStmt
	| CreateTableStmt
	| CreateViewStmt
	| CreateUserStmt
	| CreateRoleStmt
	| CreateBindingStmt
	| DoStmt
	| DropDatabaseStmt
	| DropIndexStmt
	| DropTableStmt
	| DropViewStmt
	| DropUserStmt
	| DropRoleStmt
	| DropStatsStmt
	| DropBindingStmt
	| FlushStmt
	| GrantStmt
	| GrantRoleStmt
	| InsertIntoStmt
	| KillStmt
	| LoadDataStmt
	| LoadStatsStmt
	| PreparedStmt
	| RollbackStmt
	| RenameTableStmt
	| ReplaceIntoStmt
	| RevokeStmt
	| RevokeRoleStmt
	| SavepointStmt
	| SelectStmt
	| UnionStmt
	| SetStmt
	| SetRoleStmt
	| SetDefaultRoleStmt
	| ShowStmt
	| SubSelect
	| TraceStmt
	| TruncateTableStmt
	| UpdateStmt
	| UseStmt
	| UnlockTablesStmt
	| LockTablesStmt

TraceableStmt::=
	  SelectStmt
	| DeleteFromStmt
	| UpdateStmt
	| InsertIntoStmt
	| ReplaceIntoStmt
	| UnionStmt

ExplainableStmt::=
	  SelectStmt
	| DeleteFromStmt
	| UpdateStmt
	| InsertIntoStmt
	| ReplaceIntoStmt
	| UnionStmt

StatementList::=
	  Statement
	| StatementList ';' Statement

Constraint::=
	  ConstraintKeywordOpt ConstraintElem

TableElement::=
	  ColumnDef
	| Constraint
	| check '(' Expression ')'

TableElementList::=
	  TableElement
	| TableElementList ',' TableElement

TableElementListOpt::=
	  /*%empty*/
	| '(' TableElementList ')'

TableOption::=
	  engine StringName
	| engine eq StringName
	| DefaultKwdOpt CharsetKw EqOpt CharsetName
	| DefaultKwdOpt collate EqOpt StringName
	| autoIncrement EqOpt LengthNum
	| comment EqOpt stringLit
	| avgRowLength EqOpt LengthNum
	| connection EqOpt stringLit
	| checksum EqOpt LengthNum
	| password EqOpt stringLit
	| compression EqOpt stringLit
	| keyBlockSize EqOpt LengthNum
	| maxRows EqOpt LengthNum
	| minRows EqOpt LengthNum
	| delayKeyWrite EqOpt LengthNum
	| RowFormat
	| statsPersistent EqOpt StatsPersistentVal
	| shardRowIDBits EqOpt LengthNum
	| packKeys EqOpt StatsPersistentVal

StatsPersistentVal::=
	  defaultKwd
	| LengthNum

AlterTableOptionListOpt::=
	  /*%empty*/
	| TableOptionList

CreateTableOptionListOpt::=
	  /*%empty*/
	| TableOptionList

TableOptionList::=
	  TableOption
	| TableOptionList TableOption
	| TableOptionList ',' TableOption

OptTable::=
	  /*%empty*/
	| tableKwd

TruncateTableStmt::=
	  truncate OptTable TableName

RowFormat::=
	  rowFormat EqOpt defaultKwd
	| rowFormat EqOpt dynamic
	| rowFormat EqOpt fixed
	| rowFormat EqOpt compressed
	| rowFormat EqOpt redundant
	| rowFormat EqOpt compact

Type::=
	  NumericType
	| StringType
	| DateAndTimeType

NumericType::=
	  IntegerType OptFieldLen FieldOpts
	| BooleanType FieldOpts
	| FixedPointType FloatOpt FieldOpts
	| FloatingPointType FloatOpt FieldOpts
	| BitValueType OptFieldLen

IntegerType::=
	  tinyIntType
	| smallIntType
	| mediumIntType
	| intType
	| int1Type
	| int2Type
	| int3Type
	| int4Type
	| int8Type
	| integerType
	| bigIntType

BooleanType::=
	  boolType
	| booleanType

OptInteger::=
	  /*%empty*/
	| integerType
	| intType

FixedPointType::=
	  decimalType
	| numericType

FloatingPointType::=
	  floatType
	| realType
	| doubleType
	| doubleType precisionType

BitValueType::=
	  bitType

StringType::=
	  NationalOpt charType FieldLen OptBinary OptCollate
	| NationalOpt charType OptBinary OptCollate
	| national character FieldLen OptBinary OptCollate
	| Varchar FieldLen OptBinary OptCollate
	| binaryType OptFieldLen
	| varbinaryType FieldLen
	| BlobType
	| TextType OptBinary OptCollate
	| enum '(' StringList ')' OptCharset OptCollate
	| set '(' StringList ')' OptCharset OptCollate
	| jsonType

NationalOpt::=
	  /*%empty*/
	| national

Varchar::=
	  national varcharType
	| varcharType
	| nvarcharType

BlobType::=
	  tinyblobType
	| blobType OptFieldLen
	| mediumblobType
	| longblobType

TextType::=
	  tinytextType
	| textType OptFieldLen
	| mediumtextType
	| longtextType
	| long varcharType

DateAndTimeType::=
	  dateType
	| datetimeType OptFieldLen
	| timestampType OptFieldLen
	| timeType OptFieldLen
	| yearType OptFieldLen FieldOpts

FieldLen::=
	  '(' LengthNum ')'

OptFieldLen::=
	  /*%empty*/
	| FieldLen

FieldOpt::=
	  unsigned
	| signed
	| zerofill

FieldOpts::=
	  /*%empty*/
	| FieldOpts FieldOpt

FloatOpt::=
	  /*%empty*/
	| FieldLen
	| Precision

Precision::=
	  '(' LengthNum ',' LengthNum ')'

OptBinMod::=
	  /*%empty*/
	| binaryType

OptBinary::=
	  /*%empty*/
	| binaryType OptCharset
	| CharsetKw CharsetName OptBinMod

OptCharset::=
	  /*%empty*/
	| CharsetKw CharsetName

CharsetKw::=
	  character set
	| charsetKwd

OptCollate::=
	  /*%empty*/
	| collate StringName

StringList::=
	  stringLit
	| StringList ',' stringLit

StringName::=
	  stringLit
	| Identifier

UpdateStmt::=
	  update TableOptimizerHints PriorityOpt IgnoreOptional TableRef set AssignmentList WhereClauseOptional OrderByOptional LimitClause
	| update TableOptimizerHints PriorityOpt IgnoreOptional TableRefs set AssignmentList WhereClauseOptional

UseStmt::=
	  use DBName

WhereClause::=
	  where Expression

WhereClauseOptional::=
	  /*%empty*/
	| WhereClause

CreateUserStmt::=
	  create user IfNotExists UserSpecList

CreateRoleStmt::=
	  create role IfNotExists RoleSpecList

AlterUserStmt::=
	  alter user IfExists UserSpecList
	| alter user IfExists user '(' ')' identified by AuthString

UserSpec::=
	  Username AuthOption

UserSpecList::=
	  UserSpec
	| UserSpecList ',' UserSpec

AuthOption::=
	  /*%empty*/
	| identified by AuthString
	| identified with StringName
	| identified with StringName by AuthString
	| identified with StringName as HashString
	| identified by password HashString

HashString::=
	  stringLit

RoleSpec::=
	  Rolename

RoleSpecList::=
	  RoleSpec
	| RoleSpecList ',' RoleSpec

CreateBindingStmt::=
	  create GlobalScope binding forKwd SelectStmt using SelectStmt

DropBindingStmt::=
	  drop GlobalScope binding forKwd SelectStmt

GrantStmt::=
	  grant PrivElemList on ObjectType PrivLevel to UserSpecList WithGrantOptionOpt

GrantRoleStmt::=
	  grant RolenameList to UsernameList

WithGrantOptionOpt::=
	  /*%empty*/
	| with grant option
	| with maxQueriesPerHour NUM
	| with maxUpdatesPerHour NUM
	| with maxConnectionsPerHour NUM
	| with maxUserConnections NUM

PrivElem::=
	  PrivType
	| PrivType '(' ColumnNameList ')'

PrivElemList::=
	  PrivElem
	| PrivElemList ',' PrivElem

PrivType::=
	  all
	| all privileges
	| alter
	| create
	| create user
	| trigger
	| deleteKwd
	| drop
	| process
	| execute
	| index
	| insert
	| selectKwd
	| super
	| show databases
	| update
	| grant option
	| references
	| replication slave
	| replication client
	| usage
	| reload
	| create temporary tables
	| lock tables
	| create view
	| show view
	| create role
	| drop role
	| create routine
	| alter routine
	| event

ObjectType::=
	  /*%empty*/
	| tableKwd

PrivLevel::=
	  '*'
	| '*' '.' '*'
	| Identifier '.' '*'
	| Identifier '.' Identifier
	| Identifier

RevokeStmt::=
	  revoke PrivElemList on ObjectType PrivLevel from UserSpecList

RevokeRoleStmt::=
	  revoke RolenameList from UsernameList

LoadDataStmt::=
	  load data LocalOpt infile stringLit into tableKwd TableName CharsetOpt Fields Lines IgnoreLines ColumnNameListOptWithBrackets

IgnoreLines::=
	  /*%empty*/
	| ignore NUM lines

CharsetOpt::=
	  /*%empty*/
	| character set CharsetName

LocalOpt::=
	  /*%empty*/
	| local

Fields::=
	  /*%empty*/
	| FieldsOrColumns FieldsTerminated Enclosed Escaped

FieldsOrColumns::=
	  fields
	| columns

FieldsTerminated::=
	  /*%empty*/
	| terminated by stringLit

Enclosed::=
	  /*%empty*/
	| optionally enclosed by stringLit
	| enclosed by stringLit

Escaped::=
	  /*%empty*/
	| escaped by stringLit

Lines::=
	  /*%empty*/
	| lines Starting LinesTerminated

Starting::=
	  /*%empty*/
	| starting by stringLit

LinesTerminated::=
	  /*%empty*/
	| terminated by stringLit

UnlockTablesStmt::=
	  unlock TablesTerminalSym

LockTablesStmt::=
	  lock TablesTerminalSym TableLockList

TablesTerminalSym::=
	  tables
	| tableKwd

TableLock::=
	  TableName LockType

LockType::=
	  read
	| read local
	| write
	| write local

TableLockList::=
	  TableLock
	| TableLockList ',' TableLock

KillStmt::=
	  KillOrKillTiDB NUM
	| KillOrKillTiDB connection NUM
	| KillOrKillTiDB query NUM

KillOrKillTiDB::=
	  kill
	| kill tidb

LoadStatsStmt::=
	  load stats stringLit

//Tokens

neq ::= "!="
andand ::= "&&"
lsh ::= "<<"
le ::= "<="
nulleq ::= "<=>"
neqSynonym ::= "<>"
eq ::= "="
ge ::= ">="
rsh ::= ">>"
assignmentEq ::= ":="
paramMarker ::= "?"
pipes ::= "||"

action ::= "ACTION"
add ::= "ADD"
//"ADDDATE"                  addDate
admin ::= "ADMIN"
after ::= "AFTER"
all ::= "ALL"
algorithm ::= "ALGORITHM"
alter ::= "ALTER"
always ::= "ALWAYS"
analyze ::= "ANALYZE"
and ::= "AND"
any ::= "ANY"
as ::= "AS"
asc ::= "ASC"
ascii ::= "ASCII"
autoIncrement ::= "AUTO_INCREMENT"
avg ::= "AVG"
avgRowLength ::= "AVG_ROW_LENGTH"
begin ::= "BEGIN"
between ::= "BETWEEN"
bigIntType ::= "BIGINT"
binaryType ::= "BINARY"
binlog ::= "BINLOG"
bitType ::= "BIT"
//"BIT_AND"                  bitAnd
//"BIT_OR"                   bitOr
//"BIT_XOR"                  bitXor
blobType ::= "BLOB"
boolType ::= "BOOL"
booleanType ::= "BOOLEAN"
both ::= "BOTH"
btree ::= "BTREE"
buckets ::= "BUCKETS"
by ::= "BY"
byteType ::= "BYTE"
cancel ::= "CANCEL"
cascade ::= "CASCADE"
cascaded ::= "CASCADED"
caseKwd ::= "CASE"
//"CAST"                     cast
change ::= "CHANGE"
charType ::= "CHAR"
character ::= "CHARACTER"
charsetKwd ::= "CHARSET"
check ::= "CHECK"
checksum ::= "CHECKSUM"
cleanup ::= "CLEANUP"
client ::= "CLIENT"
coalesce ::= "COALESCE"
collate ::= "COLLATE"
collation ::= "COLLATION"
column ::= "COLUMN"
columns ::= "COLUMNS"
comment ::= "COMMENT"
commit ::= "COMMIT"
committed ::= "COMMITTED"
compact ::= "COMPACT"
compressed ::= "COMPRESSED"
compression ::= "COMPRESSION"
connection ::= "CONNECTION"
consistent ::= "CONSISTENT"
constraint ::= "CONSTRAINT"
convert ::= "CONVERT"
copyKwd ::= "COPY"
//"COUNT"                    count
create ::= "CREATE"
cross ::= "CROSS"
current ::= "CURRENT"
currentDate ::= "CURRENT_DATE"
currentTime ::= "CURRENT_TIME"
currentTs ::= "CURRENT_TIMESTAMP"
currentUser ::= "CURRENT_USER"
//"CURTIME"                  curTime
data ::= "DATA"
database ::= "DATABASE"
databases ::= "DATABASES"
dateType ::= "DATE"
//"DATE_ADD"                 dateAdd
//"DATE_SUB"                 dateSub
datetimeType ::= "DATETIME"
day ::= "DAY"
dayHour ::= "DAY_HOUR"
dayMicrosecond ::= "DAY_MICROSECOND"
dayMinute ::= "DAY_MINUTE"
daySecond ::= "DAY_SECOND"
ddl ::= "DDL"
deallocate ::= "DEALLOCATE"
decimalType ::= "DEC"
decimalType ::= "DECIMAL"
defaultKwd ::= "DEFAULT"
definer ::= "DEFINER"
delayKeyWrite ::= "DELAY_KEY_WRITE"
delayed ::= "DELAYED"
deleteKwd ::= "DELETE"
desc ::= "DESC"
describe ::= "DESCRIBE"
disable ::= "DISABLE"
distinct ::= "DISTINCT"
distinct ::= "DISTINCTROW"
div ::= "DIV"
do ::= "DO"
doubleType ::= "DOUBLE"
drainer ::= "DRAINER"
drop ::= "DROP"
dual ::= "DUAL"
duplicate ::= "DUPLICATE"
dynamic ::= "DYNAMIC"
elseKwd ::= "ELSE"
enable ::= "ENABLE"
enclosed ::= "ENCLOSED"
end ::= "END"
engine ::= "ENGINE"
engines ::= "ENGINES"
enum ::= "ENUM"
escape ::= "ESCAPE"
escaped ::= "ESCAPED"
event ::= "EVENT"
events ::= "EVENTS"
exclusive ::= "EXCLUSIVE"
except ::= "EXCEPT"
execute ::= "EXECUTE"
exists ::= "EXISTS"
explain ::= "EXPLAIN"
//"EXTRACT"                  extract
falseKwd ::= "FALSE"
fields ::= "FIELDS"
first ::= "FIRST"
fixed ::= "FIXED"
floatType ::= "FLOAT"
flush ::= "FLUSH"
following ::= "FOLLOWING"
forKwd ::= "FOR"
force ::= "FORCE"
foreign ::= "FOREIGN"
format ::= "FORMAT"
from ::= "FROM"
full ::= "FULL"
fulltext ::= "FULLTEXT"
function ::= "FUNCTION"
generated ::= "GENERATED"
getFormat ::= "GET_FORMAT"
global ::= "GLOBAL"
grant ::= "GRANT"
grants ::= "GRANTS"
group ::= "GROUP"
//"GROUP_CONCAT"             groupConcat
hash ::= "HASH"
having ::= "HAVING"
highPriority ::= "HIGH_PRIORITY"
hour ::= "HOUR"
hourMicrosecond ::= "HOUR_MICROSECOND"
hourMinute ::= "HOUR_MINUTE"
hourSecond ::= "HOUR_SECOND"
identified ::= "IDENTIFIED"
ifKwd ::= "IF"
ignore ::= "IGNORE"
in ::= "IN"
index ::= "INDEX"
indexes ::= "INDEXES"
infile ::= "INFILE"
inner ::= "INNER"
inplace ::= "INPLACE"
instant ::= "INSTANT"
insert ::= "INSERT"
intType ::= "INT"
int1Type ::= "INT1"
int2Type ::= "INT2"
int3Type ::= "INT3"
int4Type ::= "INT4"
int8Type ::= "INT8"
integerType ::= "INTEGER"
interval ::= "INTERVAL"
internal ::= "INTERNAL"
into ::= "INTO"
invoker ::= "INVOKER"
is ::= "IS"
isolation ::= "ISOLATION"
jobs ::= "JOBS"
job ::= "JOB"
join ::= "JOIN"
jsonType ::= "JSON"
key ::= "KEY"
keyBlockSize ::= "KEY_BLOCK_SIZE"
keys ::= "KEYS"
kill ::= "KILL"
last ::= "LAST"
leading ::= "LEADING"
left ::= "LEFT"
less ::= "LESS"
level ::= "LEVEL"
like ::= "LIKE"
limit ::= "LIMIT"
lines ::= "LINES"
load ::= "LOAD"
local ::= "LOCAL"
localTime ::= "LOCALTIME"
localTs ::= "LOCALTIMESTAMP"
lock ::= "LOCK"
long ::= "LONG"
longblobType ::= "LONGBLOB"
longtextType ::= "LONGTEXT"
lowPriority ::= "LOW_PRIORITY"
master ::= "MASTER"
//"MAX"                      max
maxConnectionsPerHour ::= "MAX_CONNECTIONS_PER_HOUR"
maxExecutionTime ::= "MAX_EXECUTION_TIME"
maxQueriesPerHour ::= "MAX_QUERIES_PER_HOUR"
maxRows ::= "MAX_ROWS"
maxUpdatesPerHour ::= "MAX_UPDATES_PER_HOUR"
maxUserConnections ::= "MAX_USER_CONNECTIONS"
maxValue ::= "MAXVALUE"
mediumblobType ::= "MEDIUMBLOB"
mediumIntType ::= "MEDIUMINT"
mediumtextType ::= "MEDIUMTEXT"
merge ::= "MERGE"
microsecond ::= "MICROSECOND"
//"MIN"                      min
minRows ::= "MIN_ROWS"
minute ::= "MINUTE"
minuteMicrosecond ::= "MINUTE_MICROSECOND"
minuteSecond ::= "MINUTE_SECOND"
mod ::= "MOD"
mode ::= "MODE"
modify ::= "MODIFY"
month ::= "MONTH"
names ::= "NAMES"
national ::= "NATIONAL"
natural ::= "NATURAL"
next_row_id ::= "NEXT_ROW_ID"
no ::= "NO"
noWriteToBinLog ::= "NO_WRITE_TO_BINLOG"
none ::= "NONE"
not ::= "NOT"
//"NOW"                      now
null ::= "NULL"
nulls ::= "NULLS"
numericType ::= "NUMERIC"
nvarcharType ::= "NVARCHAR"
offset ::= "OFFSET"
on ::= "ON"
only ::= "ONLY"
option ::= "OPTION"
optionally ::= "OPTIONALLY"
or ::= "OR"
order ::= "ORDER"
outer ::= "OUTER"
packKeys ::= "PACK_KEYS"
partition ::= "PARTITION"
partitions ::= "PARTITIONS"
password ::= "PASSWORD"
plugins ::= "PLUGINS"
//"POSITION"                 position
preceding ::= "PRECEDING"
precisionType ::= "PRECISION"
prepare ::= "PREPARE"
primary ::= "PRIMARY"
privileges ::= "PRIVILEGES"
procedure ::= "PROCEDURE"
process ::= "PROCESS"
processlist ::= "PROCESSLIST"
profiles ::= "PROFILES"
pump ::= "PUMP"
quarter ::= "QUARTER"
query ::= "QUERY"
queries ::= "QUERIES"
quick ::= "QUICK"
shardRowIDBits ::= "SHARD_ROW_ID_BITS"
rangeKwd ::= "RANGE"
recover ::= "RECOVER"
read ::= "READ"
realType ::= "REAL"
recent ::= "RECENT"
redundant ::= "REDUNDANT"
references ::= "REFERENCES"
regexpKwd ::= "REGEXP"
reload ::= "RELOAD"
rename ::= "RENAME"
repeat ::= "REPEAT"
repeatable ::= "REPEATABLE"
replace ::= "REPLACE"
respect ::= "RESPECT"
replication ::= "REPLICATION"
restrict ::= "RESTRICT"
restore ::= "RESTORE"
reverse ::= "REVERSE"
revoke ::= "REVOKE"
right ::= "RIGHT"
rlike ::= "RLIKE"
role ::= "ROLE"
rollback ::= "ROLLBACK"
rollup ::= "ROLLUP"
routine ::= "ROUTINE"
row ::= "ROW"
rowCount ::= "ROW_COUNT"
rowFormat ::= "ROW_FORMAT"
savepoint ::= "SAVEPOINT"
database ::= "SCHEMA"
databases ::= "SCHEMAS"
second ::= "SECOND"
secondMicrosecond ::= "SECOND_MICROSECOND"
security ::= "SECURITY"
selectKwd ::= "SELECT"
serializable ::= "SERIALIZABLE"
session ::= "SESSION"
set ::= "SET"
separator ::= "SEPARATOR"
share ::= "SHARE"
shared ::= "SHARED"
show ::= "SHOW"
signed ::= "SIGNED"
slave ::= "SLAVE"
slow ::= "SLOW"
smallIntType ::= "SMALLINT"
snapshot ::= "SNAPSHOT"
some ::= "SOME"
sql ::= "SQL"
sqlCache ::= "SQL_CACHE"
sqlCalcFoundRows ::= "SQL_CALC_FOUND_ROWS"
sqlNoCache ::= "SQL_NO_CACHE"
start ::= "START"
starting ::= "STARTING"
stats ::= "STATS"
statsBuckets ::= "STATS_BUCKETS"
statsHistograms ::= "STATS_HISTOGRAMS"
statsHealthy ::= "STATS_HEALTHY"
statsMeta ::= "STATS_META"
statsPersistent ::= "STATS_PERSISTENT"
status ::= "STATUS"
//"STD"                      stddevPop
//"STDDEV"                   stddevPop
//"STDDEV_POP"               stddevPop
//"STDDEV_SAMP"              stddevSamp
stored ::= "STORED"
straightJoin ::= "STRAIGHT_JOIN"
//"SUBDATE"                  subDate
subpartition ::= "SUBPARTITION"
subpartitions ::= "SUBPARTITIONS"
//"SUBSTR"                   substring
//"SUBSTRING"                substring
//"SUM"                      sum
super ::= "SUPER"
tableKwd ::= "TABLE"
tables ::= "TABLES"
tablespace ::= "TABLESPACE"
temporary ::= "TEMPORARY"
temptable ::= "TEMPTABLE"
terminated ::= "TERMINATED"
textType ::= "TEXT"
than ::= "THAN"
then ::= "THEN"
tidb ::= "TIDB"
tidbHJ ::= "TIDB_HJ"
tidbINLJ ::= "TIDB_INLJ"
tidbSMJ ::= "TIDB_SMJ"
timeType ::= "TIME"
timestampType ::= "TIMESTAMP"
timestampAdd ::= "TIMESTAMPADD"
timestampDiff ::= "TIMESTAMPDIFF"
tinyblobType ::= "TINYBLOB"
tinyIntType ::= "TINYINT"
tinytextType ::= "TINYTEXT"
to ::= "TO"
top ::= "TOP"
trace ::= "TRACE"
trailing ::= "TRAILING"
transaction ::= "TRANSACTION"
trigger ::= "TRIGGER"
triggers ::= "TRIGGERS"
//"TRIM"                     trim
trueKwd ::= "TRUE"
truncate ::= "TRUNCATE"
unbounded ::= "UNBOUNDED"
uncommitted ::= "UNCOMMITTED"
undefined ::= "UNDEFINED"
union ::= "UNION"
unique ::= "UNIQUE"
unknown ::= "UNKNOWN"
unlock ::= "UNLOCK"
unsigned ::= "UNSIGNED"
update ::= "UPDATE"
usage ::= "USAGE"
use ::= "USE"
user ::= "USER"
using ::= "USING"
utcDate ::= "UTC_DATE"
utcTime ::= "UTC_TIME"
utcTimestamp ::= "UTC_TIMESTAMP"
value ::= "VALUE"
values ::= "VALUES"
varbinaryType ::= "VARBINARY"
varcharType ::= "VARCHAR"
variables ::= "VARIABLES"
//"VARIANCE"                 varPop
//"VAR_POP"                  varPop
//"VAR_SAMP"                 varSamp
view ::= "VIEW"
virtual ::= "VIRTUAL"
warnings ::= "WARNINGS"
identSQLErrors ::= "ERRORS"
week ::= "WEEK"
when ::= "WHEN"
where ::= "WHERE"
with ::= "WITH"
write ::= "WRITE"
xor ::= "XOR"
yearType ::= "YEAR"
yearMonth ::= "YEAR_MONTH"
zerofill ::= "ZEROFILL"
binding ::= "BINDING"
bindings ::= "BINDINGS"
work ::= "WORK"
chain ::= "CHAIN"
release ::= "RELEASE"
nowait ::= "NOWAIT"
skip ::= "SKIP"
locked ::= "LOCKED"

// See https://dev.mysql.com/doc/refman/5.7/en/function-resolution.html for details
builtinAddDate ::= "ADDDATE"
builtinBitAnd ::= "BIT_AND"
builtinBitOr ::= "BIT_OR"
builtinBitXor ::= "BIT_XOR"
builtinCast ::= "CAST"
builtinCount ::= "COUNT"
builtinCurDate ::= "CURDATE"
builtinCurTime ::= "CURTIME"
builtinDateAdd ::= "DATE_ADD"
builtinDateSub ::= "DATE_SUB"
builtinExtract ::= "EXTRACT"
builtinGroupConcat ::= "GROUP_CONCAT"
builtinMax ::= "MAX"
builtinSubstring ::= "MID"
builtinMin ::= "MIN"
builtinNow ::= "NOW"
builtinPosition ::= "POSITION"
builtinUser ::= "SESSION_USER"
builtinStddevPop ::= "STD"
builtinStddevPop ::= "STDDEV"
builtinStddevPop ::= "STDDEV_POP"
builtinStddevSamp ::= "STDDEV_SAMP"
builtinSubDate ::= "SUBDATE"
builtinSubstring ::= "SUBSTR"
builtinSubstring ::= "SUBSTRING"
builtinSum ::= "SUM"
builtinSysDate ::= "SYSDATE"
builtinUser ::= "SYSTEM_USER"
builtinTrim ::= "TRIM"
builtinVarPop ::= "VARIANCE"
builtinVarPop ::= "VAR_POP"
builtinVarSamp ::= "VAR_SAMP"

cumeDist ::= "CUME_DIST"
denseRank ::= "DENSE_RANK"
firstValue ::= "FIRST_VALUE"
groups ::= "GROUPS"
lag ::= "LAG"
lastValue ::= "LAST_VALUE"
lead ::= "LEAD"
nthValue ::= "NTH_VALUE"
ntile ::= "NTILE"
over ::= "OVER"
percentRank ::= "PERCENT_RANK"
rank ::= "RANK"
rows ::= "ROWS"
rowNumber ::= "ROW_NUMBER"
window ::= "WINDOW"

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions