### Description

The IS NULL/IS NOT NULL only care about the nullability not the value of an expression.
Given the expression x + 1 / 2, the actual result does not matter only if it's null or not - that is, it only matters if x is null or not.
So x + 1 / 2 IS NULL becomes x IS NULL - which can be opportunistically pushed down or evaluated.
x-pack/plugin/ql/src/main/java/org/elasticsearch/xpack/ql/optimizer/OptimizerRules.java
private final Class<C> castType;
        public PruneCast(Class<C> castType) {
            this.castType = castType;
        }
        @Override
        public final LogicalPlan apply(LogicalPlan plan) {
            return rule(plan);
        }
        protected final LogicalPlan rule(LogicalPlan plan) {
            
            return plan.transformExpressionsUp(castType, this::maybePruneCast);
        }
        protected abstract Expression maybePruneCast(C cast);
    }
    public abstract static class SkipQueryOnLimitZero extends OptimizerRule<Limit> {
        @Override
        protected LogicalPlan rule(Limit limit) {
            if (limit.limit().foldable()) {
                if (Integer.valueOf(0).equals((limit.limit().fold()))) {
                    return skipPlan(limit);
                }
            }
            return limit;
        }
        protected abstract LogicalPlan skipPlan(Limit limit);
    }
    public static class ReplaceRegexMatch extends OptimizerExpressionRule<RegexMatch<?>> {