Skip to content

Commit 63f3c97

Browse files
authored
Allow BETWEEN operator to be followed by AND operator (#566)
2 parents b248972 + c17b0f2 commit 63f3c97

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/parser/grammar.ne

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ expression_chain -> expression _expression_with_comments:* {%
154154
([expr, chain]) => [expr, ...chain]
155155
%}
156156

157+
andless_expression_chain -> andless_expression _andless_expression_with_comments:* {%
158+
([expr, chain]) => [expr, ...chain]
159+
%}
160+
157161
expression_with_comments_ -> expression _ {%
158162
([expr, _]) => addComments(expr, { trailing: _ })
159163
%}
@@ -162,18 +166,25 @@ _expression_with_comments -> _ expression {%
162166
([_, expr]) => addComments(expr, { leading: _ })
163167
%}
164168

169+
_andless_expression_with_comments -> _ andless_expression {%
170+
([_, expr]) => addComments(expr, { leading: _ })
171+
%}
172+
165173
free_form_sql -> ( asteriskless_free_form_sql | asterisk ) {% unwrap %}
166174

167175
asteriskless_free_form_sql ->
168-
( asteriskless_expression
176+
( asteriskless_andless_expression
177+
| logic_operator
169178
| between_predicate
170179
| comma
171180
| comment
172181
| other_keyword ) {% unwrap %}
173182

174-
expression -> ( asteriskless_expression | asterisk ) {% unwrap %}
183+
expression -> ( andless_expression | logic_operator ) {% unwrap %}
184+
185+
andless_expression -> ( asteriskless_andless_expression | asterisk ) {% unwrap %}
175186

176-
asteriskless_expression ->
187+
asteriskless_andless_expression ->
177188
( array_subscript
178189
| case_expression
179190
| function_call
@@ -251,7 +262,7 @@ property_access -> expression _ %DOT _ (identifier | array_subscript | all_colum
251262
}
252263
%}
253264

254-
between_predicate -> %BETWEEN _ expression_chain _ %AND _ expression {%
265+
between_predicate -> %BETWEEN _ andless_expression_chain _ %AND _ andless_expression {%
255266
([betweenToken, _1, expr1, _2, andToken, _3, expr2]) => ({
256267
type: NodeType.between_predicate,
257268
betweenKw: toKeywordNode(betweenToken),
@@ -312,8 +323,12 @@ literal ->
312323
keyword ->
313324
( %RESERVED_KEYWORD
314325
| %RESERVED_PHRASE
315-
| %RESERVED_JOIN
316-
| %AND
326+
| %RESERVED_JOIN ) {%
327+
([[token]]) => toKeywordNode(token)
328+
%}
329+
330+
logic_operator ->
331+
( %AND
317332
| %OR
318333
| %XOR ) {%
319334
([[token]]) => toKeywordNode(token)

test/features/between.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,13 @@ export default function supportsBetween(format: FormatFn) {
2929
END AND 3
3030
`);
3131
});
32+
33+
// Regression test for #534
34+
it('supports AND after BETWEEN', () => {
35+
expect(format('SELECT foo BETWEEN 1 AND 2 AND x > 10')).toBe(dedent`
36+
SELECT
37+
foo BETWEEN 1 AND 2
38+
AND x > 10
39+
`);
40+
});
3241
}

0 commit comments

Comments
 (0)