Skip to content

Commit

Permalink
feat: support NOT IN
Browse files Browse the repository at this point in the history
  • Loading branch information
dmfay committed Jul 1, 2023
1 parent ab5f935 commit 1f61923
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 2 deletions.
9 changes: 7 additions & 2 deletions grammar.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ module.exports = grammar({
conflicts: $ => [
[$.object_reference, $._qualified_field],
[$.object_reference],
[$.between_expression, $.binary_expression],
],

precedences: $ => [
Expand Down Expand Up @@ -2381,8 +2382,7 @@ module.exports = grammar({
),
...[
[$.keyword_in, 'binary_in'],
// @TODO: there's an unclear precedence issue here
// [$.not_in, 'binary_in'],
[$.not_in, 'binary_in'],
].map(([operator, precedence]) =>
prec.left(precedence, seq(
field('left', $._expression),
Expand Down Expand Up @@ -2422,6 +2422,11 @@ module.exports = grammar({
),
),

not_in: $ => seq(
$.keyword_not,
$.keyword_in,
),

subquery: $ => seq(
'(',
$.select,
Expand Down
90 changes: 90 additions & 0 deletions test/corpus/select.txt
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,96 @@ WHERE id IN(1,2);
(literal)
(literal)))))))

================================================================================
Simple select with NOT IN
================================================================================

SELECT id
FROM my_table
WHERE id NOT IN(1,2);

--------------------------------------------------------------------------------

(program
(statement
(select
(keyword_select)
(select_expression
(term
value: (field
name: (identifier)))))
(from
(keyword_from)
(relation
(object_reference
name: (identifier)))
(where
(keyword_where)
predicate: (binary_expression
left: (field
name: (identifier))
operator: (not_in
(keyword_not)
(keyword_in))
right: (list
(literal)
(literal)))))))

================================================================================
Simple select with more NOT INs
================================================================================

SELECT id
FROM my_table
WHERE id NOT IN(1,2) AND id NOT IN (SELECT id FROM other_table);

--------------------------------------------------------------------------------

(program
(statement
(select
(keyword_select)
(select_expression
(term
value: (field
name: (identifier)))))
(from
(keyword_from)
(relation
(object_reference
name: (identifier)))
(where
(keyword_where)
predicate: (binary_expression
left: (binary_expression
left: (field
name: (identifier))
operator: (not_in
(keyword_not)
(keyword_in))
right: (list
(literal)
(literal)))
operator: (keyword_and)
right: (binary_expression
left: (field
name: (identifier))
operator: (not_in
(keyword_not)
(keyword_in))
right: (subquery
(select
(keyword_select)
(select_expression
(term
value: (field
name: (identifier)))))
(from
(keyword_from)
(relation
(object_reference
name: (identifier)))))))))))

================================================================================
Simple select with IF
================================================================================
Expand Down

0 comments on commit 1f61923

Please sign in to comment.