Skip to content

Commit ee14adf

Browse files
committed
Add null tests
1 parent d17e45d commit ee14adf

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

datafusion/functions/src/regex/regexpcount.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ pub fn regexp_count<O: OffsetSizeTrait>(args: &[ArrayRef]) -> Result<ArrayRef> {
131131
2..=4 => {
132132
let values = as_generic_string_array::<O>(&args[0])?;
133133
let regex = as_generic_string_array::<O>(&args[1])?;
134+
135+
if values.is_empty() || regex.is_empty() {
136+
return Ok(Arc::new(Int64Array::new_null(0)));
137+
}
138+
134139
let regex_datum: &dyn Datum = if regex.len() != 1 {
135140
regex
136141
} else {
@@ -139,7 +144,9 @@ pub fn regexp_count<O: OffsetSizeTrait>(args: &[ArrayRef]) -> Result<ArrayRef> {
139144
let start_scalar: Scalar<&Int64Array>;
140145
let start_array_datum: Option<&dyn Datum> = if arg_len > 2 {
141146
let start_array = as_primitive_array::<Int64Type>(&args[2])?;
142-
if start_array.len() != 1 {
147+
if start_array.is_empty() {
148+
None
149+
} else if start_array.len() != 1 {
143150
Some(start_array as &dyn Datum)
144151
} else {
145152
start_scalar = Scalar::new(start_array);
@@ -152,7 +159,9 @@ pub fn regexp_count<O: OffsetSizeTrait>(args: &[ArrayRef]) -> Result<ArrayRef> {
152159
let flags_scalar: Scalar<&GenericStringArray<O>>;
153160
let flags_array_datum: Option<&dyn Datum> = if arg_len > 3 {
154161
let flags_array = as_generic_string_array::<O>(&args[3])?;
155-
if flags_array.len() != 1 {
162+
if flags_array.is_empty() {
163+
None
164+
} else if flags_array.len() != 1 {
156165
Some(flags_array as &dyn Datum)
157166
} else {
158167
flags_scalar = Scalar::new(flags_array);

datafusion/sqllogictest/test_files/regexp.slt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,46 @@ SELECT regexp_count(arrow_cast(str, 'Utf8'), arrow_cast(pattern, 'LargeUtf8'),
614614
1
615615
1
616616

617+
# NULL tests
618+
619+
query I
620+
SELECT regexp_count(NULL, NULL);
621+
----
622+
0
623+
624+
query I
625+
SELECT regexp_count(NULL, 'a');
626+
----
627+
0
628+
629+
query I
630+
SELECT regexp_count('a', NULL);
631+
----
632+
0
633+
634+
query I
635+
SELECT regexp_count(NULL, NULL, NULL, NULL);
636+
----
637+
0
638+
639+
statement ok
640+
CREATE TABLE empty_table (str varchar, pattern varchar, start int, flags varchar);
641+
642+
query I
643+
SELECT regexp_count(str, pattern, start, flags) from empty_table;
644+
----
645+
646+
statement ok
647+
INSERT INTO empty_table VALUES ('a', NULL, 1, 'i'), (NULL, 'a', 1, 'i'), (NULL, NULL, 1, 'i'), (NULL, NULL, NULL, 'i');
648+
649+
query I
650+
SELECT regexp_count(str, pattern, start, flags) from empty_table;
651+
----
652+
0
653+
0
654+
0
655+
0
656+
617657
statement ok
618658
drop table t;
619659

0 commit comments

Comments
 (0)