Support ANALYZE TABLE syntax (#285)

* Support analyze table

* Cleanup
This commit is contained in:
Daniël Heres 2020-12-28 18:08:32 +01:00 committed by GitHub
parent 17f2930885
commit 94ff46802c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 9 deletions

View file

@ -431,15 +431,6 @@ impl fmt::Display for WindowFrameBound {
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Statement { 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 /// SELECT
Query(Box<Query>), Query(Box<Query>),
/// INSERT /// INSERT
@ -592,6 +583,20 @@ pub enum Statement {
data_types: Vec<DataType>, data_types: Vec<DataType>,
statement: Box<Statement>, 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 { impl fmt::Display for Statement {
@ -617,6 +622,7 @@ impl fmt::Display for Statement {
write!(f, "{}", statement) write!(f, "{}", statement)
} }
Statement::Analyze { table_name } => write!(f, "ANALYZE TABLE {}", table_name),
Statement::Query(s) => write!(f, "{}", s), Statement::Query(s) => write!(f, "{}", s),
Statement::Insert { Statement::Insert {
table_name, table_name,

View file

@ -132,6 +132,7 @@ impl<'a> Parser<'a> {
match self.next_token() { match self.next_token() {
Token::Word(w) => match w.keyword { Token::Word(w) => match w.keyword {
Keyword::EXPLAIN => Ok(self.parse_explain()?), Keyword::EXPLAIN => Ok(self.parse_explain()?),
Keyword::ANALYZE => Ok(self.parse_analyze()?),
Keyword::SELECT | Keyword::WITH | Keyword::VALUES => { Keyword::SELECT | Keyword::WITH | Keyword::VALUES => {
self.prev_token(); self.prev_token();
Ok(Statement::Query(Box::new(self.parse_query()?))) Ok(Statement::Query(Box::new(self.parse_query()?)))
@ -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 /// Parse a query expression, i.e. a `SELECT` statement optionally
/// preceeded with some `WITH` CTE declarations and optionally followed /// preceeded with some `WITH` CTE declarations and optionally followed
/// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't /// by `ORDER BY`. Unlike some other parse_... methods, this one doesn't

View file

@ -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] #[test]
fn parse_named_argument_function() { fn parse_named_argument_function() {
let sql = "SELECT FUN(a => '1', b => '2') FROM foo"; let sql = "SELECT FUN(a => '1', b => '2') FROM foo";