in crates/iceberg/src/expr/visitors/manifest_evaluator.rs [244:285]
fn starts_with(
&mut self,
reference: &BoundReference,
datum: &Datum,
_predicate: &BoundPredicate,
) -> crate::Result<bool> {
let field = self.field_summary_for_reference(reference);
if field.lower_bound.is_none() || field.upper_bound.is_none() {
return ROWS_CANNOT_MATCH;
}
let prefix = ManifestFilterVisitor::datum_as_str(
datum,
"Cannot perform starts_with on non-string value",
)?;
let prefix_len = prefix.len();
if let Some(lower_bound) = &field.lower_bound {
let lower_bound_str = ManifestFilterVisitor::datum_as_str(
lower_bound,
"Cannot perform starts_with on non-string lower bound",
)?;
let min_len = lower_bound_str.len().min(prefix_len);
if prefix.as_bytes().lt(&lower_bound_str.as_bytes()[..min_len]) {
return ROWS_CANNOT_MATCH;
}
}
if let Some(upper_bound) = &field.upper_bound {
let upper_bound_str = ManifestFilterVisitor::datum_as_str(
upper_bound,
"Cannot perform starts_with on non-string upper bound",
)?;
let min_len = upper_bound_str.len().min(prefix_len);
if prefix.as_bytes().gt(&upper_bound_str.as_bytes()[..min_len]) {
return ROWS_CANNOT_MATCH;
}
}
ROWS_MIGHT_MATCH
}