From cf3fe64af6edd0c55542237875548ae3a7385bce Mon Sep 17 00:00:00 2001 From: Jeffrey <22608443+Jefffrey@users.noreply.github.com> Date: Thu, 29 Dec 2022 23:55:10 +1100 Subject: [PATCH] ParserError if nested explain (#781) --- src/parser.rs | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 05e3f8008..19914253f 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -4686,21 +4686,24 @@ impl<'a> Parser<'a> { format = Some(self.parse_analyze_format()?); } - if let Some(statement) = self.maybe_parse(|parser| parser.parse_statement()) { - Ok(Statement::Explain { + match self.maybe_parse(|parser| parser.parse_statement()) { + Some(Statement::Explain { .. }) | Some(Statement::ExplainTable { .. }) => Err( + ParserError::ParserError("Explain must be root of the plan".to_string()), + ), + Some(statement) => Ok(Statement::Explain { describe_alias, analyze, verbose, statement: Box::new(statement), format, - }) - } else { - let table_name = self.parse_object_name()?; - - Ok(Statement::ExplainTable { - describe_alias, - table_name, - }) + }), + _ => { + let table_name = self.parse_object_name()?; + Ok(Statement::ExplainTable { + describe_alias, + table_name, + }) + } } } @@ -7134,4 +7137,16 @@ mod tests { )) ); } + + #[test] + fn test_nested_explain_error() { + let sql = "EXPLAIN EXPLAIN SELECT 1"; + let ast = Parser::parse_sql(&GenericDialect, sql); + assert_eq!( + ast, + Err(ParserError::ParserError( + "Explain must be root of the plan".to_string() + )) + ); + } }