Skip to content

Commit e5b0d43

Browse files
Avoid inheriting offset from input array during string cast
1 parent 5a48044 commit e5b0d43

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

cpp/src/arrow/compute/kernels/scalar_cast_string.cc

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,20 @@
1515
// specific language governing permissions and limitations
1616
// under the License.
1717

18+
#include <iostream>
1819
#include <limits>
1920
#include <optional>
2021

2122
#include "arrow/array/array_base.h"
2223
#include "arrow/array/builder_binary.h"
24+
#include "arrow/buffer.h"
2325
#include "arrow/compute/kernels/base_arithmetic_internal.h"
2426
#include "arrow/compute/kernels/codegen_internal.h"
2527
#include "arrow/compute/kernels/common_internal.h"
2628
#include "arrow/compute/kernels/scalar_cast_internal.h"
2729
#include "arrow/compute/kernels/temporal_internal.h"
2830
#include "arrow/result.h"
31+
#include "arrow/testing/gtest_util.h"
2932
#include "arrow/type.h"
3033
#include "arrow/type_traits.h"
3134
#include "arrow/util/formatting.h"
@@ -304,8 +307,18 @@ BinaryToBinaryCastExec(KernelContext* ctx, const ExecSpan& batch, ExecResult* ou
304307
}
305308
}
306309

307-
// Start with a zero-copy cast, but change indices to expected size
308-
RETURN_NOT_OK(ZeroCopyCastExec(ctx, batch, out));
310+
std::shared_ptr<ArrayData> input_arr = input.ToArrayData();
311+
ArrayData* output = out->array_data().get();
312+
output->length = input_arr->length;
313+
output->offset = input_arr->offset % 8;
314+
output->buffers = input_arr->buffers;
315+
output->child_data = input_arr->child_data;
316+
output->SetNullCount(input_arr->null_count);
317+
318+
if (output->buffers[0]) {
319+
output->buffers[0] = SliceBuffer(input_arr->buffers[0], input_arr->offset / 8);
320+
}
321+
309322
return CastBinaryToBinaryOffsets<typename I::offset_type, typename O::offset_type>(
310323
ctx, input, out->array_data().get());
311324
}

0 commit comments

Comments
 (0)