| 631 | } |
| 632 | |
| 633 | Status BufferedTupleStream::PrepareForReadInternal( |
| 634 | bool attach_on_read, ReadIterator* read_iter) { |
| 635 | DCHECK(!closed_); |
| 636 | DCHECK(!read_it_.attach_on_read_); |
| 637 | DCHECK(!read_iter->is_valid()); |
| 638 | |
| 639 | read_iter->Init(attach_on_read); |
| 640 | if (pages_.empty()) { |
| 641 | // No rows to return, or a the first read/write page has not yet been allocated. |
| 642 | read_iter->SetReadPage(pages_.end()); |
| 643 | } else { |
| 644 | // Eagerly pin the first page in the stream. |
| 645 | read_iter->SetReadPage(pages_.begin()); |
| 646 | if (read_iter == &read_it_ && !pinned_ |
| 647 | && read_iter->read_page_->len() > default_page_len_) { |
| 648 | int64_t extra_needed_reservation = read_iter->read_page_->len() - default_page_len_; |
| 649 | if (large_read_page_reservation_.GetReservation() >= extra_needed_reservation) { |
| 650 | buffer_pool_client_->RestoreReservation(&large_read_page_reservation_, |
| 651 | extra_needed_reservation); |
| 652 | } |
| 653 | } |
| 654 | // Check if we need to increment the pin count of the read page. |
| 655 | RETURN_IF_ERROR(PinPageIfNeeded(&*read_iter->read_page_, pinned_)); |
| 656 | DCHECK(read_iter->read_page_->is_pinned()); |
| 657 | RETURN_IF_ERROR(read_iter->InitReadPtrs()); |
| 658 | } |
| 659 | CHECK_CONSISTENCY_FULL(*read_iter); |
| 660 | return Status::OK(); |
| 661 | } |
| 662 | |
| 663 | Status BufferedTupleStream::PinStream(bool* pinned) { |
| 664 | DCHECK(!closed_); |
nothing calls this directly
no test coverage detected