(
string_view_array: &StringViewArray,
args: &[ArrayRef],
)
| 269 | } |
| 270 | |
| 271 | fn string_view_substr( |
| 272 | string_view_array: &StringViewArray, |
| 273 | args: &[ArrayRef], |
| 274 | ) -> Result<ArrayRef> { |
| 275 | let start_array = as_int64_array(&args[0])?; |
| 276 | let count_array_opt = args.get(1).map(|a| as_int64_array(a)).transpose()?; |
| 277 | |
| 278 | let is_ascii = |
| 279 | enable_ascii_fast_path(&string_view_array, start_array, count_array_opt); |
| 280 | |
| 281 | // Combine null bitmaps from all inputs in bulk. |
| 282 | let nulls = NullBuffer::union_many([ |
| 283 | string_view_array.nulls(), |
| 284 | start_array.nulls(), |
| 285 | count_array_opt.and_then(|a| a.nulls()), |
| 286 | ]); |
| 287 | |
| 288 | let mut views_buf = Vec::with_capacity(string_view_array.len()); |
| 289 | |
| 290 | for (i, raw_view) in string_view_array.views().iter().enumerate() { |
| 291 | if nulls.as_ref().is_some_and(|n| n.is_null(i)) { |
| 292 | views_buf.push(0); |
| 293 | continue; |
| 294 | } |
| 295 | |
| 296 | let string = string_view_array.value(i); |
| 297 | let start = start_array.value(i); |
| 298 | let count = count_array_opt.map(|a| a.value(i)); |
| 299 | |
| 300 | let (byte_start, byte_end) = get_true_start_end(string, start, count, is_ascii)?; |
| 301 | let substr = &string[byte_start..byte_end]; |
| 302 | |
| 303 | append_view(&mut views_buf, raw_view, substr, byte_start as u32); |
| 304 | } |
| 305 | |
| 306 | let views_buf = ScalarBuffer::from(views_buf); |
| 307 | |
| 308 | // Safety: |
| 309 | // (1) The blocks of the given views are all provided |
| 310 | // (2) Each of the range `view.offset+start..end` of view in views_buf is within |
| 311 | // the bounds of each of the blocks |
| 312 | unsafe { |
| 313 | let array = StringViewArray::new_unchecked( |
| 314 | views_buf, |
| 315 | string_view_array.data_buffers().to_vec(), |
| 316 | nulls, |
| 317 | ); |
| 318 | Ok(Arc::new(array) as ArrayRef) |
| 319 | } |
| 320 | } |
| 321 | |
| 322 | fn values_fit_in_i32<T: OffsetSizeTrait>(string_array: &GenericStringArray<T>) -> bool { |
| 323 | // The Arrow spec defines StringView offset fields as signed 32-bit |
no test coverage detected
searching dependent graphs…