@@ -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,106 @@ 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
+
663
+ impl < T , U > Like < T , U > {
664
+ pub ( crate ) fn new ( left : T , right : U ) -> Self {
665
+ Like { left, right }
666
+ }
667
+ }
668
+
669
+ impl < T , U , QS > crate :: expression:: SelectableExpression < QS > for Like < T , U >
670
+ where
671
+ Like < T , U > : crate :: expression:: AppearsOnTable < QS > ,
672
+ T : crate :: expression:: SelectableExpression < QS > ,
673
+ U : crate :: expression:: SelectableExpression < QS > ,
674
+ {
675
+ }
676
+
677
+ impl < T , U , QS > crate :: expression:: AppearsOnTable < QS > for Like < T , U >
678
+ where
679
+ Like < T , U > : crate :: expression:: Expression ,
680
+ T : crate :: expression:: AppearsOnTable < QS > ,
681
+ U : crate :: expression:: AppearsOnTable < QS > ,
682
+ {
683
+ }
684
+
685
+ impl < T , U > crate :: expression:: Expression for Like < T , U >
686
+ where
687
+ T : crate :: expression:: Expression ,
688
+ U : crate :: expression:: Expression ,
689
+ <T as crate :: expression:: Expression >:: SqlType : crate :: sql_types:: SqlType ,
690
+ <U as crate :: expression:: Expression >:: SqlType : crate :: sql_types:: SqlType ,
691
+ crate :: sql_types:: is_nullable:: IsSqlTypeNullable < <T as crate :: expression:: Expression >:: SqlType > :
692
+ crate :: sql_types:: OneIsNullable <
693
+ crate :: sql_types:: is_nullable:: IsSqlTypeNullable <
694
+ <U as crate :: expression:: Expression >:: SqlType ,
695
+ > ,
696
+ > ,
697
+ crate :: sql_types:: is_nullable:: IsOneNullable <
698
+ <T as crate :: expression:: Expression >:: SqlType ,
699
+ <U as crate :: expression:: Expression >:: SqlType ,
700
+ > : crate :: sql_types:: MaybeNullableType < crate :: sql_types:: Bool > ,
701
+ {
702
+ type SqlType = crate :: sql_types:: is_nullable:: MaybeNullable <
703
+ crate :: sql_types:: is_nullable:: IsOneNullable <
704
+ <T as crate :: expression:: Expression >:: SqlType ,
705
+ <U as crate :: expression:: Expression >:: SqlType ,
706
+ > ,
707
+ crate :: sql_types:: Bool ,
708
+ > ;
709
+ }
710
+
711
+ impl < T , U , DB > crate :: query_builder:: QueryFragment < DB > for Like < T , U >
712
+ where
713
+ T : crate :: query_builder:: QueryFragment < DB > + crate :: Expression ,
714
+ U : crate :: query_builder:: QueryFragment < DB > ,
715
+ DB : crate :: backend:: Backend ,
716
+ DB : LikeIsAllowedForType < T :: SqlType > ,
717
+ {
718
+ fn walk_ast < ' b > (
719
+ & ' b self ,
720
+ mut out : crate :: query_builder:: AstPass < ' _ , ' b , DB > ,
721
+ ) -> crate :: result:: QueryResult < ( ) > {
722
+ ( self . left . walk_ast ( out. reborrow ( ) ) ?) ;
723
+ ( out. push_sql ( " LIKE " ) ) ;
724
+ ( self . right . walk_ast ( out. reborrow ( ) ) ?) ;
725
+ Ok ( ( ) )
726
+ }
727
+ }
728
+
729
+ impl < S , T , U > crate :: internal:: operators_macro:: FieldAliasMapper < S > for Like < T , U >
730
+ where
731
+ S : crate :: query_source:: AliasSource ,
732
+ T : crate :: internal:: operators_macro:: FieldAliasMapper < S > ,
733
+ U : crate :: internal:: operators_macro:: FieldAliasMapper < S > ,
734
+ {
735
+ type Out = Like <
736
+ <T as crate :: internal:: operators_macro:: FieldAliasMapper < S > >:: Out ,
737
+ <U as crate :: internal:: operators_macro:: FieldAliasMapper < S > >:: Out ,
738
+ > ;
739
+ fn map ( self , alias : & crate :: query_source:: Alias < S > ) -> Self :: Out {
740
+ Like {
741
+ left : self . left . map ( alias) ,
742
+ right : self . right . map ( alias) ,
743
+ }
744
+ }
745
+ }
746
+
747
+ pub trait LikeIsAllowedForType < ST > : Backend { }
748
+
749
+ impl < DB > LikeIsAllowedForType < crate :: sql_types:: Text > for DB where DB : Backend { }
0 commit comments