You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@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)