File tree 3 files changed +22
-10
lines changed
3 files changed +22
-10
lines changed Original file line number Diff line number Diff line change @@ -728,7 +728,7 @@ pub enum Expr {
728
728
/// `[ NOT ] IN (SELECT ...)`
729
729
InSubquery {
730
730
expr : Box < Expr > ,
731
- subquery : Box < Query > ,
731
+ subquery : Box < SetExpr > ,
732
732
negated : bool ,
733
733
} ,
734
734
/// `[ NOT ] IN UNNEST(array_expression)`
Original file line number Diff line number Diff line change @@ -3756,23 +3756,21 @@ impl<'a> Parser<'a> {
3756
3756
});
3757
3757
}
3758
3758
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 {
3762
3761
expr: Box::new(expr),
3763
- subquery: self.parse_query()? ,
3762
+ subquery,
3764
3763
negated,
3765
- }
3766
- } else {
3767
- Expr::InList {
3764
+ },
3765
+ None => Expr::InList {
3768
3766
expr: Box::new(expr),
3769
3767
list: if self.dialect.supports_in_empty_list() {
3770
3768
self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
3771
3769
} else {
3772
3770
self.parse_comma_separated(Parser::parse_expr)?
3773
3771
},
3774
3772
negated,
3775
- }
3773
+ },
3776
3774
};
3777
3775
self.expect_token(&Token::RParen)?;
3778
3776
Ok(in_op)
Original file line number Diff line number Diff line change @@ -2224,7 +2224,21 @@ fn parse_in_subquery() {
2224
2224
assert_eq ! (
2225
2225
Expr :: InSubquery {
2226
2226
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,
2228
2242
negated: false ,
2229
2243
} ,
2230
2244
select. selection. unwrap( )
You can’t perform that action at this time.
0 commit comments