File tree Expand file tree Collapse file tree 3 files changed +22
-10
lines changed Expand file tree Collapse file tree 3 files changed +22
-10
lines changed Original file line number Diff line number Diff 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)`
Original file line number Diff line number Diff 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)
Original file line number Diff line number Diff 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( )
You can’t perform that action at this time.
0 commit comments