Skip to content

Commit 0b540ea

Browse files
authored
fix: support two argument TRIM (#9521)
* fix: support two argument TRIM * refactor: fix auto space remove * test: fix test
1 parent acddecb commit 0b540ea

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

datafusion/sql/src/expr/mod.rs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -477,11 +477,13 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
477477
expr,
478478
trim_where,
479479
trim_what,
480+
trim_characters,
480481
..
481482
} => self.sql_trim_to_expr(
482483
*expr,
483484
trim_where,
484485
trim_what,
486+
trim_characters,
485487
schema,
486488
planner_context,
487489
),
@@ -708,6 +710,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
708710
expr: SQLExpr,
709711
trim_where: Option<TrimWhereField>,
710712
trim_what: Option<Box<SQLExpr>>,
713+
trim_characters: Option<Vec<SQLExpr>>,
711714
schema: &DFSchema,
712715
planner_context: &mut PlannerContext,
713716
) -> Result<Expr> {
@@ -717,15 +720,31 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
717720
Some(TrimWhereField::Both) => BuiltinScalarFunction::Btrim,
718721
None => BuiltinScalarFunction::Trim,
719722
};
723+
720724
let arg = self.sql_expr_to_logical_expr(expr, schema, planner_context)?;
721-
let args = match trim_what {
722-
Some(to_trim) => {
725+
let args = match (trim_what, trim_characters) {
726+
(Some(to_trim), None) => {
723727
let to_trim =
724728
self.sql_expr_to_logical_expr(*to_trim, schema, planner_context)?;
725-
vec![arg, to_trim]
729+
Ok(vec![arg, to_trim])
726730
}
727-
None => vec![arg],
728-
};
731+
(None, Some(trim_characters)) => {
732+
if let Some(first) = trim_characters.first() {
733+
let to_trim = self.sql_expr_to_logical_expr(
734+
first.clone(),
735+
schema,
736+
planner_context,
737+
)?;
738+
Ok(vec![arg, to_trim])
739+
} else {
740+
plan_err!("TRIM CHARACTERS cannot be empty")
741+
}
742+
}
743+
(Some(_), Some(_)) => {
744+
plan_err!("Both TRIM and TRIM CHARACTERS cannot be specified")
745+
}
746+
(None, None) => Ok(vec![arg]),
747+
}?;
729748
Ok(Expr::ScalarFunction(ScalarFunction::new(fun, args)))
730749
}
731750

datafusion/sqllogictest/test_files/expr.slt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,14 @@ SELECT trim(TRAILING ' ' FROM ' tom ')
665665
----
666666
tom
667667

668+
query T
669+
SELECT trim('test.com', '.com')
670+
----
671+
test
672+
673+
statement error
674+
SELECT trim(BOTH 'tom' FROM 'tommy', 'my')
675+
668676
query T
669677
SELECT trim(BOTH ' ' FROM ' tom ')
670678
----

0 commit comments

Comments
 (0)