[
https://issues.apache.org/jira/browse/CALCITE-4189?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17182122#comment-17182122
]
Julian Hyde commented on CALCITE-4189:
--------------------------------------
It's possible we can achieve this using Sargs over a discrete domain. Booleans
with unknown are 3 values. After we have processed the first term of the OR,
'X', we know that x can only have values FALSE or UNKNOWN. We can exhaustively
prove that 'X IS NOT TRUE' always evaluates to TRUE.
In essence, we are evaluating the whole truth table.
The approach would work for other discrete domains with a small number of
values. E.g. 'x > 1 AND x < 5 AND x <> 3 AND MOD(x, 2) = 1' simplifies to FALSE.
> Simplify 'P OR P IS NOT TRUE' to 'TRUE'
> ---------------------------------------
>
> Key: CALCITE-4189
> URL: https://issues.apache.org/jira/browse/CALCITE-4189
> Project: Calcite
> Issue Type: Improvement
> Reporter: Thomas Rebele
> Priority: Minor
>
> Statements of the form 'P OR P IS NOT TRUE' to 'TRUE' should always be true
> (please correct me if I am wrong):
> {code:java}
> > select x, X='A' as EQ,
> X='A' IS NOT TRUE as EQ_NOT_TRUE,
> (X='A') OR ((X='A') IS NOT TRUE) as EQ_OR_EQ_NOT_TRUE
> from (values 'A', 'B', null) as t(x);
> +---+-------+-------------+-------------------+
> | X | EQ | EQ_NOT_TRUE | EQ_OR_EQ_NOT_TRUE |
> +---+-------+-------------+-------------------+
> | A | true | false | true |
> | B | false | true | true |
> | | | true | true |
> +---+-------+-------------+-------------------+
> {code}
> Here a test case for the expected behavior:
> {code:java}
> @Test void testSimplifyPOrPNotTrue() {
> checkSimplify(
> and(
> vBool(),
> or(
> eq(vInt(), literal(1)),
> isNotTrue(eq(vInt(), literal(1)))
> )),
> "?0.bool0");
> }{code}
> There are some other, similar expressions, such as 'P IS NOT FALSE OR NOT P',
> which can be reduced to true. Maybe there's a way to handle all of them?
--
This message was sent by Atlassian Jira
(v8.3.4#803005)