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

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


The following commit(s) were added to refs/heads/main by this push:
     new 0b540eaf6b fix: support two argument TRIM (#9521)
0b540eaf6b is described below

commit 0b540eaf6b0f78973ef13f7bd906fd732d90285e
Author: Trent Hauck <[email protected]>
AuthorDate: Sun Mar 10 04:19:14 2024 -0700

    fix: support two argument TRIM (#9521)
    
    * fix: support two argument TRIM
    
    * refactor: fix auto space remove
    
    * test: fix test
---
 datafusion/sql/src/expr/mod.rs              | 29 ++++++++++++++++++++++++-----
 datafusion/sqllogictest/test_files/expr.slt |  8 ++++++++
 2 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/datafusion/sql/src/expr/mod.rs b/datafusion/sql/src/expr/mod.rs
index 4d04d9ebfa..d6aa006ec3 100644
--- a/datafusion/sql/src/expr/mod.rs
+++ b/datafusion/sql/src/expr/mod.rs
@@ -477,11 +477,13 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
                 expr,
                 trim_where,
                 trim_what,
+                trim_characters,
                 ..
             } => self.sql_trim_to_expr(
                 *expr,
                 trim_where,
                 trim_what,
+                trim_characters,
                 schema,
                 planner_context,
             ),
@@ -708,6 +710,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
         expr: SQLExpr,
         trim_where: Option<TrimWhereField>,
         trim_what: Option<Box<SQLExpr>>,
+        trim_characters: Option<Vec<SQLExpr>>,
         schema: &DFSchema,
         planner_context: &mut PlannerContext,
     ) -> Result<Expr> {
@@ -717,15 +720,31 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
             Some(TrimWhereField::Both) => BuiltinScalarFunction::Btrim,
             None => BuiltinScalarFunction::Trim,
         };
+
         let arg = self.sql_expr_to_logical_expr(expr, schema, 
planner_context)?;
-        let args = match trim_what {
-            Some(to_trim) => {
+        let args = match (trim_what, trim_characters) {
+            (Some(to_trim), None) => {
                 let to_trim =
                     self.sql_expr_to_logical_expr(*to_trim, schema, 
planner_context)?;
-                vec![arg, to_trim]
+                Ok(vec![arg, to_trim])
             }
-            None => vec![arg],
-        };
+            (None, Some(trim_characters)) => {
+                if let Some(first) = trim_characters.first() {
+                    let to_trim = self.sql_expr_to_logical_expr(
+                        first.clone(),
+                        schema,
+                        planner_context,
+                    )?;
+                    Ok(vec![arg, to_trim])
+                } else {
+                    plan_err!("TRIM CHARACTERS cannot be empty")
+                }
+            }
+            (Some(_), Some(_)) => {
+                plan_err!("Both TRIM and TRIM CHARACTERS cannot be specified")
+            }
+            (None, None) => Ok(vec![arg]),
+        }?;
         Ok(Expr::ScalarFunction(ScalarFunction::new(fun, args)))
     }
 
diff --git a/datafusion/sqllogictest/test_files/expr.slt 
b/datafusion/sqllogictest/test_files/expr.slt
index 9e4e3aa818..73fb5eec97 100644
--- a/datafusion/sqllogictest/test_files/expr.slt
+++ b/datafusion/sqllogictest/test_files/expr.slt
@@ -665,6 +665,14 @@ SELECT trim(TRAILING ' ' FROM ' tom ')
 ----
  tom
 
+query T
+SELECT trim('test.com', '.com')
+----
+test
+
+statement error
+SELECT trim(BOTH 'tom' FROM 'tommy', 'my')
+
 query T
 SELECT trim(BOTH ' ' FROM ' tom ')
 ----

Reply via email to