33965 {
33966 idx_t
size = to - from;
33967 UnifiedVectorFormat format;
33968 input.ToUnifiedFormat(input_size, format);
33969 auto &main_buffer = append_data.GetMainBuffer();
33970 auto &validity_buffer = append_data.GetValidityBuffer();
33971 auto &aux_buffer = append_data.GetAuxBuffer();
33972
33973
33974 ArrowAppendData::ResizeValidity(validity_buffer, append_data.row_count + size);
33975 auto validity_data = (
uint8_t *)validity_buffer.data();
33976
33977
33978 main_buffer.resize(main_buffer.size() + sizeof(BUFTYPE) * (size + 1));
33979 auto data = UnifiedVectorFormat::GetData<SRC>(format);
33980 auto offset_data = main_buffer.GetData<BUFTYPE>();
33981 if (append_data.row_count == 0) {
33982
33983 offset_data[0] = 0;
33984 }
33985
33986
33987 auto last_offset = offset_data[append_data.row_count];
33988 for (idx_t i = from; i < to; i++) {
33989 auto source_idx = format.sel->get_index(i);
33990 auto offset_idx = append_data.row_count + i + 1 - from;
33991
33992 if (!format.validity.RowIsValid(source_idx)) {
33994 idx_t current_byte;
33995 ArrowAppendData::GetBitPosition(append_data.row_count + i - from, current_byte, current_bit);
33996 append_data.SetNull(validity_data, current_byte, current_bit);
33997 offset_data[offset_idx] = last_offset;
33998 continue;
33999 }
34000
34001 auto string_length = OP::GetLength(data[source_idx]);
34002
34003
34004 auto current_offset = UnsafeNumericCast<idx_t>(last_offset) + string_length;
34005 if (!LARGE_STRING &&
34006 UnsafeNumericCast<idx_t>(last_offset) + string_length > NumericLimits<int32_t>::Maximum()) {
34007 D_ASSERT(append_data.options.arrow_offset_size == ArrowOffsetSize::REGULAR);
34008 throw InvalidInputException(
34009 "Arrow Appender: The maximum total string size for regular string buffers is "
34010 "%u but the offset of %lu exceeds this.\n* SET arrow_large_buffer_size=true to use large string "
34011 "buffers",
34012 NumericLimits<int32_t>::Maximum(), current_offset);
34013 }
34014 offset_data[offset_idx] = UnsafeNumericCast<BUFTYPE>(current_offset);
34015
34016
34017 aux_buffer.resize(current_offset);
34018 OP::WriteData(aux_buffer.data() + last_offset, data[source_idx]);
34019
34020 last_offset = UnsafeNumericCast<BUFTYPE>(current_offset);
34021 }
34022 append_data.row_count +=
size;
34023 }
GOpaque< Size > size(const GMat &src)