blob: b237f306fcdf7f3627ed10ccb6dcd2f2f2efed09 [file] [log] [blame]
Ian Maxon32f4269c2020-11-05 11:05:09 -08001Expr ::= OperatorExpr | QuantifiedExpr
2
3OperatorExpr ::= PathExpr
4 | Operator OperatorExpr
5 | OperatorExpr Operator OperatorExpr?
6 | OperatorExpr "BETWEEN" OperatorExpr "AND" OperatorExpr
7
ggalvizo21e52822021-07-27 10:26:31 -10008QuantifiedExpr::= ( "SOME" | "EVERY" | ( "SOME" "AND" "EVERY" ) ) Variable "IN" Expr ( "," Variable "IN" Expr )* "SATISFIES" Expr ("END")?
Ian Maxon32f4269c2020-11-05 11:05:09 -08009
10PathExpr ::= PrimaryExpr ("." Identifier | "[" Expr (":" (Expr)? )? "]")*
11
12PrimaryExpr ::= Literal
13 |VariableRef
14 |ParameterRef
15 |ParenthesizedExpr
16 |FunctionCall
17 |CaseExpr
18 |Constructor
19
20Literal ::= StringLiteral
21 |IntegerLiteral
22 |FloatLiteral
23 |DoubleLiteral
24 |"NULL"
25 |"MISSING"
26 |"TRUE"
27 |"FALSE"
28
29ParenthesizedExpr ::= ("(" Expr ")") | Subquery
30
Ian Maxon32f4269c2020-11-05 11:05:09 -080031FunctionCall ::= OrdinaryFunctionCall | AggregateFunctionCall | WindowFunctionCall
32
Dmitry Lychaginef1479a2021-01-26 12:33:54 -080033OrdinaryFunctionCall ::= (DataverseName ".")? Identifier "(" Expr ("," Expr)* ")"
Ian Maxon32f4269c2020-11-05 11:05:09 -080034
Dmitry Lychagin13828a12021-01-25 21:04:46 -080035AggregateFunctionCall ::= Identifier "(" ("DISTINCT")? Expr ")" ("FILTER" "(" "WHERE" Expr ")")?
Ian Maxon32f4269c2020-11-05 11:05:09 -080036
37CaseExpr ::= SimpleCaseExpr | SearchedCaseExpr
38
39SimpleCaseExpr ::= "CASE" Expr ("WHEN" Expr "THEN" Expr)+ ("ELSE" Expr)? "END"
40
Dmitry Lychagin13828a12021-01-25 21:04:46 -080041SearchedCaseExpr ::= "CASE" ("WHEN" Expr "THEN" Expr)+ ("ELSE" Expr)? "END"
Ian Maxon32f4269c2020-11-05 11:05:09 -080042
Dmitry Lychagine9630592021-08-30 15:29:30 -070043Constructor ::= ObjectConstructor | ArrayConstructor | ParenthesizedArrayConstructor | MultisetConstructor
Ian Maxon32f4269c2020-11-05 11:05:09 -080044
Dmitry Lychaginef1479a2021-01-26 12:33:54 -080045ObjectConstructor ::= "{" ( Expr ( ":" Expr )? ( "," Expr ( ":" Expr )? )* )? "}"
Ian Maxon32f4269c2020-11-05 11:05:09 -080046
47ArrayConstructor ::= "[" Expr ("," Expr)* "]"
48
Dmitry Lychagine9630592021-08-30 15:29:30 -070049ParenthesizedArrayConstructor ::= "(" Expr ("," Expr)+ ")"
50
Ian Maxon32f4269c2020-11-05 11:05:09 -080051MultisetConstructor ::= "{{" Expr ("," Expr)* "}}"
52
Dmitry Lychaginef1479a2021-01-26 12:33:54 -080053Query ::= (Expr | Selection)
Ian Maxon32f4269c2020-11-05 11:05:09 -080054
Dmitry Lychagin214ff552021-07-22 18:55:41 -070055Selection ::= (WithClause | LetClause)? QueryBlock UnionOption* OrderByClause? ( LimitClause | OffsetClause )?
Ian Maxon32f4269c2020-11-05 11:05:09 -080056
Dmitry Lychagin214ff552021-07-22 18:55:41 -070057QueryBlock ::= SelectClause ( ( LetClause WhereClause? ) | StreamGenerator )?
Dmitry Lychagin13828a12021-01-25 21:04:46 -080058 | StreamGenerator SelectClause
Ian Maxon32f4269c2020-11-05 11:05:09 -080059
60StreamGenerator::= FromClause LetClause? WhereClause? (GroupByClause LetClause? HavingClause?)?
61
Dmitry Lychagin13828a12021-01-25 21:04:46 -080062SelectClause ::= "SELECT" ("DISTINCT" | "ALL")? ( "VALUE" Expr | Projection ("," Projection)*)
63
64Projection ::= (Expr ("AS"? Identifier)?) | (VariableRef "." "*") | "*"
Ian Maxon32f4269c2020-11-05 11:05:09 -080065
66FromClause ::= "FROM" FromTerm ("," FromTerm)*
67
Dmitry Lychagin13828a12021-01-25 21:04:46 -080068FromTerm ::= NamedExpr (JoinStep | UnnestStep)*
Ian Maxon32f4269c2020-11-05 11:05:09 -080069
Dmitry Lychagin13828a12021-01-25 21:04:46 -080070NamedExpr ::= Expr ("AS"? Variable)?
Ian Maxon32f4269c2020-11-05 11:05:09 -080071
Dmitry Lychagind3eccd42021-08-19 12:18:17 -070072JoinStep ::= ( ("INNER" | ( ( "LEFT" | "RIGHT" ) "OUTER"?))? "JOIN" NamedExpr "ON" Expr ) |
73 ( "CROSS" "JOIN" NamedExpr )
Dmitry Lychagin13828a12021-01-25 21:04:46 -080074
75UnnestStep ::= ("INNER" | ( "LEFT" "OUTER"?))? "UNNEST" NamedExpr
Ian Maxon32f4269c2020-11-05 11:05:09 -080076
77LetClause ::= "LET" Variable "=" Expr ("," Variable "=" Expr)*
78
79WhereClause ::= "WHERE" Expr
80
Dmitry Lychagin8bcc6d22021-01-25 16:39:18 -080081GroupByClause ::= "GROUP BY" GroupingElement ("," GroupingElement)* GroupAsClause?
Ian Maxon32f4269c2020-11-05 11:05:09 -080082
Dmitry Lychaginef1479a2021-01-26 12:33:54 -080083GroupingElement ::= OrdinaryGroupingSet
Dmitry Lychagin8bcc6d22021-01-25 16:39:18 -080084 | ( "GROUPING" "SETS" "(" GroupingElement ("," GroupingElement)* ")" )
85 | ( ( "ROLLUP" | "CUBE" ) "(" OrdinaryGroupingSet ( "," OrdinaryGroupingSet )* ")" )
86 | ( "(" ")" )
87
Dmitry Lychaginef1479a2021-01-26 12:33:54 -080088OrdinaryGroupingSet ::= NamedExpr | ( "(" NamedExpr ( "," NamedExpr )* ")")
Ian Maxon32f4269c2020-11-05 11:05:09 -080089
Dmitry Lychagin13828a12021-01-25 21:04:46 -080090GroupAsClause ::= "GROUP AS" Variable
Ian Maxon32f4269c2020-11-05 11:05:09 -080091
Dmitry Lychagin8bcc6d22021-01-25 16:39:18 -080092HavingClause ::= "HAVING" Expr
93
Dmitry Lychagin6fd8ab32020-12-03 09:04:14 -080094Selection ::= WithClause? QueryBlock UnionOption* OrderByClause? ( LimitClause | OffsetClause )?
Ian Maxon32f4269c2020-11-05 11:05:09 -080095
96UnionOption ::= "UNION ALL" (QueryBlock | Subquery)
97
Dmitry Lychagin13828a12021-01-25 21:04:46 -080098WithClause ::= "WITH" Variable "AS" Expr ("," Variable "AS" Expr)*
Ian Maxon32f4269c2020-11-05 11:05:09 -080099
Dmitry Lychagine5e3ad92021-07-15 12:44:47 -0700100OrderbyClause ::= "ORDER BY" Expr ( "ASC" | "DESC" )? ( "NULLS" ( "FIRST" | "LAST" ) )? ( "," Expr ( "ASC" | "DESC" )? ( "NULLS" ( "FIRST" | "LAST" ) )? )*
Ian Maxon32f4269c2020-11-05 11:05:09 -0800101
Dmitry Lychagin761c9a62020-11-19 10:22:11 -0800102LimitClause ::= "LIMIT" Expr OffsetClause?
103
104OffsetClause ::= "OFFSET" Expr
Ian Maxon32f4269c2020-11-05 11:05:09 -0800105
106Subquery ::= "(" Selection ")"
107
108WindowFunctionCall ::= WindowFunctionType "(" WindowFunctionArguments ")" WindowFunctionOptions? "OVER" (Variable "AS")? "(" WindowDefinition")"
109
Dmitry Lychagin13828a12021-01-25 21:04:46 -0800110WindowFunctionType ::= AggregateFunction | WindowFunction
Ian Maxon32f4269c2020-11-05 11:05:09 -0800111
112WindowFunctionArguments ::= ( ("DISTINCT")? Expr | (Expr ("," Expr ("," Expr)? )? )? )
113
114WindowFunctionOptions ::= ("FROM" ( "FIRST" | "LAST" ))? (( "RESPECT" | "IGNORE" ) "NULLS")?
115
116WindowDefinition ::= WindowPartitionClause? (WindowOrderClause (WindowFrameClause WindowFrameExclusion?)?)?
117
118WindowPartitionClause ::= "PARTITION" "BY" Expr ("," Expr)*
119
Dmitry Lychagine5e3ad92021-07-15 12:44:47 -0700120WindowOrderClause ::= "ORDER" "BY" Expr ("ASC" | "DESC")? ( "NULLS" ( "FIRST" | "LAST" ) )? ("," Expr ("ASC" | "DESC")? ( "NULLS" ( "FIRST" | "LAST" ) )? )*
Ian Maxon32f4269c2020-11-05 11:05:09 -0800121
122WindowFrameClause ::= ("ROWS" | "RANGE" | "GROUPS") WindowFrameExtent
123
124WindowFrameExtent ::= ( ( "UNBOUNDED" | Expr ) "PRECEDING" | "CURRENT" "ROW" ) |
Dmitry Lychagin13828a12021-01-25 21:04:46 -0800125 "BETWEEN" ( "UNBOUNDED" "PRECEDING" | "CURRENT" "ROW" | Expr ( "PRECEDING" | "FOLLOWING" ) )
126 "AND" ( "UNBOUNDED" "FOLLOWING" | "CURRENT" "ROW" | Expr ( "PRECEDING" | "FOLLOWING" ) )
Ian Maxon32f4269c2020-11-05 11:05:09 -0800127
Dmitry Lychagin13828a12021-01-25 21:04:46 -0800128WindowFrameExclusion ::= "EXCLUDE" ( "CURRENT" "ROW" | "GROUP" | "TIES" | "NO" "OTHERS" )
Ian Maxon32f4269c2020-11-05 11:05:09 -0800129
130Stmnt::= (SingleStmnt ";")+ "EOF"
131
132SingleStmnt ::= UseStmnt
133 |SetStmnt
134 |FunctionDeclaration
135 |Query
136 |CreateStmnt
137 |DropStmnt
138 |LoadStmnt
139 |InsertStmnt
140 |UpsertStmnt
141 |DeleteStmnt
142
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800143UseStmnt ::= "USE" DataverseName
144
145SetStmnt ::= "SET" Identifier StringLiteral
Ian Maxon32f4269c2020-11-05 11:05:09 -0800146
Ian Maxon32f4269c2020-11-05 11:05:09 -0800147CreateStmnt ::= CreateDataverse
148 | CreateType
149 | CreateDataset
150 | CreateIndex
151 | CreateSynonym
152 | CreateFunction
Dmitry Lychagin793c39e2021-04-21 16:52:10 -0700153 | CreateView
Ian Maxon32f4269c2020-11-05 11:05:09 -0800154
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800155DataverseName ::= Identifier ("." Identifier)*
Ian Maxon32f4269c2020-11-05 11:05:09 -0800156
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800157QualifiedName ::= (DataverseName ".")? Identifier
Ian Maxon32f4269c2020-11-05 11:05:09 -0800158
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800159DoubleQualifiedName ::= (DataverseName ".")? Identifier "." Identifier
160
161CreateDataverse ::= "CREATE" "DATAVERSE" DataverseName ("IF" "NOT" "EXISTS")?
Ian Maxon32f4269c2020-11-05 11:05:09 -0800162
163CreateType ::= "CREATE" "TYPE" QualifiedName ("IF" "NOT" "EXISTS")? "AS" ObjectTypeDef
164
165ObjectTypeDef ::= ("CLOSED" | "OPEN")? "{" ObjectField ("," ObjectField)* "}"
166
167ObjectField ::= Identifier ":" Identifier "?"?
168
169TypeExpr ::= ObjectTypeDef
Dmitry Lychagin0ebc4202021-01-25 13:12:41 -0800170 | ArrayTypeDef
171 | MultisetTypeDef
172 | TypeReference
Ian Maxon32f4269c2020-11-05 11:05:09 -0800173
174ArrayTypeDef ::= "[" TypeExpr "]"
175
176MultisetTypeDef ::= "{{" TypeExpr "}}"
177
Dmitry Lychagin0ebc4202021-01-25 13:12:41 -0800178TypeReference ::= QualifiedName
Ian Maxon32f4269c2020-11-05 11:05:09 -0800179
180CreateDataset ::= CreateInternalDataset | CreateExternalDataset
181
Dmitry Lychagin0ebc4202021-01-25 13:12:41 -0800182CreateInternalDataset ::= ( "INTERNAL" )? "DATASET" QualifiedName DatasetTypeDef ( "WITH" "META" DatasetTypeDef )?
183 ("IF" "NOT" "EXISTS")?
184 PrimaryKey
185 ( "HINTS" Properties )?
186 ( "WITH" "FILTER" "ON" NestedField )?
187 ( "WITH" ObjectConstructor )?
Ian Maxon32f4269c2020-11-05 11:05:09 -0800188
Dmitry Lychagin0ebc4202021-01-25 13:12:41 -0800189CreateExternalDataset ::= "EXTERNAL" "DATASET" QualifiedName DatasetTypeDef
190 ("IF" "NOT" "EXISTS")?
191 "USING" AdapterName Configuration
192 ( "HINTS" Properties )?
193 ( "WITH" ObjectConstructor )?
194
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800195DatasetTypeDef ::= ( "(" TypeReference ")" )
196 | ( "(" DatasetFieldDef ("," DatasetFieldDef )* ")" ( ("CLOSED" | "OPEN") "TYPE" )? )
Dmitry Lychagin0ebc4202021-01-25 13:12:41 -0800197
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800198DatasetFieldDef ::= Identifier TypeReference ("NOT" "UNKNOWN")?
Dmitry Lychagin0ebc4202021-01-25 13:12:41 -0800199
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800200PrimaryKey ::= "PRIMARY" "KEY" NestedField ( "," NestedField )* ("AUTOGENERATED")?
Dmitry Lychagin0ebc4202021-01-25 13:12:41 -0800201
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800202NestedField ::= Identifier ( "." Identifier )*
Ian Maxon32f4269c2020-11-05 11:05:09 -0800203
204AdapterName ::= Identifier
205
206Configuration::= "(" (KeyValuePair ("," KeyValuePair)*)? ")"
207
208KeyValuePair ::= "(" StringLiteral "=" StringLiteral ")"
209
210Properties ::= ( "(" Identifier "=" ( StringLiteral | IntegerLiteral ) ( "," Identifier "=" ( StringLiteral | IntegerLiteral ) )* ")" )?
211
Ian Maxon32f4269c2020-11-05 11:05:09 -0800212CreateIndex ::= CreateSecondaryIndex | CreatePrimaryKeyIndex
213
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800214CreateSecondaryIndex ::= "CREATE" "INDEX" Identifier ("IF" "NOT" "EXISTS")? "ON" QualifiedName
Glenn67fd1f32021-02-25 16:04:49 -0800215 "(" IndexedElement ( "," IndexedElement )* ")" ("TYPE" IndexType)? ("ENFORCED")?
ggalvizodb2d0e72021-09-22 10:55:05 -0700216 (( "EXCLUDE" | "INCLUDE" ) "UNKNOWN" "KEY")?
Ian Maxon32f4269c2020-11-05 11:05:09 -0800217
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800218CreatePrimaryKeyIndex ::= "CREATE" "PRIMARY" "INDEX" Identifier? ("IF" "NOT" "EXISTS")? "ON" QualifiedName ("TYPE" "BTREE")?
Ian Maxon32f4269c2020-11-05 11:05:09 -0800219
Glenn67fd1f32021-02-25 16:04:49 -0800220IndexedElement ::= ArrayIndexElement
221 | IndexField
222 | "(" ( ArrayIndexElement | IndexField ) ")"
223
Glenn58329202021-04-09 12:03:46 -0700224ArrayIndexElement ::= "UNNEST" NestedField ( "UNNEST" NestedField )*
225 ( ( ":" TypeReference ) | ( "SELECT" NestedField ( ":" TypeReference )? ( "," NestedField ( ":" TypeReference )? )* ) )?
Glenn67fd1f32021-02-25 16:04:49 -0800226
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800227IndexField ::= NestedField ( ":" TypeReference "?"? )?
Ian Maxon32f4269c2020-11-05 11:05:09 -0800228
229IndexType ::= "BTREE"
230 |"RTREE"
231 |"KEYWORD"
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800232 |"FULLTEXT"
Ian Maxon32f4269c2020-11-05 11:05:09 -0800233 |"NGRAM" "(" IntegerLiteral ")"
234
235CreateSynonym ::= "CREATE" "SYNONYM" QualifiedName "FOR" QualifiedName ("IF" "NOT" "EXISTS")?
236
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800237FunctionDeclaration ::= "DECLARE" "FUNCTION" Identifier "(" ( (Identifier ("," Identifier)*) | "..." )? ")" "{" Expr "}"
Dmitry Lychagin0ebc4202021-01-25 13:12:41 -0800238
Dmitry Lychagin265e3ce2021-03-02 12:22:38 -0800239CreateFunction ::= "CREATE" ("OR" "REPLACE")? "FUNCTION" QualifiedName "(" FunctionParameters? ")" ("IF" "NOT" "EXISTS")?
Dmitry Lychagin13828a12021-01-25 21:04:46 -0800240 ( ("{" Expr "}") | ExternalFunctionDef )
241
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800242FunctionParameters ::= ( Identifier ((":")? TypeExpr)? ("," Identifier ((":")? TypeExpr)? )* ) | "..."
Ian Maxon32f4269c2020-11-05 11:05:09 -0800243
Dmitry Lychagin0ebc4202021-01-25 13:12:41 -0800244ExternalFunctionDef ::= ("RETURNS" TypeExpr)? "AS" StringLiteral ("," StringLiteral )* "AT" QualifiedName ("WITH" ObjectConstructor)?
Ian Maxon32f4269c2020-11-05 11:05:09 -0800245
Dmitry Lychagin793c39e2021-04-21 16:52:10 -0700246CreateView ::= "CREATE" ("OR" "REPLACE")? "VIEW" QualifiedName ("IF" "NOT" "EXISTS")? "AS" Selection
247
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800248DropStmnt ::= "DROP" ("DATAVERSE" DataverseName
Dmitry Lychagin793c39e2021-04-21 16:52:10 -0700249 | ("TYPE" |"DATASET" |"SYNONYM" |"VIEW") QualifiedName
Ian Maxon32f4269c2020-11-05 11:05:09 -0800250 | "INDEX" DoubleQualifiedName
251 | "FUNCTION" FunctionSignature ) ("IF" "EXISTS")?
252
Dmitry Lychagin13828a12021-01-25 21:04:46 -0800253FunctionSignature ::= QualifiedName ( ( "(" ( FunctionParameters? | IntegerLiteral ) ")" ) | ("@" IntegerLiteral) )
Ian Maxon32f4269c2020-11-05 11:05:09 -0800254
255LoadStmnt ::= "LOAD" "DATASET" QualifiedName "USING" AdapterName Configuration ("PRE-SORTED")?
256
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800257InsertStmnt ::= "INSERT" "INTO" QualifiedName ("AS" Variable)? Query ("RETURNING" Expr)?
Ian Maxon32f4269c2020-11-05 11:05:09 -0800258
Dmitry Lychaginef1479a2021-01-26 12:33:54 -0800259UpsertStmnt ::= "UPSERT" "INTO" QualifiedName ("AS" Variable)? Query ("RETURNING" Expr)?
Ian Maxon32f4269c2020-11-05 11:05:09 -0800260
261DeleteStmnt ::= "DELETE" "FROM" QualifiedName (("AS")? Variable)? ("WHERE" Expr)?