reifydb_evaluate/expression/
call.rs1use std::sync::Arc;
5
6use arrow_array::ArrayRef;
7use arrow_schema::FieldRef;
8use reifydb_core::{expression::CallExpression, value::column::factory::rename};
9use reifydb_routine_abi::{Function, context::FunctionContext};
10use reifydb_value::error::Error;
11
12use crate::{Result, error::EvaluateError, expression::context::EvalContext};
13
14pub(crate) fn call_builtin(
15 ctx: &EvalContext,
16 call: &CallExpression,
17 routine: Option<&Arc<dyn Function>>,
18 result_label: &str,
19 arguments: &[(FieldRef, ArrayRef)],
20) -> Result<(FieldRef, ArrayRef)> {
21 let function_name = call.func.0.text();
22 let fn_fragment = call.func.0.clone();
23
24 assert!(
25 ctx.symbols.get_function(function_name).is_none(),
26 "UDF '{}' should have been hoisted to UdfEvalNode",
27 function_name
28 );
29
30 let routine = routine.ok_or_else(|| -> Error {
31 EvaluateError::UnknownFunction {
32 name: function_name.to_string(),
33 fragment: fn_fragment.clone(),
34 }
35 .into()
36 })?;
37
38 let mut fn_ctx = FunctionContext {
39 fragment: fn_fragment.clone(),
40 identity: ctx.identity,
41 row_count: ctx.row_count,
42 runtime_context: ctx.runtime_context,
43 };
44
45 let result = routine.call(&mut fn_ctx, arguments).map_err(|e| e.with_context(fn_fragment, false))?;
46 Ok(rename(result, result_label))
47}