| 220 | } |
| 221 | |
| 222 | void HashBuild::setupTable() { |
| 223 | BOLT_CHECK_NULL(table_); |
| 224 | |
| 225 | const auto numKeys = keyChannels_.size(); |
| 226 | std::vector<std::unique_ptr<VectorHasher>> keyHashers; |
| 227 | keyHashers.reserve(numKeys); |
| 228 | for (vector_size_t i = 0; i < numKeys; ++i) { |
| 229 | keyHashers.emplace_back( |
| 230 | VectorHasher::create(tableType_->childAt(i), keyChannels_[i])); |
| 231 | } |
| 232 | |
| 233 | const auto numDependents = tableType_->size() - numKeys; |
| 234 | std::vector<TypePtr> dependentTypes; |
| 235 | dependentTypes.reserve(numDependents); |
| 236 | for (int i = numKeys; i < tableType_->size(); ++i) { |
| 237 | dependentTypes.emplace_back(tableType_->childAt(i)); |
| 238 | } |
| 239 | auto& queryConfig = operatorCtx_->driverCtx()->queryConfig(); |
| 240 | if (joinNode_->isRightJoin() || joinNode_->isFullJoin() || |
| 241 | joinNode_->isRightSemiProjectJoin()) { |
| 242 | // Do not ignore null keys. |
| 243 | table_ = HashTable<false>::createForJoin( |
| 244 | std::move(keyHashers), |
| 245 | dependentTypes, |
| 246 | isDREnabled_ ? false : true, // allowDuplicates |
| 247 | true, // hasProbedFlag |
| 248 | isDREnabled_ ? BaseHashTable::HashMode::kHash |
| 249 | : BaseHashTable::HashMode::kArray, |
| 250 | queryConfig.minTableRowsForParallelJoinBuild(), |
| 251 | pool(), |
| 252 | queryConfig.enableJitRowEqVectors(), |
| 253 | hybridJoin_); |
| 254 | } else { |
| 255 | // Right semi join needs to tag build rows that were probed. |
| 256 | const bool needProbedFlag = joinNode_->isRightSemiFilterJoin(); |
| 257 | if (isLeftNullAwareJoinWithFilter(joinNode_)) { |
| 258 | // We need to check null key rows in build side in case of null-aware anti |
| 259 | // or left semi project join with filter set. |
| 260 | table_ = HashTable<false>::createForJoin( |
| 261 | std::move(keyHashers), |
| 262 | dependentTypes, |
| 263 | isDREnabled_ ? false : !dropDuplicates_, // allowDuplicates |
| 264 | needProbedFlag, // hasProbedFlag |
| 265 | isDREnabled_ ? BaseHashTable::HashMode::kHash |
| 266 | : BaseHashTable::HashMode::kArray, |
| 267 | queryConfig.minTableRowsForParallelJoinBuild(), |
| 268 | pool(), |
| 269 | queryConfig.enableJitRowEqVectors(), |
| 270 | hybridJoin_); |
| 271 | } else { |
| 272 | // Ignore null keys |
| 273 | table_ = HashTable<true>::createForJoin( |
| 274 | std::move(keyHashers), |
| 275 | dependentTypes, |
| 276 | isDREnabled_ ? false : !dropDuplicates_, // allowDuplicates |
| 277 | needProbedFlag, // hasProbedFlag |
| 278 | isDREnabled_ ? BaseHashTable::HashMode::kHash |
| 279 | : BaseHashTable::HashMode::kArray, |
nothing calls this directly
no test coverage detected