mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-07-07 17:04:59 +00:00
Support parsing EXPLAIN ESTIMATE
of Clickhouse (#1605)
Co-authored-by: Kermit <chenjiawei1@xiaohongshu.com>
This commit is contained in:
parent
c69839102a
commit
8fcdf48e5c
4 changed files with 42 additions and 0 deletions
|
@ -3239,6 +3239,9 @@ pub enum Statement {
|
|||
///
|
||||
/// [SQLite](https://sqlite.org/lang_explain.html)
|
||||
query_plan: bool,
|
||||
/// `EXPLAIN ESTIMATE`
|
||||
/// [Clickhouse](https://clickhouse.com/docs/en/sql-reference/statements/explain#explain-estimate)
|
||||
estimate: bool,
|
||||
/// A SQL query that specifies what to explain
|
||||
statement: Box<Statement>,
|
||||
/// Optional output format of explain
|
||||
|
@ -3471,6 +3474,7 @@ impl fmt::Display for Statement {
|
|||
verbose,
|
||||
analyze,
|
||||
query_plan,
|
||||
estimate,
|
||||
statement,
|
||||
format,
|
||||
options,
|
||||
|
@ -3483,6 +3487,9 @@ impl fmt::Display for Statement {
|
|||
if *analyze {
|
||||
write!(f, "ANALYZE ")?;
|
||||
}
|
||||
if *estimate {
|
||||
write!(f, "ESTIMATE ")?;
|
||||
}
|
||||
|
||||
if *verbose {
|
||||
write!(f, "VERBOSE ")?;
|
||||
|
|
|
@ -298,6 +298,7 @@ define_keywords!(
|
|||
ERROR,
|
||||
ESCAPE,
|
||||
ESCAPED,
|
||||
ESTIMATE,
|
||||
EVENT,
|
||||
EVERY,
|
||||
EXCEPT,
|
||||
|
|
|
@ -9091,6 +9091,7 @@ impl<'a> Parser<'a> {
|
|||
let mut analyze = false;
|
||||
let mut verbose = false;
|
||||
let mut query_plan = false;
|
||||
let mut estimate = false;
|
||||
let mut format = None;
|
||||
let mut options = None;
|
||||
|
||||
|
@ -9103,6 +9104,8 @@ impl<'a> Parser<'a> {
|
|||
options = Some(self.parse_utility_options()?)
|
||||
} else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
|
||||
query_plan = true;
|
||||
} else if self.parse_keyword(Keyword::ESTIMATE) {
|
||||
estimate = true;
|
||||
} else {
|
||||
analyze = self.parse_keyword(Keyword::ANALYZE);
|
||||
verbose = self.parse_keyword(Keyword::VERBOSE);
|
||||
|
@ -9120,6 +9123,7 @@ impl<'a> Parser<'a> {
|
|||
analyze,
|
||||
verbose,
|
||||
query_plan,
|
||||
estimate,
|
||||
statement: Box::new(statement),
|
||||
format,
|
||||
options,
|
||||
|
|
|
@ -4375,6 +4375,7 @@ fn run_explain_analyze(
|
|||
analyze,
|
||||
verbose,
|
||||
query_plan,
|
||||
estimate,
|
||||
statement,
|
||||
format,
|
||||
options,
|
||||
|
@ -4384,6 +4385,7 @@ fn run_explain_analyze(
|
|||
assert_eq!(format, expected_format);
|
||||
assert_eq!(options, exepcted_options);
|
||||
assert!(!query_plan);
|
||||
assert!(!estimate);
|
||||
assert_eq!("SELECT sqrt(id) FROM foo", statement.to_string());
|
||||
}
|
||||
_ => panic!("Unexpected Statement, must be Explain"),
|
||||
|
@ -4528,6 +4530,34 @@ fn parse_explain_query_plan() {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_explain_estimate() {
|
||||
let statement = all_dialects().verified_stmt("EXPLAIN ESTIMATE SELECT sqrt(id) FROM foo");
|
||||
|
||||
match &statement {
|
||||
Statement::Explain {
|
||||
query_plan,
|
||||
estimate,
|
||||
analyze,
|
||||
verbose,
|
||||
statement,
|
||||
..
|
||||
} => {
|
||||
assert!(estimate);
|
||||
assert!(!query_plan);
|
||||
assert!(!analyze);
|
||||
assert!(!verbose);
|
||||
assert_eq!("SELECT sqrt(id) FROM foo", statement.to_string());
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
||||
assert_eq!(
|
||||
"EXPLAIN ESTIMATE SELECT sqrt(id) FROM foo",
|
||||
statement.to_string()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parse_named_argument_function() {
|
||||
let dialects = all_dialects_where(|d| {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue