Use TableAlias in Cte

This commit is contained in:
Nickolay Ponomarev 2019-06-16 21:11:51 +03:00
parent 4f239745bc
commit 3c073a4c34
3 changed files with 10 additions and 18 deletions

View file

@ -163,18 +163,13 @@ impl ToString for SQLSelect {
/// number of columns in the query matches the number of columns in the query. /// number of columns in the query matches the number of columns in the query.
#[derive(Debug, Clone, PartialEq, Hash)] #[derive(Debug, Clone, PartialEq, Hash)]
pub struct Cte { pub struct Cte {
pub alias: SQLIdent, pub alias: TableAlias,
pub query: SQLQuery, pub query: SQLQuery,
pub renamed_columns: Vec<SQLIdent>,
} }
impl ToString for Cte { impl ToString for Cte {
fn to_string(&self) -> String { fn to_string(&self) -> String {
let mut s = self.alias.clone(); format!("{} AS ({})", self.alias.to_string(), self.query.to_string())
if !self.renamed_columns.is_empty() {
s += &format!(" ({})", comma_separated_string(&self.renamed_columns));
}
s + &format!(" AS ({})", self.query.to_string())
} }
} }

View file

@ -1475,14 +1475,15 @@ impl Parser {
fn parse_cte_list(&mut self) -> Result<Vec<Cte>, ParserError> { fn parse_cte_list(&mut self) -> Result<Vec<Cte>, ParserError> {
let mut cte = vec![]; let mut cte = vec![];
loop { loop {
let alias = self.parse_identifier()?; let alias = TableAlias {
let renamed_columns = self.parse_parenthesized_column_list(Optional)?; name: self.parse_identifier()?,
columns: self.parse_parenthesized_column_list(Optional)?,
};
self.expect_keyword("AS")?; self.expect_keyword("AS")?;
self.expect_token(&Token::LParen)?; self.expect_token(&Token::LParen)?;
cte.push(Cte { cte.push(Cte {
alias, alias,
query: self.parse_query()?, query: self.parse_query()?,
renamed_columns,
}); });
self.expect_token(&Token::RParen)?; self.expect_token(&Token::RParen)?;
if !self.consume_token(&Token::Comma) { if !self.consume_token(&Token::Comma) {

View file

@ -1791,14 +1791,10 @@ fn parse_ctes() {
fn assert_ctes_in_select(expected: &[&str], sel: &SQLQuery) { fn assert_ctes_in_select(expected: &[&str], sel: &SQLQuery) {
let mut i = 0; let mut i = 0;
for exp in expected { for exp in expected {
let Cte { let Cte { alias, query } = &sel.ctes[i];
query,
alias,
renamed_columns,
} = &sel.ctes[i];
assert_eq!(*exp, query.to_string()); assert_eq!(*exp, query.to_string());
assert_eq!(if i == 0 { "a" } else { "b" }, alias); assert_eq!(if i == 0 { "a" } else { "b" }, alias.name);
assert!(renamed_columns.is_empty()); assert!(alias.columns.is_empty());
i += 1; i += 1;
} }
} }
@ -1841,7 +1837,7 @@ fn parse_cte_renamed_columns() {
let query = all_dialects().verified_query(sql); let query = all_dialects().verified_query(sql);
assert_eq!( assert_eq!(
vec!["col1", "col2"], vec!["col1", "col2"],
query.ctes.first().unwrap().renamed_columns query.ctes.first().unwrap().alias.columns
); );
} }