It seems like And.eval can avoid calculating right.eval if left.eval returns null. Is there a reason it's written like it is?
override def eval(input: Row): Any = { val l = left.eval(input) if (l == false) { false } else { val r = right.eval(input) if (r == false) { false } else { if (l != null && r != null) { true } else { null } } } }