Skip to content
Snippets Groups Projects
Verified Commit 5dc3c04e authored by Denis Smirnov's avatar Denis Smirnov
Browse files

feat: actualize EBNF

parent 8cd8507e
No related branches found
No related tags found
1 merge request!1414sbroad import
statement ::= explain | ddl | dml | dql | acl | call
explain ::= 'EXPLAIN' ( dml | dql )
dql ::= (select | select union all select | select (except 'DISTINCT'? ) select ) options?
dml ::= (delete | insert | update) options?
ddl ::= create_table | drop_table | create_procedure | drop_procedure
acl ::= drop_role | drop_user | create_role | create_user | alter_user | grant_privilege | revoke_privilege
call ::= 'CALL' procedure '(' value ( ',' value )* ')' options?
revoke_privilege ::= 'REVOKE' privilege 'FROM' (role | user) ('OPTION' '(' ('TIMEOUT' '=' double)')')?
grant_privilege ::= 'GRANT' privilege 'TO' (role | user) ('OPTION' '(' ('TIMEOUT' '=' double)')')?
privilege ::= (('CREATE' | 'ALTER' | 'DROP') 'USER')
| (('ALTER' | 'DROP') 'ON' 'USER' (role | user))
| (('CREATE' | 'DROP') 'ROLE')
| ('DROP' 'ON' 'ROLE' (role | user))
| (('READ' | 'WRITE' | 'CREATE' | 'ALTER' | 'DROP') 'TABLE')
| (('ALTER' | 'DROP' | 'READ' | 'WRITE') 'ON' 'TABLE'? table)
| (('CREATE' | 'EXECUTE') 'PROCEDURE')
| ('EXECUTE' 'PROCEDURE' procedure ('(' type (',' type)* ')')?)
| role
create_procedure ::= 'CREATE PROCEDURE' procedure '(' type (',' type)* ')'
('language' 'SQL')? (('as' '$$' body '$$') | ('begin' 'atomic' body 'end'))
body ::= (insert | update | delete)
create_role ::= 'CREATE ROLE' role ('OPTION' '(' ('TIMEOUT' '=' double)')')?
create_table ::= 'CREATE TABLE' table '(' column (',' column)* ',' primary_key ')' ('USING' ('MEMTX' | 'VINYL'))? distribution ('OPTION' '(' ('TIMEOUT' '=' double)')')?
create_user ::= 'CREATE USER' user 'WITH'? 'PASSWORD' "'" password "'" ('USING' ('CHAP-SHA1' | 'LDAP' | 'MD5'))? ('OPTION' '(' ('TIMEOUT' '=' double)')')?
alter_user ::= 'ALTER USER' user 'WITH'? ('LOGIN' | 'NOLOGIN' | 'PASSWORD' "'" password "'" ('USING' ('CHAP-SHA1' | 'LDAP' | 'MD5'))? | 'RENAME TO' user) ('OPTION' '(' ('TIMEOUT' '=' double)')')?
column ::= name ('BOOL' | 'DECIMAL' | 'DOUBLE' | 'INT' | 'NUMBER' | 'SCALAR' | 'STRING' | 'TEXT' | 'UNSIGNED' | 'VARCHAR') (('NOT'?) 'NULL')?
primary_key ::= 'PRIMARY KEY' '(' name (',' name)* ')'
distribution ::= 'GLOBAL' | ('DISTRIBUTED BY' '(' name (',' name)* ')')
drop_procedure ::= 'DROP PROCEDURE' procedure ('(' type (',' type)* ')')? ('OPTION' '(' ('TIMEOUT' '=' double)')')?
drop_table ::= 'DROP TABLE' table ('OPTION' '(' ('TIMEOUT' '=' double)')')?
drop_role ::= 'DROP ROLE' role ('OPTION' '(' ('TIMEOUT' '=' double)')')?
drop_user ::= 'DROP USER' user ('OPTION' '(' ('TIMEOUT' '=' double)')')?
options ::= 'OPTION' '(' ('VTABLE_MAX_ROWS' '=' unsigned)? (',' 'SQL_VDBE_MAX_STEPS' '=' unsigned)? ')'
select ::= 'SELECT' ((alias (',' alias)*) ) 'FROM' (table ('AS' name)? | '(' (select | values) ')' ('AS' name)?) ( ('INNER'|('LEFT' ('OUTER')?))? 'JOIN' (table ('AS' name)? | ('(' (select | values) ')' ('AS' name)?)) 'ON' expression )? ( 'WHERE' expression )? ( 'GROUP BY' expression(',' expression)* )?
values ::= 'VALUES' '(' row (',' row)* ')'
subquery ::= '(' (select | values) ')'
row ::= '(' (value (',' value)*) ')'
alias ::= '*' | (table '.')? name ('AS' name)? | table '.' '*' | expression ('AS' name)?
expression ::= column_name
| 'CAST' '(' expression 'AS' type ')'
dql ::= (select | values)
( 'OPTION' '('
(('VTABLE_MAX_ROWS' | 'SQL_VDBE_MAX_STEPS') '=' unsigned)
(',' (('VTABLE_MAX_ROWS' | 'SQL_VDBE_MAX_STEPS') '=' unsigned))*
')')?
select ::= 'SELECT' 'DISTINCT'? ((projection (',' projection)*))
'FROM' (table | ('(' (select | values) ')')) (('AS')? name)?
(
('INNER')? 'JOIN' (
((table | ('(' (select | values) ')')) (('AS')? name)?)
)
'ON' expression
)?
('WHERE' expression)?
('GROUP' 'BY' expression (',' expression)*)?
('HAVING' expression)?
((('UNION' 'ALL') | ('EXCEPT' 'DISTINCT'?)) select)?
projection ::= '*' | expression (('AS')? name)? | aggregate
expression ::= (table '.')? column
| expression ('IS' ('NOT')? 'NULL')
| expression ('OR' | 'AND' | '*' | '/' | '+' | '-' | '=' | '>' | '<' | '>=' | '<=' | ('<>' | '!=')) expression
| expression ('NOT')? 'BETWEEN' expression 'AND' expression
| ('NOT')? 'EXISTS' subquery
| expression ('NOT')? 'IN' subquery
| reference
| subquery
| value
| ('NOT')? 'EXISTS' '(' (select | values) ')'
| expression ('NOT')? 'IN' '(' (select | values) ')'
| (table '.')? column
| '(' (select | values) ')'
| literal
| cast
| ('(' (expression(',' expression)*) ')')
| 'NOT' expression
reference ::= (table '.')? name
value ::= 'TRUE'
| '(' expression ')'
aggregate ::= ('AVG' | 'COUNT' | 'MAX' | 'MIN' | 'SUM' | 'TOTAL') '(' expression ')'
| 'GROUP_CONCAT' '(' expression ',' "'" string "'" ')'
cast ::= 'CAST' '(' expression 'AS' type ')'
values ::= 'VALUES'
('(' (expression(',' expression)*) ')')
(',' ('(' (expression(',' expression)*) ')'))*
literal ::= 'TRUE'
| 'FALSE'
| 'NULL'
| parameter
| '?'
| ('$' unsigned)
| integer
| unsigned
| double
| decimal
| string
| row
type ::= 'ANY'
| 'BOOL'
| 'BOOLEAN'
dml ::= (call | delete | insert | update)
( 'OPTION' '('
(('VTABLE_MAX_ROWS' | 'SQL_VDBE_MAX_STEPS') '=' unsigned)
(',' (('VTABLE_MAX_ROWS' | 'SQL_VDBE_MAX_STEPS') '=' unsigned))*
')')?
call ::= 'CALL' procedure '(' literal? (',' literal)* ')'
delete ::= 'DELETE' 'FROM' table ('WHERE' expression)?
insert ::= 'INSERT' 'INTO' table ('(' column (',' column)* ')')? (values | select)
('ON' 'CONFLICT' 'DO' ('NOTHING' | 'REPLACE' | 'FAIL'))?
update ::= 'UPDATE' table
'SET' (
column '=' expression
(',' column '=' expression)*
)
('FROM' '(' (select | values) ')' (('AS')? name)?)? ('WHERE' expression)?
acl ::= (alter_user | create_role | create_user | drop_role | drop_user | grant | revoke)
('OPTION' '(' ('TIMEOUT' '=' double)')')?
revoke ::= 'REVOKE' (
(('CREATE' | 'ALTER' | 'DROP') 'USER')
| (('ALTER' | 'DROP') 'ON' 'USER' user)
| (('CREATE' | 'DROP') 'ROLE')
| ('DROP' 'ON' 'ROLE' role)
| (('CREATE' | 'ALTER' | 'DROP' | 'READ' | 'WRITE') 'TABLE')
| (('ALTER' | 'DROP' | 'READ' | 'WRITE') 'ON' 'TABLE' table)
| (('CREATE' | 'EXECUTE' | 'DROP') 'PROCEDURE')
| (('EXECUTE' | 'DROP') 'ON' 'PROCEDURE' procedure ('(' type (',' type)* ')')?)
| role
)
'FROM' (role | user)
grant ::= 'GRANT' (
(('CREATE' | 'ALTER' | 'DROP') 'USER')
| (('ALTER' | 'DROP') 'ON' 'USER' user)
| (('CREATE' | 'DROP') 'ROLE')
| ('DROP' 'ON' 'ROLE' role)
| (('CREATE' | 'ALTER' | 'DROP' | 'READ' | 'WRITE') 'TABLE')
| (('ALTER' | 'DROP' | 'READ' | 'WRITE') 'ON' 'TABLE' table)
| (('CREATE' | 'EXECUTE' | 'DROP') 'PROCEDURE')
| (('EXECUTE' | 'DROP') 'ON' 'PROCEDURE' procedure ('(' type (',' type)* ')')?)
| role
)
'TO' (role | user)
ddl ::= (alter_procedure | create_procedure | create_table | drop_procedure | drop_table)
('OPTION' '(' ('TIMEOUT' '=' double)')')?
alter_procedure ::= 'ALTER' 'PROCEDURE' procedure ('(' type (',' type)* ')')?
'RENAME' 'TO' procedure
create_procedure ::= 'CREATE' 'PROCEDURE' procedure '(' type (',' type)* ')'
('language' 'SQL')? (
('as' '$$' (insert | update | delete) '$$')
| ('begin' 'atomic' (insert | update | delete) 'end')
)
create_role ::= 'CREATE' 'ROLE' role
create_table ::= 'CREATE' 'TABLE' table
'('
column type ('NOT'? 'NULL')? (',' column type ('NOT'? 'NULL')?)* ','
'PRIMARY KEY' '(' column (',' column)* ')'
')'
('USING' ('MEMTX' | 'VINYL'))?
('DISTRIBUTED' (('BY' '(' column (',' column)* ')') | 'GLOBALLY'))
create_user ::= 'CREATE' 'USER' user 'WITH'? 'PASSWORD' "'" password "'"
('USING' ('CHAP-SHA1' | 'LDAP' | 'MD5'))?
alter_user ::= 'ALTER' 'USER' user
'WITH'? (
'LOGIN'
| 'NOLOGIN'
| 'PASSWORD' "'" password "'" ('USING' ('CHAP-SHA1' | 'LDAP' | 'MD5'))?
| 'RENAME' 'TO' user
)
drop_procedure ::= 'DROP' 'PROCEDURE' procedure ('(' type (',' type)* ')')?
drop_table ::= 'DROP' 'TABLE' table
drop_role ::= 'DROP' 'ROLE' role
drop_user ::= 'DROP' 'USER' user
type ::= ('BOOL' | 'BOOLEAN')
| 'DECIMAL'
| 'DOUBLE'
| 'INT'
| 'INTEGER'
| ('INT' | 'INTEGER')
| 'NUMBER'
| 'SCALAR'
| 'STRING'
| 'TEXT'
| ('STRING' | 'TEXT')
| 'UNSIGNED'
| 'UUID'
| 'VARCHAR' ('(' length ')')?
parameter ::= '$' unsigned | '?'
delete ::= 'DELETE' 'FROM' table ('WHERE' expression)?
insert ::= 'INSERT' 'INTO' table ('(' name (',' name)* ')')? (values row | select ) ('ON CONFLICT' 'DO' ('NOTHING' | 'REPLACE' | 'FAIL'))?
update ::= 'UPDATE' table 'SET' ( name '=' ((table '.')? name) (',' name '=' (table '.')? name)* ) ( 'FROM' '(' select ')' ( 'AS' name )? )? ( 'WHERE' expression )?
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment