Skip to content

Commit 86561f0

Browse files
committed
Support escaping sequence for like operators
1 parent ee705f5 commit 86561f0

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

arrow/src/compute/kernels/comparison.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,19 @@ fn like_utf8_impl<OffsetSize: StringOffsetSizeTrait>(
261261
let re = if let Some(ref regex) = map.get(pat) {
262262
regex
263263
} else {
264-
let re_pattern = pat.replace("%", ".*").replace("_", ".");
264+
let mut prev_char = None;
265+
let mut re_pattern = pat.replace(|c| {
266+
let res = c == '%' && prev_char != Some('\\');
267+
prev_char = Some(c);
268+
res
269+
}, ".*").replace("\\%", "%");
270+
271+
let mut prev_char = None;
272+
re_pattern = re_pattern.replace(|c| {
273+
let res = c == '_' && prev_char != Some('\\');
274+
prev_char = Some(c);
275+
res
276+
}, ".").replace("\\_", "_");
265277
let re = RegexBuilder::new(&format!("^{}$", re_pattern))
266278
.case_insensitive(!case_sensitive)
267279
.build()
@@ -370,7 +382,19 @@ fn like_utf8_scalar_impl<OffsetSize: StringOffsetSizeTrait>(
370382
}
371383
}
372384
} else {
373-
let re_pattern = right.replace("%", ".*").replace("_", ".");
385+
let mut prev_char = None;
386+
let mut re_pattern = right.replace(|c| {
387+
let res = c == '%' && prev_char != Some('\\');
388+
prev_char = Some(c);
389+
res
390+
}, ".*").replace("\\%", "%");
391+
392+
let mut prev_char = None;
393+
re_pattern = re_pattern.replace(|c| {
394+
let res = c == '_' && prev_char != Some('\\');
395+
prev_char = Some(c);
396+
res
397+
}, ".").replace("\\_", "_");
374398
let re = RegexBuilder::new(&format!("^{}$", re_pattern))
375399
.case_insensitive(!case_sensitive)
376400
.build()

0 commit comments

Comments
 (0)