MCPcopy Create free account
hub / github.com/apache/datafusion / string_view_substr

Function string_view_substr

datafusion/functions/src/unicode/substr.rs:271–320  ·  view source on GitHub ↗
(
    string_view_array: &StringViewArray,
    args: &[ArrayRef],
)

Source from the content-addressed store, hash-verified

269}
270
271fn 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
322fn values_fit_in_i32<T: OffsetSizeTrait>(string_array: &GenericStringArray<T>) -> bool {
323 // The Arrow spec defines StringView offset fields as signed 32-bit

Callers 1

substrFunction · 0.85

Calls 15

as_int64_arrayFunction · 0.85
enable_ascii_fast_pathFunction · 0.85
get_true_start_endFunction · 0.85
append_viewFunction · 0.85
newFunction · 0.85
to_vecMethod · 0.80
mapMethod · 0.45
getMethod · 0.45
nullsMethod · 0.45
lenMethod · 0.45
iterMethod · 0.45
as_refMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…