in crates/paimon/src/spec/types.rs [469:522]
fn from_str(s: &str) -> Result<Self, Self::Err> {
if !s.starts_with(serde_utils::DECIMAL::NAME) {
return DataTypeInvalidSnafu {
message: "Invalid DECIMAL type. Expected string to start with 'DECIMAL'.",
}
.fail();
}
let (open_bracket, close_bracket) = serde_utils::extract_brackets_pos(s, "DecimalType")?;
let precision_scale_str = &s[open_bracket + 1..close_bracket];
let (precision, scale) = match precision_scale_str
.split(',')
.collect::<Vec<&str>>()
.as_slice()
{
[precision_str, scale_str] => {
let precision =
precision_str
.trim()
.parse::<u32>()
.map_err(|_| Error::DataTypeInvalid {
message:
"Invalid DECIMAL precision. Unable to parse precision as a u32."
.to_string(),
})?;
let scale =
scale_str
.trim()
.parse::<u32>()
.map_err(|_| Error::DataTypeInvalid {
message: "Invalid DECIMAL scale. Unable to parse scale as a u32."
.to_string(),
})?;
(precision, scale)
}
_ => {
let precision = precision_scale_str.trim().parse::<u32>().map_err(|_| {
Error::DataTypeInvalid {
message: "Invalid DECIMAL precision. Unable to parse precision as a u32."
.to_string(),
}
})?;
(precision, DecimalType::DEFAULT_SCALE)
}
};
let nullable = !s[close_bracket..].contains("NOT NULL");
Ok(DecimalType {
nullable,
precision,
scale,
})
}