FilterExpr to be rewritten to remove nulls as early as possible
Filter expressions in the scan convert nulls to false in Mask::try_from(&dyn Array), the earlier we can remove nulls, the more performant these expressions are to compute instead of pointlessly respecting nulls all the way to the root of the expr.
We will need is_null and is_not_null expressions to implement this.
@robert3005 says Spark performs a similar transformation, if you could track it down that would be helpful!
Here's the logic to infer the constraints https://github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/QueryPlanConstraints.scala#L113
Does anyone have an example of where this matters on workflows we currently use