This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-sqlparser-rs.git
The following commit(s) were added to refs/heads/main by this push:
new 1097a0d5 Fixed BACKUP parsing for redshift (#2270)
1097a0d5 is described below
commit 1097a0d5a6a852737b55f96bd38fba3f2ece9bd0
Author: Andriy Romanov <[email protected]>
AuthorDate: Fri Mar 20 03:03:55 2026 -0700
Fixed BACKUP parsing for redshift (#2270)
---
src/ast/ddl.rs | 6 ++++++
src/ast/helpers/stmt_create_table.rs | 10 ++++++++++
src/ast/spans.rs | 1 +
src/keywords.rs | 2 ++
src/parser/mod.rs | 9 +++++++++
tests/sqlparser_duckdb.rs | 1 +
tests/sqlparser_mssql.rs | 2 ++
tests/sqlparser_postgres.rs | 1 +
tests/sqlparser_redshift.rs | 11 +++++++++++
9 files changed, 43 insertions(+)
diff --git a/src/ast/ddl.rs b/src/ast/ddl.rs
index f0e79e73..879740f0 100644
--- a/src/ast/ddl.rs
+++ b/src/ast/ddl.rs
@@ -3057,6 +3057,9 @@ pub struct CreateTable {
/// Redshift `SORTKEY` option
///
<https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html>
pub sortkey: Option<Vec<Expr>>,
+ /// Redshift `BACKUP` option: `BACKUP { YES | NO }`
+ ///
<https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html>
+ pub backup: Option<bool>,
}
impl fmt::Display for CreateTable {
@@ -3360,6 +3363,9 @@ impl fmt::Display for CreateTable {
if self.strict {
write!(f, " STRICT")?;
}
+ if let Some(backup) = self.backup {
+ write!(f, " BACKUP {}", if backup { "YES" } else { "NO" })?;
+ }
if let Some(diststyle) = &self.diststyle {
write!(f, " DISTSTYLE {diststyle}")?;
}
diff --git a/src/ast/helpers/stmt_create_table.rs
b/src/ast/helpers/stmt_create_table.rs
index 29589e21..ab2feb69 100644
--- a/src/ast/helpers/stmt_create_table.rs
+++ b/src/ast/helpers/stmt_create_table.rs
@@ -181,6 +181,8 @@ pub struct CreateTableBuilder {
pub distkey: Option<Expr>,
/// Redshift `SORTKEY` option.
pub sortkey: Option<Vec<Expr>>,
+ /// Redshift `BACKUP` option.
+ pub backup: Option<bool>,
}
impl CreateTableBuilder {
@@ -245,6 +247,7 @@ impl CreateTableBuilder {
diststyle: None,
distkey: None,
sortkey: None,
+ backup: None,
}
}
/// Set `OR REPLACE` for the CREATE TABLE statement.
@@ -548,6 +551,11 @@ impl CreateTableBuilder {
self.sortkey = sortkey;
self
}
+ /// Set the Redshift `BACKUP` option.
+ pub fn backup(mut self, backup: Option<bool>) -> Self {
+ self.backup = backup;
+ self
+ }
/// Consume the builder and produce a `CreateTable`.
pub fn build(self) -> CreateTable {
CreateTable {
@@ -609,6 +617,7 @@ impl CreateTableBuilder {
diststyle: self.diststyle,
distkey: self.distkey,
sortkey: self.sortkey,
+ backup: self.backup,
}
}
}
@@ -689,6 +698,7 @@ impl From<CreateTable> for CreateTableBuilder {
diststyle: table.diststyle,
distkey: table.distkey,
sortkey: table.sortkey,
+ backup: table.backup,
}
}
}
diff --git a/src/ast/spans.rs b/src/ast/spans.rs
index 78698bbe..2af57d98 100644
--- a/src/ast/spans.rs
+++ b/src/ast/spans.rs
@@ -589,6 +589,7 @@ impl Spanned for CreateTable {
diststyle: _,
distkey: _,
sortkey: _,
+ backup: _,
} = self;
union_spans(
diff --git a/src/keywords.rs b/src/keywords.rs
index 94458ccb..f0f37b1c 100644
--- a/src/keywords.rs
+++ b/src/keywords.rs
@@ -145,6 +145,7 @@ define_keywords!(
AVG,
AVG_ROW_LENGTH,
AVRO,
+ BACKUP,
BACKWARD,
BASE64,
BASE_LOCATION,
@@ -1171,6 +1172,7 @@ define_keywords!(
XOR,
YEAR,
YEARS,
+ YES,
ZONE,
ZORDER,
ZSTD
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index f617cadd..cefc0c6f 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -8443,6 +8443,14 @@ impl<'a> Parser<'a> {
let strict = self.parse_keyword(Keyword::STRICT);
+ // Redshift: BACKUP YES|NO
+ let backup = if self.parse_keyword(Keyword::BACKUP) {
+ let keyword = self.expect_one_of_keywords(&[Keyword::YES,
Keyword::NO])?;
+ Some(keyword == Keyword::YES)
+ } else {
+ None
+ };
+
// Redshift: DISTSTYLE, DISTKEY, SORTKEY
let diststyle = if self.parse_keyword(Keyword::DISTSTYLE) {
Some(self.parse_dist_style()?)
@@ -8505,6 +8513,7 @@ impl<'a> Parser<'a> {
.table_options(create_table_config.table_options)
.primary_key(primary_key)
.strict(strict)
+ .backup(backup)
.diststyle(diststyle)
.distkey(distkey)
.sortkey(sortkey)
diff --git a/tests/sqlparser_duckdb.rs b/tests/sqlparser_duckdb.rs
index 671e92b9..df626858 100644
--- a/tests/sqlparser_duckdb.rs
+++ b/tests/sqlparser_duckdb.rs
@@ -793,6 +793,7 @@ fn test_duckdb_union_datatype() {
diststyle: Default::default(),
distkey: Default::default(),
sortkey: Default::default(),
+ backup: Default::default(),
}),
stmt
);
diff --git a/tests/sqlparser_mssql.rs b/tests/sqlparser_mssql.rs
index 07dd0fcb..733923f4 100644
--- a/tests/sqlparser_mssql.rs
+++ b/tests/sqlparser_mssql.rs
@@ -2011,6 +2011,7 @@ fn parse_create_table_with_valid_options() {
diststyle: None,
distkey: None,
sortkey: None,
+ backup: None,
})
);
}
@@ -2184,6 +2185,7 @@ fn parse_create_table_with_identity_column() {
diststyle: None,
distkey: None,
sortkey: None,
+ backup: None,
}),
);
}
diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs
index 6b4f35d7..9a4ff418 100644
--- a/tests/sqlparser_postgres.rs
+++ b/tests/sqlparser_postgres.rs
@@ -6503,6 +6503,7 @@ fn parse_trigger_related_functions() {
diststyle: None,
distkey: None,
sortkey: None,
+ backup: None,
}
);
diff --git a/tests/sqlparser_redshift.rs b/tests/sqlparser_redshift.rs
index 184aa5b6..319a818c 100644
--- a/tests/sqlparser_redshift.rs
+++ b/tests/sqlparser_redshift.rs
@@ -500,3 +500,14 @@ fn test_alter_table_alter_sortkey() {
redshift().verified_stmt("ALTER TABLE users ALTER SORTKEY(created_at)");
redshift().verified_stmt("ALTER TABLE users ALTER SORTKEY(c1, c2)");
}
+
+#[test]
+fn test_create_table_backup() {
+ redshift().verified_stmt("CREATE TABLE public.users (id INT, name
VARCHAR(255)) BACKUP YES");
+
+ redshift().verified_stmt("CREATE TABLE staging.events (event_id INT)
BACKUP NO");
+
+ redshift().verified_stmt(
+ "CREATE TABLE public.users_backup_test BACKUP YES DISTSTYLE AUTO AS
SELECT id, name, email FROM public.users",
+ );
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]