@@ -644,10 +644,8 @@ async fn join_right_one() -> Result<()> {
644644 Ok ( ( ) )
645645}
646646
647-
648647#[ tokio:: test]
649648async fn join_right_different_columns_count_with_filter ( ) -> Result < ( ) > {
650-
651649 // select *
652650 // from t1
653651 // right join t2 on t1.b1 = t2.b1 and t1.a1 > t2.a2
@@ -707,7 +705,6 @@ async fn join_right_different_columns_count_with_filter() -> Result<()> {
707705
708706#[ tokio:: test]
709707async fn join_left_different_columns_count_with_filter ( ) -> Result < ( ) > {
710-
711708 // select *
712709 // from t2
713710 // left join t1 on t2.b1 = t1.b1 and t2.a2 > t1.a1
@@ -765,6 +762,128 @@ async fn join_left_different_columns_count_with_filter() -> Result<()> {
765762 Ok ( ( ) )
766763}
767764
765+ #[ tokio:: test]
766+ async fn join_left_mark_different_columns_count_with_filter ( ) -> Result < ( ) > {
767+ // select *
768+ // from t2
769+ // left mark join t1 on t2.b1 = t1.b1 and t2.a2 > t1.a1
770+
771+ let left = build_table_two_cols (
772+ ( "a2" , & vec ! [ 10 , 20 , 30 ] ) ,
773+ ( "b1" , & vec ! [ 4 , 5 , 6 ] ) , // 6 does not exist on the right
774+ ) ;
775+
776+ let right = build_table (
777+ ( "a1" , & vec ! [ 1 , 21 , 3 ] ) , // 20(t2.a2) > 1(t1.a1)
778+ ( "b1" , & vec ! [ 4 , 5 , 7 ] ) ,
779+ ( "c1" , & vec ! [ 7 , 8 , 9 ] ) ,
780+ ) ;
781+
782+ let on = vec ! [ (
783+ Arc :: new( Column :: new_with_schema( "b1" , & left. schema( ) ) ?) as _,
784+ Arc :: new( Column :: new_with_schema( "b1" , & right. schema( ) ) ?) as _,
785+ ) ] ;
786+
787+ let filter = JoinFilter :: new (
788+ Arc :: new ( BinaryExpr :: new (
789+ Arc :: new ( Column :: new ( "a2" , 0 ) ) ,
790+ Operator :: Gt ,
791+ Arc :: new ( Column :: new ( "a1" , 1 ) ) ,
792+ ) ) ,
793+ vec ! [
794+ ColumnIndex {
795+ index: 0 ,
796+ side: JoinSide :: Left ,
797+ } ,
798+ ColumnIndex {
799+ index: 0 ,
800+ side: JoinSide :: Right ,
801+ } ,
802+ ] ,
803+ Arc :: new ( Schema :: new ( vec ! [
804+ Field :: new( "a2" , DataType :: Int32 , true ) ,
805+ Field :: new( "a1" , DataType :: Int32 , true ) ,
806+ ] ) ) ,
807+ ) ;
808+
809+ let ( _, batches) =
810+ join_collect_with_filter ( left, right, on, filter, LeftMark ) . await ?;
811+
812+ // The output order is important as SMJ preserves sortedness
813+ // LeftMark returns all left rows with a boolean mark column
814+ assert_snapshot ! ( batches_to_string( & batches) , @r#"
815+ +----+----+-------+
816+ | a2 | b1 | mark |
817+ +----+----+-------+
818+ | 10 | 4 | true |
819+ | 20 | 5 | false |
820+ | 30 | 6 | false |
821+ +----+----+-------+
822+ "# ) ;
823+ Ok ( ( ) )
824+ }
825+
826+ #[ tokio:: test]
827+ async fn join_right_mark_different_columns_count_with_filter ( ) -> Result < ( ) > {
828+ // select *
829+ // from t1
830+ // right mark join t2 on t1.b1 = t2.b1 and t1.a1 > t2.a2
831+
832+ let left = build_table (
833+ ( "a1" , & vec ! [ 1 , 21 , 3 ] ) , // 21(t1.a1) > 20(t2.a2)
834+ ( "b1" , & vec ! [ 4 , 5 , 7 ] ) ,
835+ ( "c1" , & vec ! [ 7 , 8 , 9 ] ) ,
836+ ) ;
837+
838+ let right = build_table_two_cols (
839+ ( "a2" , & vec ! [ 10 , 20 , 30 ] ) ,
840+ ( "b1" , & vec ! [ 4 , 5 , 6 ] ) , // 6 does not exist on the left
841+ ) ;
842+
843+ let on = vec ! [ (
844+ Arc :: new( Column :: new_with_schema( "b1" , & left. schema( ) ) ?) as _,
845+ Arc :: new( Column :: new_with_schema( "b1" , & right. schema( ) ) ?) as _,
846+ ) ] ;
847+
848+ let filter = JoinFilter :: new (
849+ Arc :: new ( BinaryExpr :: new (
850+ Arc :: new ( Column :: new ( "a1" , 0 ) ) ,
851+ Operator :: Gt ,
852+ Arc :: new ( Column :: new ( "a2" , 1 ) ) ,
853+ ) ) ,
854+ vec ! [
855+ ColumnIndex {
856+ index: 0 ,
857+ side: JoinSide :: Left ,
858+ } ,
859+ ColumnIndex {
860+ index: 0 ,
861+ side: JoinSide :: Right ,
862+ } ,
863+ ] ,
864+ Arc :: new ( Schema :: new ( vec ! [
865+ Field :: new( "a1" , DataType :: Int32 , true ) ,
866+ Field :: new( "a2" , DataType :: Int32 , true ) ,
867+ ] ) ) ,
868+ ) ;
869+
870+ let ( _, batches) =
871+ join_collect_with_filter ( left, right, on, filter, RightMark ) . await ?;
872+
873+ // The output order is important as SMJ preserves sortedness
874+ // RightMark returns all right rows with a boolean mark column
875+ assert_snapshot ! ( batches_to_string( & batches) , @r#"
876+ +----+----+-------+
877+ | a2 | b1 | mark |
878+ +----+----+-------+
879+ | 10 | 4 | false |
880+ | 20 | 5 | true |
881+ | 30 | 6 | false |
882+ +----+----+-------+
883+ "# ) ;
884+ Ok ( ( ) )
885+ }
886+
768887#[ tokio:: test]
769888async fn join_full_one ( ) -> Result < ( ) > {
770889 let left = build_table (
0 commit comments