@@ -146,9 +146,12 @@ case class And(left: Expression, right: Expression)
146146      }
147147    }
148148  }
149+ 
149150  override  def  genCode (ctx : CodeGenContext , ev : GeneratedExpressionCode ):  Code  =  {
150151    val  eval1  =  left.gen(ctx)
151152    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.
152155    s """ 
153156       ${eval1.code}
154157      boolean  ${ev.nullTerm} = false; 
@@ -192,20 +195,21 @@ case class Or(left: Expression, right: Expression)
192195      }
193196    }
194197  }
198+ 
195199  override  def  genCode (ctx : CodeGenContext , ev : GeneratedExpressionCode ):  Code  =  {
196200    val  eval1  =  left.gen(ctx)
197201    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.
198204    s """ 
199205       ${eval1.code}
200206      boolean  ${ev.nullTerm} = false; 
201-       boolean  ${ev.primitiveTerm} = false ; 
207+       boolean  ${ev.primitiveTerm} = true ; 
202208
203209      if (! ${eval1.nullTerm} &&  ${eval1.primitiveTerm}) { 
204-          ${ev.primitiveTerm} = true; 
205210      } else { 
206211         ${eval2.code}
207212        if (! ${eval2.nullTerm} &&  ${eval2.primitiveTerm}) { 
208-            ${ev.primitiveTerm} = true; 
209213        } else if (! ${eval1.nullTerm} && ! ${eval2.nullTerm}) { 
210214           ${ev.primitiveTerm} = false; 
211215        } else { 
@@ -218,19 +222,6 @@ case class Or(left: Expression, right: Expression)
218222
219223abstract  class  BinaryComparison  extends  BinaryExpression  with  Predicate  {
220224  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-   }
234225
235226  override  def  checkInputDataTypes ():  TypeCheckResult  =  {
236227    if  (left.dataType !=  right.dataType) {
@@ -258,6 +249,20 @@ abstract class BinaryComparison extends BinaryExpression with Predicate {
258249    }
259250  }
260251
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+ 
261266  protected  def  evalInternal (evalE1 : Any , evalE2 : Any ):  Any  = 
262267    sys.error(s " BinaryComparisons must override either eval or evalInternal " )
263268}
@@ -389,9 +394,9 @@ case class If(predicate: Expression, trueValue: Expression, falseValue: Expressi
389394    val  falseEval  =  falseValue.gen(ctx)
390395
391396    s """ 
397+        ${condEval.code}
392398      boolean  ${ev.nullTerm} = false; 
393399       ${ctx.primitiveType(dataType)}  ${ev.primitiveTerm} =  ${ctx.defaultValue(dataType)}; 
394-        ${condEval.code}
395400      if (! ${condEval.nullTerm} &&  ${condEval.primitiveTerm}) { 
396401         ${trueEval.code}
397402         ${ev.nullTerm} =  ${trueEval.nullTerm}; 
0 commit comments