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