(
datums: &[Datum<'a>],
temp_storage: &'a RowArena,
)
| 174 | } |
| 175 | } |
| 176 | fn 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, |
no test coverage detected