mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-08-23 23:44:07 +00:00
parent
17f2930885
commit
94ff46802c
3 changed files with 37 additions and 9 deletions
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue