@@ -79,9 +79,19 @@ fn query_statement(i: Input) -> IResult<Statement> {
7979}
8080
8181pub fn statement_body ( i : Input ) -> IResult < Statement > {
82+ let explain_options = map (
83+ rule ! {
84+ "(" ~ #comma_separated_list1( explain_option) ~ ")"
85+ } ,
86+ |( a, opts, b) | ( merge_span ( Some ( a. span ) , Some ( b. span ) ) , opts) ,
87+ ) ;
88+ let explain_verbose_alias = map ( rule ! { VERBOSE } , |verbose| {
89+ ( Some ( verbose. span ) , vec ! [ ExplainOption :: Verbose ] )
90+ } ) ;
91+
8292 let explain = map_res (
8393 rule ! {
84- EXPLAIN ~ ( "(" ~ #comma_separated_list1 ( explain_option ) ~ ")" ) ? ~ ( AST | SYNTAX | PIPELINE | JOIN | GRAPH | FRAGMENTS | RAW | OPTIMIZED | MEMO | DECORRELATED | PERF ) ? ~ #statement
94+ EXPLAIN ~ ( #explain_options | #explain_verbose_alias ) ? ~ ( AST | SYNTAX | PIPELINE | JOIN | GRAPH | FRAGMENTS | RAW | OPTIMIZED | MEMO | DECORRELATED | PERF ) ? ~ #statement
8595 } ,
8696 |( _, options, opt_kind, statement) | {
8797 Ok ( Statement :: Explain {
@@ -105,9 +115,7 @@ pub fn statement_body(i: Input) -> IResult<Statement> {
105115 None => ExplainKind :: Plan ,
106116 _ => unreachable ! ( ) ,
107117 } ,
108- options : options
109- . map ( |( a, opts, b) | ( merge_span ( Some ( a. span ) , Some ( b. span ) ) , opts) )
110- . unwrap_or_default ( ) ,
118+ options : options. unwrap_or_default ( ) ,
111119 query : Box :: new ( statement. stmt ) ,
112120 } )
113121 } ,
@@ -2783,7 +2791,7 @@ pub fn statement_body(i: Input) -> IResult<Statement> {
27832791 HintPrefix | LParen | FROM => query_statement( i) ,
27842792 EXPLAIN => rule!(
27852793 #explain_perf : "`EXPLAIN PERF [(events='<event>,...')] <statement>`"
2786- | #explain : "`EXPLAIN [PIPELINE | GRAPH] <statement>`"
2794+ | #explain : "`EXPLAIN [VERBOSE | (<option>, ...)] [ PIPELINE | GRAPH] <statement>`"
27872795 | #explain_analyze : "`EXPLAIN ANALYZE <statement>`"
27882796 ) . parse( i) ,
27892797 REPORT => rule!( #report: "`REPORT ISSUE <statement>`" ) . parse( i) ,
0 commit comments