Skip to content

Commit 87d1907

Browse files
authored
Add OR ALTER support for CREATE VIEW (#1818)
1 parent 2eb1e7b commit 87d1907

File tree

4 files changed

+27
-2
lines changed

4 files changed

+27
-2
lines changed

src/ast/mod.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -3063,6 +3063,10 @@ pub enum Statement {
30633063
/// CREATE VIEW
30643064
/// ```
30653065
CreateView {
3066+
/// True if this is a `CREATE OR ALTER VIEW` statement
3067+
///
3068+
/// [MsSql](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql)
3069+
or_alter: bool,
30663070
or_replace: bool,
30673071
materialized: bool,
30683072
/// View name
@@ -4623,6 +4627,7 @@ impl fmt::Display for Statement {
46234627
Ok(())
46244628
}
46254629
Statement::CreateView {
4630+
or_alter,
46264631
name,
46274632
or_replace,
46284633
columns,
@@ -4639,7 +4644,8 @@ impl fmt::Display for Statement {
46394644
} => {
46404645
write!(
46414646
f,
4642-
"CREATE {or_replace}",
4647+
"CREATE {or_alter}{or_replace}",
4648+
or_alter = if *or_alter { "OR ALTER " } else { "" },
46434649
or_replace = if *or_replace { "OR REPLACE " } else { "" },
46444650
)?;
46454651
if let Some(params) = params {

src/ast/spans.rs

+1
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ impl Spanned for Statement {
384384
),
385385
Statement::Delete(delete) => delete.span(),
386386
Statement::CreateView {
387+
or_alter: _,
387388
or_replace: _,
388389
materialized: _,
389390
name,

src/parser/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -4548,7 +4548,7 @@ impl<'a> Parser<'a> {
45484548
self.parse_create_table(or_replace, temporary, global, transient)
45494549
} else if self.parse_keyword(Keyword::MATERIALIZED) || self.parse_keyword(Keyword::VIEW) {
45504550
self.prev_token();
4551-
self.parse_create_view(or_replace, temporary, create_view_params)
4551+
self.parse_create_view(or_alter, or_replace, temporary, create_view_params)
45524552
} else if self.parse_keyword(Keyword::POLICY) {
45534553
self.parse_create_policy()
45544554
} else if self.parse_keyword(Keyword::EXTERNAL) {
@@ -5512,6 +5512,7 @@ impl<'a> Parser<'a> {
55125512

55135513
pub fn parse_create_view(
55145514
&mut self,
5515+
or_alter: bool,
55155516
or_replace: bool,
55165517
temporary: bool,
55175518
create_view_params: Option<CreateViewParams>,
@@ -5576,6 +5577,7 @@ impl<'a> Parser<'a> {
55765577
]);
55775578

55785579
Ok(Statement::CreateView {
5580+
or_alter,
55795581
name,
55805582
columns,
55815583
query,

tests/sqlparser_common.rs

+16
Original file line numberDiff line numberDiff line change
@@ -7840,6 +7840,7 @@ fn parse_create_view() {
78407840
let sql = "CREATE VIEW myschema.myview AS SELECT foo FROM bar";
78417841
match verified_stmt(sql) {
78427842
Statement::CreateView {
7843+
or_alter,
78437844
name,
78447845
columns,
78457846
query,
@@ -7854,6 +7855,7 @@ fn parse_create_view() {
78547855
to,
78557856
params,
78567857
} => {
7858+
assert_eq!(or_alter, false);
78577859
assert_eq!("myschema.myview", name.to_string());
78587860
assert_eq!(Vec::<ViewColumnDef>::new(), columns);
78597861
assert_eq!("SELECT foo FROM bar", query.to_string());
@@ -7870,6 +7872,8 @@ fn parse_create_view() {
78707872
}
78717873
_ => unreachable!(),
78727874
}
7875+
7876+
let _ = verified_stmt("CREATE OR ALTER VIEW v AS SELECT 1");
78737877
}
78747878

78757879
#[test]
@@ -7904,6 +7908,7 @@ fn parse_create_view_with_columns() {
79047908
// match all_dialects().verified_stmt(sql) {
79057909
match all_dialects_except(|d| d.is::<ClickHouseDialect>()).verified_stmt(sql) {
79067910
Statement::CreateView {
7911+
or_alter,
79077912
name,
79087913
columns,
79097914
or_replace,
@@ -7918,6 +7923,7 @@ fn parse_create_view_with_columns() {
79187923
to,
79197924
params,
79207925
} => {
7926+
assert_eq!(or_alter, false);
79217927
assert_eq!("v", name.to_string());
79227928
assert_eq!(
79237929
columns,
@@ -7951,6 +7957,7 @@ fn parse_create_view_temporary() {
79517957
let sql = "CREATE TEMPORARY VIEW myschema.myview AS SELECT foo FROM bar";
79527958
match verified_stmt(sql) {
79537959
Statement::CreateView {
7960+
or_alter,
79547961
name,
79557962
columns,
79567963
query,
@@ -7965,6 +7972,7 @@ fn parse_create_view_temporary() {
79657972
to,
79667973
params,
79677974
} => {
7975+
assert_eq!(or_alter, false);
79687976
assert_eq!("myschema.myview", name.to_string());
79697977
assert_eq!(Vec::<ViewColumnDef>::new(), columns);
79707978
assert_eq!("SELECT foo FROM bar", query.to_string());
@@ -7988,6 +7996,7 @@ fn parse_create_or_replace_view() {
79887996
let sql = "CREATE OR REPLACE VIEW v AS SELECT 1";
79897997
match verified_stmt(sql) {
79907998
Statement::CreateView {
7999+
or_alter,
79918000
name,
79928001
columns,
79938002
or_replace,
@@ -8002,6 +8011,7 @@ fn parse_create_or_replace_view() {
80028011
to,
80038012
params,
80048013
} => {
8014+
assert_eq!(or_alter, false);
80058015
assert_eq!("v", name.to_string());
80068016
assert_eq!(columns, vec![]);
80078017
assert_eq!(options, CreateTableOptions::None);
@@ -8029,6 +8039,7 @@ fn parse_create_or_replace_materialized_view() {
80298039
let sql = "CREATE OR REPLACE MATERIALIZED VIEW v AS SELECT 1";
80308040
match verified_stmt(sql) {
80318041
Statement::CreateView {
8042+
or_alter,
80328043
name,
80338044
columns,
80348045
or_replace,
@@ -8043,6 +8054,7 @@ fn parse_create_or_replace_materialized_view() {
80438054
to,
80448055
params,
80458056
} => {
8057+
assert_eq!(or_alter, false);
80468058
assert_eq!("v", name.to_string());
80478059
assert_eq!(columns, vec![]);
80488060
assert_eq!(options, CreateTableOptions::None);
@@ -8066,6 +8078,7 @@ fn parse_create_materialized_view() {
80668078
let sql = "CREATE MATERIALIZED VIEW myschema.myview AS SELECT foo FROM bar";
80678079
match verified_stmt(sql) {
80688080
Statement::CreateView {
8081+
or_alter,
80698082
name,
80708083
or_replace,
80718084
columns,
@@ -8080,6 +8093,7 @@ fn parse_create_materialized_view() {
80808093
to,
80818094
params,
80828095
} => {
8096+
assert_eq!(or_alter, false);
80838097
assert_eq!("myschema.myview", name.to_string());
80848098
assert_eq!(Vec::<ViewColumnDef>::new(), columns);
80858099
assert_eq!("SELECT foo FROM bar", query.to_string());
@@ -8103,6 +8117,7 @@ fn parse_create_materialized_view_with_cluster_by() {
81038117
let sql = "CREATE MATERIALIZED VIEW myschema.myview CLUSTER BY (foo) AS SELECT foo FROM bar";
81048118
match verified_stmt(sql) {
81058119
Statement::CreateView {
8120+
or_alter,
81068121
name,
81078122
or_replace,
81088123
columns,
@@ -8117,6 +8132,7 @@ fn parse_create_materialized_view_with_cluster_by() {
81178132
to,
81188133
params,
81198134
} => {
8135+
assert_eq!(or_alter, false);
81208136
assert_eq!("myschema.myview", name.to_string());
81218137
assert_eq!(Vec::<ViewColumnDef>::new(), columns);
81228138
assert_eq!("SELECT foo FROM bar", query.to_string());

0 commit comments

Comments
 (0)