Skip to content

Commit 9d9d681

Browse files
committed
support from style ctes
1 parent d964dd8 commit 9d9d681

File tree

4 files changed

+30
-5
lines changed

4 files changed

+30
-5
lines changed

src/ast/query.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,11 +251,16 @@ impl fmt::Display for With {
251251
pub struct Cte {
252252
pub alias: TableAlias,
253253
pub query: Query,
254+
pub from: Option<Ident>,
254255
}
255256

256257
impl fmt::Display for Cte {
257258
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
258-
write!(f, "{} AS ({})", self.alias, self.query)
259+
write!(f, "{} AS ({})", self.alias, self.query)?;
260+
if let Some(ref fr) = self.from {
261+
write!(f, " FROM {}", fr)?;
262+
}
263+
Ok(())
259264
}
260265
}
261266

src/parser.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2153,24 +2153,36 @@ impl<'a> Parser<'a> {
21532153
fn parse_cte(&mut self) -> Result<Cte, ParserError> {
21542154
let name = self.parse_identifier()?;
21552155

2156-
if self.parse_keyword(Keyword::AS) {
2156+
let mut cte = if self.parse_keyword(Keyword::AS) {
21572157
self.expect_token(&Token::LParen)?;
21582158
let query = self.parse_query()?;
21592159
self.expect_token(&Token::RParen)?;
21602160
let alias = TableAlias {
21612161
name,
21622162
columns: vec![],
21632163
};
2164-
Ok(Cte { alias, query })
2164+
Cte {
2165+
alias,
2166+
query,
2167+
from: None,
2168+
}
21652169
} else {
21662170
let columns = self.parse_parenthesized_column_list(Optional)?;
21672171
self.expect_keyword(Keyword::AS)?;
21682172
self.expect_token(&Token::LParen)?;
21692173
let query = self.parse_query()?;
21702174
self.expect_token(&Token::RParen)?;
21712175
let alias = TableAlias { name, columns };
2172-
Ok(Cte { alias, query })
2176+
Cte {
2177+
alias,
2178+
query,
2179+
from: None,
2180+
}
2181+
};
2182+
if self.parse_keyword(Keyword::FROM) {
2183+
cte.from = Some(self.parse_identifier()?);
21732184
}
2185+
Ok(cte)
21742186
}
21752187

21762188
/// Parse a "query body", which is an expression with roughly the

tests/sqlparser_common.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2345,7 +2345,7 @@ fn parse_ctes() {
23452345

23462346
fn assert_ctes_in_select(expected: &[&str], sel: &Query) {
23472347
for (i, exp) in expected.iter().enumerate() {
2348-
let Cte { alias, query } = &sel.with.as_ref().unwrap().cte_tables[i];
2348+
let Cte { alias, query, .. } = &sel.with.as_ref().unwrap().cte_tables[i];
23492349
assert_eq!(*exp, query.to_string());
23502350
assert_eq!(
23512351
if i == 0 {
@@ -2434,6 +2434,7 @@ fn parse_recursive_cte() {
24342434
}],
24352435
},
24362436
query: cte_query,
2437+
from: None,
24372438
};
24382439
assert_eq!(with.cte_tables.first().unwrap(), &expected);
24392440
}

tests/sqlparser_hive.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,13 @@ fn map_access() {
198198
hive().verified_stmt(rename);
199199
}
200200

201+
#[test]
202+
fn from_cte() {
203+
let rename =
204+
"WITH cte AS (SELECT * FROM a.b) FROM cte INSERT INTO TABLE a.b PARTITION (a) SELECT *";
205+
println!("{}", hive().verified_stmt(rename));
206+
}
207+
201208
fn hive() -> TestedDialects {
202209
TestedDialects {
203210
dialects: vec![Box::new(HiveDialect {})],

0 commit comments

Comments
 (0)