ISSUE-1147: Add support for MATERIALIZED CTEs (#1148)

Co-authored-by: Andrew Repp <arepp@cloudflare.com>
Co-authored-by: Andrew Lamb <andrew@nerdnetworks.org>
This commit is contained in:
Andrew Repp 2024-02-29 06:54:36 -06:00 committed by GitHub
parent 57113a9344
commit 0c5f6fbf81
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 65 additions and 9 deletions

View file

@ -6921,6 +6921,14 @@ impl<'a> Parser<'a> {
let name = self.parse_identifier(false)?;
let mut cte = if self.parse_keyword(Keyword::AS) {
let mut is_materialized = None;
if dialect_of!(self is PostgreSqlDialect) {
if self.parse_keyword(Keyword::MATERIALIZED) {
is_materialized = Some(CteAsMaterialized::Materialized);
} else if self.parse_keywords(&[Keyword::NOT, Keyword::MATERIALIZED]) {
is_materialized = Some(CteAsMaterialized::NotMaterialized);
}
}
self.expect_token(&Token::LParen)?;
let query = Box::new(self.parse_query()?);
self.expect_token(&Token::RParen)?;
@ -6932,10 +6940,19 @@ impl<'a> Parser<'a> {
alias,
query,
from: None,
materialized: is_materialized,
}
} else {
let columns = self.parse_parenthesized_column_list(Optional, false)?;
self.expect_keyword(Keyword::AS)?;
let mut is_materialized = None;
if dialect_of!(self is PostgreSqlDialect) {
if self.parse_keyword(Keyword::MATERIALIZED) {
is_materialized = Some(CteAsMaterialized::Materialized);
} else if self.parse_keywords(&[Keyword::NOT, Keyword::MATERIALIZED]) {
is_materialized = Some(CteAsMaterialized::NotMaterialized);
}
}
self.expect_token(&Token::LParen)?;
let query = Box::new(self.parse_query()?);
self.expect_token(&Token::RParen)?;
@ -6944,6 +6961,7 @@ impl<'a> Parser<'a> {
alias,
query,
from: None,
materialized: is_materialized,
}
};
if self.parse_keyword(Keyword::FROM) {