Skip to content

Commit 0bd1532

Browse files
committed
Support CREATE MATERIALIZED VIEW
1 parent 52e0f55 commit 0bd1532

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
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: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -617,17 +617,14 @@ 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") {
621-
self.parse_create_view()
622620
} else {
623-
parser_err!(format!(
624-
"Unexpected token after CREATE: {:?}",
625-
self.peek_token()
626-
))
621+
self.parse_create_view()
627622
}
628623
}
629624

630625
pub fn parse_create_view(&mut self) -> Result<SQLStatement, ParserError> {
626+
let materialized = self.parse_keyword("MATERIALIZED");
627+
self.expect_keyword("VIEW")?;
631628
// Many dialects support `OR REPLACE` | `OR ALTER` right after `CREATE`, but we don't (yet).
632629
// ANSI SQL and Postgres support RECURSIVE here, but we don't support it either.
633630
let name = self.parse_object_name()?;
@@ -637,7 +634,7 @@ impl Parser {
637634
self.expect_keyword("AS")?;
638635
let query = self.parse_query()?;
639636
// Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
640-
Ok(SQLStatement::SQLCreateView { name, query })
637+
Ok(SQLStatement::SQLCreateView { name, query, materialized })
641638
}
642639

643640
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)