Skip to content

Commit cf3fe64

Browse files
authored
ParserError if nested explain (#781)
1 parent b93d82d commit cf3fe64

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

src/parser.rs

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4686,21 +4686,24 @@ impl<'a> Parser<'a> {
46864686
format = Some(self.parse_analyze_format()?);
46874687
}
46884688

4689-
if let Some(statement) = self.maybe_parse(|parser| parser.parse_statement()) {
4690-
Ok(Statement::Explain {
4689+
match self.maybe_parse(|parser| parser.parse_statement()) {
4690+
Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err(
4691+
ParserError::ParserError("Explain must be root of the plan".to_string()),
4692+
),
4693+
Some(statement) => Ok(Statement::Explain {
46914694
describe_alias,
46924695
analyze,
46934696
verbose,
46944697
statement: Box::new(statement),
46954698
format,
4696-
})
4697-
} else {
4698-
let table_name = self.parse_object_name()?;
4699-
4700-
Ok(Statement::ExplainTable {
4701-
describe_alias,
4702-
table_name,
4703-
})
4699+
}),
4700+
_ => {
4701+
let table_name = self.parse_object_name()?;
4702+
Ok(Statement::ExplainTable {
4703+
describe_alias,
4704+
table_name,
4705+
})
4706+
}
47044707
}
47054708
}
47064709

@@ -7134,4 +7137,16 @@ mod tests {
71347137
))
71357138
);
71367139
}
7140+
7141+
#[test]
7142+
fn test_nested_explain_error() {
7143+
let sql = "EXPLAIN EXPLAIN SELECT 1";
7144+
let ast = Parser::parse_sql(&GenericDialect, sql);
7145+
assert_eq!(
7146+
ast,
7147+
Err(ParserError::ParserError(
7148+
"Explain must be root of the plan".to_string()
7149+
))
7150+
);
7151+
}
71377152
}

0 commit comments

Comments
 (0)