MCPcopy Create free account
hub / github.com/MaterializeInc/materialize / array_create_multidim

Function array_create_multidim

src/expr/src/scalar/func/variadic.rs:176–225  ·  view source on GitHub ↗
(
    datums: &[Datum<'a>],
    temp_storage: &'a RowArena,
)

Source from the content-addressed store, hash-verified

174 }
175}
176fn array_create_multidim<'a>(
177 datums: &[Datum<'a>],
178 temp_storage: &'a RowArena,
179) -> Result<Datum<'a>, EvalError> {
180 let mut dim: Option<ArrayDimensions> = None;
181 for datum in datums {
182 let actual_dims = match datum {
183 Datum::Null => ArrayDimensions::default(),
184 Datum::Array(arr) => arr.dims(),
185 d => panic!("unexpected datum {d}"),
186 };
187 if let Some(expected) = &dim {
188 if actual_dims.ndims() != expected.ndims() {
189 let actual = actual_dims.ndims().into();
190 let expected = expected.ndims().into();
191 // All input arrays must have the same dimensionality.
192 return Err(InvalidArrayError::WrongCardinality { actual, expected }.into());
193 }
194 if let Some((e, a)) = expected
195 .into_iter()
196 .zip_eq(actual_dims)
197 .find(|(e, a)| e != a)
198 {
199 let actual = a.length;
200 let expected = e.length;
201 // All input arrays must have the same dimensionality.
202 return Err(InvalidArrayError::WrongCardinality { actual, expected }.into());
203 }
204 }
205 dim = Some(actual_dims);
206 }
207 // Per PostgreSQL, if all input arrays are zero dimensional, so is the output.
208 if dim.as_ref().map_or(true, ArrayDimensions::is_empty) {
209 return Ok(temp_storage.try_make_datum(|packer| packer.try_push_array(&[], &[]))?);
210 }
211
212 let mut dims = vec![ArrayDimension {
213 lower_bound: 1,
214 length: datums.len(),
215 }];
216 if let Some(d) = datums.first() {
217 dims.extend(d.unwrap_array().dims());
218 };
219 let elements = datums
220 .iter()
221 .flat_map(|d| d.unwrap_array().elements().iter());
222 let datum =
223 temp_storage.try_make_datum(move |packer| packer.try_push_array(&dims, elements))?;
224 Ok(datum)
225}
226
227#[derive(
228 Ord,

Callers 1

array_createFunction · 0.85

Calls 13

dimsMethod · 0.80
ndimsMethod · 0.80
try_make_datumMethod · 0.80
try_push_arrayMethod · 0.80
unwrap_arrayMethod · 0.80
elementsMethod · 0.80
findMethod · 0.45
into_iterMethod · 0.45
as_refMethod · 0.45
firstMethod · 0.45
extendMethod · 0.45
flat_mapMethod · 0.45

Tested by

no test coverage detected