Skip to content

Commit f2de2c4

Browse files
authored
Refactor regexplike signature (#13394)
* update * update * update * clean up errors * fix flags types * fix failed example
1 parent 035fd3b commit f2de2c4

File tree

3 files changed

+31
-23
lines changed

3 files changed

+31
-23
lines changed

datafusion-examples/examples/regexp.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ async fn main() -> Result<()> {
148148

149149
// invalid flags will result in an error
150150
let result = ctx
151-
.sql(r"select regexp_like('\b4(?!000)\d\d\d\b', 4010, 'g')")
151+
.sql(r"select regexp_like('\b4(?!000)\d\d\d\b', '4010', 'g')")
152152
.await?
153153
.collect()
154154
.await;

datafusion/functions/src/regex/regexplike.rs

+29-21
Original file line numberDiff line numberDiff line change
@@ -81,26 +81,7 @@ impl RegexpLikeFunc {
8181
pub fn new() -> Self {
8282
Self {
8383
signature: Signature::one_of(
84-
vec![
85-
TypeSignature::Exact(vec![Utf8View, Utf8]),
86-
TypeSignature::Exact(vec![Utf8View, Utf8View]),
87-
TypeSignature::Exact(vec![Utf8View, LargeUtf8]),
88-
TypeSignature::Exact(vec![Utf8, Utf8]),
89-
TypeSignature::Exact(vec![Utf8, Utf8View]),
90-
TypeSignature::Exact(vec![Utf8, LargeUtf8]),
91-
TypeSignature::Exact(vec![LargeUtf8, Utf8]),
92-
TypeSignature::Exact(vec![LargeUtf8, Utf8View]),
93-
TypeSignature::Exact(vec![LargeUtf8, LargeUtf8]),
94-
TypeSignature::Exact(vec![Utf8View, Utf8, Utf8]),
95-
TypeSignature::Exact(vec![Utf8View, Utf8View, Utf8]),
96-
TypeSignature::Exact(vec![Utf8View, LargeUtf8, Utf8]),
97-
TypeSignature::Exact(vec![Utf8, Utf8, Utf8]),
98-
TypeSignature::Exact(vec![Utf8, Utf8View, Utf8]),
99-
TypeSignature::Exact(vec![Utf8, LargeUtf8, Utf8]),
100-
TypeSignature::Exact(vec![LargeUtf8, Utf8, Utf8]),
101-
TypeSignature::Exact(vec![LargeUtf8, Utf8View, Utf8]),
102-
TypeSignature::Exact(vec![LargeUtf8, LargeUtf8, Utf8]),
103-
],
84+
vec![TypeSignature::String(2), TypeSignature::String(3)],
10485
Volatility::Immutable,
10586
),
10687
}
@@ -211,7 +192,34 @@ pub fn regexp_like(args: &[ArrayRef]) -> Result<ArrayRef> {
211192
match args.len() {
212193
2 => handle_regexp_like(&args[0], &args[1], None),
213194
3 => {
214-
let flags = args[2].as_string::<i32>();
195+
let flags = match args[2].data_type() {
196+
Utf8 => args[2].as_string::<i32>(),
197+
LargeUtf8 => {
198+
let large_string_array = args[2].as_string::<i64>();
199+
let string_vec: Vec<Option<&str>> = (0..large_string_array.len()).map(|i| {
200+
if large_string_array.is_null(i) {
201+
None
202+
} else {
203+
Some(large_string_array.value(i))
204+
}
205+
})
206+
.collect();
207+
208+
&GenericStringArray::<i32>::from(string_vec)
209+
},
210+
_ => {
211+
let string_view_array = args[2].as_string_view();
212+
let string_vec: Vec<Option<String>> = (0..string_view_array.len()).map(|i| {
213+
if string_view_array.is_null(i) {
214+
None
215+
} else {
216+
Some(string_view_array.value(i).to_string())
217+
}
218+
})
219+
.collect();
220+
&GenericStringArray::<i32>::from(string_vec)
221+
},
222+
};
215223

216224
if flags.iter().any(|s| s == Some("g")) {
217225
return plan_err!("regexp_like() does not support the \"global\" option");

datafusion/sqllogictest/test_files/string/string_view.slt

+1-1
Original file line numberDiff line numberDiff line change
@@ -731,7 +731,7 @@ EXPLAIN SELECT
731731
FROM test;
732732
----
733733
logical_plan
734-
01)Projection: regexp_like(test.column1_utf8view, Utf8("^https?://(?:www\.)?([^/]+)/.*$")) AS k
734+
01)Projection: regexp_like(test.column1_utf8view, Utf8View("^https?://(?:www\.)?([^/]+)/.*$")) AS k
735735
02)--TableScan: test projection=[column1_utf8view]
736736

737737
## Ensure no casts for REGEXP_MATCH

0 commit comments

Comments
 (0)