mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-22 23:14:07 +00:00
Support "UPDATE" statement in "WITH" subquery (#842)
* fix(WITH): allow "UPDATE" statement in "WITH" subquery" * add test case * update test to validate round-trip
This commit is contained in:
parent
29dea5d017
commit
784a19138f
2 changed files with 33 additions and 13 deletions
|
@ -89,6 +89,7 @@ pub enum SetExpr {
|
||||||
},
|
},
|
||||||
Values(Values),
|
Values(Values),
|
||||||
Insert(Statement),
|
Insert(Statement),
|
||||||
|
Update(Statement),
|
||||||
Table(Box<Table>),
|
Table(Box<Table>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,6 +100,7 @@ impl fmt::Display for SetExpr {
|
||||||
SetExpr::Query(q) => write!(f, "({q})"),
|
SetExpr::Query(q) => write!(f, "({q})"),
|
||||||
SetExpr::Values(v) => write!(f, "{v}"),
|
SetExpr::Values(v) => write!(f, "{v}"),
|
||||||
SetExpr::Insert(v) => write!(f, "{v}"),
|
SetExpr::Insert(v) => write!(f, "{v}"),
|
||||||
|
SetExpr::Update(v) => write!(f, "{v}"),
|
||||||
SetExpr::Table(t) => write!(f, "{t}"),
|
SetExpr::Table(t) => write!(f, "{t}"),
|
||||||
SetExpr::SetOperation {
|
SetExpr::SetOperation {
|
||||||
left,
|
left,
|
||||||
|
|
|
@ -4910,7 +4910,30 @@ impl<'a> Parser<'a> {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
if !self.parse_keyword(Keyword::INSERT) {
|
if self.parse_keyword(Keyword::INSERT) {
|
||||||
|
let insert = self.parse_insert()?;
|
||||||
|
|
||||||
|
Ok(Query {
|
||||||
|
with,
|
||||||
|
body: Box::new(SetExpr::Insert(insert)),
|
||||||
|
limit: None,
|
||||||
|
order_by: vec![],
|
||||||
|
offset: None,
|
||||||
|
fetch: None,
|
||||||
|
locks: vec![],
|
||||||
|
})
|
||||||
|
} else if self.parse_keyword(Keyword::UPDATE) {
|
||||||
|
let update = self.parse_update()?;
|
||||||
|
Ok(Query {
|
||||||
|
with,
|
||||||
|
body: Box::new(SetExpr::Update(update)),
|
||||||
|
limit: None,
|
||||||
|
order_by: vec![],
|
||||||
|
offset: None,
|
||||||
|
fetch: None,
|
||||||
|
locks: vec![],
|
||||||
|
})
|
||||||
|
} else {
|
||||||
let body = Box::new(self.parse_query_body(0)?);
|
let body = Box::new(self.parse_query_body(0)?);
|
||||||
|
|
||||||
let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
|
let order_by = if self.parse_keywords(&[Keyword::ORDER, Keyword::BY]) {
|
||||||
|
@ -4966,18 +4989,6 @@ impl<'a> Parser<'a> {
|
||||||
fetch,
|
fetch,
|
||||||
locks,
|
locks,
|
||||||
})
|
})
|
||||||
} else {
|
|
||||||
let insert = self.parse_insert()?;
|
|
||||||
|
|
||||||
Ok(Query {
|
|
||||||
with,
|
|
||||||
body: Box::new(SetExpr::Insert(insert)),
|
|
||||||
limit: None,
|
|
||||||
order_by: vec![],
|
|
||||||
offset: None,
|
|
||||||
fetch: None,
|
|
||||||
locks: vec![],
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7447,4 +7458,11 @@ mod tests {
|
||||||
))
|
))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_update_in_with_subquery() {
|
||||||
|
let sql = r#"WITH "result" AS (UPDATE "Hero" SET "name" = 'Captain America', "number_of_movies" = "number_of_movies" + 1 WHERE "secret_identity" = 'Sam Wilson' RETURNING "id", "name", "secret_identity", "number_of_movies") SELECT * FROM "result""#;
|
||||||
|
let ast = Parser::parse_sql(&GenericDialect, sql).unwrap();
|
||||||
|
assert_eq!(ast[0].to_string(), sql);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue