Thomas Rebele created CALCITE-7722:
--------------------------------------
Summary: Simplify IS NULL / IS NOT NULL expressions by removing
operations if they do not affect the nullability
Key: CALCITE-7722
URL: https://issues.apache.org/jira/browse/CALCITE-7722
Project: Calcite
Issue Type: Improvement
Reporter: Thomas Rebele
Example: consider the expression {{{}(CAST(col AS INT)*2) IS NULL{}}}. If the
operation uses integer overflows, then it does not affect the nullability. So
the expression can be simplified to {{{}CAST(col as INT) IS NULL{}}}.
If the operation just returns NULL or throws an exception, then this
simplification would change the semantics. Calcite's built-in multiplication
[uses integer
overflows|https://github.com/apache/calcite/blob/437398834e49c8086a64870427214fec428684fc/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java#L844],
so it should carry out that simplification.
However, currently the following RexProgramTest assertion fails:
{code:java}
checkSimplify(isNull(mul(vInt(), literal(2))), "IS NULL(?0.int0)"); {code}
If the sub-expression may throw an exception, then the multiplication can still
be removed:
{code:java}
checkSimplify(isNull(mul(cast(vVarchar(), tInt(false)), literal(2))),
"IS NULL(CAST(?0.varchar0):INTEGER NOT NULL)"); {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)