| 552 | } |
| 553 | |
| 554 | void testCopyFromAllNulls( |
| 555 | const VectorPtr& vector, |
| 556 | const VectorPtr& allNullSource) { |
| 557 | SCOPED_TRACE(vector->toString()); |
| 558 | |
| 559 | const vector_size_t size = 1'000; |
| 560 | |
| 561 | ASSERT_GE(vector->size(), size); |
| 562 | |
| 563 | // Save a copy of the 'vector' to compare results after copy. |
| 564 | auto vectorCopy = BaseVector::copy(*vector); |
| 565 | |
| 566 | // Copy every 3-rd row. |
| 567 | SelectivityVector rowsToCopy(size, false); |
| 568 | for (auto i = 0; i < size; i += 3) { |
| 569 | rowsToCopy.setValid(i, true); |
| 570 | } |
| 571 | rowsToCopy.updateBounds(); |
| 572 | |
| 573 | SelectivityVector rowsToKeep(size); |
| 574 | rowsToKeep.deselect(rowsToCopy); |
| 575 | |
| 576 | // Copy from row N to N - 10 for N >= 0 and from row N to N for N < 10; |
| 577 | std::vector<vector_size_t> toSourceRow(size); |
| 578 | for (auto i = 0; i < size; i += 3) { |
| 579 | if (i < 10) { |
| 580 | toSourceRow[i] = i; |
| 581 | } else { |
| 582 | toSourceRow[i] = i - 10; |
| 583 | } |
| 584 | } |
| 585 | for (auto canCopyAll : {false, true}) { |
| 586 | vector->copy( |
| 587 | allNullSource.get(), rowsToCopy, toSourceRow.data(), canCopyAll); |
| 588 | |
| 589 | rowsToCopy.applyToSelected([&](auto row) { |
| 590 | EXPECT_TRUE(vector->isNullAt(row)) << "at " << row; |
| 591 | }); |
| 592 | |
| 593 | rowsToKeep.applyToSelected([&](vector_size_t row) { |
| 594 | EXPECT_FALSE(vector->isNullAt(row)); |
| 595 | EXPECT_TRUE(vector->equalValueAt(vectorCopy.get(), row, row)) |
| 596 | << "at " << row << ": " << vector->toString(row) << " vs. " |
| 597 | << vectorCopy->toString(row); |
| 598 | }); |
| 599 | } |
| 600 | } |
| 601 | |
| 602 | void testCopySingleRangeFromAllNulls( |
| 603 | const VectorPtr& vector, |
nothing calls this directly
no test coverage detected