diff --git a/datafusion/functions/src/unicode/translate.rs b/datafusion/functions/src/unicode/translate.rs index 376311d9d3f46..f97c0ed5c2990 100644 --- a/datafusion/functions/src/unicode/translate.rs +++ b/datafusion/functions/src/unicode/translate.rs @@ -170,7 +170,8 @@ where // Build from_map using reusable buffer from_graphemes.extend(from.graphemes(true)); for (index, c) in from_graphemes.iter().enumerate() { - from_map.insert(*c, index); + // Ignore characters that already exist in from_map, else insert + from_map.entry(*c).or_insert(index); } // Build to_graphemes @@ -259,6 +260,18 @@ mod tests { Utf8, StringArray ); + test_function!( + TranslateFunc::new(), + vec![ + ColumnarValue::Scalar(ScalarValue::from("abcabc")), + ColumnarValue::Scalar(ScalarValue::from("aa")), + ColumnarValue::Scalar(ScalarValue::from("de")) + ], + Ok(Some("dbcdbc")), + &str, + Utf8, + StringArray + ); test_function!( TranslateFunc::new(), vec![ diff --git a/datafusion/sqllogictest/test_files/string/string_query.slt.part b/datafusion/sqllogictest/test_files/string/string_query.slt.part index 6268c4ccdb1a5..a182ba8cde111 100644 --- a/datafusion/sqllogictest/test_files/string/string_query.slt.part +++ b/datafusion/sqllogictest/test_files/string/string_query.slt.part @@ -528,7 +528,7 @@ FROM test_basic_operator; Andrew Xiangpeng Raphael -under_scrre +under_scare percent (empty) (empty) @@ -542,10 +542,10 @@ SELECT TRANSLATE(unicode_1, 'foo', 'bar') as c FROM test_basic_operator; ---- -databusirn📊🔥 -databusirn数据融合 -databusirnДатаФусион -un iść crre +databusian📊🔥 +databusian数据融合 +databusianДатаФусион +un iść care pan Tadeusz ma iść w kąt (empty) (empty)