Skip to main content

reifydb_engine/expression/
eval.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (c) 2025 ReifyDB
3
4use reifydb_core::value::column::Column;
5use reifydb_function::registry::Functions;
6use reifydb_rql::expression::Expression;
7use reifydb_runtime::clock::Clock;
8
9use crate::{
10	Result,
11	expression::{
12		cast::cast_column_data,
13		compile::compile_expression,
14		context::{CompileContext, EvalContext},
15	},
16};
17
18pub fn evaluate(ctx: &EvalContext, expr: &Expression, _functions: &Functions, _clock: &Clock) -> Result<Column> {
19	let compile_ctx = CompileContext {
20		functions: ctx.functions,
21		symbol_table: ctx.symbol_table,
22	};
23	let compiled = compile_expression(&compile_ctx, expr)?;
24	let column = compiled.execute(ctx)?;
25
26	// Ensures that result column data type matches the expected target column type
27	if let Some(ty) = ctx.target.as_ref().map(|c| c.column_type()) {
28		let data = cast_column_data(ctx, &column.data(), ty, &expr.lazy_fragment())?;
29		Ok(Column {
30			name: column.name,
31			data,
32		})
33	} else {
34		Ok(column)
35	}
36}