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

comphead 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 aeca7ea999 Minor: use Option rather than Result for not found 
suggestion (#12512)
aeca7ea999 is described below

commit aeca7ea99940401573eb14601c74316279bbdae5
Author: Andrew Lamb <[email protected]>
AuthorDate: Tue Sep 17 15:54:13 2024 -0400

    Minor: use Option rather than Result for not found suggestion (#12512)
---
 datafusion/sql/src/expr/function.rs | 38 +++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/datafusion/sql/src/expr/function.rs 
b/datafusion/sql/src/expr/function.rs
index 1c114523d7..ddafc4e3a0 100644
--- a/datafusion/sql/src/expr/function.rs
+++ b/datafusion/sql/src/expr/function.rs
@@ -19,8 +19,8 @@ use crate::planner::{ContextProvider, PlannerContext, 
SqlToRel};
 
 use arrow_schema::DataType;
 use datafusion_common::{
-    internal_datafusion_err, not_impl_err, plan_datafusion_err, plan_err, 
DFSchema,
-    Dependency, Result,
+    internal_datafusion_err, internal_err, not_impl_err, plan_datafusion_err, 
plan_err,
+    DFSchema, Dependency, Result,
 };
 use datafusion_expr::expr::WildcardOptions;
 use datafusion_expr::planner::PlannerResult;
@@ -39,11 +39,14 @@ use sqlparser::ast::{
 use strum::IntoEnumIterator;
 
 /// Suggest a valid function based on an invalid input function name
+///
+/// Returns `None` if no valid matches are found. This happens when there are 
no
+/// functions registered with the context.
 pub fn suggest_valid_function(
     input_function_name: &str,
     is_window_func: bool,
     ctx: &dyn ContextProvider,
-) -> Result<String> {
+) -> Option<String> {
     let valid_funcs = if is_window_func {
         // All aggregate functions and builtin window functions
         let mut funcs = Vec::new();
@@ -67,19 +70,14 @@ pub fn suggest_valid_function(
 
 /// Find the closest matching string to the target string in the candidates 
list, using edit distance(case insensitive)
 /// Input `candidates` must not be empty otherwise an error is returned.
-fn find_closest_match(candidates: Vec<String>, target: &str) -> Result<String> 
{
+fn find_closest_match(candidates: Vec<String>, target: &str) -> Option<String> 
{
     let target = target.to_lowercase();
-    candidates
-        .into_iter()
-        .min_by_key(|candidate| {
-            datafusion_common::utils::datafusion_strsim::levenshtein(
-                &candidate.to_lowercase(),
-                &target,
-            )
-        })
-        .ok_or_else(|| {
-            internal_datafusion_err!("No functions registered with this 
context.")
-        })
+    candidates.into_iter().min_by_key(|candidate| {
+        datafusion_common::utils::datafusion_strsim::levenshtein(
+            &candidate.to_lowercase(),
+            &target,
+        )
+    })
 }
 
 /// Arguments to for a function call extracted from the SQL AST
@@ -355,9 +353,13 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
         }
 
         // Could not find the relevant function, so return an error
-        let suggested_func_name =
-            suggest_valid_function(&name, is_function_window, 
self.context_provider)?;
-        plan_err!("Invalid function '{name}'.\nDid you mean 
'{suggested_func_name}'?")
+        if let Some(suggested_func_name) =
+            suggest_valid_function(&name, is_function_window, 
self.context_provider)
+        {
+            plan_err!("Invalid function '{name}'.\nDid you mean 
'{suggested_func_name}'?")
+        } else {
+            internal_err!("No functions registered with this context.")
+        }
     }
 
     pub(super) fn sql_fn_name_to_expr(


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

Reply via email to