Skip to content

SGA-11783 Added support for SHOW CHARSET #1974

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions src/ast/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3704,6 +3704,20 @@ pub enum Statement {
history: bool,
show_options: ShowStatementOptions,
},
// ```sql
// SHOW {CHARACTER SET | CHARSET} [like_or_where]
// ```
// where:
// like_or_where: {
// LIKE 'pattern'
// | WHERE expr
// }
Comment on lines +3708 to +3714
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// SHOW {CHARACTER SET | CHARSET} [like_or_where]
// ```
// where:
// like_or_where: {
// LIKE 'pattern'
// | WHERE expr
// }
// SHOW {CHARACTER SET | CHARSET}
// ```

Thinking a brief example would be enough. For detailed syntax readers can follow the documentation

// MySQL specific statement
// <https://dev.mysql.com/doc/refman/8.4/en/show.html#:~:text=SHOW%20%7BCHARACTER%20SET%20%7C%20CHARSET%7D%20%5Blike_or_where%5D>
Comment on lines +3715 to +3716
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// MySQL specific statement
// <https://dev.mysql.com/doc/refman/8.4/en/show.html#:~:text=SHOW%20%7BCHARACTER%20SET%20%7C%20CHARSET%7D%20%5Blike_or_where%5D>
//
[MySQL]: https://dev.mysql.com/doc/refman/8.4/en/show.html#:~:text=SHOW%20%7BCHARACTER%20SET%20%7C%20CHARSET%7D%20%5Blike_or_where%5D

Or something similar, essentially dropping the mention of it being mysql specific, since that can change in the future or other existing dialects might also support it in some form

ShowCharset {
is_shorthand: bool,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we add a description what this flag does?

filter: Option<ShowStatementFilter>,
},
Comment on lines +3717 to +3720
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we switch to using a named struct syntax for this statement? See ref we're trying to move away from the anonymous struct syntax ideally.

We could have something like?

struct ShowCharSet { ... }
Statement::ShowCharSet(ShowCharSet{...})

/// ```sql
/// SHOW OBJECTS LIKE 'line%' IN mydb.public
/// ```
Expand Down Expand Up @@ -5674,6 +5688,21 @@ impl fmt::Display for Statement {
}
Ok(())
}
Statement::ShowCharset {
is_shorthand,
filter,
} => {
write!(f, "SHOW")?;
if *is_shorthand {
write!(f, " CHARSET")?;
} else {
write!(f, " CHARACTER SET")?;
}
if filter.is_some() {
write!(f, " {}", filter.as_ref().unwrap())?;
}
Ok(())
}
Statement::StartTransaction {
modes,
begin: syntax_begin,
Expand Down
1 change: 1 addition & 0 deletions src/ast/spans.rs
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,7 @@ impl Spanned for Statement {
Statement::ShowColumns { .. } => Span::empty(),
Statement::ShowTables { .. } => Span::empty(),
Statement::ShowCollation { .. } => Span::empty(),
Statement::ShowCharset { .. } => Span::empty(),
Statement::Use(u) => u.span(),
Statement::StartTransaction { .. } => Span::empty(),
Statement::Comment { .. } => Span::empty(),
Expand Down
12 changes: 12 additions & 0 deletions src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12505,13 +12505,25 @@ impl<'a> Parser<'a> {
self.parse_show_databases(terse)
} else if self.parse_keyword(Keyword::SCHEMAS) {
self.parse_show_schemas(terse)
} else if self.parse_keywords(&[Keyword::CHARACTER, Keyword::SET]) {
self.parse_show_charset(false)
} else if self.parse_keyword(Keyword::CHARSET) {
self.parse_show_charset(true)
} else {
Ok(Statement::ShowVariable {
variable: self.parse_identifiers()?,
})
}
}

fn parse_show_charset(&mut self, is_shorthand: bool) -> Result<Statement, ParserError> {
// parse one of keywords
Ok(Statement::ShowCharset {
is_shorthand,
filter: self.parse_show_statement_filter()?,
})
}

fn parse_show_databases(&mut self, terse: bool) -> Result<Statement, ParserError> {
let history = self.parse_keyword(Keyword::HISTORY);
let show_options = self.parse_show_stmt_options()?;
Expand Down
8 changes: 8 additions & 0 deletions tests/sqlparser_mysql.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4143,3 +4143,11 @@ fn parse_json_member_of() {
_ => panic!("Unexpected statement {stmt}"),
}
}

#[test]
fn parse_show_charset() {
let _ = mysql().verified_stmt("SHOW CHARACTER SET");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this adds a new node to the AST, can we assert one of the scenarios that the AST looks as expected? For example

let _ = mysql().verified_stmt("SHOW CHARACTER SET LIKE 'utf8mb4%'");
let _ = mysql().verified_stmt("SHOW CHARSET WHERE charset = 'utf8mb4%'");
let _ = mysql().verified_stmt("SHOW CHARSET LIKE 'utf8mb4%'");
}
Loading