| 160 | } |
| 161 | |
| 162 | void VectorVersionInfo::getSelVectorForScan(const transaction_t startTS, |
| 163 | const transaction_t transactionID, SelectionVector& selVector, const row_idx_t startRow, |
| 164 | const row_idx_t numRows, sel_t startOutputPos) const { |
| 165 | auto numSelected = selVector.getSelSize(); |
| 166 | if (deletionStatus == DeletionStatus::NO_DELETED && |
| 167 | insertionStatus == InsertionStatus::ALWAYS_INSERTED) { |
| 168 | if (selVector.isUnfiltered()) { |
| 169 | selVector.setSelSize(selVector.getSelSize() + numRows); |
| 170 | } else { |
| 171 | for (auto i = 0u; i < numRows; i++) { |
| 172 | selVector.getMutableBuffer()[numSelected++] = startOutputPos + i; |
| 173 | } |
| 174 | selVector.setToFiltered(numSelected); |
| 175 | } |
| 176 | } else if (insertionStatus != InsertionStatus::NO_INSERTED) { |
| 177 | // If there were no deleted values up to this point the selVector may be unfiltered but have |
| 178 | // non-zero size, and the mutable buffer may have arbitrary contents |
| 179 | if (selVector.isUnfiltered()) { |
| 180 | selVector.makeDynamic(); |
| 181 | } |
| 182 | for (auto i = 0u; i < numRows; i++) { |
| 183 | if (const auto rowIdx = startRow + i; isInserted(startTS, transactionID, rowIdx) && |
| 184 | !isDeleted(startTS, transactionID, rowIdx)) { |
| 185 | selVector.getMutableBuffer()[numSelected++] = startOutputPos + i; |
| 186 | } |
| 187 | } |
| 188 | selVector.setToFiltered(numSelected); |
| 189 | } |
| 190 | } |
| 191 | |
| 192 | bool VectorVersionInfo::isDeleted(const transaction_t startTS, const transaction_t transactionID, |
| 193 | const row_idx_t rowIdx) const { |
no test coverage detected