diesel/expression/
operators.rs

1#[macro_export]
2#[doc(hidden)]
3macro_rules! __diesel_operator_body {
4    (
5        notation = $notation:ident,
6        struct_name = $name:ident,
7        operator = $operator:expr,
8        return_ty = (ReturnBasedOnArgs),
9        ty_params = ($($ty_param:ident,)+),
10        field_names = $field_names:tt,
11        backend_ty_params = $backend_ty_params:tt,
12        backend_ty = $backend_ty:ty,
13    ) => {
14        $crate::__diesel_operator_body! {
15            notation = $notation,
16            struct_name = $name,
17            operator = $operator,
18            return_ty = (ST),
19            ty_params = ($($ty_param,)+),
20            field_names = $field_names,
21            backend_ty_params = $backend_ty_params,
22            backend_ty = $backend_ty,
23            expression_ty_params = (ST,),
24            expression_bounds = ($($ty_param: $crate::expression::Expression<SqlType = ST>,)+),
25        }
26    };
27
28    (
29        notation = $notation:ident,
30        struct_name = $name:ident,
31        operator = $operator:expr,
32        return_ty = ($($return_ty:tt)+),
33        ty_params = ($($ty_param:ident,)+),
34        field_names = $field_names:tt,
35        backend_ty_params = $backend_ty_params:tt,
36        backend_ty = $backend_ty:ty,
37    ) => {
38        $crate::__diesel_operator_body! {
39            notation = $notation,
40            struct_name = $name,
41            operator = $operator,
42            return_ty = ($($return_ty)*),
43            ty_params = ($($ty_param,)+),
44            field_names = $field_names,
45            backend_ty_params = $backend_ty_params,
46            backend_ty = $backend_ty,
47            expression_ty_params = (),
48            expression_bounds = ($($ty_param: $crate::expression::Expression,)+),
49        }
50    };
51
52    (
53        notation = $notation:ident,
54        struct_name = $name:ident,
55        operator = $operator:expr,
56        return_ty = ($($return_ty:tt)+),
57        ty_params = ($($ty_param:ident,)+),
58        field_names = ($($field_name:ident,)+),
59        backend_ty_params = ($($backend_ty_param:ident,)*),
60        backend_ty = $backend_ty:ty,
61        expression_ty_params = ($($expression_ty_params:ident,)*),
62        expression_bounds = ($($expression_bounds:tt)*),
63    ) => {
64        #[derive(
65            Debug,
66            Clone,
67            Copy,
68            $crate::query_builder::QueryId,
69            $crate::sql_types::DieselNumericOps,
70            $crate::expression::ValidGrouping
71        )]
72        #[doc(hidden)]
73        #[allow(unreachable_pub)]
74        pub struct $name<$($ty_param,)+> {
75            $(pub(crate) $field_name: $ty_param,)+
76        }
77
78        impl<$($ty_param,)+> $name<$($ty_param,)+> {
79            #[allow(dead_code)]
80            pub(crate) fn new($($field_name: $ty_param,)+) -> Self {
81                $name { $($field_name,)+ }
82            }
83        }
84
85        $crate::impl_selectable_expression!($name<$($ty_param),+>);
86
87        impl<$($ty_param,)+ $($expression_ty_params,)*> $crate::expression::Expression for $name<$($ty_param,)+> where
88            $($expression_bounds)*
89        {
90            type SqlType = $($return_ty)*;
91        }
92
93        impl<$($ty_param,)+ $($backend_ty_param,)*> $crate::query_builder::QueryFragment<$backend_ty>
94            for $name<$($ty_param,)+> where
95                $($ty_param: $crate::query_builder::QueryFragment<$backend_ty>,)+
96                $($backend_ty_param: $crate::backend::Backend,)*
97        {
98            fn walk_ast<'b>(
99                &'b self,
100                mut out: $crate::query_builder::AstPass<'_, 'b, $backend_ty>
101            ) -> $crate::result::QueryResult<()>
102            {
103                $crate::__diesel_operator_to_sql!(
104                    notation = $notation,
105                    operator_expr = out.push_sql($operator),
106                    field_exprs = ($(self.$field_name.walk_ast(out.reborrow())?),+),
107                );
108                Ok(())
109            }
110        }
111
112        impl<S, $($ty_param,)+> $crate::internal::operators_macro::FieldAliasMapper<S> for $name<$($ty_param,)+>
113        where
114            S: $crate::query_source::AliasSource,
115            $($ty_param: $crate::internal::operators_macro::FieldAliasMapper<S>,)+
116        {
117            type Out = $name<
118                $(<$ty_param as $crate::internal::operators_macro::FieldAliasMapper<S>>::Out,)+
119            >;
120            fn map(self, alias: &$crate::query_source::Alias<S>) -> Self::Out {
121                $name {
122                    $($field_name: self.$field_name.map(alias),)+
123                }
124            }
125        }
126    }
127}
128
129#[macro_export]
130#[doc(hidden)]
131macro_rules! __diesel_operator_to_sql {
132    (
133        notation = infix,
134        operator_expr = $op:expr,
135        field_exprs = ($left:expr, $right:expr),
136    ) => {
137        $left;
138        $op;
139        $right;
140    };
141
142    (
143        notation = postfix,
144        operator_expr = $op:expr,
145        field_exprs = ($expr:expr),
146    ) => {
147        $expr;
148        $op;
149    };
150
151    (
152        notation = prefix,
153        operator_expr = $op:expr,
154        field_exprs = ($expr:expr),
155    ) => {
156        $op;
157        $expr;
158    };
159}
160
161/// Useful for libraries adding support for new SQL types. Apps should never
162/// need to call this.
163///
164/// This will create a new type with the given name. It will implement all
165/// methods needed to be used as an expression in Diesel, placing the given
166/// SQL between the two elements. The third argument specifies the SQL type
167/// that the operator returns. If it is not given, the type will be assumed
168/// to be `Bool`.
169///
170/// If the operator is specific to a single backend, you can specify this by
171/// adding `backend: Pg` or similar as the last argument.
172///
173/// It should be noted that the generated impls will not constrain the SQL
174/// types of the arguments. You should ensure that they are of the right
175/// type in your function which constructs the operator.
176///
177/// Typically you would not expose the type that this generates directly. You'd
178/// expose a function (or trait) used to construct the expression, and a helper
179/// type which represents the return type of that function. See the source of
180/// `diesel::expression::expression_methods` and
181/// `diesel::expression::helper_types` for real world examples of this.
182///
183/// # Examples
184///
185/// # Possible invocations
186///
187/// ```ignore
188/// // The SQL type will be boolean. The backend will not be constrained
189/// infix_operator!(Matches, " @@ ");
190///
191/// // Queries which try to execute `Contains` on a backend other than Pg
192/// // will fail to compile
193/// infix_operator!(Contains, " @> ", backend: Pg);
194///
195/// // The type of `Concat` will be `TsVector` rather than Bool
196/// infix_operator!(Concat, " || ", TsVector);
197///
198/// // It is perfectly fine to have multiple operators with the same SQL.
199/// // Diesel will ensure that the queries are always unambiguous in which
200/// // operator applies
201/// infix_operator!(Or, " || ", TsQuery);
202///
203/// // Specifying both the return types and the backend
204/// infix_operator!(And, " && ", TsQuery, backend: Pg);
205/// ```
206///
207/// ## Example usage
208///
209/// ```rust
210/// # include!("../doctest_setup.rs");
211/// # use diesel::sql_types::SqlType;
212/// # use diesel::expression::TypedExpressionType;
213/// #
214/// # fn main() {
215/// #     use schema::users::dsl::*;
216/// #     let connection = &mut establish_connection();
217/// diesel::infix_operator!(MyEq, " = ");
218///
219/// use diesel::expression::AsExpression;
220///
221/// // Normally you would put this on a trait instead
222/// fn my_eq<T, U, ST>(left: T, right: U) -> MyEq<T, U::Expression>
223/// where
224///     T: Expression<SqlType = ST>,
225///     U: AsExpression<ST>,
226///     ST: SqlType + TypedExpressionType,
227/// {
228///     MyEq::new(left, right.as_expression())
229/// }
230///
231/// let users_with_name = users.select(id).filter(my_eq(name, "Sean"));
232///
233/// assert_eq!(Ok(1), users_with_name.first(connection));
234/// # }
235/// ```
236#[macro_export]
237macro_rules! infix_operator {
238    ($name:ident, $operator:expr) => {
239        $crate::infix_operator!($name, $operator, $crate::sql_types::Bool);
240    };
241
242    ($name:ident, $operator:expr, backend: $backend:ty) => {
243        $crate::infix_operator!($name, $operator, $crate::sql_types::Bool, backend: $backend);
244    };
245
246    ($name:ident, $operator:expr, $($return_ty:tt)::*) => {
247        $crate::__diesel_infix_operator!(
248            name = $name,
249            operator = $operator,
250            return_ty = NullableBasedOnArgs ($($return_ty)::*),
251            backend_ty_params = (DB,),
252            backend_ty = DB,
253        );
254    };
255
256    ($name:ident, $operator:expr, $($return_ty:tt)::*, backend: $backend:ty) => {
257        $crate::__diesel_infix_operator!(
258            name = $name,
259            operator = $operator,
260            return_ty = NullableBasedOnArgs ($($return_ty)::*),
261            backend_ty_params = (),
262            backend_ty = $backend,
263        );
264    };
265
266}
267#[macro_export]
268#[doc(hidden)]
269macro_rules! __diesel_infix_operator {
270    ($name:ident, $operator:expr, ConstantNullability $($return_ty:tt)::*) => {
271        $crate::__diesel_infix_operator!(
272            name = $name,
273            operator = $operator,
274            return_ty = ($($return_ty)::*),
275            backend_ty_params = (DB,),
276            backend_ty = DB,
277        );
278    };
279    ($name:ident, $operator:expr, __diesel_internal_SameResultAsInput) => {
280        $crate::__diesel_infix_operator!(
281            name = $name,
282            operator = $operator,
283            return_ty = (<T as $crate::expression::Expression>::SqlType),
284            backend_ty_params = (DB,),
285            backend_ty = DB,
286        );
287    };
288    ($name:ident, $operator:expr, __diesel_internal_SameResultAsInput, backend: $backend:ty) => {
289        $crate::__diesel_infix_operator!(
290            name = $name,
291            operator = $operator,
292            return_ty = (<T as $crate::expression::Expression>::SqlType),
293            backend_ty_params = (),
294            backend_ty = $backend,
295        );
296    };
297    ($name:ident, $operator:expr, ConstantNullability $($return_ty:tt)::*, backend: $backend:ty) => {
298        $crate::__diesel_infix_operator!(
299            name = $name,
300            operator = $operator,
301            return_ty = ($($return_ty)::*),
302            backend_ty_params = (),
303            backend_ty = $backend,
304        );
305    };
306
307    (
308        name = $name:ident,
309        operator = $operator:expr,
310        return_ty = NullableBasedOnArgs ($($return_ty:tt)+),
311        backend_ty_params = $backend_ty_params:tt,
312        backend_ty = $backend_ty:ty,
313    ) => {
314        $crate::__diesel_infix_operator!(
315            name = $name,
316            operator = $operator,
317            return_ty = (
318                $crate::sql_types::is_nullable::MaybeNullable<
319                    $crate::sql_types::is_nullable::IsOneNullable<
320                        <T as $crate::expression::Expression>::SqlType,
321                        <U as $crate::expression::Expression>::SqlType
322                    >,
323                    $($return_ty)+
324                >
325            ),
326            expression_bounds = (
327                $crate::sql_types::is_nullable::IsSqlTypeNullable<
328                    <T as $crate::expression::Expression>::SqlType
329                >: $crate::sql_types::OneIsNullable<
330                    $crate::sql_types::is_nullable::IsSqlTypeNullable<
331                        <U as $crate::expression::Expression>::SqlType
332                    >
333                >,
334                $crate::sql_types::is_nullable::IsOneNullable<
335                    <T as $crate::expression::Expression>::SqlType,
336                    <U as $crate::expression::Expression>::SqlType
337                >: $crate::sql_types::MaybeNullableType<$($return_ty)+>,
338            ),
339            backend_ty_params = $backend_ty_params,
340            backend_ty = $backend_ty,
341        );
342    };
343
344    (
345        name = $name:ident,
346        operator = $operator:expr,
347        return_ty = ($($return_ty:tt)+),
348        backend_ty_params = $backend_ty_params:tt,
349        backend_ty = $backend_ty:ty,
350    ) => {
351        $crate::__diesel_infix_operator!(
352            name = $name,
353            operator = $operator,
354            return_ty = ($($return_ty)+),
355            expression_bounds = (),
356            backend_ty_params = $backend_ty_params,
357            backend_ty = $backend_ty,
358        );
359    };
360
361    (
362        name = $name:ident,
363        operator = $operator:expr,
364        return_ty = ($($return_ty:tt)+),
365        expression_bounds = ($($expression_bounds:tt)*),
366        backend_ty_params = $backend_ty_params:tt,
367        backend_ty = $backend_ty:ty,
368    ) => {
369        $crate::__diesel_operator_body!(
370            notation = infix,
371            struct_name = $name,
372            operator = $operator,
373            return_ty = ($($return_ty)+),
374            ty_params = (T, U,),
375            field_names = (left, right,),
376            backend_ty_params = $backend_ty_params,
377            backend_ty = $backend_ty,
378            expression_ty_params = (),
379            expression_bounds = (
380                T: $crate::expression::Expression,
381                U: $crate::expression::Expression,
382                <T as $crate::expression::Expression>::SqlType: $crate::sql_types::SqlType,
383                <U as $crate::expression::Expression>::SqlType: $crate::sql_types::SqlType,
384                $($expression_bounds)*
385            ),
386        );
387    };
388}
389
390#[macro_export]
391#[deprecated(since = "2.0.0", note = "use `diesel::infix_operator!` instead")]
392#[cfg(all(feature = "with-deprecated", not(feature = "without-deprecated")))]
393#[doc(hidden)]
394macro_rules! diesel_infix_operator {
395    ($($args:tt)*) => {
396        $crate::infix_operator!($($args)*);
397    }
398}
399
400/// Useful for libraries adding support for new SQL types. Apps should never
401/// need to call this.
402///
403/// Similar to [`infix_operator!`], but the generated type will only take
404/// a single argument rather than two. The operator SQL will be placed after
405/// the single argument. See [`infix_operator!`] for example usage.
406#[macro_export]
407macro_rules! postfix_operator {
408    ($name:ident, $operator:expr) => {
409        $crate::postfix_operator!($name, $operator, $crate::sql_types::Bool);
410    };
411
412    ($name:ident, $operator:expr, backend: $backend:ty) => {
413        $crate::postfix_operator!($name, $operator, $crate::sql_types::Bool, backend: $backend);
414    };
415
416    ($name:ident, $operator:expr, ConditionalNullability $($return_ty:tt)::*) => {
417        $crate::postfix_operator!(
418            name = $name,
419            operator = $operator,
420            return_ty = NullableBasedOnArgs ($($return_ty)::*),
421        );
422    };
423
424    ($name:ident, $operator:expr, ConditionalNullability $($return_ty:tt)::*, backend: $backend:ty) => {
425        $crate::postfix_operator!(
426            $name,
427            $operator,
428            return_ty = NullableBasedOnArgs ($($return_ty)::*),
429            backend: $backend
430        );
431    };
432
433    ($name:ident, $operator:expr, return_ty = NullableBasedOnArgs($return_ty:ty)) => {
434        $crate::__diesel_operator_body!(
435            notation = postfix,
436            struct_name = $name,
437            operator = $operator,
438            return_ty = (
439                $crate::sql_types::is_nullable::MaybeNullable<
440                    <<Expr as $crate::expression::Expression>::SqlType as $crate::sql_types::SqlType>::IsNull,
441                    $return_ty
442                >
443            ),
444            ty_params = (Expr,),
445            field_names = (expr,),
446            backend_ty_params = (DB,),
447            backend_ty = DB,
448            expression_ty_params = (),
449            expression_bounds = (
450                Expr: $crate::expression::Expression,
451                <Expr as $crate::expression::Expression>::SqlType: $crate::sql_types::SqlType,
452                $crate::sql_types::is_nullable::IsOneNullable<
453                    <Expr as $crate::expression::Expression>::SqlType,
454                    $return_ty
455                >: $crate::sql_types::MaybeNullableType<$return_ty>,
456            ),
457        );
458    };
459
460    ($name:ident, $operator:expr, return_ty = NullableBasedOnArgs($return_ty:ty), backend: $backend:ty) => {
461        $crate::__diesel_operator_body!(
462            notation = postfix,
463            struct_name = $name,
464            operator = $operator,
465            return_ty = (
466                $crate::sql_types::is_nullable::MaybeNullable<
467                    $crate::sql_types::is_nullable::IsOneNullable<
468                        <Expr as $crate::expression::Expression>::SqlType,
469                        $return_ty
470                    >,
471                    $return_ty
472                >
473            ),
474            ty_params = (Expr,),
475            field_names = (expr,),
476            backend_ty_params = (),
477            backend_ty = $backend,
478            expression_ty_params = (),
479            expression_bounds = (
480                Expr: $crate::expression::Expression,
481                <Expr as $crate::expression::Expression>::SqlType: $crate::sql_types::SqlType,
482                $crate::sql_types::is_nullable::IsOneNullable<
483                    <Expr as $crate::expression::Expression>::SqlType,
484                    $return_ty
485                >: $crate::sql_types::MaybeNullableType<$return_ty>,
486            ),
487        );
488    };
489
490    ($name:ident, $operator:expr, $return_ty:ty) => {
491        $crate::__diesel_operator_body!(
492            notation = postfix,
493            struct_name = $name,
494            operator = $operator,
495            return_ty = ($return_ty),
496            ty_params = (Expr,),
497            field_names = (expr,),
498            backend_ty_params = (DB,),
499            backend_ty = DB,
500        );
501    };
502
503    ($name:ident, $operator:expr, $return_ty:ty, backend: $backend:ty) => {
504        $crate::__diesel_operator_body!(
505            notation = postfix,
506            struct_name = $name,
507            operator = $operator,
508            return_ty = ($return_ty),
509            ty_params = (Expr,),
510            field_names = (expr,),
511            backend_ty_params = (),
512            backend_ty = $backend,
513        );
514    };
515}
516
517#[macro_export]
518#[deprecated(since = "2.0.0", note = "use `diesel::postfix_operator!` instead")]
519#[cfg(all(feature = "with-deprecated", not(feature = "without-deprecated")))]
520#[doc(hidden)]
521macro_rules! diesel_postfix_operator {
522    ($($args:tt)*) => {
523        $crate::postfix_operator!($($args)*);
524    }
525}
526
527/// Useful for libraries adding support for new SQL types. Apps should never
528/// need to call this.
529///
530/// Similar to [`infix_operator!`], but the generated type will only take
531/// a single argument rather than two. The operator SQL will be placed before
532/// the single argument. See [`infix_operator!`] for example usage.
533#[macro_export]
534macro_rules! prefix_operator {
535    ($name:ident, $operator:expr) => {
536        $crate::prefix_operator!($name, $operator, $crate::sql_types::Bool);
537    };
538
539    ($name:ident, $operator:expr, backend: $backend:ty) => {
540        $crate::prefix_operator!($name, $operator, $crate::sql_types::Bool, backend: $backend);
541    };
542
543    ($name:ident, $operator:expr, $return_ty:ty) => {
544        $crate::__diesel_operator_body!(
545            notation = prefix,
546            struct_name = $name,
547            operator = $operator,
548            return_ty = (
549                $crate::sql_types::is_nullable::MaybeNullable<
550                    $crate::sql_types::is_nullable::IsSqlTypeNullable<
551                        <Expr as $crate::expression::Expression>::SqlType
552                    >,
553                    $return_ty,
554                >
555            ),
556            ty_params = (Expr,),
557            field_names = (expr,),
558            backend_ty_params = (DB,),
559            backend_ty = DB,
560            expression_ty_params = (),
561            expression_bounds = (
562                Expr: $crate::expression::Expression,
563                <Expr as $crate::expression::Expression>::SqlType: $crate::sql_types::SqlType,
564                $crate::sql_types::is_nullable::IsSqlTypeNullable<
565                    <Expr as $crate::expression::Expression>::SqlType
566                >: $crate::sql_types::MaybeNullableType<$return_ty>,
567            ),
568        );
569    };
570
571    ($name:ident, $operator:expr, $return_ty:ty, backend: $backend:ty) => {
572        $crate::__diesel_operator_body!(
573            notation = prefix,
574            struct_name = $name,
575            operator = $operator,
576            return_ty = (
577                $crate::sql_types::is_nullable::MaybeNullable<
578                    $crate::sql_types::is_nullable::IsSqlTypeNullable<
579                        <Expr as $crate::expression::Expression>::SqlType
580                    >,
581                    $return_ty,
582                >
583            ),
584            ty_params = (Expr,),
585            field_names = (expr,),
586            backend_ty_params = (),
587            backend_ty = $backend,
588            expression_ty_params = (),
589            expression_bounds = (
590                Expr: $crate::expression::Expression,
591                <Expr as $crate::expression::Expression>::SqlType: $crate::sql_types::SqlType,
592                $crate::sql_types::is_nullable::IsSqlTypeNullable<
593                    <Expr as $crate::expression::Expression>::SqlType
594                >: $crate::sql_types::MaybeNullableType<$return_ty>,
595            ),
596        );
597    };
598}
599
600#[macro_export]
601#[deprecated(since = "2.0.0", note = "use `diesel::prefix_operator!` instead")]
602#[cfg(all(feature = "with-deprecated", not(feature = "without-deprecated")))]
603#[doc(hidden)]
604macro_rules! diesel_prefix_operator {
605    ($($args:tt)*) => {
606        $crate::prefix_operator!($($args)*);
607    }
608}
609
610#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct And<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    And<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "And", "left",
            &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for And<T, U> {
    #[inline]
    fn clone(&self) -> And<T, U> {
        And {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for And<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for And<T, U> {
            type QueryId =
                And<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for And<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for And<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for And<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for And<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for And<T, U>
            where T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> And<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self { And { left, right } }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for And<T, U> where
    And<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for And<T, U> where
    And<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for And<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for And<T, U> where
    T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" AND ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    And<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        And<<T as crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        And { left: self.left.map(alias), right: self.right.map(alias) }
    }
}infix_operator!(And, " AND ");
611#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct Or<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    Or<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Or", "left",
            &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for Or<T, U> {
    #[inline]
    fn clone(&self) -> Or<T, U> {
        Or {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for Or<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for Or<T, U> {
            type QueryId =
                Or<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for Or<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for Or<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for Or<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for Or<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for Or<T, U>
            where T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> Or<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self { Or { left, right } }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for Or<T, U> where
    Or<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for Or<T, U> where
    Or<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for Or<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for Or<T, U> where
    T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" OR ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    Or<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        Or<<T as crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        Or { left: self.left.map(alias), right: self.right.map(alias) }
    }
}infix_operator!(Or, " OR ");
612#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct Escape<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    Escape<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Escape",
            "left", &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for Escape<T, U> {
    #[inline]
    fn clone(&self) -> Escape<T, U> {
        Escape {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for Escape<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for Escape<T, U> {
            type QueryId =
                Escape<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for Escape<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for Escape<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for Escape<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for Escape<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for
            Escape<T, U> where
            T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> Escape<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self { Escape { left, right } }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for Escape<T, U>
    where Escape<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for Escape<T, U> where
    Escape<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for Escape<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for Escape<T, U> where
    T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" ESCAPE ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    Escape<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        Escape<<T as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        Escape { left: self.left.map(alias), right: self.right.map(alias) }
    }
}infix_operator!(Escape, " ESCAPE ");
613#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct Eq<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    Eq<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Eq", "left",
            &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for Eq<T, U> {
    #[inline]
    fn clone(&self) -> Eq<T, U> {
        Eq {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for Eq<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for Eq<T, U> {
            type QueryId =
                Eq<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for Eq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for Eq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for Eq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for Eq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for Eq<T, U>
            where T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> Eq<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self { Eq { left, right } }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for Eq<T, U> where
    Eq<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for Eq<T, U> where
    Eq<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for Eq<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for Eq<T, U> where
    T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" = ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    Eq<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        Eq<<T as crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        Eq { left: self.left.map(alias), right: self.right.map(alias) }
    }
}infix_operator!(Eq, " = ");
614#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct Gt<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    Gt<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Gt", "left",
            &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for Gt<T, U> {
    #[inline]
    fn clone(&self) -> Gt<T, U> {
        Gt {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for Gt<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for Gt<T, U> {
            type QueryId =
                Gt<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for Gt<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for Gt<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for Gt<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for Gt<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for Gt<T, U>
            where T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> Gt<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self { Gt { left, right } }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for Gt<T, U> where
    Gt<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for Gt<T, U> where
    Gt<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for Gt<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for Gt<T, U> where
    T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" > ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    Gt<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        Gt<<T as crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        Gt { left: self.left.map(alias), right: self.right.map(alias) }
    }
}infix_operator!(Gt, " > ");
615#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct GtEq<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    GtEq<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "GtEq", "left",
            &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for GtEq<T, U> {
    #[inline]
    fn clone(&self) -> GtEq<T, U> {
        GtEq {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for GtEq<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for GtEq<T, U> {
            type QueryId =
                GtEq<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for GtEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for GtEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for GtEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for GtEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for GtEq<T, U>
            where T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> GtEq<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self { GtEq { left, right } }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for GtEq<T, U>
    where GtEq<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for GtEq<T, U> where
    GtEq<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for GtEq<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for GtEq<T, U> where
    T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" >= ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    GtEq<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        GtEq<<T as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        GtEq { left: self.left.map(alias), right: self.right.map(alias) }
    }
}infix_operator!(GtEq, " >= ");
616#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct Lt<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    Lt<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Lt", "left",
            &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for Lt<T, U> {
    #[inline]
    fn clone(&self) -> Lt<T, U> {
        Lt {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for Lt<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for Lt<T, U> {
            type QueryId =
                Lt<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for Lt<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for Lt<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for Lt<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for Lt<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for Lt<T, U>
            where T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> Lt<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self { Lt { left, right } }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for Lt<T, U> where
    Lt<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for Lt<T, U> where
    Lt<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for Lt<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for Lt<T, U> where
    T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" < ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    Lt<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        Lt<<T as crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        Lt { left: self.left.map(alias), right: self.right.map(alias) }
    }
}infix_operator!(Lt, " < ");
617#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct LtEq<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    LtEq<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "LtEq", "left",
            &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for LtEq<T, U> {
    #[inline]
    fn clone(&self) -> LtEq<T, U> {
        LtEq {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for LtEq<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for LtEq<T, U> {
            type QueryId =
                LtEq<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for LtEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for LtEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for LtEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for LtEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for LtEq<T, U>
            where T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> LtEq<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self { LtEq { left, right } }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for LtEq<T, U>
    where LtEq<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for LtEq<T, U> where
    LtEq<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for LtEq<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for LtEq<T, U> where
    T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" <= ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    LtEq<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        LtEq<<T as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        LtEq { left: self.left.map(alias), right: self.right.map(alias) }
    }
}infix_operator!(LtEq, " <= ");
618#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct NotEq<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    NotEq<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "NotEq", "left",
            &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for NotEq<T, U> {
    #[inline]
    fn clone(&self) -> NotEq<T, U> {
        NotEq {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for NotEq<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for NotEq<T, U> {
            type QueryId =
                NotEq<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for NotEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for NotEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for NotEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for NotEq<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for NotEq<T, U>
            where T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> NotEq<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self { NotEq { left, right } }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for NotEq<T, U>
    where NotEq<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for NotEq<T, U> where
    NotEq<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for NotEq<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for NotEq<T, U> where
    T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" != ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    NotEq<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        NotEq<<T as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        NotEq { left: self.left.map(alias), right: self.right.map(alias) }
    }
}infix_operator!(NotEq, " != ");
619#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct NotLike<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    NotLike<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "NotLike",
            "left", &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for NotLike<T, U> {
    #[inline]
    fn clone(&self) -> NotLike<T, U> {
        NotLike {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for NotLike<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for NotLike<T, U> {
            type QueryId =
                NotLike<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for NotLike<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for NotLike<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for NotLike<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for NotLike<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for
            NotLike<T, U> where
            T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> NotLike<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self { NotLike { left, right } }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for NotLike<T, U>
    where NotLike<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for NotLike<T, U> where
    NotLike<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for NotLike<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for NotLike<T, U> where
    T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" NOT LIKE ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    NotLike<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        NotLike<<T as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        NotLike { left: self.left.map(alias), right: self.right.map(alias) }
    }
}infix_operator!(NotLike, " NOT LIKE ");
620#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct Between<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    Between<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Between",
            "left", &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for Between<T, U> {
    #[inline]
    fn clone(&self) -> Between<T, U> {
        Between {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for Between<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for Between<T, U> {
            type QueryId =
                Between<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for Between<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for Between<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for Between<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for Between<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for
            Between<T, U> where
            T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> Between<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self { Between { left, right } }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for Between<T, U>
    where Between<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for Between<T, U> where
    Between<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for Between<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for Between<T, U> where
    T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" BETWEEN ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    Between<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        Between<<T as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        Between { left: self.left.map(alias), right: self.right.map(alias) }
    }
}infix_operator!(Between, " BETWEEN ");
621#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct NotBetween<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    NotBetween<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "NotBetween",
            "left", &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for NotBetween<T, U> {
    #[inline]
    fn clone(&self) -> NotBetween<T, U> {
        NotBetween {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for NotBetween<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for NotBetween<T, U> {
            type QueryId =
                NotBetween<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for NotBetween<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for NotBetween<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for NotBetween<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for NotBetween<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for
            NotBetween<T, U> where
            T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> NotBetween<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self {
        NotBetween { left, right }
    }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for
    NotBetween<T, U> where
    NotBetween<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for NotBetween<T, U>
    where NotBetween<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for NotBetween<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Bool>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for NotBetween<T, U>
    where T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" NOT BETWEEN ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    NotBetween<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        NotBetween<<T as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        NotBetween {
            left: self.left.map(alias),
            right: self.right.map(alias),
        }
    }
}infix_operator!(NotBetween, " NOT BETWEEN ");
622
623#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct RetrieveAsTextJson<T, U> {
    pub(crate) left: T,
    pub(crate) right: U,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    RetrieveAsTextJson<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f,
            "RetrieveAsTextJson", "left", &self.left, "right", &&self.right)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for RetrieveAsTextJson<T, U> {
    #[inline]
    fn clone(&self) -> RetrieveAsTextJson<T, U> {
        RetrieveAsTextJson {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for RetrieveAsTextJson<T, U> {
}
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for RetrieveAsTextJson<T, U> {
            type QueryId =
                RetrieveAsTextJson<<T as
                diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for RetrieveAsTextJson<T, U>
            where Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for RetrieveAsTextJson<T, U>
            where Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for RetrieveAsTextJson<T, U>
            where Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for RetrieveAsTextJson<T, U>
            where Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for
            RetrieveAsTextJson<T, U> where
            T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };
impl<T, U> RetrieveAsTextJson<T, U> {
    #[allow(dead_code)]
    pub(crate) fn new(left: T, right: U) -> Self {
        RetrieveAsTextJson { left, right }
    }
}
impl<T, U, QS> crate::expression::SelectableExpression<QS> for
    RetrieveAsTextJson<T, U> where
    RetrieveAsTextJson<T, U>: crate::expression::AppearsOnTable<QS>,
    T: crate::expression::SelectableExpression<QS>,
    U: crate::expression::SelectableExpression<QS> {}
impl<T, U, QS> crate::expression::AppearsOnTable<QS> for
    RetrieveAsTextJson<T, U> where
    RetrieveAsTextJson<T, U>: crate::expression::Expression,
    T: crate::expression::AppearsOnTable<QS>,
    U: crate::expression::AppearsOnTable<QS> {}
impl<T, U> crate::expression::Expression for RetrieveAsTextJson<T, U> where
    T: crate::expression::Expression, U: crate::expression::Expression,
    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as
    crate::expression::Expression>::SqlType>: crate::sql_types::OneIsNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<U
    as crate::expression::Expression>::SqlType>>,
    crate::sql_types::is_nullable::IsOneNullable<<T as
    crate::expression::Expression>::SqlType,
    <U as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Text>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsOneNullable<<T
        as crate::expression::Expression>::SqlType,
        <U as crate::expression::Expression>::SqlType>,
        crate::sql_types::Text>;
}
impl<T, U, DB> crate::query_builder::QueryFragment<DB> for
    RetrieveAsTextJson<T, U> where T: crate::query_builder::QueryFragment<DB>,
    U: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.left.walk_ast(out.reborrow())?;
        out.push_sql(" ->> ");
        self.right.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for
    RetrieveAsTextJson<T, U> where S: crate::query_source::AliasSource,
    T: crate::internal::operators_macro::FieldAliasMapper<S>,
    U: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        RetrieveAsTextJson<<T as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        RetrieveAsTextJson {
            left: self.left.map(alias),
            right: self.right.map(alias),
        }
    }
}infix_operator!(RetrieveAsTextJson, " ->> ", crate::sql_types::Text);
624
625#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct IsNull<Expr> {
    pub(crate) expr: Expr,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::fmt::Debug> ::core::fmt::Debug for IsNull<Expr> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "IsNull",
            "expr", &&self.expr)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::clone::Clone> ::core::clone::Clone for IsNull<Expr> {
    #[inline]
    fn clone(&self) -> IsNull<Expr> {
        IsNull { expr: ::core::clone::Clone::clone(&self.expr) }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::marker::Copy> ::core::marker::Copy for IsNull<Expr> { }
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<Expr: diesel::query_builder::QueryId>
            diesel::query_builder::QueryId for IsNull<Expr> {
            type QueryId =
                IsNull<<Expr as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <Expr as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <Expr as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
                    || false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<Expr, __Rhs> ::std::ops::Add<__Rhs> for IsNull<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Sub<__Rhs> for IsNull<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Mul<__Rhs> for IsNull<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Div<__Rhs> for IsNull<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<Expr, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for
            IsNull<Expr> where
            Expr: diesel::expression::ValidGrouping<__GroupByClause> {
            type IsAggregate =
                <Expr as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate;
        }
    };
impl<Expr> IsNull<Expr> {
    #[allow(dead_code)]
    pub(crate) fn new(expr: Expr) -> Self { IsNull { expr } }
}
impl<Expr, QS> crate::expression::SelectableExpression<QS> for IsNull<Expr>
    where IsNull<Expr>: crate::expression::AppearsOnTable<QS>,
    Expr: crate::expression::SelectableExpression<QS> {}
impl<Expr, QS> crate::expression::AppearsOnTable<QS> for IsNull<Expr> where
    IsNull<Expr>: crate::expression::Expression,
    Expr: crate::expression::AppearsOnTable<QS> {}
impl<Expr> crate::expression::Expression for IsNull<Expr> where
    Expr: crate::expression::Expression {
    type SqlType = crate::sql_types::Bool;
}
impl<Expr, DB> crate::query_builder::QueryFragment<DB> for IsNull<Expr> where
    Expr: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend
    {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.expr.walk_ast(out.reborrow())?;
        out.push_sql(" IS NULL");
        ;
        Ok(())
    }
}
impl<S, Expr> crate::internal::operators_macro::FieldAliasMapper<S> for
    IsNull<Expr> where S: crate::query_source::AliasSource,
    Expr: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        IsNull<<Expr as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        IsNull { expr: self.expr.map(alias) }
    }
}postfix_operator!(IsNull, " IS NULL");
626#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct IsNotNull<Expr> {
    pub(crate) expr: Expr,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::fmt::Debug> ::core::fmt::Debug for IsNotNull<Expr> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "IsNotNull",
            "expr", &&self.expr)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::clone::Clone> ::core::clone::Clone for IsNotNull<Expr> {
    #[inline]
    fn clone(&self) -> IsNotNull<Expr> {
        IsNotNull { expr: ::core::clone::Clone::clone(&self.expr) }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::marker::Copy> ::core::marker::Copy for IsNotNull<Expr> { }
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<Expr: diesel::query_builder::QueryId>
            diesel::query_builder::QueryId for IsNotNull<Expr> {
            type QueryId =
                IsNotNull<<Expr as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <Expr as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <Expr as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
                    || false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<Expr, __Rhs> ::std::ops::Add<__Rhs> for IsNotNull<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Sub<__Rhs> for IsNotNull<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Mul<__Rhs> for IsNotNull<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Div<__Rhs> for IsNotNull<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<Expr, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for
            IsNotNull<Expr> where
            Expr: diesel::expression::ValidGrouping<__GroupByClause> {
            type IsAggregate =
                <Expr as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate;
        }
    };
impl<Expr> IsNotNull<Expr> {
    #[allow(dead_code)]
    pub(crate) fn new(expr: Expr) -> Self { IsNotNull { expr } }
}
impl<Expr, QS> crate::expression::SelectableExpression<QS> for IsNotNull<Expr>
    where IsNotNull<Expr>: crate::expression::AppearsOnTable<QS>,
    Expr: crate::expression::SelectableExpression<QS> {}
impl<Expr, QS> crate::expression::AppearsOnTable<QS> for IsNotNull<Expr> where
    IsNotNull<Expr>: crate::expression::Expression,
    Expr: crate::expression::AppearsOnTable<QS> {}
impl<Expr> crate::expression::Expression for IsNotNull<Expr> where
    Expr: crate::expression::Expression {
    type SqlType = crate::sql_types::Bool;
}
impl<Expr, DB> crate::query_builder::QueryFragment<DB> for IsNotNull<Expr>
    where Expr: crate::query_builder::QueryFragment<DB>,
    DB: crate::backend::Backend {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.expr.walk_ast(out.reborrow())?;
        out.push_sql(" IS NOT NULL");
        ;
        Ok(())
    }
}
impl<S, Expr> crate::internal::operators_macro::FieldAliasMapper<S> for
    IsNotNull<Expr> where S: crate::query_source::AliasSource,
    Expr: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        IsNotNull<<Expr as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        IsNotNull { expr: self.expr.map(alias) }
    }
}postfix_operator!(IsNotNull, " IS NOT NULL");
627#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct Asc<Expr> {
    pub(crate) expr: Expr,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::fmt::Debug> ::core::fmt::Debug for Asc<Expr> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "Asc", "expr",
            &&self.expr)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::clone::Clone> ::core::clone::Clone for Asc<Expr> {
    #[inline]
    fn clone(&self) -> Asc<Expr> {
        Asc { expr: ::core::clone::Clone::clone(&self.expr) }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::marker::Copy> ::core::marker::Copy for Asc<Expr> { }
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<Expr: diesel::query_builder::QueryId>
            diesel::query_builder::QueryId for Asc<Expr> {
            type QueryId =
                Asc<<Expr as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <Expr as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <Expr as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
                    || false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<Expr, __Rhs> ::std::ops::Add<__Rhs> for Asc<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Sub<__Rhs> for Asc<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Mul<__Rhs> for Asc<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Div<__Rhs> for Asc<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<Expr, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for Asc<Expr>
            where Expr: diesel::expression::ValidGrouping<__GroupByClause> {
            type IsAggregate =
                <Expr as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate;
        }
    };
impl<Expr> Asc<Expr> {
    #[allow(dead_code)]
    pub(crate) fn new(expr: Expr) -> Self { Asc { expr } }
}
impl<Expr, QS> crate::expression::SelectableExpression<QS> for Asc<Expr> where
    Asc<Expr>: crate::expression::AppearsOnTable<QS>,
    Expr: crate::expression::SelectableExpression<QS> {}
impl<Expr, QS> crate::expression::AppearsOnTable<QS> for Asc<Expr> where
    Asc<Expr>: crate::expression::Expression,
    Expr: crate::expression::AppearsOnTable<QS> {}
impl<Expr> crate::expression::Expression for Asc<Expr> where
    Expr: crate::expression::Expression {
    type SqlType = crate::expression::expression_types::NotSelectable;
}
impl<Expr, DB> crate::query_builder::QueryFragment<DB> for Asc<Expr> where
    Expr: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend
    {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.expr.walk_ast(out.reborrow())?;
        out.push_sql(" ASC");
        ;
        Ok(())
    }
}
impl<S, Expr> crate::internal::operators_macro::FieldAliasMapper<S> for
    Asc<Expr> where S: crate::query_source::AliasSource,
    Expr: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        Asc<<Expr as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        Asc { expr: self.expr.map(alias) }
    }
}postfix_operator!(
628    Asc,
629    " ASC",
630    crate::expression::expression_types::NotSelectable
631);
632#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct Desc<Expr> {
    pub(crate) expr: Expr,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::fmt::Debug> ::core::fmt::Debug for Desc<Expr> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "Desc", "expr",
            &&self.expr)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::clone::Clone> ::core::clone::Clone for Desc<Expr> {
    #[inline]
    fn clone(&self) -> Desc<Expr> {
        Desc { expr: ::core::clone::Clone::clone(&self.expr) }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::marker::Copy> ::core::marker::Copy for Desc<Expr> { }
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<Expr: diesel::query_builder::QueryId>
            diesel::query_builder::QueryId for Desc<Expr> {
            type QueryId =
                Desc<<Expr as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <Expr as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <Expr as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
                    || false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<Expr, __Rhs> ::std::ops::Add<__Rhs> for Desc<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Sub<__Rhs> for Desc<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Mul<__Rhs> for Desc<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Div<__Rhs> for Desc<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<Expr, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for Desc<Expr>
            where Expr: diesel::expression::ValidGrouping<__GroupByClause> {
            type IsAggregate =
                <Expr as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate;
        }
    };
impl<Expr> Desc<Expr> {
    #[allow(dead_code)]
    pub(crate) fn new(expr: Expr) -> Self { Desc { expr } }
}
impl<Expr, QS> crate::expression::SelectableExpression<QS> for Desc<Expr>
    where Desc<Expr>: crate::expression::AppearsOnTable<QS>,
    Expr: crate::expression::SelectableExpression<QS> {}
impl<Expr, QS> crate::expression::AppearsOnTable<QS> for Desc<Expr> where
    Desc<Expr>: crate::expression::Expression,
    Expr: crate::expression::AppearsOnTable<QS> {}
impl<Expr> crate::expression::Expression for Desc<Expr> where
    Expr: crate::expression::Expression {
    type SqlType = crate::expression::expression_types::NotSelectable;
}
impl<Expr, DB> crate::query_builder::QueryFragment<DB> for Desc<Expr> where
    Expr: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend
    {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        self.expr.walk_ast(out.reborrow())?;
        out.push_sql(" DESC");
        ;
        Ok(())
    }
}
impl<S, Expr> crate::internal::operators_macro::FieldAliasMapper<S> for
    Desc<Expr> where S: crate::query_source::AliasSource,
    Expr: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        Desc<<Expr as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        Desc { expr: self.expr.map(alias) }
    }
}postfix_operator!(
633    Desc,
634    " DESC",
635    crate::expression::expression_types::NotSelectable
636);
637
638#[doc(hidden)]
#[allow(unreachable_pub)]
pub struct Not<Expr> {
    pub(crate) expr: Expr,
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::fmt::Debug> ::core::fmt::Debug for Not<Expr> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field1_finish(f, "Not", "expr",
            &&self.expr)
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::clone::Clone> ::core::clone::Clone for Not<Expr> {
    #[inline]
    fn clone(&self) -> Not<Expr> {
        Not { expr: ::core::clone::Clone::clone(&self.expr) }
    }
}
#[automatically_derived]
#[allow(unreachable_pub)]
impl<Expr: ::core::marker::Copy> ::core::marker::Copy for Not<Expr> { }
const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<Expr: diesel::query_builder::QueryId>
            diesel::query_builder::QueryId for Not<Expr> {
            type QueryId =
                Not<<Expr as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <Expr as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <Expr as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION
                    || false;
        }
    };
const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<Expr, __Rhs> ::std::ops::Add<__Rhs> for Not<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Sub<__Rhs> for Not<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Mul<__Rhs> for Not<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<Expr, __Rhs> ::std::ops::Div<__Rhs> for Not<Expr> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };
const _: () =
    {
        use diesel;
        impl<Expr, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for Not<Expr>
            where Expr: diesel::expression::ValidGrouping<__GroupByClause> {
            type IsAggregate =
                <Expr as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate;
        }
    };
impl<Expr> Not<Expr> {
    #[allow(dead_code)]
    pub(crate) fn new(expr: Expr) -> Self { Not { expr } }
}
impl<Expr, QS> crate::expression::SelectableExpression<QS> for Not<Expr> where
    Not<Expr>: crate::expression::AppearsOnTable<QS>,
    Expr: crate::expression::SelectableExpression<QS> {}
impl<Expr, QS> crate::expression::AppearsOnTable<QS> for Not<Expr> where
    Not<Expr>: crate::expression::Expression,
    Expr: crate::expression::AppearsOnTable<QS> {}
impl<Expr> crate::expression::Expression for Not<Expr> where
    Expr: crate::expression::Expression,
    <Expr as
    crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
    crate::sql_types::is_nullable::IsSqlTypeNullable<<Expr as
    crate::expression::Expression>::SqlType>: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>
    {
    type SqlType =
        crate::sql_types::is_nullable::MaybeNullable<crate::sql_types::is_nullable::IsSqlTypeNullable<<Expr
        as crate::expression::Expression>::SqlType>, crate::sql_types::Bool>;
}
impl<Expr, DB> crate::query_builder::QueryFragment<DB> for Not<Expr> where
    Expr: crate::query_builder::QueryFragment<DB>, DB: crate::backend::Backend
    {
    fn walk_ast<'b>(&'b self,
        mut out: crate::query_builder::AstPass<'_, 'b, DB>)
        -> crate::result::QueryResult<()> {
        out.push_sql(" NOT ");
        self.expr.walk_ast(out.reborrow())?;
        ;
        Ok(())
    }
}
impl<S, Expr> crate::internal::operators_macro::FieldAliasMapper<S> for
    Not<Expr> where S: crate::query_source::AliasSource,
    Expr: crate::internal::operators_macro::FieldAliasMapper<S> {
    type Out =
        Not<<Expr as
        crate::internal::operators_macro::FieldAliasMapper<S>>::Out>;
    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
        Not { expr: self.expr.map(alias) }
    }
}prefix_operator!(Not, " NOT ");
639
640use crate::backend::{sql_dialect, Backend, SqlDialect};
641use crate::expression::{TypedExpressionType, ValidGrouping};
642use crate::insertable::{ColumnInsertValue, Insertable};
643use crate::query_builder::{QueryFragment, QueryId, ValuesClause};
644use crate::query_source::Column;
645use crate::sql_types::{DieselNumericOps, SqlType};
646
647impl<T, U> Insertable<T::Table> for Eq<T, U>
648where
649    T: Column,
650{
651    type Values = ValuesClause<ColumnInsertValue<T, U>, T::Table>;
652
653    fn values(self) -> Self::Values {
654        ValuesClause::new(ColumnInsertValue::new(self.right))
655    }
656}
657
658impl<'a, T, Tab, U> Insertable<Tab> for &'a Eq<T, U>
659where
660    T: Copy,
661    Eq<T, &'a U>: Insertable<Tab>,
662{
663    type Values = <Eq<T, &'a U> as Insertable<Tab>>::Values;
664
665    fn values(self) -> Self::Values {
666        Eq::new(self.left, &self.right).values()
667    }
668}
669
670/// This type represents a string concat operator
671#[doc = " This type represents a string concat operator"]
#[non_exhaustive]
pub struct Concat<L, R> {
    #[doc = " The left side expression of the operator"]
    pub left: L,
    #[doc = " The right side expression of the operator"]
    pub right: R,
}#[diesel_derives::__diesel_public_if(
672    feature = "i-implement-a-third-party-backend-and-opt-into-breaking-changes",
673    public_fields(left, right)
674)]
675#[derive(#[automatically_derived]
impl<L: ::core::fmt::Debug, R: ::core::fmt::Debug> ::core::fmt::Debug for
    Concat<L, R> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Concat",
            "left", &self.left, "right", &&self.right)
    }
}Debug, #[automatically_derived]
impl<L: ::core::clone::Clone, R: ::core::clone::Clone> ::core::clone::Clone
    for Concat<L, R> {
    #[inline]
    fn clone(&self) -> Concat<L, R> {
        Concat {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}Clone, #[automatically_derived]
impl<L: ::core::marker::Copy, R: ::core::marker::Copy> ::core::marker::Copy
    for Concat<L, R> {
}Copy, const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<L: diesel::query_builder::QueryId,
            R: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for Concat<L, R> {
            type QueryId =
                Concat<<L as diesel::query_builder::QueryId>::QueryId,
                <R as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <L as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <R as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <L as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <R as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };QueryId, const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<L, R, __Rhs> ::std::ops::Add<__Rhs> for Concat<L, R> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<L, R, __Rhs> ::std::ops::Sub<__Rhs> for Concat<L, R> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<L, R, __Rhs> ::std::ops::Mul<__Rhs> for Concat<L, R> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<L, R, __Rhs> ::std::ops::Div<__Rhs> for Concat<L, R> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };DieselNumericOps, const _: () =
    {
        use diesel;
        impl<L, R, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for
            Concat<L, R> where
            L: diesel::expression::ValidGrouping<__GroupByClause>,
            R: diesel::expression::ValidGrouping<__GroupByClause>,
            <L as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<R
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<L as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<R as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };ValidGrouping)]
676pub struct Concat<L, R> {
677    /// The left side expression of the operator
678    pub(crate) left: L,
679    /// The right side expression of the operator
680    pub(crate) right: R,
681}
682
683impl<L, R> Concat<L, R> {
684    pub(crate) fn new(left: L, right: R) -> Self {
685        Self { left, right }
686    }
687}
688
689impl<L, R, ST> crate::expression::Expression for Concat<L, R>
690where
691    L: crate::expression::Expression<SqlType = ST>,
692    R: crate::expression::Expression<SqlType = ST>,
693    ST: SqlType + TypedExpressionType,
694{
695    type SqlType = ST;
696}
697
698impl<L, R, QS> crate::expression::SelectableExpression<QS> for Concat<L, R>
    where Concat<L, R>: crate::expression::AppearsOnTable<QS>,
    L: crate::expression::SelectableExpression<QS>,
    R: crate::expression::SelectableExpression<QS> {}
impl<L, R, QS> crate::expression::AppearsOnTable<QS> for Concat<L, R> where
    Concat<L, R>: crate::expression::Expression,
    L: crate::expression::AppearsOnTable<QS>,
    R: crate::expression::AppearsOnTable<QS> {}impl_selectable_expression!(Concat<L, R>);
699
700impl<L, R, DB> QueryFragment<DB> for Concat<L, R>
701where
702    DB: Backend,
703    Self: QueryFragment<DB, DB::ConcatClause>,
704{
705    fn walk_ast<'b>(
706        &'b self,
707        pass: crate::query_builder::AstPass<'_, 'b, DB>,
708    ) -> crate::result::QueryResult<()> {
709        <Self as QueryFragment<DB, DB::ConcatClause>>::walk_ast(self, pass)
710    }
711}
712
713impl<L, R, DB> QueryFragment<DB, sql_dialect::concat_clause::ConcatWithPipesClause> for Concat<L, R>
714where
715    L: QueryFragment<DB>,
716    R: QueryFragment<DB>,
717    DB: Backend + SqlDialect<ConcatClause = sql_dialect::concat_clause::ConcatWithPipesClause>,
718{
719    fn walk_ast<'b>(
720        &'b self,
721        mut out: crate::query_builder::AstPass<'_, 'b, DB>,
722    ) -> crate::result::QueryResult<()> {
723        // Since popular MySQL scalability layer Vitess does not support pipes in query parsing
724        // CONCAT has been implemented separately for MySQL (see MysqlConcatClause)
725        out.push_sql("(");
726        self.left.walk_ast(out.reborrow())?;
727        out.push_sql(" || ");
728        self.right.walk_ast(out.reborrow())?;
729        out.push_sql(")");
730        Ok(())
731    }
732}
733
734// need an explicit impl here to control which types are allowed
735#[derive(
736    #[automatically_derived]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
    Like<T, U> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::debug_struct_field2_finish(f, "Like", "left",
            &self.left, "right", &&self.right)
    }
}Debug,
737    #[automatically_derived]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
    for Like<T, U> {
    #[inline]
    fn clone(&self) -> Like<T, U> {
        Like {
            left: ::core::clone::Clone::clone(&self.left),
            right: ::core::clone::Clone::clone(&self.right),
        }
    }
}Clone,
738    #[automatically_derived]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
    for Like<T, U> {
}Copy,
739    const _: () =
    {
        use diesel;
        #[allow(non_camel_case_types)]
        impl<T: diesel::query_builder::QueryId,
            U: diesel::query_builder::QueryId> diesel::query_builder::QueryId
            for Like<T, U> {
            type QueryId =
                Like<<T as diesel::query_builder::QueryId>::QueryId,
                <U as diesel::query_builder::QueryId>::QueryId>;
            const HAS_STATIC_QUERY_ID: bool =
                <T as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID &&
                        <U as diesel::query_builder::QueryId>::HAS_STATIC_QUERY_ID
                    && true;
            const IS_WINDOW_FUNCTION: bool =
                <T as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                        <U as diesel::query_builder::QueryId>::IS_WINDOW_FUNCTION ||
                    false;
        }
    };crate::query_builder::QueryId,
740    const _: () =
    {
        use diesel;
        use diesel::internal::derives::numeric_ops as ops;
        use diesel::expression::{Expression, AsExpression};
        use diesel::sql_types::ops::{Add, Sub, Mul, Div};
        use diesel::sql_types::{SqlType, SingleValue};
        impl<T, U, __Rhs> ::std::ops::Add<__Rhs> for Like<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Add,
            <<Self as Expression>::SqlType as Add>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Add>::Rhs> {
            type Output = ops::Add<Self, __Rhs::Expression>;
            fn add(self, rhs: __Rhs) -> Self::Output {
                ops::Add::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Sub<__Rhs> for Like<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Sub,
            <<Self as Expression>::SqlType as Sub>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Sub>::Rhs> {
            type Output = ops::Sub<Self, __Rhs::Expression>;
            fn sub(self, rhs: __Rhs) -> Self::Output {
                ops::Sub::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Mul<__Rhs> for Like<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Mul,
            <<Self as Expression>::SqlType as Mul>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Mul>::Rhs> {
            type Output = ops::Mul<Self, __Rhs::Expression>;
            fn mul(self, rhs: __Rhs) -> Self::Output {
                ops::Mul::new(self, rhs.as_expression())
            }
        }
        impl<T, U, __Rhs> ::std::ops::Div<__Rhs> for Like<T, U> where
            Self: Expression, Self: Expression,
            <Self as Expression>::SqlType: Div,
            <<Self as Expression>::SqlType as Div>::Rhs: SqlType +
            SingleValue,
            __Rhs: AsExpression<<<Self as Expression>::SqlType as Div>::Rhs> {
            type Output = ops::Div<Self, __Rhs::Expression>;
            fn div(self, rhs: __Rhs) -> Self::Output {
                ops::Div::new(self, rhs.as_expression())
            }
        }
    };crate::sql_types::DieselNumericOps,
741    const _: () =
    {
        use diesel;
        impl<T, U, __GroupByClause>
            diesel::expression::ValidGrouping<__GroupByClause> for Like<T, U>
            where T: diesel::expression::ValidGrouping<__GroupByClause>,
            U: diesel::expression::ValidGrouping<__GroupByClause>,
            <T as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate: diesel::expression::MixedAggregates<<U
            as
            diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>
            {
            type IsAggregate =
                <<T as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate
                as
                diesel::expression::MixedAggregates<<U as
                diesel::expression::ValidGrouping<__GroupByClause>>::IsAggregate>>::Output;
        }
    };crate::expression::ValidGrouping,
742)]
743#[doc(hidden)]
744pub struct Like<T, U> {
745    pub(crate) left: T,
746    pub(crate) right: U,
747}
748
749impl<T, U> Like<T, U> {
750    pub(crate) fn new(left: T, right: U) -> Self {
751        Like { left, right }
752    }
753}
754
755impl<T, U, QS> crate::expression::SelectableExpression<QS> for Like<T, U>
756where
757    Like<T, U>: crate::expression::AppearsOnTable<QS>,
758    T: crate::expression::SelectableExpression<QS>,
759    U: crate::expression::SelectableExpression<QS>,
760{
761}
762
763impl<T, U, QS> crate::expression::AppearsOnTable<QS> for Like<T, U>
764where
765    Like<T, U>: crate::expression::Expression,
766    T: crate::expression::AppearsOnTable<QS>,
767    U: crate::expression::AppearsOnTable<QS>,
768{
769}
770
771impl<T, U> crate::expression::Expression for Like<T, U>
772where
773    T: crate::expression::Expression,
774    U: crate::expression::Expression,
775    <T as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
776    <U as crate::expression::Expression>::SqlType: crate::sql_types::SqlType,
777    crate::sql_types::is_nullable::IsSqlTypeNullable<<T as crate::expression::Expression>::SqlType>:
778        crate::sql_types::OneIsNullable<
779            crate::sql_types::is_nullable::IsSqlTypeNullable<
780                <U as crate::expression::Expression>::SqlType,
781            >,
782        >,
783    crate::sql_types::is_nullable::IsOneNullable<
784        <T as crate::expression::Expression>::SqlType,
785        <U as crate::expression::Expression>::SqlType,
786    >: crate::sql_types::MaybeNullableType<crate::sql_types::Bool>,
787{
788    type SqlType = crate::sql_types::is_nullable::MaybeNullable<
789        crate::sql_types::is_nullable::IsOneNullable<
790            <T as crate::expression::Expression>::SqlType,
791            <U as crate::expression::Expression>::SqlType,
792        >,
793        crate::sql_types::Bool,
794    >;
795}
796
797impl<T, U, DB> crate::query_builder::QueryFragment<DB> for Like<T, U>
798where
799    T: crate::query_builder::QueryFragment<DB> + crate::Expression,
800    U: crate::query_builder::QueryFragment<DB>,
801    DB: crate::backend::Backend,
802    DB: LikeIsAllowedForType<T::SqlType>,
803{
804    fn walk_ast<'b>(
805        &'b self,
806        mut out: crate::query_builder::AstPass<'_, 'b, DB>,
807    ) -> crate::result::QueryResult<()> {
808        (self.left.walk_ast(out.reborrow())?);
809        (out.push_sql(" LIKE "));
810        (self.right.walk_ast(out.reborrow())?);
811        Ok(())
812    }
813}
814
815impl<S, T, U> crate::internal::operators_macro::FieldAliasMapper<S> for Like<T, U>
816where
817    S: crate::query_source::AliasSource,
818    T: crate::internal::operators_macro::FieldAliasMapper<S>,
819    U: crate::internal::operators_macro::FieldAliasMapper<S>,
820{
821    type Out = Like<
822        <T as crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
823        <U as crate::internal::operators_macro::FieldAliasMapper<S>>::Out,
824    >;
825    fn map(self, alias: &crate::query_source::Alias<S>) -> Self::Out {
826        Like {
827            left: self.left.map(alias),
828            right: self.right.map(alias),
829        }
830    }
831}
832
833#[diagnostic::on_unimplemented(
834    message = "cannot use the `LIKE` operator with expressions of the type `{ST}` for the backend `{Self}`",
835    note = "expressions of the type `diesel::sql_types::Text` and `diesel::sql_types::Nullable<Text>` are \n\
836            allowed for all backends"
837)]
838#[cfg_attr(
839    feature = "postgres_backend",
840    diagnostic::on_unimplemented(
841        note = "expressions of the type `diesel::sql_types::Binary` and `diesel::sql_types::Nullable<Binary>` are \n\
842            allowed for the PostgreSQL backend"
843    )
844)]
845pub trait LikeIsAllowedForType<ST>: Backend {}
846
847impl<DB> LikeIsAllowedForType<crate::sql_types::Text> for DB where DB: Backend {}
848
849#[cfg(feature = "postgres_backend")]
850impl LikeIsAllowedForType<crate::pg::sql_types::Citext> for crate::pg::Pg {}
851
852impl<T, DB> LikeIsAllowedForType<crate::sql_types::Nullable<T>> for DB where
853    DB: Backend + LikeIsAllowedForType<T>
854{
855}