use super::super::super::builder::SelectExecutor;
use crate::{errors::ExecutorError, evaluator::CombinedExpressionEvaluator};
pub(super) fn evaluate_binary(
executor: &SelectExecutor,
left: &vibesql_ast::Expression,
op: &vibesql_ast::BinaryOperator,
right: &vibesql_ast::Expression,
group_rows: &[vibesql_storage::Row],
group_key: &[vibesql_types::SqlValue],
evaluator: &CombinedExpressionEvaluator,
) -> Result<vibesql_types::SqlValue, ExecutorError> {
let left_val = executor.evaluate_with_aggregates(left, group_rows, group_key, evaluator)?;
let right_val = executor.evaluate_with_aggregates(right, group_rows, group_key, evaluator)?;
let (left_val, right_val) =
evaluator.apply_affinity_for_comparison(left, left_val, right, right_val);
let sql_mode = executor.database.sql_mode();
crate::evaluator::ExpressionEvaluator::eval_binary_op_static(
&left_val, op, &right_val, sql_mode,
)
}
pub(super) fn evaluate_unary(
executor: &SelectExecutor,
op: &vibesql_ast::UnaryOperator,
inner_expr: &vibesql_ast::Expression,
group_rows: &[vibesql_storage::Row],
group_key: &[vibesql_types::SqlValue],
evaluator: &CombinedExpressionEvaluator,
) -> Result<vibesql_types::SqlValue, ExecutorError> {
let val = executor.evaluate_with_aggregates(inner_expr, group_rows, group_key, evaluator)?;
crate::evaluator::eval_unary_op(op, &val)
}