@@ -529,7 +529,6 @@ infix_operator!(Escape, " ESCAPE ");
529
529
infix_operator ! ( Eq , " = " ) ;
530
530
infix_operator ! ( Gt , " > " ) ;
531
531
infix_operator ! ( GtEq , " >= " ) ;
532
- infix_operator ! ( Like , " LIKE " ) ;
533
532
infix_operator ! ( Lt , " < " ) ;
534
533
infix_operator ! ( LtEq , " <= " ) ;
535
534
infix_operator ! ( NotEq , " != " ) ;
@@ -645,3 +644,104 @@ where
645
644
Ok ( ( ) )
646
645
}
647
646
}
647
+
648
+ // need an explicit impl here to control which types are allowed
649
+ #[ derive(
650
+ Debug ,
651
+ Clone ,
652
+ Copy ,
653
+ crate :: query_builder:: QueryId ,
654
+ crate :: sql_types:: DieselNumericOps ,
655
+ crate :: expression:: ValidGrouping ,
656
+ ) ]
657
+ #[ doc( hidden) ]
658
+ pub struct Like < T , U > {
659
+ pub ( crate ) left : T ,
660
+ pub ( crate ) right : U ,
661
+ }
662
+ impl < T , U > Like < T , U > {
663
+ pub ( crate ) fn new ( left : T , right : U ) -> Self {
664
+ Like { left, right }
665
+ }
666
+ }
667
+ impl < T , U , QS > crate :: expression:: SelectableExpression < QS > for Like < T , U >
668
+ where
669
+ Like < T , U > : crate :: expression:: AppearsOnTable < QS > ,
670
+ T : crate :: expression:: SelectableExpression < QS > ,
671
+ U : crate :: expression:: SelectableExpression < QS > ,
672
+ {
673
+ }
674
+
675
+ impl < T , U , QS > crate :: expression:: AppearsOnTable < QS > for Like < T , U >
676
+ where
677
+ Like < T , U > : crate :: expression:: Expression ,
678
+ T : crate :: expression:: AppearsOnTable < QS > ,
679
+ U : crate :: expression:: AppearsOnTable < QS > ,
680
+ {
681
+ }
682
+
683
+ impl < T , U > crate :: expression:: Expression for Like < T , U >
684
+ where
685
+ T : crate :: expression:: Expression ,
686
+ U : crate :: expression:: Expression ,
687
+ <T as crate :: expression:: Expression >:: SqlType : crate :: sql_types:: SqlType ,
688
+ <U as crate :: expression:: Expression >:: SqlType : crate :: sql_types:: SqlType ,
689
+ crate :: sql_types:: is_nullable:: IsSqlTypeNullable < <T as crate :: expression:: Expression >:: SqlType > :
690
+ crate :: sql_types:: OneIsNullable <
691
+ crate :: sql_types:: is_nullable:: IsSqlTypeNullable <
692
+ <U as crate :: expression:: Expression >:: SqlType ,
693
+ > ,
694
+ > ,
695
+ crate :: sql_types:: is_nullable:: IsOneNullable <
696
+ <T as crate :: expression:: Expression >:: SqlType ,
697
+ <U as crate :: expression:: Expression >:: SqlType ,
698
+ > : crate :: sql_types:: MaybeNullableType < crate :: sql_types:: Bool > ,
699
+ {
700
+ type SqlType = crate :: sql_types:: is_nullable:: MaybeNullable <
701
+ crate :: sql_types:: is_nullable:: IsOneNullable <
702
+ <T as crate :: expression:: Expression >:: SqlType ,
703
+ <U as crate :: expression:: Expression >:: SqlType ,
704
+ > ,
705
+ crate :: sql_types:: Bool ,
706
+ > ;
707
+ }
708
+
709
+ impl < T , U , DB > crate :: query_builder:: QueryFragment < DB > for Like < T , U >
710
+ where
711
+ T : crate :: query_builder:: QueryFragment < DB > + crate :: Expression ,
712
+ U : crate :: query_builder:: QueryFragment < DB > ,
713
+ DB : crate :: backend:: Backend ,
714
+ DB : LikeIsAllowedForType < T :: SqlType > ,
715
+ {
716
+ fn walk_ast < ' b > (
717
+ & ' b self ,
718
+ mut out : crate :: query_builder:: AstPass < ' _ , ' b , DB > ,
719
+ ) -> crate :: result:: QueryResult < ( ) > {
720
+ ( self . left . walk_ast ( out. reborrow ( ) ) ?) ;
721
+ ( out. push_sql ( " LIKE " ) ) ;
722
+ ( self . right . walk_ast ( out. reborrow ( ) ) ?) ;
723
+ Ok ( ( ) )
724
+ }
725
+ }
726
+
727
+ impl < S , T , U > crate :: internal:: operators_macro:: FieldAliasMapper < S > for Like < T , U >
728
+ where
729
+ S : crate :: query_source:: AliasSource ,
730
+ T : crate :: internal:: operators_macro:: FieldAliasMapper < S > ,
731
+ U : crate :: internal:: operators_macro:: FieldAliasMapper < S > ,
732
+ {
733
+ type Out = Like <
734
+ <T as crate :: internal:: operators_macro:: FieldAliasMapper < S > >:: Out ,
735
+ <U as crate :: internal:: operators_macro:: FieldAliasMapper < S > >:: Out ,
736
+ > ;
737
+ fn map ( self , alias : & crate :: query_source:: Alias < S > ) -> Self :: Out {
738
+ Like {
739
+ left : self . left . map ( alias) ,
740
+ right : self . right . map ( alias) ,
741
+ }
742
+ }
743
+ }
744
+
745
+ pub trait LikeIsAllowedForType < ST > : Backend { }
746
+
747
+ impl < DB > LikeIsAllowedForType < crate :: sql_types:: Text > for DB where DB : Backend { }
0 commit comments