From 20faccecd13d07e03cd17d274b1b7d2187470529 Mon Sep 17 00:00:00 2001 From: nvphungdev <283886185+nvphungdev@users.noreply.github.com> Date: Sun, 17 May 2026 00:33:17 +0700 Subject: [PATCH] fix: make replace no-op for empty search --- datafusion/functions/src/string/replace.rs | 42 +++++++++++++++++++-- datafusion/sqllogictest/test_files/expr.slt | 5 +++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/datafusion/functions/src/string/replace.rs b/datafusion/functions/src/string/replace.rs index 769727999ea05..7247d9211cf2c 100644 --- a/datafusion/functions/src/string/replace.rs +++ b/datafusion/functions/src/string/replace.rs @@ -268,12 +268,9 @@ fn apply_replace( } if from.is_empty() { - // Empty `from`: insert `to` before each character and at both ends. builder.append_with(|w| { - w.write_str(to); for ch in string.chars() { w.write_char(ch); - w.write_str(to); } }); return; @@ -316,6 +313,19 @@ mod tests { StringArray ); + test_function!( + ReplaceFunc::new(), + vec![ + ColumnarValue::Scalar(ScalarValue::Utf8(Some(String::from("abc")))), + ColumnarValue::Scalar(ScalarValue::Utf8(Some(String::new()))), + ColumnarValue::Scalar(ScalarValue::Utf8(Some(String::from("x")))), + ], + Ok(Some("abc")), + &str, + Utf8, + StringArray + ); + test_function!( ReplaceFunc::new(), vec![ @@ -331,6 +341,19 @@ mod tests { LargeStringArray ); + test_function!( + ReplaceFunc::new(), + vec![ + ColumnarValue::Scalar(ScalarValue::LargeUtf8(Some(String::from("abc")))), + ColumnarValue::Scalar(ScalarValue::LargeUtf8(Some(String::new()))), + ColumnarValue::Scalar(ScalarValue::LargeUtf8(Some(String::from("x")))), + ], + Ok(Some("abc")), + &str, + LargeUtf8, + LargeStringArray + ); + test_function!( ReplaceFunc::new(), vec![ @@ -346,6 +369,19 @@ mod tests { StringArray ); + test_function!( + ReplaceFunc::new(), + vec![ + ColumnarValue::Scalar(ScalarValue::Utf8View(Some(String::from("abc")))), + ColumnarValue::Scalar(ScalarValue::Utf8View(Some(String::new()))), + ColumnarValue::Scalar(ScalarValue::Utf8View(Some(String::from("x")))), + ], + Ok(Some("abc")), + &str, + Utf8, + StringArray + ); + Ok(()) } } diff --git a/datafusion/sqllogictest/test_files/expr.slt b/datafusion/sqllogictest/test_files/expr.slt index 163730baae9e8..71d4b16526849 100644 --- a/datafusion/sqllogictest/test_files/expr.slt +++ b/datafusion/sqllogictest/test_files/expr.slt @@ -636,6 +636,11 @@ SELECT replace('abcdefabcdef', 'notmatch', 'XX') ---- abcdefabcdef +query T +SELECT replace('abc', '', 'x') +---- +abc + query T SELECT replace('abcdefabcdef', NULL, 'XX') ----