Skip to main content

reifydb_evaluate/expression/
call.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}