Skip to content

Commit a855687

Browse files
committed
Fixed BACKUP parsing for redshift
1 parent 6691f31 commit a855687

File tree

9 files changed

+43
-0
lines changed

9 files changed

+43
-0
lines changed

src/ast/ddl.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3038,6 +3038,9 @@ pub struct CreateTable {
30383038
/// Redshift `DISTKEY` option
30393039
/// <https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html>
30403040
pub distkey: Option<Ident>,
3041+
/// Redshift `BACKUP` option: `BACKUP { YES | NO }`
3042+
/// <https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html>
3043+
pub backup: Option<bool>,
30413044
}
30423045

30433046
impl fmt::Display for CreateTable {
@@ -3336,6 +3339,9 @@ impl fmt::Display for CreateTable {
33363339
if self.strict {
33373340
write!(f, " STRICT")?;
33383341
}
3342+
if let Some(backup) = self.backup {
3343+
write!(f, " BACKUP {}", if backup { "YES" } else { "NO" })?;
3344+
}
33393345
if let Some(diststyle) = &self.diststyle {
33403346
write!(f, " DISTSTYLE {diststyle}")?;
33413347
}

src/ast/helpers/stmt_create_table.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ pub struct CreateTableBuilder {
175175
pub diststyle: Option<DistStyle>,
176176
/// Redshift `DISTKEY` option.
177177
pub distkey: Option<Ident>,
178+
/// Redshift `BACKUP` option.
179+
pub backup: Option<bool>,
178180
}
179181

180182
impl CreateTableBuilder {
@@ -236,6 +238,7 @@ impl CreateTableBuilder {
236238
require_user: false,
237239
diststyle: None,
238240
distkey: None,
241+
backup: None,
239242
}
240243
}
241244
/// Set `OR REPLACE` for the CREATE TABLE statement.
@@ -521,6 +524,11 @@ impl CreateTableBuilder {
521524
self.distkey = distkey;
522525
self
523526
}
527+
/// Set the Redshift `BACKUP` option.
528+
pub fn backup(mut self, backup: Option<bool>) -> Self {
529+
self.backup = backup;
530+
self
531+
}
524532
/// Consume the builder and produce a `CreateTable`.
525533
pub fn build(self) -> CreateTable {
526534
CreateTable {
@@ -579,6 +587,7 @@ impl CreateTableBuilder {
579587
require_user: self.require_user,
580588
diststyle: self.diststyle,
581589
distkey: self.distkey,
590+
backup: self.backup,
582591
}
583592
}
584593
}
@@ -656,6 +665,7 @@ impl From<CreateTable> for CreateTableBuilder {
656665
require_user: table.require_user,
657666
diststyle: table.diststyle,
658667
distkey: table.distkey,
668+
backup: table.backup,
659669
}
660670
}
661671
}

src/ast/spans.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,7 @@ impl Spanned for CreateTable {
584584
require_user: _,
585585
diststyle: _, // enum, no span
586586
distkey: _, // Ident, todo
587+
backup: _, // bool, no span
587588
} = self;
588589

589590
union_spans(

src/keywords.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ define_keywords!(
145145
AVG,
146146
AVG_ROW_LENGTH,
147147
AVRO,
148+
BACKUP,
148149
BACKWARD,
149150
BASE64,
150151
BASE_LOCATION,
@@ -1167,6 +1168,7 @@ define_keywords!(
11671168
XOR,
11681169
YEAR,
11691170
YEARS,
1171+
YES,
11701172
ZONE,
11711173
ZORDER,
11721174
ZSTD

src/parser/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8384,6 +8384,14 @@ impl<'a> Parser<'a> {
83848384

83858385
let strict = self.parse_keyword(Keyword::STRICT);
83868386

8387+
// Redshift: BACKUP YES|NO
8388+
let backup = if self.parse_keyword(Keyword::BACKUP) {
8389+
let keyword = self.expect_one_of_keywords(&[Keyword::YES, Keyword::NO])?;
8390+
Some(keyword == Keyword::YES)
8391+
} else {
8392+
None
8393+
};
8394+
83878395
// Redshift: DISTSTYLE, DISTKEY
83888396
let diststyle = if self.parse_keyword(Keyword::DISTSTYLE) {
83898397
Some(self.parse_dist_style()?)
@@ -8438,6 +8446,7 @@ impl<'a> Parser<'a> {
84388446
.table_options(create_table_config.table_options)
84398447
.primary_key(primary_key)
84408448
.strict(strict)
8449+
.backup(backup)
84418450
.diststyle(diststyle)
84428451
.distkey(distkey)
84438452
.build())

tests/sqlparser_duckdb.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,7 @@ fn test_duckdb_union_datatype() {
790790
require_user: Default::default(),
791791
diststyle: Default::default(),
792792
distkey: Default::default(),
793+
backup: Default::default(),
793794
}),
794795
stmt
795796
);

tests/sqlparser_mssql.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,6 +2008,7 @@ fn parse_create_table_with_valid_options() {
20082008
require_user: false,
20092009
diststyle: None,
20102010
distkey: None,
2011+
backup: None,
20112012
})
20122013
);
20132014
}
@@ -2178,6 +2179,7 @@ fn parse_create_table_with_identity_column() {
21782179
require_user: false,
21792180
diststyle: None,
21802181
distkey: None,
2182+
backup: None,
21812183
}),
21822184
);
21832185
}

tests/sqlparser_postgres.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6476,6 +6476,7 @@ fn parse_trigger_related_functions() {
64766476
require_user: false,
64776477
diststyle: None,
64786478
distkey: None,
6479+
backup: None,
64796480
}
64806481
);
64816482

tests/sqlparser_redshift.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,3 +474,14 @@ fn test_copy_credentials() {
474474
"COPY t1 FROM 's3://bucket/file.csv' CREDENTIALS 'aws_access_key_id=AK;aws_secret_access_key=SK' CSV",
475475
);
476476
}
477+
478+
#[test]
479+
fn test_create_table_backup() {
480+
redshift().verified_stmt("CREATE TABLE public.users (id INT, name VARCHAR(255)) BACKUP YES");
481+
482+
redshift().verified_stmt("CREATE TABLE staging.events (event_id INT) BACKUP NO");
483+
484+
redshift().verified_stmt(
485+
"CREATE TABLE public.users_backup_test BACKUP YES DISTSTYLE AUTO AS SELECT id, name, email FROM public.users",
486+
);
487+
}

0 commit comments

Comments
 (0)