@@ -108,10 +108,11 @@ case class Like(left: Expression, right: Expression)
108
108
""" )
109
109
}
110
110
} else {
111
+ val rightStr = ctx.freshName(" rightStr" )
111
112
nullSafeCodeGen(ctx, ev, (eval1, eval2) => {
112
113
s """
113
- String rightStr = ${eval2}.toString();
114
- ${patternClass} $pattern = ${patternClass}.compile( $escapeFunc(rightStr));
114
+ String $ rightStr = ${eval2}.toString();
115
+ ${patternClass} $pattern = ${patternClass}.compile( $escapeFunc( $ rightStr));
115
116
${ev.value} = $pattern.matcher( ${eval1}.toString()).matches();
116
117
"""
117
118
})
@@ -157,10 +158,11 @@ case class RLike(left: Expression, right: Expression)
157
158
""" )
158
159
}
159
160
} else {
161
+ val rightStr = ctx.freshName(" rightStr" )
160
162
nullSafeCodeGen(ctx, ev, (eval1, eval2) => {
161
163
s """
162
- String rightStr = ${eval2}.toString();
163
- ${patternClass} $pattern = ${patternClass}.compile(rightStr);
164
+ String $ rightStr = ${eval2}.toString();
165
+ ${patternClass} $pattern = ${patternClass}.compile( $ rightStr);
164
166
${ev.value} = $pattern.matcher( ${eval1}.toString()).find(0);
165
167
"""
166
168
})
@@ -259,6 +261,8 @@ case class RegExpReplace(subject: Expression, regexp: Expression, rep: Expressio
259
261
val classNamePattern = classOf [Pattern ].getCanonicalName
260
262
val classNameStringBuffer = classOf [java.lang.StringBuffer ].getCanonicalName
261
263
264
+ val matcher = ctx.freshName(" matcher" )
265
+
262
266
ctx.addMutableState(" UTF8String" , termLastRegex, s " ${termLastRegex} = null; " )
263
267
ctx.addMutableState(classNamePattern, termPattern, s " ${termPattern} = null; " )
264
268
ctx.addMutableState(" String" , termLastReplacement, s " ${termLastReplacement} = null; " )
@@ -267,6 +271,12 @@ case class RegExpReplace(subject: Expression, regexp: Expression, rep: Expressio
267
271
ctx.addMutableState(classNameStringBuffer,
268
272
termResult, s " ${termResult} = new $classNameStringBuffer(); " )
269
273
274
+ val setEvNotNull = if (nullable) {
275
+ s " ${ev.isNull} = false; "
276
+ } else {
277
+ " "
278
+ }
279
+
270
280
nullSafeCodeGen(ctx, ev, (subject, regexp, rep) => {
271
281
s """
272
282
if (! $regexp.equals( ${termLastRegex})) {
@@ -280,14 +290,14 @@ case class RegExpReplace(subject: Expression, regexp: Expression, rep: Expressio
280
290
${termLastReplacement} = ${termLastReplacementInUTF8}.toString();
281
291
}
282
292
${termResult}.delete(0, ${termResult}.length());
283
- java.util.regex.Matcher m = ${termPattern}.matcher( $subject.toString());
293
+ java.util.regex.Matcher ${matcher} = ${termPattern}.matcher( $subject.toString());
284
294
285
- while (m .find()) {
286
- m .appendReplacement( ${termResult}, ${termLastReplacement});
295
+ while ( ${matcher} .find()) {
296
+ ${matcher} .appendReplacement( ${termResult}, ${termLastReplacement});
287
297
}
288
- m .appendTail( ${termResult});
298
+ ${matcher} .appendTail( ${termResult});
289
299
${ev.value} = UTF8String.fromString( ${termResult}.toString());
290
- ${ev.isNull} = false;
300
+ $setEvNotNull
291
301
"""
292
302
})
293
303
}
@@ -334,26 +344,34 @@ case class RegExpExtract(subject: Expression, regexp: Expression, idx: Expressio
334
344
val termLastRegex = ctx.freshName(" lastRegex" )
335
345
val termPattern = ctx.freshName(" pattern" )
336
346
val classNamePattern = classOf [Pattern ].getCanonicalName
347
+ val matcher = ctx.freshName(" matcher" )
348
+ val matchResult = ctx.freshName(" matchResult" )
337
349
338
350
ctx.addMutableState(" UTF8String" , termLastRegex, s " ${termLastRegex} = null; " )
339
351
ctx.addMutableState(classNamePattern, termPattern, s " ${termPattern} = null; " )
340
352
353
+ val setEvNotNull = if (nullable) {
354
+ s " ${ev.isNull} = false; "
355
+ } else {
356
+ " "
357
+ }
358
+
341
359
nullSafeCodeGen(ctx, ev, (subject, regexp, idx) => {
342
360
s """
343
361
if (! $regexp.equals( ${termLastRegex})) {
344
362
// regex value changed
345
363
${termLastRegex} = $regexp.clone();
346
364
${termPattern} = ${classNamePattern}.compile( ${termLastRegex}.toString());
347
365
}
348
- java.util.regex.Matcher m =
366
+ java.util.regex.Matcher ${matcher} =
349
367
${termPattern}.matcher( $subject.toString());
350
- if (m .find()) {
351
- java.util.regex.MatchResult mr = m .toMatchResult();
352
- ${ev.value} = UTF8String.fromString(mr .group( $idx));
353
- ${ev.isNull} = false;
368
+ if ( ${matcher} .find()) {
369
+ java.util.regex.MatchResult ${matchResult} = ${matcher} .toMatchResult();
370
+ ${ev.value} = UTF8String.fromString( ${matchResult} .group( $idx));
371
+ $setEvNotNull
354
372
} else {
355
373
${ev.value} = UTF8String.EMPTY_UTF8;
356
- ${ev.isNull} = false;
374
+ $setEvNotNull
357
375
} """
358
376
})
359
377
}
0 commit comments