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 ')
----