From 8507e452399605cfca98eed11ce4123a5e738333 Mon Sep 17 00:00:00 2001 From: yuyang Date: Fri, 13 Dec 2024 09:42:30 +0800 Subject: [PATCH 1/3] only some dialect require table keyword --- src/parser/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index ac76f6484..a6a39ac73 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -851,7 +851,9 @@ impl<'a> Parser<'a> { } pub fn parse_analyze(&mut self) -> Result { - self.expect_keyword(Keyword::TABLE)?; + if dialect_of!(self is MySqlDialect | DatabricksDialect | HiveDialect | SnowflakeDialect) { + self.expect_keyword(Keyword::TABLE)?; + } let table_name = self.parse_object_name(false)?; let mut for_columns = false; let mut cache_metadata = false; From 4d41ecd58d90e25d0f943ecbb38ee65588b80fda Mon Sep 17 00:00:00 2001 From: yuyang Date: Mon, 16 Dec 2024 14:07:23 +0800 Subject: [PATCH 2/3] use a bool idicate if have table keyword --- src/ast/mod.rs | 8 +++++++- src/ast/spans.rs | 1 + src/parser/mod.rs | 5 ++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index bc4dda349..7b1266b59 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -2351,6 +2351,7 @@ pub enum Statement { cache_metadata: bool, noscan: bool, compute_statistics: bool, + has_table_keyword: bool, }, /// ```sql /// TRUNCATE @@ -3641,8 +3642,13 @@ impl fmt::Display for Statement { cache_metadata, noscan, compute_statistics, + has_table_keyword, } => { - write!(f, "ANALYZE TABLE {table_name}")?; + write!( + f, + "ANALYZE{}{table_name}", + if *has_table_keyword { " TABLE " } else { " " } + )?; if let Some(ref parts) = partitions { if !parts.is_empty() { write!(f, " PARTITION ({})", display_comma_separated(parts))?; diff --git a/src/ast/spans.rs b/src/ast/spans.rs index de577c9b8..8a22d2b1a 100644 --- a/src/ast/spans.rs +++ b/src/ast/spans.rs @@ -267,6 +267,7 @@ impl Spanned for Statement { cache_metadata: _, noscan: _, compute_statistics: _, + has_table_keyword: _, } => union_spans( core::iter::once(table_name.span()) .chain(partitions.iter().flat_map(|i| i.iter().map(|k| k.span()))) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index a6a39ac73..5cad35efd 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -851,9 +851,7 @@ impl<'a> Parser<'a> { } pub fn parse_analyze(&mut self) -> Result { - if dialect_of!(self is MySqlDialect | DatabricksDialect | HiveDialect | SnowflakeDialect) { - self.expect_keyword(Keyword::TABLE)?; - } + let has_table_keyword = self.parse_keyword(Keyword::TABLE); let table_name = self.parse_object_name(false)?; let mut for_columns = false; let mut cache_metadata = false; @@ -898,6 +896,7 @@ impl<'a> Parser<'a> { } Ok(Statement::Analyze { + has_table_keyword, table_name, for_columns, columns, From 041763d4ddc5ffc89720c07e950d093540d64fbb Mon Sep 17 00:00:00 2001 From: yuyang Date: Tue, 17 Dec 2024 18:27:31 +0800 Subject: [PATCH 3/3] parse analyze test --- tests/sqlparser_common.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 42616d51e..1720a15d8 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -578,6 +578,12 @@ fn parse_select_with_table_alias() { ); } +#[test] +fn parse_analyze() { + verified_stmt("ANALYZE TABLE test_table"); + verified_stmt("ANALYZE test_table"); +} + #[test] fn parse_invalid_table_name() { let ast = all_dialects().run_parser_method("db.public..customer", |parser| {