Skip to content

Commit 0621f8d

Browse files
committed
Merge #1 from benesch/materialized
2 parents 52e0f55 + f30ab89 commit 0621f8d

File tree

4 files changed

+47
-5
lines changed

4 files changed

+47
-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: 13 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,18 @@ 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 {
352+
name,
353+
query,
354+
materialized,
355+
} => {
356+
let modifier = if *materialized { " MATERIALIZED" } else { "" };
357+
format!(
358+
"CREATE{} VIEW {} AS {}",
359+
modifier,
360+
name.to_string(),
361+
query.to_string()
362+
)
352363
}
353364
SQLStatement::SQLCreateTable { name, columns } => format!(
354365
"CREATE TABLE {} ({})",

src/sqlparser.rs

Lines changed: 9 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,11 @@ 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 {
644+
name,
645+
query,
646+
materialized,
647+
})
641648
}
642649

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

tests/sqlparser_generic.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -901,9 +901,31 @@ 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 {
905+
name,
906+
query,
907+
materialized,
908+
} => {
909+
assert_eq!("myschema.myview", name.to_string());
910+
assert_eq!("SELECT foo FROM bar", query.to_string());
911+
assert!(!materialized);
912+
}
913+
_ => assert!(false),
914+
}
915+
}
916+
917+
#[test]
918+
fn parse_create_materialized_view() {
919+
let sql = "CREATE MATERIALIZED VIEW myschema.myview AS SELECT foo FROM bar";
920+
match verified_stmt(sql) {
921+
SQLStatement::SQLCreateView {
922+
name,
923+
query,
924+
materialized,
925+
} => {
905926
assert_eq!("myschema.myview", name.to_string());
906927
assert_eq!("SELECT foo FROM bar", query.to_string());
928+
assert!(materialized);
907929
}
908930
_ => assert!(false),
909931
}

0 commit comments

Comments
 (0)