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