Skip to content

Commit 18881f8

Browse files
authored
Support SHOW COLLATION (#564)
1 parent 54a29e8 commit 18881f8

File tree

4 files changed

+47
-0
lines changed

4 files changed

+47
-0
lines changed

src/ast/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,10 @@ pub enum Statement {
10361036
db_name: Option<Ident>,
10371037
filter: Option<ShowStatementFilter>,
10381038
},
1039+
/// SHOW COLLATION
1040+
///
1041+
/// Note: this is a MySQL-specific statement.
1042+
ShowCollation { filter: Option<ShowStatementFilter> },
10391043
/// USE
10401044
///
10411045
/// Note: This is a MySQL-specific statement.
@@ -1892,6 +1896,13 @@ impl fmt::Display for Statement {
18921896
write!(f, "USE {}", db_name)?;
18931897
Ok(())
18941898
}
1899+
Statement::ShowCollation { filter } => {
1900+
write!(f, "SHOW COLLATION")?;
1901+
if let Some(filter) = filter {
1902+
write!(f, " {}", filter)?;
1903+
}
1904+
Ok(())
1905+
}
18951906
Statement::StartTransaction { modes } => {
18961907
write!(f, "START TRANSACTION")?;
18971908
if !modes.is_empty() {

src/keywords.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ define_keywords!(
131131
CLUSTER,
132132
COALESCE,
133133
COLLATE,
134+
COLLATION,
134135
COLLECT,
135136
COLUMN,
136137
COLUMNS,

src/parser.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3758,6 +3758,8 @@ impl<'a> Parser<'a> {
37583758
))
37593759
} else if self.parse_one_of_keywords(&[Keyword::CREATE]).is_some() {
37603760
Ok(self.parse_show_create()?)
3761+
} else if self.parse_keyword(Keyword::COLLATION) {
3762+
Ok(self.parse_show_collation()?)
37613763
} else if self.parse_keyword(Keyword::VARIABLES)
37623764
&& dialect_of!(self is MySqlDialect | GenericDialect)
37633765
{
@@ -3841,6 +3843,11 @@ impl<'a> Parser<'a> {
38413843
})
38423844
}
38433845

3846+
pub fn parse_show_collation(&mut self) -> Result<Statement, ParserError> {
3847+
let filter = self.parse_show_statement_filter()?;
3848+
Ok(Statement::ShowCollation { filter })
3849+
}
3850+
38443851
pub fn parse_show_statement_filter(
38453852
&mut self,
38463853
) -> Result<Option<ShowStatementFilter>, ParserError> {

tests/sqlparser_mysql.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,12 @@ fn parse_show_extended_full() {
189189
assert!(mysql_and_generic()
190190
.parse_sql_statements("SHOW EXTENDED FULL CREATE TABLE mytable")
191191
.is_err());
192+
assert!(mysql_and_generic()
193+
.parse_sql_statements("SHOW EXTENDED FULL COLLATION")
194+
.is_err());
195+
assert!(mysql_and_generic()
196+
.parse_sql_statements("SHOW EXTENDED FULL VARIABLES")
197+
.is_err());
192198
}
193199

194200
#[test]
@@ -213,6 +219,28 @@ fn parse_show_create() {
213219
}
214220
}
215221

222+
#[test]
223+
fn parse_show_collation() {
224+
assert_eq!(
225+
mysql_and_generic().verified_stmt("SHOW COLLATION"),
226+
Statement::ShowCollation { filter: None }
227+
);
228+
assert_eq!(
229+
mysql_and_generic().verified_stmt("SHOW COLLATION LIKE 'pattern'"),
230+
Statement::ShowCollation {
231+
filter: Some(ShowStatementFilter::Like("pattern".into())),
232+
}
233+
);
234+
assert_eq!(
235+
mysql_and_generic().verified_stmt("SHOW COLLATION WHERE 1 = 2"),
236+
Statement::ShowCollation {
237+
filter: Some(ShowStatementFilter::Where(
238+
mysql_and_generic().verified_expr("1 = 2")
239+
)),
240+
}
241+
);
242+
}
243+
216244
#[test]
217245
fn parse_use() {
218246
assert_eq!(

0 commit comments

Comments
 (0)