Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 15 additions & 9 deletions src/ast/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -431,15 +431,6 @@ impl fmt::Display for WindowFrameBound {
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Statement {
// EXPLAIN
Explain {
// Carry out the command and show actual run times and other statistics.
analyze: bool,
// Display additional information regarding the plan.
verbose: bool,
/// A SQL query that specifies what to explain
statement: Box<Statement>,
},
/// SELECT
Query(Box<Query>),
/// INSERT
Expand Down Expand Up @@ -592,6 +583,20 @@ pub enum Statement {
data_types: Vec<DataType>,
statement: Box<Statement>,
},
/// EXPLAIN
Explain {
/// Carry out the command and show actual run times and other statistics.
analyze: bool,
// Display additional information regarding the plan.
verbose: bool,
/// A SQL query that specifies what to explain
statement: Box<Statement>,
},
/// ANALYZE
Analyze {
/// Name of table
table_name: ObjectName,
},
}

impl fmt::Display for Statement {
Expand All @@ -617,6 +622,7 @@ impl fmt::Display for Statement {

write!(f, "{}", statement)
}
Statement::Analyze { table_name } => write!(f, "ANALYZE TABLE {}", table_name),
Statement::Query(s) => write!(f, "{}", s),
Statement::Insert {
table_name,
Expand Down
10 changes: 10 additions & 0 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ impl<'a> Parser<'a> {
match self.next_token() {
Token::Word(w) => match w.keyword {
Keyword::EXPLAIN => Ok(self.parse_explain()?),
Keyword::ANALYZE => Ok(self.parse_analyze()?),
Keyword::SELECT | Keyword::WITH | Keyword::VALUES => {
self.prev_token();
Ok(Statement::Query(Box::new(self.parse_query()?)))
Expand Down Expand Up @@ -1804,6 +1805,15 @@ impl<'a> Parser<'a> {
})
}

pub fn parse_analyze(&mut self) -> Result<Statement, ParserError> {
// ANALYZE TABLE table_name
self.expect_keyword(Keyword::TABLE)?;

let table_name = self.parse_object_name()?;

Ok(Statement::Analyze { table_name })
}

/// Parse a query expression, i.e. a `SELECT` statement optionally
/// preceeded with some `WITH` CTE declarations and optionally followed
/// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't
Expand Down
12 changes: 12 additions & 0 deletions tests/sqlparser_common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1639,6 +1639,18 @@ fn parse_explain_analyze_with_simple_select() {
);
}

#[test]
fn parse_simple_analyze() {
let sql = "ANALYZE TABLE t";
let stmt = verified_stmt(sql);
assert_eq!(
stmt,
Statement::Analyze {
table_name: ObjectName(vec![Ident::new("t")])
}
);
}

#[test]
fn parse_named_argument_function() {
let sql = "SELECT FUN(a => '1', b => '2') FROM foo";
Expand Down