I hope that this can help document/develop the grammar.
//
// 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"
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/Lexlike online interpreter/editor (selectGAEA-QL parser (be patient)(partially working)fromExamplesthen clickParseto see a parse tree for the content inInput source).