| 171 | } |
| 172 | |
| 173 | static void scanArrowArrayBLOBView(const ArrowArray* array, ValueVector& outputVector, |
| 174 | ArrowNullMaskTree* mask, uint64_t srcOffset, uint64_t dstOffset, uint64_t count) { |
| 175 | auto arrayBuffer = (const uint8_t*)(array->buffers[1]); |
| 176 | auto valueBuffs = (const uint8_t**)(array->buffers + 2); |
| 177 | // BLOB value buffers begin from index 2 onwards |
| 178 | |
| 179 | mask->copyToValueVector(&outputVector, dstOffset, count); |
| 180 | |
| 181 | rowIter(outputVector, count, [&](auto i) { |
| 182 | if (!mask->isNull(i)) { |
| 183 | auto curView = (const int32_t*)(arrayBuffer + (i + srcOffset) * 16); |
| 184 | // view structures are 16 bytes long |
| 185 | auto viewLength = curView[0]; |
| 186 | if (viewLength <= 12) { |
| 187 | BlobVector::addBlob(&outputVector, i + dstOffset, (uint8_t*)(curView + 1), |
| 188 | viewLength); |
| 189 | } else { |
| 190 | auto bufIndex = curView[2]; |
| 191 | auto offset = curView[3]; |
| 192 | BlobVector::addBlob(&outputVector, i + dstOffset, valueBuffs[bufIndex] + offset, |
| 193 | viewLength); |
| 194 | } |
| 195 | } |
| 196 | }); |
| 197 | } |
| 198 | |
| 199 | static void scanArrowArrayFixedBLOB(const ArrowArray* array, ValueVector& outputVector, |
| 200 | ArrowNullMaskTree* mask, int64_t BLOBsize, uint64_t srcOffset, uint64_t dstOffset, |
no test coverage detected