@@ -1581,6 +1581,8 @@ class FunctionStringPad : public IFunction {
1581
1581
size_t input_rows_count) const {
1582
1582
std::vector<size_t > pad_index;
1583
1583
size_t const_pad_char_size = 0 ;
1584
+ // If pad_const = true, initialize pad_index only once.
1585
+ // The same logic applies to the if constexpr (!pad_const) condition below.
1584
1586
if constexpr (pad_const) {
1585
1587
const_pad_char_size = simd::VStringFunctions::get_char_len (
1586
1588
(const char *)padcol_chars.data (), padcol_offsets[0 ], pad_index);
@@ -1608,12 +1610,14 @@ class FunctionStringPad : public IFunction {
1608
1610
const int pad_len = padcol_offsets[pad_idx] - padcol_offsets[pad_idx - 1 ];
1609
1611
const auto * pad_data = &padcol_chars[padcol_offsets[pad_idx - 1 ]];
1610
1612
1611
- auto [real_len, skip_chars] = simd::VStringFunctions::skip_leading_utf8 (
1612
- (const char *)str_data, (const char *)str_data + str_len, len);
1613
- if (len <= skip_chars) {
1614
- buffer.reserve (buffer_len + real_len);
1615
- memcpy (buffer.data () + buffer_len, str_data, real_len);
1616
- buffer_len += real_len;
1613
+ auto [iterate_byte_len, iterate_char_len] =
1614
+ simd::VStringFunctions::iterate_utf8_with_limit_length (
1615
+ (const char *)str_data, (const char *)str_data + str_len, len);
1616
+ // If iterate_char_len equals len, it indicates that the str length is greater than or equal to len
1617
+ if (iterate_char_len == len) {
1618
+ buffer.reserve (buffer_len + iterate_byte_len);
1619
+ memcpy (buffer.data () + buffer_len, str_data, iterate_byte_len);
1620
+ buffer_len += iterate_byte_len;
1617
1621
res_offsets[i] = buffer_len;
1618
1622
continue ;
1619
1623
}
@@ -1630,7 +1634,7 @@ class FunctionStringPad : public IFunction {
1630
1634
res_offsets[i] = buffer_len;
1631
1635
continue ;
1632
1636
}
1633
- const size_t str_char_size = skip_chars ;
1637
+ const size_t str_char_size = iterate_char_len ;
1634
1638
const size_t pad_times = (len - str_char_size) / pad_char_size;
1635
1639
const size_t pad_remainder_len = pad_index[(len - str_char_size) % pad_char_size];
1636
1640
const size_t new_capacity = str_len + size_t (pad_times + 1 ) * pad_len;
0 commit comments