| 2111 | |
| 2112 | template <> |
| 2113 | int32_t HashTable<false>::listNullKeyRows( |
| 2114 | NullKeyRowsIterator* iter, |
| 2115 | int32_t maxRows, |
| 2116 | char** rows) { |
| 2117 | if (!iter->initialized) { |
| 2118 | BOLT_CHECK_GT(nextOffset_, 0); |
| 2119 | BOLT_CHECK_EQ(hashers_.size(), 1); |
| 2120 | HashLookup lookup(hashers_, enableJit_); |
| 2121 | if (hashMode_ == HashMode::kHash) { |
| 2122 | lookup.hashes.push_back(VectorHasher::kNullHash); |
| 2123 | } else { |
| 2124 | lookup.hashes.push_back(0); |
| 2125 | } |
| 2126 | lookup.rows.push_back(0); |
| 2127 | lookup.hits.resize(1); |
| 2128 | lookup.reset(1); |
| 2129 | joinProbe(lookup); |
| 2130 | iter->nextHit = lookup.hits[0]; |
| 2131 | iter->initialized = true; |
| 2132 | } |
| 2133 | size_t numRows = 0; |
| 2134 | char* hit = iter->nextHit; |
| 2135 | while (numRows < maxRows && hit) { |
| 2136 | rows[numRows++] = hit; |
| 2137 | hit = nextRow(hit); |
| 2138 | } |
| 2139 | iter->nextHit = hit; |
| 2140 | return numRows; |
| 2141 | } |
| 2142 | |
| 2143 | template <> |
| 2144 | int32_t |