Skip to content

Commit 23a0fc7

Browse files
committed
Support CREATE MATERIALIZED VIEW
1 parent 52e0f55 commit 23a0fc7

File tree

4 files changed

+26
-5
lines changed

4 files changed

+26
-5
lines changed

src/dialect/keywords.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ keyword!(
191191
LOCATION,
192192
LOWER,
193193
MATCH,
194+
MATERIALIZED,
194195
MAX,
195196
MEMBER,
196197
MERGE,
@@ -539,6 +540,7 @@ pub const ALL_KEYWORDS: &'static [&'static str] = &[
539540
LOCATION,
540541
LOWER,
541542
MATCH,
543+
MATERIALIZED,
542544
MAX,
543545
MEMBER,
544546
MERGE,

src/sqlast/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ pub enum SQLStatement {
241241
/// View name
242242
name: SQLObjectName,
243243
query: SQLQuery,
244+
materialized: bool,
244245
},
245246
/// CREATE TABLE
246247
SQLCreateTable {
@@ -347,8 +348,9 @@ impl ToString for SQLStatement {
347348
}
348349
s
349350
}
350-
SQLStatement::SQLCreateView { name, query } => {
351-
format!("CREATE VIEW {} AS {}", name.to_string(), query.to_string())
351+
SQLStatement::SQLCreateView { name, query, materialized } => {
352+
let modifier = if *materialized { " MATERIALIZED" } else { "" };
353+
format!("CREATE{} VIEW {} AS {}", modifier, name.to_string(), query.to_string())
352354
}
353355
SQLStatement::SQLCreateTable { name, columns } => format!(
354356
"CREATE TABLE {} ({})",

src/sqlparser.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,8 @@ impl Parser {
617617
pub fn parse_create(&mut self) -> Result<SQLStatement, ParserError> {
618618
if self.parse_keyword("TABLE") {
619619
self.parse_create_table()
620-
} else if self.parse_keyword("VIEW") {
620+
} else if self.parse_keyword("MATERIALIZED") || self.parse_keyword("VIEW") {
621+
self.prev_token();
621622
self.parse_create_view()
622623
} else {
623624
parser_err!(format!(
@@ -628,6 +629,8 @@ impl Parser {
628629
}
629630

630631
pub fn parse_create_view(&mut self) -> Result<SQLStatement, ParserError> {
632+
let materialized = self.parse_keyword("MATERIALIZED");
633+
self.expect_keyword("VIEW")?;
631634
// Many dialects support `OR REPLACE` | `OR ALTER` right after `CREATE`, but we don't (yet).
632635
// ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
633636
let name = self.parse_object_name()?;
@@ -637,7 +640,7 @@ impl Parser {
637640
self.expect_keyword("AS")?;
638641
let query = self.parse_query()?;
639642
// Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
640-
Ok(SQLStatement::SQLCreateView { name, query })
643+
Ok(SQLStatement::SQLCreateView { name, query, materialized })
641644
}
642645

643646
pub fn parse_create_table(&mut self) -> Result<SQLStatement, ParserError> {

tests/sqlparser_generic.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -901,9 +901,23 @@ fn parse_scalar_subqueries() {
901901
fn parse_create_view() {
902902
let sql = "CREATE VIEW myschema.myview AS SELECT foo FROM bar";
903903
match verified_stmt(sql) {
904-
SQLStatement::SQLCreateView { name, query } => {
904+
SQLStatement::SQLCreateView { name, query, materialized } => {
905905
assert_eq!("myschema.myview", name.to_string());
906906
assert_eq!("SELECT foo FROM bar", query.to_string());
907+
assert!(!materialized);
908+
}
909+
_ => assert!(false),
910+
}
911+
}
912+
913+
#[test]
914+
fn parse_create_materialized_view() {
915+
let sql = "CREATE MATERIALIZED VIEW myschema.myview AS SELECT foo FROM bar";
916+
match verified_stmt(sql) {
917+
SQLStatement::SQLCreateView { name, query, materialized } => {
918+
assert_eq!("myschema.myview", name.to_string());
919+
assert_eq!("SELECT foo FROM bar", query.to_string());
920+
assert!(materialized);
907921
}
908922
_ => assert!(false),
909923
}

0 commit comments

Comments
 (0)