This is an automated email from the ASF dual-hosted git repository.

jayzhan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 98cd19ef1c Remove duplicate function name in its aliases list (#10661)
98cd19ef1c is described below

commit 98cd19ef1cf52aef647e3e43fcc132a93028d1a2
Author: Jax Liu <[email protected]>
AuthorDate: Tue May 28 20:31:32 2024 +0800

    Remove duplicate function name in its aliases list (#10661)
    
    * remove duplicate name in function name aliases for array-function
    
    * add test for registering default functions
    
    * rename test case
    
    * add tests for agg and core function and refactor the test
    
    * remove unused mut
    
    * add comments for public function
    
    * cargo fmt
    
    * fix clippy
    
    * fix missing list_element
    
    * fix clippy
    
    * remove duplicate aliase name for median
    
    * add test for function list and remove the test for SessionState
    
    * remove the debug message
    
    * revert the change for medain and remove case insensitive test
    
    ---------
    
    Co-authored-by: Andrew Lamb <[email protected]>
---
 datafusion/functions-aggregate/src/first_last.rs |  4 +--
 datafusion/functions-aggregate/src/lib.rs        | 40 ++++++++++++++++++---
 datafusion/functions-array/src/array_has.rs      |  5 ++-
 datafusion/functions-array/src/cardinality.rs    |  2 +-
 datafusion/functions-array/src/concat.rs         |  3 --
 datafusion/functions-array/src/dimension.rs      |  4 +--
 datafusion/functions-array/src/empty.rs          |  6 +---
 datafusion/functions-array/src/except.rs         |  2 +-
 datafusion/functions-array/src/extract.rs        | 13 ++-----
 datafusion/functions-array/src/flatten.rs        |  2 +-
 datafusion/functions-array/src/length.rs         |  2 +-
 datafusion/functions-array/src/lib.rs            | 40 ++++++++++++++++++---
 datafusion/functions-array/src/position.rs       |  6 +---
 datafusion/functions-array/src/range.rs          |  4 +--
 datafusion/functions-array/src/remove.rs         |  9 ++---
 datafusion/functions-array/src/repeat.rs         |  2 +-
 datafusion/functions-array/src/replace.rs        | 12 ++-----
 datafusion/functions-array/src/resize.rs         |  2 +-
 datafusion/functions-array/src/reverse.rs        |  2 +-
 datafusion/functions-array/src/set_ops.rs        |  9 ++---
 datafusion/functions-array/src/sort.rs           |  2 +-
 datafusion/functions-array/src/string.rs         |  6 +---
 datafusion/functions/src/lib.rs                  | 45 +++++++++++++++++++++---
 datafusion/optimizer/src/push_down_limit.rs      |  1 -
 24 files changed, 143 insertions(+), 80 deletions(-)

diff --git a/datafusion/functions-aggregate/src/first_last.rs 
b/datafusion/functions-aggregate/src/first_last.rs
index fd4e219710..6fcb655ae4 100644
--- a/datafusion/functions-aggregate/src/first_last.rs
+++ b/datafusion/functions-aggregate/src/first_last.rs
@@ -72,7 +72,7 @@ impl Default for FirstValue {
 impl FirstValue {
     pub fn new() -> Self {
         Self {
-            aliases: vec![String::from("FIRST_VALUE"), 
String::from("first_value")],
+            aliases: vec![String::from("first_value")],
             signature: Signature::one_of(
                 vec![
                     // TODO: we can introduce more strict signature that only 
numeric of array types are allowed
@@ -372,7 +372,7 @@ impl Default for LastValue {
 impl LastValue {
     pub fn new() -> Self {
         Self {
-            aliases: vec![String::from("LAST_VALUE"), 
String::from("last_value")],
+            aliases: vec![String::from("last_value")],
             signature: Signature::one_of(
                 vec![
                     // TODO: we can introduce more strict signature that only 
numeric of array types are allowed
diff --git a/datafusion/functions-aggregate/src/lib.rs 
b/datafusion/functions-aggregate/src/lib.rs
index ac40a90aae..0c13952cc5 100644
--- a/datafusion/functions-aggregate/src/lib.rs
+++ b/datafusion/functions-aggregate/src/lib.rs
@@ -72,15 +72,20 @@ pub mod expr_fn {
     pub use super::median::median;
 }
 
-/// Registers all enabled packages with a [`FunctionRegistry`]
-pub fn register_all(registry: &mut dyn FunctionRegistry) -> Result<()> {
-    let functions: Vec<Arc<AggregateUDF>> = vec![
+/// Returns all default aggregate functions
+pub fn all_default_aggregate_functions() -> Vec<Arc<AggregateUDF>> {
+    vec![
         first_last::first_value_udaf(),
         first_last::last_value_udaf(),
         covariance::covar_samp_udaf(),
         covariance::covar_pop_udaf(),
         median::median_udaf(),
-    ];
+    ]
+}
+
+/// Registers all enabled packages with a [`FunctionRegistry`]
+pub fn register_all(registry: &mut dyn FunctionRegistry) -> Result<()> {
+    let functions: Vec<Arc<AggregateUDF>> = all_default_aggregate_functions();
 
     functions.into_iter().try_for_each(|udf| {
         let existing_udaf = registry.register_udaf(udf)?;
@@ -92,3 +97,30 @@ pub fn register_all(registry: &mut dyn FunctionRegistry) -> 
Result<()> {
 
     Ok(())
 }
+
+#[cfg(test)]
+mod tests {
+    use crate::all_default_aggregate_functions;
+    use datafusion_common::Result;
+    use std::collections::HashSet;
+
+    #[test]
+    fn test_no_duplicate_name() -> Result<()> {
+        let mut names = HashSet::new();
+        for func in all_default_aggregate_functions() {
+            assert!(
+                names.insert(func.name().to_string()),
+                "duplicate function name: {}",
+                func.name()
+            );
+            for alias in func.aliases() {
+                assert!(
+                    names.insert(alias.to_string()),
+                    "duplicate function name: {}",
+                    alias
+                );
+            }
+        }
+        Ok(())
+    }
+}
diff --git a/datafusion/functions-array/src/array_has.rs 
b/datafusion/functions-array/src/array_has.rs
index 466a913e35..136c6e7691 100644
--- a/datafusion/functions-array/src/array_has.rs
+++ b/datafusion/functions-array/src/array_has.rs
@@ -68,7 +68,6 @@ impl ArrayHas {
         Self {
             signature: Signature::array_and_element(Volatility::Immutable),
             aliases: vec![
-                String::from("array_has"),
                 String::from("list_has"),
                 String::from("array_contains"),
                 String::from("list_contains"),
@@ -140,7 +139,7 @@ impl ArrayHasAll {
     pub fn new() -> Self {
         Self {
             signature: Signature::any(2, Volatility::Immutable),
-            aliases: vec![String::from("array_has_all"), 
String::from("list_has_all")],
+            aliases: vec![String::from("list_has_all")],
         }
     }
 }
@@ -203,7 +202,7 @@ impl ArrayHasAny {
     pub fn new() -> Self {
         Self {
             signature: Signature::any(2, Volatility::Immutable),
-            aliases: vec![String::from("array_has_any"), 
String::from("list_has_any")],
+            aliases: vec![String::from("list_has_any")],
         }
     }
 }
diff --git a/datafusion/functions-array/src/cardinality.rs 
b/datafusion/functions-array/src/cardinality.rs
index d17965b795..f6755c3447 100644
--- a/datafusion/functions-array/src/cardinality.rs
+++ b/datafusion/functions-array/src/cardinality.rs
@@ -40,7 +40,7 @@ impl Cardinality {
     pub fn new() -> Self {
         Self {
             signature: Signature::array(Volatility::Immutable),
-            aliases: vec![String::from("cardinality")],
+            aliases: vec![],
         }
     }
 }
diff --git a/datafusion/functions-array/src/concat.rs 
b/datafusion/functions-array/src/concat.rs
index d49cef6674..330c50f5b0 100644
--- a/datafusion/functions-array/src/concat.rs
+++ b/datafusion/functions-array/src/concat.rs
@@ -59,7 +59,6 @@ impl ArrayAppend {
         Self {
             signature: Signature::array_and_element(Volatility::Immutable),
             aliases: vec![
-                String::from("array_append"),
                 String::from("list_append"),
                 String::from("array_push_back"),
                 String::from("list_push_back"),
@@ -119,7 +118,6 @@ impl ArrayPrepend {
         Self {
             signature: Signature::element_and_array(Volatility::Immutable),
             aliases: vec![
-                String::from("array_prepend"),
                 String::from("list_prepend"),
                 String::from("array_push_front"),
                 String::from("list_push_front"),
@@ -178,7 +176,6 @@ impl ArrayConcat {
         Self {
             signature: Signature::variadic_any(Volatility::Immutable),
             aliases: vec![
-                String::from("array_concat"),
                 String::from("array_cat"),
                 String::from("list_concat"),
                 String::from("list_cat"),
diff --git a/datafusion/functions-array/src/dimension.rs 
b/datafusion/functions-array/src/dimension.rs
index 0c65da283b..d84fa0c19e 100644
--- a/datafusion/functions-array/src/dimension.rs
+++ b/datafusion/functions-array/src/dimension.rs
@@ -50,7 +50,7 @@ impl ArrayDims {
     pub fn new() -> Self {
         Self {
             signature: Signature::array(Volatility::Immutable),
-            aliases: vec!["array_dims".to_string(), "list_dims".to_string()],
+            aliases: vec!["list_dims".to_string()],
         }
     }
 }
@@ -104,7 +104,7 @@ impl ArrayNdims {
     pub fn new() -> Self {
         Self {
             signature: Signature::array(Volatility::Immutable),
-            aliases: vec![String::from("array_ndims"), 
String::from("list_ndims")],
+            aliases: vec![String::from("list_ndims")],
         }
     }
 }
diff --git a/datafusion/functions-array/src/empty.rs 
b/datafusion/functions-array/src/empty.rs
index c5fe74480f..48435b7fa7 100644
--- a/datafusion/functions-array/src/empty.rs
+++ b/datafusion/functions-array/src/empty.rs
@@ -44,11 +44,7 @@ impl ArrayEmpty {
     pub fn new() -> Self {
         Self {
             signature: Signature::array(Volatility::Immutable),
-            aliases: vec![
-                "empty".to_string(),
-                "array_empty".to_string(),
-                "list_empty".to_string(),
-            ],
+            aliases: vec!["array_empty".to_string(), "list_empty".to_string()],
         }
     }
 }
diff --git a/datafusion/functions-array/src/except.rs 
b/datafusion/functions-array/src/except.rs
index 453b4f7711..50ef20a7d4 100644
--- a/datafusion/functions-array/src/except.rs
+++ b/datafusion/functions-array/src/except.rs
@@ -47,7 +47,7 @@ impl ArrayExcept {
     pub fn new() -> Self {
         Self {
             signature: Signature::any(2, Volatility::Immutable),
-            aliases: vec!["array_except".to_string(), 
"list_except".to_string()],
+            aliases: vec!["list_except".to_string()],
         }
     }
 }
diff --git a/datafusion/functions-array/src/extract.rs 
b/datafusion/functions-array/src/extract.rs
index a12cdc20df..a2ee6f2ef5 100644
--- a/datafusion/functions-array/src/extract.rs
+++ b/datafusion/functions-array/src/extract.rs
@@ -80,7 +80,6 @@ impl ArrayElement {
         Self {
             signature: Signature::array_and_index(Volatility::Immutable),
             aliases: vec![
-                String::from("array_element"),
                 String::from("array_extract"),
                 String::from("list_element"),
                 String::from("list_extract"),
@@ -241,7 +240,7 @@ impl ArraySlice {
     pub fn new() -> Self {
         Self {
             signature: Signature::variadic_any(Volatility::Immutable),
-            aliases: vec![String::from("array_slice"), 
String::from("list_slice")],
+            aliases: vec![String::from("list_slice")],
         }
     }
 }
@@ -513,10 +512,7 @@ impl ArrayPopFront {
     pub fn new() -> Self {
         Self {
             signature: Signature::array(Volatility::Immutable),
-            aliases: vec![
-                String::from("array_pop_front"),
-                String::from("list_pop_front"),
-            ],
+            aliases: vec![String::from("list_pop_front")],
         }
     }
 }
@@ -591,10 +587,7 @@ impl ArrayPopBack {
     pub fn new() -> Self {
         Self {
             signature: Signature::array(Volatility::Immutable),
-            aliases: vec![
-                String::from("array_pop_back"),
-                String::from("list_pop_back"),
-            ],
+            aliases: vec![String::from("list_pop_back")],
         }
     }
 }
diff --git a/datafusion/functions-array/src/flatten.rs 
b/datafusion/functions-array/src/flatten.rs
index 41762157fc..a495c3ade9 100644
--- a/datafusion/functions-array/src/flatten.rs
+++ b/datafusion/functions-array/src/flatten.rs
@@ -47,7 +47,7 @@ impl Flatten {
     pub fn new() -> Self {
         Self {
             signature: Signature::array(Volatility::Immutable),
-            aliases: vec![String::from("flatten")],
+            aliases: vec![],
         }
     }
 }
diff --git a/datafusion/functions-array/src/length.rs 
b/datafusion/functions-array/src/length.rs
index ed04c52584..5d9ccd2901 100644
--- a/datafusion/functions-array/src/length.rs
+++ b/datafusion/functions-array/src/length.rs
@@ -48,7 +48,7 @@ impl ArrayLength {
     pub fn new() -> Self {
         Self {
             signature: Signature::variadic_any(Volatility::Immutable),
-            aliases: vec![String::from("array_length"), 
String::from("list_length")],
+            aliases: vec![String::from("list_length")],
         }
     }
 }
diff --git a/datafusion/functions-array/src/lib.rs 
b/datafusion/functions-array/src/lib.rs
index 93be8bd790..63ba5d1483 100644
--- a/datafusion/functions-array/src/lib.rs
+++ b/datafusion/functions-array/src/lib.rs
@@ -99,9 +99,9 @@ pub mod expr_fn {
     pub use super::string::string_to_array;
 }
 
-/// Registers all enabled packages with a [`FunctionRegistry`]
-pub fn register_all(registry: &mut dyn FunctionRegistry) -> Result<()> {
-    let functions: Vec<Arc<ScalarUDF>> = vec![
+/// Return all default array functions
+pub fn all_default_array_functions() -> Vec<Arc<ScalarUDF>> {
+    vec![
         string::array_to_string_udf(),
         string::string_to_array_udf(),
         range::range_udf(),
@@ -139,7 +139,12 @@ pub fn register_all(registry: &mut dyn FunctionRegistry) 
-> Result<()> {
         replace::array_replace_n_udf(),
         replace::array_replace_all_udf(),
         replace::array_replace_udf(),
-    ];
+    ]
+}
+
+/// Registers all enabled packages with a [`FunctionRegistry`]
+pub fn register_all(registry: &mut dyn FunctionRegistry) -> Result<()> {
+    let functions: Vec<Arc<ScalarUDF>> = all_default_array_functions();
     functions.into_iter().try_for_each(|udf| {
         let existing_udf = registry.register_udf(udf)?;
         if let Some(existing_udf) = existing_udf {
@@ -151,3 +156,30 @@ pub fn register_all(registry: &mut dyn FunctionRegistry) 
-> Result<()> {
 
     Ok(())
 }
+
+#[cfg(test)]
+mod tests {
+    use crate::all_default_array_functions;
+    use datafusion_common::Result;
+    use std::collections::HashSet;
+
+    #[test]
+    fn test_no_duplicate_name() -> Result<()> {
+        let mut names = HashSet::new();
+        for func in all_default_array_functions() {
+            assert!(
+                names.insert(func.name().to_string()),
+                "duplicate function name: {}",
+                func.name()
+            );
+            for alias in func.aliases() {
+                assert!(
+                    names.insert(alias.to_string()),
+                    "duplicate function name: {}",
+                    alias
+                );
+            }
+        }
+        Ok(())
+    }
+}
diff --git a/datafusion/functions-array/src/position.rs 
b/datafusion/functions-array/src/position.rs
index 0002d5c40b..a48332ceb0 100644
--- a/datafusion/functions-array/src/position.rs
+++ b/datafusion/functions-array/src/position.rs
@@ -55,7 +55,6 @@ impl ArrayPosition {
                 Volatility::Immutable,
             ),
             aliases: vec![
-                String::from("array_position"),
                 String::from("list_position"),
                 String::from("array_indexof"),
                 String::from("list_indexof"),
@@ -183,10 +182,7 @@ impl ArrayPositions {
     pub fn new() -> Self {
         Self {
             signature: Signature::array_and_element(Volatility::Immutable),
-            aliases: vec![
-                String::from("array_positions"),
-                String::from("list_positions"),
-            ],
+            aliases: vec![String::from("list_positions")],
         }
     }
 }
diff --git a/datafusion/functions-array/src/range.rs 
b/datafusion/functions-array/src/range.rs
index 881e86d63a..8c73bd8213 100644
--- a/datafusion/functions-array/src/range.rs
+++ b/datafusion/functions-array/src/range.rs
@@ -58,7 +58,7 @@ impl Range {
                 ],
                 Volatility::Immutable,
             ),
-            aliases: vec![String::from("range")],
+            aliases: vec![],
         }
     }
 }
@@ -129,7 +129,7 @@ impl GenSeries {
                 ],
                 Volatility::Immutable,
             ),
-            aliases: vec![String::from("generate_series")],
+            aliases: vec![],
         }
     }
 }
diff --git a/datafusion/functions-array/src/remove.rs 
b/datafusion/functions-array/src/remove.rs
index 8c408f1650..589dd4d0c4 100644
--- a/datafusion/functions-array/src/remove.rs
+++ b/datafusion/functions-array/src/remove.rs
@@ -49,7 +49,7 @@ impl ArrayRemove {
     pub fn new() -> Self {
         Self {
             signature: Signature::array_and_element(Volatility::Immutable),
-            aliases: vec!["array_remove".to_string(), 
"list_remove".to_string()],
+            aliases: vec!["list_remove".to_string()],
         }
     }
 }
@@ -98,7 +98,7 @@ impl ArrayRemoveN {
     pub fn new() -> Self {
         Self {
             signature: Signature::any(3, Volatility::Immutable),
-            aliases: vec!["array_remove_n".to_string(), 
"list_remove_n".to_string()],
+            aliases: vec!["list_remove_n".to_string()],
         }
     }
 }
@@ -147,10 +147,7 @@ impl ArrayRemoveAll {
     pub fn new() -> Self {
         Self {
             signature: Signature::array_and_element(Volatility::Immutable),
-            aliases: vec![
-                "array_remove_all".to_string(),
-                "list_remove_all".to_string(),
-            ],
+            aliases: vec!["list_remove_all".to_string()],
         }
     }
 }
diff --git a/datafusion/functions-array/src/repeat.rs 
b/datafusion/functions-array/src/repeat.rs
index 78bcde9eab..7ed913da3f 100644
--- a/datafusion/functions-array/src/repeat.rs
+++ b/datafusion/functions-array/src/repeat.rs
@@ -50,7 +50,7 @@ impl ArrayRepeat {
     pub fn new() -> Self {
         Self {
             signature: Signature::variadic_any(Volatility::Immutable),
-            aliases: vec![String::from("array_repeat"), 
String::from("list_repeat")],
+            aliases: vec![String::from("list_repeat")],
         }
     }
 }
diff --git a/datafusion/functions-array/src/replace.rs 
b/datafusion/functions-array/src/replace.rs
index 8ac32538ad..46a2e078aa 100644
--- a/datafusion/functions-array/src/replace.rs
+++ b/datafusion/functions-array/src/replace.rs
@@ -65,7 +65,7 @@ impl ArrayReplace {
     pub fn new() -> Self {
         Self {
             signature: Signature::any(3, Volatility::Immutable),
-            aliases: vec![String::from("array_replace"), 
String::from("list_replace")],
+            aliases: vec![String::from("list_replace")],
         }
     }
 }
@@ -106,10 +106,7 @@ impl ArrayReplaceN {
     pub fn new() -> Self {
         Self {
             signature: Signature::any(4, Volatility::Immutable),
-            aliases: vec![
-                String::from("array_replace_n"),
-                String::from("list_replace_n"),
-            ],
+            aliases: vec![String::from("list_replace_n")],
         }
     }
 }
@@ -150,10 +147,7 @@ impl ArrayReplaceAll {
     pub fn new() -> Self {
         Self {
             signature: Signature::any(3, Volatility::Immutable),
-            aliases: vec![
-                String::from("array_replace_all"),
-                String::from("list_replace_all"),
-            ],
+            aliases: vec![String::from("list_replace_all")],
         }
     }
 }
diff --git a/datafusion/functions-array/src/resize.rs 
b/datafusion/functions-array/src/resize.rs
index 7028bd1c33..078ec7766a 100644
--- a/datafusion/functions-array/src/resize.rs
+++ b/datafusion/functions-array/src/resize.rs
@@ -47,7 +47,7 @@ impl ArrayResize {
     pub fn new() -> Self {
         Self {
             signature: Signature::variadic_any(Volatility::Immutable),
-            aliases: vec!["array_resize".to_string(), 
"list_resize".to_string()],
+            aliases: vec!["list_resize".to_string()],
         }
     }
 }
diff --git a/datafusion/functions-array/src/reverse.rs 
b/datafusion/functions-array/src/reverse.rs
index c9988524ca..b462be4020 100644
--- a/datafusion/functions-array/src/reverse.rs
+++ b/datafusion/functions-array/src/reverse.rs
@@ -47,7 +47,7 @@ impl ArrayReverse {
     pub fn new() -> Self {
         Self {
             signature: Signature::any(1, Volatility::Immutable),
-            aliases: vec!["array_reverse".to_string(), 
"list_reverse".to_string()],
+            aliases: vec!["list_reverse".to_string()],
         }
     }
 }
diff --git a/datafusion/functions-array/src/set_ops.rs 
b/datafusion/functions-array/src/set_ops.rs
index 9032a745ef..2facc51d50 100644
--- a/datafusion/functions-array/src/set_ops.rs
+++ b/datafusion/functions-array/src/set_ops.rs
@@ -69,7 +69,7 @@ impl ArrayUnion {
     pub fn new() -> Self {
         Self {
             signature: Signature::any(2, Volatility::Immutable),
-            aliases: vec![String::from("array_union"), 
String::from("list_union")],
+            aliases: vec![String::from("list_union")],
         }
     }
 }
@@ -114,10 +114,7 @@ impl ArrayIntersect {
     pub fn new() -> Self {
         Self {
             signature: Signature::any(2, Volatility::Immutable),
-            aliases: vec![
-                String::from("array_intersect"),
-                String::from("list_intersect"),
-            ],
+            aliases: vec![String::from("list_intersect")],
         }
     }
 }
@@ -162,7 +159,7 @@ impl ArrayDistinct {
     pub fn new() -> Self {
         Self {
             signature: Signature::array(Volatility::Immutable),
-            aliases: vec!["array_distinct".to_string(), 
"list_distinct".to_string()],
+            aliases: vec!["list_distinct".to_string()],
         }
     }
 }
diff --git a/datafusion/functions-array/src/sort.rs 
b/datafusion/functions-array/src/sort.rs
index 2a554bf3d9..0230c42175 100644
--- a/datafusion/functions-array/src/sort.rs
+++ b/datafusion/functions-array/src/sort.rs
@@ -47,7 +47,7 @@ impl ArraySort {
     pub fn new() -> Self {
         Self {
             signature: Signature::variadic_any(Volatility::Immutable),
-            aliases: vec!["array_sort".to_string(), "list_sort".to_string()],
+            aliases: vec!["list_sort".to_string()],
         }
     }
 }
diff --git a/datafusion/functions-array/src/string.rs 
b/datafusion/functions-array/src/string.rs
index e14e315752..04832b4b12 100644
--- a/datafusion/functions-array/src/string.rs
+++ b/datafusion/functions-array/src/string.rs
@@ -119,7 +119,6 @@ impl ArrayToString {
         Self {
             signature: Signature::variadic_any(Volatility::Immutable),
             aliases: vec![
-                String::from("array_to_string"),
                 String::from("list_to_string"),
                 String::from("array_join"),
                 String::from("list_join"),
@@ -182,10 +181,7 @@ impl StringToArray {
                 ],
                 Volatility::Immutable,
             ),
-            aliases: vec![
-                String::from("string_to_array"),
-                String::from("string_to_list"),
-            ],
+            aliases: vec![String::from("string_to_list")],
         }
     }
 }
diff --git a/datafusion/functions/src/lib.rs b/datafusion/functions/src/lib.rs
index 2a00839dc5..e36c491fef 100644
--- a/datafusion/functions/src/lib.rs
+++ b/datafusion/functions/src/lib.rs
@@ -79,7 +79,9 @@
 //! [`ScalarUDF`]: datafusion_expr::ScalarUDF
 use datafusion_common::Result;
 use datafusion_execution::FunctionRegistry;
+use datafusion_expr::ScalarUDF;
 use log::debug;
+use std::sync::Arc;
 
 #[macro_use]
 pub mod macros;
@@ -150,9 +152,9 @@ pub mod expr_fn {
     pub use super::unicode::expr_fn::*;
 }
 
-/// Registers all enabled packages with a [`FunctionRegistry`]
-pub fn register_all(registry: &mut dyn FunctionRegistry) -> Result<()> {
-    let mut all_functions = core::functions()
+/// Return all default functions
+pub fn all_default_functions() -> Vec<Arc<ScalarUDF>> {
+    core::functions()
         .into_iter()
         .chain(datetime::functions())
         .chain(encoding::functions())
@@ -160,9 +162,15 @@ pub fn register_all(registry: &mut dyn FunctionRegistry) 
-> Result<()> {
         .chain(regex::functions())
         .chain(crypto::functions())
         .chain(unicode::functions())
-        .chain(string::functions());
+        .chain(string::functions())
+        .collect::<Vec<_>>()
+}
+
+/// Registers all enabled packages with a [`FunctionRegistry`]
+pub fn register_all(registry: &mut dyn FunctionRegistry) -> Result<()> {
+    let all_functions = all_default_functions();
 
-    all_functions.try_for_each(|udf| {
+    all_functions.into_iter().try_for_each(|udf| {
         let existing_udf = registry.register_udf(udf)?;
         if let Some(existing_udf) = existing_udf {
             debug!("Overwrite existing UDF: {}", existing_udf.name());
@@ -171,3 +179,30 @@ pub fn register_all(registry: &mut dyn FunctionRegistry) 
-> Result<()> {
     })?;
     Ok(())
 }
+
+#[cfg(test)]
+mod tests {
+    use crate::all_default_functions;
+    use datafusion_common::Result;
+    use std::collections::HashSet;
+
+    #[test]
+    fn test_no_duplicate_name() -> Result<()> {
+        let mut names = HashSet::new();
+        for func in all_default_functions() {
+            assert!(
+                names.insert(func.name().to_string()),
+                "duplicate function name: {}",
+                func.name()
+            );
+            for alias in func.aliases() {
+                assert!(
+                    names.insert(alias.to_string()),
+                    "duplicate function name: {}",
+                    alias
+                );
+            }
+        }
+        Ok(())
+    }
+}
diff --git a/datafusion/optimizer/src/push_down_limit.rs 
b/datafusion/optimizer/src/push_down_limit.rs
index b97dff74d9..6723672ff4 100644
--- a/datafusion/optimizer/src/push_down_limit.rs
+++ b/datafusion/optimizer/src/push_down_limit.rs
@@ -65,7 +65,6 @@ impl OptimizerRule for PushDownLimit {
         };
 
         let Limit { skip, fetch, input } = limit;
-        let input = input;
 
         // Merge the Parent Limit and the Child Limit.
         if let LogicalPlan::Limit(child) = input.as_ref() {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to