Skip to content

Commit 2c3029c

Browse files
yoavcloudayman-sigma
authored andcommitted
Redshift: more copy options (apache#2072)
1 parent 39c18f5 commit 2c3029c

File tree

4 files changed

+95
-2
lines changed

4 files changed

+95
-2
lines changed

src/ast/mod.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8239,6 +8239,8 @@ pub enum CopyLegacyOption {
82398239
Bzip2,
82408240
/// CLEANPATH
82418241
CleanPath,
8242+
/// COMPUPDATE [ PRESET | { ON | TRUE } | { OFF | FALSE } ]
8243+
CompUpdate { preset: bool, enabled: Option<bool> },
82428244
/// CSV ...
82438245
Csv(Vec<CopyLegacyCsvOption>),
82448246
/// DATEFORMAT \[ AS \] {'dateformat_string' | 'auto' }
@@ -8279,8 +8281,12 @@ pub enum CopyLegacyOption {
82798281
PartitionBy(UnloadPartitionBy),
82808282
/// REGION \[ AS \] 'aws-region' }
82818283
Region(String),
8284+
/// REMOVEQUOTES
8285+
RemoveQuotes,
82828286
/// ROWGROUPSIZE \[ AS \] size \[ MB | GB \]
82838287
RowGroupSize(FileSize),
8288+
/// STATUPDATE [ { ON | TRUE } | { OFF | FALSE } ]
8289+
StatUpdate(Option<bool>),
82848290
/// TIMEFORMAT \[ AS \] {'timeformat_string' | 'auto' | 'epochsecs' | 'epochmillisecs' }
82858291
TimeFormat(Option<String>),
82868292
/// TRUNCATECOLUMNS
@@ -8307,6 +8313,22 @@ impl fmt::Display for CopyLegacyOption {
83078313
BlankAsNull => write!(f, "BLANKSASNULL"),
83088314
Bzip2 => write!(f, "BZIP2"),
83098315
CleanPath => write!(f, "CLEANPATH"),
8316+
CompUpdate { preset, enabled } => {
8317+
write!(f, "COMPUPDATE")?;
8318+
if *preset {
8319+
write!(f, " PRESET")?;
8320+
} else if let Some(enabled) = enabled {
8321+
write!(
8322+
f,
8323+
"{}",
8324+
match enabled {
8325+
true => " TRUE",
8326+
false => " FALSE",
8327+
}
8328+
)?;
8329+
}
8330+
Ok(())
8331+
}
83108332
Csv(opts) => {
83118333
write!(f, "CSV")?;
83128334
if !opts.is_empty() {
@@ -8353,7 +8375,19 @@ impl fmt::Display for CopyLegacyOption {
83538375
Parquet => write!(f, "PARQUET"),
83548376
PartitionBy(p) => write!(f, "{p}"),
83558377
Region(region) => write!(f, "REGION '{}'", value::escape_single_quote_string(region)),
8378+
RemoveQuotes => write!(f, "REMOVEQUOTES"),
83568379
RowGroupSize(file_size) => write!(f, "ROWGROUPSIZE {file_size}"),
8380+
StatUpdate(enabled) => {
8381+
write!(
8382+
f,
8383+
"STATUPDATE{}",
8384+
match enabled {
8385+
Some(true) => " TRUE",
8386+
Some(false) => " FALSE",
8387+
_ => "",
8388+
}
8389+
)
8390+
}
83578391
TimeFormat(fmt) => {
83588392
write!(f, "TIMEFORMAT")?;
83598393
if let Some(fmt) = fmt {

src/keywords.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ define_keywords!(
215215
COMMITTED,
216216
COMPATIBLE,
217217
COMPRESSION,
218+
COMPUPDATE,
218219
COMPUTE,
219220
CONCURRENTLY,
220221
CONDITION,
@@ -749,6 +750,7 @@ define_keywords!(
749750
PRECISION,
750751
PREPARE,
751752
PRESERVE,
753+
PRESET,
752754
PREWHERE,
753755
PRIMARY,
754756
PRINT,
@@ -801,6 +803,7 @@ define_keywords!(
801803
RELEASES,
802804
REMOTE,
803805
REMOVE,
806+
REMOVEQUOTES,
804807
RENAME,
805808
REORG,
806809
REPAIR,
@@ -915,6 +918,7 @@ define_keywords!(
915918
STATS_AUTO_RECALC,
916919
STATS_PERSISTENT,
917920
STATS_SAMPLE_PAGES,
921+
STATUPDATE,
918922
STATUS,
919923
STDDEV_POP,
920924
STDDEV_SAMP,

src/parser/mod.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9772,6 +9772,7 @@ impl<'a> Parser<'a> {
97729772
Keyword::BLANKSASNULL,
97739773
Keyword::BZIP2,
97749774
Keyword::CLEANPATH,
9775+
Keyword::COMPUPDATE,
97759776
Keyword::CSV,
97769777
Keyword::DATEFORMAT,
97779778
Keyword::DELIMITER,
@@ -9792,7 +9793,9 @@ impl<'a> Parser<'a> {
97929793
Keyword::PARQUET,
97939794
Keyword::PARTITION,
97949795
Keyword::REGION,
9796+
Keyword::REMOVEQUOTES,
97959797
Keyword::ROWGROUPSIZE,
9798+
Keyword::STATUPDATE,
97969799
Keyword::TIMEFORMAT,
97979800
Keyword::TRUNCATECOLUMNS,
97989801
Keyword::ZSTD,
@@ -9813,6 +9816,20 @@ impl<'a> Parser<'a> {
98139816
Some(Keyword::BLANKSASNULL) => CopyLegacyOption::BlankAsNull,
98149817
Some(Keyword::BZIP2) => CopyLegacyOption::Bzip2,
98159818
Some(Keyword::CLEANPATH) => CopyLegacyOption::CleanPath,
9819+
Some(Keyword::COMPUPDATE) => {
9820+
let preset = self.parse_keyword(Keyword::PRESET);
9821+
let enabled = match self.parse_one_of_keywords(&[
9822+
Keyword::TRUE,
9823+
Keyword::FALSE,
9824+
Keyword::ON,
9825+
Keyword::OFF,
9826+
]) {
9827+
Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
9828+
Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
9829+
_ => None,
9830+
};
9831+
CopyLegacyOption::CompUpdate { preset, enabled }
9832+
}
98169833
Some(Keyword::CSV) => CopyLegacyOption::Csv({
98179834
let mut opts = vec![];
98189835
while let Some(opt) =
@@ -9901,11 +9918,25 @@ impl<'a> Parser<'a> {
99019918
let region = self.parse_literal_string()?;
99029919
CopyLegacyOption::Region(region)
99039920
}
9921+
Some(Keyword::REMOVEQUOTES) => CopyLegacyOption::RemoveQuotes,
99049922
Some(Keyword::ROWGROUPSIZE) => {
99059923
let _ = self.parse_keyword(Keyword::AS);
99069924
let file_size = self.parse_file_size()?;
99079925
CopyLegacyOption::RowGroupSize(file_size)
99089926
}
9927+
Some(Keyword::STATUPDATE) => {
9928+
let enabled = match self.parse_one_of_keywords(&[
9929+
Keyword::TRUE,
9930+
Keyword::FALSE,
9931+
Keyword::ON,
9932+
Keyword::OFF,
9933+
]) {
9934+
Some(Keyword::TRUE) | Some(Keyword::ON) => Some(true),
9935+
Some(Keyword::FALSE) | Some(Keyword::OFF) => Some(false),
9936+
_ => None,
9937+
};
9938+
CopyLegacyOption::StatUpdate(enabled)
9939+
}
99099940
Some(Keyword::TIMEFORMAT) => {
99109941
let _ = self.parse_keyword(Keyword::AS);
99119942
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
@@ -17152,7 +17152,19 @@ fn parse_copy_options() {
1715217152
"IAM_ROLE DEFAULT ",
1715317153
"IGNOREHEADER AS 1 ",
1715417154
"TIMEFORMAT AS 'auto' ",
17155-
"TRUNCATECOLUMNS",
17155+
"TRUNCATECOLUMNS ",
17156+
"REMOVEQUOTES ",
17157+
"COMPUPDATE ",
17158+
"COMPUPDATE PRESET ",
17159+
"COMPUPDATE ON ",
17160+
"COMPUPDATE OFF ",
17161+
"COMPUPDATE TRUE ",
17162+
"COMPUPDATE FALSE ",
17163+
"STATUPDATE ",
17164+
"STATUPDATE ON ",
17165+
"STATUPDATE OFF ",
17166+
"STATUPDATE TRUE ",
17167+
"STATUPDATE FALSE",
1715617168
),
1715717169
concat!(
1715817170
"COPY dst (c1, c2, c3) FROM 's3://redshift-downloads/tickit/category_pipe.txt' ",
@@ -17165,7 +17177,19 @@ fn parse_copy_options() {
1716517177
"IAM_ROLE DEFAULT ",
1716617178
"IGNOREHEADER 1 ",
1716717179
"TIMEFORMAT 'auto' ",
17168-
"TRUNCATECOLUMNS",
17180+
"TRUNCATECOLUMNS ",
17181+
"REMOVEQUOTES ",
17182+
"COMPUPDATE ",
17183+
"COMPUPDATE PRESET ",
17184+
"COMPUPDATE TRUE ",
17185+
"COMPUPDATE FALSE ",
17186+
"COMPUPDATE TRUE ",
17187+
"COMPUPDATE FALSE ",
17188+
"STATUPDATE ",
17189+
"STATUPDATE TRUE ",
17190+
"STATUPDATE FALSE ",
17191+
"STATUPDATE TRUE ",
17192+
"STATUPDATE FALSE",
1716917193
),
1717017194
);
1717117195
one_statement_parses_to(

0 commit comments

Comments
 (0)