diff --git a/core/vector/vector_types.rs b/core/vector/vector_types.rs index c7cf13d4f..bee61fdda 100644 --- a/core/vector/vector_types.rs +++ b/core/vector/vector_types.rs @@ -335,16 +335,42 @@ pub fn vector_concat(v1: &Vector, v2: &Vector) -> Result { } pub fn subvector(vector: &Vector, start_idx: usize, length: usize) -> Result { - if start_idx + length > vector.data.len() { - return Err(LimboError::ConversionError( - "Subvector range out of bounds".into(), - )); + fn extract_bytes( + slice: &[T], + start: usize, + len: usize, + to_bytes: impl Fn(&T) -> [u8; N], + ) -> Result> { + if start + len > slice.len() { + return Err(LimboError::ConversionError( + "Subvector range out of bounds".into(), + )); + } + + let mut buf = Vec::with_capacity(len * N); + for item in &slice[start..start + len] { + buf.extend_from_slice(&to_bytes(item)); + } + Ok(buf) } - let data = vector.data[start_idx..start_idx + length].to_vec(); + let (vector_type, data) = match vector.vector_type { + VectorType::Float32 => ( + VectorType::Float32, + extract_bytes::(vector.as_f32_slice(), start_idx, length, |v| { + v.to_le_bytes() + })?, + ), + VectorType::Float64 => ( + VectorType::Float64, + extract_bytes::(vector.as_f64_slice(), start_idx, length, |v| { + v.to_le_bytes() + })?, + ), + }; Ok(Vector { - vector_type: vector.vector_type.clone(), + vector_type, dims: length, data, })