diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 410e2ccc..52db37b7 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -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 { + 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, diff --git a/tests/sqlparser_redshift.rs b/tests/sqlparser_redshift.rs index a2480ae9..90652ff4 100644 --- a/tests/sqlparser_redshift.rs +++ b/tests/sqlparser_redshift.rs @@ -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", );