use reifydb_core::value::column::Column;
use reifydb_rql::expression::Expression;
use crate::{
Result,
expression::{
cast::cast_column_data,
compile::compile_expression,
context::{CompileContext, EvalContext},
},
};
pub fn evaluate(ctx: &EvalContext, expr: &Expression) -> Result<Column> {
let compile_ctx = CompileContext {
functions: ctx.functions,
symbols: ctx.symbols,
};
let compiled = compile_expression(&compile_ctx, expr)?;
let column = compiled.execute(ctx)?;
if let Some(ty) = ctx.target.as_ref().map(|c| c.column_type()) {
let data = cast_column_data(ctx, column.data(), ty, &expr.lazy_fragment())?;
Ok(Column {
name: column.name,
data,
})
} else {
Ok(column)
}
}