@@ -137,13 +137,34 @@ case class ConcatWs(children: Seq[Expression])
137
137
if (children.forall(_.dataType == StringType )) {
138
138
// All children are strings. In that case we can construct a fixed size array.
139
139
val evals = children.map(_.genCode(ctx))
140
-
141
- val inputs = evals.map { eval =>
142
- s " ${eval.isNull} ? (UTF8String) null : ${eval.value}"
143
- }.mkString(" , " )
144
-
145
- ev.copy(evals.map(_.code).mkString(" \n " ) + s """
146
- UTF8String ${ev.value} = UTF8String.concatWs( $inputs);
140
+ val separator = evals.head
141
+ val strings = evals.tail
142
+ val numArgs = strings.length
143
+ val args = ctx.freshName(" args" )
144
+
145
+ val inputs = strings.zipWithIndex.map { case (eval, index) =>
146
+ if (eval.isNull != " true" ) {
147
+ s """
148
+ ${eval.code}
149
+ if (! ${eval.isNull}) {
150
+ $args[ $index] = ${eval.value};
151
+ }
152
+ """
153
+ } else {
154
+ " "
155
+ }
156
+ }
157
+ val codes = if (ctx.INPUT_ROW != null && ctx.currentVars == null ) {
158
+ ctx.splitExpressions(inputs, " valueConcatWs" ,
159
+ (" InternalRow" , ctx.INPUT_ROW ) :: (" UTF8String[]" , args) :: Nil )
160
+ } else {
161
+ inputs.mkString(" \n " )
162
+ }
163
+ ev.copy(s """
164
+ UTF8String[] $args = new UTF8String[ $numArgs];
165
+ ${separator.code}
166
+ $codes
167
+ UTF8String ${ev.value} = UTF8String.concatWs( ${separator.value}, $args);
147
168
boolean ${ev.isNull} = ${ev.value} == null;
148
169
""" )
149
170
} else {
@@ -156,32 +177,63 @@ case class ConcatWs(children: Seq[Expression])
156
177
child.dataType match {
157
178
case StringType =>
158
179
(" " , // we count all the StringType arguments num at once below.
159
- s " $array[ $idxInVararg ++] = ${eval.isNull} ? (UTF8String) null : ${eval.value}; " )
180
+ if (eval.isNull == " true" ) {
181
+ " "
182
+ } else {
183
+ s " $array[ $idxInVararg ++] = ${eval.isNull} ? (UTF8String) null : ${eval.value}; "
184
+ })
160
185
case _ : ArrayType =>
161
186
val size = ctx.freshName(" n" )
162
- (s """
163
- if (! ${eval.isNull}) {
164
- $varargNum += ${eval.value}.numElements();
165
- }
166
- """ ,
167
- s """
168
- if (! ${eval.isNull}) {
169
- final int $size = ${eval.value}.numElements();
170
- for (int j = 0; j < $size; j ++) {
171
- $array[ $idxInVararg ++] = ${ctx.getValue(eval.value, StringType , " j" )};
172
- }
187
+ if (eval.isNull == " true" ) {
188
+ (" " , " " )
189
+ } else {
190
+ (s """
191
+ if (! ${eval.isNull}) {
192
+ $varargNum += ${eval.value}.numElements();
193
+ }
194
+ """ ,
195
+ s """
196
+ if (! ${eval.isNull}) {
197
+ final int $size = ${eval.value}.numElements();
198
+ for (int j = 0; j < $size; j ++) {
199
+ $array[ $idxInVararg ++] = ${ctx.getValue(eval.value, StringType , " j" )};
200
+ }
201
+ }
202
+ """ )
173
203
}
174
- """ )
175
204
}
176
205
}.unzip
177
206
178
- ev.copy(evals.map(_.code).mkString(" \n " ) +
179
- s """
207
+ val codes = ctx.splitExpressions(ctx.INPUT_ROW , evals.map(_.code))
208
+ val varargCounts = ctx.splitExpressions(varargCount, " varargCountsConcatWs" ,
209
+ (" InternalRow" , ctx.INPUT_ROW ) :: Nil ,
210
+ " int" ,
211
+ { body =>
212
+ s """
213
+ int $varargNum = 0;
214
+ $body
215
+ return $varargNum;
216
+ """
217
+ },
218
+ _.mkString(s " $varargNum += " , s " ; \n $varargNum += " , " ;" ))
219
+ val varargBuilds = ctx.splitExpressions(varargBuild, " varargBuildsConcatWs" ,
220
+ (" InternalRow" , ctx.INPUT_ROW ) :: (" UTF8String []" , array) :: (" int" , idxInVararg) :: Nil ,
221
+ " int" ,
222
+ { body =>
223
+ s """
224
+ $body
225
+ return $idxInVararg;
226
+ """
227
+ },
228
+ _.mkString(s " $idxInVararg = " , s " ; \n $idxInVararg = " , " ;" ))
229
+ ev.copy(
230
+ s """
231
+ $codes
180
232
int $varargNum = ${children.count(_.dataType == StringType ) - 1 };
181
233
int $idxInVararg = 0;
182
- ${varargCount.mkString( " \n " )}
234
+ $varargCounts
183
235
UTF8String[] $array = new UTF8String[ $varargNum];
184
- ${varargBuild.mkString( " \n " )}
236
+ $varargBuilds
185
237
UTF8String ${ev.value} = UTF8String.concatWs( ${evals.head.value}, $array);
186
238
boolean ${ev.isNull} = ${ev.value} == null;
187
239
""" )
0 commit comments