diff --git a/crates/polars-plan/src/plans/aexpr/predicates/column_expr.rs b/crates/polars-plan/src/plans/aexpr/predicates/column_expr.rs index 911b755453b3..6ffb8bedd6af 100644 --- a/crates/polars-plan/src/plans/aexpr/predicates/column_expr.rs +++ b/crates/polars-plan/src/plans/aexpr/predicates/column_expr.rs @@ -112,7 +112,8 @@ pub fn aexpr_to_column_predicates( options: _, } if matches!( str_function, - crate::plans::IRStringFunction::Contains { literal: _, strict: true } | + crate::plans::IRStringFunction::Contains { literal: false, strict: true } | + crate::plans::IRStringFunction::Contains { literal: true, strict: _ } | crate::plans::IRStringFunction::EndsWith | crate::plans::IRStringFunction::StartsWith ) => { @@ -363,7 +364,7 @@ mod tests { use polars_error::PolarsResult; use super::*; - use crate::dsl::{Expr, col}; + use crate::dsl::{Expr, col, lit}; use crate::plans::{ExprToIRContext, to_expr_ir, typed_lit}; /// Given a single-column `Expr`, call `aexpr_to_column_predicates()` and @@ -419,6 +420,28 @@ mod tests { Ok(()) } + #[test] + fn column_predicates_string_contains() -> PolarsResult<()> { + let col_name = "testcol"; + let test_values: [(Expr, &str); _] = [ + (col(col_name).str().contains(lit("x.*y"), true), "x.*y"), + (col(col_name).str().contains_literal(lit("abc")), "abc"), + ( + col(col_name).str().contains_literal(lit("x.*y")), + "x\\.\\*y", + ), + ]; + for (expr, expected_regex_string) in test_values { + let predicate = column_predicate_for_expr(DataType::String, col_name, expr.clone())?; + if let Some(SpecializedColumnPredicate::RegexMatch(regex)) = predicate { + assert_eq!(&format!("{regex}"), expected_regex_string); + } else { + panic!("{predicate:?} is unexpected for {expr:?}"); + } + } + Ok(()) + } + #[test] fn column_predicate_is_between() -> PolarsResult<()> { let col_name = "testcol";