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'))?) ('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')? '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 ')'
               | 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' expression
reference   ::= (table '.')? name
value       ::= 'TRUE'
                | 'FALSE'
                | 'NULL'
                | parameter
                | integer
                | unsigned
                | double
                | decimal
                | string
                | row
type        ::= 'ANY'
                | 'BOOL'
                | 'BOOLEAN'
                | 'DECIMAL'
                | 'DOUBLE'
                | 'INT'
                | 'INTEGER'
                | 'NUMBER'
                | 'SCALAR'
                | 'STRING'
                | 'TEXT'
                | 'UNSIGNED'
                | '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 )?