From 8476565f9f8592556c0360e94762cd7efc1b1784 Mon Sep 17 00:00:00 2001 From: Michael Ionov Date: Tue, 30 Jan 2024 18:53:54 +0200 Subject: [PATCH] chore: add mysql show status statement --- src/ast/mod.rs | 28 ++++++++++++++++++++++++++++ src/parser/mod.rs | 8 ++++++++ tests/sqlparser_mysql.rs | 30 ++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index a2c28c810..60f2d508e 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1955,6 +1955,16 @@ pub enum Statement { /// Note: this is a PostgreSQL-specific statement. ShowVariable { variable: Vec }, /// ```sql + /// SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern' | WHERE expr] + /// ``` + /// + /// Note: this is a MySQL-specific statement. + ShowStatus { + filter: Option, + global: bool, + session: bool, + }, + /// ```sql /// SHOW VARIABLES /// ``` /// @@ -3387,6 +3397,24 @@ impl fmt::Display for Statement { } Ok(()) } + Statement::ShowStatus { + filter, + global, + session, + } => { + write!(f, "SHOW")?; + if *global { + write!(f, " GLOBAL")?; + } + if *session { + write!(f, " SESSION")?; + } + write!(f, " STATUS")?; + if filter.is_some() { + write!(f, " {}", filter.as_ref().unwrap())?; + } + Ok(()) + } Statement::ShowVariables { filter, global, diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 36ac2fd28..ffe191ee4 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -7097,6 +7097,14 @@ impl<'a> Parser<'a> { session, global, }) + } else if self.parse_keyword(Keyword::STATUS) + && dialect_of!(self is MySqlDialect | GenericDialect) + { + Ok(Statement::ShowStatus { + filter: self.parse_show_statement_filter()?, + session, + global, + }) } else { Ok(Statement::ShowVariable { variable: self.parse_identifiers()?, diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index ff4dd4bbf..256fbe17e 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -288,6 +288,36 @@ fn parse_show_columns() { ); } +#[test] +fn parse_show_status() { + assert_eq!( + mysql_and_generic().verified_stmt("SHOW SESSION STATUS LIKE 'ssl_cipher'"), + Statement::ShowStatus { + filter: Some(ShowStatementFilter::Like("ssl_cipher".into())), + session: true, + global: false + } + ); + assert_eq!( + mysql_and_generic().verified_stmt("SHOW GLOBAL STATUS LIKE 'ssl_cipher'"), + Statement::ShowStatus { + filter: Some(ShowStatementFilter::Like("ssl_cipher".into())), + session: false, + global: true + } + ); + assert_eq!( + mysql_and_generic().verified_stmt("SHOW STATUS WHERE value = 2"), + Statement::ShowStatus { + filter: Some(ShowStatementFilter::Where( + mysql_and_generic().verified_expr("value = 2") + )), + session: false, + global: false + } + ); +} + #[test] fn parse_show_tables() { assert_eq!(