-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathCosmosDBParser.g4
More file actions
201 lines (154 loc) · 5.21 KB
/
CosmosDBParser.g4
File metadata and controls
201 lines (154 loc) · 5.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
parser grammar CosmosDBParser;
options {
tokenVocab = CosmosDBLexer;
}
root: select EOF;
select:
select_clause from_clause? where_clause? group_by_clause? having_clause? order_by_clause?
offset_limit_clause?;
select_clause: SELECT_SYMBOL top_clause? select_specification;
top_clause: TOP_SYMBOL DECIMAL;
select_specification:
MULTIPLY_OPERATOR
| DISTINCT_SYMBOL? VALUE_SYMBOL? object_property_list;
from_clause: FROM_SYMBOL from_specification;
where_clause: WHERE_SYMBOL scalar_expression;
group_by_clause:
GROUP_SYMBOL BY_SYMBOL scalar_expression (
COMMA_SYMBOL scalar_expression
)*;
having_clause: HAVING_SYMBOL scalar_expression;
order_by_clause:
ORDER_SYMBOL BY_SYMBOL sort_expression (
COMMA_SYMBOL sort_expression
)*;
sort_expression: scalar_expression (ASC_SYMBOL | DESC_SYMBOL)?;
offset_limit_clause: OFFSET_SYMBOL DECIMAL LIMIT_SYMBOL DECIMAL;
from_specification: from_source;
from_source: container_expression (join_clause)*;
container_expression: container_name (AS_SYMBOL? identifier)?;
join_clause:
JOIN_SYMBOL identifier IN_SYMBOL scalar_expression;
container_name: identifier;
object_property_list:
object_property (COMMA_SYMBOL object_property)*;
object_property:
scalar_expression (AS_SYMBOL? property_alias)?;
property_alias: identifier;
// Unified scalar_expression - used in both SELECT projections and WHERE clause.
// https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/query/scalar-expressions
// Alternatives are ordered from highest precedence (first) to lowest (last) per ANTLR4 semantics.
scalar_expression:
constant
| input_alias
| parameter_name
| scalar_function_expression
| create_object_expression
| create_array_expression
| LR_BRACKET_SYMBOL scalar_expression RR_BRACKET_SYMBOL
| LR_BRACKET_SYMBOL select RR_BRACKET_SYMBOL
| EXISTS_SYMBOL LR_BRACKET_SYMBOL select RR_BRACKET_SYMBOL
| scalar_expression DOT_SYMBOL property_name
| scalar_expression LS_BRACKET_SYMBOL (
DOUBLE_QUOTE_STRING_LITERAL
| SINGLE_QUOTE_STRING_LITERAL
| array_index
) RS_BRACKET_SYMBOL
| unary_operator scalar_expression
| NOT_SYMBOL scalar_expression
| scalar_expression multiplicative_operator scalar_expression
| scalar_expression additive_operator scalar_expression
| scalar_expression shift_operator scalar_expression
| scalar_expression BIT_AND_SYMBOL scalar_expression
| scalar_expression BIT_XOR_SYMBOL scalar_expression
| scalar_expression BIT_OR_SYMBOL scalar_expression
| scalar_expression DOUBLE_BAR_SYMBOL scalar_expression
| scalar_expression comparison_operator scalar_expression
| scalar_expression NOT_SYMBOL? IN_SYMBOL LR_BRACKET_SYMBOL (
scalar_expression (COMMA_SYMBOL scalar_expression)*
)? RR_BRACKET_SYMBOL
| scalar_expression NOT_SYMBOL? BETWEEN_SYMBOL scalar_expression AND_SYMBOL scalar_expression
| scalar_expression NOT_SYMBOL? LIKE_SYMBOL scalar_expression
| scalar_expression AND_SYMBOL scalar_expression
| scalar_expression OR_SYMBOL scalar_expression
| scalar_expression QUESTION_MARK_SYMBOL scalar_expression COLON_SYMBOL scalar_expression;
create_array_expression:
LS_BRACKET_SYMBOL (
scalar_expression (COMMA_SYMBOL scalar_expression)*
)? RS_BRACKET_SYMBOL;
create_object_expression:
LC_BRACKET_SYMBOL (
object_field_pair (COMMA_SYMBOL object_field_pair)*
)? RC_BRACKET_SYMBOL;
object_field_pair:
(string_literal | property_name) COLON_SYMBOL scalar_expression;
scalar_function_expression:
udf_scalar_function_expression
| builtin_function_expression;
udf_scalar_function_expression:
UDF_SYMBOL DOT_SYMBOL identifier LR_BRACKET_SYMBOL (
scalar_expression (COMMA_SYMBOL scalar_expression)*
)? RR_BRACKET_SYMBOL;
builtin_function_expression:
identifier LR_BRACKET_SYMBOL (
(MULTIPLY_OPERATOR | scalar_expression) (
COMMA_SYMBOL scalar_expression
)*
)? RR_BRACKET_SYMBOL;
multiplicative_operator:
MULTIPLY_OPERATOR
| DIVIDE_SYMBOL
| MODULO_SYMBOL;
additive_operator: PLUS_SYMBOL | MINUS_SYMBOL;
shift_operator:
LEFT_SHIFT_OPERATOR
| RIGHT_SHIFT_OPERATOR
| ZERO_FILL_RIGHT_SHIFT_OPERATOR;
comparison_operator:
EQUAL_SYMBOL
| NOT_EQUAL_OPERATOR
| LESS_THAN_OPERATOR
| LESS_THAN_EQUAL_OPERATOR
| GREATER_THAN_OPERATOR
| GREATER_THAN_EQUAL_OPERATOR;
unary_operator: BIT_NOT_SYMBOL | PLUS_SYMBOL | MINUS_SYMBOL;
parameter_name: AT_SYMBOL identifier;
// https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/query/constants
constant:
undefined_constant
| null_constant
| boolean_constant
| number_constant
| string_constant;
undefined_constant: UNDEFINED_SYMBOL;
null_constant: NULL_SYMBOL;
boolean_constant: TRUE_SYMBOL | FALSE_SYMBOL;
number_constant: decimal_literal | hexadecimal_literal;
string_constant: string_literal;
string_literal:
SINGLE_QUOTE_STRING_LITERAL
| DOUBLE_QUOTE_STRING_LITERAL;
decimal_literal: DECIMAL | REAL | FLOAT;
hexadecimal_literal: HEXADECIMAL;
// Allow keywords to be used as identifiers (property names, aliases, etc.)
// This is necessary because CosmosDB allows keywords as property names.
identifier:
IDENTIFIER
| IN_SYMBOL
| BETWEEN_SYMBOL
| TOP_SYMBOL
| VALUE_SYMBOL
| ORDER_SYMBOL
| BY_SYMBOL
| GROUP_SYMBOL
| OFFSET_SYMBOL
| LIMIT_SYMBOL
| ASC_SYMBOL
| DESC_SYMBOL
| EXISTS_SYMBOL
| LIKE_SYMBOL
| HAVING_SYMBOL
| JOIN_SYMBOL;
property_name: identifier;
array_index: DECIMAL;
input_alias: identifier;