### 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/test/java/org/elasticsearch/xpack/ql/optimizer/OptimizerRulesTests.java
and = new And(EMPTY, NULL, NULL);
        assertEquals(and, rule.rule(and));
    }
    
    
    
    
    public void testIsNullAndNotNull() throws Exception {
        FieldAttribute fa = getFieldAttribute();
        And and = new And(EMPTY, new IsNull(EMPTY, fa), new IsNotNull(EMPTY, fa));
        assertEquals(FALSE, new PropagateNullable().rule(and));
    }
    
    public void testIsNullAndNotNullMultiField() throws Exception {
        FieldAttribute fa = getFieldAttribute();
        And andOne = new And(EMPTY, new IsNull(EMPTY, fa), new IsNotNull(EMPTY, getFieldAttribute()));
        And andTwo = new And(EMPTY, new IsNull(EMPTY, getFieldAttribute()), new IsNotNull(EMPTY, getFieldAttribute()));
        And andThree = new And(EMPTY, new IsNull(EMPTY, getFieldAttribute()), new IsNotNull(EMPTY, fa));
        And and = new And(EMPTY, andOne, new And(EMPTY, andThree, andTwo));
        assertEquals(FALSE, new PropagateNullable().rule(and));
    }
    
    public void testIsNullAndComparison() throws Exception {
        FieldAttribute fa = getFieldAttribute();
        IsNull isNull = new IsNull(EMPTY, fa);
        And and = new And(EMPTY, isNull, greaterThanOf(fa, ONE));
        assertEquals(new And(EMPTY, isNull, nullOf(BOOLEAN)), new PropagateNullable().rule(and));
    }
    
    public void testIsNullAndMultipleComparison() throws Exception {