Skip to content

Commit 2fa6464

Browse files
committed
Redshift: more copy options
1 parent 54a24e7 commit 2fa6464

File tree

4 files changed

+96
-2
lines changed

4 files changed

+96
-2
lines changed

src/ast/mod.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8636,6 +8636,8 @@ pub enum CopyLegacyOption {
86368636
Bzip2,
86378637
/// CLEANPATH
86388638
CleanPath,
8639+
/// COMPUPDATE [ PRESET | { ON | TRUE } | { OFF | FALSE } ]
8640+
CompUpdate { preset: bool, enabled: Option<bool> },
86398641
/// CSV ...
86408642
Csv(Vec<CopyLegacyCsvOption>),
86418643
/// DATEFORMAT \[ AS \] {'dateformat_string' | 'auto' }
@@ -8676,8 +8678,12 @@ pub enum CopyLegacyOption {
86768678
PartitionBy(UnloadPartitionBy),
86778679
/// REGION \[ AS \] 'aws-region' }
86788680
Region(String),
8681+
/// REMOVEQUOTES
8682+
RemoveQuotes,
86798683
/// ROWGROUPSIZE \[ AS \] size \[ MB | GB \]
86808684
RowGroupSize(FileSize),
8685+
/// STATUPDATE [ { ON | TRUE } | { OFF | FALSE } ]
8686+
StatUpdate(Option<bool>),
86818687
/// TIMEFORMAT \[ AS \] {'timeformat_string' | 'auto' | 'epochsecs' | 'epochmillisecs' }
86828688
TimeFormat(Option<String>),
86838689
/// TRUNCATECOLUMNS
@@ -8704,6 +8710,22 @@ impl fmt::Display for CopyLegacyOption {
87048710
BlankAsNull => write!(f, "BLANKSASNULL"),
87058711
Bzip2 => write!(f, "BZIP2"),
87068712
CleanPath => write!(f, "CLEANPATH"),
8713+
CompUpdate { preset, enabled } => {
8714+
write!(f, "COMPUPDATE")?;
8715+
if *preset {
8716+
write!(f, " PRESET")
8717+
} else {
8718+
write!(
8719+
f,
8720+
"{}",
8721+
match *enabled {
8722+
Some(true) => " TRUE",
8723+
Some(false) => " FALSE",
8724+
_ => "",
8725+
}
8726+
)
8727+
}
8728+
}
87078729
Csv(opts) => {
87088730
write!(f, "CSV")?;
87098731
if !opts.is_empty() {
@@ -8750,7 +8772,19 @@ impl fmt::Display for CopyLegacyOption {
87508772
Parquet => write!(f, "PARQUET"),
87518773
PartitionBy(p) => write!(f, "{p}"),
87528774
Region(region) => write!(f, "REGION '{}'", value::escape_single_quote_string(region)),
8775+
RemoveQuotes => write!(f, "REMOVEQUOTES"),
87538776
RowGroupSize(file_size) => write!(f, "ROWGROUPSIZE {file_size}"),
8777+
StatUpdate(enabled) => {
8778+
write!(
8779+
f,
8780+
"STATUPDATE{}",
8781+
match enabled {
8782+
Some(true) => " TRUE",
8783+
Some(false) => " FALSE",
8784+
_ => "",
8785+
}
8786+
)
8787+
}
87548788
TimeFormat(fmt) => {
87558789
write!(f, "TIMEFORMAT")?;
87568790
if let Some(fmt) = fmt {

src/keywords.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ define_keywords!(
214214
COMMITTED,
215215
COMPATIBLE,
216216
COMPRESSION,
217+
COMPUPDATE,
217218
COMPUTE,
218219
CONCURRENTLY,
219220
CONDITION,
@@ -739,6 +740,7 @@ define_keywords!(
739740
PRECISION,
740741
PREPARE,
741742
PRESERVE,
743+
PRESET,
742744
PREWHERE,
743745
PRIMARY,
744746
PRINT,
@@ -790,6 +792,7 @@ define_keywords!(
790792
RELEASES,
791793
REMOTE,
792794
REMOVE,
795+
REMOVEQUOTES,
793796
RENAME,
794797
REORG,
795798
REPAIR,
@@ -903,6 +906,7 @@ define_keywords!(
903906
STATS_AUTO_RECALC,
904907
STATS_PERSISTENT,
905908
STATS_SAMPLE_PAGES,
909+
STATUPDATE,
906910
STATUS,
907911
STDDEV_POP,
908912
STDDEV_SAMP,

src/parser/mod.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9632,6 +9632,7 @@ impl<'a> Parser<'a> {
96329632
Keyword::BLANKSASNULL,
96339633
Keyword::BZIP2,
96349634
Keyword::CLEANPATH,
9635+
Keyword::COMPUPDATE,
96359636
Keyword::CSV,
96369637
Keyword::DATEFORMAT,
96379638
Keyword::DELIMITER,
@@ -9652,7 +9653,9 @@ impl<'a> Parser<'a> {
96529653
Keyword::PARQUET,
96539654
Keyword::PARTITION,
96549655
Keyword::REGION,
9656+
Keyword::REMOVEQUOTES,
96559657
Keyword::ROWGROUPSIZE,
9658+
Keyword::STATUPDATE,
96569659
Keyword::TIMEFORMAT,
96579660
Keyword::TRUNCATECOLUMNS,
96589661
Keyword::ZSTD,
@@ -9673,6 +9676,21 @@ impl<'a> Parser<'a> {
96739676
Some(Keyword::BLANKSASNULL) => CopyLegacyOption::BlankAsNull,
96749677
Some(Keyword::BZIP2) => CopyLegacyOption::Bzip2,
96759678
Some(Keyword::CLEANPATH) => CopyLegacyOption::CleanPath,
9679+
Some(Keyword::COMPUPDATE) => {
9680+
let preset = self.parse_keyword(Keyword::PRESET);
9681+
let enabled = match self.parse_one_of_keywords(&[
9682+
Keyword::TRUE,
9683+
Keyword::FALSE,
9684+
Keyword::ON,
9685+
Keyword::OFF,
9686+
]) {
9687+
Some(Keyword::PRESET) => None,
9688+
Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
9689+
Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
9690+
_ => None,
9691+
};
9692+
CopyLegacyOption::CompUpdate { preset, enabled }
9693+
}
96769694
Some(Keyword::CSV) => CopyLegacyOption::Csv({
96779695
let mut opts = vec![];
96789696
while let Some(opt) =
@@ -9761,11 +9779,25 @@ impl<'a> Parser<'a> {
97619779
let region = self.parse_literal_string()?;
97629780
CopyLegacyOption::Region(region)
97639781
}
9782+
Some(Keyword::REMOVEQUOTES) => CopyLegacyOption::RemoveQuotes,
97649783
Some(Keyword::ROWGROUPSIZE) => {
97659784
let _ = self.parse_keyword(Keyword::AS);
97669785
let file_size = self.parse_file_size()?;
97679786
CopyLegacyOption::RowGroupSize(file_size)
97689787
}
9788+
Some(Keyword::STATUPDATE) => {
9789+
let enabled = match self.parse_one_of_keywords(&[
9790+
Keyword::TRUE,
9791+
Keyword::FALSE,
9792+
Keyword::ON,
9793+
Keyword::OFF,
9794+
]) {
9795+
Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
9796+
Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
9797+
_ => None,
9798+
};
9799+
CopyLegacyOption::StatUpdate(enabled)
9800+
}
97699801
Some(Keyword::TIMEFORMAT) => {
97709802
let _ = self.parse_keyword(Keyword::AS);
97719803
let fmt = if matches!(self.peek_token().token, Token::SingleQuotedString(_)) {

tests/sqlparser_common.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17034,7 +17034,19 @@ fn parse_copy_options() {
1703417034
"IAM_ROLE DEFAULT ",
1703517035
"IGNOREHEADER AS 1 ",
1703617036
"TIMEFORMAT AS 'auto' ",
17037-
"TRUNCATECOLUMNS",
17037+
"TRUNCATECOLUMNS ",
17038+
"REMOVEQUOTES ",
17039+
"COMPUPDATE ",
17040+
"COMPUPDATE PRESET ",
17041+
"COMPUPDATE ON ",
17042+
"COMPUPDATE OFF ",
17043+
"COMPUPDATE TRUE ",
17044+
"COMPUPDATE FALSE ",
17045+
"STATUPDATE ",
17046+
"STATUPDATE ON ",
17047+
"STATUPDATE OFF ",
17048+
"STATUPDATE TRUE ",
17049+
"STATUPDATE FALSE",
1703817050
),
1703917051
concat!(
1704017052
"COPY dst (c1, c2, c3) FROM 's3://redshift-downloads/tickit/category_pipe.txt' ",
@@ -17047,7 +17059,19 @@ fn parse_copy_options() {
1704717059
"IAM_ROLE DEFAULT ",
1704817060
"IGNOREHEADER 1 ",
1704917061
"TIMEFORMAT 'auto' ",
17050-
"TRUNCATECOLUMNS",
17062+
"TRUNCATECOLUMNS ",
17063+
"REMOVEQUOTES ",
17064+
"COMPUPDATE ",
17065+
"COMPUPDATE PRESET ",
17066+
"COMPUPDATE TRUE ",
17067+
"COMPUPDATE FALSE ",
17068+
"COMPUPDATE TRUE ",
17069+
"COMPUPDATE FALSE ",
17070+
"STATUPDATE ",
17071+
"STATUPDATE TRUE ",
17072+
"STATUPDATE FALSE ",
17073+
"STATUPDATE TRUE ",
17074+
"STATUPDATE FALSE",
1705117075
),
1705217076
);
1705317077
one_statement_parses_to(

0 commit comments

Comments
 (0)