@@ -146,9 +146,12 @@ case class And(left: Expression, right: Expression)
146
146
}
147
147
}
148
148
}
149
+
149
150
override def genCode (ctx : CodeGenContext , ev : GeneratedExpressionCode ): Code = {
150
151
val eval1 = left.gen(ctx)
151
152
val eval2 = right.gen(ctx)
153
+
154
+ // The result should be `false`, if any of them is `false` whenever the other is null or not.
152
155
s """
153
156
${eval1.code}
154
157
boolean ${ev.nullTerm} = false;
@@ -192,20 +195,21 @@ case class Or(left: Expression, right: Expression)
192
195
}
193
196
}
194
197
}
198
+
195
199
override def genCode (ctx : CodeGenContext , ev : GeneratedExpressionCode ): Code = {
196
200
val eval1 = left.gen(ctx)
197
201
val eval2 = right.gen(ctx)
202
+
203
+ // The result should be `true`, if any of them is `true` whenever the other is null or not.
198
204
s """
199
205
${eval1.code}
200
206
boolean ${ev.nullTerm} = false;
201
- boolean ${ev.primitiveTerm} = false ;
207
+ boolean ${ev.primitiveTerm} = true ;
202
208
203
209
if (! ${eval1.nullTerm} && ${eval1.primitiveTerm}) {
204
- ${ev.primitiveTerm} = true;
205
210
} else {
206
211
${eval2.code}
207
212
if (! ${eval2.nullTerm} && ${eval2.primitiveTerm}) {
208
- ${ev.primitiveTerm} = true;
209
213
} else if (! ${eval1.nullTerm} && ! ${eval2.nullTerm}) {
210
214
${ev.primitiveTerm} = false;
211
215
} else {
@@ -218,19 +222,6 @@ case class Or(left: Expression, right: Expression)
218
222
219
223
abstract class BinaryComparison extends BinaryExpression with Predicate {
220
224
self : Product =>
221
- override def genCode (ctx : CodeGenContext , ev : GeneratedExpressionCode ): Code = {
222
- left.dataType match {
223
- case dt : NumericType if ctx.isNativeType(dt) => defineCodeGen (ctx, ev, {
224
- (c1, c3) => s " $c1 $symbol $c3"
225
- })
226
- case TimestampType =>
227
- // java.sql.Timestamp does not have compare()
228
- super .genCode(ctx, ev)
229
- case other => defineCodeGen (ctx, ev, {
230
- (c1, c2) => s " $c1.compare( $c2) $symbol 0 "
231
- })
232
- }
233
- }
234
225
235
226
override def checkInputDataTypes (): TypeCheckResult = {
236
227
if (left.dataType != right.dataType) {
@@ -258,6 +249,20 @@ abstract class BinaryComparison extends BinaryExpression with Predicate {
258
249
}
259
250
}
260
251
252
+ override def genCode (ctx : CodeGenContext , ev : GeneratedExpressionCode ): Code = {
253
+ left.dataType match {
254
+ case dt : NumericType if ctx.isNativeType(dt) => defineCodeGen (ctx, ev, {
255
+ (c1, c3) => s " $c1 $symbol $c3"
256
+ })
257
+ case TimestampType =>
258
+ // java.sql.Timestamp does not have compare()
259
+ super .genCode(ctx, ev)
260
+ case other => defineCodeGen (ctx, ev, {
261
+ (c1, c2) => s " $c1.compare( $c2) $symbol 0 "
262
+ })
263
+ }
264
+ }
265
+
261
266
protected def evalInternal (evalE1 : Any , evalE2 : Any ): Any =
262
267
sys.error(s " BinaryComparisons must override either eval or evalInternal " )
263
268
}
@@ -389,9 +394,9 @@ case class If(predicate: Expression, trueValue: Expression, falseValue: Expressi
389
394
val falseEval = falseValue.gen(ctx)
390
395
391
396
s """
397
+ ${condEval.code}
392
398
boolean ${ev.nullTerm} = false;
393
399
${ctx.primitiveType(dataType)} ${ev.primitiveTerm} = ${ctx.defaultValue(dataType)};
394
- ${condEval.code}
395
400
if (! ${condEval.nullTerm} && ${condEval.primitiveTerm}) {
396
401
${trueEval.code}
397
402
${ev.nullTerm} = ${trueEval.nullTerm};
0 commit comments