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 @@ -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)`
Original file line number Diff line number Diff 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)
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