use crate::error::{DbxError, DbxResult};
use crate::sql::planner::types::*;
use sqlparser::ast::{BinaryOperator as SqlBinaryOp, Expr as SqlExpr};
pub fn convert_binary_op(op: &SqlBinaryOp) -> DbxResult<BinaryOperator> {
match op {
SqlBinaryOp::Plus => Ok(BinaryOperator::Plus),
SqlBinaryOp::Minus => Ok(BinaryOperator::Minus),
SqlBinaryOp::Multiply => Ok(BinaryOperator::Multiply),
SqlBinaryOp::Divide => Ok(BinaryOperator::Divide),
SqlBinaryOp::Modulo => Ok(BinaryOperator::Modulo),
SqlBinaryOp::Eq => Ok(BinaryOperator::Eq),
SqlBinaryOp::NotEq => Ok(BinaryOperator::NotEq),
SqlBinaryOp::Lt => Ok(BinaryOperator::Lt),
SqlBinaryOp::LtEq => Ok(BinaryOperator::LtEq),
SqlBinaryOp::Gt => Ok(BinaryOperator::Gt),
SqlBinaryOp::GtEq => Ok(BinaryOperator::GtEq),
SqlBinaryOp::And => Ok(BinaryOperator::And),
SqlBinaryOp::Or => Ok(BinaryOperator::Or),
_ => Err(DbxError::NotImplemented(format!(
"Unsupported binary operator: {:?}",
op
))),
}
}
pub fn match_scalar_function(name: &str) -> Option<ScalarFunction> {
match name {
"UPPER" => Some(ScalarFunction::Upper),
"LOWER" => Some(ScalarFunction::Lower),
"LENGTH" => Some(ScalarFunction::Length),
"SUBSTR" | "SUBSTRING" => Some(ScalarFunction::Substring),
"CONCAT" => Some(ScalarFunction::Concat),
"TRIM" => Some(ScalarFunction::Trim),
"ABS" => Some(ScalarFunction::Abs),
"ROUND" => Some(ScalarFunction::Round),
"CEIL" => Some(ScalarFunction::Ceil),
"FLOOR" => Some(ScalarFunction::Floor),
"SQRT" => Some(ScalarFunction::Sqrt),
"POWER" => Some(ScalarFunction::Power),
"NOW" => Some(ScalarFunction::Now),
"CURRENT_DATE" => Some(ScalarFunction::CurrentDate),
"CURRENT_TIME" => Some(ScalarFunction::CurrentTime),
"YEAR" => Some(ScalarFunction::Year),
"MONTH" => Some(ScalarFunction::Month),
"DAY" => Some(ScalarFunction::Day),
"HOUR" => Some(ScalarFunction::Hour),
"MINUTE" => Some(ScalarFunction::Minute),
"SECOND" => Some(ScalarFunction::Second),
_ => None,
}
}
pub fn extract_usize(expr: &SqlExpr) -> DbxResult<usize> {
match expr {
SqlExpr::Value(sqlparser::ast::Value::Number(n, _)) => n.parse::<usize>().map_err(|_| {
DbxError::Schema(format!(
"LIMIT/OFFSET value must be a positive integer, got: {}",
n
))
}),
_ => Err(DbxError::NotImplemented(format!(
"Non-literal LIMIT/OFFSET expression: {:?}",
expr
))),
}
}