blob: b237f306fcdf7f3627ed10ccb6dcd2f2f2efed09 [file] [log] [blame]
Expr ::= OperatorExpr | QuantifiedExpr
OperatorExpr ::= PathExpr
| Operator OperatorExpr
| OperatorExpr Operator OperatorExpr?
| OperatorExpr "BETWEEN" OperatorExpr "AND" OperatorExpr
QuantifiedExpr::= ( "SOME" | "EVERY" | ( "SOME" "AND" "EVERY" ) ) Variable "IN" Expr ( "," Variable "IN" Expr )* "SATISFIES" Expr ("END")?
PathExpr ::= PrimaryExpr ("." Identifier | "[" Expr (":" (Expr)? )? "]")*
PrimaryExpr ::= Literal
|VariableRef
|ParameterRef
|ParenthesizedExpr
|FunctionCall
|CaseExpr
|Constructor
Literal ::= StringLiteral
|IntegerLiteral
|FloatLiteral
|DoubleLiteral
|"NULL"
|"MISSING"
|"TRUE"
|"FALSE"
ParenthesizedExpr ::= ("(" Expr ")") | Subquery
FunctionCall ::= OrdinaryFunctionCall | AggregateFunctionCall | WindowFunctionCall
OrdinaryFunctionCall ::= (DataverseName ".")? Identifier "(" Expr ("," Expr)* ")"
AggregateFunctionCall ::= Identifier "(" ("DISTINCT")? Expr ")" ("FILTER" "(" "WHERE" Expr ")")?
CaseExpr ::= SimpleCaseExpr | SearchedCaseExpr
SimpleCaseExpr ::= "CASE" Expr ("WHEN" Expr "THEN" Expr)+ ("ELSE" Expr)? "END"
SearchedCaseExpr ::= "CASE" ("WHEN" Expr "THEN" Expr)+ ("ELSE" Expr)? "END"
Constructor ::= ObjectConstructor | ArrayConstructor | ParenthesizedArrayConstructor | MultisetConstructor
ObjectConstructor ::= "{" ( Expr ( ":" Expr )? ( "," Expr ( ":" Expr )? )* )? "}"
ArrayConstructor ::= "[" Expr ("," Expr)* "]"
ParenthesizedArrayConstructor ::= "(" Expr ("," Expr)+ ")"
MultisetConstructor ::= "{{" Expr ("," Expr)* "}}"
Query ::= (Expr | Selection)
Selection ::= (WithClause | LetClause)? QueryBlock UnionOption* OrderByClause? ( LimitClause | OffsetClause )?
QueryBlock ::= SelectClause ( ( LetClause WhereClause? ) | StreamGenerator )?
| StreamGenerator SelectClause
StreamGenerator::= FromClause LetClause? WhereClause? (GroupByClause LetClause? HavingClause?)?
SelectClause ::= "SELECT" ("DISTINCT" | "ALL")? ( "VALUE" Expr | Projection ("," Projection)*)
Projection ::= (Expr ("AS"? Identifier)?) | (VariableRef "." "*") | "*"
FromClause ::= "FROM" FromTerm ("," FromTerm)*
FromTerm ::= NamedExpr (JoinStep | UnnestStep)*
NamedExpr ::= Expr ("AS"? Variable)?
JoinStep ::= ( ("INNER" | ( ( "LEFT" | "RIGHT" ) "OUTER"?))? "JOIN" NamedExpr "ON" Expr ) |
( "CROSS" "JOIN" NamedExpr )
UnnestStep ::= ("INNER" | ( "LEFT" "OUTER"?))? "UNNEST" NamedExpr
LetClause ::= "LET" Variable "=" Expr ("," Variable "=" Expr)*
WhereClause ::= "WHERE" Expr
GroupByClause ::= "GROUP BY" GroupingElement ("," GroupingElement)* GroupAsClause?
GroupingElement ::= OrdinaryGroupingSet
| ( "GROUPING" "SETS" "(" GroupingElement ("," GroupingElement)* ")" )
| ( ( "ROLLUP" | "CUBE" ) "(" OrdinaryGroupingSet ( "," OrdinaryGroupingSet )* ")" )
| ( "(" ")" )
OrdinaryGroupingSet ::= NamedExpr | ( "(" NamedExpr ( "," NamedExpr )* ")")
GroupAsClause ::= "GROUP AS" Variable
HavingClause ::= "HAVING" Expr
Selection ::= WithClause? QueryBlock UnionOption* OrderByClause? ( LimitClause | OffsetClause )?
UnionOption ::= "UNION ALL" (QueryBlock | Subquery)
WithClause ::= "WITH" Variable "AS" Expr ("," Variable "AS" Expr)*
OrderbyClause ::= "ORDER BY" Expr ( "ASC" | "DESC" )? ( "NULLS" ( "FIRST" | "LAST" ) )? ( "," Expr ( "ASC" | "DESC" )? ( "NULLS" ( "FIRST" | "LAST" ) )? )*
LimitClause ::= "LIMIT" Expr OffsetClause?
OffsetClause ::= "OFFSET" Expr
Subquery ::= "(" Selection ")"
WindowFunctionCall ::= WindowFunctionType "(" WindowFunctionArguments ")" WindowFunctionOptions? "OVER" (Variable "AS")? "(" WindowDefinition")"
WindowFunctionType ::= AggregateFunction | WindowFunction
WindowFunctionArguments ::= ( ("DISTINCT")? Expr | (Expr ("," Expr ("," Expr)? )? )? )
WindowFunctionOptions ::= ("FROM" ( "FIRST" | "LAST" ))? (( "RESPECT" | "IGNORE" ) "NULLS")?
WindowDefinition ::= WindowPartitionClause? (WindowOrderClause (WindowFrameClause WindowFrameExclusion?)?)?
WindowPartitionClause ::= "PARTITION" "BY" Expr ("," Expr)*
WindowOrderClause ::= "ORDER" "BY" Expr ("ASC" | "DESC")? ( "NULLS" ( "FIRST" | "LAST" ) )? ("," Expr ("ASC" | "DESC")? ( "NULLS" ( "FIRST" | "LAST" ) )? )*
WindowFrameClause ::= ("ROWS" | "RANGE" | "GROUPS") WindowFrameExtent
WindowFrameExtent ::= ( ( "UNBOUNDED" | Expr ) "PRECEDING" | "CURRENT" "ROW" ) |
"BETWEEN" ( "UNBOUNDED" "PRECEDING" | "CURRENT" "ROW" | Expr ( "PRECEDING" | "FOLLOWING" ) )
"AND" ( "UNBOUNDED" "FOLLOWING" | "CURRENT" "ROW" | Expr ( "PRECEDING" | "FOLLOWING" ) )
WindowFrameExclusion ::= "EXCLUDE" ( "CURRENT" "ROW" | "GROUP" | "TIES" | "NO" "OTHERS" )
Stmnt::= (SingleStmnt ";")+ "EOF"
SingleStmnt ::= UseStmnt
|SetStmnt
|FunctionDeclaration
|Query
|CreateStmnt
|DropStmnt
|LoadStmnt
|InsertStmnt
|UpsertStmnt
|DeleteStmnt
UseStmnt ::= "USE" DataverseName
SetStmnt ::= "SET" Identifier StringLiteral
CreateStmnt ::= CreateDataverse
| CreateType
| CreateDataset
| CreateIndex
| CreateSynonym
| CreateFunction
| CreateView
DataverseName ::= Identifier ("." Identifier)*
QualifiedName ::= (DataverseName ".")? Identifier
DoubleQualifiedName ::= (DataverseName ".")? Identifier "." Identifier
CreateDataverse ::= "CREATE" "DATAVERSE" DataverseName ("IF" "NOT" "EXISTS")?
CreateType ::= "CREATE" "TYPE" QualifiedName ("IF" "NOT" "EXISTS")? "AS" ObjectTypeDef
ObjectTypeDef ::= ("CLOSED" | "OPEN")? "{" ObjectField ("," ObjectField)* "}"
ObjectField ::= Identifier ":" Identifier "?"?
TypeExpr ::= ObjectTypeDef
| ArrayTypeDef
| MultisetTypeDef
| TypeReference
ArrayTypeDef ::= "[" TypeExpr "]"
MultisetTypeDef ::= "{{" TypeExpr "}}"
TypeReference ::= QualifiedName
CreateDataset ::= CreateInternalDataset | CreateExternalDataset
CreateInternalDataset ::= ( "INTERNAL" )? "DATASET" QualifiedName DatasetTypeDef ( "WITH" "META" DatasetTypeDef )?
("IF" "NOT" "EXISTS")?
PrimaryKey
( "HINTS" Properties )?
( "WITH" "FILTER" "ON" NestedField )?
( "WITH" ObjectConstructor )?
CreateExternalDataset ::= "EXTERNAL" "DATASET" QualifiedName DatasetTypeDef
("IF" "NOT" "EXISTS")?
"USING" AdapterName Configuration
( "HINTS" Properties )?
( "WITH" ObjectConstructor )?
DatasetTypeDef ::= ( "(" TypeReference ")" )
| ( "(" DatasetFieldDef ("," DatasetFieldDef )* ")" ( ("CLOSED" | "OPEN") "TYPE" )? )
DatasetFieldDef ::= Identifier TypeReference ("NOT" "UNKNOWN")?
PrimaryKey ::= "PRIMARY" "KEY" NestedField ( "," NestedField )* ("AUTOGENERATED")?
NestedField ::= Identifier ( "." Identifier )*
AdapterName ::= Identifier
Configuration::= "(" (KeyValuePair ("," KeyValuePair)*)? ")"
KeyValuePair ::= "(" StringLiteral "=" StringLiteral ")"
Properties ::= ( "(" Identifier "=" ( StringLiteral | IntegerLiteral ) ( "," Identifier "=" ( StringLiteral | IntegerLiteral ) )* ")" )?
CreateIndex ::= CreateSecondaryIndex | CreatePrimaryKeyIndex
CreateSecondaryIndex ::= "CREATE" "INDEX" Identifier ("IF" "NOT" "EXISTS")? "ON" QualifiedName
"(" IndexedElement ( "," IndexedElement )* ")" ("TYPE" IndexType)? ("ENFORCED")?
(( "EXCLUDE" | "INCLUDE" ) "UNKNOWN" "KEY")?
CreatePrimaryKeyIndex ::= "CREATE" "PRIMARY" "INDEX" Identifier? ("IF" "NOT" "EXISTS")? "ON" QualifiedName ("TYPE" "BTREE")?
IndexedElement ::= ArrayIndexElement
| IndexField
| "(" ( ArrayIndexElement | IndexField ) ")"
ArrayIndexElement ::= "UNNEST" NestedField ( "UNNEST" NestedField )*
( ( ":" TypeReference ) | ( "SELECT" NestedField ( ":" TypeReference )? ( "," NestedField ( ":" TypeReference )? )* ) )?
IndexField ::= NestedField ( ":" TypeReference "?"? )?
IndexType ::= "BTREE"
|"RTREE"
|"KEYWORD"
|"FULLTEXT"
|"NGRAM" "(" IntegerLiteral ")"
CreateSynonym ::= "CREATE" "SYNONYM" QualifiedName "FOR" QualifiedName ("IF" "NOT" "EXISTS")?
FunctionDeclaration ::= "DECLARE" "FUNCTION" Identifier "(" ( (Identifier ("," Identifier)*) | "..." )? ")" "{" Expr "}"
CreateFunction ::= "CREATE" ("OR" "REPLACE")? "FUNCTION" QualifiedName "(" FunctionParameters? ")" ("IF" "NOT" "EXISTS")?
( ("{" Expr "}") | ExternalFunctionDef )
FunctionParameters ::= ( Identifier ((":")? TypeExpr)? ("," Identifier ((":")? TypeExpr)? )* ) | "..."
ExternalFunctionDef ::= ("RETURNS" TypeExpr)? "AS" StringLiteral ("," StringLiteral )* "AT" QualifiedName ("WITH" ObjectConstructor)?
CreateView ::= "CREATE" ("OR" "REPLACE")? "VIEW" QualifiedName ("IF" "NOT" "EXISTS")? "AS" Selection
DropStmnt ::= "DROP" ("DATAVERSE" DataverseName
| ("TYPE" |"DATASET" |"SYNONYM" |"VIEW") QualifiedName
| "INDEX" DoubleQualifiedName
| "FUNCTION" FunctionSignature ) ("IF" "EXISTS")?
FunctionSignature ::= QualifiedName ( ( "(" ( FunctionParameters? | IntegerLiteral ) ")" ) | ("@" IntegerLiteral) )
LoadStmnt ::= "LOAD" "DATASET" QualifiedName "USING" AdapterName Configuration ("PRE-SORTED")?
InsertStmnt ::= "INSERT" "INTO" QualifiedName ("AS" Variable)? Query ("RETURNING" Expr)?
UpsertStmnt ::= "UPSERT" "INTO" QualifiedName ("AS" Variable)? Query ("RETURNING" Expr)?
DeleteStmnt ::= "DELETE" "FROM" QualifiedName (("AS")? Variable)? ("WHERE" Expr)?