diesel/expression_methods/
escape_expression_methods.rs

1use crate::dsl;
2use crate::expression::grouped::Grouped;
3use crate::expression::operators::{Escape, Like, NotLike};
4use crate::expression::IntoSql;
5use crate::sql_types::VarChar;
6
7/// Adds the `escape` method to `LIKE` and `NOT LIKE`. This is used to specify
8/// the escape character for the pattern.
9///
10/// By default, the escape character is `\` on most backends. On SQLite,
11/// there is no default escape character.
12///
13/// # Example
14///
15/// ```rust
16/// # include!("../doctest_setup.rs");
17/// #
18/// # fn main() {
19/// #     use schema::users::dsl::*;
20/// #     use diesel::insert_into;
21/// #     let connection = &mut establish_connection();
22/// #     insert_into(users).values(name.eq("Ha%%0r"))
23/// #         .execute(connection).unwrap();
24/// let users_with_percent = users
25///     .select(name)
26///     .filter(name.like("%😀%%").escape('😀'))
27///     .load(connection);
28/// let users_without_percent = users
29///     .select(name)
30///     .filter(name.not_like("%a%%").escape('a'))
31///     .load(connection);
32/// assert_eq!(Ok(vec![String::from("Ha%%0r")]), users_with_percent);
33/// assert_eq!(
34///     Ok(vec![String::from("Sean"), String::from("Tess")]),
35///     users_without_percent
36/// );
37/// # }
38/// ```
39pub trait EscapeExpressionMethods: Sized {
40    #[doc(hidden)]
41    type TextExpression;
42
43    /// See the trait documentation.
44    fn escape(self, _character: char) -> dsl::Escape<Self>;
45}
46
47impl<T, U> EscapeExpressionMethods for Grouped<Like<T, U>> {
48    type TextExpression = Like<T, U>;
49
50    fn escape(self, character: char) -> dsl::Escape<Self> {
51        Grouped(Escape::new(
52            self.0,
53            character.to_string().into_sql::<VarChar>(),
54        ))
55    }
56}
57
58impl<T, U> EscapeExpressionMethods for Grouped<NotLike<T, U>> {
59    type TextExpression = NotLike<T, U>;
60
61    fn escape(self, character: char) -> dsl::Escape<Self> {
62        Grouped(Escape::new(
63            self.0,
64            character.to_string().into_sql::<VarChar>(),
65        ))
66    }
67}