diff --git a/arrow/src/compute/kernels/comparison.rs b/arrow/src/compute/kernels/comparison.rs index 02e0b65a3e0..0e268491e33 100644 --- a/arrow/src/compute/kernels/comparison.rs +++ b/arrow/src/compute/kernels/comparison.rs @@ -263,11 +263,23 @@ pub fn like_utf8_scalar( } else if right.starts_with('%') && !right[1..].contains(is_like_pattern) { // fast path, can use ends_with let ends_with = &right[1..]; + for i in 0..left.len() { if left.value(i).ends_with(ends_with) { bit_util::set_bit(bool_slice, i); } } + } else if right.starts_with('%') + && right.ends_with('%') + && !right[1..right.len() - 1].contains(is_like_pattern) + { + // fast path, can use contains + let contains = &right[1..right.len() - 1]; + for i in 0..left.len() { + if left.value(i).contains(contains) { + bit_util::set_bit(bool_slice, i); + } + } } else { let re_pattern = replace_like_wildcards(right)?; let re = Regex::new(&format!("^{}$", re_pattern)).map_err(|e| { @@ -383,6 +395,15 @@ pub fn nlike_utf8_scalar( for i in 0..left.len() { result.append(!left.value(i).ends_with(&right[1..])); } + } else if right.starts_with('%') + && right.ends_with('%') + && !right[1..right.len() - 1].contains(is_like_pattern) + { + // fast path, can use contains + let contains = &right[1..right.len() - 1]; + for i in 0..left.len() { + result.append(!left.value(i).contains(contains)); + } } else { let re_pattern = replace_like_wildcards(right)?; let re = Regex::new(&format!("^{}$", re_pattern)).map_err(|e| {