50173 {
50174 idx_t total_read = 0;
50175 while (true) {
50176
50177 if (stream_data.out_buff_start != stream_data.out_buff_end) {
50178
50179 auto available =
50180 MinValue<idx_t>(UnsafeNumericCast<idx_t>(remaining),
50181 UnsafeNumericCast<idx_t>(stream_data.out_buff_end - stream_data.out_buff_start));
50182 memcpy(static_cast<data_ptr_t>(buffer) + total_read, stream_data.out_buff_start, available);
50183
50184
50185 stream_data.out_buff_start += available;
50186 total_read += available;
50187 remaining = UnsafeNumericCast<int64_t>(UnsafeNumericCast<idx_t>(remaining) - available);
50188 if (remaining == 0) {
50189
50190 return UnsafeNumericCast<int64_t>(total_read);
50191 }
50192 }
50193 if (!stream_wrapper) {
50194 return UnsafeNumericCast<int64_t>(total_read);
50195 }
50196 current_position += static_cast<idx_t>(stream_data.in_buff_end - stream_data.in_buff_start);
50197
50198 stream_data.out_buff_start = stream_data.out_buff.get();
50199 stream_data.out_buff_end = stream_data.out_buff.get();
50200 D_ASSERT(stream_data.in_buff_start <= stream_data.in_buff_end);
50201 D_ASSERT(stream_data.in_buff_end <= stream_data.in_buff_start + stream_data.in_buf_size);
50202
50203
50204 if (stream_data.refresh && (stream_data.in_buff_end == stream_data.in_buff.get() + stream_data.in_buf_size)) {
50205 auto bufrem = stream_data.in_buff_end - stream_data.in_buff_start;
50206
50207 memmove(stream_data.in_buff.get(), stream_data.in_buff_start, UnsafeNumericCast<size_t>(bufrem));
50208 stream_data.in_buff_start = stream_data.in_buff.get();
50209
50210 auto sz = child_handle->Read(QueryContext(), stream_data.in_buff_start + bufrem,
50211 stream_data.in_buf_size - UnsafeNumericCast<idx_t>(bufrem));
50212 stream_data.in_buff_end = stream_data.in_buff_start + bufrem + sz;
50213 if (sz <= 0) {
50214 stream_wrapper.reset();
50215 break;
50216 }
50217 }
50218
50219
50220 if (stream_data.in_buff_start == stream_data.in_buff_end) {
50221
50222 stream_data.in_buff_start = stream_data.in_buff.get();
50223 stream_data.in_buff_end = stream_data.in_buff_start;
50224 auto sz = child_handle->Read(QueryContext(), stream_data.in_buff.get(), stream_data.in_buf_size);
50225 if (sz <= 0) {
50226 stream_wrapper.reset();
50227 break;
50228 }
50229 stream_data.in_buff_end = stream_data.in_buff_start + sz;
50230 }
50231
50232 auto finished = stream_wrapper->Read(stream_data);
50233 if (finished) {
50234 stream_wrapper.reset();
50235 }
50236 }
50237 return UnsafeNumericCast<int64_t>(total_read);
50238}