Skip to content

Commit 74178d0

Browse files
committed
Added support AUTO REFRESH in CREATE MATERIALIZED VIEW for redshift
1 parent b3e176d commit 74178d0

File tree

5 files changed

+41
-0
lines changed

5 files changed

+41
-0
lines changed

src/ast/ddl.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4334,6 +4334,9 @@ pub struct CreateView {
43344334
pub to: Option<ObjectName>,
43354335
/// MySQL: Optional parameters for the view algorithm, definer, and security context
43364336
pub params: Option<CreateViewParams>,
4337+
/// Redshift: `AUTO REFRESH { YES | NO }`
4338+
/// <https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-create-sql-command.html>
4339+
pub auto_refresh: Option<bool>,
43374340
}
43384341

43394342
impl fmt::Display for CreateView {
@@ -4394,6 +4397,13 @@ impl fmt::Display for CreateView {
43944397
if matches!(self.options, CreateTableOptions::Options(_)) {
43954398
write!(f, " {}", self.options)?;
43964399
}
4400+
if let Some(auto_refresh) = self.auto_refresh {
4401+
write!(
4402+
f,
4403+
" AUTO REFRESH {}",
4404+
if auto_refresh { "YES" } else { "NO" }
4405+
)?;
4406+
}
43974407
f.write_str(" AS")?;
43984408
SpaceOrNewline.fmt(f)?;
43994409
self.query.fmt(f)?;

src/keywords.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,6 +1171,7 @@ define_keywords!(
11711171
XOR,
11721172
YEAR,
11731173
YEARS,
1174+
YES,
11741175
ZONE,
11751176
ZORDER,
11761177
ZSTD

src/parser/mod.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6474,6 +6474,17 @@ impl<'a> Parser<'a> {
64746474
None
64756475
};
64766476

6477+
let auto_refresh = if self.parse_keywords(&[Keyword::AUTO, Keyword::REFRESH]) {
6478+
if self.parse_keyword(Keyword::YES) {
6479+
Some(true)
6480+
} else {
6481+
self.expect_keyword_is(Keyword::NO)?;
6482+
Some(false)
6483+
}
6484+
} else {
6485+
None
6486+
};
6487+
64776488
self.expect_keyword_is(Keyword::AS)?;
64786489
let query = self.parse_query()?;
64796490
// Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
@@ -6504,6 +6515,7 @@ impl<'a> Parser<'a> {
65046515
to,
65056516
params: create_view_params,
65066517
name_before_not_exists,
6518+
auto_refresh,
65076519
})
65086520
}
65096521

tests/sqlparser_common.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8318,6 +8318,7 @@ fn parse_create_view() {
83188318
name_before_not_exists: _,
83198319
secure: _,
83208320
copy_grants: _,
8321+
auto_refresh: _,
83218322
}) => {
83228323
assert_eq!(or_alter, false);
83238324
assert_eq!("myschema.myview", name.to_string());
@@ -8437,6 +8438,7 @@ fn parse_create_view_temporary() {
84378438
name_before_not_exists: _,
84388439
secure: _,
84398440
copy_grants: _,
8441+
auto_refresh: _,
84408442
}) => {
84418443
assert_eq!(or_alter, false);
84428444
assert_eq!("myschema.myview", name.to_string());
@@ -8479,6 +8481,7 @@ fn parse_create_or_replace_view() {
84798481
name_before_not_exists: _,
84808482
secure: _,
84818483
copy_grants: _,
8484+
auto_refresh: _,
84828485
}) => {
84838486
assert_eq!(or_alter, false);
84848487
assert_eq!("v", name.to_string());
@@ -8525,6 +8528,7 @@ fn parse_create_or_replace_materialized_view() {
85258528
name_before_not_exists: _,
85268529
secure: _,
85278530
copy_grants: _,
8531+
auto_refresh: _,
85288532
}) => {
85298533
assert_eq!(or_alter, false);
85308534
assert_eq!("v", name.to_string());
@@ -8567,6 +8571,7 @@ fn parse_create_materialized_view() {
85678571
name_before_not_exists: _,
85688572
secure: _,
85698573
copy_grants: _,
8574+
auto_refresh: _,
85708575
}) => {
85718576
assert_eq!(or_alter, false);
85728577
assert_eq!("myschema.myview", name.to_string());
@@ -8609,6 +8614,7 @@ fn parse_create_materialized_view_with_cluster_by() {
86098614
name_before_not_exists: _,
86108615
secure: _,
86118616
copy_grants: _,
8617+
auto_refresh: _,
86128618
}) => {
86138619
assert_eq!(or_alter, false);
86148620
assert_eq!("myschema.myview", name.to_string());

tests/sqlparser_redshift.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,3 +500,15 @@ fn test_alter_table_alter_sortkey() {
500500
redshift().verified_stmt("ALTER TABLE users ALTER SORTKEY(created_at)");
501501
redshift().verified_stmt("ALTER TABLE users ALTER SORTKEY(c1, c2)");
502502
}
503+
504+
#[test]
505+
fn test_create_materialized_view_auto_refresh() {
506+
redshift().verified_stmt(
507+
r#"CREATE MATERIALIZED VIEW mview AUTO REFRESH YES AS (SELECT MAX("a"."b") AS "max" FROM "table1")"#,
508+
);
509+
510+
redshift().verified_stmt("CREATE MATERIALIZED VIEW mv1 AUTO REFRESH NO AS SELECT 1");
511+
512+
// Without AUTO REFRESH
513+
redshift().verified_stmt("CREATE MATERIALIZED VIEW mv1 AS SELECT 1");
514+
}

0 commit comments

Comments
 (0)