use crate::planner::{ContextProvider, PlannerContext, SqlToRel};
use datafusion_common::{DFSchema, DataFusionError, Result};
use datafusion_expr::{lit, Expr};
use sqlparser::ast::{Expr as SQLExpr, UnaryOperator, Value};
impl<'a, S: ContextProvider> SqlToRel<'a, S> {
pub(crate) fn parse_sql_unary_op(
&self,
op: UnaryOperator,
expr: SQLExpr,
schema: &DFSchema,
planner_context: &mut PlannerContext,
) -> Result<Expr> {
match op {
UnaryOperator::Not => Ok(Expr::Not(Box::new(
self.sql_expr_to_logical_expr(expr, schema, planner_context)?,
))),
UnaryOperator::Plus => {
Ok(self.sql_expr_to_logical_expr(expr, schema, planner_context)?)
}
UnaryOperator::Minus => {
match expr {
SQLExpr::Value(Value::Number(n, _)) => match n.parse::<i64>() {
Ok(n) => Ok(lit(-n)),
Err(_) => Ok(lit(-n
.parse::<f64>()
.map_err(|_e| {
DataFusionError::Plan(format!(
"negative operator can be only applied to integer and float operands, got: {n}"))
})?)),
},
SQLExpr::Interval(interval) => self.sql_interval_to_expr(
true,
interval,
schema,
planner_context,
),
_ => Ok(Expr::Negative(Box::new(self.sql_expr_to_logical_expr(expr, schema, planner_context)?))),
}
}
_ => Err(DataFusionError::NotImplemented(format!(
"Unsupported SQL unary operator {op:?}"
))),
}
}
}