fix: handle DuckDB boolean types in ColumnDef deserializers (#8610)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Diego Imbert
2026-03-30 12:27:46 +02:00
committed by GitHub
parent f3012ee7cc
commit 22da5bd9ea
+18 -5
View File
@@ -39,7 +39,14 @@ fn deserialize_string_from_null<'de, D>(deserializer: D) -> Result<String, D::Er
where
D: Deserializer<'de>,
{
Option::<String>::deserialize(deserializer).map(|v| v.unwrap_or_default())
// DuckDB may return booleans for fields that other databases return as strings
let v = serde_json::Value::deserialize(deserializer)?;
match v {
serde_json::Value::Null => Ok(String::new()),
serde_json::Value::String(s) => Ok(s),
serde_json::Value::Bool(b) => Ok(b.to_string()),
other => Ok(other.to_string()),
}
}
fn deserialize_column_identity_from_null<'de, D>(
@@ -49,15 +56,21 @@ where
D: Deserializer<'de>,
{
// MySQL returns uppercase "YES"/"NO" while the enum expects title case.
let v = Option::<String>::deserialize(deserializer)?;
match v.as_deref() {
None => Ok(ColumnIdentity::default()),
Some(s) => match s.to_lowercase().as_str() {
// DuckDB returns a boolean false instead of a string.
let v = serde_json::Value::deserialize(deserializer)?;
match v {
serde_json::Value::Null => Ok(ColumnIdentity::default()),
serde_json::Value::Bool(_) => Ok(ColumnIdentity::No),
serde_json::Value::String(s) => match s.to_lowercase().as_str() {
"no" => Ok(ColumnIdentity::No),
"yes" | "always" => Ok(ColumnIdentity::Always),
"by default" => Ok(ColumnIdentity::ByDefault),
_ => Ok(ColumnIdentity::No),
},
_ => Err(serde::de::Error::custom(format!(
"expected string, bool, or null for isidentity, got {}",
v
))),
}
}