Skip to content

Commit feac964

Browse files
committed
Add support for 'IN <SetExpression>'
1 parent 776b10a commit feac964

File tree

3 files changed

+22
-10
lines changed

3 files changed

+22
-10
lines changed

src/ast/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ pub enum Expr {
724724
/// `[ NOT ] IN (SELECT ...)`
725725
InSubquery {
726726
expr: Box<Expr>,
727-
subquery: Box<Query>,
727+
subquery: Box<SetExpr>,
728728
negated: bool,
729729
},
730730
/// `[ NOT ] IN UNNEST(array_expression)`

src/parser/mod.rs

+6-8
Original file line numberDiff line numberDiff line change
@@ -3742,23 +3742,21 @@ impl<'a> Parser<'a> {
37423742
});
37433743
}
37443744
self.expect_token(&Token::LParen)?;
3745-
let in_op = if self.parse_keyword(Keyword::SELECT) || self.parse_keyword(Keyword::WITH) {
3746-
self.prev_token();
3747-
Expr::InSubquery {
3745+
let in_op = match self.maybe_parse(|p| p.parse_query_body(p.dialect.prec_unknown()))? {
3746+
Some(subquery) => Expr::InSubquery {
37483747
expr: Box::new(expr),
3749-
subquery: self.parse_query()?,
3748+
subquery,
37503749
negated,
3751-
}
3752-
} else {
3753-
Expr::InList {
3750+
},
3751+
None => Expr::InList {
37543752
expr: Box::new(expr),
37553753
list: if self.dialect.supports_in_empty_list() {
37563754
self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
37573755
} else {
37583756
self.parse_comma_separated(Parser::parse_expr)?
37593757
},
37603758
negated,
3761-
}
3759+
},
37623760
};
37633761
self.expect_token(&Token::RParen)?;
37643762
Ok(in_op)

tests/sqlparser_common.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -2224,7 +2224,21 @@ fn parse_in_subquery() {
22242224
assert_eq!(
22252225
Expr::InSubquery {
22262226
expr: Box::new(Expr::Identifier(Ident::new("segment"))),
2227-
subquery: Box::new(verified_query("SELECT segm FROM bar")),
2227+
subquery: verified_query("SELECT segm FROM bar").body,
2228+
negated: false,
2229+
},
2230+
select.selection.unwrap()
2231+
);
2232+
}
2233+
2234+
#[test]
2235+
fn parse_in_union() {
2236+
let sql = "SELECT * FROM customers WHERE segment IN ((SELECT segm FROM bar) UNION (SELECT segm FROM bar2))";
2237+
let select = verified_only_select(sql);
2238+
assert_eq!(
2239+
Expr::InSubquery {
2240+
expr: Box::new(Expr::Identifier(Ident::new("segment"))),
2241+
subquery: verified_query("(SELECT segm FROM bar) UNION (SELECT segm FROM bar2)").body,
22282242
negated: false,
22292243
},
22302244
select.selection.unwrap()

0 commit comments

Comments
 (0)