From bb342682da7d863c21e735e77517fd371ebb8fd4 Mon Sep 17 00:00:00 2001 From: Alex Qyoun-ae <4062971+MazterQyou@users.noreply.github.com> Date: Wed, 10 Aug 2022 03:30:42 +0400 Subject: [PATCH] Support `SHOW COLLATION` --- src/ast/mod.rs | 11 +++++++++++ src/keywords.rs | 1 + src/parser.rs | 7 +++++++ tests/sqlparser_mysql.rs | 28 ++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 5e8296f88..99b93b25c 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1036,6 +1036,10 @@ pub enum Statement { db_name: Option, filter: Option, }, + /// SHOW COLLATION + /// + /// Note: this is a MySQL-specific statement. + ShowCollation { filter: Option }, /// USE /// /// Note: This is a MySQL-specific statement. @@ -1892,6 +1896,13 @@ impl fmt::Display for Statement { write!(f, "USE {}", db_name)?; Ok(()) } + Statement::ShowCollation { filter } => { + write!(f, "SHOW COLLATION")?; + if let Some(filter) = filter { + write!(f, " {}", filter)?; + } + Ok(()) + } Statement::StartTransaction { modes } => { write!(f, "START TRANSACTION")?; if !modes.is_empty() { diff --git a/src/keywords.rs b/src/keywords.rs index 7eb6b420c..a06ddc48d 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -131,6 +131,7 @@ define_keywords!( CLUSTER, COALESCE, COLLATE, + COLLATION, COLLECT, COLUMN, COLUMNS, diff --git a/src/parser.rs b/src/parser.rs index 11f14ecf4..784010efb 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -3758,6 +3758,8 @@ impl<'a> Parser<'a> { )) } else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() { Ok(self.parse_show_create()?) + } else if self.parse_keyword(Keyword::COLLATION) { + Ok(self.parse_show_collation()?) } else if self.parse_keyword(Keyword::VARIABLES) && dialect_of!(self is MySqlDialect | GenericDialect) { @@ -3841,6 +3843,11 @@ impl<'a> Parser<'a> { }) } + pub fn parse_show_collation(&mut self) -> Result { + let filter = self.parse_show_statement_filter()?; + Ok(Statement::ShowCollation { filter }) + } + pub fn parse_show_statement_filter( &mut self, ) -> Result, ParserError> { diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index 16d0daf8d..c1cfa2876 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -189,6 +189,12 @@ fn parse_show_extended_full() { assert!(mysql_and_generic() .parse_sql_statements("SHOW EXTENDED FULL CREATE TABLE mytable") .is_err()); + assert!(mysql_and_generic() + .parse_sql_statements("SHOW EXTENDED FULL COLLATION") + .is_err()); + assert!(mysql_and_generic() + .parse_sql_statements("SHOW EXTENDED FULL VARIABLES") + .is_err()); } #[test] @@ -213,6 +219,28 @@ fn parse_show_create() { } } +#[test] +fn parse_show_collation() { + assert_eq!( + mysql_and_generic().verified_stmt("SHOW COLLATION"), + Statement::ShowCollation { filter: None } + ); + assert_eq!( + mysql_and_generic().verified_stmt("SHOW COLLATION LIKE 'pattern'"), + Statement::ShowCollation { + filter: Some(ShowStatementFilter::Like("pattern".into())), + } + ); + assert_eq!( + mysql_and_generic().verified_stmt("SHOW COLLATION WHERE 1 = 2"), + Statement::ShowCollation { + filter: Some(ShowStatementFilter::Where( + mysql_and_generic().verified_expr("1 = 2") + )), + } + ); +} + #[test] fn parse_use() { assert_eq!(