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.
#[derive(Debug, Clone, PartialEq, Hash)]
pub struct Cte {
pub alias: SQLIdent,
pub alias: TableAlias,
pub query: SQLQuery,
pub renamed_columns: Vec<SQLIdent>,
}
impl ToString for Cte {
fn to_string(&self) -> String {
let mut s = self.alias.clone();
if !self.renamed_columns.is_empty() {
s += &format!(" ({})", comma_separated_string(&self.renamed_columns));
}
s + &format!(" AS ({})", self.query.to_string())
format!("{} AS ({})", self.alias.to_string(), self.query.to_string())
}
}

View file

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

View file

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