Code review comments

This commit is contained in:
Yoav Cohen 2025-08-21 09:29:24 +03:00
parent 41af5d4f6e
commit 2e313d3e69
2 changed files with 38 additions and 16 deletions

View file

@ -649,7 +649,10 @@ impl<'a> Parser<'a> {
self.prev_token();
self.parse_export_data()
}
Keyword::VACUUM => self.parse_vacuum(),
Keyword::VACUUM => {
self.prev_token();
self.parse_vacuum()
}
_ => self.expected("an SQL statement", next_token),
},
Token::LParen => {
@ -16934,25 +16937,27 @@ impl<'a> Parser<'a> {
}
fn parse_vacuum(&mut self) -> Result<Statement, ParserError> {
self.expect_keyword(Keyword::VACUUM)?;
let full = self.parse_keyword(Keyword::FULL);
let sort_only = self.parse_keywords(&[Keyword::SORT, Keyword::ONLY]);
let delete_only = self.parse_keywords(&[Keyword::DELETE, Keyword::ONLY]);
let reindex = self.parse_keyword(Keyword::REINDEX);
let recluster = self.parse_keyword(Keyword::RECLUSTER);
let (table_name, threshold, boost) = match self.parse_object_name(false) {
Ok(table_name) => {
let threshold = if self.parse_keyword(Keyword::TO) {
let value = self.parse_value()?;
self.expect_keyword(Keyword::PERCENT)?;
Some(value.value)
} else {
None
};
let boost = self.parse_keyword(Keyword::BOOST);
(Some(table_name), threshold, boost)
}
_ => (None, None, false),
};
let (table_name, threshold, boost) =
match self.maybe_parse(|p| p.parse_object_name(false))? {
Some(table_name) => {
let threshold = if self.parse_keyword(Keyword::TO) {
let value = self.parse_value()?;
self.expect_keyword(Keyword::PERCENT)?;
Some(value.value)
} else {
None
};
let boost = self.parse_keyword(Keyword::BOOST);
(Some(table_name), threshold, boost)
}
_ => (None, None, false),
};
Ok(Statement::Vacuum(VacuumStatement {
full,
sort_only,

View file

@ -410,7 +410,24 @@ fn parse_utf8_multibyte_idents() {
#[test]
fn parse_vacuum() {
redshift().verified_stmt("VACUUM db1.sc1.tbl1");
let stmt = redshift().verified_stmt("VACUUM FULL");
match stmt {
Statement::Vacuum(v) => {
assert!(v.full);
assert_eq!(v.table_name, None);
}
_ => unreachable!(),
}
let stmt = redshift().verified_stmt("VACUUM tbl");
match stmt {
Statement::Vacuum(v) => {
assert_eq!(
v.table_name,
Some(ObjectName::from(vec![Ident::new("tbl"),]))
);
}
_ => unreachable!(),
}
let stmt = redshift().verified_stmt(
"VACUUM FULL SORT ONLY DELETE ONLY REINDEX RECLUSTER db1.sc1.tbl1 TO 20 PERCENT BOOST",
);