Skip to content

Commit 5578bf2

Browse files
authored
biquery: CREATE VIEW OPTIONS (#35)
1 parent 0734c32 commit 5578bf2

File tree

4 files changed

+32
-0
lines changed

4 files changed

+32
-0
lines changed

src/ast/mod.rs

+10
Original file line numberDiff line numberDiff line change
@@ -1573,6 +1573,7 @@ pub enum Statement {
15731573
late_binding: bool,
15741574
auto_refresh: Option<bool>,
15751575
comment: Option<String>,
1576+
view_options: Vec<SqlOption>,
15761577
},
15771578
/// CREATE TABLE
15781579
CreateTable {
@@ -2535,6 +2536,7 @@ impl fmt::Display for Statement {
25352536
late_binding,
25362537
auto_refresh,
25372538
comment,
2539+
view_options,
25382540
} => {
25392541
write!(
25402542
f,
@@ -2590,6 +2592,14 @@ impl fmt::Display for Statement {
25902592
write!(f, " COMMENT='{comment}'")?;
25912593
}
25922594

2595+
if !view_options.is_empty() {
2596+
write!(
2597+
f,
2598+
" OPTIONS({view_options})",
2599+
view_options = display_comma_separated(view_options)
2600+
)?;
2601+
}
2602+
25932603
write!(f, " AS {query}")?;
25942604

25952605
if *late_binding {

src/parser/mod.rs

+3
Original file line numberDiff line numberDiff line change
@@ -3347,6 +3347,8 @@ impl<'a> Parser<'a> {
33473347
None
33483348
};
33493349

3350+
let view_options = self.parse_options(Keyword::OPTIONS)?;
3351+
33503352
self.expect_keyword(Keyword::AS)?;
33513353
let query = Box::new(self.parse_query()?);
33523354
// Optional `WITH [ CASCADED | LOCAL ] CHECK OPTION` is widely supported here.
@@ -3377,6 +3379,7 @@ impl<'a> Parser<'a> {
33773379
late_binding,
33783380
auto_refresh,
33793381
comment,
3382+
view_options,
33803383
})
33813384
}
33823385

tests/sqlparser_bigquery.rs

+7
Original file line numberDiff line numberDiff line change
@@ -1285,3 +1285,10 @@ fn test_create_table_field_options() {
12851285
"CREATE TABLE `pr`.`ts`.`salesforce_accounts` (account_name STRING OPTIONS(description = \"Account name\", label = \"dev\"))",
12861286
);
12871287
}
1288+
1289+
#[test]
1290+
fn test_create_view_options() {
1291+
bigquery().verified_stmt(
1292+
"CREATE VIEW `myproject`.`mydataset`.`newview` OPTIONS(friendly_name = \"newview\", description = \"a view that expires in 2 days\") AS SELECT col_1 FROM `myproject`.`mydataset`.`mytable`",
1293+
);
1294+
}

tests/sqlparser_common.rs

+12
Original file line numberDiff line numberDiff line change
@@ -5703,6 +5703,7 @@ fn parse_create_view() {
57035703
late_binding,
57045704
auto_refresh,
57055705
comment,
5706+
view_options,
57065707
} => {
57075708
assert_eq!("myschema.myview", name.to_string());
57085709
assert_eq!(Vec::<WithSpan<Ident>>::new(), columns);
@@ -5721,6 +5722,7 @@ fn parse_create_view() {
57215722
assert_eq!(late_binding, false);
57225723
assert_eq!(auto_refresh, None);
57235724
assert_eq!(comment, None);
5725+
assert_eq!(view_options, vec![]);
57245726
}
57255727
_ => unreachable!(),
57265728
}
@@ -5771,6 +5773,7 @@ fn parse_create_view_with_columns() {
57715773
late_binding,
57725774
auto_refresh,
57735775
comment,
5776+
view_options,
57745777
} => {
57755778
assert_eq!("v", name.to_string());
57765779
assert_eq!(
@@ -5795,6 +5798,7 @@ fn parse_create_view_with_columns() {
57955798
assert_eq!(late_binding, false);
57965799
assert_eq!(auto_refresh, None);
57975800
assert_eq!(comment, None);
5801+
assert_eq!(view_options, vec![]);
57985802
}
57995803
_ => unreachable!(),
58005804
}
@@ -5822,6 +5826,7 @@ fn parse_create_or_replace_view() {
58225826
late_binding,
58235827
auto_refresh,
58245828
comment,
5829+
view_options,
58255830
} => {
58265831
assert_eq!("v", name.to_string());
58275832
assert_eq!(columns, vec![]);
@@ -5840,6 +5845,7 @@ fn parse_create_or_replace_view() {
58405845
assert_eq!(late_binding, false);
58415846
assert_eq!(auto_refresh, None);
58425847
assert_eq!(comment, None);
5848+
assert_eq!(view_options, vec![]);
58435849
}
58445850
_ => unreachable!(),
58455851
}
@@ -5871,6 +5877,7 @@ fn parse_create_or_replace_materialized_view() {
58715877
late_binding,
58725878
auto_refresh,
58735879
comment,
5880+
view_options,
58745881
} => {
58755882
assert_eq!("v", name.to_string());
58765883
assert_eq!(columns, vec![]);
@@ -5889,6 +5896,7 @@ fn parse_create_or_replace_materialized_view() {
58895896
assert_eq!(late_binding, false);
58905897
assert_eq!(auto_refresh, None);
58915898
assert_eq!(comment, None);
5899+
assert_eq!(view_options, vec![]);
58925900
}
58935901
_ => unreachable!(),
58945902
}
@@ -5916,6 +5924,7 @@ fn parse_create_materialized_view() {
59165924
late_binding,
59175925
auto_refresh,
59185926
comment,
5927+
view_options,
59195928
} => {
59205929
assert_eq!("myschema.myview", name.to_string());
59215930
assert_eq!(Vec::<WithSpan<Ident>>::new(), columns);
@@ -5934,6 +5943,7 @@ fn parse_create_materialized_view() {
59345943
assert_eq!(late_binding, false);
59355944
assert_eq!(auto_refresh, None);
59365945
assert_eq!(comment, None);
5946+
assert_eq!(view_options, vec![]);
59375947
}
59385948
_ => unreachable!(),
59395949
}
@@ -5961,6 +5971,7 @@ fn parse_create_materialized_view_with_cluster_by() {
59615971
late_binding,
59625972
auto_refresh,
59635973
comment,
5974+
view_options,
59645975
} => {
59655976
assert_eq!("myschema.myview", name.to_string());
59665977
assert_eq!(Vec::<WithSpan<Ident>>::new(), columns);
@@ -5979,6 +5990,7 @@ fn parse_create_materialized_view_with_cluster_by() {
59795990
assert_eq!(late_binding, false);
59805991
assert_eq!(auto_refresh, None);
59815992
assert_eq!(comment, None);
5993+
assert_eq!(view_options, vec![]);
59825994
}
59835995
_ => unreachable!(),
59845996
}

0 commit comments

Comments
 (0)