@@ -25,6 +25,8 @@ use common_expression::types::NumberType;
25
25
use common_expression:: types:: StringType ;
26
26
use common_expression:: vectorize_with_builder_1_arg;
27
27
use common_expression:: vectorize_with_builder_2_arg;
28
+ use common_expression:: vectorize_with_builder_3_arg;
29
+ use common_expression:: vectorize_with_builder_4_arg;
28
30
use common_expression:: FunctionProperty ;
29
31
use common_expression:: FunctionRegistry ;
30
32
use common_expression:: Value ;
@@ -110,103 +112,111 @@ pub fn register(registry: &mut FunctionRegistry) {
110
112
) ;
111
113
registry. register_aliases ( "char_length" , & [ "character_length" ] ) ;
112
114
113
- registry. register_3_arg :: < StringType , NumberType < u64 > , StringType , StringType , _ , _ > (
115
+ registry. register_passthrough_nullable_3_arg :: < StringType , NumberType < u64 > , StringType , StringType , _ , _ > (
114
116
"lpad" ,
115
117
FunctionProperty :: default ( ) ,
116
118
|_, _, _| None ,
117
- |str : & [ u8 ] , l : u64 , pad : & [ u8 ] | {
118
- let mut buff: Vec < u8 > = vec ! [ ] ;
119
- if l != 0 {
120
- if l > str. len ( ) as u64 {
121
- let l = l - str. len ( ) as u64 ;
122
- while buff. len ( ) < l as usize {
123
- if buff. len ( ) + pad. len ( ) <= l as usize {
124
- buff. extend_from_slice ( pad) ;
119
+ vectorize_with_builder_3_arg :: < StringType , NumberType < u64 > , StringType , StringType > (
120
+ |s, pad_len, pad, output| {
121
+ let pad_len = pad_len as usize ;
122
+ if pad_len <= s. len ( ) {
123
+ output. put_slice ( & s[ ..pad_len] )
124
+ } else {
125
+ let mut remain_pad_len = pad_len - s. len ( ) ;
126
+ while remain_pad_len > 0 {
127
+ if remain_pad_len < pad. len ( ) {
128
+ output. put_slice ( & pad[ ..remain_pad_len] ) ;
129
+ remain_pad_len = 0 ;
125
130
} else {
126
- buff. extend_from_slice ( & pad[ 0 ..l as usize - buff. len ( ) ] )
131
+ output. put_slice ( pad) ;
132
+ remain_pad_len -= pad. len ( ) ;
127
133
}
128
134
}
129
- buff. extend_from_slice ( str) ;
130
- } else {
131
- buff. extend_from_slice ( & str[ 0 ..l as usize ] ) ;
135
+ output. put_slice ( s) ;
132
136
}
137
+ output. commit_row ( ) ;
138
+ Ok ( ( ) )
133
139
}
134
- buff
135
- } ,
140
+ ) ,
136
141
) ;
137
142
138
- registry. register_4_arg :: < StringType , NumberType < i64 > , NumberType < i64 > , StringType , StringType , _ , _ > (
139
- "insert" ,
140
- FunctionProperty :: default ( ) ,
141
- |_, _, _, _| None ,
142
- |srcstr , pos , len , substr| {
143
- let mut values : Vec < u8 > = vec ! [ ] ;
144
-
145
- let sl = srcstr . len ( ) as i64 ;
146
- if pos < 1 || pos > sl {
147
- values . extend_from_slice ( srcstr) ;
143
+ registry. register_passthrough_nullable_4_arg :: < StringType , NumberType < i64 > , NumberType < i64 > , StringType , StringType , _ , _ > (
144
+ "insert" ,
145
+ FunctionProperty :: default ( ) ,
146
+ |_, _, _, _| None ,
147
+ vectorize_with_builder_4_arg :: < StringType , NumberType < i64 > , NumberType < i64 > , StringType , StringType > (
148
+ |srcstr , pos , len , substr , output| {
149
+ let pos = pos as usize ;
150
+ let len = len as usize ;
151
+ if pos < 1 || pos > srcstr . len ( ) {
152
+ output . put_slice ( srcstr) ;
148
153
} else {
149
- let p = pos as usize - 1 ;
150
- values. extend_from_slice ( & srcstr[ 0 ..p] ) ;
151
- values. extend_from_slice ( substr) ;
152
- if len >= 0 && pos + len < sl {
153
- let l = len as usize ;
154
- values. extend_from_slice ( & srcstr[ p + l..] ) ;
154
+ let pos = pos - 1 ;
155
+ output. put_slice ( & srcstr[ 0 ..pos] ) ;
156
+ output. put_slice ( substr) ;
157
+ if pos + len < srcstr. len ( ) {
158
+ output. put_slice ( & srcstr[ ( pos + len) ..] ) ;
155
159
}
156
160
}
157
- values
158
- }
159
- ) ;
161
+ output. commit_row ( ) ;
162
+ Ok ( ( ) )
163
+ } ) ,
164
+ ) ;
160
165
161
- registry. register_3_arg :: < StringType , NumberType < u64 > , StringType , StringType , _ , _ > (
166
+ registry. register_passthrough_nullable_3_arg :: < StringType , NumberType < u64 > , StringType , StringType , _ , _ > (
162
167
"rpad" ,
163
168
FunctionProperty :: default ( ) ,
164
169
|_, _, _| None ,
165
- |str : & [ u8 ] , l : u64 , pad : & [ u8 ] | {
166
- let mut buff: Vec < u8 > = vec ! [ ] ;
167
- if l != 0 {
168
- if l > str. len ( ) as u64 {
169
- buff. extend_from_slice ( str) ;
170
- while buff. len ( ) < l as usize {
171
- if buff. len ( ) + pad. len ( ) <= l as usize {
172
- buff. extend_from_slice ( pad) ;
173
- } else {
174
- buff. extend_from_slice ( & pad[ 0 ..l as usize - buff. len ( ) ] )
175
- }
170
+ vectorize_with_builder_3_arg :: < StringType , NumberType < u64 > , StringType , StringType > (
171
+ |s : & [ u8 ] , pad_len : u64 , pad : & [ u8 ] , output| {
172
+ let pad_len = pad_len as usize ;
173
+ if pad_len <= s. len ( ) {
174
+ output. put_slice ( & s[ ..pad_len] )
175
+ } else {
176
+ output. put_slice ( s) ;
177
+ let mut remain_pad_len = pad_len - s. len ( ) ;
178
+ while remain_pad_len > 0 {
179
+ if remain_pad_len < pad. len ( ) {
180
+ output. put_slice ( & pad[ ..remain_pad_len] ) ;
181
+ remain_pad_len = 0 ;
182
+ } else {
183
+ output. put_slice ( pad) ;
184
+ remain_pad_len -= pad. len ( ) ;
176
185
}
177
- } else {
178
- buff. extend_from_slice ( & str[ 0 ..l as usize ] ) ;
179
186
}
180
187
}
181
- buff
182
- } ,
188
+ output. commit_row ( ) ;
189
+ Ok ( ( ) )
190
+ } ) ,
183
191
) ;
184
192
185
- registry. register_3_arg :: < StringType , StringType , StringType , StringType , _ , _ > (
193
+ registry. register_passthrough_nullable_3_arg :: < StringType , StringType , StringType , StringType , _ , _ > (
186
194
"replace" ,
187
195
FunctionProperty :: default ( ) ,
188
196
|_, _, _| None ,
189
- |str , from , to| {
190
- let mut buf : Vec < u8 > = vec ! [ ] ;
197
+ vectorize_with_builder_3_arg :: < StringType , StringType , StringType , StringType > (
198
+ |str , from , to , output| {
191
199
if from. is_empty ( ) || from == to {
192
- buf. extend_from_slice ( str) ;
193
- return buf;
200
+ output. put_slice ( str) ;
201
+ output. commit_row ( ) ;
202
+ return Ok ( ( ) ) ;
194
203
}
195
204
let mut skip = 0 ;
196
205
for ( p, w) in str. windows ( from. len ( ) ) . enumerate ( ) {
197
206
if w == from {
198
- buf . extend_from_slice ( to) ;
207
+ output . put_slice ( to) ;
199
208
skip = from. len ( ) ;
200
209
} else if p + w. len ( ) == str. len ( ) {
201
- buf . extend_from_slice ( w) ;
210
+ output . put_slice ( w) ;
202
211
} else if skip > 1 {
203
212
skip -= 1 ;
204
213
} else {
205
- buf . extend_from_slice ( & w[ 0 ..1 ] ) ;
214
+ output . put_slice ( & w[ 0 ..1 ] ) ;
206
215
}
207
216
}
208
- buf
209
- } ,
217
+ output. commit_row ( ) ;
218
+ Ok ( ( ) )
219
+ } ) ,
210
220
) ;
211
221
212
222
registry. register_2_arg :: < StringType , StringType , NumberType < i8 > , _ , _ > (
0 commit comments