diff options
author | Andrey Kulaga <aakulaga@ydb.tech> | 2024-02-05 10:01:55 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-05 10:01:55 +0300 |
commit | a89c74a08db957075db4d942ce9f4199938c759c (patch) | |
tree | 47a7ddd9cf69d3d7bc2abb1c79a761018da9a980 | |
parent | 432eaac524246d6f09379fb4398e4c8c375efb09 (diff) | |
download | ydb-a89c74a08db957075db4d942ce9f4199938c759c.tar.gz |
Fix for unequal nulls bitmap size YQL-17564 (#1570)
-rw-r--r-- | ydb/library/yql/minikql/comp_nodes/mkql_grace_join_imp.cpp | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/ydb/library/yql/minikql/comp_nodes/mkql_grace_join_imp.cpp b/ydb/library/yql/minikql/comp_nodes/mkql_grace_join_imp.cpp index 51f78cb971d..1b66eba53ac 100644 --- a/ydb/library/yql/minikql/comp_nodes/mkql_grace_join_imp.cpp +++ b/ydb/library/yql/minikql/comp_nodes/mkql_grace_join_imp.cpp @@ -330,8 +330,7 @@ void TTable::Join( TTable & t1, TTable & t2, EJoinKind joinKind, bool hasMoreLef joinResults.reserve(3 * bucket1->TuplesNum ); - ui64 headerSize = JoinTable1->HeaderSize; - ui64 slotSize = headerSize; + ui64 slotSize = headerSize2; ui64 avgStringsSize = ( 3 * (bucket2->KeyIntVals.size() - bucket2->TuplesNum * headerSize2) ) / ( 2 * bucket2->TuplesNum + 1) + 1; @@ -417,14 +416,15 @@ void TTable::Join( TTable & t1, TTable & t2, EJoinKind joinKind, bool hasMoreLef auto slotIt = joinSlots.begin() + slotNum * slotSize; while (*slotIt != 0 && slotIt != joinSlots.end()) { + bool matchFound = false; - if (keysValSize <= slotSize && !JoinTable1->NumberOfKeyIColumns ) { + if (((keysValSize - nullsSize1) <= (slotSize - nullsSize2)) && !JoinTable1->NumberOfKeyIColumns ) { if (std::equal(it1 + keyIntOffset1, it1 + keysValSize, slotIt + keyIntOffset2)) { matchFound = true; } } - if (keysValSize > slotSize && !JoinTable1->NumberOfKeyIColumns ) { + if (((keysValSize - nullsSize1) > (slotSize - nullsSize2)) && !JoinTable1->NumberOfKeyIColumns ) { if (std::equal(it1 + keyIntOffset1, it1 + headerSize1, slotIt + keyIntOffset2)) { ui64 stringsPos = *(slotIt + headerSize2); ui64 stringsSize = *(it1 + headerSize1 - 1); @@ -434,6 +434,7 @@ void TTable::Join( TTable & t1, TTable & t2, EJoinKind joinKind, bool hasMoreLef } } + if (JoinTable1->NumberOfKeyIColumns) { bool headerMatch = false; @@ -481,29 +482,29 @@ void TTable::Join( TTable & t1, TTable & t2, EJoinKind joinKind, bool hasMoreLef matchFound = true; } - } + } - if (matchFound) + if (matchFound) + { + JoinTuplesIds joinIds; + joinIds.id1 = tuple1Idx; + joinIds.id2 = slotToIdx[(slotIt - joinSlots.begin()) / slotSize]; + if (JoinTable2->TableBuckets[bucket].TuplesNum > JoinTable1->TableBuckets[bucket].TuplesNum) { - JoinTuplesIds joinIds; - joinIds.id1 = tuple1Idx; - joinIds.id2 = slotToIdx[(slotIt - joinSlots.begin()) / slotSize]; - if (JoinTable2->TableBuckets[bucket].TuplesNum > JoinTable1->TableBuckets[bucket].TuplesNum) - { - std::swap(joinIds.id1, joinIds.id2); - } - joinResults.emplace_back(joinIds); + std::swap(joinIds.id1, joinIds.id2); } - - slotIt += slotSize; - if (slotIt == joinSlots.end()) - slotIt = joinSlots.begin(); + joinResults.emplace_back(joinIds); } + slotIt += slotSize; + if (slotIt == joinSlots.end()) + slotIt = joinSlots.begin(); + } it1 += keysValSize; tuple1Idx ++; } + std::sort(joinResults.begin(), joinResults.end(), [](JoinTuplesIds a, JoinTuplesIds b) { if (a.id1 < b.id1) return true; |