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 @@ -724,7 +724,7 @@ pub enum Expr {
724
724
/// `[ NOT ] IN (SELECT ...)`
725
725
InSubquery {
726
726
expr : Box < Expr > ,
727
- subquery : Box < Query > ,
727
+ subquery : Box < SetExpr > ,
728
728
negated : bool ,
729
729
} ,
730
730
/// `[ NOT ] IN UNNEST(array_expression)`
Original file line number Diff line number Diff line change @@ -3742,23 +3742,21 @@ impl<'a> Parser<'a> {
3742
3742
});
3743
3743
}
3744
3744
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 {
3748
3747
expr: Box::new(expr),
3749
- subquery: self.parse_query()? ,
3748
+ subquery,
3750
3749
negated,
3751
- }
3752
- } else {
3753
- Expr::InList {
3750
+ },
3751
+ None => Expr::InList {
3754
3752
expr: Box::new(expr),
3755
3753
list: if self.dialect.supports_in_empty_list() {
3756
3754
self.parse_comma_separated0(Parser::parse_expr, Token::RParen)?
3757
3755
} else {
3758
3756
self.parse_comma_separated(Parser::parse_expr)?
3759
3757
},
3760
3758
negated,
3761
- }
3759
+ },
3762
3760
};
3763
3761
self.expect_token(&Token::RParen)?;
3764
3762
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