Skip to content

Commit 274cae3

Browse files
h3n4lclaude
andcommitted
fix(cosmosdb): correct operator precedence and function name casing
Split binary_operator into precedence-tiered rules (multiplicative, additive, shift, comparison) and reorder scalar_expression alternatives so AND/OR have lower precedence than comparison operators. Previously AND/OR bound tighter than =, >, < which caused incorrect parse trees. Also fix STRINGTONUMBER to StringToNumber for consistency. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 894512e commit 274cae3

7 files changed

Lines changed: 1270 additions & 650 deletions

cosmosdb/CosmosDBParser.g4

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,17 @@ property_alias: identifier;
5959

6060
// Unified scalar_expression - used in both SELECT projections and WHERE clause.
6161
// https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/query/scalar-expressions
62+
// Alternatives are ordered from highest precedence (first) to lowest (last) per ANTLR4 semantics.
6263
scalar_expression:
6364
constant
6465
| input_alias
6566
| parameter_name
66-
| scalar_expression AND_SYMBOL scalar_expression
67-
| scalar_expression OR_SYMBOL scalar_expression
67+
| scalar_function_expression
68+
| create_object_expression
69+
| create_array_expression
70+
| LR_BRACKET_SYMBOL scalar_expression RR_BRACKET_SYMBOL
71+
| LR_BRACKET_SYMBOL select RR_BRACKET_SYMBOL
72+
| EXISTS_SYMBOL LR_BRACKET_SYMBOL select RR_BRACKET_SYMBOL
6873
| scalar_expression DOT_SYMBOL property_name
6974
| scalar_expression LS_BRACKET_SYMBOL (
7075
DOUBLE_QUOTE_STRING_LITERAL
@@ -73,19 +78,22 @@ scalar_expression:
7378
) RS_BRACKET_SYMBOL
7479
| unary_operator scalar_expression
7580
| NOT_SYMBOL scalar_expression
76-
| scalar_expression binary_operator scalar_expression
81+
| scalar_expression multiplicative_operator scalar_expression
82+
| scalar_expression additive_operator scalar_expression
83+
| scalar_expression shift_operator scalar_expression
84+
| scalar_expression BIT_AND_SYMBOL scalar_expression
85+
| scalar_expression BIT_XOR_SYMBOL scalar_expression
86+
| scalar_expression BIT_OR_SYMBOL scalar_expression
87+
| scalar_expression DOUBLE_BAR_SYMBOL scalar_expression
88+
| scalar_expression comparison_operator scalar_expression
7789
| scalar_expression NOT_SYMBOL? IN_SYMBOL LR_BRACKET_SYMBOL (
7890
scalar_expression (COMMA_SYMBOL scalar_expression)*
7991
)? RR_BRACKET_SYMBOL
8092
| scalar_expression NOT_SYMBOL? BETWEEN_SYMBOL scalar_expression AND_SYMBOL scalar_expression
8193
| scalar_expression NOT_SYMBOL? LIKE_SYMBOL scalar_expression
82-
| EXISTS_SYMBOL LR_BRACKET_SYMBOL select RR_BRACKET_SYMBOL
83-
| scalar_expression QUESTION_MARK_SYMBOL scalar_expression COLON_SYMBOL scalar_expression
84-
| scalar_function_expression
85-
| create_object_expression
86-
| create_array_expression
87-
| LR_BRACKET_SYMBOL scalar_expression RR_BRACKET_SYMBOL
88-
| LR_BRACKET_SYMBOL select RR_BRACKET_SYMBOL;
94+
| scalar_expression AND_SYMBOL scalar_expression
95+
| scalar_expression OR_SYMBOL scalar_expression
96+
| scalar_expression QUESTION_MARK_SYMBOL scalar_expression COLON_SYMBOL scalar_expression;
8997

9098
create_array_expression:
9199
LS_BRACKET_SYMBOL (
@@ -116,25 +124,25 @@ builtin_function_expression:
116124
)*
117125
)? RR_BRACKET_SYMBOL;
118126

119-
binary_operator:
127+
multiplicative_operator:
120128
MULTIPLY_OPERATOR
121129
| DIVIDE_SYMBOL
122-
| MODULO_SYMBOL
123-
| PLUS_SYMBOL
124-
| MINUS_SYMBOL
125-
| BIT_AND_SYMBOL
126-
| BIT_XOR_SYMBOL
127-
| BIT_OR_SYMBOL
128-
| DOUBLE_BAR_SYMBOL
129-
| EQUAL_SYMBOL
130+
| MODULO_SYMBOL;
131+
132+
additive_operator: PLUS_SYMBOL | MINUS_SYMBOL;
133+
134+
shift_operator:
135+
LEFT_SHIFT_OPERATOR
136+
| RIGHT_SHIFT_OPERATOR
137+
| ZERO_FILL_RIGHT_SHIFT_OPERATOR;
138+
139+
comparison_operator:
140+
EQUAL_SYMBOL
130141
| NOT_EQUAL_OPERATOR
131142
| LESS_THAN_OPERATOR
132143
| LESS_THAN_EQUAL_OPERATOR
133144
| GREATER_THAN_OPERATOR
134-
| GREATER_THAN_EQUAL_OPERATOR
135-
| LEFT_SHIFT_OPERATOR
136-
| RIGHT_SHIFT_OPERATOR
137-
| ZERO_FILL_RIGHT_SHIFT_OPERATOR;
145+
| GREATER_THAN_EQUAL_OPERATOR;
138146

139147
unary_operator: BIT_NOT_SYMBOL | PLUS_SYMBOL | MINUS_SYMBOL;
140148

cosmosdb/cosmosdb_parser.go

Lines changed: 1168 additions & 615 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cosmosdb/cosmosdbparser_base_listener.go

Lines changed: 24 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cosmosdb/cosmosdbparser_base_visitor.go

Lines changed: 13 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cosmosdb/cosmosdbparser_listener.go

Lines changed: 22 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cosmosdb/cosmosdbparser_visitor.go

Lines changed: 11 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
SELECT CONCAT(c.name, ' - ', c.country) AS label, STRINGTONUMBER(c.population) / 1000 AS populationInThousands FROM c
1+
SELECT CONCAT(c.name, ' - ', c.country) AS label, StringToNumber(c.population) / 1000 AS populationInThousands FROM c

0 commit comments

Comments
 (0)