You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@flink.apache.org by "luoyuxia (Jira)" <ji...@apache.org> on 2022/04/26 02:28:00 UTC

[jira] [Created] (FLINK-27402) Unexpected boolean expression simplification for AND expression

luoyuxia created FLINK-27402:
--------------------------------

             Summary: Unexpected boolean expression simplification  for AND expression 
                 Key: FLINK-27402
                 URL: https://issues.apache.org/jira/browse/FLINK-27402
             Project: Flink
          Issue Type: Bug
          Components: Table SQL / Planner
            Reporter: luoyuxia


Flink supports to compare between string and boolean, so the following sql can work fine

 
{code:java}
create table (c1 int, c2 string);
select * from c2 = true;
{code}
But the following sql will throw excpetion 

 
{code:java}
select * from c1 = 1 and c2 = true; {code}
The reason it that Flink will try to simplify BOOLEAN expressions if possible in 

"c1 = 1 and c2 = true".

So "c2 = true" will be simplified to "c2" by the following code in Flink:

 
{code:java}
RexSimplify#simplifyAnd2ForUnknownAsFalse

// Simplify BOOLEAN expressions if possible
while (term.getKind() == SqlKind.EQUALS) {
    RexCall call = (RexCall) term;
    if (call.getOperands().get(0).isAlwaysTrue()) {
        term = call.getOperands().get(1);
        terms.set(i, term);
        continue;
    } else if (call.getOperands().get(1).isAlwaysTrue()) {
        term = call.getOperands().get(0);
        terms.set(i, term);
        continue;
    }
    break;
} {code}
So the expression will be reduced to ""c1 = 1 and c2". But AND requries both sides are boolean expression and c2 is not a boolean expression for it actually is a string.

Then the exception "Boolean expression type expected" is thrown.

 



--
This message was sent by Atlassian Jira
(v8.20.7#820007)