@@ -569,5 +569,58 @@ TEST_F(NestedLoopJoinTest, outputOrder) {
569
569
assertEqualVectors (expectedLeft, results);
570
570
}
571
571
572
+ TEST_F (NestedLoopJoinTest, mergeBuildVectors) {
573
+ const std::vector<RowVectorPtr> buildVectors = {
574
+ makeRowVector ({makeFlatVector<int64_t >({1 , 2 })}),
575
+ makeRowVector ({makeFlatVector<int64_t >({3 , 4 })}),
576
+ makeRowVector (
577
+ {makeFlatVector<int64_t >(20 , [](auto i) { return 5 + i; })}),
578
+ makeRowVector (
579
+ {makeFlatVector<int64_t >(20 , [](auto i) { return 25 + i; })}),
580
+ makeRowVector ({makeFlatVector<int64_t >({45 , 46 })}),
581
+ };
582
+ const std::vector<RowVectorPtr> probeVectors = {
583
+ makeRowVector ({makeFlatVector<int64_t >({1 , 2 })}),
584
+ };
585
+ auto planNodeIdGenerator = std::make_shared<core::PlanNodeIdGenerator>();
586
+ CursorParameters params;
587
+ params.planNode = PlanBuilder (planNodeIdGenerator)
588
+ .values (probeVectors)
589
+ .nestedLoopJoin (
590
+ PlanBuilder (planNodeIdGenerator)
591
+ .values (buildVectors)
592
+ .project ({" c0 as r0" })
593
+ .planNode (),
594
+ {" c0" , " r0" })
595
+ .planNode ();
596
+ params.queryConfigs [core::QueryConfig::kMaxOutputBatchRows ] = " 10" ;
597
+ auto cursor = TaskCursor::create (params);
598
+ // Expect the first 2 build side vectors are merged together since they are
599
+ // under the limit after merge. Others are left along.
600
+ for (int i = 0 ; i < 2 ; ++i) {
601
+ auto makeExpected = [&](vector_size_t size, vector_size_t buildOffset) {
602
+ return makeRowVector ({
603
+ makeConstant<int64_t >(1 + i, size),
604
+ makeFlatVector<int64_t >(
605
+ size, [&](auto i) { return buildOffset + i; }),
606
+ });
607
+ };
608
+ ASSERT_TRUE (cursor->moveNext ());
609
+ ASSERT_EQ (cursor->current ()->size (), 4 );
610
+ assertEqualVectors (makeExpected (4 , 1 ), cursor->current ());
611
+ ASSERT_TRUE (cursor->moveNext ());
612
+ ASSERT_EQ (cursor->current ()->size (), 20 );
613
+ assertEqualVectors (makeExpected (20 , 5 ), cursor->current ());
614
+ ASSERT_TRUE (cursor->moveNext ());
615
+ ASSERT_EQ (cursor->current ()->size (), 20 );
616
+ assertEqualVectors (makeExpected (20 , 25 ), cursor->current ());
617
+ ASSERT_TRUE (cursor->moveNext ());
618
+ ASSERT_EQ (cursor->current ()->size (), 2 );
619
+ assertEqualVectors (makeExpected (2 , 45 ), cursor->current ());
620
+ }
621
+ ASSERT_FALSE (cursor->moveNext ());
622
+ ASSERT_TRUE (waitForTaskCompletion (cursor->task ().get ()));
623
+ }
624
+
572
625
} // namespace
573
626
} // namespace facebook::velox::exec::test
0 commit comments