@@ -151,20 +151,35 @@ where
151
151
T : OffsetSizeTrait ,
152
152
S : StringArrayType < ' a > ,
153
153
{
154
- let mut builder : GenericStringBuilder < T > = GenericStringBuilder :: new ( ) ;
154
+ let mut total_capacity = 0 ;
155
155
string_array. iter ( ) . zip ( number_array. iter ( ) ) . try_for_each (
156
156
|( string, number) | -> Result < ( ) , DataFusionError > {
157
157
match ( string, number) {
158
158
( Some ( string) , Some ( number) ) if number >= 0 => {
159
- if number as usize * string. len ( ) > max_str_len {
159
+ let item_capacity = string. len ( ) * number as usize ;
160
+ if item_capacity > max_str_len {
160
161
return exec_err ! (
161
162
"string size overflow on repeat, max size is {}, but got {}" ,
162
163
max_str_len,
163
164
number as usize * string. len( )
164
165
) ;
165
- } else {
166
- builder. append_value ( string. repeat ( number as usize ) )
167
166
}
167
+ total_capacity += item_capacity;
168
+ }
169
+ _ => ( ) ,
170
+ }
171
+ Ok ( ( ) )
172
+ } ,
173
+ ) ?;
174
+
175
+ let mut builder =
176
+ GenericStringBuilder :: < T > :: with_capacity ( string_array. len ( ) , total_capacity) ;
177
+
178
+ string_array. iter ( ) . zip ( number_array. iter ( ) ) . try_for_each (
179
+ |( string, number) | -> Result < ( ) , DataFusionError > {
180
+ match ( string, number) {
181
+ ( Some ( string) , Some ( number) ) if number >= 0 => {
182
+ builder. append_value ( string. repeat ( number as usize ) ) ;
168
183
}
169
184
( Some ( _) , Some ( _) ) => builder. append_value ( "" ) ,
170
185
_ => builder. append_null ( ) ,
0 commit comments