fix(mysql): handle nullable view collation

This commit is contained in:
onenewcode 2026-07-31 13:53:44 +08:00 committed by GitHub
parent 71a30e921e
commit 9e0ec7b7ef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 12 additions and 2 deletions

View File

@ -142,8 +142,10 @@ fn nonblank(value: String) -> Option<String> {
}
async fn query_first_nonblank_string(conn: &mut mysql_async::Conn, sql: &str) -> Option<String> {
match conn.query_first::<String, _>(sql).await {
Ok(Some(value)) => nonblank(value),
// MySQL reports nullable metadata such as TABLE_COLLATION as NULL for views.
// Reading it as String makes mysql_async panic during row conversion.
match conn.query_first::<Option<String>, _>(sql).await {
Ok(Some(value)) => value.and_then(nonblank),
Ok(None) => None,
Err(error) => {
log::debug!("Failed to read optional MySQL database information with `{sql}`: {error}");
@ -4951,6 +4953,14 @@ mod tests {
assert!(!sql.contains("AS ENUM_VALUES"));
}
#[test]
fn mysql_nullable_table_collation_uses_optional_string_conversion() {
let collation = mysql_async::from_value_opt::<Option<String>>(mysql_async::Value::NULL)
.expect("Option<String> must accept NULL MySQL metadata values");
assert_eq!(collation, None);
}
#[test]
fn mysql_column_charset_metadata_clears_values_matching_table_default() {
let mut columns = vec![