use crate::SQLError;
use uqa_core::DatumValue;
pub(super) fn external(datum: &DatumValue) -> SQLError {
let offset = datum.offset() as usize;
let before = offset
.checked_sub(11)
.and_then(|start| datum.bytes().get(start..offset));
let (header, length) = before.map_or((0, 0), |before| {
let header = u64::from_le_bytes(before[..8].try_into().expect("eight header bytes"));
let length = u32::from_le_bytes([before[8], before[9], before[10], 0]);
(header, length)
});
if length == 0 {
return internal(format!(
"invalid memory alloc request size {}",
u64::MAX - 2
));
}
let address = datum.bytes().as_ptr().wrapping_add(offset);
internal(format!(
"pfree called with invalid pointer {address:p} (header 0x{header:016x})"
))
}
fn internal(message: String) -> SQLError {
SQLError::Routine {
sqlstate: "XX000".into(),
message,
}
}