Skip to main content

reifydb_engine/bulk_insert/
coerce.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use reifydb_core::{
5	interface::catalog::column::Column,
6	value::column::{buffer::ColumnBuffer, cast::cast_column_data, columns::Columns},
7};
8use reifydb_evaluate::{expression::context::EvalContext, stack::SymbolTable};
9use reifydb_routine_abi::registry::Routines;
10use reifydb_runtime::context::{RuntimeContext, clock::Clock};
11use reifydb_value::{fragment::Fragment, params::Params, value::identity::IdentityId};
12
13use crate::Result;
14
15pub(super) fn coerce_columns(
16	column_data: &[ColumnBuffer],
17	columns: &[Column],
18	num_rows: usize,
19	identity: IdentityId,
20) -> Result<Vec<ColumnBuffer>> {
21	let runtime_ctx = RuntimeContext::with_clock(Clock::Real);
22	let routines = Routines::empty();
23	let ctx = EvalContext {
24		params: &Params::None,
25		symbols: &SymbolTable::new(),
26		routines: &routines,
27		runtime_context: &runtime_ctx,
28		identity,
29		is_aggregate_context: false,
30		columns: Columns::empty(),
31		row_count: num_rows,
32		target: None,
33		take: None,
34	};
35
36	let mut coerced_columns: Vec<ColumnBuffer> = Vec::with_capacity(columns.len());
37
38	for (col_idx, col) in columns.iter().enumerate() {
39		let target = col.constraint.get_type();
40
41		let cast_target = target.inner_type().clone();
42		let source_data = &column_data[col_idx];
43
44		let coerced = cast_column_data(&ctx, source_data, cast_target, || Fragment::internal(&col.name))?;
45		coerced_columns.push(coerced);
46	}
47
48	Ok(coerced_columns)
49}