Skip to content

Commit 8fcdf48

Browse files
Support parsing EXPLAIN ESTIMATE of Clickhouse (#1605)
Co-authored-by: Kermit <[email protected]>
1 parent c698391 commit 8fcdf48

File tree

4 files changed

+42
-0
lines changed

4 files changed

+42
-0
lines changed

src/ast/mod.rs

+7
Original file line numberDiff line numberDiff line change
@@ -3239,6 +3239,9 @@ pub enum Statement {
32393239
///
32403240
/// [SQLite](https://sqlite.org/lang_explain.html)
32413241
query_plan: bool,
3242+
/// `EXPLAIN ESTIMATE`
3243+
/// [Clickhouse](https://clickhouse.com/docs/en/sql-reference/statements/explain#explain-estimate)
3244+
estimate: bool,
32423245
/// A SQL query that specifies what to explain
32433246
statement: Box<Statement>,
32443247
/// Optional output format of explain
@@ -3471,6 +3474,7 @@ impl fmt::Display for Statement {
34713474
verbose,
34723475
analyze,
34733476
query_plan,
3477+
estimate,
34743478
statement,
34753479
format,
34763480
options,
@@ -3483,6 +3487,9 @@ impl fmt::Display for Statement {
34833487
if *analyze {
34843488
write!(f, "ANALYZE ")?;
34853489
}
3490+
if *estimate {
3491+
write!(f, "ESTIMATE ")?;
3492+
}
34863493

34873494
if *verbose {
34883495
write!(f, "VERBOSE ")?;

src/keywords.rs

+1
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ define_keywords!(
298298
ERROR,
299299
ESCAPE,
300300
ESCAPED,
301+
ESTIMATE,
301302
EVENT,
302303
EVERY,
303304
EXCEPT,

src/parser/mod.rs

+4
Original file line numberDiff line numberDiff line change
@@ -9091,6 +9091,7 @@ impl<'a> Parser<'a> {
90919091
let mut analyze = false;
90929092
let mut verbose = false;
90939093
let mut query_plan = false;
9094+
let mut estimate = false;
90949095
let mut format = None;
90959096
let mut options = None;
90969097

@@ -9103,6 +9104,8 @@ impl<'a> Parser<'a> {
91039104
options = Some(self.parse_utility_options()?)
91049105
} else if self.parse_keywords(&[Keyword::QUERY, Keyword::PLAN]) {
91059106
query_plan = true;
9107+
} else if self.parse_keyword(Keyword::ESTIMATE) {
9108+
estimate = true;
91069109
} else {
91079110
analyze = self.parse_keyword(Keyword::ANALYZE);
91089111
verbose = self.parse_keyword(Keyword::VERBOSE);
@@ -9120,6 +9123,7 @@ impl<'a> Parser<'a> {
91209123
analyze,
91219124
verbose,
91229125
query_plan,
9126+
estimate,
91239127
statement: Box::new(statement),
91249128
format,
91259129
options,

tests/sqlparser_common.rs

+30
Original file line numberDiff line numberDiff line change
@@ -4375,6 +4375,7 @@ fn run_explain_analyze(
43754375
analyze,
43764376
verbose,
43774377
query_plan,
4378+
estimate,
43784379
statement,
43794380
format,
43804381
options,
@@ -4384,6 +4385,7 @@ fn run_explain_analyze(
43844385
assert_eq!(format, expected_format);
43854386
assert_eq!(options, exepcted_options);
43864387
assert!(!query_plan);
4388+
assert!(!estimate);
43874389
assert_eq!("SELECT sqrt(id) FROM foo", statement.to_string());
43884390
}
43894391
_ => panic!("Unexpected Statement, must be Explain"),
@@ -4528,6 +4530,34 @@ fn parse_explain_query_plan() {
45284530
);
45294531
}
45304532

4533+
#[test]
4534+
fn parse_explain_estimate() {
4535+
let statement = all_dialects().verified_stmt("EXPLAIN ESTIMATE SELECT sqrt(id) FROM foo");
4536+
4537+
match &statement {
4538+
Statement::Explain {
4539+
query_plan,
4540+
estimate,
4541+
analyze,
4542+
verbose,
4543+
statement,
4544+
..
4545+
} => {
4546+
assert!(estimate);
4547+
assert!(!query_plan);
4548+
assert!(!analyze);
4549+
assert!(!verbose);
4550+
assert_eq!("SELECT sqrt(id) FROM foo", statement.to_string());
4551+
}
4552+
_ => unreachable!(),
4553+
}
4554+
4555+
assert_eq!(
4556+
"EXPLAIN ESTIMATE SELECT sqrt(id) FROM foo",
4557+
statement.to_string()
4558+
);
4559+
}
4560+
45314561
#[test]
45324562
fn parse_named_argument_function() {
45334563
let dialects = all_dialects_where(|d| {

0 commit comments

Comments
 (0)