@@ -330,8 +330,7 @@ void TTable::Join( TTable & t1, TTable & t2, EJoinKind joinKind, bool hasMoreLef
330
330
331
331
joinResults.reserve (3 * bucket1->TuplesNum );
332
332
333
- ui64 headerSize = JoinTable1->HeaderSize ;
334
- ui64 slotSize = headerSize;
333
+ ui64 slotSize = headerSize2;
335
334
336
335
ui64 avgStringsSize = ( 3 * (bucket2->KeyIntVals .size () - bucket2->TuplesNum * headerSize2) ) / ( 2 * bucket2->TuplesNum + 1 ) + 1 ;
337
336
@@ -417,14 +416,15 @@ void TTable::Join( TTable & t1, TTable & t2, EJoinKind joinKind, bool hasMoreLef
417
416
auto slotIt = joinSlots.begin () + slotNum * slotSize;
418
417
while (*slotIt != 0 && slotIt != joinSlots.end ())
419
418
{
419
+
420
420
bool matchFound = false ;
421
- if (keysValSize <= slotSize && !JoinTable1->NumberOfKeyIColumns ) {
421
+ if ((( keysValSize - nullsSize1) <= ( slotSize - nullsSize2)) && !JoinTable1->NumberOfKeyIColumns ) {
422
422
if (std::equal (it1 + keyIntOffset1, it1 + keysValSize, slotIt + keyIntOffset2)) {
423
423
matchFound = true ;
424
424
}
425
425
}
426
426
427
- if (keysValSize > slotSize && !JoinTable1->NumberOfKeyIColumns ) {
427
+ if ((( keysValSize - nullsSize1) > ( slotSize - nullsSize2)) && !JoinTable1->NumberOfKeyIColumns ) {
428
428
if (std::equal (it1 + keyIntOffset1, it1 + headerSize1, slotIt + keyIntOffset2)) {
429
429
ui64 stringsPos = *(slotIt + headerSize2);
430
430
ui64 stringsSize = *(it1 + headerSize1 - 1 );
@@ -434,6 +434,7 @@ void TTable::Join( TTable & t1, TTable & t2, EJoinKind joinKind, bool hasMoreLef
434
434
}
435
435
}
436
436
437
+
437
438
if (JoinTable1->NumberOfKeyIColumns )
438
439
{
439
440
bool headerMatch = false ;
@@ -481,29 +482,29 @@ void TTable::Join( TTable & t1, TTable & t2, EJoinKind joinKind, bool hasMoreLef
481
482
matchFound = true ;
482
483
}
483
484
484
- }
485
+ }
485
486
486
- if (matchFound)
487
+ if (matchFound)
488
+ {
489
+ JoinTuplesIds joinIds;
490
+ joinIds.id1 = tuple1Idx;
491
+ joinIds.id2 = slotToIdx[(slotIt - joinSlots.begin ()) / slotSize];
492
+ if (JoinTable2->TableBuckets [bucket].TuplesNum > JoinTable1->TableBuckets [bucket].TuplesNum )
487
493
{
488
- JoinTuplesIds joinIds;
489
- joinIds.id1 = tuple1Idx;
490
- joinIds.id2 = slotToIdx[(slotIt - joinSlots.begin ()) / slotSize];
491
- if (JoinTable2->TableBuckets [bucket].TuplesNum > JoinTable1->TableBuckets [bucket].TuplesNum )
492
- {
493
- std::swap (joinIds.id1 , joinIds.id2 );
494
- }
495
- joinResults.emplace_back (joinIds);
494
+ std::swap (joinIds.id1 , joinIds.id2 );
496
495
}
497
-
498
- slotIt += slotSize;
499
- if (slotIt == joinSlots.end ())
500
- slotIt = joinSlots.begin ();
496
+ joinResults.emplace_back (joinIds);
501
497
}
502
498
499
+ slotIt += slotSize;
500
+ if (slotIt == joinSlots.end ())
501
+ slotIt = joinSlots.begin ();
502
+ }
503
503
504
504
it1 += keysValSize;
505
505
tuple1Idx ++;
506
506
}
507
+
507
508
std::sort (joinResults.begin (), joinResults.end (), [](JoinTuplesIds a, JoinTuplesIds b)
508
509
{
509
510
if (a.id1 < b.id1 ) return true ;
0 commit comments