Skip to content

Commit 3ad13af

Browse files
authored
Add support for parenthesized subquery as IN predicate (#1793)
1 parent 514d2ec commit 3ad13af

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
@@ -728,7 +728,7 @@ pub enum Expr {
728728
/// `[ NOT ] IN (SELECT ...)`
729729
InSubquery {
730730
expr: Box<Expr>,
731-
subquery: Box<Query>,
731+
subquery: Box<SetExpr>,
732732
negated: bool,
733733
},
734734
/// `[ NOT ] IN UNNEST(array_expression)`

src/parser/mod.rs

+6-8
Original file line numberDiff line numberDiff line change
@@ -3756,23 +3756,21 @@ impl<'a> Parser<'a> {
37563756
});
37573757
}
37583758
self.expect_token(&Token::LParen)?;
3759-
let in_op = if self.parse_keyword(Keyword::SELECT) || self.parse_keyword(Keyword::WITH) {
3760-
self.prev_token();
3761-
Expr::InSubquery {
3759+
let in_op = match self.maybe_parse(|p| p.parse_query_body(p.dialect.prec_unknown()))? {
3760+
Some(subquery) => Expr::InSubquery {
37623761
expr: Box::new(expr),
3763-
subquery: self.parse_query()?,
3762+
subquery,
37643763
negated,
3765-
}
3766-
} else {
3767-
Expr::InList {
3764+
},
3765+
None => Expr::InList {
37683766
expr: Box::new(expr),
37693767
list: if self.dialect.supports_in_empty_list() {
37703768
self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
37713769
} else {
37723770
self.parse_comma_separated(Parser::parse_expr)?
37733771
},
37743772
negated,
3775-
}
3773+
},
37763774
};
37773775
self.expect_token(&Token::RParen)?;
37783776
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)