use super::*;
pub fn maybe_apply_affinity(col_type: Type, target_register: usize, program: &mut ProgramBuilder) {
if col_type == Type::Real {
program.emit_insn(Insn::RealAffinity {
register: target_register,
})
}
}
pub fn sanitize_string(input: &str) -> String {
let inner = &input[1..input.len() - 1];
if !inner.contains("''") {
return inner.to_string();
}
inner.replace("''", "'")
}
pub fn as_binary_components(
expr: &ast::Expr,
) -> Result<Option<(&ast::Expr, ConstraintOperator, &ast::Expr)>> {
match unwrap_parens(expr)? {
ast::Expr::Binary(lhs, operator, rhs)
if matches!(
operator,
ast::Operator::Equals
| ast::Operator::NotEquals
| ast::Operator::Greater
| ast::Operator::Less
| ast::Operator::GreaterEquals
| ast::Operator::LessEquals
| ast::Operator::Is
| ast::Operator::IsNot
) =>
{
if expr_vector_size(lhs)? > 1 || expr_vector_size(rhs)? > 1 {
return Ok(None);
}
Ok(Some((lhs.as_ref(), (*operator).into(), rhs.as_ref())))
}
ast::Expr::Like { lhs, not, rhs, .. } => Ok(Some((
lhs.as_ref(),
ConstraintOperator::Like { not: *not },
rhs.as_ref(),
))),
_ => Ok(None),
}
}
pub fn unwrap_parens(expr: &ast::Expr) -> Result<&ast::Expr> {
match expr {
ast::Expr::Column { .. } => Ok(expr),
ast::Expr::Parenthesized(exprs) => match exprs.len() {
1 => unwrap_parens(exprs.first().unwrap()),
_ => Ok(expr), },
_ => Ok(expr),
}
}
pub fn unwrap_parens_owned(expr: ast::Expr) -> Result<(ast::Expr, usize)> {
let mut paren_count = 0;
match expr {
ast::Expr::Parenthesized(mut exprs) => match exprs.len() {
1 => {
paren_count += 1;
let (expr, count) = unwrap_parens_owned(*exprs.pop().unwrap())?;
paren_count += count;
Ok((expr, paren_count))
}
_ => crate::bail_parse_error!("expected single expression in parentheses"),
},
_ => Ok((expr, paren_count)),
}
}